feat: mioitemw test

This commit is contained in:
caoqianming 2025-01-15 13:37:28 +08:00
parent 5b977d4cf9
commit 5409f5d55d
4 changed files with 58 additions and 28 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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,

View File

@ -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)