serializers.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from rest_framework import serializers
  2. from .models import CountReason, CountTask, CountTaskDetail
  3. class CountReasonSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = CountReason
  6. fields = "__all__"
  7. read_only_fields = ("id", "create_time", "update_time")
  8. class CountTaskDetailSerializer(serializers.ModelSerializer):
  9. reason = CountReasonSerializer(read_only=True)
  10. reason_id = serializers.PrimaryKeyRelatedField(
  11. queryset=CountReason.objects.all(),
  12. source="reason",
  13. required=False,
  14. allow_null=True,
  15. write_only=True,
  16. )
  17. class Meta:
  18. model = CountTaskDetail
  19. fields = (
  20. "id",
  21. "task",
  22. "container",
  23. "container_code",
  24. "location_code",
  25. "goods_code",
  26. "goods_desc",
  27. "goods_std",
  28. "goods_unit",
  29. "batch_number",
  30. "book_qty",
  31. "initial_count_qty",
  32. "recount_qty",
  33. "final_qty",
  34. "variance_qty",
  35. "reason",
  36. "reason_id",
  37. "counter_name",
  38. "recount_counter",
  39. "note",
  40. "status",
  41. "create_time",
  42. "update_time",
  43. )
  44. read_only_fields = (
  45. "id",
  46. "final_qty",
  47. "variance_qty",
  48. "status",
  49. "create_time",
  50. "update_time",
  51. )
  52. class CountTaskSerializer(serializers.ModelSerializer):
  53. details = CountTaskDetailSerializer(many=True, read_only=True)
  54. class Meta:
  55. model = CountTask
  56. fields = (
  57. "id",
  58. "doc_no",
  59. "task_type",
  60. "status",
  61. "source_batch",
  62. "remark",
  63. "scheduled_at",
  64. "created_by",
  65. "total_details",
  66. "counted_details",
  67. "variance_details",
  68. "create_time",
  69. "update_time",
  70. "details",
  71. )
  72. read_only_fields = (
  73. "id",
  74. "doc_no",
  75. "status",
  76. "total_details",
  77. "counted_details",
  78. "variance_details",
  79. "create_time",
  80. "update_time",
  81. )
  82. class TaskGenerateDetailSerializer(serializers.Serializer):
  83. container_ids = serializers.ListField(
  84. child=serializers.IntegerField(min_value=1), allow_empty=False, required=False
  85. )
  86. batch_ids = serializers.ListField(
  87. child=serializers.IntegerField(min_value=1), allow_empty=False, required=False
  88. )
  89. override = serializers.BooleanField(default=False)
  90. def validate(self, attrs):
  91. container_ids = attrs.get("container_ids") or []
  92. batch_ids = attrs.get("batch_ids") or []
  93. if not container_ids and not batch_ids:
  94. raise serializers.ValidationError("请至少选择托盘或批次")
  95. return attrs
  96. class CountDetailSubmitSerializer(serializers.Serializer):
  97. ROUND_INITIAL = "initial"
  98. ROUND_RECOUNT = "recount"
  99. round_type = serializers.ChoiceField(
  100. choices=((ROUND_INITIAL, "初盘"), (ROUND_RECOUNT, "复盘")), default=ROUND_INITIAL
  101. )
  102. qty = serializers.DecimalField(max_digits=14, decimal_places=3)
  103. reason_id = serializers.PrimaryKeyRelatedField(
  104. queryset=CountReason.objects.all(), allow_null=True, required=False
  105. )
  106. counter_name = serializers.CharField(required=False, allow_blank=True)
  107. note = serializers.CharField(required=False, allow_blank=True)