| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 | from rest_framework_csv.renderers import CSVStreamingRendererdef 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()
 |