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, WMaterial from django.utils.translation import gettext_lazy as _ class NotOkOption(models.TextChoices): zw = "zw", _("炸纹") tw = "tw", _("条纹") qp = "qp", _("气泡") wq = "wq", _("弯曲") dl = "dl", _("断裂") pb = "pb", _("偏壁") dxt = "dxt", _("大小头") js = "js", _("结石") qx = "qx", _("气线") hs = "hs", _("划伤") cs = "cs", _("挫伤") bl = "bl", _("不亮") zz = "zz", _("杂质") d = "d", _("短") zdd = "zdd", _("锥度大") hw = "hw", _("横纹") yp = "yp", _("有皮") bp = "bp", _("爆皮") sc = "sc", _("色差") tydd = "tydd", _("椭圆度大") sw = "sw", _("水雾") zjx = "zjx", _("直径小") zjd = "zjd", _("直径大") bhpcd = "bhpcd", _("壁厚偏差大") xzp = "xzp", _("箱中破") thhs = "thhs", _("退火后碎") swen = "swen", _("水纹") bb = "bb", _("崩边") xbb = "xbb", _("小崩边") wm = "wm", _("雾面") md = "md", _("麻点") xh = "xh", _("线痕") b = "b", _("扁") zb = "zb", _("棕边") zq = "zq", _("棕圈") hqbx = "hqbx", _("黑圈变形") dj = "dj", _("倒角") ps = "ps", _("破损") lq = "lq", _("蓝圈") hqnj = "hqnj", _("黑圈内径") hqnjyd = "hqnjyd", _("黑圈内径圆度") hqwj = "hqwj", _("黑圈外径") hqwjyd = "hqwjyd", _("黑圈外径圆度") wj = "wj", _("外径不良") yd = "yd", _("圆度不良") txd = "txd", _("同心度不良") hd = "hd", _("厚度不良") z = "z", _("脏") zhg = "zhg", _("准合格") yz = "yz", _("圆准") jgqbl = "jgqbl", _("加工前不良") qt = "qt", _("其它") FTEST_TYPE_CHOICES = ( ('first', '首件检验'), ('process', '过程检验'), ('prod', '成品检验') ) class TestItem(CommonAModel): """ 检测项目 """ name = models.CharField('名称', max_length=100) field_type = models.CharField('字段类型', max_length=20, default='input-number', choices=( ('input-int', '整数输入'), ('input-number', '小数输入'), ('input-text', '文本输入'), ('select-text', '单选文本'), ('selects-text', '多选文本') )) 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) wm = models.ForeignKey(WMaterial, verbose_name='关联车间库存', on_delete=models.SET_NULL, null=True, blank=True) mb = models.ForeignKey('inm.materialbatch', verbose_name='关联仓库', on_delete=models.SET_NULL, null=True, blank=True) test_date = models.DateField('检验日期') material = models.ForeignKey( Material, verbose_name='产品', on_delete=models.CASCADE) batch = models.CharField('生产批次', max_length=50) count = models.IntegerField('检验数量') count_sampling = models.IntegerField('抽检数量', default=0) count_sampling_ok = models.IntegerField('抽检合格数量', default=0) count_ok = models.IntegerField('合格数量', default=0) count_notok = models.IntegerField('不合格数量', default=0) count_notok_json = models.JSONField('不合格项数量统计', default=dict, null=False, blank=True) test_user = models.ForeignKey( User, verbose_name='操作人', on_delete=models.CASCADE, related_name='ftestwork_test_user', null=True, blank=True) submit_time = models.DateTimeField('提交时间', null=True, blank=True) submit_user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='提交人', null=True, blank=True) 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)