serializers.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. from rest_framework import serializers
  2. from .models import InboundBill, MaterialDetail ,OutboundBill, OutMaterialDetail, InboundBillOperateLog, OutboundBillOperateLog
  3. from utils import datasolve
  4. class InboundApplySerializer(serializers.ModelSerializer):
  5. """
  6. 生产入库申请序列化器
  7. """
  8. billId = serializers.CharField( read_only=True) # 新增显式声明
  9. class Meta:
  10. model = InboundBill
  11. fields = '__all__'
  12. ordering_fields = ['update_time', 'create_time']
  13. read_only_fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount']
  14. class OutboundApplySerializer(serializers.ModelSerializer):
  15. """
  16. 生产出库申请序列化器
  17. """
  18. billId = serializers.CharField( read_only=True) # 新增显式声明
  19. class Meta:
  20. model = OutboundBill
  21. fields = '__all__'
  22. ordering_fields = ['update_time', 'create_time']
  23. read_only_fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount']
  24. class boundPostSerializer(serializers.Serializer):
  25. """
  26. 生产入库申请序列化器
  27. """
  28. billId = serializers.IntegerField(required=True, label='原始单据ID')
  29. number = serializers.CharField(required=True, label='单据编号')
  30. type = serializers.IntegerField(required=True, label='绑定类型')
  31. date = serializers.CharField(required=True, label='入库时间')
  32. department = serializers.CharField(required=False, label='部门')
  33. warehouse = serializers.CharField(required=True, label='仓库')
  34. creater = serializers.CharField(required=True, label='创建人')
  35. note = serializers.CharField(required=False, label='备注说明')
  36. totalCount = serializers.IntegerField(required=True, label='总条目数')
  37. materials = serializers.ListField(required=True, label='物料明细')
  38. class Meta:
  39. fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','materials']
  40. def validate_materials(self, value):
  41. """
  42. 增强版物料明细验证
  43. 返回带具体缺失字段的错误信息
  44. """
  45. required_fields = [
  46. 'entryIds', 'production_batch',
  47. 'goods_code', 'goods_name',
  48. 'plan_qty',
  49. 'goods_unit'
  50. ]
  51. errors = []
  52. for index, item in enumerate(value):
  53. # 识别缺失字段
  54. missing_fields = [field for field in required_fields if field not in item]
  55. if missing_fields:
  56. errors.append({
  57. "index": index,
  58. "entryIds": item.get('entryIds'), # 保留原始标识
  59. "production_batch": item.get('production_batch'),
  60. "missing_fields": missing_fields,
  61. "message": f"第{index+1}条物料缺少必填字段: {', '.join(missing_fields)}"
  62. })
  63. if errors:
  64. # 抛出结构化错误
  65. raise serializers.ValidationError([
  66. {
  67. "detail": error["message"],
  68. "metadata": {
  69. "entryIds": error["entryIds"],
  70. "production_batch": error["production_batch"],
  71. "missing_fields": error["missing_fields"]
  72. }
  73. } for error in errors
  74. ])
  75. return value
  76. class MaterialDetailSerializer(serializers.ModelSerializer):
  77. """
  78. 物料明细序列化器
  79. """
  80. bound_billId_code = serializers.SerializerMethodField()
  81. class Meta:
  82. model = MaterialDetail
  83. fields = '__all__'
  84. def get_bound_billId_code(self, obj):
  85. """
  86. 物料明细编码
  87. """
  88. return f"{obj.bound_billId.number}"
  89. class MaterialDetailPOSTSerializer(serializers.ModelSerializer):
  90. """
  91. 物料明细序列化器
  92. """
  93. class Meta:
  94. model = MaterialDetail
  95. fields = [ 'production_batch', 'goods_code', 'goods_name', 'goods_std', 'goods_weight', 'plan_qty', 'goods_total_weight', 'goods_unit', 'note','is_delete']
  96. class InboundApplyPOSTSerializer(serializers.ModelSerializer):
  97. """
  98. 生产入库申请序列化器
  99. """
  100. class Meta:
  101. model = InboundBill
  102. # fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','is_delete','audit_status']
  103. fields = ['bound_status']
  104. class OutboundApplyPOSTSerializer(serializers.ModelSerializer):
  105. """
  106. 生产出库申请序列化器
  107. """
  108. class Meta:
  109. model = OutboundBill
  110. # fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','is_delete','audit_status']
  111. fields = ['bound_status']
  112. class OutMaterialDetailSerializer(serializers.ModelSerializer):
  113. """
  114. 物料明细序列化器
  115. """
  116. class Meta:
  117. model = OutMaterialDetail
  118. exclude = ['id', 'note']
  119. read_only_fields = ['entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_weight', 'goods_out_qty', 'goods_total_weight', 'goods_unit', 'note']
  120. class outboundPostSerializer(serializers.Serializer):
  121. """
  122. 生产入库申请序列化器
  123. """
  124. billId = serializers.IntegerField(required=True, label='原始单据ID')
  125. number = serializers.CharField(required=True, label='单据编号')
  126. type = serializers.IntegerField(required=True, label='绑定类型')
  127. date = serializers.CharField(required=True, label='出库时间')
  128. department = serializers.CharField(required=False, label='部门',default='空')
  129. warehouse = serializers.CharField(required=True, label='仓库')
  130. creater = serializers.CharField(required=True, label='创建人')
  131. note = serializers.CharField(required=False, label='备注说明')
  132. totalCount = serializers.IntegerField(required=True, label='总条目数')
  133. materials = serializers.ListField(required=True, label='物料明细')
  134. class Meta:
  135. fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','materials']
  136. def validate_materials(self, value):
  137. """
  138. 增强版物料明细验证
  139. 返回带具体缺失字段的错误信息
  140. """
  141. required_fields = [
  142. 'entryIds', 'production_batch',
  143. 'goods_code', 'goods_name',
  144. 'goods_out_qty',
  145. 'goods_unit'
  146. ]
  147. errors = []
  148. for index, item in enumerate(value):
  149. # 识别缺失字段
  150. missing_fields = [field for field in required_fields if field not in item]
  151. if missing_fields:
  152. errors.append({
  153. "index": index,
  154. "entryIds": item.get('entryIds'), # 保留原始标识
  155. "production_batch": item.get('production_batch'),
  156. "missing_fields": missing_fields,
  157. "message": f"第{index+1}条物料缺少必填字段: {', '.join(missing_fields)}"
  158. })
  159. if errors:
  160. # 抛出结构化错误
  161. raise serializers.ValidationError([
  162. {
  163. "detail": error["message"],
  164. "metadata": {
  165. "entryIds": error["entryIds"],
  166. "production_batch": error["production_batch"],
  167. "missing_fields": error["missing_fields"]
  168. }
  169. } for error in errors
  170. ])
  171. return value
  172. class InboundbillOperateLogSerializer(serializers.ModelSerializer):
  173. """
  174. 入库单操作日志序列化器
  175. """
  176. create_time = serializers.DateTimeField(format='%Y-%m-%d', required=False, label='操作时间')
  177. class Meta:
  178. model = InboundBillOperateLog
  179. fields = '__all__'
  180. ordering_fields = ['update_time', 'create_time']
  181. read_only_fields = ['billId', 'operate_type', 'operate_content', 'operate_time']
  182. class OutboundbillOperateLogSerializer(serializers.ModelSerializer):
  183. """
  184. 出库单操作日志序列化器
  185. """
  186. create_time = serializers.DateTimeField(format='%Y-%m-%d', required=False, label='操作时间')
  187. class Meta:
  188. model = OutboundBillOperateLog
  189. fields = '__all__'
  190. ordering_fields = ['update_time', 'create_time']
  191. read_only_fields = ['billId', 'operate_type', 'operate_content', 'operate_time']