1
0
forked from erp-dev/erp

feat: new module: 'shipment', new signal when process was finished

This commit is contained in:
2026-01-13 18:19:31 +08:00
parent 70ed92e2f6
commit 6b6d2a97b6
12 changed files with 550 additions and 98 deletions

83
printing/handlers.py Normal file
View File

@@ -0,0 +1,83 @@
"""
Printing 模块信号处理函数
监听 stateflow 信号,在流程完成时执行业务逻辑。
"""
import logging
from django.db import transaction
logger = logging.getLogger(__name__)
def on_printing_job_process_completed(sender, **kwargs):
"""
PrintingJob 流程完成时的处理
当 PrintingJob 的工艺流程全部完成时,自动创建 SalesItem销售品
Args:
sender: PrintingJob 类
content_object: PrintingJob 实例
last_completed_by: 最后步骤操作人
其他参数见 stateflow.signals.process_completed
"""
from shipment.models import SalesItem, UnitChoices
content_object = kwargs.get('content_object')
last_completed_by = kwargs.get('last_completed_by')
if content_object is None:
logger.warning('process_completed 信号缺少 content_object')
return
printing_job = content_object
# 单位映射PrintingJob.unit字符串→ SalesItem.unitIntegerChoices
unit_mapping = {
'': UnitChoices.METER,
'm': UnitChoices.METER,
'M': UnitChoices.METER,
'': UnitChoices.PIECE,
'': UnitChoices.YARD,
'yd': UnitChoices.YARD,
'YD': UnitChoices.YARD,
'': UnitChoices.UNIT,
'pcs': UnitChoices.UNIT,
'PCS': UnitChoices.UNIT,
}
# 默认单位为"件"
sales_unit = unit_mapping.get(printing_job.unit, UnitChoices.PIECE)
# 获取产品名称
product_name = printing_job.product.name if printing_job.product else '未知产品'
# 获取客户ID从主订单获取
customer_id = None
if printing_job.printing_order and printing_job.printing_order.customer:
customer_id = printing_job.printing_order.customer_id
try:
with transaction.atomic():
sales_item = SalesItem.objects.create(
shipment=None, # 暂不关联出货单,待后续分配
name=product_name,
quantity=printing_job.quantity,
unit=sales_unit,
created_by=last_completed_by,
printing_job_id=printing_job.id,
customer_id=customer_id,
)
logger.info(
f'PrintingJob #{printing_job.id} 流程完成,'
f'已创建销售品 SalesItem #{sales_item.id}: '
f'{product_name} x {printing_job.quantity}'
)
except Exception as e:
logger.error(
f'PrintingJob #{printing_job.id} 流程完成后创建销售品失败: {e}',
exc_info=True
)