factory/apps/qm/models.py

140 lines
5.9 KiB
Python

from django.db import models
from apps.system.models import CommonAModel, CommonADModel, User
from apps.utils.models import CommonBDModel, BaseModel
from apps.mtm.models import Material, Mgroup, Team
from apps.wpm.models import SfLog
FTEST_TYPE_CHOICES = (
('first', '首件检验'),
('prod', '成品检验')
)
class TestItem(CommonAModel):
"""
检测项目
"""
name = models.CharField('名称', max_length=100)
field_type = models.CharField('字段类型', max_length=20, default='input-number', choices=(
('input-number', '数字输入'), ('input-text', '文本输入'), ('select', '单选'), ('selects', '多选')
))
number = models.CharField('编号', max_length=20, default='', blank=True)
choices = models.JSONField('选项', default=list, blank=True)
tags = models.JSONField('检测类型', default=list, blank=True)
mcate_tags = models.JSONField('物料系列标签', default=list, blank=True)
sort = models.PositiveSmallIntegerField('排序', default=1)
description = models.TextField('描述', default='')
class Meta:
ordering = ['sort', '-create_time']
class QuaStat(CommonBDModel):
"""
质量数据表
"""
material = models.ForeignKey(
Material, verbose_name='关联产物', on_delete=models.CASCADE)
sflog = models.ForeignKey(
SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True)
testitem = models.ForeignKey(
TestItem, verbose_name='质检项目', on_delete=models.CASCADE)
val_avg = models.FloatField('平均值', null=True, blank=True)
num_test = models.PositiveSmallIntegerField('检测次数', null=True, blank=True)
num_ok = models.PositiveSmallIntegerField('合格次数', null=True, blank=True)
rate_pass = models.FloatField('合格率', null=True, blank=True)
class FtestWork(CommonBDModel):
"""
检验工作
"""
type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES, default='prod')
type2 = models.PositiveSmallIntegerField('检验类型2', choices=((10, '抽检'), (20, '全检')), default=10)
test_date = models.DateField('检验日期')
material = models.ForeignKey(
Material, verbose_name='产品', on_delete=models.CASCADE)
batch = models.CharField('生产批次', max_length=20)
count = models.IntegerField('总数量')
count_sampling = models.IntegerField('抽检数量', default=0)
count_ok = models.IntegerField('合格数量', default=0)
count_notok = models.IntegerField('不合格数量', default=0)
class Ftest(CommonBDModel):
"""
检验记录
"""
type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES)
test_date = models.DateField('检验日期')
test_numer = models.CharField('检测编号', max_length=20, default='')
test_group = models.CharField(
'检验工序集', max_length=20, default='', blank=True)
test_user = models.ForeignKey(
User, verbose_name='操作人', on_delete=models.CASCADE, related_name='ftest_test_user')
check_user = models.ForeignKey(
User, verbose_name='专检人', on_delete=models.CASCADE, related_name='ftest_check_user', null=True, blank=True)
is_ok = models.BooleanField('是否合格', default=False)
note = models.TextField('备注', default='', blank=True)
ftest_work = models.ForeignKey(
FtestWork, verbose_name='关联检验工作', on_delete=models.CASCADE, null=True, blank=True)
@property
def ftestitems(self):
return FtestItem.objects.filter(ftest=self)
class FtestItem(BaseModel):
"""
检测明细
"""
ftest = models.ForeignKey(
Ftest, verbose_name='关联检验', on_delete=models.CASCADE)
testitem = models.ForeignKey(
TestItem, verbose_name='质检项目', on_delete=models.CASCADE)
test_val = models.FloatField('测量值', null=True, blank=True)
check_val = models.FloatField('专检测量值', null=True, blank=True)
test_val_json = models.JSONField('测量值', null=True, blank=True)
check_val_json = models.JSONField('专检测量值', null=True, blank=True)
class Ptest(CommonAModel):
"""
性能测试记录
"""
PTEST_EQUIP_STATES = (
('R', '正常'),
('T', '异常')
)
PTEST_XJ_VALS = (
('S', '析晶'),
('R', '不析晶'),
('θ', '未化')
)
test_date = models.DateField('实验日期')
test_user = models.ForeignKey(
User, verbose_name='检验员', on_delete=models.CASCADE)
testitem = models.ForeignKey(
TestItem, verbose_name='测试项目', on_delete=models.CASCADE)
sample_number = models.CharField('样品编号', max_length=20)
sample_count = models.PositiveIntegerField('样品数量', null=True, blank=True)
sample_density = models.FloatField('样品密度', null=True, blank=True)
specification = models.CharField(
'型号规格', max_length=20, null=True, blank=True)
equip_state = models.CharField(
'仪器状态', max_length=10, default='R', choices=PTEST_EQUIP_STATES, help_text=list(PTEST_EQUIP_STATES))
note = models.TextField('备注', default='', blank=True)
val_hd = models.FloatField('厚度', help_text='mm', null=True, blank=True)
val_zsl = models.FloatField(
'折射率', help_text='589nm', null=True, blank=True)
val_tgl = models.FloatField(
'透过率', help_text='550nm', null=True, blank=True)
val_ts = models.FloatField("Ts", help_text='', null=True, blank=True)
val_tg = models.FloatField("Tg", help_text='', null=True, blank=True)
val_tf = models.FloatField("Tf", help_text='', null=True, blank=True)
val_xj = models.CharField(
'析晶', max_length=10, default='S', choices=PTEST_XJ_VALS, help_text=list(PTEST_XJ_VALS))
val_pzxs = models.FloatField(
'膨胀系数', help_text='30-300℃', null=True, blank=True)
val_zgwd = models.FloatField('升至最高温度', null=True, blank=True)