门禁授权的bug修改

This commit is contained in:
曹前明 2022-08-22 19:28:41 +08:00
parent 6eabca5314
commit 25cd71ad59
12 changed files with 62 additions and 36 deletions

View File

@ -80,9 +80,9 @@ class EventSerializer(serializers.ModelSerializer):
employee_ = EmployeeSerializer(source='employee', read_only=True) employee_ = EmployeeSerializer(source='employee', read_only=True)
vchannel_ = TDeviceSimpleSerializer(source='vchannel', read_only=True) vchannel_ = TDeviceSimpleSerializer(source='vchannel', read_only=True)
handle_user_name = serializers.CharField(source='handle_user.name', read_only=True) handle_user_name = serializers.CharField(source='handle_user.name', read_only=True)
face_img = MyFilePathField() face_img_f = MyFilePathField(source='face_img', read_only=True)
global_img = MyFilePathField() global_img_f = MyFilePathField(source='global_img', read_only=True)
voice = MyFilePathField() voice_f = MyFilePathField(source='voice', read_only=True)
class Meta: class Meta:
model = Event model = Event

View File

@ -1,3 +1,4 @@
from datetime import datetime, timedelta
from apps.hrm.errors import PHONE_F_WRONG from apps.hrm.errors import PHONE_F_WRONG
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from rest_framework import serializers from rest_framework import serializers
@ -57,28 +58,43 @@ class EmployeeCreateUpdateSerializer(CustomModelSerializer):
@transaction.atomic @transaction.atomic
def create(self, validated_data): def create(self, validated_data):
instance = super().create(validated_data) instance = super().create(validated_data)
if settings.DAHUA_ENABLED and dhClient: if settings.DAHUA_ENABLED and dhClient and instance.type == 'employee':
# 如果是内部员工
HrmService.sync_dahua_employee(ep=instance) HrmService.sync_dahua_employee(ep=instance)
return instance return instance
def update(self, instance, validated_data): def update(self, instance, validated_data):
old_photo = instance.photo old_photo = instance.photo
old_job_state = instance.job_state
instance = super().update(instance, validated_data) instance = super().update(instance, validated_data)
if settings.DAHUA_ENABLED and dhClient:
HrmService.sync_dahua_employee(ep=instance, old_photo=old_photo)
if instance.job_state == 20 and instance.user: # 如果离职了关闭账户 if instance.job_state == 20 and instance.user: # 如果离职了关闭账户
instance.user.is_active = False instance.user.is_active = False
instance.user.save() instance.user.save()
# 同时去除门禁授权
if settings.DAHUA_ENABLED and dhClient:
if instance.type == 'employee':
start_time = None
end_time = None
if instance.job_state == 20 and old_job_state == 10: # 离职
now = datetime.now()
start_time = now
end_time = now + timedelta(minutes=60)
elif instance.job_state == 10 and old_job_state == 20: # 重新在职
now = datetime.now()
start_time = now
end_time = now + timedelta(days=7300)
HrmService.sync_dahua_employee(ep=instance, old_photo=old_photo,
start_time=start_time, end_time=end_time)
return instance return instance
class EmployeeImproveSerializer(CustomModelSerializer): class EmployeeImproveSerializer(CustomModelSerializer):
photo = MyFilePathField() photo_f = MyFilePathField(source='photo', read_only=True)
signature = MyFilePathField() signature_f = MyFilePathField(source='signature', read_only=True)
class Meta: class Meta:
model = Employee model = Employee
fields = ['photo', 'id_number', 'email', 'gender', 'signature'] fields = ['photo', 'id_number', 'email', 'gender', 'signature', 'photo_f', 'signature_f']
class ChannelAuthoritySerializer(serializers.Serializer): class ChannelAuthoritySerializer(serializers.Serializer):
@ -92,8 +108,8 @@ class EmployeeSerializer(CustomModelSerializer):
belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
post_name = serializers.CharField(source='post.name', read_only=True) post_name = serializers.CharField(source='post.name', read_only=True)
blt_ = serializers.SerializerMethodField() blt_ = serializers.SerializerMethodField()
photo = MyFilePathField() photo_f = MyFilePathField(source='photo', read_only=True)
signature = MyFilePathField() signature_f = MyFilePathField(source='signature', read_only=True)
class Meta: class Meta:
model = Employee model = Employee
@ -128,7 +144,7 @@ class NotWorkRemarkListSerializer(serializers.ModelSerializer):
class CertificateCreateUpdateSerializer(CustomModelSerializer): class CertificateCreateUpdateSerializer(CustomModelSerializer):
file = MyFilePathField() file_f = MyFilePathField(source='file', read_only=True)
class Meta: class Meta:
model = Certificate model = Certificate
@ -137,7 +153,7 @@ class CertificateCreateUpdateSerializer(CustomModelSerializer):
class CertificateSerializer(CustomModelSerializer): class CertificateSerializer(CustomModelSerializer):
employee_name = serializers.CharField(source='employee.name', read_only=True) employee_name = serializers.CharField(source='employee.name', read_only=True)
file = MyFilePathField() file_f = MyFilePathField(source='file', read_only=True)
class Meta: class Meta:
model = Certificate model = Certificate

