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