feat: mioitemw test
This commit is contained in:
parent
5b977d4cf9
commit
5409f5d55d
|
@ -185,5 +185,7 @@ class MIOItemw(BaseModel):
|
|||
wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL, related_name='wpr_mioitemw'
|
||||
, null=True, blank=True)
|
||||
mioitem = models.ForeignKey(MIOItem, verbose_name='关联出入库明细', on_delete=models.CASCADE, related_name='w_mioitem')
|
||||
ftest = models.ForeignKey("qm.ftest", verbose_name='关联检验记录', on_delete=models.PROTECT,
|
||||
related_name='ftest_mioitemw', null=True, blank=True)
|
||||
note = models.TextField('备注', null=True, blank=True)
|
||||
|
|
@ -12,6 +12,7 @@ from .models import MIO, MaterialBatch, MIOItem, WareHouse, MIOItemA, MaterialBa
|
|||
from django.db import transaction
|
||||
from server.settings import get_sysconfig
|
||||
from apps.wpmw.models import Wpr
|
||||
from apps.qm.serializers import FtestProcessSerializer
|
||||
|
||||
|
||||
class WareHourseSerializer(CustomModelSerializer):
|
||||
|
@ -100,16 +101,12 @@ class MIOItemwSerializer(CustomModelSerializer):
|
|||
read_only_fields = EXCLUDE_FIELDS_BASE + ["mioitem"]
|
||||
|
||||
class MIOItemwTestSerializer(CustomModelSerializer):
|
||||
ftest = FtestProcessSerializer(required=False)
|
||||
class Meta:
|
||||
model = MIOItemw
|
||||
fields = ["test_user", "defect_json", "note", "test_json", "is_testok", "test_time", "qct"]
|
||||
fields = ["id", "ftest"]
|
||||
extra_kwargs = {
|
||||
'test_user': {'required': True},
|
||||
'defect_json': {'required': True},
|
||||
'test_json': {'required': True},
|
||||
'is_testok': {'required': True},
|
||||
'test_time': {'required': True},
|
||||
'qct': {'required': True},
|
||||
'ftest': {'required': True},
|
||||
}
|
||||
|
||||
class MIOItemCreateSerializer(CustomModelSerializer):
|
||||
|
|
|
@ -14,6 +14,8 @@ def do_out(item: MIOItem):
|
|||
"""
|
||||
生产领料到车间
|
||||
"""
|
||||
if item.mb and item.mb.defect is not None:
|
||||
raise ParseError("生产领料不支持不合格品")
|
||||
from apps.inm.models import MaterialBatch
|
||||
mio:MIO = item.mio
|
||||
belong_dept = mio.belong_dept
|
||||
|
@ -65,7 +67,9 @@ def do_out(item: MIOItem):
|
|||
mb = MaterialBatch.objects.get(
|
||||
material=xmaterial,
|
||||
warehouse=item.warehouse,
|
||||
batch=xbatch
|
||||
batch=xbatch,
|
||||
state=10,
|
||||
defect=None
|
||||
)
|
||||
except (MaterialBatch.DoesNotExist, MaterialBatch.MultipleObjectsReturned) as e:
|
||||
raise ParseError(f"批次错误!{e}")
|
||||
|
@ -108,11 +112,13 @@ def do_in(item: MIOItem):
|
|||
生产入库后更新车间物料
|
||||
"""
|
||||
mio = item.mio
|
||||
if mio.wm and mio.wm.defect is not None:
|
||||
raise ParseError("不合格物料无法入库")
|
||||
belong_dept = mio.belong_dept
|
||||
mgroup = mio.mgroup
|
||||
do_user = mio.do_user
|
||||
material = item.material
|
||||
if material.into_wm is False:
|
||||
if material.into_wm is False: # 根据配置不进行入车间库存的处理
|
||||
return
|
||||
action_list = []
|
||||
mias = MIOItemA.objects.filter(mioitem=item)
|
||||
|
@ -168,6 +174,8 @@ def do_in(item: MIOItem):
|
|||
material=xmaterial,
|
||||
warehouse=item.warehouse,
|
||||
batch=xbatch,
|
||||
state=10,
|
||||
defect=None,
|
||||
defaults={
|
||||
"count": 0,
|
||||
"batch_ofrom": wm.batch_ofrom,
|
||||
|
|
|
@ -21,6 +21,8 @@ from apps.utils.mixins import (BulkCreateModelMixin, BulkDestroyModelMixin, Bulk
|
|||
CustomListModelMixin)
|
||||
from apps.utils.permission import has_perm
|
||||
from .filters import MaterialBatchFilter, MioFilter
|
||||
from apps.qm.serializers import FtestProcessSerializer
|
||||
from apps.mtm.models import Material
|
||||
|
||||
|
||||
# Create your views here.
|
||||
|
@ -255,6 +257,8 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode
|
|||
半成品检验
|
||||
"""
|
||||
ins: MIOItem = self.get_object()
|
||||
if ins.material.tracking != Material.MA_TRACKING_BATCH:
|
||||
raise ParseError('该物料非批次管理')
|
||||
mio = ins.mio
|
||||
if ins.test_date:
|
||||
raise ParseError('该明细已检验')
|
||||
|
@ -292,6 +296,8 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode
|
|||
入厂检验
|
||||
"""
|
||||
ins: MIOItem = self.get_object()
|
||||
if ins.material.tracking != Material.MA_TRACKING_BATCH:
|
||||
raise ParseError('该物料非批次管理')
|
||||
if ins.test_date:
|
||||
raise ParseError('该明细已检验')
|
||||
sr = MIOItemPurInTestSerializer(instance=ins, data=request.data)
|
||||
|
@ -325,26 +331,43 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode
|
|||
return Response(res)
|
||||
|
||||
|
||||
class MIOItemwViewSet(CustomGenericViewSet):
|
||||
class MIOItemwViewSet(CustomListModelMixin, CustomGenericViewSet):
|
||||
queryset = MIOItemw.objects.all()
|
||||
serializer_class = MIOItemwSerializer
|
||||
|
||||
# @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemwTestSerializer)
|
||||
# @transaction.atomic
|
||||
# def test(self, request, *args, **kwargs):
|
||||
# """单个检验
|
||||
#
|
||||
# 单个检验
|
||||
# """
|
||||
# ins: MIOItemw = self.get_object()
|
||||
# if ins.test_time is not None:
|
||||
# raise ParseError("该单件已检验")
|
||||
# sr = MIOItemwTestSerializer(instance=ins, data=request.data)
|
||||
# sr.is_valid(raise_exception=True)
|
||||
# sr.save()
|
||||
# if ins.mioitem.mio.submit_time is not None:
|
||||
# # 已提交需要更新库存
|
||||
# # todo
|
||||
# pass
|
||||
# return Response()
|
||||
def cal_mioitem_count(self, mioitem):
|
||||
count = MIOItemw.objects.filter(mioitem=mioitem).count()
|
||||
mioitem.count = count
|
||||
mioitem.count_notok = MIOItemw.objects.filter(mioitem=mioitem, ftest__is_ok=False).count()
|
||||
mioitem.count_ok = count - mioitem.count_notok
|
||||
mioitem.save()
|
||||
|
||||
@action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemwTestSerializer)
|
||||
@transaction.atomic
|
||||
def test(self, request, *args, **kwargs):
|
||||
"""单个检验
|
||||
|
||||
单个检验
|
||||
"""
|
||||
ins: MIOItemw = self.get_object()
|
||||
sr = MIOItemTestSerializer(instance=ins, data=request.data)
|
||||
sr.is_valid(raise_exception=True)
|
||||
vdata = sr.validated_data
|
||||
ftest_data = vdata.pop("ftest", None)
|
||||
ftest = ins.ftest
|
||||
if not ftest:
|
||||
ftest_sr = FtestProcessSerializer(data=ftest_data)
|
||||
ftest = ftest_sr.create(ftest_data)
|
||||
ins.ftest = ftest
|
||||
ins.save()
|
||||
mioitem: MIOItem = ins.mioitem
|
||||
if mioitem.test_user is None:
|
||||
mioitem.test_user = ftest.test_user
|
||||
mioitem.test_date = ftest.test_date
|
||||
mioitem.save()
|
||||
else:
|
||||
ftest_sr = FtestProcessSerializer()
|
||||
ftest_sr.update(instance=ftest, validated_data=ftest_data)
|
||||
self.cal_mioitem_count(ins.mioitem)
|
||||
return Response(sr.data)
|
||||
|
Loading…
Reference in New Issue