From 4690a78ac63260875a23c80bb1d312e34e95aa8b Mon Sep 17 00:00:00 2001 From: TianyangZhang Date: Thu, 29 Jan 2026 10:43:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20hrm=20-=20=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E8=B0=83=E5=B2=97=E5=90=8E=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=92=8C=E5=B2=97=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hrm/services.py | 77 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/apps/hrm/services.py b/apps/hrm/services.py index 4fa88f11..e03c9778 100755 --- a/apps/hrm/services.py +++ b/apps/hrm/services.py @@ -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('该用户的原部门或原职务不匹配') \ No newline at end of file