files.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. from rest_framework_csv.renderers import CSVStreamingRenderer
  2. def file_headers_list():
  3. return [
  4. 'document_date',
  5. 'document_number',
  6. 'document_type',
  7. 'business_type',
  8. 'iout_type',
  9. 'department',
  10. 'warehouse_name',
  11. 'goods_code',
  12. 'goods_desc',
  13. 'goods_std',
  14. 'goods_batch',
  15. 'in_batch',
  16. 'out_batch',
  17. 'goods_in',
  18. 'goods_out',
  19. 'goods_notes',
  20. 'creator'
  21. ]
  22. def cn_data_header_list():
  23. return dict([
  24. ('document_date', '单据日期'),
  25. ('document_number', '单据编号'),
  26. ('document_type', '单据类型'),
  27. ('business_type', '业务类型'),
  28. ('iout_type', '出入库类型'),
  29. ('department', '部门'),
  30. ('warehouse_code', '仓库编码'),
  31. ('warehouse_name', '仓库名称'),
  32. ('goods_code', '商品编码'),
  33. ('goods_desc', '商品描述'),
  34. ('goods_std', '商品标准'),
  35. ('goods_batch', '商品批次'),
  36. ('in_batch', '入库批次'),
  37. ('out_batch', '出库批次'),
  38. ('goods_in', '入库数量'),
  39. ('goods_out', '出库数量'),
  40. ('goods_notes', '备注'),
  41. ('creator', '创建人')
  42. ])
  43. class FileFlowListRenderCN(CSVStreamingRenderer):
  44. header = file_headers_list()
  45. labels = cn_data_header_list()
  46. """
  47. class MaterialChangeHistory(models.Model):
  48. material_stats = models.ForeignKey(
  49. MaterialStatistics,
  50. on_delete=models.CASCADE,
  51. related_name='history_records',
  52. verbose_name="关联物料"
  53. )
  54. # 与批次日志建立多对一关系
  55. batch_log = models.ForeignKey(batchLogModel,on_delete=models.CASCADE, related_name='material_history', verbose_name="关联批次日志",primary_key=False)
  56. goods_code = models.CharField(max_length=50, verbose_name='货品编码')
  57. goods_desc = models.CharField(max_length=100, verbose_name='货品描述')
  58. goods_std = models.CharField(max_length=50, verbose_name='货品规格', null=True, blank=True)
  59. goods_unit = models.CharField(max_length=50, verbose_name='货品单位', null=True, blank=True)
  60. # 时间戳记录(使用批次日志的时间)
  61. change_time = models.DateTimeField(
  62. verbose_name="变动时间"
  63. )
  64. # 库存变动情况
  65. in_quantity = models.DecimalField(
  66. max_digits=10, decimal_places=3,
  67. default=Decimal('0'),
  68. verbose_name="入库数量"
  69. )
  70. out_quantity = models.DecimalField(
  71. max_digits=10, decimal_places=3,
  72. default=Decimal('0'),
  73. verbose_name="出库数量"
  74. )
  75. # 变更类型(从批次日志获取)
  76. change_type = models.CharField(
  77. max_length=20,
  78. verbose_name="变动类型"
  79. )
  80. # 变更时的库存快照
  81. opening_quantity = models.DecimalField(
  82. max_digits=10, decimal_places=3,
  83. default=Decimal('0'),
  84. verbose_name="期初数量"
  85. )
  86. closing_quantity = models.DecimalField(
  87. max_digits=10, decimal_places=3,
  88. default=Decimal('0'),
  89. verbose_name="期末数量"
  90. class batchLogModel(models.Model):
  91. LOG_TYPES = (
  92. ('create', '创建'),
  93. ('update', '更新'),
  94. ('delete', '删除'),
  95. ('out', '出库'),
  96. ('cancel_out', '取消出库'),
  97. ('status_change', '状态变更'),
  98. )
  99. bound = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, related_name='logs', null=True, blank=True)
  100. batch = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, related_name='logs')
  101. log_type = models.CharField(max_length=20, choices=LOG_TYPES, verbose_name='日志类型')
  102. goods_code = models.CharField(max_length=50, verbose_name='货品编码')
  103. goods_desc = models.CharField(max_length=100, verbose_name='货品描述')
  104. goods_std = models.CharField(max_length=50, verbose_name='货品规格', null=True, blank=True)
  105. goods_unit = models.CharField(max_length=50, verbose_name='货品单位', null=True, blank=True)
  106. goods_in_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新入数量', null=True, blank=True)
  107. goods_out_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新出数量', null=True, blank=True)
  108. detail_logs = models.ManyToManyField(
  109. ContainerDetailLogModel,
  110. related_name='batch_logs',
  111. verbose_name='关联托盘日志'
  112. )
  113. create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
  114. class ContainerDetailLogModel(models.Model):
  115. LOG_TYPES = (
  116. ('create', '创建'),
  117. ('update', '更新'),
  118. ('delete', '删除'),
  119. ('out', '出库'),
  120. ('cancel_out', '取消出库'),
  121. ('status_change', '状态变更'),
  122. )
  123. # 关联的托盘明细
  124. container_detail = models.ForeignKey(
  125. ContainerDetailModel,
  126. on_delete=models.CASCADE,
  127. related_name='logs'
  128. )
  129. # 日志类型
  130. log_type = models.CharField(
  131. max_length=20,
  132. choices=LOG_TYPES,
  133. verbose_name='日志类型'
  134. )
  135. # 原值
  136. old_goods_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='原数量', null=True, blank=True)
  137. old_goods_out_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='原出库数量', null=True, blank=True)
  138. old_status = models.IntegerField(
  139. choices=ContainerDetailModel.BATCH_STATUS,
  140. null=True,
  141. blank=True,
  142. verbose_name='原状态'
  143. )
  144. # 新值
  145. new_goods_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新数量', null=True, blank=True)
  146. new_goods_out_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新出库数量', null=True, blank=True)
  147. new_status = models.IntegerField(
  148. choices=ContainerDetailModel.BATCH_STATUS,
  149. null=True,
  150. blank=True,
  151. verbose_name='新状态'
  152. )
  153. # 元信息
  154. creater = models.CharField(max_length=50, verbose_name='操作人')
  155. create_time = models.DateTimeField(auto_now_add=True, verbose_name='操作时间')
  156. tobatchlog = models.BooleanField(default=False, verbose_name='是否转移到批次日志')
  157. """
  158. def MaterialChangeHistory_file_headers_list():
  159. return [
  160. 'id',
  161. 'batch_log',
  162. 'goods_code',
  163. 'goods_desc',
  164. 'goods_std',
  165. 'goods_unit',
  166. 'change_time',
  167. 'in_quantity',
  168. 'out_quantity',
  169. 'change_type',
  170. 'opening_quantity',
  171. 'closing_quantity'
  172. ]
  173. def MaterialChangeHistory_cn_data_header_list():
  174. return dict([
  175. ('id', '序号'),
  176. ('batch_log', '批次日志'),
  177. ('goods_code', '货品编码'),
  178. ('goods_desc', '货品描述'),
  179. ('goods_std', '货品规格'),
  180. ('goods_unit', '货品单位'),
  181. ('change_time', '变动时间'),
  182. ('in_quantity', '入库数量'),
  183. ('out_quantity', '出库数量'),
  184. ('change_type', '变动类型'),
  185. ('opening_quantity', '期初数量'),
  186. ('closing_quantity', '期末数量')
  187. ])
  188. class MaterialChangeHistoryRenderCN(CSVStreamingRenderer):
  189. header = MaterialChangeHistory_file_headers_list()
  190. labels = MaterialChangeHistory_cn_data_header_list()
  191. def batchLog_file_headers_list():
  192. return [
  193. 'id',
  194. 'log_type',
  195. 'batch_code',
  196. 'goods_code',
  197. 'goods_desc',
  198. 'goods_std',
  199. 'goods_in_qty',
  200. 'goods_out_qty',
  201. 'goods_unit',
  202. 'check_status',
  203. 'create_time',
  204. 'detail_logs',
  205. ]
  206. def batchLog_cn_data_header_list():
  207. return dict([
  208. ('id', '序号'),
  209. ('bound', '绑定'),
  210. ('batch', '批次'),
  211. ('log_type', '日志类型'),
  212. ('goods_code', '货品编码'),
  213. ('goods_desc', '货品描述'),
  214. ('goods_std', '货品规格'),
  215. ('goods_unit', '货品单位'),
  216. ('goods_in_qty', '新入数量'),
  217. ('goods_out_qty', '新出数量'),
  218. ('detail_logs', '托盘日志'),
  219. ('create_time', '创建时间'),
  220. ('check_status', '质检状态(0:未质检,1:已质检,2:质检不合格)')
  221. ])
  222. class batchLogRenderCN(CSVStreamingRenderer):
  223. header = batchLog_file_headers_list()
  224. labels = batchLog_cn_data_header_list()
  225. def ContainerDetailLog_file_headers_list():
  226. return [
  227. 'id',
  228. 'batch',
  229. 'container_code',
  230. 'goods_code',
  231. 'goods_desc',
  232. 'detail_goods_qty',
  233. 'goods_qty',
  234. 'goods_out_qty',
  235. 'batch_goods_qty',
  236. 'batch_goods_in_qty',
  237. 'batch_goods_in_location_qty',
  238. 'batch_goods_out_qty',
  239. 'create_time',
  240. 'log_type',
  241. 'old_goods_qty',
  242. 'old_goods_out_qty',
  243. 'old_status',
  244. 'new_goods_qty',
  245. 'new_goods_out_qty',
  246. 'new_status',
  247. 'creater',
  248. 'tobatchlog',
  249. 'container_detail'
  250. ]
  251. def ContainerDetailLog_cn_data_header_list():
  252. return dict([
  253. ('id', '序号'),
  254. ('batch', '批次'),
  255. ('container_code', '托盘编码'),
  256. ('goods_code', '货品编码'),
  257. ('goods_desc', '货品描述'),
  258. ('detail_goods_qty', '托盘货品数量'),
  259. ('goods_qty', '货品数量'),
  260. ('goods_out_qty', '出库数量'),
  261. ('batch_goods_qty', '批次货品数量'),
  262. ('batch_goods_in_qty', '批次入库数量'),
  263. ('batch_goods_in_location_qty', '批次入库库位数量'),
  264. ('batch_goods_out_qty', '批次出库数量'),
  265. ('create_time', '创建时间'),
  266. ('log_type', '日志类型'),
  267. ('old_goods_qty', '原数量'),
  268. ('old_goods_out_qty', '原出库数量'),
  269. ('old_status', '原状态'),
  270. ('new_goods_qty', '新数量'),
  271. ('new_goods_out_qty', '新出库数量'),
  272. ('new_status', '新状态'),
  273. ('creater', '操作人'),
  274. ('tobatchlog', '是否转移到批次日志'),
  275. ('container_detail', '托盘明细')
  276. ])
  277. class ContainerDetailLogRenderCN(CSVStreamingRenderer):
  278. header = ContainerDetailLog_file_headers_list()
  279. labels = ContainerDetailLog_cn_data_header_list()