from rest_framework_csv.renderers import CSVStreamingRenderer def file_headers_list(): return [ 'document_date', 'document_number', 'document_type', 'business_type', 'iout_type', 'department', 'warehouse_name', 'goods_code', 'goods_desc', 'goods_std', 'goods_batch', 'in_batch', 'out_batch', 'goods_in', 'goods_out', 'goods_notes', 'creator' ] def cn_data_header_list(): return dict([ ('document_date', '单据日期'), ('document_number', '单据编号'), ('document_type', '单据类型'), ('business_type', '业务类型'), ('iout_type', '出入库类型'), ('department', '部门'), ('warehouse_code', '仓库编码'), ('warehouse_name', '仓库名称'), ('goods_code', '商品编码'), ('goods_desc', '商品描述'), ('goods_std', '商品标准'), ('goods_batch', '商品批次'), ('in_batch', '入库批次'), ('out_batch', '出库批次'), ('goods_in', '入库数量'), ('goods_out', '出库数量'), ('goods_notes', '备注'), ('creator', '创建人') ]) class FileFlowListRenderCN(CSVStreamingRenderer): header = file_headers_list() labels = cn_data_header_list() """ class MaterialChangeHistory(models.Model): material_stats = models.ForeignKey( MaterialStatistics, on_delete=models.CASCADE, related_name='history_records', verbose_name="关联物料" ) # 与批次日志建立多对一关系 batch_log = models.ForeignKey(batchLogModel,on_delete=models.CASCADE, related_name='material_history', verbose_name="关联批次日志",primary_key=False) goods_code = models.CharField(max_length=50, verbose_name='货品编码') goods_desc = models.CharField(max_length=100, verbose_name='货品描述') goods_std = models.CharField(max_length=50, verbose_name='货品规格', null=True, blank=True) goods_unit = models.CharField(max_length=50, verbose_name='货品单位', null=True, blank=True) # 时间戳记录(使用批次日志的时间) change_time = models.DateTimeField( verbose_name="变动时间" ) # 库存变动情况 in_quantity = models.DecimalField( max_digits=10, decimal_places=3, default=Decimal('0'), verbose_name="入库数量" ) out_quantity = models.DecimalField( max_digits=10, decimal_places=3, default=Decimal('0'), verbose_name="出库数量" ) # 变更类型(从批次日志获取) change_type = models.CharField( max_length=20, verbose_name="变动类型" ) # 变更时的库存快照 opening_quantity = models.DecimalField( max_digits=10, decimal_places=3, default=Decimal('0'), verbose_name="期初数量" ) closing_quantity = models.DecimalField( max_digits=10, decimal_places=3, default=Decimal('0'), verbose_name="期末数量" class batchLogModel(models.Model): LOG_TYPES = ( ('create', '创建'), ('update', '更新'), ('delete', '删除'), ('out', '出库'), ('cancel_out', '取消出库'), ('status_change', '状态变更'), ) bound = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, related_name='logs', null=True, blank=True) batch = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, related_name='logs') log_type = models.CharField(max_length=20, choices=LOG_TYPES, verbose_name='日志类型') goods_code = models.CharField(max_length=50, verbose_name='货品编码') goods_desc = models.CharField(max_length=100, verbose_name='货品描述') goods_std = models.CharField(max_length=50, verbose_name='货品规格', null=True, blank=True) goods_unit = models.CharField(max_length=50, verbose_name='货品单位', null=True, blank=True) goods_in_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新入数量', null=True, blank=True) goods_out_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新出数量', null=True, blank=True) detail_logs = models.ManyToManyField( ContainerDetailLogModel, related_name='batch_logs', verbose_name='关联托盘日志' ) create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class ContainerDetailLogModel(models.Model): LOG_TYPES = ( ('create', '创建'), ('update', '更新'), ('delete', '删除'), ('out', '出库'), ('cancel_out', '取消出库'), ('status_change', '状态变更'), ) # 关联的托盘明细 container_detail = models.ForeignKey( ContainerDetailModel, on_delete=models.CASCADE, related_name='logs' ) # 日志类型 log_type = models.CharField( max_length=20, choices=LOG_TYPES, verbose_name='日志类型' ) # 原值 old_goods_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='原数量', null=True, blank=True) old_goods_out_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='原出库数量', null=True, blank=True) old_status = models.IntegerField( choices=ContainerDetailModel.BATCH_STATUS, null=True, blank=True, verbose_name='原状态' ) # 新值 new_goods_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新数量', null=True, blank=True) new_goods_out_qty = models.DecimalField(max_digits=10, decimal_places=3, default=Decimal('0'),verbose_name='新出库数量', null=True, blank=True) new_status = models.IntegerField( choices=ContainerDetailModel.BATCH_STATUS, null=True, blank=True, verbose_name='新状态' ) # 元信息 creater = models.CharField(max_length=50, verbose_name='操作人') create_time = models.DateTimeField(auto_now_add=True, verbose_name='操作时间') tobatchlog = models.BooleanField(default=False, verbose_name='是否转移到批次日志') """ def MaterialChangeHistory_file_headers_list(): return [ 'id', 'batch_log', 'goods_code', 'goods_desc', 'goods_std', 'goods_unit', 'change_time', 'in_quantity', 'out_quantity', 'change_type', 'opening_quantity', 'closing_quantity' ] def MaterialChangeHistory_cn_data_header_list(): return dict([ ('id', '序号'), ('batch_log', '批次日志'), ('goods_code', '货品编码'), ('goods_desc', '货品描述'), ('goods_std', '货品规格'), ('goods_unit', '货品单位'), ('change_time', '变动时间'), ('in_quantity', '入库数量'), ('out_quantity', '出库数量'), ('change_type', '变动类型'), ('opening_quantity', '期初数量'), ('closing_quantity', '期末数量') ]) class MaterialChangeHistoryRenderCN(CSVStreamingRenderer): header = MaterialChangeHistory_file_headers_list() labels = MaterialChangeHistory_cn_data_header_list() def batchLog_file_headers_list(): return [ 'id', 'log_type', 'batch_code', 'goods_code', 'goods_desc', 'goods_std', 'goods_in_qty', 'goods_out_qty', 'goods_unit', 'check_status', 'create_time', 'detail_logs', ] def batchLog_cn_data_header_list(): return dict([ ('id', '序号'), ('bound', '绑定'), ('batch', '批次'), ('log_type', '日志类型'), ('goods_code', '货品编码'), ('goods_desc', '货品描述'), ('goods_std', '货品规格'), ('goods_unit', '货品单位'), ('goods_in_qty', '新入数量'), ('goods_out_qty', '新出数量'), ('detail_logs', '托盘日志'), ('create_time', '创建时间'), ('check_status', '质检状态(0:未质检,1:已质检,2:质检不合格)') ]) class batchLogRenderCN(CSVStreamingRenderer): header = batchLog_file_headers_list() labels = batchLog_cn_data_header_list() def ContainerDetailLog_file_headers_list(): return [ 'id', 'batch', 'container_code', 'goods_code', 'goods_desc', 'detail_goods_qty', 'goods_qty', 'goods_out_qty', 'batch_goods_qty', 'batch_goods_in_qty', 'batch_goods_in_location_qty', 'batch_goods_out_qty', 'create_time', 'log_type', 'old_goods_qty', 'old_goods_out_qty', 'old_status', 'new_goods_qty', 'new_goods_out_qty', 'new_status', 'creater', 'tobatchlog', 'container_detail' ] def ContainerDetailLog_cn_data_header_list(): return dict([ ('id', '序号'), ('batch', '批次'), ('container_code', '托盘编码'), ('goods_code', '货品编码'), ('goods_desc', '货品描述'), ('detail_goods_qty', '托盘货品数量'), ('goods_qty', '货品数量'), ('goods_out_qty', '出库数量'), ('batch_goods_qty', '批次货品数量'), ('batch_goods_in_qty', '批次入库数量'), ('batch_goods_in_location_qty', '批次入库库位数量'), ('batch_goods_out_qty', '批次出库数量'), ('create_time', '创建时间'), ('log_type', '日志类型'), ('old_goods_qty', '原数量'), ('old_goods_out_qty', '原出库数量'), ('old_status', '原状态'), ('new_goods_qty', '新数量'), ('new_goods_out_qty', '新出库数量'), ('new_status', '新状态'), ('creater', '操作人'), ('tobatchlog', '是否转移到批次日志'), ('container_detail', '托盘明细') ]) class ContainerDetailLogRenderCN(CSVStreamingRenderer): header = ContainerDetailLog_file_headers_list() labels = ContainerDetailLog_cn_data_header_list()