1
0
forked from erp-dev/erp

feat: added put/patch api to main oobject of business module

This commit is contained in:
2025-12-12 14:45:51 +08:00
parent 1a8c446365
commit 9e1f994416
14 changed files with 11611 additions and 0 deletions

View File

@@ -237,6 +237,69 @@ def create_purchase_order(
return purchase_order
def update_purchase_order(
*,
purchase_order: models.PurchaseOrder,
supplier: basic_info_models.Supplier | None = None,
order_date=None,
warehouse: basic_info_models.WareHouse | None = None,
items: List[Dict[str, Any]] | None = None,
remarks: str | None = '',
) -> models.PurchaseOrder:
"""
更新采购订单(仅限审批中状态)。
"""
_ensure_order_pending(purchase_order, models.PurchaseOrderStatusEnum.PENDING, '采购单')
merchant = purchase_order.merchant
new_supplier = supplier or purchase_order.supplier
new_warehouse = warehouse or purchase_order.warehouse
new_order_date = _normalize_order_date(order_date or purchase_order.purchase_date)
remarks = remarks if remarks is not None else purchase_order.remarks
if not items:
raise ValueError('items 需要为非空数组')
normalized_items, _ = _normalize_order_items(
merchant=merchant,
warehouse=new_warehouse,
items=items,
is_outgoing=False,
)
with transaction.atomic():
purchase_order.supplier = new_supplier
purchase_order.purchase_date = new_order_date
purchase_order.warehouse = new_warehouse
purchase_order.remarks = remarks
purchase_order.save(
update_fields=['supplier', 'purchase_date', 'warehouse', 'remarks', 'updated_at']
)
purchase_order.items.all().delete()
bulk_objects = [
models.PurchaseOrderItem(
purchase_order=purchase_order,
product=item_data['product'],
price=item_data['price'],
color=item_data.get('color'),
quantity=item_data['quantity'],
unit=item_data['unit'],
spec=item_data.get('spec'),
empty_diff_percent=item_data['empty_diff_percent'],
quantity_of_rolls=item_data.get('quantity_of_rolls'),
num_of_rolls=item_data['num_of_rolls'],
batch_number=item_data.get('batch_number'),
remarks=item_data.get('remarks'),
)
for item_data in normalized_items
]
models.PurchaseOrderItem.objects.bulk_create(bulk_objects)
purchase_order.refresh_from_db()
return purchase_order
def create_sales_order(
*,
merchant: basic_info_models.Merchant,
@@ -297,6 +360,75 @@ def create_sales_order(
return sales_order
def update_sales_order(
*,
sales_order: models.SalesOrder,
customer: basic_info_models.Customer | None = None,
order_date=None,
warehouse: basic_info_models.WareHouse | None = None,
operator: basic_info_models.Employee | None = None,
items: List[Dict[str, Any]] | None = None,
remarks: str | None = '',
) -> models.SalesOrder:
"""
更新销售订单(仅限审批中状态)。
"""
_ensure_order_pending(sales_order, models.SalesOrderStatusEnum.PENDING, '销售单')
merchant = sales_order.merchant
new_customer = customer or sales_order.customer
new_warehouse = warehouse or sales_order.warehouse
new_operator = operator or sales_order.operator
new_order_date = _normalize_order_date(order_date or sales_order.sales_date)
remarks = remarks if remarks is not None else sales_order.remarks
if not items:
raise ValueError('items 需要为非空数组')
sales_items, stock_flow_items = _normalize_order_items(
merchant=merchant,
warehouse=new_warehouse,
items=items,
is_outgoing=True,
customer=new_customer,
)
with transaction.atomic():
sales_order.customer = new_customer
sales_order.sales_date = new_order_date
sales_order.warehouse = new_warehouse
sales_order.operator = new_operator
sales_order.remarks = remarks
sales_order.save(
update_fields=['customer', 'sales_date', 'warehouse', 'operator', 'remarks', 'updated_at']
)
sales_order.items.all().delete()
bulk_objects = [
models.SalesOrderItem(
sales_order=sales_order,
product=item_data['product'],
price=item_data['price'],
color=item_data.get('color'),
quantity=item_data['quantity'],
unit=item_data['unit'],
spec=item_data.get('spec'),
empty_diff_percent=item_data['empty_diff_percent'],
quantity_of_rolls=item_data.get('quantity_of_rolls'),
num_of_rolls=item_data['num_of_rolls'],
consume_detail_ids=item_data.get('consume_detail_ids'),
batch_number=item_data.get('batch_number'),
remarks=item_data.get('remarks'),
printing_job=item_data.get('printing_job'),
)
for item_data in sales_items
]
models.SalesOrderItem.objects.bulk_create(bulk_objects)
sales_order.refresh_from_db()
return sales_order
def create_purchase_return_order(
*,
merchant: basic_info_models.Merchant,
@@ -369,6 +501,84 @@ def create_purchase_return_order(
return return_order
def update_purchase_return_order(
*,
purchase_return_order: models.PurchaseReturnOrder,
supplier: basic_info_models.Supplier | None = None,
return_date=None,
warehouse: basic_info_models.WareHouse | None = None,
items: List[Dict[str, Any]] | None = None,
remarks: str | None = '',
purchase_order: models.PurchaseOrder | None = None,
purchase_order_id: int | None = None,
) -> models.PurchaseReturnOrder:
"""
更新采购退货单(仅限审批中状态)。
"""
_ensure_order_pending(purchase_return_order, models.PurchaseReturnStatusEnum.PENDING, '采购退货单')
merchant = purchase_return_order.merchant
new_supplier = supplier or purchase_return_order.supplier
new_warehouse = warehouse or purchase_return_order.warehouse
new_return_date = _normalize_order_date(return_date or purchase_return_order.return_date)
remarks = remarks if remarks is not None else purchase_return_order.remarks
if not items:
raise ValueError('items 需要为非空数组')
resolved_purchase_order = purchase_order or purchase_return_order.purchase_order
if resolved_purchase_order is None and purchase_order_id:
resolved_purchase_order = models.PurchaseOrder.objects.filter(
id=purchase_order_id,
merchant=merchant,
).first()
if resolved_purchase_order is None:
raise ValueError('关联的采购单不存在或不属于当前商户')
if resolved_purchase_order and resolved_purchase_order.supplier_id != new_supplier.id:
raise ValueError('采购退货单的供应商必须与原采购单一致')
normalized_items, _ = _normalize_order_items(
merchant=merchant,
warehouse=new_warehouse,
items=items,
is_outgoing=True,
)
with transaction.atomic():
purchase_return_order.supplier = new_supplier
purchase_return_order.return_date = new_return_date
purchase_return_order.warehouse = new_warehouse
purchase_return_order.remarks = remarks
purchase_return_order.purchase_order = resolved_purchase_order
purchase_return_order.save(
update_fields=['supplier', 'return_date', 'warehouse', 'remarks', 'purchase_order', 'updated_at']
)
purchase_return_order.items.all().delete()
bulk_objects = [
models.PurchaseReturnOrderItem(
purchase_return_order=purchase_return_order,
product=item_data['product'],
price=item_data['price'],
color=item_data.get('color'),
quantity=item_data['quantity'],
unit=item_data['unit'],
spec=item_data.get('spec'),
empty_diff_percent=item_data['empty_diff_percent'],
quantity_of_rolls=item_data.get('quantity_of_rolls'),
num_of_rolls=item_data['num_of_rolls'],
consume_detail_ids=item_data.get('consume_detail_ids'),
batch_number=item_data.get('batch_number'),
remarks=item_data.get('remarks'),
)
for item_data in normalized_items
]
models.PurchaseReturnOrderItem.objects.bulk_create(bulk_objects)
purchase_return_order.refresh_from_db()
return purchase_return_order
def create_sales_return_order(
*,
merchant: basic_info_models.Merchant,
@@ -441,6 +651,85 @@ def create_sales_return_order(
return return_order
def update_sales_return_order(
*,
sales_return_order: models.SalesReturnOrder,
customer: basic_info_models.Customer | None = None,
return_date=None,
warehouse: basic_info_models.WareHouse | None = None,
items: List[Dict[str, Any]] | None = None,
remarks: str | None = '',
sales_order: models.SalesOrder | None = None,
sales_order_id: int | None = None,
) -> models.SalesReturnOrder:
"""
更新销售退货单(仅限审批中状态)。
"""
_ensure_order_pending(sales_return_order, models.SalesReturnStatusEnum.PENDING, '销售退货单')
merchant = sales_return_order.merchant
new_customer = customer or sales_return_order.customer
new_warehouse = warehouse or sales_return_order.warehouse
new_return_date = _normalize_order_date(return_date or sales_return_order.return_date)
remarks = remarks if remarks is not None else sales_return_order.remarks
if not items:
raise ValueError('items 需要为非空数组')
resolved_sales_order = sales_order or sales_return_order.sales_order
if resolved_sales_order is None and sales_order_id:
resolved_sales_order = models.SalesOrder.objects.filter(
id=sales_order_id,
merchant=merchant,
).first()
if resolved_sales_order is None:
raise ValueError('关联的销售单不存在或不属于当前商户')
if resolved_sales_order and resolved_sales_order.customer_id != new_customer.id:
raise ValueError('销售退货单的客户必须与原销售单一致')
normalized_items, _ = _normalize_order_items(
merchant=merchant,
warehouse=new_warehouse,
items=items,
is_outgoing=False,
)
with transaction.atomic():
sales_return_order.customer = new_customer
sales_return_order.return_date = new_return_date
sales_return_order.warehouse = new_warehouse
sales_return_order.remarks = remarks
sales_return_order.sales_order = resolved_sales_order
sales_return_order.save(
update_fields=['customer', 'return_date', 'warehouse', 'remarks', 'sales_order', 'updated_at']
)
sales_return_order.items.all().delete()
bulk_objects = [
models.SalesReturnOrderItem(
sales_return_order=sales_return_order,
product=item_data['product'],
price=item_data['price'],
color=item_data.get('color'),
quantity=item_data['quantity'],
unit=item_data['unit'],
spec=item_data.get('spec'),
empty_diff_percent=item_data['empty_diff_percent'],
quantity_of_rolls=item_data.get('quantity_of_rolls'),
num_of_rolls=item_data['num_of_rolls'],
consume_detail_ids=item_data.get('consume_detail_ids'),
batch_number=item_data.get('batch_number'),
remarks=item_data.get('remarks'),
)
for item_data in normalized_items
]
models.SalesReturnOrderItem.objects.bulk_create(bulk_objects)
sales_return_order.refresh_from_db()
return sales_return_order
def create_payment_order(
*,
merchant: basic_info_models.Merchant,
@@ -1439,6 +1728,11 @@ def _ensure_non_zero_amount(value, field_name: str) -> Decimal:
return amount
def _ensure_order_pending(order, pending_status, entity_name: str):
if getattr(order, 'status', None) != pending_status:
raise ValueError(f'{entity_name}当前状态不可修改')
def _ensure_non_negative_amount(value, field_name: str) -> Decimal:
if value in (None, ''):
return Decimal('0')