216 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			9.0 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, Shift
 | 
						|
from apps.em.models import Equipment
 | 
						|
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):
 | 
						|
    """
 | 
						|
    检验工作
 | 
						|
    """
 | 
						|
    TYPE2_SOME = 10
 | 
						|
    TYPE2_ALL = 20
 | 
						|
    type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES, default='prod')
 | 
						|
    type2 = models.PositiveSmallIntegerField('检验类型2', choices=((TYPE2_SOME, '抽检'), (TYPE2_ALL, '全检')), default=10)
 | 
						|
    shift = models.ForeignKey(Shift, verbose_name='班次', on_delete=models.SET_NULL, null=True, blank=True)
 | 
						|
    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.PositiveIntegerField('检验数量')
 | 
						|
    count_sampling = models.PositiveIntegerField('抽检数量', default=0)
 | 
						|
    count_sampling_ok = models.PositiveIntegerField('抽检合格数量', default=0)
 | 
						|
    count_ok = models.PositiveIntegerField('合格数量', default=0)
 | 
						|
    count_notok = models.PositiveIntegerField('不合格数量', default=0)
 | 
						|
    need_update_wm = models.BooleanField('是否更新车间库存', default=True)
 | 
						|
    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)
 | 
						|
    note = models.TextField('备注', null=True, blank=True)
 | 
						|
    equipment = models.ForeignKey(Equipment, verbose_name='所属检验设备', on_delete=models.SET_NULL, 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)
 |