From a65dba31856fa48fa27c071018c84658774a1c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Tue, 6 Sep 2022 17:53:12 +0800 Subject: [PATCH] =?UTF-8?q?employee=20blt=20relate=20name=20=E6=97=A0?= =?UTF-8?q?=E5=BF=85=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/develop/views.py | 42 ++++++++++++++++++- apps/ecm/filters.py | 6 +-- .../migrations/0004_alter_tdevice_employee.py | 20 +++++++++ apps/third/models.py | 2 +- apps/third/views_d.py | 5 +++ apps/vm/views.py | 2 +- apps/wf/views.py | 11 ++++- 7 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 apps/third/migrations/0004_alter_tdevice_employee.py diff --git a/apps/develop/views.py b/apps/develop/views.py index 166d2cb1..52d302b1 100755 --- a/apps/develop/views.py +++ b/apps/develop/views.py @@ -17,6 +17,9 @@ from apps.utils.speech import generate_voice from apps.utils.viewsets import CustomGenericViewSet from apps.utils.wx import wxClient +from apps.wf.models import State, Transition, Workflow +from django.db import transaction +from apps.utils.snowflake import idWorker # Create your views here. @@ -188,7 +191,8 @@ class TestViewSet(CustomGenericViewSet): # 'alarmDate': '1661942981', 'alarmGrade': 2, 'isSave': True, 'unitType': 1, 'unitSeq': 0, 'extend': {'params': {'ObjectType': 'Human', 'GroupId': 30.0, 'ObjectSubType': ''}, 'objectSubType': ''}, 'alarmType': 964, 'channelSeq': 0, 'orgCode': '001', 'channelName': '192.168.10.155_视频通道_1', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'admin', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} # data = {'id': 1662026969203, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': '44df73ba-a423-4479-af70-1f930b00a7e0', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_27257520_27264993.jpg', 'nodeType': 2, 'alarmDate': '1662026965', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_27257520_27264993.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_27264993_27338395.jpg'], 'groupName': '全体人员', 'similarity': 97, 'sex': 1, 'cardType': 1, 'name': '曹前明', 'devPersonId': '48', 'id': '342422199004040175', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_26915031_27257520.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662026965, 'endTime': 1662026965, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} # data = {'id': 1662032288888, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$25', 'deviceCode': '1000038', 'alarmCode': 'c3df59cd-59d0-4f46-a32c-d2bf7778b37d', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44280859_44288676.jpg', 'nodeType': 2, 'alarmDate': '1662032288', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44280859_44288676.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44127174_44280859.jpg', 'eye': 0, 'alarmType': 1001000, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 25, 'szSerialUUID': '', 'channelName': '公司大门口', 'beginTime': 1662032284, 'endTime': 1662032284, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001000, 'channelSeq': 25, 'orgCode': '001001001', 'channelName': '公司大门口', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} - data = {'id': 1662099853937, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': 'c520e09f-4b5d-4d04-be7b-005386a9b835', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg', 'nodeType': 2, 'alarmDate': '1662099849', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57329128_57402530.jpg'], 'groupName': '全体人员', 'similarity': 99, 'sex': 1, 'cardType': 1, 'name': '曹前明', 'devPersonId': '48', 'id': '342422199004040175', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_56995669_57321861.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662099849, 'endTime': 1662099849, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} + data = {'id': 1662099853937, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': 'c520e09f-4b5d-4d04-be7b-005386a9b835', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg', 'nodeType': 2, 'alarmDate': '1662099849', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [ + '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57329128_57402530.jpg'], 'groupName': '全体人员', 'similarity': 99, 'sex': 1, 'cardType': 1, 'name': '曹前明', 'devPersonId': '48', 'id': '342422199004040175', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_56995669_57321861.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662099849, 'endTime': 1662099849, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} dispatch_dahua_event(data=data) return Response() @@ -220,7 +224,41 @@ class TestViewSet(CustomGenericViewSet): res = wxClient.send_tem_msg(data=data) return Response(res) - @action(methods=['post'], detail=False, serializer_class=CleanDataSerializer) + @action(methods=['post'], detail=False, serializer_class=Serializer, permission_classes=[]) + @transaction.atomic + def correct_data(self, request, pk=None): + """修正数据 + + 修正数据 + """ + for i in Transition.objects.all(): + if i.condition_expression: + pass + else: + i.condition_expression = [] + i.save() + # wf = Workflow.objects.get(id='1544859644185415680') + # objs = Workflow.objects.filter(key__istartswith='opl_').exclude(id='1544859644185415680') + # for i in objs: + # for s in State.objects.filter(workflow=wf): + # sta = State() + # sta.id = idWorker.get_id() + # sta.workflow = i + # for f in State._meta.fields: + # if f.name not in ['workflow', 'create_time', 'update_time', 'id']: + # setattr(sta, f.name, getattr(s, f.name)) + # sta.save() + # for t in Transition.objects.filter(workflow=wf): + # tr = Transition() + # tr.id = idWorker.get_id() + # tr.workflow = i + # for f in Transition._meta.fields: + # if f.name not in ['workflow', 'create_time', 'update_time', 'id']: + # setattr(tr, f.name, getattr(t, f.name)) + # tr.save() + return Response() + + @action(methods=['post'], detail=False, serializer_class=CleanDataSerializer, permission_classes=[IsAdminUser]) def clean_data(self, request, pk=None): """清空数据 diff --git a/apps/ecm/filters.py b/apps/ecm/filters.py index 15a5d0c6..6d8d37c3 100644 --- a/apps/ecm/filters.py +++ b/apps/ecm/filters.py @@ -3,13 +3,13 @@ from apps.ecm.models import Event class EventFilterSet(filters.FilterSet): - start_create = filters.DateFilter(field_name="create_time", lookup_expr='gte') - end_create = filters.DateFilter(field_name="create_time", lookup_expr='lte') + start_create = filters.DateTimeFilter(field_name="create_time", lookup_expr='gte') + end_create = filters.DateTimeFilter(field_name="create_time", lookup_expr='lte') is_handled = filters.BooleanFilter(method='filter_is_handled') class Meta: model = Event - fields = ['cates', 'start_create', 'end_create', 'is_handled'] + fields = ['cates', 'start_create', 'end_create', 'is_handled', 'area'] def filter_is_handled(self, queryset, name, value): if value: # 我的 diff --git a/apps/third/migrations/0004_alter_tdevice_employee.py b/apps/third/migrations/0004_alter_tdevice_employee.py new file mode 100644 index 00000000..a650fdca --- /dev/null +++ b/apps/third/migrations/0004_alter_tdevice_employee.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-09-06 09:52 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('hrm', '0003_alter_employee_type'), + ('third', '0003_alter_tdevice_employee'), + ] + + operations = [ + migrations.AlterField( + model_name='tdevice', + name='employee', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hrm.employee', verbose_name='当前绑定人员'), + ), + ] diff --git a/apps/third/models.py b/apps/third/models.py index 4d15f6fa..8748e032 100755 --- a/apps/third/models.py +++ b/apps/third/models.py @@ -41,7 +41,7 @@ class TDevice(BaseModel): related_name='tareas', blank=True) obj_cate = models.CharField('绑定对象', max_length=20, help_text='people/...', null=True, blank=True) employee = models.OneToOneField(Employee, verbose_name='当前绑定人员', on_delete=models.SET_NULL, - null=True, blank=True, related_name='ep_tdevice') + null=True, blank=True) is_clock = models.BooleanField('是否打卡设备', default=False) access_list = models.JSONField('自动下发人员类型', default=list, null=False, blank=True, help_text='employee/remployee/visitor') diff --git a/apps/third/views_d.py b/apps/third/views_d.py index 6b601e26..fb2d74b7 100644 --- a/apps/third/views_d.py +++ b/apps/third/views_d.py @@ -35,6 +35,7 @@ class BltViewSet(CustomGenericViewSet): ret['count_employee'] = qs.filter(employee__type='employee').count() ret['count_remployee'] = qs.filter(employee__type='remployee').count() ret['count_visitor'] = qs.filter(employee__type='visitor').count() + ret['count_driver'] = qs.filter(employee__type='driver').count() return Response(ret) @action(methods=['get'], detail=False, perms_map={'get': '*'}) @@ -274,12 +275,16 @@ class TDeviceViewSet(ListModelMixin, UpdateModelMixin, DestroyModelMixin, Custom blt.obj_cate = 'people' blt.save() vdata['obj_cate'] = 'people' + vdata.pop('code') + vdata['blt'] = blt BltBind.objects.create(**vdata) elif vdata['type'] == BltBind.BLT_UNBIND: if blt.employee: blt.employee = None blt.save() vdata['obj_cate'] = 'people' + vdata.pop('code') + vdata['blt'] = blt BltBind.objects.create(**vdata) else: raise ParseError('该定位卡在系统中不存在') diff --git a/apps/vm/views.py b/apps/vm/views.py index 7a1ec97f..15f36bdc 100644 --- a/apps/vm/views.py +++ b/apps/vm/views.py @@ -27,7 +27,7 @@ class VisitViewSet(CustomModelViewSet): update_serializer_class = VisitCreateUpdateSerializer serializer_class = VisitSerializer retrieve_serializer_class = VisitDetailSerializer - filterset_fields = ['state', 'create_by'] + filterset_fields = ['state', 'create_by', 'purpose'] select_related_fields = ['ticket', 'receptionist', 'ticket__workflow', 'ticket__state'] def get_queryset(self): diff --git a/apps/wf/views.py b/apps/wf/views.py index 023d7cf9..b83ebe2c 100755 --- a/apps/wf/views.py +++ b/apps/wf/views.py @@ -62,7 +62,7 @@ class WorkflowViewSet(CustomModelViewSet): search_fields = ['name', 'description'] filterset_fields = [] ordering_fields = ['create_time'] - ordering = ['-create_time'] + ordering = ['key', '-create_time'] @action(methods=['get'], detail=True, perms_map={'get': 'workflow.update'}, pagination_class=None, serializer_class=StateSerializer) @@ -117,6 +117,15 @@ class WorkflowViewSet(CustomModelViewSet): ret['field_list'] = field_list return Response(ret) + @action(methods=['post'], detail=True, perms_map={'post': 'workflow.clone'}, + pagination_class=None, serializer_class=Serializer) + def clone(self, request, pk=None): + """工作流复制 + + 工作流复制 + """ + pass + class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet): perms_map = {'get': '*', 'post': 'workflow.update',