models.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. # coding=utf-8
  2. from django.db.models import Sum
  3. from django.utils import timezone
  4. from apps.foundation.models import Option
  5. from apps.customer.models import Customer
  6. from apps.exceptions import CustomError
  7. from django.db import models
  8. from django.conf import settings
  9. from apps.account.models import User, Department
  10. from apps.goods.models import Goods
  11. class SalePlan(models.Model):
  12. no = models.CharField(max_length=20, verbose_name=u"单号", editable=False)
  13. customer = models.ForeignKey(Customer, verbose_name=u"客户", on_delete=models.PROTECT)
  14. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, verbose_name=u"状态", default=settings.DEFAULT)
  15. notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
  16. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  17. create_user = models.ForeignKey(User, verbose_name=u"创建人", related_name='sale_plan_ref_create_user', on_delete=models.PROTECT, blank=True, editable=False)
  18. department = models.ForeignKey(Department, verbose_name=u"创建部门", editable=False, on_delete=models.PROTECT)
  19. check_time = models.DateTimeField(verbose_name=u"审核时间", blank=True, null=True)
  20. check_user = models.ForeignKey(User, verbose_name=u"审核人", related_name='sale_plan_ref_check_user', on_delete=models.PROTECT, blank=True, null=True)
  21. total_count = models.BigIntegerField(verbose_name=u'合计数量', default=0)
  22. total_amount = models.BigIntegerField(verbose_name=u'合计金额', null=True, blank=True)
  23. class Meta:
  24. db_table = "sale_plan"
  25. verbose_name = u"销售计划管理"
  26. ordering = ('-id',)
  27. index_together = (
  28. 'create_time', 'check_time', 'status'
  29. )
  30. unique_together = (
  31. 'no',
  32. )
  33. default_permissions = ()
  34. permissions = (
  35. ("view_sale_plan", u"浏览"),
  36. ("add_sale_plan", u"添加"),
  37. ("check_sale_plan", u"审核"),
  38. ("delete_sale_plan", u"删除"),
  39. ("export_sale_plan", u"导出"),
  40. ("print_sale_plan", u"打印"),
  41. )
  42. @staticmethod
  43. def getById(id):
  44. instance = SalePlan.objects.filter(pk=id).first()
  45. if not instance:
  46. raise CustomError(u'未找到相应的销售计划')
  47. return instance
  48. def save(self, *args, **kwargs):
  49. if self.no == None or self.no == '':
  50. now = timezone.now()
  51. rows = SalePlan.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  52. count = rows.count()
  53. if count == 0:
  54. self.no = 'XS%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  55. else:
  56. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  57. super(SalePlan, self).save(*args, **kwargs)
  58. def update_total(self):
  59. total_count = 0
  60. total_amount = None
  61. sum_row = SalePlanDetail.objects.filter(main=self).aggregate(total_count=Sum('require_count'), total_amount=Sum('amount'))
  62. if sum_row:
  63. total_count = sum_row['total_count'] or 0
  64. total_amount = sum_row['total_amount']
  65. self.total_count = total_count
  66. self.total_amount = total_amount
  67. self.save()
  68. class SalePlanDetail(models.Model):
  69. main = models.ForeignKey(SalePlan, verbose_name=u'销售计划', on_delete=models.PROTECT)
  70. goods = models.ForeignKey(Goods, verbose_name=u'成品', on_delete=models.PROTECT)
  71. quality_request = models.ForeignKey(Option, verbose_name=u"质量要求", blank=True, null=True, on_delete=models.PROTECT)
  72. require_time = models.DateTimeField(verbose_name=u"需求时间", blank=True, null=True)
  73. require_count = models.BigIntegerField(verbose_name=u'需求数量', default=0)
  74. price = models.BigIntegerField(verbose_name=u'单价', null=True, blank=True)
  75. amount = models.BigIntegerField(verbose_name=u'金额', null=True, blank=True)
  76. class Meta:
  77. db_table = "sale_plan_detail"
  78. verbose_name = u"出库查询"
  79. ordering = ('-id',)
  80. index_together = (
  81. 'require_time',
  82. )
  83. default_permissions = ()
  84. permissions = (# 销售计划明细
  85. ("view_material_deliver_query", u"浏览"),
  86. ("export_material_deliver_query", u"导出"),
  87. ("print_material_deliver_query", u"打印"),
  88. )
  89. @staticmethod
  90. def getById(id):
  91. instance = SalePlanDetail.objects.filter(pk=id).first()
  92. if not instance:
  93. raise CustomError(u'未找到相应的销售计划明细')
  94. return instance
  95. class ProductionPlan(models.Model):
  96. no = models.CharField(max_length=20, verbose_name=u"单号", editable=False)
  97. name = models.CharField(max_length=100, verbose_name=u"名称", blank=True)
  98. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, verbose_name=u"审核状态", default=settings.DEFAULT)
  99. create_user = models.ForeignKey(User, verbose_name=u"创建人", related_name='production_plan_ref_create_user', on_delete=models.PROTECT, blank=True, editable=False)
  100. department = models.ForeignKey(Department, verbose_name=u"所属部门", blank=True, editable=False, on_delete=models.PROTECT)
  101. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  102. check_user = models.ForeignKey(User, verbose_name=u"审核人",related_name='production_plan_ref_check_user', on_delete=models.PROTECT, null=True, blank=True)
  103. check_time = models.DateTimeField(verbose_name=u"审核时间", null=True)
  104. total_count = models.BigIntegerField(u"合计数量", default=0)
  105. notes = models.CharField(max_length=100, verbose_name=u"备注", null=True, blank=True)
  106. check_user2 = models.ForeignKey(User, verbose_name=u"复核人",related_name='production_plan_ref_check_user2', on_delete=models.PROTECT, null=True, blank=True)
  107. check_time2 = models.DateTimeField(verbose_name=u"复核时间", null=True)
  108. check_user3 = models.ForeignKey(User, verbose_name=u"批准人",related_name='production_plan_ref_check_user3', on_delete=models.PROTECT, null=True, blank=True)
  109. check_time3 = models.DateTimeField(verbose_name=u"批准时间", null=True)
  110. class Meta:
  111. db_table = "production_plan"
  112. verbose_name = u"生产计划管理"
  113. ordering = ('-id',)
  114. index_together = (
  115. 'name',
  116. 'create_time','status','check_time'
  117. )
  118. unique_together = (
  119. 'no',
  120. )
  121. default_permissions = ()
  122. permissions = (
  123. ("view_production_plan", u"浏览"),
  124. ("add_production_plan", u"添加"),
  125. ("check_production_plan", u"审核"),
  126. ("delete_production_plan", u"删除"),
  127. ("export_production_plan", u"导出"),
  128. ("print_production_plan", u"打印"),
  129. ("check2_production_plan", u"复核"),
  130. ("check3_production_plan", u"批准"),
  131. )
  132. def updateTotalCount(self):
  133. sum_count = 0
  134. sum_rows = ProductionPlanDetail.objects.filter(production=self).aggregate(sum_count=Sum('count'))
  135. if sum_rows:
  136. sum_count = sum_rows['sum_count'] or 0
  137. self.total_count = sum_count
  138. self.save()
  139. @staticmethod
  140. def getById(id):
  141. instance = ProductionPlan.objects.filter(pk=id).first()
  142. if not instance:
  143. raise CustomError(u'未找到相应的生产计划')
  144. return instance
  145. def save(self, *args, **kwargs):
  146. if self.no == None or self.no == '':
  147. now = timezone.now()
  148. rows = ProductionPlan.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  149. count = rows.count()
  150. if count == 0:
  151. self.no = 'SC%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  152. else:
  153. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  154. super(ProductionPlan, self).save(*args, **kwargs)
  155. class ProductionPlanDetail(models.Model):
  156. production = models.ForeignKey(ProductionPlan, verbose_name=u"生产计划", on_delete=models.PROTECT)
  157. product = models.ForeignKey(Goods, verbose_name=u"产品", on_delete=models.PROTECT)
  158. quality_request = models.ForeignKey(Option, verbose_name=u"质量要求", on_delete=models.PROTECT, null=True)
  159. count = models.BigIntegerField(u"数量", default=0)
  160. product_user = models.ForeignKey(User, verbose_name=u"负责人", on_delete=models.PROTECT, null=True)
  161. p_department = models.ForeignKey(Department, verbose_name=u"生产车间", related_name='production_detail_ref_p_department', on_delete=models.PROTECT, blank=True, null=True)
  162. department = models.ForeignKey(Department, verbose_name=u"负责人部门", related_name='production_detail_ref_department', on_delete=models.PROTECT, null=True, blank=True)
  163. product_time = models.DateTimeField(verbose_name=u"生产时间", null=True)
  164. notes = models.CharField(max_length=100, verbose_name=u"备注", null=True, blank=True)
  165. class Meta:
  166. db_table = "production_plan_detail"
  167. verbose_name = u"出库查询"
  168. default_permissions = ()
  169. permissions = (# 生产计划明细
  170. ("view_consumable_deliver_query", u"浏览"),
  171. ("export_consumable_deliver_query", u"导出"),
  172. ("print_consumable_deliver_query", u"打印"),
  173. )
  174. @staticmethod
  175. def getById(id):
  176. instance = ProductionPlanDetail.objects.filter(pk=id)
  177. if not instance:
  178. raise CustomError(u'未找到相应的生产计划明细')
  179. return instance