from django.db import models from apps.system.models import CommonAModel, Dictionary, CommonBModel, CommonADModel, File, BaseModel class Process(CommonBModel): """ 工序 belong_dept为所在车间 """ name = models.CharField('工序名称', max_length=100) cate = models.CharField('大类', max_length=10, default='') sort = models.PositiveSmallIntegerField('排序', default=1) instruction = models.ForeignKey( File, verbose_name='指导书', on_delete=models.SET_NULL, null=True, blank=True) instruction_content = models.TextField('指导书内容', null=True, blank=True) # Create your models here. class Material(CommonAModel): MA_TYPE_BASE = 0 MA_TYPE_GOOD = 10 MA_TYPE_HALFGOOD = 20 MA_TYPE_MAINSO = 30 MA_TYPE_HELPSO = 40 MA_TYPE_TOOL = 50 MA_TYPE_HELPTOOL = 60 MA_TYPE_OFFICE = 70 type_choices = ( (MA_TYPE_BASE, '电/水/气'), (MA_TYPE_GOOD, '成品'), (MA_TYPE_HALFGOOD, '半成品'), (MA_TYPE_MAINSO, '主要原料'), (MA_TYPE_HELPSO, '辅助材料'), (MA_TYPE_TOOL, '加工工具'), (MA_TYPE_HELPTOOL, '辅助工装'), (MA_TYPE_OFFICE, '办公用品') ) name = models.CharField('名称', max_length=50) number = models.CharField('编号', max_length=100, null=True, blank=True) specification = models.CharField( '型号', max_length=100, null=True, blank=True) code = models.CharField('标识', max_length=50, null=True, blank=True) type = models.PositiveSmallIntegerField( '物料类型', choices=type_choices, default=1, help_text=str(type_choices)) testitems = models.JSONField('检测项目', default=list, blank=True) sort = models.PositiveSmallIntegerField('排序', default=1) unit = models.CharField('基准计量单位', default='个', max_length=10) count = models.PositiveIntegerField('物料库存总数', default=0) count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True) process = models.ForeignKey( Process, verbose_name='所在工序', on_delete=models.CASCADE, null=True, blank=True) parent = models.ForeignKey( 'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父物料') is_hidden = models.BooleanField('是否隐藏', default=False) class Meta: verbose_name = '物料表' ordering = ['sort', '-create_time'] def __str__(self): return self.name class Shift(CommonAModel): """班次 """ name = models.CharField('名称', max_length=50) start_time_o = models.TimeField('开始时间') end_time_o = models.TimeField('结束时间') class Meta: verbose_name = '班次' class Team(CommonBModel): """班组 """ name = models.CharField('名称', max_length=50) leader = models.ForeignKey( 'system.user', verbose_name='班长', on_delete=models.CASCADE) class Mgroup(CommonBModel): """测点集 """ name = models.CharField('名称', max_length=50) cate = models.CharField( '分类', max_length=50, default='section', help_text='section/other') # section是工段 process = models.ForeignKey( Process, verbose_name='工序', on_delete=models.SET_NULL, null=True, blank=True) product = models.ForeignKey( Material, verbose_name='主要产品', on_delete=models.SET_NULL, null=True, blank=True) input_materials = models.JSONField( '直接材料', default=list, blank=True, help_text='material的ID列表') test_materials = models.JSONField( '检测材料', default=list, blank=True, help_text='material的ID列表') sort = models.PositiveSmallIntegerField('排序', default=1) is_runing = models.BooleanField('是否正常运行', default=True) class Meta: verbose_name = '测点集' ordering = ['sort', '-create_time'] class Goal(CommonADModel): """目标 """ mgroup = models.ForeignKey( Mgroup, verbose_name='关联工段', on_delete=models.CASCADE, null=True, blank=True) year = models.PositiveSmallIntegerField('年') goal_cate = models.ForeignKey( Dictionary, verbose_name='目标种类', on_delete=models.CASCADE) goal_val = models.FloatField('全年目标值') goal_val_1 = models.FloatField('1月份目标值') goal_val_2 = models.FloatField('2月份目标值') goal_val_3 = models.FloatField('3月份目标值') goal_val_4 = models.FloatField('4月份目标值') goal_val_5 = models.FloatField('5月份目标值') goal_val_6 = models.FloatField('6月份目标值') goal_val_7 = models.FloatField('7月份目标值') goal_val_8 = models.FloatField('8月份目标值') goal_val_9 = models.FloatField('9月份目标值') goal_val_10 = models.FloatField('10月份目标值') goal_val_11 = models.FloatField('11月份目标值') goal_val_12 = models.FloatField('12月份目标值') class Meta: unique_together = ("mgroup", "year", "goal_cate") class Route(CommonAModel): """ 工艺路线 """ material = models.ForeignKey( Material, verbose_name='关联产品', on_delete=models.CASCADE, null=True, blank=True) process = models.ForeignKey( Process, verbose_name='工序', on_delete=models.CASCADE, null=True, blank=True) sort = models.PositiveSmallIntegerField('顺序', default=1) is_autotask = models.BooleanField('是否自动排产', default=False) out_rate = models.FloatField('出材率', default=100, null=True, blank=True) @staticmethod def get_routes(material: Material, autotask: bool = False): kwargs = {'material': material} if autotask: kwargs['is_autotask'] = True return Route.objects.filter(**kwargs).order_by('sort', 'process_sort' 'create_time')