1
0
forked from erp-dev/erp

feat: mission replied calling task

This commit is contained in:
2026-04-17 23:26:33 +08:00
parent e109c00837
commit 8b1afc64c5
22 changed files with 1056 additions and 95 deletions

View 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快照'),
),
]

View File

@@ -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 = '出货单'

View File

@@ -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