1
0
forked from erp-dev/erp

feat: support pre_sales_order convert to sales_order api

This commit is contained in:
2026-02-02 15:58:29 +08:00
parent 2572c5aab4
commit fb93582b06
13 changed files with 379 additions and 7 deletions

View File

@@ -11,6 +11,7 @@ from django.utils import timezone
from basic_info import models as basic_info_models
from . import models
from . import services as business_services
def render_pre_sales_order_created_markdown(
@@ -398,6 +399,73 @@ def delete_pre_sales_order(*, pre_sales_order: models.PreSalesOrder) -> None:
pre_sales_order.delete()
def convert_pre_sales_order_to_sales_order(
*,
merchant: basic_info_models.Merchant,
pre_sales_order_id: int,
operator: basic_info_models.Employee,
created_by=None,
order_date=None,
) -> models.SalesOrder:
order = models.PreSalesOrder.objects.select_related(
'customer',
'warehouse',
'operator',
'created_by',
).prefetch_related('items', 'items__allocation_records').get(
id=pre_sales_order_id,
merchant=merchant,
)
warehouse = order.warehouse
if warehouse.mode != basic_info_models.WareHouseModeEnum.RESTRICT_IN_OUT:
raise PermissionError('仅支持严进严出仓库模式')
items_payload: List[Dict[str, Any]] = []
for item in order.items.all():
if not item.product_id:
raise ValueError(f'明细 {item.id} 缺少 product_id')
if item.quantity is None or str(item.quantity) == '':
raise ValueError(f'明细 {item.id} 缺少 quantity')
consume_ids: List[int] = []
for record in item.allocation_records.all():
if record.status != models.AllocationRecordStatusEnum.ACTIVE:
continue
consume_ids.extend(record.stock_id_list)
if not consume_ids:
raise ValueError(f'明细 {item.id} 缺少配货库存明细')
items_payload.append(
{
'product_id': item.product_id,
'price': '0',
'quantity': str(item.quantity),
'unit': item.unit or None,
'color': item.color,
'spec': item.spec,
'remarks': item.remarks,
'order_quantity': item.order_quantity,
'consume_detail_ids': consume_ids,
}
)
resolved_order_date = order_date or (order.created_at.date() if order.created_at else timezone.localdate())
return business_services.create_sales_order(
merchant=merchant,
customer=order.customer,
order_date=resolved_order_date,
warehouse=warehouse,
operator=operator,
items=items_payload,
remarks=order.remarks or '',
created_by=created_by,
from_pre_sales_order_id=order.id,
)
def list_pre_purchase_orders(*, merchant: basic_info_models.Merchant):
return models.PrePurchaseOrder.objects.filter(merchant=merchant).select_related(
'merchant', 'supplier', 'warehouse', 'created_by'