ep表同步到rep表

This commit is contained in:
曹前明 2022-08-23 16:30:51 +08:00
parent f54b54568c
commit 13c9b98d29
15 changed files with 180 additions and 51 deletions

View File

@ -14,3 +14,7 @@ class GenerateVoiceSerializer(serializers.Serializer):
class TestTaskSerializer(serializers.Serializer): class TestTaskSerializer(serializers.Serializer):
args = serializers.ListField(child=serializers.CharField(), label='列表参数', required=False, allow_null=True) args = serializers.ListField(child=serializers.CharField(), label='列表参数', required=False, allow_null=True)
kwargs = serializers.JSONField(label="字典参数", required=False, allow_null=True) kwargs = serializers.JSONField(label="字典参数", required=False, allow_null=True)
class CleanDataSerializer(serializers.Serializer):
datas = serializers.ListField(child=serializers.CharField(), label='数据分类列表', required=False, allow_null=True)

View File

@ -4,7 +4,7 @@ from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from rest_framework.decorators import action from rest_framework.decorators import action
from apps.develop.serializers import GenerateVoiceSerializer, SendSmsSerializer, TestTaskSerializer from apps.develop.serializers import CleanDataSerializer, GenerateVoiceSerializer, SendSmsSerializer, TestTaskSerializer
from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from apps.system.tasks import show from apps.system.tasks import show
@ -175,3 +175,33 @@ class TestViewSet(CustomGenericViewSet):
# rt = requests.post(url=url, json=data).text # rt = requests.post(url=url, json=data).text
res = wxClient.send_tem_msg(data=data) res = wxClient.send_tem_msg(data=data)
return Response(res) return Response(res)
@action(methods=['post'], detail=False, serializer_class=CleanDataSerializer)
def clean_data(self, request, pk=None):
"""清空数据
清空数据
"""
datas = request.data['datas']
from apps.wf.models import Ticket
from apps.hrm.models import Employee
from apps.system.models import User, Dept
if 'visit' in datas:
# 访客
from apps.vm.models import Visit, Visitor
Visit.objects.get_queryset(all=True).delete(soft=False)
Visitor.objects.get_queryset(all=True).delete(soft=False)
Ticket.objects.get_queryset(all=True).filter(workflow__key='visit').delete(soft=False)
Employee.objects.get_queryset(all=True).filter(type='visitor').delete(soft=False)
User.objects.get_queryset(all=True).filter(type='visitor').delete(soft=False)
if 'rpm' in datas:
from apps.rpm.models import Rparty
Rparty.objects.get_queryset(all=True).delete(soft=False)
Ticket.objects.get_queryset(all=True).filter(workflow__key='rpj').delete(soft=False)
Employee.objects.get_queryset(all=True).filter(type='remployee').delete(soft=False)
User.objects.get_queryset(all=True).filter(type='remployee').delete(soft=False)
Dept.objects.get_queryset(all=True).filter(type='rparty').delete(soft=False)
return Response()

View File

@ -67,6 +67,9 @@ class EmployeeCreateUpdateSerializer(CustomModelSerializer):
old_photo = instance.photo old_photo = instance.photo
old_job_state = instance.job_state old_job_state = instance.job_state
instance = super().update(instance, validated_data) instance = super().update(instance, validated_data)
if instance.type == 'remployee':
from apps.rpm.services import sync_to_rep
sync_to_rep(instance)
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()
@ -94,7 +97,7 @@ class EmployeeImproveSerializer(CustomModelSerializer):
class Meta: class Meta:
model = Employee model = Employee
fields = ['photo', 'id_number', 'email', 'gender', 'signature', 'photo_f', 'signature_f'] fields = ['photo', 'id_number', 'email', 'gender', 'signature', 'photo_f', 'signature_f', 'phone']
class ChannelAuthoritySerializer(serializers.Serializer): class ChannelAuthoritySerializer(serializers.Serializer):

View File

