feat: hrm - 修改 人员调岗后更新部门和岗位
This commit is contained in:
parent
beef2b3e54
commit
4690a78ac6
|
|
@ -20,6 +20,7 @@ from apps.utils.tools import rannum, ranstr
|
|||
import numpy as np
|
||||
from apps.wf.models import Ticket, Transition
|
||||
from django.db import transaction
|
||||
from django.db.models import F
|
||||
|
||||
myLogger = logging.getLogger('log')
|
||||
|
||||
|
|
@ -500,23 +501,75 @@ class HrmService:
|
|||
|
||||
|
||||
# 人员调岗申请
|
||||
def post_transfer(ticket: Ticket, new_ticket_data:dict, **kwargs):
|
||||
def post_transfer(ticket: Ticket, new_ticket_data: dict, **kwargs):
|
||||
# 1️⃣ 获取调岗单
|
||||
try:
|
||||
obj = EmployeeTransfer.objects.get(id=new_ticket_data['t_id'])
|
||||
obj = EmployeeTransfer.objects.select_related(
|
||||
'employee', 'employee__user'
|
||||
).get(id=new_ticket_data['t_id'])
|
||||
except EmployeeTransfer.DoesNotExist:
|
||||
raise ParseError('调岗申请不存在')
|
||||
data_save = {k: v for k, v in new_ticket_data.items() if k not in ['t_model', 't_id']}
|
||||
# 需要删除UserPost中的记录,然后新增一条调到的部门和岗位记录,排序为1
|
||||
with transaction.atomic():
|
||||
del_count, _ = UserPost.objects.filter(post=obj.original_post, dept=obj.original_dept, user=obj.employee.user).delete()
|
||||
if del_count == 0:
|
||||
raise ParseError('原岗位记录不存在')
|
||||
UserPost.objects.create(post=obj.new_post, dept=obj.new_dept, user=obj.employee.user, sort=1)
|
||||
# 如果有调薪并有领导申请决定,那么可以从new_ticket_data 获取调薪金额
|
||||
for k, v in data_save.items():
|
||||
if k in ['new_post','original_post']:
|
||||
|
||||
employee = obj.employee
|
||||
user = employee.user
|
||||
|
||||
if not user:
|
||||
raise ParseError('员工未绑定系统账号,无法执行调岗')
|
||||
|
||||
# 2️⃣ 先更新 EmployeeTransfer(避免 atomic 中用到旧数据)
|
||||
update_fields = []
|
||||
for k, v in new_ticket_data.items():
|
||||
if k in ['t_model', 't_id']:
|
||||
continue
|
||||
if k in ['new_post', 'original_post', 'new_dept', 'original_dept']:
|
||||
setattr(obj, f'{k}_id', v)
|
||||
else:
|
||||
setattr(obj, k, v)
|
||||
update_fields.append(k)
|
||||
|
||||
obj.save()
|
||||
|
||||
# 3️⃣ 调岗事务(岗位、部门、UserPost 一致性)
|
||||
with transaction.atomic():
|
||||
|
||||
# 3.1 校验并删除原岗位记录
|
||||
old_post_qs = UserPost.objects.filter(
|
||||
user=user,
|
||||
post=obj.original_post,
|
||||
dept=obj.original_dept
|
||||
)
|
||||
|
||||
if not old_post_qs.exists():
|
||||
raise ParseError('原岗位记录不存在,无法调岗')
|
||||
|
||||
old_post_qs.delete()
|
||||
|
||||
# 3.2 处理岗位排序(新岗位置顶)
|
||||
UserPost.objects.filter(user=user).update(sort=F('sort') + 1)
|
||||
|
||||
UserPost.objects.create(
|
||||
user=user,
|
||||
post=obj.new_post,
|
||||
dept=obj.new_dept,
|
||||
sort=1
|
||||
)
|
||||
|
||||
# 3.3 更新 Employee
|
||||
employee.belong_dept = obj.new_dept
|
||||
employee.post = obj.new_post
|
||||
employee.save(update_fields=['belong_dept', 'post'])
|
||||
|
||||
# 3.4 同步更新 User
|
||||
User.objects.filter(id=user.id).update(
|
||||
belong_dept=obj.new_dept,
|
||||
post=obj.new_post
|
||||
)
|
||||
|
||||
return obj
|
||||
|
||||
|
||||
def validate_userdept(ticket: Ticket, new_ticket_data: dict, **kwargs):
|
||||
obj = EmployeeTransfer.objects.get(id=new_ticket_data['t_id'])
|
||||
exist_dept_post = UserPost.objects.filter(user=obj.employee.user, post=obj.original_post, dept=obj.original_dept)
|
||||
if not exist_dept_post.exists():
|
||||
raise ParseError('该用户的原部门或原职务不匹配')
|
||||
Loading…
Reference in New Issue