serializers.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. from rest_framework import serializers
  2. from .models import BoundListModel, BoundDetailModel, BoundBatchModel,OutBatchModel,BatchLogModel,OutBoundDetailModel,MaterialStatistics,OutBoundDemandModel
  3. from utils import datasolve
  4. class OutBoundDemandModelSerializer(serializers.ModelSerializer):
  5. class Meta:
  6. model = OutBoundDemandModel
  7. fields = '__all__'
  8. read_only_fields = ['id', 'create_time', 'update_time']
  9. class BoundListGetSerializer(serializers.ModelSerializer):
  10. # 定义主单列表的序列化器,用于获取操作,字段只读
  11. bound_month = serializers.CharField(read_only=True, required=False)
  12. bound_date = serializers.DateField(read_only=True, format='%Y-%m-%d')
  13. bound_code = serializers.CharField(read_only=True, required=False)
  14. bound_code_type = serializers.CharField(read_only=True, required=False)
  15. bound_bs_type = serializers.CharField(read_only=True, required=False)
  16. bound_type = serializers.CharField(read_only=True, required=False)
  17. bound_desc = serializers.CharField(read_only=True, required=False)
  18. bound_department = serializers.CharField(read_only=True, required=False)
  19. bound_status = serializers.CharField(read_only=True, required=False)
  20. creater = serializers.CharField(read_only=True, required=False)
  21. create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  22. update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  23. class Meta:
  24. # 指定模型和排除字段
  25. model = BoundListModel
  26. exclude = ['openid', 'is_delete']
  27. read_only_fields = ['id', 'openid']
  28. class BoundListPostSerializer(serializers.ModelSerializer):
  29. # 定义主单列表的序列化器,用于创建操作,允许部分字段写入
  30. bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  31. bound_date = serializers.DateField(read_only=False, required=False, validators=[datasolve.data_validate])
  32. bound_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  33. bound_code_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  34. bound_bs_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  35. bound_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  36. bound_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  37. bound_department = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  38. bound_status = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  39. openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  40. creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  41. is_delete = serializers.BooleanField(read_only=False, required=False)
  42. class Meta:
  43. # 指定模型和排除字段
  44. model = BoundListModel
  45. fields= '__all__'
  46. read_only_fields = ['id', 'create_time', 'update_time']
  47. class BoundBatchGetSerializer(serializers.ModelSerializer):
  48. # 定义批次列表的序列化器,用于获取操作,字段只读
  49. bound_number = serializers.CharField(read_only=True, required=False)
  50. bound_month = serializers.CharField(read_only=True, required=False)
  51. warehouse_code = serializers.CharField(read_only=True, required=False)
  52. warehouse_name = serializers.CharField(read_only=True, required=False)
  53. goods_code = serializers.CharField(read_only=True, required=False)
  54. goods_desc = serializers.CharField(read_only=True, required=False)
  55. goods_std = serializers.CharField(read_only=True, required=False)
  56. goods_qty = serializers.IntegerField(read_only=True, required=False)
  57. goods_in_qty = serializers.IntegerField(read_only=True, required=False)
  58. goods_out_qty = serializers.IntegerField(read_only=True, required=False)
  59. status = serializers.IntegerField(read_only=True, required=False)
  60. goods_weight = serializers.FloatField(read_only=True, required=False)
  61. goods_total_weight = serializers.FloatField(read_only=True, required=False)
  62. creater = serializers.CharField(read_only=True, required=False)
  63. create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  64. update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  65. class Meta:
  66. # 指定模型和排除字段
  67. model = BoundBatchModel
  68. exclude = ['openid', 'is_delete']
  69. read_only_fields = ['id', 'openid']
  70. class BoundBatchPostSerializer(serializers.ModelSerializer):
  71. # 定义批次列表的序列化器,用于创建操作,允许部分字段写入
  72. bound_number = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  73. bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  74. bound_batch_order = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  75. warehouse_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  76. warehouse_name = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  77. goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  78. goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  79. goods_std = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  80. goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
  81. goods_in_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  82. goods_out_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  83. status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  84. goods_weight = serializers.FloatField(read_only=False, required=True, validators=[datasolve.data_validate])
  85. goods_total_weight = serializers.FloatField(read_only=False, required=False, validators=[datasolve.data_validate])
  86. openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  87. creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  88. is_delete = serializers.BooleanField(read_only=False, required=False)
  89. class Meta:
  90. # 指定模型和排除字段
  91. model = BoundBatchModel
  92. fields= '__all__'
  93. read_only_fields = ['id', 'create_time', 'update_time']
  94. extra_kwargs = {
  95. 'is_delete': {
  96. 'default': False,
  97. 'help_text': "逻辑删除标记(默认False)"
  98. }
  99. }
  100. class BoundDetailGetSerializer(serializers.ModelSerializer):
  101. # 嵌套展示关联的主单和批次信息
  102. bound_list = serializers.SerializerMethodField()
  103. bound_batch = serializers.SerializerMethodField()
  104. detail_code = serializers.CharField(read_only=True, required=False)
  105. status = serializers.IntegerField(read_only=False, required=False)
  106. # 定义其他字段,只读
  107. creater = serializers.CharField(source='creater.username', read_only=True)
  108. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  109. update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  110. class Meta:
  111. # 指定模型和字段,所有字段只读
  112. model = BoundDetailModel
  113. fields = [
  114. 'id',
  115. 'bound_list',
  116. 'bound_batch',
  117. 'detail_code',
  118. 'creater',
  119. 'create_time',
  120. 'update_time',
  121. 'is_delete',
  122. 'status'
  123. ]
  124. read_only_fields = ['__all__']
  125. def get_bound_list(self, obj):
  126. """ 动态序列化关联的主单数据 """
  127. from .serializers import BoundListGetSerializer # 延迟导入避免循环引用
  128. return BoundListGetSerializer(obj.bound_list).data
  129. def get_bound_batch(self, obj):
  130. """ 动态序列化关联的批次数据 """
  131. from .serializers import BoundBatchGetSerializer
  132. return BoundBatchGetSerializer(obj.bound_batch).data
  133. class BoundDetailPostSerializer(serializers.ModelSerializer):
  134. # 使用主键ID关联主单和批次
  135. bound_list = serializers.PrimaryKeyRelatedField(
  136. queryset=BoundListModel.objects.all(),
  137. help_text="关联主单ID(必须已存在)",
  138. error_messages={
  139. 'does_not_exist': "指定主单不存在",
  140. 'incorrect_type': "主单ID格式错误"
  141. }
  142. )
  143. bound_batch = serializers.PrimaryKeyRelatedField(
  144. queryset=BoundBatchModel.objects.all(),
  145. help_text="关联批次ID(必须已存在)",
  146. error_messages={
  147. 'does_not_exist': "指定批次不存在",
  148. 'incorrect_type': "批次ID格式错误"
  149. }
  150. )
  151. # 创建人字段,必须填写
  152. creater = serializers.CharField(
  153. required=True,
  154. max_length=255,
  155. help_text="创建人标识(建议从用户系统获取)",
  156. error_messages={
  157. 'blank': "创建人不能为空",
  158. 'max_length': "最长255个字符"
  159. }
  160. )
  161. detail_code = serializers.CharField(read_only=False, required=False)
  162. status = serializers.IntegerField(read_only=False, required=False)
  163. class Meta:
  164. # 指定模型和字段,部分字段只读
  165. model = BoundDetailModel
  166. fields='__all__'
  167. read_only_fields = [
  168. 'id',
  169. 'create_time',
  170. 'update_time',
  171. 'is_delete'
  172. ]
  173. extra_kwargs = {
  174. 'is_delete': {
  175. 'default': False,
  176. 'help_text': "逻辑删除标记(默认False)"
  177. }
  178. }
  179. class OutBatchGetSerializer(serializers.ModelSerializer):
  180. batch_number = serializers.SerializerMethodField()
  181. class Meta:
  182. model = OutBatchModel
  183. fields = '__all__'
  184. read_only_fields = ['id', 'openid']
  185. def get_batch_number(self, obj):
  186. from .serializers import BoundBatchGetSerializer
  187. return BoundBatchGetSerializer(obj.batch_number).data
  188. class OutBatchPostSerializer(serializers.ModelSerializer):
  189. out_number = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  190. out_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  191. out_note = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  192. out_date = serializers.DateTimeField(read_only=False, required=False, validators=[datasolve.data_validate])
  193. warehouse_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  194. warehouse_name = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  195. goods_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  196. goods_desc = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  197. goods_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  198. goods_out_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  199. creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  200. class Meta:
  201. model = OutBatchModel
  202. fields = '__all__'
  203. read_only_fields = ['id', 'openid']
  204. class BatchLogGetSerializer(serializers.ModelSerializer):
  205. class Meta:
  206. model = BatchLogModel
  207. fields = '__all__'
  208. read_only_fields = ['id', 'openid']
  209. class OutBoundDetailGetSerializer(serializers.ModelSerializer):
  210. # 嵌套展示关联的主单和批次信息
  211. bound_list = serializers.SerializerMethodField()
  212. bound_batch = serializers.SerializerMethodField()
  213. bound_batch_number = serializers.SerializerMethodField()
  214. detail_code = serializers.CharField(read_only=True, required=False)
  215. status = serializers.IntegerField(read_only=False, required=False)
  216. # 定义其他字段,只读
  217. creater = serializers.CharField(source='creater.username', read_only=True)
  218. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  219. update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  220. class Meta:
  221. # 指定模型和字段,所有字段只读
  222. model = OutBoundDetailModel
  223. fields = [
  224. 'id',
  225. 'bound_list',
  226. 'bound_batch',
  227. 'bound_batch_number',
  228. 'detail_code',
  229. 'creater',
  230. 'create_time',
  231. 'update_time',
  232. 'is_delete',
  233. 'status'
  234. ]
  235. read_only_fields = ['__all__']
  236. def get_bound_list(self, obj):
  237. """ 动态序列化关联的主单数据 """
  238. from .serializers import BoundListGetSerializer # 延迟导入避免循环引用
  239. return BoundListGetSerializer(obj.bound_list).data
  240. def get_bound_batch(self, obj):
  241. from .serializers import OutBatchGetSerializer
  242. return OutBatchGetSerializer(obj.bound_batch).data
  243. def get_bound_batch_number(self, obj):
  244. from .serializers import BoundBatchGetSerializer
  245. return BoundBatchGetSerializer(obj.bound_batch_number).data
  246. class OutBoundDetailPostSerializer(serializers.ModelSerializer):
  247. # 使用主键ID关联主单和批次
  248. bound_list = serializers.PrimaryKeyRelatedField(
  249. queryset=BoundListModel.objects.all(),
  250. help_text="关联主单ID(必须已存在)",
  251. error_messages={
  252. 'does_not_exist': "指定主单不存在",
  253. 'incorrect_type': "主单ID格式错误"
  254. }
  255. )
  256. bound_batch = serializers.PrimaryKeyRelatedField(
  257. queryset=OutBatchModel.objects.all(),
  258. help_text="关联批次ID(必须已存在)",
  259. error_messages={
  260. 'does_not_exist': "指定批次不存在",
  261. 'incorrect_type': "批次ID格式错误"
  262. }
  263. )
  264. # 创建人字段,必须填写
  265. creater = serializers.CharField(
  266. required=True,
  267. max_length=255,
  268. help_text="创建人标识(建议从用户系统获取)",
  269. error_messages={
  270. 'blank': "创建人不能为空",
  271. 'max_length': "最长255个字符"
  272. }
  273. )
  274. detail_code = serializers.CharField(read_only=False, required=False)
  275. status = serializers.IntegerField(read_only=False, required=False)
  276. class Meta:
  277. # 指定模型和字段,部分字段只读
  278. model = OutBoundDetailModel
  279. fields='__all__'
  280. read_only_fields = [
  281. 'id',
  282. 'create_time',
  283. 'update_time',
  284. 'is_delete'
  285. ]
  286. extra_kwargs = {
  287. 'is_delete': {
  288. 'default': False,
  289. 'help_text': "逻辑删除标记(默认False)"
  290. }
  291. }
  292. class MaterialStatisticsSerializer(serializers.ModelSerializer):
  293. # 定义物料统计的序列化器,用于获取操作,字段只读
  294. class Meta:
  295. # 指定模型和排除字段
  296. model = MaterialStatistics
  297. fields = '__all__'
  298. read_only_fields = ['id']
  299. class MaterialStatisticsSerializer_items(serializers.ModelSerializer):
  300. # 定义物料统计的序列化器,用于获取操作,字段只读
  301. batch_items = serializers.SerializerMethodField()
  302. class Meta:
  303. # 指定模型和排除字段
  304. model = MaterialStatistics
  305. exclude = ['id', 'goods_code', 'goods_desc', 'goods_std', 'goods_unit','total_quantity']
  306. read_only_fields = ['id']
  307. def get_batch_items(self, obj):
  308. batches = obj.bound_batches
  309. return BoundBatchGetSerializer(batches, many=True).data