From b8346d90b94ed52111608162f7e541ce363487cf Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 20 Jan 2022 15:41:47 +0800 Subject: [PATCH] =?UTF-8?q?wproduct=20=E6=8C=87=E6=B4=BE=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wpm/migrations/0051_auto_20220120_1541.py | 25 +++++++++++++++++ hb_server/apps/wpm/models.py | 5 ++-- hb_server/apps/wpm/serializers.py | 7 ++++- hb_server/apps/wpm/views.py | 28 +++++++++++++++++-- hb_server/utils/response.py | 25 +++++++++-------- 5 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 hb_server/apps/wpm/migrations/0051_auto_20220120_1541.py diff --git a/hb_server/apps/wpm/migrations/0051_auto_20220120_1541.py b/hb_server/apps/wpm/migrations/0051_auto_20220120_1541.py new file mode 100644 index 0000000..9a0c6fb --- /dev/null +++ b/hb_server/apps/wpm/migrations/0051_auto_20220120_1541.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.9 on 2022-01-20 07:41 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sam', '0010_auto_20211208_1408'), + ('wpm', '0050_alter_operationequip_state'), + ] + + operations = [ + migrations.AddField( + model_name='wproduct', + name='to_order', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sam.order', verbose_name='指派的订单'), + ), + migrations.AddField( + model_name='wproductflow', + name='to_order', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sam.order', verbose_name='指派的订单'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index b259eac..c52a061 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -118,7 +118,8 @@ class WProduct(CommonAModel): on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_test') ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单', on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_ticket') - + + to_order = models.ForeignKey('sam.order', verbose_name='指派的订单', null=True, blank=True, on_delete = models.CASCADE) is_mtested = models.BooleanField('是否军检', default=False) is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) remark_mtest = models.TextField('军检备注', null=True, blank=True) @@ -192,7 +193,7 @@ class WproductFlow(CommonAModel): on_delete=models.SET_NULL, null=True, blank=True) ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单', on_delete=models.SET_NULL, null=True, blank=True) - + to_order = models.ForeignKey('sam.order', verbose_name='指派的订单', null=True, blank=True, on_delete = models.CASCADE) is_mtested = models.BooleanField('是否军检', default=False) is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) remark_mtest = models.TextField('军检备注', null=True, blank=True) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 8956eb3..3e245ef 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -19,6 +19,7 @@ from apps.system.models import User from apps.system.serializers import UserSimpleSerializer from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket from django.db import transaction +from apps.sam.models import Order class PickHalfSerializer(serializers.Serializer): id = serializers.PrimaryKeyRelatedField(queryset=SubProductionProgress.objects.all(), label='子计划进度ID') @@ -560,4 +561,8 @@ class CuttingListSerializer(serializers.ModelSerializer): class WproductMtestSerializer(serializers.ModelSerializer): class Meta: model = WProduct - fields = ['remark_mtest', 'is_mtestok'] \ No newline at end of file + fields = ['remark_mtest', 'is_mtestok'] + +class WproductToOrderSerializer(serializers.Serializer): + wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), many=True) + order = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all()) \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index caababf..5847c89 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -27,7 +27,7 @@ from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerial PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, \ WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, \ WpmTestFormInitSerializer, WproductMtestSerializer, WproductPutInSerializer, \ - WproductPutInsSerializer, WproductTicketListSerializer + WproductPutInsSerializer, WproductTicketListSerializer, WproductToOrderSerializer from rest_framework.response import Response from django.db import transaction @@ -441,7 +441,31 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): ret.append([str(index + 1), item['step_name'], item['actions']]) return Response(ret) - + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproductToOrderSerializer) + @transaction.atomic + def to_order(self, request, pk=None): + """ + 指派发货订单 + """ + serializer = WproductToOrderSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data + wps = WProduct.objects.filter(id__in = [i.id for i in vdata.get('wproducts')]) + wp = wps.first() + order = vdata['order'] + if wp.material != order.product: + raise exceptions.ValidationError('所选订单与产品不符') + for i in wps: + if i.material != wp.material and i.material.type != Material.MA_TYPE_GOOD and i.act_state \ + not in [WProduct.WPR_ACT_STATE_OK, WProduct.WPR_ACT_STATE_INM]: + raise exceptions.ValidationError('所选产品错误') + for i in wps: + i.to_order = order + i.update_by = request.user + i.save() + WpmServies.add_wproduct_flow_log(i,change_str='to_order') + return Response() + class WproductTicketViewSet(ListModelMixin, GenericViewSet): """ 玻璃审批工单 diff --git a/hb_server/utils/response.py b/hb_server/utils/response.py index f4379f4..0411547 100644 --- a/hb_server/utils/response.py +++ b/hb_server/utils/response.py @@ -47,17 +47,20 @@ class FitJSONRenderer(JSONRenderer): """ response_body = BaseResponse() response = renderer_context.get("response") - response_body.code = response.status_code - if response_body.code >= 400: # 响应异常 - response_body.data = data # data里是详细异常信息 - prefix = "" - if isinstance(data, dict): - prefix = list(data.keys())[0] - data = data[prefix] - if isinstance(data, list): - data = data[0] - response_body.msg = prefix + ":" + str(data) # 取一部分放入msg,方便前端alert + status_code = response.status_code # Http状态异常码 + if status_code >= 400: # 如果http响应异常 + if isinstance(data, dict) and 'code' in data: # 如果自定义了异常码 + response_body = data + else: + response_body.data = data # data里是详细异常信息 + prefix = "" + if isinstance(data, dict): + prefix = list(data.keys())[0] + data = data[prefix] + elif isinstance(data, list): + data = data[0] + response_body.msg = prefix + ":" + str(data) # 取一部分放入msg,方便前端alert else: response_body.data = data - renderer_context.get("response").status_code = 200 # 统一成200响应,用code区分 + renderer_context.get("response").status_code = 200 # 统一成200响应, 可用body里code区分业务异常 return super(FitJSONRenderer, self).render(response_body.dict, accepted_media_type, renderer_context)