From 6805669f47783e6132e9c5a0411fd29448d0ab5c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 6 Sep 2021 08:53:26 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E5=BA=8F?= =?UTF-8?q?=E6=8E=92=E5=88=97=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/serializers.py | 2 +- hb_server/apps/mtm/views.py | 9 ++++++++ hb_server/apps/wf/models.py | 3 +++ hb_server/apps/wf/serializers.py | 16 ++++++++++++++- hb_server/apps/wf/services.py | 3 ++- hb_server/apps/wf/views.py | 34 +++++++++++++++++++++---------- 6 files changed, 53 insertions(+), 14 deletions(-) diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 1440aaa..428af15 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -18,7 +18,7 @@ class MaterialDetailSerializer(serializers.ModelSerializer): fields = '__all__' def get_processes_(self, obj): - objs = Process.objects.filter(id__in=obj.processes) + objs = Process.objects.filter(id__in=obj.processes).order_by('number') return ProcessSimpleSerializer(instance=objs, many=True).data diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index 11c3927..c21c08f 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -156,6 +156,15 @@ class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet elif self.action == 'update': return RecordFormUpdateSerializer return RecordFormSerializer + + @action(methods=['get'], detail=True, perms_map={'get':'*'}, pagination_class=None, serializer_class=RecordFormFieldSerializer) + def fields(self, request, pk=None): + """ + 表格下的字段 + """ + instance = self.get_object() + serializer = self.serializer_class(instance=RecordFormField.objects.filter(form=instance, is_deleted=False), many=True) + return Response(serializer.data) class RecordFormFieldViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet): diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index 2591a75..740928c 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -79,6 +79,9 @@ class Transition(CommonAModel): """ 工作流流转,定时器,条件(允许跳过), 条件流转与定时器不可同时存在 """ + TRANSITION_ATTRIBUTE_TYPE_ACCEPT = 1 # 同意 + TRANSITION_ATTRIBUTE_TYPE_REFUSE = 2 # 拒绝 + TRANSITION_ATTRIBUTE_TYPE_OTHER = 3 # 其他 attribute_type_choices = ( (1, '同意'), (2, '拒绝'), diff --git a/hb_server/apps/wf/serializers.py b/hb_server/apps/wf/serializers.py index d4ca696..eedf40c 100644 --- a/hb_server/apps/wf/serializers.py +++ b/hb_server/apps/wf/serializers.py @@ -1,7 +1,8 @@ +from apps.system.serializers import UserSimpleSerializer import rest_framework from rest_framework import serializers -from .models import State, Ticket, Workflow, Transition, CustomField +from .models import State, Ticket, TicketFlow, Workflow, Transition, CustomField class WorkflowSerializer(serializers.ModelSerializer): @@ -42,6 +43,10 @@ class CustomFieldSerializer(serializers.ModelSerializer): model = CustomField fields = '__all__' +class TicketSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = Ticket + fields = '__all__' class TicketCreateSerializer(serializers.ModelSerializer): transition = serializers.IntegerField(label='流转ID') @@ -65,3 +70,12 @@ class TicketSerializer(serializers.ModelSerializer): def setup_eager_loading(queryset): queryset = queryset.select_related('workflow','state') return queryset + +class TicketFlowSerializer(serializers.ModelSerializer): + participant_ = UserSimpleSerializer(source='participant', read_only=True) + state_ = StateSimpleSerializer(source='state', read_only=True) + class Meta: + model = TicketFlow + fields = '__all__' + + \ No newline at end of file diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index d17de32..06ce023 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -1,3 +1,4 @@ +from apps.wf.serializers import TicketSerializer, TicketSimpleSerializer from typing import Tuple from apps.system.models import User from apps.wf.models import CustomField, State, Ticket, Transition, Workflow @@ -198,7 +199,7 @@ class WfService(object): :return: """ # 获取工单基础表中的字段中的字段信息 - field_info_dict = ticket.get_dict() + field_info_dict = TicketSimpleSerializer(instance=ticket).data # 获取自定义字段的值 custom_fields_queryset = cls.get_workflow_custom_fields(ticket.workflow) for i in custom_fields_queryset: diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index 0823dca..40732c8 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -2,7 +2,7 @@ from django.core.exceptions import AppRegistryNotReady from rest_framework.response import Response from rest_framework import serializers from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin -from apps.wf.serializers import CustomFieldSerializer, StateSerializer, TicketCreateSerializer, TicketSerializer, TransitionSerializer, WorkflowSerializer +from apps.wf.serializers import CustomFieldSerializer, StateSerializer, TicketCreateSerializer, TicketFlowSerializer, TicketSerializer, TransitionSerializer, WorkflowSerializer from django.shortcuts import get_object_or_404, render from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.decorators import action, api_view @@ -116,7 +116,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin if value == State.STATE_FIELD_REQUIRED: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) - ticket = serializer.save(state=start_state) # 先创建出来 + ticket = serializer.save(state=start_state, create_by=request.user) # 先创建出来 next_state = WfService.get_next_state_by_transition_and_ticket_info(ticket=ticket, transition=transition) participant_info = WfService.get_ticket_state_participant_info(state=next_state, ticket=ticket, ticket_data=ticket.ticket_data) destination_participant_type = participant_info.get('destination_participant_type', 0) @@ -134,7 +134,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin if title_template: all_ticket_data = {**rdata, **rdata['ticket_data']} title = title_template.format(**all_ticket_data) - # 更新工单 + # 更新一下信息 ticket.sn=sn ticket.title=title ticket.state=next_state @@ -146,7 +146,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin # 新增流转记录 TicketFlow.objects.create(ticket=ticket, state=start_state, ticket_data=WfService.get_ticket_all_field_value(ticket), suggestion=rdata.get('suggestion',''), participant_type=State.PARTICIPANT_TYPE_PERSONAL, - participant=ticket.create_by, transition=transition, create_by=request.user) + participant=ticket.create_by, transition=transition) return Response(TicketSerializer(instance=ticket).data) @@ -204,14 +204,14 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin ticket.participant = destination_participant ticket.multi_all_person = multi_all_person if destination_state.type == State.STATE_TYPE_END: - ticket.act_state = State.TICKET_ACT_STATE_FINISH + ticket.act_state = Ticket.TICKET_ACT_STATE_FINISH elif destination_state.type == State.STATE_TYPE_START: - ticket.act_state = State.TICKET_ACT_STATE_DRAFT + ticket.act_state = Ticket.TICKET_ACT_STATE_DRAFT else: - ticket.act_state = State.TICKET_ACT_STATE_ONGOING + ticket.act_state = Ticket.TICKET_ACT_STATE_ONGOING - if transition.attribute_type == State.TRANSITION_ATTRIBUTE_TYPE_REFUSE: - transition.act_state = State.TICKET_ACT_STATE_BACK + if transition.attribute_type == Transition.TRANSITION_ATTRIBUTE_TYPE_REFUSE: + transition.act_state = Ticket.TICKET_ACT_STATE_BACK # 只更新必填和可选的字段 for key, value in ticket.state.state_fields.items(): @@ -223,7 +223,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin # 更新工单流转记录 TicketFlow.objects.create(ticket=ticket, state=source_state, ticket_data=WfService.get_ticket_all_field_value(ticket), suggestion=data.get('suggestion',''), participant_type=State.PARTICIPANT_TYPE_PERSONAL, - participant=request.user, transition=transition, create_by=request.user) + participant=request.user, transition=transition) return Response(TicketSerializer(instance=ticket).data) @@ -243,4 +243,16 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin """ ticket = self.get_object() transitions = WfService.get_ticket_transitions(ticket) - return Response(TransitionSerializer(instance=transitions, many=True).data) \ No newline at end of file + return Response(TransitionSerializer(instance=transitions, many=True).data) + + +class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): + """ + 工单日志 + """ + perms_map = {'*':'*'} + queryset = TicketFlow.objects.all() + serializer_class = TicketFlowSerializer + search_fields = ['suggestion'] + filterset_fields = ['paticipant', 'state', 'ticket'] + ordering = ['-create_time'] \ No newline at end of file From 55a266808f4751e293bcf98955a175bbe3ff386d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 6 Sep 2021 09:07:55 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=AD=90=E5=B7=A5=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=8A=A0=E8=AE=BE=E5=A4=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/views.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index c21c08f..d218d7b 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -62,7 +62,7 @@ class ProcessViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet): serializer = self.serializer_class(instance=Step.objects.filter(process=process, is_deleted=False), many=True) return Response(serializer.data) -class StepViewSet(CreateUpdateModelAMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): +class StepViewSet(OptimizationMixin, CreateUpdateModelAMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): """ 子工序-增删改查 """ @@ -74,9 +74,7 @@ class StepViewSet(CreateUpdateModelAMixin, CreateModelMixin, UpdateModelMixin, R ordering = ['sort'] def get_serializer_class(self): - if self.action == 'retrieve': - return StepDetailSerializer - return StepSerializer + return StepDetailSerializer # class ProductProcessViewSet(PageOrNot, CreateModelMixin, UpdateModelMixin, ListModelMixin, DestroyModelMixin, GenericViewSet): # """ From 13dbd18efc1b53c1eaf9fbf011187739f7b2e4a5 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 6 Sep 2021 09:12:43 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=AD=90=E5=B7=A5=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E8=BF=94=E5=9B=9E=E8=AE=BE=E5=A4=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/views.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index d218d7b..d9c9eaf 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -53,13 +53,13 @@ class ProcessViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet): ordering_fields = ['number'] ordering = ['number'] - @action(methods=['get'], detail=True, perms_map={'get':'process_update'}, pagination_class=None, serializer_class=StepSerializer) + @action(methods=['get'], detail=True, perms_map={'get':'process_update'}, pagination_class=None, serializer_class=StepDetailSerializer) def steps(self, request, pk=None): """ 工序下的子工序 """ process = self.get_object() - serializer = self.serializer_class(instance=Step.objects.filter(process=process, is_deleted=False), many=True) + serializer = self.serializer_class(instance=Step.objects.prefetch_related('equipments').filter(process=process, is_deleted=False), many=True) return Response(serializer.data) class StepViewSet(OptimizationMixin, CreateUpdateModelAMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): @@ -74,7 +74,9 @@ class StepViewSet(OptimizationMixin, CreateUpdateModelAMixin, CreateModelMixin, ordering = ['sort'] def get_serializer_class(self): - return StepDetailSerializer + if self.action == 'retrieve': + return StepDetailSerializer + return StepSerializer # class ProductProcessViewSet(PageOrNot, CreateModelMixin, UpdateModelMixin, ListModelMixin, DestroyModelMixin, GenericViewSet): # """ From fd76f31953d807401178c69e72bbe41b7d35e115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E2=80=9Cshijing?= <“1378914240@qq.com> Date: Mon, 6 Sep 2021 11:10:44 +0800 Subject: [PATCH 4/5] markandface --- hb_client/package.json | 1 + hb_client/src/layout/components/Navbar.vue | 5 + hb_client/src/router/index.js | 21 ++ hb_client/src/views/login/index.vue | 322 ++++++++++---------- hb_client/src/views/testModel/faceLogin.vue | 184 +++++++++++ hb_client/src/views/testModel/markImage.vue | 259 ++++++++++++++++ 6 files changed, 631 insertions(+), 161 deletions(-) create mode 100644 hb_client/src/views/testModel/faceLogin.vue create mode 100644 hb_client/src/views/testModel/markImage.vue diff --git a/hb_client/package.json b/hb_client/package.json index 1c2f90c..7564ac1 100644 --- a/hb_client/package.json +++ b/hb_client/package.json @@ -25,6 +25,7 @@ "nprogress": "0.2.0", "path-to-regexp": "^6.2.0", "vue": "^2.6.14", + "vue-json-editor": "^1.4.3", "vue-router": "^3.5.2", "vuex": "^3.6.2", "xlsx": "^0.17.1" diff --git a/hb_client/src/layout/components/Navbar.vue b/hb_client/src/layout/components/Navbar.vue index d053e87..9d8cc17 100644 --- a/hb_client/src/layout/components/Navbar.vue +++ b/hb_client/src/layout/components/Navbar.vue @@ -45,6 +45,11 @@ import Breadcrumb from '@/components/Breadcrumb' import Hamburger from '@/components/Hamburger' export default { + data(){ + return{ + name:'' + } + }, components: { Breadcrumb, Hamburger diff --git a/hb_client/src/router/index.js b/hb_client/src/router/index.js index 924dfbc..795fef8 100644 --- a/hb_client/src/router/index.js +++ b/hb_client/src/router/index.js @@ -307,6 +307,27 @@ export const asyncRoutes = [ } ] }, + { + path: '/testModel', + component: Layout, + redirect: '/testModel/faceLogin/', + name: 'testModel', + meta: { title: '测试模块', icon: 'example' }, + children: [ + { + path: 'faceLogin', + name: 'faceLogin', + component: () => import('@/views/testModel/faceLogin'), + meta: { title: '人脸识别登录', icon: 'example' } + }, + { + path: 'markImage', + name: 'markImage', + component: () => import('@/views/testModel/markImage'), + meta: { title: '图片标记', icon: 'example' } + } + ] + }, // 404 page must be placed at the end !!! { path: '*', redirect: '/404', hidden: true } ] diff --git a/hb_client/src/views/login/index.vue b/hb_client/src/views/login/index.vue index 89377a9..9e606b4 100644 --- a/hb_client/src/views/login/index.vue +++ b/hb_client/src/views/login/index.vue @@ -4,7 +4,7 @@

