From d3a35fac310574f8c0c253a3d74fc7b24fcbc07e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 31 Dec 2024 10:53:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mioitemwtest=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0023_auto_20241231_1051.py | 30 ++++++++++++++++++ apps/inm/models.py | 5 +-- apps/inm/serializers.py | 14 +++++++++ apps/inm/urls.py | 5 ++- apps/inm/views.py | 31 +++++++++++++++++-- 5 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 apps/inm/migrations/0023_auto_20241231_1051.py diff --git a/apps/inm/migrations/0023_auto_20241231_1051.py b/apps/inm/migrations/0023_auto_20241231_1051.py new file mode 100644 index 00000000..a2cc82f3 --- /dev/null +++ b/apps/inm/migrations/0023_auto_20241231_1051.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.12 on 2024-12-31 02:51 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('qm', '0032_defect_note'), + ('inm', '0022_mioitemw'), + ] + + operations = [ + migrations.AddField( + model_name='mioitemw', + name='qct', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='qm.qct', verbose_name='所用检验模板'), + ), + migrations.AlterField( + model_name='mioitem', + name='is_testok', + field=models.BooleanField(blank=True, null=True, verbose_name='检验是否合格'), + ), + migrations.AlterField( + model_name='mioitemw', + name='is_testok', + field=models.BooleanField(blank=True, null=True, verbose_name='检验是否合格'), + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index 0b93475e..9ee9e000 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -141,7 +141,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('检验是否合格', null=True, blank=True) @classmethod def count_fields(cls): @@ -176,7 +176,8 @@ class MIOItemw(BaseModel): test_json = models.JSONField('检验情况', default=dict, blank=True) defect_json = models.JSONField('缺陷情况', default=list, blank=True) note = models.TextField('备注', null=True, blank=True) + qct = models.ForeignKey('qm.qct', verbose_name='所用检验模板', on_delete=models.SET_NULL, null=True, blank=True, db_constraint=False) test_user = models.ForeignKey(User, verbose_name='检验人', on_delete=models.SET_NULL, null=True, blank=True) test_time = models.DateTimeField('检验时间', null=True, blank=True) - is_testok = models.BooleanField('检验是否合格', default=True) + is_testok = models.BooleanField('检验是否合格', null=True, blank=True) \ No newline at end of file diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 53ca8672..154d2d89 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -98,10 +98,24 @@ class MIOItemwCreateSerializer(CustomModelSerializer): fields = ["number", "note"] class MIOItemwSerializer(CustomModelSerializer): + test_user_name = serializers.CharField(source='test_user.name', read_only=True) class Meta: model = MIOItemw fields = "__all__" +class MIOItemwTestSerializer(CustomModelSerializer): + class Meta: + model = MIOItemw + fields = ["test_user", "defect_json", "note", "test_json", "is_testok", "test_time", "qct"] + 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}, + } + class MIOItemCreateSerializer(CustomModelSerializer): assemb = MIOItemACreateSerializer( label='组合件信息', many=True, write_only=True, required=False) diff --git a/apps/inm/urls.py b/apps/inm/urls.py index e4e0656a..addf44a3 100644 --- a/apps/inm/urls.py +++ b/apps/inm/urls.py @@ -1,7 +1,9 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter from apps.inm.views import ( - WarehouseVIewSet, MaterialBatchViewSet, MIOViewSet, MIOItemViewSet, MioDoViewSet, MioSaleViewSet, MioPurViewSet, MioOtherViewSet) + WarehouseVIewSet, MaterialBatchViewSet, MIOViewSet, + MIOItemViewSet, MioDoViewSet, MioSaleViewSet, + MioPurViewSet, MioOtherViewSet, MIOItemwViewSet) API_BASE_URL = 'api/inm/' HTML_BASE_URL = 'inm/' @@ -16,6 +18,7 @@ router.register('mio/sale', MioSaleViewSet) router.register('mio/pur', MioPurViewSet) router.register('mio/other', MioOtherViewSet) router.register('mioitem', MIOItemViewSet, basename='mioitem') +router.register('mioitemw', MIOItemwViewSet, basename='mioitemw') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/inm/views.py b/apps/inm/views.py index 451407d5..7ecbd6cb 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -9,10 +9,12 @@ from django.utils import timezone from rest_framework.response import Response from django.db.models import Sum -from apps.inm.models import WareHouse, MaterialBatch, MIO, MIOItem +from apps.inm.models import WareHouse, MaterialBatch, MIO, MIOItem, MIOItemw from apps.inm.serializers import ( MaterialBatchSerializer, WareHourseSerializer, MIOListSerializer, MIOItemSerializer, MioItemAnaSerializer, - MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer, MIOItemPurInTestSerializer) + MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, + MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer, MIOItemPurInTestSerializer, + MIOItemwSerializer, MIOItemwTestSerializer) from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.inm.services import InmService, daoru_mb from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, BulkUpdateModelMixin @@ -316,3 +318,28 @@ class MIOItemViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin if res[i] is None: res[i] = 0 return Response(res) + + +class MIOItemwViewSet(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() + \ No newline at end of file