View File

@ -6,6 +6,7 @@ from apps.utils.tools import rannum, ranstr
from datetime import datetime from datetime import datetime
from django.utils import timezone from django.utils import timezone
class HrmService: class HrmService:
@classmethod @classmethod
@ -127,7 +128,7 @@ class HrmService:
cardId = res['id'] cardId = res['id']
cardNumber = str(ep.id)[3:8] + rannum(5) cardNumber = str(ep.id)[3:8] + rannum(5)
now = datetime.now() now = datetime.now()
if start_time is None: # 如果未规定时间 if start_time is None: # 如果未规定时间范围, 默认50年
startDate = now.strftime("%Y-%m-%d %H:%M:%S") startDate = now.strftime("%Y-%m-%d %H:%M:%S")
endDate = (datetime(year=now.year+50, endDate = (datetime(year=now.year+50,
month=now.month, day=1)).strftime("%Y-%m-%d %H:%M:%S") month=now.month, day=1)).strftime("%Y-%m-%d %H:%M:%S")
@ -203,7 +204,8 @@ class HrmService:
# 如果是内部员工创建上班打卡记录(更新) # 如果是内部员工创建上班打卡记录(更新)
if ep and ep.is_atwork is False: if ep and ep.is_atwork is False:
now = timezone.now() now = timezone.now()
cr_10 = ClockRecord.objects.filter(type=10, employee=ep, create_time__year=now.year, create_time__month=now.month, create_time__day=now.day).first() cr_10 = ClockRecord.objects.filter(
type=10, employee=ep, create_time__year=now.year, create_time__month=now.month, create_time__day=now.day).first()
if cr_10: if cr_10:
if now < cr_10.create_by: if now < cr_10.create_by:
cr_10.create_by = now cr_10.create_by = now
@ -228,7 +230,8 @@ class HrmService:
# 如果是内部员工创建下班打卡记录(更新) # 如果是内部员工创建下班打卡记录(更新)
if ep and ep.is_atwork: if ep and ep.is_atwork:
now = timezone.now() now = timezone.now()
cr_20 = ClockRecord.objects.filter(type=20, employee=ep, create_time__year=now.year, create_time__month=now.month, create_time__day=now.day).first() cr_20 = ClockRecord.objects.filter(
type=20, employee=ep, create_time__year=now.year, create_time__month=now.month, create_time__day=now.day).first()
if cr_20: if cr_20:
if now > cr_20.create_by: if now > cr_20.create_by:
cr_20.create_by = now cr_20.create_by = now

View File

@ -125,7 +125,7 @@ class OplWorkerUpdateSerializer(CustomModelSerializer):
class OplCertSerializer(CustomModelSerializer): class OplCertSerializer(CustomModelSerializer):
file = MyFilePathField() file_f = MyFilePathField(source='file', read_only=True)
class Meta: class Meta:
model = OplCert model = OplCert

View File

