From 2ad60626e5ae69acb3fbacc5d86ea74e2e024b82 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 30 Dec 2021 16:35:19 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=8D=E5=90=88=E6=A0=BC=E5=93=81?= =?UTF-8?q?=E5=AE=A1=E7=90=86=E5=B7=A5=E5=8D=95=E5=88=97=E8=A1=A8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/services.py | 4 +++- .../0042_wprouctticket_resp_process.py | 20 +++++++++++++++++++ hb_server/apps/wpm/models.py | 1 + hb_server/apps/wpm/serializers.py | 17 +++++++++++++--- hb_server/apps/wpm/signals.py | 8 ++------ hb_server/apps/wpm/urls.py | 3 ++- hb_server/apps/wpm/views.py | 18 +++++++++++++---- 7 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 hb_server/apps/wpm/migrations/0042_wprouctticket_resp_process.py diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index 5d486c1..fa32197 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -130,6 +130,7 @@ class WfService(object): import datetime, time # 用于支持条件表达式中对时间的操作 if eval(expression, {'__builtins__':None}, {'datetime':datetime, 'time':time}): destination_state = State.objects.get(pk=i['target_state']) + return destination_state return destination_state @classmethod @@ -321,7 +322,8 @@ class WfService(object): if not created: for key, value in source_state.state_fields.items(): if value in (State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL): - source_ticket_data[key] = new_ticket_data[key] + if key in new_ticket_data: + source_ticket_data[key] = new_ticket_data[key] ticket.ticket_data = source_ticket_data ticket.save() diff --git a/hb_server/apps/wpm/migrations/0042_wprouctticket_resp_process.py b/hb_server/apps/wpm/migrations/0042_wprouctticket_resp_process.py new file mode 100644 index 0000000..3f10a57 --- /dev/null +++ b/hb_server/apps/wpm/migrations/0042_wprouctticket_resp_process.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.9 on 2021-12-30 08:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0042_alter_recordformfield_field_type'), + ('wpm', '0041_wproductflow_change_str'), + ] + + operations = [ + migrations.AddField( + model_name='wprouctticket', + name='resp_process', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.process', verbose_name='责任工序'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 92caa8a..dd55ceb 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -120,6 +120,7 @@ class WprouctTicket(CommonAModel): step = models.ForeignKey(Step, verbose_name='所在步骤/发现步骤', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='所在子生产计划', on_delete=models.CASCADE) + resp_process = models.ForeignKey(Process, verbose_name='责任工序', on_delete=models.CASCADE, null=True, blank=True) ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', on_delete=models.CASCADE, related_name='wt_ticket') decision = models.PositiveSmallIntegerField('最终决定', choices=WProduct.ng_choices, null=True, blank=True) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index ec15acd..18503a4 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -5,7 +5,7 @@ from apps.em.serializers import EquipmentSimpleSerializer from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse from apps.inm.signals import update_inm from apps.mtm.models import Material, RecordForm, RecordFormField, Step, SubprodctionMaterial -from apps.mtm.serializers import MaterialSimpleSerializer, RecordFormSimpleSerializer, StepSimpleSerializer +from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, StepSimpleSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress from django.utils import timezone @@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy as _ from apps.pm.serializers import SubproductionPlanSimpleSerializer from apps.qm.models import TestRecord, TestRecordItem from apps.system.serializers import UserSimpleSerializer -from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem +from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket from django.db import transaction class PickHalfSerializer(serializers.Serializer): @@ -429,4 +429,15 @@ class OperationRecordDetailSerializer(serializers.ModelSerializer): class ScrapSerializer(serializers.Serializer): scrap_reason = serializers.ChoiceField(choices=WProduct.scrap_reason_choices, required=False) - # wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label='半成品ID列表') \ No newline at end of file + # wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label='半成品ID列表') + + +class WproductTicketListSerializer(serializers.ModelSerializer): + material_ = MaterialSimpleSerializer(source='material', read_only=True) + step_ = StepSimpleSerializer(source='step', read_only=True) + subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True) + resp_process_ = ProcessSimpleSerializer(source='resp_process', read_only=True) + + class Meta: + model = WprouctTicket + fields = '__all__' diff --git a/hb_server/apps/wpm/signals.py b/hb_server/apps/wpm/signals.py index 91a4dcf..670f9c7 100644 --- a/hb_server/apps/wpm/signals.py +++ b/hb_server/apps/wpm/signals.py @@ -28,7 +28,7 @@ def handleTicket(sender, instance, created, **kwargs): obj.subproduction_plan = wproduct.subproduction_plan obj.ticket = instance - test_record = TestRecord.objects.filter(wproduct=wproduct, is_deleted=False, is_testok=False).order_by('-id').first() + # test_record = TestRecord.objects.filter(wproduct=wproduct, is_deleted=False, is_testok=False).order_by('-id').first() obj.save() # 工单绑定半成品 @@ -36,11 +36,6 @@ def handleTicket(sender, instance, created, **kwargs): wproduct.save() WpmServies.add_wproduct_flow_log(wproduct, 'ticket_create') - # 检验员 - if not ticket_data.get('tester', None): - ticket_data['tester'] = test_record.create_by.id - instance.ticket_data = ticket_data - instance.save() elif instance.act_state == Ticket.TICKET_ACT_STATE_FINISH: """ @@ -58,6 +53,7 @@ def handleTicket(sender, instance, created, **kwargs): wp.ng_sign = decision + wt.decision = decision if decision in [WProduct.NG_BACK_WORK, WProduct.NG_BACK_FIX]: step = Step.objects.get(id=ticket_data['back_step']) wp.step = step diff --git a/hb_server/apps/wpm/urls.py b/hb_server/apps/wpm/urls.py index 57db6b9..77d91f7 100644 --- a/hb_server/apps/wpm/urls.py +++ b/hb_server/apps/wpm/urls.py @@ -3,11 +3,12 @@ from rest_framework import urlpatterns from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.wpm.views import DoFormInit, DoFormSubmit, OperationEquipViewSet, OperationMaterialInputViewSet, OperationMaterialOutputViewSet, OperationMaterialToolViewSet, OperationRecordViewSet, OperationViewSet, OperationWproductViewSet, WMaterialViewSet, WPlanViewSet, WProductViewSet +from apps.wpm.views import DoFormInit, DoFormSubmit, OperationEquipViewSet, OperationMaterialInputViewSet, OperationMaterialOutputViewSet, OperationMaterialToolViewSet, OperationRecordViewSet, OperationViewSet, OperationWproductViewSet, WMaterialViewSet, WPlanViewSet, WProductViewSet, WproductTicketViewSet router = DefaultRouter() router.register('wmaterial', WMaterialViewSet, basename='wmaterial') router.register('wproduct', WProductViewSet, basename='wproduct') +router.register('wproduct_ticket', WproductTicketViewSet, basename='wproduct_ticket') router.register('operation', OperationViewSet, basename='operation') router.register('operation_wproduct', OperationWproductViewSet, basename='operation_wproduct') router.register('operation_equip', OperationEquipViewSet, basename='operation_equip') diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 9a743f8..c446a47 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -20,9 +20,9 @@ from rest_framework.decorators import action from apps.wf.models import Workflow from apps.wf.serializers import WorkflowSimpleSerializer from apps.wpm.filters import WMaterialFilterSet, WProductFilterSet -from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem +from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket -from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer +from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -406,6 +406,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): raise exceptions.APIException('该产品不可发起不合格审理') workflow = Workflow.objects.filter(name='不合格品审理单', is_deleted=False).first() if workflow: + test_record = TestRecord.objects.filter(wproduct=obj, is_deleted=False, is_testok=False).order_by('-id').first() exist_data = { 'wproduct':obj.id, 'wproduct_number':obj.number, @@ -413,6 +414,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): 'wproduct_specification':obj.material.specification, 'finder':request.user.id, 'find_process':obj.step.process.id, + 'tester':test_record.create_by.id } ret = {'workflow':workflow.id} ret['exist_data'] = exist_data @@ -422,8 +424,16 @@ class WProductViewSet(ListModelMixin, GenericViewSet): - - +class WproductTicketViewSet(ListModelMixin, GenericViewSet): + """ + 玻璃审批工单 + """ + perms_map={'*':'*'} + queryset = WprouctTicket.objects.select_related('step', 'material', 'subproduction_plan', 'resp_process') + serializer_class = WproductTicketListSerializer + filterset_fields = ['step', 'material', 'subproduction_plan', 'resp_process'] + ordering_fields = ['id'] + ordering = ['-id'] class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet): From 319b2285081a9b748035e21e313679b71dd6067d Mon Sep 17 00:00:00 2001 From: shijing Date: Thu, 30 Dec 2021 17:13:32 +0800 Subject: [PATCH 2/2] 1230 --- hb_client/package.json | 1 + .../src/components/customForm/review.vue | 22 +- hb_client/src/views/dashboard/index.vue | 232 +++++++++++++++++- hb_client/src/views/wpm/need.vue | 6 +- 4 files changed, 238 insertions(+), 23 deletions(-) diff --git a/hb_client/package.json b/hb_client/package.json index 1ea5514..c429f8b 100644 --- a/hb_client/package.json +++ b/hb_client/package.json @@ -23,6 +23,7 @@ "d3": "^5.14.2", "dagre-d3": "^0.6.4", "dhtmlx-gantt": "^6.2.1", + "echarts": "^4.2.0-rc.2", "element-ui": "^2.15.5", "file-saver": "^2.0.2", "fuse.js": "^6.4.6", diff --git a/hb_client/src/components/customForm/review.vue b/hb_client/src/components/customForm/review.vue index 55a85b5..ef38722 100644 --- a/hb_client/src/components/customForm/review.vue +++ b/hb_client/src/components/customForm/review.vue @@ -282,14 +282,14 @@ that.formData.push(obj) }); that.formData=[...that.formData]; - debugger; - console.log(that.formData) + // debugger; + console.log(that.formData); //当前表的数据存储 for(let i=0;i { @@ -310,15 +310,15 @@ let imag= this.formData.filter(item => { return item.field_type === 'draw'; }); - that.img = 'http://47.95.0.242:2222'+imag[0].draw_template; + // that.img = 'http://47.95.0.242:2222'+imag[0].draw_template; /*let originImag= this.origins.filter(item => { return item.field_type === 'draw'; });*/ - that.originImg = new Image(); + /*that.originImg = new Image(); that.originImg.crossOrigin = ''; that.originImg = imag[0].origin_value; - +*/ listJudge.forEach(item => { let obj = new Object(); obj = item; @@ -786,14 +786,16 @@ fieldData(isSubmit){ let that = this; that.field = []; //检查项目 - debugger; + // debugger; let submit = isSubmit=='1'?false:true; that.formData.forEach((item) => { - let field_value = 0; + let field_value = null; if(item.field_type==='int'){ field_value = parseInt(that.checkForm[item.field_key]) }else if(item.field_type==='float'){ field_value = parseFloat(that.checkForm[item.field_key]) + }else{ + field_value = that.checkForm[item.field_key]; } that.field.push({ id: item.id, @@ -805,7 +807,7 @@ that.testrecord.record_data = that.field;//检查项列表 that.testrecord.is_testok = that.is_testok;//检查表检查结果 that.testrecord.id = that.recordId; - debugger; + // debugger; if(submit){//提交 this.$emit('recordSubmit',that.testrecord); }else {//保存 diff --git a/hb_client/src/views/dashboard/index.vue b/hb_client/src/views/dashboard/index.vue index 1a662f6..8a61f1e 100644 --- a/hb_client/src/views/dashboard/index.vue +++ b/hb_client/src/views/dashboard/index.vue @@ -1,6 +1,6 @@ diff --git a/hb_client/src/views/wpm/need.vue b/hb_client/src/views/wpm/need.vue index eb683c5..885df54 100644 --- a/hb_client/src/views/wpm/need.vue +++ b/hb_client/src/views/wpm/need.vue @@ -979,6 +979,7 @@ //点击记录里的检验 handleInspectionRecord(scope){ let that =this; + that.fieldList = []; that.recordVisible = false; that.recordId = scope.row.id; that.recordform = scope.row.form; @@ -1033,7 +1034,6 @@ obj.is_testok = null; for (let j = 0; j < originList.length; j++) { if (fieldList[i].field_key === originList[j].field_key) { - obj.id = originList[j].id; obj.is_testok = originList[j].is_testok; obj.field_value = originList[j].field_value; obj.origin_value = originList[j].field_value; @@ -1056,6 +1056,7 @@ //点击记录里的查看 handleRecordDetail(scope){ let that = this; + that.fieldList = []; that.recordVisible = false; that.recordId = scope.row.id; that.recordform = scope.row.form; @@ -1098,6 +1099,7 @@ //半产品复检 handleReview() { let that = this; + that.fieldList = []; testInit({ wproduct: this.wproduct,form: that.recordform}).then((response) => { if (response.data) { that.hasPicture = false; @@ -1111,7 +1113,6 @@ obj.is_testok = null; for (let j = 0; j < originList.length; j++) { if (fieldList[i].field_key === originList[j].field_key) { - obj.id = originList[j].id; obj.is_testok = originList[j].is_testok; obj.field_value = originList[j].field_value; obj.origin_value = originList[j].field_value; @@ -1136,6 +1137,7 @@ submitrecordform(index) { let that = this; this.outerVisible = false; + that.fieldList = []; if (that.recordform != "") { if(index==='1'){//非复检 testInit({ wproduct: that.wproduct,form: that.recordform}).then((response) => {