models.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. # coding=utf-8
  2. from django.db.models import Sum, F
  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 ProductionDemand(models.Model):
  96. no = models.CharField(max_length=20, verbose_name=u"单号", editable=False)
  97. customer = models.ForeignKey(Customer, verbose_name=u"客户", on_delete=models.PROTECT)
  98. demand_date = models.DateField(verbose_name=u"需求日期")
  99. notes = models.TextField(verbose_name=u"备注", blank=True, null=True)
  100. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, default=settings.DEFAULT, verbose_name=u"状态")
  101. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, blank=True)
  102. create_user = models.ForeignKey(User, related_name='production_demand_ref_create_user', verbose_name=u"创建人", on_delete=models.PROTECT, editable=False)
  103. department = models.ForeignKey(Department, verbose_name=u"创建部门", editable=False, on_delete=models.PROTECT)
  104. check_time = models.DateTimeField(verbose_name=u"审核时间", null=True)
  105. check_user = models.ForeignKey(User, related_name='production_demand_ref_check_user', verbose_name=u"审核人", on_delete=models.PROTECT, null=True)
  106. count = models.BigIntegerField(u'数量', default=0)
  107. amount = models.BigIntegerField(u'金额', default=0)
  108. receive_count = models.BigIntegerField(u'收货数量', default=0)
  109. receive_amount = models.BigIntegerField(u'收货金额', default=0)
  110. receive_notes = models.CharField(max_length=200, verbose_name=u"收货备注", blank=True, null=True)
  111. class Meta:
  112. db_table = "production_demand"
  113. verbose_name = u"需求管理"
  114. ordering = ('-id',)
  115. index_together = (
  116. 'create_time', 'status', 'demand_date'
  117. )
  118. unique_together = (
  119. 'no',
  120. )
  121. default_permissions = ()
  122. permissions = ( # 生产需求管理管理
  123. ("view_production_demand", u"浏览"),
  124. ("add_production_demand", u"添加"),
  125. ("check_production_demand", u"审核"),
  126. ("delete_production_demand", u"删除"),
  127. ("export_production_demand", u"导出"),
  128. ("print_production_demand", u"打印"),
  129. ("loss_production_demand", u"扣减"),
  130. )
  131. def save(self, *args, **kwargs):
  132. if self.no == None or self.no == '':
  133. now = timezone.now()
  134. rows = ProductionDemand.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  135. count = rows.count()
  136. if count == 0:
  137. self.no = 'XQ%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  138. else:
  139. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  140. super(ProductionDemand, self).save(*args, **kwargs)
  141. @staticmethod
  142. def getById(id):
  143. instance = ProductionDemand.objects.filter(pk=id).first()
  144. if not instance:
  145. raise CustomError(u'未找到相应的生产需求')
  146. return instance
  147. def updateAmount(self):
  148. sum_count = 0
  149. sum_amount = 0
  150. sum_row = ProductionDemandDetail.objects.filter(main=self).aggregate(sum_count=Sum('count'), sum_amount=Sum('amount'))
  151. if sum_row:
  152. sum_count = sum_row['sum_count'] or 0
  153. sum_amount = sum_row['sum_amount'] or 0
  154. self.count = sum_count
  155. self.amount = sum_amount
  156. self.save()
  157. def updateReceiveAmount(self):
  158. sum_receive_count = 0
  159. sum_receive_amount = 0
  160. sum_row = ProductionDemandDetail.objects.filter(main=self).aggregate(
  161. sum_receive_count=Sum('receive_count'), sum_receive_amount=Sum(F('receive_count')*F('price'))
  162. )
  163. if sum_row:
  164. sum_receive_count = sum_row['sum_receive_count'] or 0
  165. sum_receive_amount = sum_row['sum_receive_amount'] or 0
  166. self.receive_count = sum_receive_count
  167. self.receive_amount = sum_receive_amount
  168. self.save()
  169. class ProductionDemandDetail(models.Model):
  170. main = models.ForeignKey(ProductionDemand, verbose_name=u'生产需求', on_delete=models.PROTECT)
  171. goods = models.ForeignKey(Goods, verbose_name=u'产品', on_delete=models.PROTECT)
  172. quality_request = models.ForeignKey(Option, verbose_name=u"质量标准", null=True, blank=True, on_delete=models.PROTECT)
  173. count = models.BigIntegerField(u'数量')
  174. receive_count = models.BigIntegerField(u'收货数量', default=0, editable=False)
  175. price = models.BigIntegerField(u'单价')
  176. amount = models.BigIntegerField(u'金额', editable=False)
  177. class Meta:
  178. db_table = "production_demand_detail"
  179. verbose_name = u"生产需求明细"
  180. ordering = ('-id',)
  181. default_permissions = ()
  182. class ProductionPlan(models.Model):
  183. no = models.CharField(max_length=20, verbose_name=u"单号", editable=False)
  184. name = models.CharField(max_length=100, verbose_name=u"名称", blank=True)
  185. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, verbose_name=u"审核状态", default=settings.DEFAULT)
  186. create_user = models.ForeignKey(User, verbose_name=u"创建人", related_name='production_plan_ref_create_user', on_delete=models.PROTECT, blank=True, editable=False)
  187. department = models.ForeignKey(Department, verbose_name=u"所属部门", blank=True, editable=False, on_delete=models.PROTECT)
  188. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  189. check_user = models.ForeignKey(User, verbose_name=u"审核人",related_name='production_plan_ref_check_user', on_delete=models.PROTECT, null=True, blank=True)
  190. check_time = models.DateTimeField(verbose_name=u"审核时间", null=True)
  191. total_count = models.BigIntegerField(u"合计数量", default=0)
  192. notes = models.CharField(max_length=100, verbose_name=u"备注", null=True, blank=True)
  193. check_user2 = models.ForeignKey(User, verbose_name=u"复核人",related_name='production_plan_ref_check_user2', on_delete=models.PROTECT, null=True, blank=True)
  194. check_time2 = models.DateTimeField(verbose_name=u"复核时间", null=True)
  195. check_user3 = models.ForeignKey(User, verbose_name=u"批准人",related_name='production_plan_ref_check_user3', on_delete=models.PROTECT, null=True, blank=True)
  196. check_time3 = models.DateTimeField(verbose_name=u"批准时间", null=True)
  197. class Meta:
  198. db_table = "production_plan"
  199. verbose_name = u"生产计划管理"
  200. ordering = ('-id',)
  201. index_together = (
  202. 'name',
  203. 'create_time','status','check_time'
  204. )
  205. unique_together = (
  206. 'no',
  207. )
  208. default_permissions = ()
  209. permissions = (
  210. ("view_production_plan", u"浏览"),
  211. ("add_production_plan", u"添加"),
  212. ("check_production_plan", u"审核"),
  213. ("delete_production_plan", u"删除"),
  214. ("export_production_plan", u"导出"),
  215. ("print_production_plan", u"打印"),
  216. ("check2_production_plan", u"复核"),
  217. ("check3_production_plan", u"批准"),
  218. )
  219. def updateTotalCount(self):
  220. sum_count = 0
  221. sum_rows = ProductionPlanDetail.objects.filter(production=self).aggregate(sum_count=Sum('count'))
  222. if sum_rows:
  223. sum_count = sum_rows['sum_count'] or 0
  224. self.total_count = sum_count
  225. self.save()
  226. @staticmethod
  227. def getById(id):
  228. instance = ProductionPlan.objects.filter(pk=id).first()
  229. if not instance:
  230. raise CustomError(u'未找到相应的生产计划')
  231. return instance
  232. def save(self, *args, **kwargs):
  233. if self.no == None or self.no == '':
  234. now = timezone.now()
  235. rows = ProductionPlan.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  236. count = rows.count()
  237. if count == 0:
  238. self.no = 'SC%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  239. else:
  240. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  241. super(ProductionPlan, self).save(*args, **kwargs)
  242. class ProductionPlanDetail(models.Model):
  243. production = models.ForeignKey(ProductionPlan, verbose_name=u"生产计划", on_delete=models.PROTECT)
  244. product = models.ForeignKey(Goods, verbose_name=u"产品", on_delete=models.PROTECT)
  245. quality_request = models.ForeignKey(Option, verbose_name=u"质量要求", on_delete=models.PROTECT, null=True)
  246. count = models.BigIntegerField(u"数量", default=0)
  247. product_user = models.ForeignKey(User, verbose_name=u"负责人", on_delete=models.PROTECT, null=True)
  248. p_department = models.ForeignKey(Department, verbose_name=u"生产车间", related_name='production_detail_ref_p_department', on_delete=models.PROTECT, blank=True, null=True)
  249. department = models.ForeignKey(Department, verbose_name=u"负责人部门", related_name='production_detail_ref_department', on_delete=models.PROTECT, null=True, blank=True)
  250. product_time = models.DateTimeField(verbose_name=u"生产时间", null=True)
  251. notes = models.CharField(max_length=100, verbose_name=u"备注", null=True, blank=True)
  252. class Meta:
  253. db_table = "production_plan_detail"
  254. verbose_name = u"出库查询"
  255. default_permissions = ()
  256. permissions = (# 生产计划明细
  257. ("view_consumable_deliver_query", u"浏览"),
  258. ("export_consumable_deliver_query", u"导出"),
  259. ("print_consumable_deliver_query", u"打印"),
  260. )
  261. @staticmethod
  262. def getById(id):
  263. instance = ProductionPlanDetail.objects.filter(pk=id)
  264. if not instance:
  265. raise CustomError(u'未找到相应的生产计划明细')
  266. return instance