feat: 支持一级需求任务明细完善功能

- 修改updatePipelineTask方法允许detailCompleterId编辑任务
- 添加pending_detail_completion状态到允许编辑的状态列表
- 添加handlePrimaryTaskDetailCompletion方法处理明细完善后的状态转换
- 明细完善后任务直接进入接单部门审核流程
- 将determineReceivingLeader方法改为public以便跨服务调用
This commit is contained in:
Your Name 2026-01-20 00:11:28 +08:00
parent 40be47290f
commit 3bbbd20098
2 changed files with 48 additions and 9 deletions

View File

@ -834,7 +834,7 @@ public class TaskApprovalService {
* 确定接单部门负责人(支持三级分类继承二级分类的配置)
* 🔥 优先使用子任务上设置的接单部门
*/
private Long determineReceivingLeader(Task task) {
public Long determineReceivingLeader(Task task) {
// 🔥 步骤1:优先从子任务获取接单部门
// 流水线任务:查找第一个子任务的 receiver_dept_id
if (task.getIsPipeline() != null && task.getIsPipeline() == 1) {

View File

@ -1455,10 +1455,14 @@ public class TaskService {
public void updatePipelineTask(Long id, com.designhub.dto.PipelineTaskDTO dto, Long userId) {
Task existTask = getTaskById(id);
// 验证权限:只有任务发布人才能更新任务
// 验证权限:任务发布人、一级需求任务的明细完善人可以更新任务
boolean isAdmin = isAdminUser(userId);
if (!isAdmin && !userId.equals(existTask.getPublisherId())) {
throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人可以更新任务");
boolean isPrimaryTaskDetailCompleter = "pending_detail_completion".equals(existTask.getApprovalStatus())
&& existTask.getDetailCompleterId() != null
&& userId.equals(existTask.getDetailCompleterId());
if (!isAdmin && !userId.equals(existTask.getPublisherId()) && !isPrimaryTaskDetailCompleter) {
throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人或指定的明细完善人可以更新任务");
}
// 验证任务是否是流水线任务
@ -1466,7 +1470,7 @@ public class TaskService {
throw new BusinessException(ResultCode.PARAM_ERROR, "该任务不是流水线任务");
}
// 允许更新的任务状态:草稿、待审核(需求/接单部门审核)、被驳回
// 允许更新的任务状态:草稿、待审核(需求/接单部门审核)、被驳回、待完善明细
// 不允许更新的状态:进行中(in_progress)、已完成(completed)、已取消(cancelled)
String status = existTask.getStatus();
String approvalStatus = existTask.getApprovalStatus();
@ -1477,6 +1481,7 @@ public class TaskService {
"draft".equals(approvalStatus) ||
"pending_demand_approval".equals(approvalStatus) ||
"pending_receiving_approval".equals(approvalStatus) ||
"pending_detail_completion".equals(approvalStatus) || // 一级需求任务待完善明细
approvalStatus.contains("rejected")
));
@ -1596,12 +1601,18 @@ public class TaskService {
// 重新创建子任务(使用与createPipelineTask相同的逻辑)
createPipelineTaskItemsForUpdate(existTask, dto);
// 重新初始化审核状态并发送通知
initApprovalStatus(existTask);
// 判断是否是一级需求任务的明细完善
if (isPrimaryTaskDetailCompleter && "pending_detail_completion".equals(approvalStatus)) {
// 一级需求任务明细完善后,进入需求部门审核流程
handlePrimaryTaskDetailCompletion(existTask, userId);
} else {
// 普通任务:重新初始化审核状态并发送通知
initApprovalStatus(existTask);
}
// 再次保存任务,因为initApprovalStatus修改了approvalStatus、currentApproverId等字段
// 再次保存任务,因为审核状态可能被修改
taskMapper.updateById(existTask);
log.info("任务审核状态已重新初始化: taskId={}, approvalStatus={}, currentApproverId={}",
log.info("任务审核状态已更新: taskId={}, approvalStatus={}, currentApproverId={}",
existTask.getId(), existTask.getApprovalStatus(), existTask.getCurrentApproverId());
sendApprovalNotification(existTask);
@ -3348,6 +3359,34 @@ public class TaskService {
}
}
/**
* 处理一级需求任务明细完善后的状态转换
* 明细完善后,任务直接进入接单部门审核流程(因为需求部门已经审核过了)
*/
private void handlePrimaryTaskDetailCompletion(Task task, Long completerId) {
log.info("一级需求任务明细已完善: taskId={}, completerId={}", task.getId(), completerId);
// 记录审核日志
taskApprovalService.addApprovalLog(task.getId(), completerId, "complete_detail", "已完善任务明细", null);
// 确定接单部门负责人
Long receivingLeaderId = taskApprovalService.determineReceivingLeader(task);
if (receivingLeaderId != null) {
// 更新任务状态为待接单部门审核
task.setApprovalStatus("pending_receiving_approval");
task.setStatus("pending_audit");
task.setDemandApprovalTime(LocalDateTime.now());
task.setCurrentApproverId(receivingLeaderId);
task.setCurrentApproverRole("receiving_leader");
log.info("一级需求任务明细完善后,等待接单部门负责人审核:leaderId={}", receivingLeaderId);
} else {
// 如果无法确定接单部门负责人,直接发布到任务大厅
log.warn("无法确定接单部门负责人,任务将直接发布到任务大厅");
task.setApprovalStatus("approved");
task.setStatus("pending");
}
}
/**
* 初始化普通任务审核状态
*/