@ -78,7 +78,9 @@ class EmployeeViewSet(CustomModelViewSet):
ep = user.employee ep = user.employee
serializer = EmployeeImproveSerializer(instance=ep, data=request.data) serializer = EmployeeImproveSerializer(instance=ep, data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
serializer.save() if ep.type == 'remployee':
from apps.rpm.services import sync_to_rep
sync_to_rep(ep)
return Response() return Response()
@action(methods=['post'], detail=True, perms_map={'post': 'employee.notworkremark'}, @action(methods=['post'], detail=True, perms_map={'post': 'employee.notworkremark'},

View File

@ -4,3 +4,6 @@ from django.apps import AppConfig
class RpmConfig(AppConfig): class RpmConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.rpm' name = 'apps.rpm'
def ready(self):
import apps.rpm.signals

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.12 on 2022-08-23 08:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('rpm', '0002_initial'),
]
operations = [
migrations.AlterField(
model_name='remployee',
name='id_number',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='身份证号'),
),
migrations.AlterField(
model_name='remployee',
name='photo',
field=models.CharField(blank=True, max_length=1000, null=True, verbose_name='证件照'),
),
]

View File

@ -86,8 +86,8 @@ class Remployee(CommonAModel):
on_delete=models.SET_NULL, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
name = models.CharField('姓名', max_length=20) name = models.CharField('姓名', max_length=20)
phone = models.CharField('手机号', max_length=11) phone = models.CharField('手机号', max_length=11)
photo = models.CharField('证件照', max_length=1000) photo = models.CharField('证件照', max_length=1000, null=True, blank=True)
id_number = models.CharField('身份证号', max_length=100) id_number = models.CharField('身份证号', max_length=100, null=True, blank=True)
rparty = models.ForeignKey(Rparty, verbose_name='所属相关方', on_delete=models.CASCADE) rparty = models.ForeignKey(Rparty, verbose_name='所属相关方', on_delete=models.CASCADE)
rpj = models.ForeignKey(Rpj, verbose_name='最近所属相关方项目', on_delete=models.SET_NULL, rpj = models.ForeignKey(Rpj, verbose_name='最近所属相关方项目', on_delete=models.SET_NULL,
null=True, blank=True) null=True, blank=True)

View File

@ -2,6 +2,7 @@
from apps.hrm.models import Employee from apps.hrm.models import Employee
from apps.rpm.models import Rcertificate, Remployee, Rfile, Rparty, Rpjcertificate, Rpjfile, Rpjmember, Rpj from apps.rpm.models import Rcertificate, Remployee, Rfile, Rparty, Rpjcertificate, Rpjfile, Rpjmember, Rpj
from apps.system.models import Dept from apps.system.models import Dept
from apps.system.services import sync_dahua_dept
from apps.utils.constants import EXCLUDE_FIELDS from apps.utils.constants import EXCLUDE_FIELDS
from apps.utils.fields import MyFilePathField from apps.utils.fields import MyFilePathField
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
@ -25,18 +26,22 @@ class RpartyCreateUpdateSerializer(CustomModelSerializer):
def create(self, validated_data): def create(self, validated_data):
instance = super().create(validated_data) instance = super().create(validated_data)
dept = Dept.objects.create(name=instance.name, with transaction.atomic():
parent=instance.belong_dept, type='rparty') dept = Dept.objects.create(name=instance.name,
parent=instance.belong_dept, type='rparty')
sync_dahua_dept(dept)
instance.dept = dept instance.dept = dept
instance.save() instance.save()
return instance return instance
def update(self, instance, validated_data): def update(self, instance, validated_data):
instance = super().update(instance, validated_data) instance = super().update(instance, validated_data)
dept = instance.dept with transaction.atomic():
dept.name = instance.name dept = instance.dept
dept.parent = instance.belong_dept dept.name = instance.name
dept.save() dept.parent = instance.belong_dept # 重新规划归属部门
dept.save()
sync_dahua_dept(dept)
return instance return instance
@ -186,7 +191,12 @@ class RpjmemberCreateSerializer(CustomModelSerializer):
if rpj.state != Rpj.RPJ_CREATE: if rpj.state != Rpj.RPJ_CREATE:
raise ParseError('成员非创建状态不可新增') raise ParseError('成员非创建状态不可新增')
rcertificates = validated_data.pop('rcertificates') rcertificates = validated_data.pop('rcertificates')
if Rpjmember.objects.filter(remployee=validated_data['remployee'], rpj=validated_data['rpj']).exists(): remployee = validated_data['remployee']
if remployee.phone and remployee.photo and remployee.id_number:
pass
else:
raise ParseError('该成员信息不全请补充')
if Rpjmember.objects.filter(remployee=remployee, rpj=validated_data['rpj']).exists():
raise ParseError('该成员已选择') raise ParseError('该成员已选择')
with transaction.atomic(): with transaction.atomic():
ins = super().create(validated_data) ins = super().create(validated_data)
@ -244,7 +254,8 @@ class RpjcertificateSerializer(CustomModelSerializer):
class Meta: class Meta:
model = Rpjcertificate model = Rpjcertificate
fields = ['rcertificate', 'name', 'type', 'number', 'issue_date', 'expiration_date', 'review_date', 'file', 'file_f'] fields = ['rcertificate', 'name', 'type', 'number', 'issue_date',
'expiration_date', 'review_date', 'file', 'file_f']
class RpjmemberSerializer(CustomModelSerializer): class RpjmemberSerializer(CustomModelSerializer):

View File

@ -4,10 +4,27 @@ from apps.hrm.services import HrmService
from apps.system.models import Post, User, UserPost from apps.system.models import Post, User, UserPost
from apps.utils.tools import ranstr from apps.utils.tools import ranstr
from apps.wf.models import Ticket, Transition from apps.wf.models import Ticket, Transition
from apps.rpm.models import Rfile, Rpj, Rpjcertificate, Rpjfile, Rpjmember from apps.rpm.models import Remployee, Rfile, Rparty, Rpj, Rpjcertificate, Rpjfile, Rpjmember
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
def sync_to_rep(ep: Employee):
# 个人信息完善时同步到rep表
Remployee.objects.filter(employee=ep).update(name=ep.name, phone=ep.phone, id_number=ep.id_number, photo=ep.photo)
if ep.user:
rps = Rparty.objects.filter(admin=ep.user)
# 如果是管理员账户
for i in rps:
Remployee.objects.get_or_create(employee=ep, defaults={
'employee': ep,
'name': ep.name,
'phone': ep.phone,
'id_number': ep.id_number,
'photo': ep.photo,
'rparty': i
})
def bind_rpj(ticket: Ticket, transition: Transition, new_ticket_data: dict): def bind_rpj(ticket: Ticket, transition: Transition, new_ticket_data: dict):
rpj = Rpj.objects.get(id=new_ticket_data['rpj']) rpj = Rpj.objects.get(id=new_ticket_data['rpj'])
# ticket_data = ticket.ticket_data # ticket_data = ticket.ticket_data
@ -29,6 +46,7 @@ def rpj_audit_end(ticket):
# 更新入厂项目人员库 # 更新入厂项目人员库
for i in Rpjmember.objects.filter(rpj=rpj): for i in Rpjmember.objects.filter(rpj=rpj):
rep = i.remployee rep = i.remployee
# 尝试找到人员
ep = Employee.objects.filter(id_number=rep.id_number).first() ep = Employee.objects.filter(id_number=rep.id_number).first()
if ep: if ep:
pass pass
@ -53,6 +71,7 @@ def rpj_audit_end(ticket):
user_e.type = 'remployee' user_e.type = 'remployee'
user_e.password = make_password('0000') user_e.password = make_password('0000')
user_e.belong_dept = rpj_dept user_e.belong_dept = rpj_dept
user_e.post = post
user_e.save() user_e.save()
ep.user = user_e ep.user = user_e
ep.save() ep.save()
@ -76,6 +95,7 @@ def rpj_audit_end(ticket):
pass pass
else: else:
ct = Certificate() ct = Certificate()
ct.employee = i.rpj_member.remployee.employee
ct.name = i.name ct.name = i.name
ct.number = i.number ct.number = i.number
ct.type = i.type ct.type = i.type
@ -83,7 +103,6 @@ def rpj_audit_end(ticket):
ct.expiration_date = i.expiration_date ct.expiration_date = i.expiration_date
ct.review_date = i.review_date ct.review_date = i.review_date
ct.file = i.file ct.file = i.file
ct.employee = i.rpj_member.remployee.employee
ct.save() ct.save()
# 更新相关方资料库后续可从资料库里选择 # 更新相关方资料库后续可从资料库里选择
for i in Rpjfile.objects.filter(rpj=rpj): for i in Rpjfile.objects.filter(rpj=rpj):

12
apps/rpm/signals.py Normal file
View File

@ -0,0 +1,12 @@
from django.db.models.signals import post_save
from django.dispatch import receiver
from apps.hrm.models import Employee
from apps.rpm.models import Remployee, Rparty
# @receiver(post_save, sender=Employee)
# def update_remployee(sender, instance, created, **kwargs):
# if instance.user and instance.type == 'remployee':
# if created
# reps = Remployee.objects.filter(employee=instance)
# reps.update(name=instance.name, phone=instance.phone, id_number=instance.id_number, photo=instance.photo)

View File

@ -6,6 +6,7 @@ from apps.rpm.serializers import (RcertificateCreateUpdateSerializer,
RfileListSerializer, RpartySerializer, RpjListSerializer, RpjfileSerializer, RfileListSerializer, RpartySerializer, RpjListSerializer, RpjfileSerializer,
RpjfileUpdateSerializer, RpjmemberCreateSerializer, RpjfileUpdateSerializer, RpjmemberCreateSerializer,
RpjCreateUpdateSerializer, RpjmemberSerializer, RpjmemberUpdateSerializer) RpjCreateUpdateSerializer, RpjmemberSerializer, RpjmemberUpdateSerializer)
from apps.rpm.services import sync_to_rep
from apps.system.models import Dictionary, Post, UserPost from apps.system.models import Dictionary, Post, UserPost
from apps.system.serializers import UserCreateSerializer from apps.system.serializers import UserCreateSerializer
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
@ -48,6 +49,7 @@ 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()
# 岗位设置为相关方岗位
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,
@ -60,6 +62,8 @@ class RpartyViewSet(CustomModelViewSet):
ins.post = up.post ins.post = up.post
ins.update_by = self.request.user ins.update_by = self.request.user
ins.save() ins.save()
# 同步设置rep
sync_to_rep(ins.employee)
return Response() return Response()
@ -96,6 +100,11 @@ class RemployeeViewSet(CustomModelViewSet):
添加人员 添加人员
""" """
user = self.request.user user = self.request.user
# ep = user.employee
# if ep.id_number and ep.photo:
# pass
# else:
# raise ParseError('请先完善个人信息')
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data vdata = serializer.validated_data

