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 import numpy as np
from apps.wf.models import Ticket, Transition from apps.wf.models import Ticket, Transition
from django.db import transaction from django.db import transaction
from django.db.models import F
myLogger = logging.getLogger('log') 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: 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: except EmployeeTransfer.DoesNotExist:
raise ParseError('调岗申请不存在') raise ParseError('调岗申请不存在')
data_save = {k: v for k, v in new_ticket_data.items() if k not in ['t_model', 't_id']}
# 需要删除UserPost中的记录然后新增一条调到的部门和岗位记录排序为1 employee = obj.employee
with transaction.atomic(): user = employee.user
del_count, _ = UserPost.objects.filter(post=obj.original_post, dept=obj.original_dept, user=obj.employee.user).delete()
if del_count == 0: if not user:
raise ParseError('原岗位记录不存在') raise ParseError('员工未绑定系统账号,无法执行调岗')
UserPost.objects.create(post=obj.new_post, dept=obj.new_dept, user=obj.employee.user, sort=1)
# 如果有调薪并有领导申请决定那么可以从new_ticket_data 获取调薪金额 # 2⃣ 先更新 EmployeeTransfer避免 atomic 中用到旧数据)
for k, v in data_save.items(): update_fields = []
if k in ['new_post','original_post']: 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) setattr(obj, f'{k}_id', v)
else: else:
setattr(obj, k, v) setattr(obj, k, v)
update_fields.append(k)
obj.save() 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('该用户的原部门或原职务不匹配')