fix: 修复接单部门审批人选择错误的问题

1. TaskService: 创建子任务时保存用户选择的接单部门(selectedDeptId)到receiver_dept_id
2. TaskApprovalService: 优先从子任务的receiver_dept_id确定接单部门负责人
3. 解决多接单部门时总是取第一个部门负责人的问题
This commit is contained in:
Your Name 2026-01-16 15:23:24 +08:00
parent 7d4ab4f275
commit 5573a89e41
2 changed files with 90 additions and 11 deletions

View File

@ -630,10 +630,45 @@ public class TaskApprovalService {
/**
* 确定接单部门负责人(支持三级分类继承二级分类的配置)
* 🔥 优先使用子任务上设置的接单部门
*/
private Long determineReceivingLeader(Task task) {
// 根据任务类型的allowedDeptIds确定接单部门
// 简化版本:取第一个任务类型的第一个允许部门
// 🔥 步骤1:优先从子任务获取接单部门
// 流水线任务:查找第一个子任务的 receiver_dept_id
if (task.getIsPipeline() != null && task.getIsPipeline() == 1) {
List<TaskItem> taskItems = taskItemMapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<TaskItem>()
.eq(TaskItem::getTaskId, task.getId())
.orderByAsc(TaskItem::getSortOrder)
);
if (taskItems != null && !taskItems.isEmpty()) {
// 查找第一个有 receiver_dept_id 的子任务
for (TaskItem item : taskItems) {
if (item.getReceiverDeptId() != null) {
Department dept = departmentMapper.selectById(item.getReceiverDeptId());
if (dept != null && dept.getLeaderId() != null) {
log.info("从子任务 {} 获取接单部门负责人: 部门={}, 负责人ID={}",
item.getItemNo(), dept.getDeptName(), dept.getLeaderId());
return dept.getLeaderId();
}
}
}
}
}
// 🔥 步骤2:如果主任务有 receiver_dept_id,使用它
if (task.getReceiverDeptId() != null) {
Department dept = departmentMapper.selectById(task.getReceiverDeptId());
if (dept != null && dept.getLeaderId() != null) {
log.info("从主任务获取接单部门负责人: 部门={}, 负责人ID={}",
dept.getDeptName(), dept.getLeaderId());
return dept.getLeaderId();
}
}
// 🔥 步骤3:降级方案 - 根据任务类型的allowedDeptIds确定接单部门
// 取第一个任务类型的第一个允许部门
String taskTypeIds = task.getTaskTypeIds();
if (taskTypeIds == null || taskTypeIds.isEmpty()) {
return null;
@ -657,11 +692,13 @@ public class TaskApprovalService {
if (allowedDeptIds != null && !allowedDeptIds.isEmpty()) {
String[] deptIds = allowedDeptIds.split(",");
if (deptIds.length > 0) {
Long deptId = Long.parseLong(deptIds[0].trim());
Department dept = departmentMapper.selectById(deptId);
if (dept != null && dept.getLeaderId() != null) {
return dept.getLeaderId();
if (deptIds.length > 0) {
Long deptId = Long.parseLong(deptIds[0].trim());
Department dept = departmentMapper.selectById(deptId);
if (dept != null && dept.getLeaderId() != null) {
log.info("从任务类型配置获取接单部门负责人(降级方案): 部门={}, 负责人ID={}",
dept.getDeptName(), dept.getLeaderId());
return dept.getLeaderId();
}
}
}

View File

@ -574,6 +574,26 @@ public class TaskService {
item.setSortOrder(itemIndex);
item.setProgress(0);
// 🔥 设置子任务的接单部门(无论什么模式都要设置)
// 优先使用用户选择的部门,否则尝试从任务类型配置获取
if (!groupItems.isEmpty()) {
Long selectedDeptId = groupItems.get(0).getSelectedDeptId();
if (selectedDeptId != null) {
// 用户明确选择了接单部门
item.setReceiverDeptId(selectedDeptId);
log.info("子任务 {} 设置用户选择的接单部门: {}", item.getItemNo(), selectedDeptId);
} else if (deptKey != null && !deptKey.equals("null") && !deptKey.contains(",")) {
// 任务类型只配置了一个部门,自动设置
try {
Long singleDeptId = Long.parseLong(deptKey.trim());
item.setReceiverDeptId(singleDeptId);
log.info("子任务 {} 自动设置唯一的接单部门: {}", item.getItemNo(), singleDeptId);
} catch (NumberFormatException e) {
log.warn("无法解析部门ID: {}", deptKey);
}
}
}
// 如果是assigned模式,设置子任务的接收人(从该组的第一个任务项获取)
if ("assigned".equals(dto.getReleaseType()) && !groupItems.isEmpty()) {
Long itemReceiverId = groupItems.get(0).getReceiverId();
@ -582,7 +602,8 @@ public class TaskService {
User itemReceiver = userService.getUserById(itemReceiverId);
if (itemReceiver != null) {
item.setReceiverName(itemReceiver.getRealName());
if (itemReceiver.getDeptId() != null) {
// 如果还没有设置接单部门,从设计师信息获取
if (item.getReceiverDeptId() == null && itemReceiver.getDeptId() != null) {
item.setReceiverDeptId(itemReceiver.getDeptId());
}
}
@ -1660,6 +1681,26 @@ public class TaskService {
item.setSortOrder(itemIndex);
item.setProgress(0);
// 🔥 设置子任务的接单部门(无论什么模式都要设置)
String deptKeyForItem = groupToDeptKey.get(groupNo);
if (!groupItems.isEmpty()) {
Long selectedDeptIdForItem = groupItems.get(0).getSelectedDeptId();
if (selectedDeptIdForItem != null) {
// 用户明确选择了接单部门
item.setReceiverDeptId(selectedDeptIdForItem);
log.info("子任务 {} 设置用户选择的接单部门: {}", item.getItemNo(), selectedDeptIdForItem);
} else if (deptKeyForItem != null && !deptKeyForItem.equals("null") && !deptKeyForItem.contains(",")) {
// 任务类型只配置了一个部门,自动设置
try {
Long singleDeptIdForItem = Long.parseLong(deptKeyForItem.trim());
item.setReceiverDeptId(singleDeptIdForItem);
log.info("子任务 {} 自动设置唯一的接单部门: {}", item.getItemNo(), singleDeptIdForItem);
} catch (NumberFormatException e) {
log.warn("无法解析部门ID: {}", deptKeyForItem);
}
}
}
// 如果是assigned模式,设置子任务的接收人
if ("assigned".equals(dto.getReleaseType()) && !groupItems.isEmpty()) {
Long itemReceiverId = groupItems.get(0).getReceiverId();
@ -1668,7 +1709,8 @@ public class TaskService {
User itemReceiver = userService.getUserById(itemReceiverId);
if (itemReceiver != null) {
item.setReceiverName(itemReceiver.getRealName());
if (itemReceiver.getDeptId() != null) {
// 如果还没有设置接单部门,从设计师信息获取
if (item.getReceiverDeptId() == null && itemReceiver.getDeptId() != null) {
item.setReceiverDeptId(itemReceiver.getDeptId());
}
}
@ -1693,8 +1735,8 @@ public class TaskService {
}
taskItemMapper.insert(item);
log.info("子任务创建成功,ID: {}, 编号: {}, 部门序号: {}, 部门内序号: {}",
item.getId(), item.getItemNo(), currentDeptIndex, subIndex);
log.info("子任务创建成功,ID: {}, 编号: {}, 部门序号: {}, 部门内序号: {}, 接单部门: {}",
item.getId(), item.getItemNo(), currentDeptIndex, subIndex, item.getReceiverDeptId());
itemIndex++;
}