View File

@ -78,7 +78,7 @@ class Role(CommonADModel):
return self.name return self.name
class Post(CommonAModel): class Post(CommonADModel):
""" """
职位/岗位 职位/岗位
""" """

View File

@ -4,16 +4,18 @@ from rest_framework import serializers
from django_celery_results.models import TaskResult from django_celery_results.models import TaskResult
from apps.hrm.errors import PHONE_EXIST from apps.hrm.errors import PHONE_EXIST
from apps.system.errors import USERNAME_EXIST from apps.system.errors import USERNAME_EXIST
from apps.system.services import sync_dahua_dept
from apps.utils.fields import MyFilePathField from apps.utils.fields import MyFilePathField
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
from .models import (Dictionary, DictType, File, Dept, Permission, Post, PostRole, from .models import (Dictionary, DictType, File, Dept, Permission, Post, PostRole,
Role, User, UserPost) Role, User, UserPost)
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError, ValidationError
from django.db import transaction from django.db import transaction
from apps.third.tapis import dhapis from apps.third.tapis import dhapis
from rest_framework.validators import UniqueValidator from rest_framework.validators import UniqueValidator
from django.conf import settings from django.conf import settings
from django.db.models import Q
# from django_q.models import Task as QTask, Schedule as QSchedule # from django_q.models import Task as QTask, Schedule as QSchedule
@ -166,6 +168,16 @@ class PostCreateUpdateSerializer(CustomModelSerializer):
model = Post model = Post
exclude = EXCLUDE_FIELDS exclude = EXCLUDE_FIELDS
def create(self, validated_data):
if Post.objects.filter(name=validated_data['name']).exists():
raise ValidationError('该岗位已存在')
return super().create(validated_data)
def update(self, instance, validated_data):
if Post.objects.filter(name=validated_data['name']).exclude(id=instance.id).exists():
raise ValidationError('该岗位已存在')
return super().update(instance, validated_data)
class PostSimpleSerializer(CustomModelSerializer): class PostSimpleSerializer(CustomModelSerializer):
class Meta: class Meta:
@ -250,42 +262,15 @@ class DeptCreateUpdateSerializer(CustomModelSerializer):
@transaction.atomic @transaction.atomic
def create(self, validated_data): def create(self, validated_data):
from apps.third.clients import dhClient ins = super().create(validated_data)
if settings.DAHUA_ENABLED: sync_dahua_dept(ins)
data = { return ins
"parentId": 1,
"name": validated_data['name'],
"service": "ehs"
}
_, res = dhClient.request(**dhapis['dept_create'], json=data)
third_info = {'dh_id': str(res['id'])}
validated_data['third_info'] = third_info
return super().create(validated_data)
@transaction.atomic @transaction.atomic
def update(self, instance, validated_data): def update(self, instance, validated_data):
from apps.third.clients import dhClient ins = super().update(instance, validated_data)
third_info = instance.third_info sync_dahua_dept(ins)
if settings.DAHUA_ENABLED and not third_info.get('dh_id', False): return ins
# 如果dh_id 不存在
data = {
"parentId": 1,
"name": validated_data['name'],
"service": "ehs"
}
_, res = dhClient.request(**dhapis['dept_create'], json=data)
third_info['dh_id'] = res['id']
instance.third_info = third_info
instance.save()
elif instance.name != validated_data.get('name', ''):
if settings.DAHUA_ENABLED and instance.third_info.get('dh_id', False):
data = {
"id": instance.third_info['dh_id'],
"parentId": 1,
"name": validated_data['name']
}
dhClient.request(**dhapis['dept_update'], json=data)
return super().update(instance, validated_data)
class UserSimpleSerializer(CustomModelSerializer): class UserSimpleSerializer(CustomModelSerializer):

27
apps/system/services.py Normal file
View File

@ -0,0 +1,27 @@
from apps.system.models import Dept
from django.conf import settings
from apps.third.tapis import dhapis
def sync_dahua_dept(dept: Dept):
# 同步大华部门信息
from apps.third.clients import dhClient
third_info = dept.third_info
if settings.DAHUA_ENABLED and not third_info.get('dh_id', False):
# 如果dh_id 不存在
data = {
"parentId": 1,
"name": dept.name,
"service": "ehs"
}
_, res = dhClient.request(**dhapis['dept_create'], json=data)
third_info['dh_id'] = res['id']
dept.third_info = third_info
dept.save()
elif settings.DAHUA_ENABLED and dept.third_info.get('dh_id', False):
data = {
"id": dept.third_info['dh_id'],
"parentId": 1,
"name": dept.name
}
dhClient.request(**dhapis['dept_update'], json=data)

View File

@ -244,7 +244,8 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
大华事件处理 大华事件处理
""" """
data = json.loads(request.body) # data = json.loads(request.body)
data = request.data
method = data['method'] method = data['method']
category = data['category'] category = data['category']
subsystem = data.get('subsystem', None) subsystem = data.get('subsystem', None)