forked from erp-dev/erp
feat: retry haobuye sync order
This commit is contained in:
@@ -394,6 +394,7 @@ class SalesItemSerializer(serializers.Serializer):
|
||||
shipment_date = serializers.DateField(
|
||||
source="shipment.shipment_date", read_only=True, allow_null=True
|
||||
)
|
||||
merge_remark = serializers.JSONField(read_only=True, allow_null=True)
|
||||
created_at = serializers.DateTimeField(read_only=True)
|
||||
created_by_id = serializers.IntegerField(
|
||||
source="created_by.id", read_only=True, allow_null=True
|
||||
@@ -706,6 +707,60 @@ class SalesItemCreateSerializer(serializers.Serializer):
|
||||
default="",
|
||||
help_text="货位(可选)",
|
||||
)
|
||||
merge_remark = serializers.JSONField(
|
||||
required=False,
|
||||
allow_null=True,
|
||||
default=None,
|
||||
help_text="合卷备注JSON(可选)",
|
||||
)
|
||||
|
||||
_MERGE_REMARK_REQUIRED_KEYS = {
|
||||
"merge_type": str,
|
||||
"jobs": list,
|
||||
"main_job": int,
|
||||
"quantity": str,
|
||||
"unit": str,
|
||||
"job_count": int,
|
||||
}
|
||||
|
||||
def validate_merge_remark(self, value):
|
||||
"""严格校验 merge_remark 的结构"""
|
||||
if value is None:
|
||||
return value
|
||||
if not isinstance(value, dict):
|
||||
raise serializers.ValidationError("merge_remark 必须是一个 JSON 对象")
|
||||
|
||||
missing = set(self._MERGE_REMARK_REQUIRED_KEYS) - set(value.keys())
|
||||
if missing:
|
||||
raise serializers.ValidationError(f"缺少必填字段: {sorted(missing)}")
|
||||
|
||||
extra = set(value.keys()) - set(self._MERGE_REMARK_REQUIRED_KEYS)
|
||||
if extra:
|
||||
raise serializers.ValidationError(f"包含未知字段: {sorted(extra)}")
|
||||
|
||||
for key, expected_type in self._MERGE_REMARK_REQUIRED_KEYS.items():
|
||||
if not isinstance(value[key], expected_type):
|
||||
raise serializers.ValidationError(
|
||||
f"字段 '{key}' 类型错误,期望 {expected_type.__name__},"
|
||||
f"实际 {type(value[key]).__name__}"
|
||||
)
|
||||
|
||||
# jobs 列表内的元素必须都是整数
|
||||
if not all(isinstance(j, int) for j in value["jobs"]):
|
||||
raise serializers.ValidationError("jobs 列表中的元素必须为整数")
|
||||
|
||||
if len(value["jobs"]) < 2:
|
||||
raise serializers.ValidationError("jobs 列表至少需要包含 2 个子单ID")
|
||||
|
||||
if value["main_job"] not in value["jobs"]:
|
||||
raise serializers.ValidationError("main_job 必须是 jobs 列表中的一个成员")
|
||||
|
||||
if value["job_count"] != len(value["jobs"]):
|
||||
raise serializers.ValidationError(
|
||||
f"job_count ({value['job_count']}) 与 jobs 长度 ({len(value['jobs'])}) 不一致"
|
||||
)
|
||||
|
||||
return value
|
||||
|
||||
def validate_unit(self, value):
|
||||
"""验证单位值是否在允许范围内"""
|
||||
@@ -734,6 +789,7 @@ class SalesItemCreateSerializer(serializers.Serializer):
|
||||
customer_id=validated_data.get("customer_id"),
|
||||
remark=validated_data.get("remark", ""),
|
||||
position=validated_data.get("position", ""),
|
||||
merge_remark=validated_data.get("merge_remark"),
|
||||
)
|
||||
|
||||
|
||||
@@ -766,3 +822,21 @@ class SalesItemUpdateSerializer(serializers.Serializer):
|
||||
if not attrs:
|
||||
raise serializers.ValidationError("至少提供一个可修改字段")
|
||||
return attrs
|
||||
|
||||
|
||||
class SalesItemRebuildSerializer(serializers.Serializer):
|
||||
"""
|
||||
销售品重建序列化器。
|
||||
"""
|
||||
|
||||
new_printing_job_id = serializers.IntegerField(
|
||||
required=True,
|
||||
min_value=1,
|
||||
help_text="新的生产任务ID(必填)",
|
||||
)
|
||||
quantity = serializers.CharField(
|
||||
max_length=20,
|
||||
required=False,
|
||||
allow_blank=False,
|
||||
help_text="新的数量(可选,未传则沿用原销售品数量)",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user