From 0870b13ea355af24335df2473d006774d7444cbd Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 18 Dec 2023 15:52:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mioitem=E5=A2=9E=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E5=8E=82=E6=A3=80=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0012_auto_20231218_1552.py | 38 +++++++++++++++++++ apps/inm/models.py | 8 +++- apps/inm/serializers.py | 21 ++++++++++ apps/inm/views.py | 23 ++++++++--- 4 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 apps/inm/migrations/0012_auto_20231218_1552.py diff --git a/apps/inm/migrations/0012_auto_20231218_1552.py b/apps/inm/migrations/0012_auto_20231218_1552.py new file mode 100644 index 00000000..b2c8e42b --- /dev/null +++ b/apps/inm/migrations/0012_auto_20231218_1552.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.12 on 2023-12-18 07:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0011_rename_is_bgtest_ok_mioitem_is_testok'), + ] + + operations = [ + migrations.AddField( + model_name='mioitem', + name='count_bag', + field=models.PositiveIntegerField(default=0, verbose_name='总袋数'), + ), + migrations.AddField( + model_name='mioitem', + name='count_sampling', + field=models.PositiveIntegerField(default=0, verbose_name='抽样数'), + ), + migrations.AddField( + model_name='mioitem', + name='weight_kgs', + field=models.JSONField(default=list, verbose_name='称重记录'), + ), + migrations.AlterField( + model_name='mioitem', + name='count', + field=models.PositiveIntegerField(default=0, verbose_name='出入数量'), + ), + migrations.AlterField( + model_name='mioitem', + name='is_testok', + field=models.BooleanField(default=True, verbose_name='检验是否合格'), + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index c82ad6e0..c4122b9e 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -105,11 +105,15 @@ class MIOItem(BaseModel): material = models.ForeignKey( Material, verbose_name='物料', on_delete=models.CASCADE) batch = models.CharField('批次号', max_length=50) - count = models.PositiveIntegerField('数量', default=0) + count = models.PositiveIntegerField('出入数量', default=0) test_date = models.DateField('检验日期', null=True, blank=True) test_user = models.ForeignKey( User, verbose_name='检验人', on_delete=models.CASCADE, null=True, blank=True) + count_bag = models.PositiveIntegerField('总袋数', default=0) + count_sampling = models.PositiveIntegerField('抽样数', default=0) + weight_kgs = models.JSONField('称重记录', default=list) + count_notok = models.PositiveIntegerField('不合格数', default=0) count_n_zw = models.PositiveIntegerField('炸纹', default=0) count_n_tw = models.PositiveIntegerField('条纹', default=0) @@ -121,7 +125,7 @@ class MIOItem(BaseModel): count_n_jsqx = models.PositiveIntegerField('结石气线', default=0) count_n_qt = models.PositiveIntegerField('其他', default=0) - is_testok = models.BooleanField('配套件是否合格', default=True) + is_testok = models.BooleanField('检验是否合格', default=True) class MIOItemA(BaseModel): diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 6d35ae64..774cc96d 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -236,9 +236,30 @@ class MIOItemTestSerializer(CustomModelSerializer): model = MIOItem fields = ['id', 'test_date', 'test_user', 'count_notok', 'count_n_zw', 'count_n_tw', 'count_n_qp', 'count_n_wq', 'count_n_dl', 'count_n_pb', 'count_n_dxt', 'count_n_jsqx', 'count_n_qt'] + extra_kwargs = { + 'test_date': {'required': True}, + 'test_user': {'required': True} + } class MioItemAnaSerializer(serializers.Serializer): start_date = serializers.DateField(label='开始日期', required=True) end_date = serializers.DateField(label='结束日期', required=True) material_cate = serializers.CharField(label='物料系列', required=True) + + +class MIOItemPurInTestSerializer(CustomModelSerializer): + class Meta: + model = MIOItem + fields = ['id', 'test_date', 'test_user', + 'count_bag', 'weight_kgs', 'is_testok'] + extra_kwargs = { + 'test_date': {'required': True}, + 'test_user': {'required': True} + } + + def validate(self, attrs): + weight_kgs = attrs['weight_kgs'] + attrs['weight_kgs'] = [float(i) for i in weight_kgs] + attrs['count_sampling'] = len(attrs['weight_kgs']) + return super().validate(attrs) diff --git a/apps/inm/views.py b/apps/inm/views.py index d0633b2a..00cb5f35 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -11,7 +11,7 @@ from django.db.models import Sum from apps.inm.models import WareHouse, MaterialBatch, MIO, MIOItem from apps.inm.serializers import ( MaterialBatchSerializer, WareHourseSerializer, MIOListSerializer, MIOItemSerializer, MioItemAnaSerializer, - MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer) + MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer, MIOItemPurInTestSerializer) from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.inm.services import InmService from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, BulkUpdateModelMixin @@ -211,15 +211,13 @@ class MIOItemViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemTestSerializer) @transaction.atomic def test(self, request, *args, **kwargs): - """检验 + """半成品检验 - 检验 + 半成品检验 """ ins: MIOItem = self.get_object() if ins.test_date: raise ParseError('该明细已检验') - if ins.mio.state != MIO.MIO_SUBMITED: - raise ParseError('该状态不可检验') sr = MIOItemTestSerializer(instance=ins, data=request.data) sr.is_valid(raise_exception=True) sr.save() @@ -237,6 +235,21 @@ class MIOItemViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin mb.save() return Response() + @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemPurInTestSerializer) + @transaction.atomic + def test_pur_in(self, request, *args, **kwargs): + """入厂检验 + + 入厂检验 + """ + ins: MIOItem = self.get_object() + if ins.test_date: + raise ParseError('该明细已检验') + sr = MIOItemPurInTestSerializer(instance=ins, data=request.data) + sr.is_valid(raise_exception=True) + sr.save() + return Response() + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=MioItemAnaSerializer) def sale_out_ana(self, request, *args, **kwargs): """交付统计数据