航玻生产管理系统

- + @@ -38,10 +38,10 @@ tabindex="2" auto-complete="on" @keyup.enter.native="handleLogin" - > 登录登录 @@ -65,168 +65,168 @@ diff --git a/hb_client/src/views/testModel/faceLogin.vue b/hb_client/src/views/testModel/faceLogin.vue new file mode 100644 index 0000000..3e973e6 --- /dev/null +++ b/hb_client/src/views/testModel/faceLogin.vue @@ -0,0 +1,184 @@ + + + + + + diff --git a/hb_client/src/views/testModel/markImage.vue b/hb_client/src/views/testModel/markImage.vue new file mode 100644 index 0000000..4bbc7ec --- /dev/null +++ b/hb_client/src/views/testModel/markImage.vue @@ -0,0 +1,259 @@ + + + + From ab96880772fd059bf021d80ad448fb51869b11a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E2=80=9Cshijing?= <“1378914240@qq.com> Date: Mon, 6 Sep 2021 11:31:57 +0800 Subject: [PATCH 5/5] markandface --- hb_client/.eslintrc.js | 4 ++-- hb_client/src/views/testModel/faceLogin.vue | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hb_client/.eslintrc.js b/hb_client/.eslintrc.js index c977505..8b89500 100644 --- a/hb_client/.eslintrc.js +++ b/hb_client/.eslintrc.js @@ -13,7 +13,7 @@ module.exports = { // add your custom rules here //it is base on https://github.com/vuejs/eslint-config-vue - rules: { +/* rules: { "vue/max-attributes-per-line": [2, { "singleline": 10, "multiline": { @@ -194,5 +194,5 @@ module.exports = { objectsInObjects: false }], 'array-bracket-spacing': [2, 'never'] - } + }*/ } diff --git a/hb_client/src/views/testModel/faceLogin.vue b/hb_client/src/views/testModel/faceLogin.vue index 3e973e6..bd0ecba 100644 --- a/hb_client/src/views/testModel/faceLogin.vue +++ b/hb_client/src/views/testModel/faceLogin.vue @@ -12,11 +12,11 @@