123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- from django.db import models
- from erp.models import InboundBill, MaterialDetail, OutboundBill,OutMaterialDetail
- from django.db.models import Sum
- from django.db.models.signals import post_save, post_delete
- from django.dispatch import receiver
- class BoundListModel(models.Model):
- STATUS =(
- ("100", '入库申请'), ("101", '入库同意'), ("102", '组盘中'), ("103", '部分入库'), ("104", '已入库'),
- ("111", '质检合格'),
- ("200", '出库申请'), ("201", '出库同意'), ("202", '出库中'), ("203", '部分出库'), ("204", '已出库'),
- ("300", '完成')
- )
-
- audit_status = models.BooleanField(default=False, verbose_name='审核状态')
- bound_month = models.CharField(max_length=255, verbose_name="月份")
- bound_date = models.DateField(verbose_name="单据日期")
- bound_code = models.CharField(max_length=255, verbose_name="出入库编号",unique=True)
- bound_code_type = models.CharField(max_length=255, verbose_name="单据类型")
- bound_bs_type = models.CharField(max_length=255, verbose_name="业务类型")
- bound_type = models.CharField(max_length=255, verbose_name="出入库类型")
- bound_desc = models.CharField(default='', max_length=255, verbose_name="出入库描述")
- bound_department = models.CharField(max_length=255, verbose_name="部门")
- base_type = models.IntegerField(default=0, verbose_name="基准类型")
- bound_status = models.CharField(max_length=255, verbose_name="单据状态",choices=STATUS, default='100')
- note = models.CharField(default='', max_length=255, verbose_name="备注")
- creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
- openid = models.CharField(max_length=255, verbose_name="Openid")
- is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
- create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
- update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
- relate_bill = models.ForeignKey(InboundBill, on_delete=models.CASCADE, verbose_name="关联单据", related_name='bound_list',null=True, blank=True)
- relate_out_bill = models.ForeignKey(OutboundBill, on_delete=models.CASCADE, verbose_name="关联出库单据", related_name='bound_out_list',null=True, blank=True)
- class Meta:
- db_table = 'boundlist'
- verbose_name = 'Bound List'
- verbose_name_plural = "Bound List"
- ordering = ['bound_status','-id']
- class BoundBatchModel(models.Model):
- CONTAINER_STATUS = (
- (0, '入库申请'),
- (1, '入库中'),
- (2, '部分入库'),
- (3, '在库'),
- (4, '出库中'),
- (5, '部分出库'),
- (6, '已出库'),
- )
- bound_number = models.CharField(max_length=255, verbose_name="入库批次号",blank=False, null=False, unique=True)
- sourced_number = models.CharField(max_length=255, verbose_name="来源批次号",blank=True, null=True)
- bound_month = models.CharField(max_length=255, verbose_name="月份")
- bound_batch_order = models.IntegerField(default=0, verbose_name="批次顺序")
-
- warehouse_code = models.CharField(max_length=255, verbose_name="仓库编码")
- warehouse_name = models.CharField(max_length=255, verbose_name="仓库名称")
- goods_code = models.CharField(max_length=255, verbose_name="商品编码")
- goods_desc = models.CharField(max_length=255, verbose_name="商品描述")
- goods_std = models.CharField(default='待填写', max_length=255, verbose_name="商品标准",blank=True, null=True)
- goods_unit = models.CharField(default='待填写', max_length=255, verbose_name="商品单位")
- goods_qty = models.BigIntegerField(default=0, verbose_name="商品数量")
- goods_package = models.CharField(default='待填写', max_length=255, verbose_name="商品包装")
- goods_in_qty = models.BigIntegerField(default=0, verbose_name="组盘入库数量")
- goods_in_location_qty = models.BigIntegerField(default=0, verbose_name="库位入库数量")
- goods_out_qty = models.BigIntegerField(default=0, verbose_name="出库数量")
- goods_reserve_qty = models.BigIntegerField(default=0, verbose_name="预定出库数量")
- status = models.IntegerField(choices=CONTAINER_STATUS, default=0, verbose_name='批次状态')
- container_number = models.IntegerField( default=0, verbose_name="托盘数目")
- goods_weight = models.FloatField(default=0, verbose_name="商品单重")
- goods_total_weight = models.FloatField(default=0, verbose_name="商品总重")
- note = models.CharField(default='', max_length=255, verbose_name="备注")
- creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
- openid = models.CharField(max_length=255, verbose_name="Openid")
- is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
- create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
- update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
- relate_material = models.ForeignKey(MaterialDetail, on_delete=models.CASCADE, verbose_name="关联物料", related_name='bound_batch',null=True, blank=True)
-
- class Meta:
- db_table = 'boundbatch'
- verbose_name = 'Bound Batch'
- verbose_name_plural = "Bound Batch"
- ordering = ['-id']
- def __str__(self):
- return f"{self.bound_number} - {self.goods_code} - {self.goods_desc}"
-
-
- class OutBoundDemandModel(models.Model):
- OUT_TYPE = (
- (0, '发货出库'),
- (4, '其他出库'),
- )
- bound_list = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, verbose_name="Bound List", related_name='out_demand')
- goods_code = models.CharField(max_length=255, verbose_name="商品编码")
- goods_desc = models.CharField(max_length=255, verbose_name="商品描述")
- goods_std = models.CharField(default='待填写', max_length=255, verbose_name="商品标准",blank=True, null=True)
- goods_unit = models.CharField(default='待填写', max_length=255, verbose_name="商品单位")
- goods_qty = models.BigIntegerField(default=0, verbose_name="计划数量")
- working = models.BooleanField(default=False, verbose_name="是否在工作")
- creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
- create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
- update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
- is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
- out_type = models.IntegerField(choices=OUT_TYPE, default=4, verbose_name="出库类型")
- class Meta:
- db_table = 'outbounddemand'
- verbose_name = '出库需求'
- verbose_name_plural = "出库需求"
- ordering = ['-id']
- class MaterialStatistics(models.Model):
- goods_code = models.CharField(max_length=255, verbose_name="商品编码", unique=True)
- goods_desc = models.CharField(max_length=255, verbose_name="商品描述")
- goods_std = models.CharField(default='待填写', max_length=255, verbose_name="商品标准", blank=True, null=True)
- goods_unit = models.CharField(default='待填写', max_length=255, verbose_name="商品单位")
- total_quantity = models.BigIntegerField(default=0, verbose_name="计划数量")
- total_demanded_quantity = models.BigIntegerField(default=0, verbose_name="需求数量")
- def __str__(self):
- return f"{self.goods_code} - {self.goods_desc}"
- @property
- def bound_batches(self):
- return BoundBatchModel.objects.filter(goods_code=self.goods_code).exclude(goods_in_location_qty=0).order_by('bound_batch_order')
- class Meta:
- db_table = 'materialstatistics'
- verbose_name = '物料统计'
- verbose_name_plural = "物料统计"
- ordering = ['goods_code']
- @receiver([post_save, post_delete], sender=BoundBatchModel)
- def update_material_statistics(sender, instance, **kwargs):
- goods_code = instance.goods_code
- stats, created = MaterialStatistics.objects.get_or_create(
- goods_code=goods_code,
- defaults={
- 'goods_desc': instance.goods_desc,
- 'goods_std': instance.goods_std or '待填写',
- 'goods_unit': instance.goods_unit or '待填写',
- }
- )
-
- # 更新物料信息为最新批次的信息(可选)
- stats.goods_desc = instance.goods_desc
- if instance.goods_std and instance.goods_std != '待填写':
- stats.goods_std = instance.goods_std
- if instance.goods_unit and instance.goods_unit != '待填写':
- stats.goods_unit = instance.goods_unit
- stats.save()
- # 计算总数量
- total = BoundBatchModel.objects.filter(goods_code=goods_code).aggregate(
- total=Sum('goods_in_location_qty')
- )['total'] or 0
- stats.total_quantity = total
- stats.save()
- class OutBatchModel(models.Model):
- CONTAINER_STATUS = (
- (0, '申请'),
- (1, '在途'),
- (2, '已出库')
- )
- OUT_TYPE = (
- (0, '发货出库'),
- (4, '其他出库'),
- )
- bound_list = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, verbose_name="Bound List", related_name='out_batch_list',blank=True, null=True)
- out_number = models.CharField(max_length=255, verbose_name="出库批次号",blank=False, null=False)
- batch_number = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name="批次号", related_name='out_batch')
- out_date = models.DateTimeField(verbose_name="出库日期")
- out_type = models.IntegerField(choices=OUT_TYPE, default=4, verbose_name="出库类型")
- out_note = models.CharField(default='', max_length=255, verbose_name="出库备注")
- warehouse_code = models.CharField(max_length=255, verbose_name="仓库编码")
- warehouse_name = models.CharField(max_length=255, verbose_name="仓库名称")
- goods_code = models.CharField(max_length=255, verbose_name="商品编码")
- goods_desc = models.CharField(max_length=255, verbose_name="商品描述")
- goods_std = models.CharField(default='待填写', max_length=255, verbose_name="商品标准",blank=True, null=True)
- goods_unit = models.CharField(default='待填写', max_length=255, verbose_name="商品单位")
- goods_qty = models.BigIntegerField(default=0, verbose_name="商品数量")
- goods_out_qty = models.BigIntegerField(default=0, verbose_name="出库数量")
- status = models.IntegerField(choices=CONTAINER_STATUS, default=0, verbose_name='批次状态')
- container_number = models.IntegerField( default=0, verbose_name="托盘数目")
- goods_weight = models.FloatField(default=0, verbose_name="商品单重")
- goods_total_weight = models.FloatField(default=0, verbose_name="商品总重")
- creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
- openid = models.CharField(max_length=255, verbose_name="Openid")
- is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
- create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
- update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
- relate_material = models.ForeignKey(OutMaterialDetail, on_delete=models.CASCADE, verbose_name="关联物料", related_name='out_batch',null=True, blank=True)
- class Meta:
- db_table = 'outbatch'
- verbose_name = 'Out Batch'
- verbose_name_plural = "Out Batch"
- ordering = ['-id']
- @receiver([post_save, post_delete], sender=OutBatchModel)
- def update_material_demanded(sender, instance, **kwargs):
- goods_code = instance.goods_code
- stats, created = MaterialStatistics.objects.get_or_create(
- goods_code=goods_code,
- defaults={
- 'goods_desc': instance.goods_desc,
- 'goods_std': instance.goods_std or '待填写',
- 'goods_unit': instance.goods_unit or '待填写',
- }
- )
-
- # 更新物料信息为最新批次的信息(可选)
- stats.goods_desc = instance.goods_desc
- if instance.goods_std and instance.goods_std != '待填写':
- stats.goods_std = instance.goods_std
- if instance.goods_unit and instance.goods_unit != '待填写':
- stats.goods_unit = instance.goods_unit
- stats.save()
- # 计算总数量
- total = OutBatchModel.objects.filter(goods_code=goods_code,is_delete=False).aggregate(
- total=Sum('goods_out_qty')
- )['total'] or 0
- stats.total_demanded_quantity = total
- stats.save()
- batch_number = instance.batch_number
- batch_out_qty = OutBatchModel.objects.filter(batch_number=batch_number,goods_code=goods_code,is_delete=False).aggregate(
- total=Sum('goods_out_qty')
- )['total'] or 0
- batch_number.goods_reserve_qty = batch_out_qty
- batch_number.save()
- # 利用创建好的批次来与申请单相对应
- class OutBoundDetailModel(models.Model):
- CONTAINER_STATUS = (
- (0, '出库申请'),
- (1, '出库中'),
- (2, '已出库'),
- (3, '入库中'),
- (4, '已入库')
- )
- bound_list = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, verbose_name="Bound List", related_name='out_bound_detail')
- bound_batch = models.ForeignKey(OutBatchModel, on_delete=models.PROTECT, verbose_name="Bound Batch", related_name='out_bound_batch_detail')
- bound_batch_number = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name="Bound Batch Number", related_name='out_bound_batch_number_detail')
- status = models.IntegerField(choices=CONTAINER_STATUS, default=0, verbose_name='批次状态')
-
- detail_code = models.CharField(max_length=255, verbose_name="明细编号")
- creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
- openid = models.CharField(max_length=255, verbose_name="Openid")
- is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
- create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
- update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
- class Meta:
- db_table = 'Outbounddetail'
- verbose_name = 'OutBound Detail'
- verbose_name_plural = "OutBound Detail"
- ordering = ['-id']
- class BatchLogModel(models.Model):
- BATCH_LOG_TYPE = (
- (0, '入库'),
- (1, '出库'),
- (2, '移库'),
- (9, '其他'),
-
- )
- batch_id =models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name="批次ID", related_name='batch_log')
- log_type = models.IntegerField(choices=BATCH_LOG_TYPE, default=9, verbose_name="日志类型")
- log_date = models.DateTimeField(verbose_name="日志日期")
- goods_code = models.CharField(max_length=255, verbose_name="商品编码")
- goods_desc = models.CharField(max_length=255, verbose_name="商品描述")
- goods_qty = models.BigIntegerField(default=0, verbose_name="商品数量")
- log_content = models.CharField(max_length=255, verbose_name="日志内容")
- creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
- openid = models.CharField(max_length=255, verbose_name="Openid")
- is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
- create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
- update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
- class Meta:
- db_table = 'batchlog'
- verbose_name = 'Batch Log'
- verbose_name_plural = "Batch Log"
- # 利用创建好的批次来与申请单相对应
- class BoundDetailModel(models.Model):
- CONTAINER_STATUS = (
- (0, '入库申请'),
- (1, '入库中'),
- (2, '在库'),
- (3, '出库中'),
- (4, '已出库')
- )
- bound_list = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, verbose_name="Bound List", related_name='bound_detail')
- bound_batch = models.ForeignKey(BoundBatchModel, on_delete=models.PROTECT, verbose_name="Bound Batch", related_name='bound_batch_detail')
- status = models.IntegerField(choices=CONTAINER_STATUS, default=0, verbose_name='批次状态')
-
- detail_code = models.CharField(max_length=255, verbose_name="明细编号",unique=True)
- creater = models.CharField(default='uesr', max_length=255, verbose_name="Who Created")
- openid = models.CharField(max_length=255, verbose_name="Openid")
- is_delete = models.BooleanField(default=False, verbose_name='Delete Label')
- create_time = models.DateTimeField(auto_now_add=True, verbose_name="Create Time")
- update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="Update Time")
- class Meta:
- db_table = 'bounddetail'
- verbose_name = 'Bound Detail'
- verbose_name_plural = "Bound Detail"
- ordering = ['-id']
|