72 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
from django.db import models
 | 
						|
from apps.utils.models import BaseModel
 | 
						|
from apps.mtm.models import Material
 | 
						|
from rest_framework.exceptions import ParseError
 | 
						|
 | 
						|
# Create your models here.
 | 
						|
class Wpr(BaseModel):
 | 
						|
    """
 | 
						|
    动态半成品表
 | 
						|
    """
 | 
						|
 | 
						|
    number = models.CharField("编号", max_length=50, unique=True, null=True, blank=True)
 | 
						|
    state = models.PositiveSmallIntegerField('状态', default=10, choices=((10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废')))
 | 
						|
    material = models.ForeignKey(Material, verbose_name="当前物料形态", on_delete=models.CASCADE)
 | 
						|
    defects = models.ManyToManyField("qm.defect", through="wpmw.wprdefect", verbose_name="缺陷项")
 | 
						|
 | 
						|
 | 
						|
    mb = models.ForeignKey("inm.materialbatch", verbose_name="仓库物料", on_delete=models.CASCADE, null=True, blank=True)
 | 
						|
    wm = models.ForeignKey("wpm.wmaterial", verbose_name="车间物料", on_delete=models.CASCADE, null=True, blank=True)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None):
 | 
						|
        if wpr is None and number is None:
 | 
						|
            raise ParseError("id和number不能同时为空")
 | 
						|
        if mb and wm:
 | 
						|
            raise ParseError("所属仓库批次和车间批次不可同时存在")
 | 
						|
 | 
						|
        if wpr:
 | 
						|
            ins = wpr
 | 
						|
        elif number:
 | 
						|
            try:
 | 
						|
                ins = cls.objects.get(number=number)
 | 
						|
                if ins.wm or ins.wm:
 | 
						|
                    raise ParseError("该物料编号已存在不可使用")
 | 
						|
            except cls.DoesNotExist:
 | 
						|
                ins = cls(number=number)
 | 
						|
 | 
						|
        if old_mb and ins.mb != old_mb:
 | 
						|
            raise ParseError(f"请检查-{ins.number}-所属仓库批次")
 | 
						|
        if old_wm and ins.wm != old_wm:
 | 
						|
            raise ParseError(f"请检查-{ins.number}-所属车间批次")
 | 
						|
 | 
						|
        if number:
 | 
						|
            ins.number = number
 | 
						|
 | 
						|
        ins.mb = mb
 | 
						|
        if mb:
 | 
						|
            ins.material = mb.material
 | 
						|
 | 
						|
        ins.wm = wm
 | 
						|
        if wm:
 | 
						|
            ins.material = wm.material
 | 
						|
        ins.save()
 | 
						|
        return ins
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def clear(cls, number_list):
 | 
						|
        cls.objects.filter(number__in=number_list).update(mb=None, wm=None)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def get_qs_by_mb(cls, mb):
 | 
						|
        return cls.objects.filter(mb=mb, wm=None)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def get_qs_by_wm(cls, wm):
 | 
						|
        return cls.objects.filter(wm=wm, mb=None)
 | 
						|
 | 
						|
 | 
						|
class WprDefect(BaseModel):
 | 
						|
    wpr = models.ForeignKey(Wpr, verbose_name="关联产物", on_delete=models.CASCADE)
 | 
						|
    defect = models.ForeignKey("qm.defect", verbose_name="关联缺陷项", on_delete=models.CASCADE)
 | 
						|
    is_main = models.BooleanField("是否主要缺陷", default=False) |