136 lines
6.8 KiB
Python
136 lines
6.8 KiB
Python
|
|
from apps.system.models import CommonAModel, Organization, User
|
|
from django.db import models
|
|
from django.contrib.auth.models import AbstractUser
|
|
from django.db.models.base import Model
|
|
import django.utils.timezone as timezone
|
|
from django.db.models.query import QuerySet
|
|
|
|
from utils.model import SoftModel, BaseModel
|
|
from apps.mtm.models import Material, Process, RecordForm, RecordFormField, SubProduction, SubprodctionMaterial
|
|
from apps.sam.models import Order
|
|
|
|
class ProductionPlan(CommonAModel):
|
|
"""
|
|
生产计划
|
|
"""
|
|
PLAN_STATE_PLANING = 10
|
|
PLAN_STATE_ASSGINED = 20
|
|
PLAN_STATE_ACCEPTED = 30
|
|
PLAN_STATE_WORKING = 40
|
|
PLAN_STATE_DONE = 50
|
|
PLAN_MTEST_DONE = 60
|
|
PLAN_STATE_PAUSE = 70
|
|
PLAN_STATE_STOP = 80
|
|
state_choices=(
|
|
(PLAN_STATE_PLANING, '制定中'),
|
|
(PLAN_STATE_ASSGINED, '已下达'),
|
|
(PLAN_STATE_ACCEPTED, '已接收'),
|
|
(PLAN_STATE_WORKING, '生产中'),
|
|
(PLAN_STATE_DONE, '生产完成'),
|
|
(PLAN_MTEST_DONE, '军检完成'),
|
|
(PLAN_STATE_PAUSE, '暂停'),
|
|
(PLAN_STATE_STOP, '终止')
|
|
)
|
|
number = models.CharField('编号', max_length=50, unique=True)
|
|
order = models.ForeignKey(Order, verbose_name='关联订单', null=True, blank=True, on_delete=models.SET_NULL, related_name='plan_order')
|
|
state = models.PositiveIntegerField('状态', choices=state_choices, default=PLAN_STATE_PLANING)
|
|
product = models.ForeignKey(Material, verbose_name='生产产品', on_delete=models.CASCADE)
|
|
count = models.PositiveIntegerField('生产数量', default=1)
|
|
count_real = models.PositiveIntegerField('实际产出数', default=0)
|
|
count_ok = models.PositiveIntegerField('合格数', default=0)
|
|
count_notok = models.PositiveIntegerField('不合格数量', default=0)
|
|
count_mtestok = models.PositiveIntegerField('军检合格数量', default=0)
|
|
start_date = models.DateField('计划开工日期')
|
|
end_date = models.DateField('计划完工日期')
|
|
process_json = models.JSONField('按工序的统计数', default=dict, null=True, blank=True)
|
|
is_planed = models.BooleanField('是否已排产', default=False)
|
|
old_state = models.PositiveIntegerField('原状态', choices=state_choices, null=True, blank=True)
|
|
class Meta:
|
|
verbose_name = '生产计划'
|
|
verbose_name_plural = verbose_name
|
|
|
|
def __str__(self):
|
|
return self.number
|
|
|
|
class SubProductionPlan(CommonAModel):
|
|
"""
|
|
子生产计划
|
|
"""
|
|
SUBPLAN_STATE_PLANING = 10
|
|
SUBPLAN_STATE_ASSGINED = 20
|
|
SUBPLAN_STATE_ACCEPTED = 30
|
|
SUBPLAN_STATE_WORKING = 40
|
|
SUBPLAN_STATE_DONE = 50
|
|
state_choices=(
|
|
(SUBPLAN_STATE_PLANING, '制定中'),
|
|
(SUBPLAN_STATE_ASSGINED, '已下达'),
|
|
(SUBPLAN_STATE_ACCEPTED, '已接收'),
|
|
(SUBPLAN_STATE_WORKING, '生产中'),
|
|
(SUBPLAN_STATE_DONE, '已完成'),
|
|
)
|
|
number = models.CharField('子计划编号', max_length=50, unique=True, null=True, blank=True)
|
|
production_plan = models.ForeignKey(ProductionPlan, verbose_name='关联主生产计划', on_delete=models.CASCADE, related_name='subplan_plan')
|
|
subproduction = models.ForeignKey(SubProduction, verbose_name='关联生产分解', on_delete=models.CASCADE, related_name='subplan_subprod')
|
|
start_date = models.DateField('计划开工日期')
|
|
end_date = models.DateField('计划完工日期')
|
|
|
|
workshop = models.ForeignKey(Organization, verbose_name='生产车间', on_delete=models.CASCADE)
|
|
process = models.ForeignKey(Process, verbose_name='关联大工序', on_delete=models.CASCADE)
|
|
|
|
product = models.ForeignKey(Material, verbose_name='主要产品', on_delete=models.CASCADE, null=True, blank=True)
|
|
count = models.PositiveIntegerField('应产出数', default=0)
|
|
count_real = models.PositiveIntegerField('实际产出数', default=0)
|
|
count_ok = models.PositiveIntegerField('合格数', default=0)
|
|
count_notok = models.PositiveIntegerField('不合格数量', default=0)
|
|
|
|
steps = models.JSONField('工艺步骤', default=list)
|
|
|
|
state = models.IntegerField('状态', default=SUBPLAN_STATE_PLANING)
|
|
start_date_real = models.DateField('实际开工日期', null=True, blank=True)
|
|
end_date_real = models.DateField('实际完工日期', null=True, blank=True)
|
|
is_picked = models.BooleanField('是否已领料', default=False)
|
|
|
|
# wproducts = models.JSONField('半成品表', default=list, blank=True)
|
|
is_testok = models.BooleanField('首件是否合格', null=True, blank=True)
|
|
form = models.ForeignKey(RecordForm, verbose_name='首件检查表', on_delete=models.CASCADE, null=True, blank=True)
|
|
tester = models.ForeignKey(User, on_delete=models.CASCADE,
|
|
verbose_name="首件检查员", null=True, blank=True, related_name='first_tester')
|
|
leader_1 = models.ForeignKey(User, on_delete=models.CASCADE,
|
|
verbose_name="工序负责人", null=True, blank=True, related_name='first_leader_1')
|
|
leader_2 = models.ForeignKey(User, on_delete=models.CASCADE,
|
|
verbose_name="技术负责人", null=True, blank=True, related_name='first_leader_2')
|
|
leader_3 = models.ForeignKey(User, on_delete=models.CASCADE,
|
|
verbose_name="总检", null=True, blank=True, related_name='first_leader_3')
|
|
first_sign_time = models.DateTimeField('首件签字时间', null=True, blank=True)
|
|
remark = models.CharField('备注', max_length=100, null=True, blank=True)
|
|
|
|
class Meta:
|
|
verbose_name = '子生产计划'
|
|
verbose_name_plural = verbose_name
|
|
|
|
class FirstItem(BaseModel):
|
|
"""
|
|
首件确认表记录条目
|
|
"""
|
|
form_field = models.ForeignKey(RecordFormField, verbose_name='关联自定义表格字段', on_delete=models.CASCADE)
|
|
field_value = models.JSONField('录入值', null=True, blank=True)
|
|
is_hidden = models.BooleanField('是否隐藏', default=False)
|
|
is_testok = models.BooleanField('是否合格', null=True, blank=True)
|
|
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联的子计划', on_delete=models.CASCADE, related_name='item_test_record')
|
|
|
|
class SubProductionProgress(BaseModel):
|
|
"""
|
|
子计划生产进度统计表/物料消耗
|
|
"""
|
|
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE, related_name='progress_subplan')
|
|
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE)
|
|
is_main = models.BooleanField('是否主产出', default=False)
|
|
type = models.IntegerField('物料应用类型', default=SubprodctionMaterial.type_choices)
|
|
count = models.PositiveIntegerField('应出入数')
|
|
count_pick = models.PositiveIntegerField('实际领用数', default=0)
|
|
count_real = models.PositiveIntegerField('实际消耗/产出数', default=0)
|
|
count_ok = models.PositiveIntegerField('合格数量', default=0)
|
|
count_notok = models.PositiveIntegerField('不合格数量', default=0)
|
|
|