forked from erp-dev/erp
feat: added put/patch api to main oobject of business module
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user