From 068474f4e6aec75c335a4f56e832bd57ca9237ed Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 14:56:43 +0800 Subject: [PATCH 1/9] =?UTF-8?q?refector:=20rpjmember=20destory=E6=94=B9?= =?UTF-8?q?=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rpm/views.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/rpm/views.py b/apps/rpm/views.py index 3b05e084..ad76fbe0 100644 --- a/apps/rpm/views.py +++ b/apps/rpm/views.py @@ -224,10 +224,8 @@ class RpjmemberViewSet(CustomModelViewSet): def destroy(self, request, *args, **kwargs): obj = self.get_object() - if obj.rpj.state in [Rpj.RPJ_DONE, Rpj.RPJ_CLOSE]: + if obj.rpj.state != Rpj.RPJ_CREATE: raise ParseError('成员在该状态不可删除') - else: - pass return super().destroy(request, *args, **kwargs) @action(methods=['post'], detail=True, perms_map={'post': 'rpj.update'}) From 9d7739ae59dbdd49a180b0926eca8efcd71ea0aa Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 15:31:20 +0800 Subject: [PATCH 2/9] =?UTF-8?q?fix:=20=E6=88=90=E5=91=98=E7=A6=BB=E5=8E=82?= =?UTF-8?q?=E6=9C=89=E9=99=90=E5=88=B6/=E5=A4=A7=E5=8D=8E=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E6=89=8D=E6=A0=A1=E9=AA=8C=E5=9B=BE=E7=89=87=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rpm/serializers.py | 7 +++++-- apps/rpm/views.py | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/rpm/serializers.py b/apps/rpm/serializers.py index da2251c0..4cc4ddaa 100644 --- a/apps/rpm/serializers.py +++ b/apps/rpm/serializers.py @@ -16,6 +16,7 @@ from apps.utils.tools import check_id_number_e, check_phone_e from apps.wf.serializers import TicketSimpleSerializer from apps.rpm.services import rpj_member_come, rpj_certificate_in from apps.rpm.models import RpjLog +from django.conf import settings class RpartyCreateUpdateSerializer(CustomModelSerializer): @@ -145,7 +146,8 @@ class RemployeeCreateSerializer(CustomModelSerializer): if Remployee.objects.filter(id_number=validated_data['id_number'], rparty=validated_data['rparty']).exists(): raise ValidationError('该成员已存在') with transaction.atomic(): - dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) + if settings.DAHUA_ENABLED: + dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) return super().create(validated_data) @@ -157,7 +159,8 @@ class RemployeeUpdateSerializer(CustomModelSerializer): def update(self, instance, validated_data): with transaction.atomic(): - dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) + if settings.DAHUA_ENABLED: + dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) return super().update(instance, validated_data) class RemployeeSimpleSerializer(CustomModelSerializer): diff --git a/apps/rpm/views.py b/apps/rpm/views.py index ad76fbe0..f41c7920 100644 --- a/apps/rpm/views.py +++ b/apps/rpm/views.py @@ -236,6 +236,11 @@ class RpjmemberViewSet(CustomModelViewSet): 提前离厂 """ obj = self.get_object() + rpj = obj.rpj + if rpj.state != Rpj.RPJ_WORKING: + raise ParseError('成员非进行状态不可离厂') + obj.note = '提前离厂' + obj.save() rpj_member_leave(obj) RpjLog.objects.create(rpj=obj.rpj, operation='member_leave', remployee=obj.remployee, create_by=request.user, reason=request.data.get('reason', '')) return Response() From 1966dde2c03bcd0a3f15fb973c8c39b42429fa84 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 16:20:50 +0800 Subject: [PATCH 3/9] =?UTF-8?q?fix:=20=E6=88=90=E5=91=98=E7=A6=BB=E5=8E=82?= =?UTF-8?q?=E6=9C=89=E9=99=90=E5=88=B62?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rpm/serializers.py | 4 ++-- apps/rpm/views.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/rpm/serializers.py b/apps/rpm/serializers.py index 4cc4ddaa..31021732 100644 --- a/apps/rpm/serializers.py +++ b/apps/rpm/serializers.py @@ -222,7 +222,7 @@ class RpjmemberCreateSerializer(CustomModelSerializer): def create(self, validated_data): rpj = validated_data['rpj'] if rpj.state in [Rpj.RPJ_DONE, Rpj.RPJ_CLOSE]: - raise ParseError('成员该项目状态不可新增') + raise ParseError('该项目状态成员不可新增') rcertificates = validated_data.pop('rcertificates') remployee = validated_data['remployee'] if remployee.phone and remployee.photo and remployee.id_number: @@ -268,7 +268,7 @@ class RpjmemberUpdateSerializer(CustomModelSerializer): def update(self, instance, validated_data): rpj = validated_data['rpj'] if rpj.state in [Rpj.RPJ_DONE, Rpj.RPJ_CLOSE]: - raise ParseError('成员该项目状态不可修改') + raise ParseError('该项目状态成员不可修改') rcertificates = validated_data.pop('rcertificates') with transaction.atomic(): ins = super().update(instance, validated_data) diff --git a/apps/rpm/views.py b/apps/rpm/views.py index f41c7920..7335b0f7 100644 --- a/apps/rpm/views.py +++ b/apps/rpm/views.py @@ -205,7 +205,7 @@ class RpjViewSet(CustomModelViewSet): if obj.state in [Rpj.RPJ_ENTER, Rpj.RPJ_DONE]: raise ParseError('该项目不可删除') elif obj.state == Rpj.RPJ_WORKING and Remployee.objects.filter(rpj=obj).exists(): - raise ParseError('该项目人员在厂不可删除') + raise ParseError('该项目下有成员在厂不可删除') if obj.ticket: obj.ticket.delete() obj.delete() @@ -237,8 +237,8 @@ class RpjmemberViewSet(CustomModelViewSet): """ obj = self.get_object() rpj = obj.rpj - if rpj.state != Rpj.RPJ_WORKING: - raise ParseError('成员非进行状态不可离厂') + if rpj.state != [Rpj.RPJ_WORKING, Rpj.RPJ_ENTER]: + raise ParseError('该项目状态成员不可离厂') obj.note = '提前离厂' obj.save() rpj_member_leave(obj) From 503953bb116b3a46733cdd6fbe843cd0ba99e8d3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 16:23:56 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix:=20=E6=88=90=E5=91=98=E7=A6=BB=E5=8E=82?= =?UTF-8?q?=E6=9C=89=E9=99=90=E5=88=B62?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rpm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rpm/views.py b/apps/rpm/views.py index 7335b0f7..93d2229c 100644 --- a/apps/rpm/views.py +++ b/apps/rpm/views.py @@ -237,7 +237,7 @@ class RpjmemberViewSet(CustomModelViewSet): """ obj = self.get_object() rpj = obj.rpj - if rpj.state != [Rpj.RPJ_WORKING, Rpj.RPJ_ENTER]: + if rpj.state not in [Rpj.RPJ_WORKING, Rpj.RPJ_ENTER]: raise ParseError('该项目状态成员不可离厂') obj.note = '提前离厂' obj.save() From ce90e11c361c591efa4c8b450ba4829b0a15689d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 16:38:51 +0800 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20idempotent=20=E5=8A=A0=E5=85=A5reque?= =?UTF-8?q?st=5Fpath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/utils/decorators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/utils/decorators.py b/apps/utils/decorators.py index 49ab4e1f..4a01ab13 100644 --- a/apps/utils/decorators.py +++ b/apps/utils/decorators.py @@ -32,7 +32,7 @@ def idempotent(seconds=4): def wrapper(*args, **kwargs): rdata = args[1].data rdata['request_userid'] = getattr(args[1], 'user').id - print(getattr(args[1], 'user'), rdata) + rdata['request_path'] = getattr(args[1], 'path') hash_k = hash(json.dumps(rdata)) hash_v_e = cache.get(hash_k, None) if hash_v_e is None: From 49abd43cf381f4e3353c7689acf4d2d4e7fe94e1 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 16:39:21 +0800 Subject: [PATCH 6/9] =?UTF-8?q?fix:=20=E8=AF=A5=E9=A1=B9=E7=9B=AE=E6=88=90?= =?UTF-8?q?=E5=91=98=E5=B7=B2=E5=81=9A=E7=A6=BB=E5=8E=82=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rpm/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/rpm/views.py b/apps/rpm/views.py index 93d2229c..329155e0 100644 --- a/apps/rpm/views.py +++ b/apps/rpm/views.py @@ -228,7 +228,7 @@ class RpjmemberViewSet(CustomModelViewSet): raise ParseError('成员在该状态不可删除') return super().destroy(request, *args, **kwargs) - @action(methods=['post'], detail=True, perms_map={'post': 'rpj.update'}) + @action(methods=['put'], detail=True, perms_map={'put': 'rpj.update'}) @transaction.atomic def leave(self, request, pk=None): """提前离厂 @@ -239,6 +239,8 @@ class RpjmemberViewSet(CustomModelViewSet): rpj = obj.rpj if rpj.state not in [Rpj.RPJ_WORKING, Rpj.RPJ_ENTER]: raise ParseError('该项目状态成员不可离厂') + if RpjLog.objects.filter(rpj=rpj, remployee=obj.remployee, operation='member_leave').exists(): + raise ParseError('该项目成员已做离厂操作') obj.note = '提前离厂' obj.save() rpj_member_leave(obj) From 1ed0a2542e73f71dc396bf4bab08733bbb9d1d69 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 17:34:42 +0800 Subject: [PATCH 7/9] =?UTF-8?q?fix:=20=E5=85=A5=E5=8E=82=E5=90=8E=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E5=90=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rpm/services.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/rpm/services.py b/apps/rpm/services.py index a13abe5f..0438241c 100644 --- a/apps/rpm/services.py +++ b/apps/rpm/services.py @@ -112,7 +112,9 @@ def rpj_member_come(i: Rpjmember): # 给相关方人员创建账户 user_e = ep.user if user_e: # 如果该人员有账户 - pass + user_e.is_active = True + user_e.is_deleted = False + user_e.save() else: user_e = User.objects.get_queryset(all=True).filter(phone=rep.phone).first() # 看看有没有存在的账户 if user_e: From e0210c4bef5c18d690a2468a30373cf0ea5f1a2b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 17:49:33 +0800 Subject: [PATCH 8/9] =?UTF-8?q?fix:=20=E6=89=93=E5=8D=A1=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=AF=BC=E5=87=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hrm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hrm/views.py b/apps/hrm/views.py index 358f8c61..26041945 100755 --- a/apps/hrm/views.py +++ b/apps/hrm/views.py @@ -251,7 +251,7 @@ class ClockRecordViewSet(ListModelMixin, CustomGenericViewSet): i['detail'].get('deviceName', None), i['create_time']], crOptions[i['type']], - crEoptions[i['exception_type']] + crEoptions[i['exception_type']] if i['exception_type'] else '' ) return Response({'path': export_excel(field_data, data, '打卡记录')}) From a046fa46f0657c5ed5396dcb7f19ceb8a6f6c3b0 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 24 Mar 2023 17:52:37 +0800 Subject: [PATCH 9/9] =?UTF-8?q?fix:=20=E6=89=93=E5=8D=A1=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=AF=BC=E5=87=BAbug2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hrm/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/hrm/views.py b/apps/hrm/views.py index 26041945..91367442 100755 --- a/apps/hrm/views.py +++ b/apps/hrm/views.py @@ -249,9 +249,9 @@ class ClockRecordViewSet(ListModelMixin, CustomGenericViewSet): i['employee_']['id_number'], i['employee_'].get('belong_dept_name', ''), i['detail'].get('deviceName', None), - i['create_time']], + i['create_time'], crOptions[i['type']], - crEoptions[i['exception_type']] if i['exception_type'] else '' + crEoptions[i['exception_type']] if i['exception_type'] else ''] ) return Response({'path': export_excel(field_data, data, '打卡记录')})