@ -140,7 +140,7 @@ class RemployeeUpdateSerializer(CustomModelSerializer):
class RemployeeSerializer(CustomModelSerializer): class RemployeeSerializer(CustomModelSerializer):
rparty_name = serializers.CharField(source='rparty.name', read_only=True) rparty_name = serializers.CharField(source='rparty.name', read_only=True)
photo = MyFilePathField() photo_f = MyFilePathField(source='photo', read_only=True)
class Meta: class Meta:
model = Remployee model = Remployee
@ -156,7 +156,7 @@ class RcertificateCreateUpdateSerializer(CustomModelSerializer):
class RcertificateSerializer(CustomModelSerializer): class RcertificateSerializer(CustomModelSerializer):
remployee_name = serializers.CharField(source='remployee.name', read_only=True) remployee_name = serializers.CharField(source='remployee.name', read_only=True)
rparty_name = serializers.CharField(source='rparty.name', read_only=True) rparty_name = serializers.CharField(source='rparty.name', read_only=True)
file = MyFilePathField() file_f = MyFilePathField(source='file', read_only=True)
class Meta: class Meta:
model = Rcertificate model = Rcertificate
@ -240,11 +240,11 @@ class RpjmemberUpdateSerializer(CustomModelSerializer):
class RpjcertificateSerializer(CustomModelSerializer): class RpjcertificateSerializer(CustomModelSerializer):
file = MyFilePathField() file_f = MyFilePathField(source='file', read_only=True)
class Meta: class Meta:
model = Rpjcertificate model = Rpjcertificate
fields = ['rcertificate', 'name', 'type', 'number', 'issue_date', 'expiration_date', 'review_date', 'file'] fields = ['rcertificate', 'name', 'type', 'number', 'issue_date', 'expiration_date', 'review_date', 'file', 'file_f']
class RpjmemberSerializer(CustomModelSerializer): class RpjmemberSerializer(CustomModelSerializer):

View File

@ -39,6 +39,7 @@ class RpartyViewSet(CustomModelViewSet):
分配账号 分配账号
""" """
obj = self.get_object() obj = self.get_object()
post = Post.objects.get(code='remployee')
if obj.admin: if obj.admin:
ins = obj.admin ins = obj.admin
else: else:
@ -47,13 +48,18 @@ class RpartyViewSet(CustomModelViewSet):
ins = serializer.save(type='remployee', password=make_password('0000')) ins = serializer.save(type='remployee', password=make_password('0000'))
obj.admin = ins obj.admin = ins
obj.save() obj.save()
post = Post.objects.get(code='remployee')
UserPost.objects.get_or_create(user=ins, dept=obj.dept, UserPost.objects.get_or_create(user=ins, dept=obj.dept,
defaults={ defaults={
'user': ins, 'user': ins,
'dept': obj.dept, 'dept': obj.dept,
'post': post 'post': post
}) })
up = UserPost.objects.filter(user=ins).order_by('sort', 'create_time').first()
if up:
ins.belong_dept = up.dept
ins.post = up.post
ins.update_by = self.request.user
ins.save()
return Response() return Response()

View File

@ -1,7 +1,7 @@
from django.contrib.auth.models import UserManager from django.contrib.auth.models import UserManager
from django.db import models from django.db import models
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from apps.utils.models import CommonAModel, CommonBModel, BaseModel, SoftDeletableManagerMixin from apps.utils.models import CommonADModel, CommonAModel, CommonBModel, BaseModel, SoftDeletableManagerMixin
class DataFilter(models.IntegerChoices): class DataFilter(models.IntegerChoices):
@ -60,7 +60,7 @@ class Dept(CommonAModel):
return self.name return self.name
class Role(CommonAModel): class Role(CommonADModel):
""" """
角色 角色
""" """

View File

@ -300,7 +300,7 @@ class UserListSerializer(CustomModelSerializer):
""" """
belong_dept_ = DeptSimpleSerializer(source='belong_dept', read_only=True) belong_dept_ = DeptSimpleSerializer(source='belong_dept', read_only=True)
# posts_ = PostSimpleSerializer(source='posts', many=True) # posts_ = PostSimpleSerializer(source='posts', many=True)
avatar = MyFilePathField() avatar_f = MyFilePathField(source='avatar', read_only=True)
class Meta: class Meta:
model = User model = User

View File

@ -409,7 +409,7 @@ class UserViewSet(CustomModelViewSet):
search_fields = ['username', 'name', 'phone', 'email'] search_fields = ['username', 'name', 'phone', 'email']
select_related_fields = ['superior', 'belong_dept'] select_related_fields = ['superior', 'belong_dept']
prefetch_related_fields = ['posts', 'roles', 'depts'] prefetch_related_fields = ['posts', 'roles', 'depts']
ordering = ['type'] ordering = ['type', 'create_time']
# def filter_queryset(self, queryset): # def filter_queryset(self, queryset):
# if not self.detail: # if not self.detail:

