150 lines
5.7 KiB
Python
150 lines
5.7 KiB
Python
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')
|