forked from erp-dev/erp
feat: mission replied calling task
This commit is contained in:
18
shipment/migrations/0022_shipment_rejected_sales_item_ids.py
Normal file
18
shipment/migrations/0022_shipment_rejected_sales_item_ids.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.8 on 2026-04-17 00:00
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shipment', '0021_geo_coordinates'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='shipment',
|
||||
name='rejected_sales_item_ids',
|
||||
field=models.JSONField(blank=True, default=list, help_text='仅用于审计,记录出货单驳回前所绑定的销售品ID列表', verbose_name='驳回前销售品ID快照'),
|
||||
),
|
||||
]
|
||||
@@ -205,6 +205,13 @@ class Shipment(ModelBase):
|
||||
help_text='由 Geo 系统返回的坐标信息,结构由调用方决定,后端不作校验',
|
||||
)
|
||||
|
||||
rejected_sales_item_ids = models.JSONField(
|
||||
default=list,
|
||||
blank=True,
|
||||
verbose_name='驳回前销售品ID快照',
|
||||
help_text='仅用于审计,记录出货单驳回前所绑定的销售品ID列表',
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = 'shipment'
|
||||
verbose_name = '出货单'
|
||||
|
||||
@@ -625,7 +625,7 @@ def modify_status(
|
||||
规则:
|
||||
- 草稿 -> 只能已发布
|
||||
- 已发布 -> 已审核 / 已驳回 / 已取消
|
||||
- 已驳回 -> 已审核 / 已取消
|
||||
- 已驳回 -> 已取消
|
||||
- 已审核 -> 已取消
|
||||
- 已取消 -> 不可再变
|
||||
- 重复设置同一状态保持幂等,直接返回
|
||||
@@ -642,7 +642,9 @@ def modify_status(
|
||||
ShipmentStatus.CANCELLED,
|
||||
},
|
||||
ShipmentStatus.REJECTED: {
|
||||
ShipmentStatus.APPROVED,
|
||||
# 驳回现在会解绑销售品并回退到待分配池。
|
||||
# 在没有重新绑定流程前,暂时关闭 REJECTED -> APPROVED,避免审核空出货单。
|
||||
# ShipmentStatus.APPROVED,
|
||||
ShipmentStatus.CANCELLED,
|
||||
},
|
||||
ShipmentStatus.APPROVED: {
|
||||
@@ -660,6 +662,22 @@ def modify_status(
|
||||
if target_status == ShipmentStatus.APPROVED and approved_by is None:
|
||||
raise ValueError("目标状态为已审核时,approved_by 不能为空")
|
||||
|
||||
update_fields = [
|
||||
"status",
|
||||
"status_modified_at",
|
||||
"cancelled_by",
|
||||
"approved_by",
|
||||
"updated_at",
|
||||
]
|
||||
|
||||
if target_status == ShipmentStatus.REJECTED:
|
||||
bound_sales_item_qs = SalesItem.objects.select_for_update().filter(shipment=shipment)
|
||||
shipment.rejected_sales_item_ids = list(
|
||||
bound_sales_item_qs.order_by("id").values_list("id", flat=True)
|
||||
)
|
||||
bound_sales_item_qs.update(shipment=None)
|
||||
update_fields.append("rejected_sales_item_ids")
|
||||
|
||||
shipment.status = target_status
|
||||
shipment.status_modified_at = timezone.now()
|
||||
|
||||
@@ -669,15 +687,7 @@ def modify_status(
|
||||
if target_status == ShipmentStatus.APPROVED:
|
||||
shipment.approved_by = approved_by
|
||||
|
||||
shipment.save(
|
||||
update_fields=[
|
||||
"status",
|
||||
"status_modified_at",
|
||||
"cancelled_by",
|
||||
"approved_by",
|
||||
"updated_at",
|
||||
]
|
||||
)
|
||||
shipment.save(update_fields=update_fields)
|
||||
return shipment
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user