feat: hrm - 修改 人员调岗后更新部门和岗位

This commit is contained in:
TianyangZhang 2026-01-29 10:43:52 +08:00
parent beef2b3e54
commit 4690a78ac6
1 changed files with 65 additions and 12 deletions

View File

@ -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('该用户的原部门或原职务不匹配')