models.py 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. from django.db import models
  2. from bound.models import BoundBatchModel,BoundDetailModel,OutBatchModel,BoundListModel,BoundListModel
  3. # Create your models here.
  4. # 主表:托盘数据
  5. class ContainerListModel(models.Model):
  6. CONTAINER_STATUS = (
  7. (0, '空置'),
  8. (1, '入库中'),
  9. (2, '在库'),
  10. (3, '出库中'),
  11. (4, '已出库'),
  12. (5, '空托盘组')
  13. )
  14. container_code = models.IntegerField( verbose_name='托盘编号',unique=True)
  15. current_location = models.CharField(max_length=50, verbose_name='当前库位', default='N/A')
  16. target_location = models.CharField(max_length=50, verbose_name='目标库位', default='N/A')
  17. available= models.BooleanField(default=True, verbose_name='可用')
  18. status = models.IntegerField(choices=CONTAINER_STATUS, default=0, verbose_name='托盘状态')
  19. last_operation = models.DateTimeField(auto_now=True, verbose_name='最后操作时间')
  20. class Meta:
  21. db_table = 'container_list'
  22. verbose_name = 'ContainerList'
  23. verbose_name_plural = "ContainerList"
  24. ordering = ['-container_code']
  25. # 明细表:托盘详细数据记录当前组盘的 批次 数量 使用托盘码和状态来获取、托盘上的物料信息,
  26. class ContainerDetailModel(models.Model):
  27. BATCH_STATUS=(
  28. (0, '空盘'),
  29. (1, '组盘'),
  30. (2, '在库'),
  31. (3, '已出库')
  32. )
  33. BATCH_CLASS = (
  34. (1, '成品'),
  35. (2, '空盘'),
  36. (3, '散盘'),
  37. )
  38. month = models.IntegerField(verbose_name='月份')
  39. container = models.ForeignKey(ContainerListModel, on_delete=models.CASCADE, related_name='details')
  40. batch = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name='批次',blank=True, null=True)
  41. goods_class = models.IntegerField(verbose_name='货品类别',choices=BATCH_CLASS, default=1)
  42. goods_code = models.CharField(max_length=50, verbose_name='货品编码')
  43. goods_desc = models.CharField(max_length=100, verbose_name='货品描述')
  44. goods_qty = models.IntegerField(verbose_name='数量')
  45. goods_out_qty = models.IntegerField(verbose_name='出库数量', default=0)
  46. goods_weight = models.DecimalField(max_digits=10, decimal_places=3, verbose_name='重量')
  47. status = models.IntegerField(choices=BATCH_STATUS,default=0, verbose_name='状态')
  48. creater = models.CharField(max_length=50, verbose_name='创建人')
  49. create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
  50. update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
  51. is_delete = models.BooleanField(default=False, verbose_name='是否删除')
  52. class Meta:
  53. db_table = 'container_detail'
  54. verbose_name = 'ContainerDetail'
  55. verbose_name_plural = "ContainerDetail"
  56. ordering = ['-id']
  57. def __str__(self):
  58. return f"{self.container_code} - {self.batch.bound_number} - {self.goods_code} - {self.goods_desc} - {self.goods_qty}"
  59. def save(self, *args, **kwargs):
  60. """
  61. 更新托盘上的物料数量,更新批次上的
  62. goods_in_qty(组盘数目)
  63. ,goods_in_location_qty(在库数目)
  64. ,goods_out_qty(出库数目)
  65. """
  66. if self.batch:
  67. super().save(*args, **kwargs)
  68. if self.goods_qty - self.goods_out_qty <= 0:
  69. self.status = 3
  70. super().save(*args, **kwargs)
  71. elif self.goods_qty - self.goods_out_qty > 0 and self.goods_out_qty > 0:
  72. self.status = 2
  73. super().save(*args, **kwargs)
  74. if self.status == 3 and self.goods_qty - self.goods_out_qty > 0 :
  75. self.status = 2
  76. super().save(*args, **kwargs)
  77. container_all_qty = ContainerDetailModel.objects.filter(batch=self.batch,is_delete=False).aggregate(total_qty=models.Sum('goods_qty'))['total_qty']
  78. container_all_out_qty = ContainerDetailModel.objects.filter(batch=self.batch,is_delete=False).aggregate(total_out_qty=models.Sum('goods_out_qty'))['total_out_qty']
  79. self.batch.goods_in_qty = container_all_qty
  80. self.batch.goods_in_location_qty = container_all_qty - container_all_out_qty
  81. self.batch.goods_out_qty = container_all_out_qty
  82. self.batch.save()
  83. # 明细表:操作记录 记录每次出入库的记录,使用goods来进行盘点,使用托盘码来进行托盘的操作记录
  84. class ContainerOperationModel(models.Model):
  85. OPERATION_TYPES = (
  86. ('container','组盘'),
  87. ('inbound', '入库'),
  88. ('outbound', '出库'),
  89. ('adjust', '调整'),
  90. )
  91. month = models.IntegerField(verbose_name='月份')
  92. container = models.ForeignKey(ContainerListModel, on_delete=models.CASCADE, related_name='operations')
  93. operation_type = models.CharField(max_length=20, choices=OPERATION_TYPES, verbose_name='操作类型')
  94. bound_id = models.IntegerField(verbose_name='出库申请', null=True, blank=True)
  95. batch = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name='批次',null=True, blank=True)
  96. goods_code = models.CharField(max_length=50, verbose_name='货品编码')
  97. goods_desc = models.CharField(max_length=100, verbose_name='货品描述')
  98. goods_qty = models.IntegerField(verbose_name='数量')
  99. goods_weight = models.DecimalField(max_digits=10, decimal_places=3, verbose_name='重量')
  100. operator = models.CharField(max_length=50, verbose_name='操作人')
  101. timestamp = models.DateTimeField(auto_now_add=True, verbose_name='操作时间')
  102. from_location = models.CharField(max_length=50, null=True, verbose_name='原库位')
  103. to_location = models.CharField(max_length=50, null=True, verbose_name='目标库位')
  104. memo = models.TextField(null=True, verbose_name='备注')
  105. is_delete = models.BooleanField(default=False, verbose_name='是否删除')
  106. class Meta:
  107. db_table = 'container_operation'
  108. verbose_name = 'ContainerOperation'
  109. verbose_name_plural = "ContainerOperation"
  110. ordering = ['-timestamp']
  111. class ContainerWCSModel(models.Model):
  112. TASK_STATUS = (
  113. (100, '等待中'),
  114. (101, '处理中'),
  115. (102, '已暂停'),
  116. (103, '入库中'),
  117. (200, '已发送'),
  118. (300, '已完成'),
  119. (400, '失败'),
  120. )
  121. taskid = models.CharField(max_length=50, verbose_name='任务ID')
  122. batch = models.ForeignKey(BoundBatchModel, on_delete=models.CASCADE, verbose_name='关联批次',null=True, blank=True )
  123. batch_out = models.ForeignKey(OutBatchModel, on_delete=models.CASCADE, verbose_name='出库批次' , null=True, blank=True )
  124. bound_list = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, verbose_name='关联出库单',null=True, blank=True )
  125. batch_number = models.CharField(max_length=50, verbose_name='批次号',null=True, blank=True )
  126. sequence = models.BigIntegerField(verbose_name='任务顺序')
  127. priority = models.IntegerField(default=100, verbose_name='优先级')
  128. month = models.IntegerField(verbose_name='月份')
  129. tasktype = models.CharField(max_length=50, verbose_name='任务类型')
  130. tasknumber = models.IntegerField(verbose_name='任务号',unique=True)
  131. order_number = models.IntegerField(verbose_name='c_number')
  132. container = models.CharField(max_length=50, verbose_name='托盘号')
  133. current_location = models.CharField(max_length=50, verbose_name='当前库位')
  134. target_location = models.CharField(max_length=50, verbose_name='目标库位')
  135. message = models.TextField(verbose_name='消息')
  136. working = models.IntegerField(default = 1,verbose_name='工作状态')
  137. status = models.IntegerField(choices=TASK_STATUS, default=100, verbose_name='状态')
  138. create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
  139. is_delete = models.BooleanField(default=False, verbose_name='是否删除')
  140. class Meta:
  141. db_table = 'container_wcs'
  142. verbose_name = 'ContainerWCS'
  143. verbose_name_plural = "ContainerWCS"
  144. ordering = ['-create_time']
  145. def to_dict(self):
  146. return {
  147. 'container': self.container,
  148. 'current_location': self.current_location,
  149. 'month' : self.month,
  150. 'target_location': self.target_location,
  151. 'tasktype': self.tasktype,
  152. 'taskid': self.taskid,
  153. 'taskNumber': self.tasknumber-20000000000,
  154. 'message': self.message,
  155. 'container': self.container,
  156. 'status': self.status
  157. }
  158. def __str__(self):
  159. return f"{self.taskid} - {self.get_status_display()}"
  160. # 这里的批次详情是主入库申请单下的子批次
  161. class TaskModel(models.Model):
  162. task_wcs = models.ForeignKey(ContainerWCSModel, on_delete=models.CASCADE, related_name='tasks')
  163. batch_detail = models.ForeignKey(BoundDetailModel, on_delete=models.CASCADE, verbose_name='批次详情')
  164. container_detail = models.ForeignKey(ContainerDetailModel, on_delete=models.CASCADE, verbose_name='托盘明细')
  165. class Meta:
  166. db_table = 'task'
  167. verbose_name = 'Task'
  168. verbose_name_plural = "Task"
  169. ordering = ['-id']
  170. class out_batch_detail(models.Model):
  171. out_bound = models.ForeignKey(BoundListModel, on_delete=models.CASCADE, related_name='out_batch_details')
  172. container = models.ForeignKey(ContainerListModel, on_delete=models.CASCADE, related_name='out_batch_details')
  173. container_detail = models.ForeignKey(ContainerDetailModel, on_delete=models.CASCADE, verbose_name='托盘明细')
  174. out_goods_qty = models.IntegerField(verbose_name='数量')
  175. last_out_goods_qty = models.IntegerField(verbose_name='上次出库数量', default=0)
  176. working = models.IntegerField(default = 1,verbose_name='工作状态')
  177. is_delete = models.BooleanField(default=False, verbose_name='是否删除')
  178. class Meta:
  179. db_table = 'out_batch_detail'
  180. verbose_name = 'OutBatchDetail'
  181. verbose_name_plural = "OutBatchDetail"
  182. ordering = ['container']