View File

@ -204,7 +204,7 @@ class TDeviceViewSet(ListModelMixin, UpdateModelMixin, DestroyModelMixin, Custom
json = { json = {
"pageNum": 1, "pageNum": 1,
"pageSize": 1000, "pageSize": 1000,
'channelTypeList': ["1"], 'unitTypeList': ["1"],
'includeSubOwnerCodeFlag': True 'includeSubOwnerCodeFlag': True
} }
_, res = dhClient.request(**dhapis['channel_list'], json=json) _, res = dhClient.request(**dhapis['channel_list'], json=json)
@ -230,7 +230,7 @@ class TDeviceViewSet(ListModelMixin, UpdateModelMixin, DestroyModelMixin, Custom
json = { json = {
"pageNum": 1, "pageNum": 1,
"pageSize": 1000, "pageSize": 1000,
'channelTypeList': ["7"], 'unitTypeList': ["7"],
'includeSubOwnerCodeFlag': True 'includeSubOwnerCodeFlag': True
} }
_, res = dhClient.request(**dhapis['channel_list'], json=json) _, res = dhClient.request(**dhapis['channel_list'], json=json)
@ -240,8 +240,9 @@ class TDeviceViewSet(ListModelMixin, UpdateModelMixin, DestroyModelMixin, Custom
if td: if td:
pass pass
else: else:
td = TDevice(code=i['channelCode'], type=TDevice.DEVICE_VCHANNEL) td = TDevice(code=i['channelCode'], type=TDevice.DEVICE_DCHANNEL)
td.name = i['channelName'] td.name = i['channelName']
# td.access_list = ['employee', 'remployee', 'visitor']
td.save() td.save()
return Response() return Response()

View File

@ -43,7 +43,7 @@ class VisitorCreateSerializer(CustomModelSerializer):
class VisitorSerializer(CustomModelSerializer): class VisitorSerializer(CustomModelSerializer):
photo = MyFilePathField() photo_f = MyFilePathField(source='photo', read_only=True)
class Meta: class Meta:
model = Visitor model = Visitor

View File

@ -167,9 +167,9 @@ class WfService(object):
elif destination_participant_type == State.PARTICIPANT_TYPE_POST: # 岗位 elif destination_participant_type == State.PARTICIPANT_TYPE_POST: # 岗位
user_queryset = User.objects.filter(posts__in=destination_participant) user_queryset = User.objects.filter(posts__in=destination_participant)
# 如果选择了岗位, 可能需要走过滤策略 # 如果选择了岗位, 可能需要走过滤策略
if state.filter_dept: if state.filter_dept not in [0, '0', None]:
if not new_ticket_data.get(state.filter_dept, None): # if not new_ticket_data.get(state.filter_dept, None):
raise ParseError('部门过滤字段错误') # raise ParseError('部门过滤字段错误')
dpts = Dept.objects.filter(id=new_ticket_data[state.filter_dept]) dpts = Dept.objects.filter(id=new_ticket_data[state.filter_dept])
user_queryset = user_queryset.filter(depts__in=dpts) user_queryset = user_queryset.filter(depts__in=dpts)
# if state.filter_policy == 1: # if state.filter_policy == 1:
@ -185,9 +185,9 @@ class WfService(object):
elif destination_participant_type == State.PARTICIPANT_TYPE_ROLE: # 角色 elif destination_participant_type == State.PARTICIPANT_TYPE_ROLE: # 角色
user_queryset = User.objects.filter(roles__in=destination_participant) user_queryset = User.objects.filter(roles__in=destination_participant)
# 如果选择了角色, 需要走过滤策略 # 如果选择了角色, 需要走过滤策略
if state.filter_dept: if state.filter_dept not in [0, '0', None]:
if not new_ticket_data.get(state.filter_dept, None): # if not new_ticket_data.get(state.filter_dept, None):
raise ParseError('部门过滤字段错误') # raise ParseError('部门过滤字段错误')
dpts = Dept.objects.filter(id=new_ticket_data[state.filter_dept]) dpts = Dept.objects.filter(id=new_ticket_data[state.filter_dept])
user_queryset = user_queryset.filter(depts__in=dpts) user_queryset = user_queryset.filter(depts__in=dpts)
# if state.filter_policy == 1: # if state.filter_policy == 1: