From 486cc0d0dcdcf6490a57554de3b4078b312905f0 Mon Sep 17 00:00:00 2001 From: zhaokai Date: Fri, 24 Apr 2026 09:14:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(taskflow):=20=E6=B7=BB=E5=8A=A0=E6=84=8F?= =?UTF-8?q?=E8=A7=81=E5=A1=AB=E5=86=99=E6=A0=87=E5=BF=97=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=88=86=E6=94=AF=E6=B5=81=E7=A8=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eightwork/command/TaskLogUpdateExe.java | 41 +++++++++++++++---- .../command/query/TaskLogQueryExe.java | 28 +++++++++++++ .../zcloud/eightwork/dto/TaskFlowAddCmd.java | 3 +- .../dto/clientobject/TaskFlowCO.java | 2 + .../eightwork/dto/clientobject/TaskLogCO.java | 2 + .../eightwork/domain/model/TaskFlowE.java | 2 + .../eightwork/domain/model/TaskLogE.java | 3 ++ .../persistence/dataobject/TaskFlowDO.java | 2 + .../persistence/dataobject/TaskLogDO.java | 2 + .../repository/TaskLogRepository.java | 8 ++++ .../impl/TaskLogRepositoryImpl.java | 17 ++++++++ 11 files changed, 102 insertions(+), 8 deletions(-) diff --git a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java index d5268df..200e276 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java @@ -956,7 +956,6 @@ public class TaskLogUpdateExe { */ private void handleBranchStepsForReject(List allLogs, List actionLogs) { log.info("开始处理打回时的分支步骤状态"); - // 收集所有分支开始节点 List branchStartNodes = allLogs.stream() .filter(log -> BranchFlag.BRANCH_START.getCode().equals(log.getBranchFlag())) @@ -1003,11 +1002,16 @@ public class TaskLogUpdateExe { private void handleRejectStep(TaskLogNextCmd cmd) { log.info("开始处理打回到某一步: workId={}, stepId={}", cmd.getWorkId(), cmd.getStepId()); + List allLogs = taskLogGateway.listAllByWorkId(cmd.getWorkId()); TaskLogE currentLog = findCurrentLog(allLogs, cmd.getId()); if (currentLog == null) { throw new BizException("未找到对应的步骤记录"); } + + + + Integer rejectStepId = currentLog.getRejectStepId(); if(rejectStepId==null){ log.warn("未找到对应的步骤记录.workId={}, stepId={}", cmd.getWorkId(), cmd.getStepId()); @@ -1021,18 +1025,31 @@ public class TaskLogUpdateExe { log.warn("未找到作业信息: workId={}", cmd.getWorkId()); return; } + // 1. 归档当前的 task_log 记录(除了申请步骤) archiveTaskLogs(allLogs); // 2. 删除的所有 task_log deleteTaskLogsExceptFirst(cmd.getWorkId()); - List taskLogs = taskLogCoConvertor.converEsToDOs(allLogs); + // 检查是否为持续步骤的特殊提交 + // 持续步骤提交时不应改变状态为 APPROVED,而应保持 IN_PROGRESS + boolean isOngoingStepSubmit = currentLog.getOngoingFlag() != null && currentLog.getOngoingFlag() == 1 + && StringUtils.isNotBlank(cmd.getSpecialStepCode()); + + // 1. 完成当前步骤(持续步骤的特殊提交跳过此步骤) + if (!isOngoingStepSubmit) { + completeCurrentStep(currentLog, cmd, taskLogs); + } + // 3. 设置所有步骤的id for (TaskLogDO taskLog : taskLogs) { taskLog.setId(null); taskLog.setTaskLogId(Tools.get32UUID()); + taskLog.setUpdateTime(LocalDateTime.now()); + taskLog.setUpdateId(null); + taskLog.setUpdateName( null); } //4. 将指定步骤之后的步骤设置为未开始 resetStepsAfterTargetStep(taskLogs, rejectStepId); @@ -1040,8 +1057,8 @@ public class TaskLogUpdateExe { // 5. 批量保存 taskLogRepository.saveBatch(taskLogs); - - + // 批量更新 eightworkInfo.info(只更新本次变化的步骤) + updateEightworkInfo(cmd.getWorkId(), taskLogs); // 6. 发送待办完成事件 sendTodoCompleteEvent(currentLog.getId()); @@ -1059,7 +1076,6 @@ public class TaskLogUpdateExe { .findFirst() .orElse(null); - //发送待办和消息 // 发送待办通知 log.info("发送退回步骤待办通知"); @@ -1074,6 +1090,8 @@ public class TaskLogUpdateExe { log.info("工作流已打回到指定步骤: workId={}, step={}", cmd.getWorkId(), rejectStepId); } + + /** * 将指定步骤ID之后的所有步骤重置状态 * - targetStepId 本身设置为 0(进行中) @@ -1129,7 +1147,9 @@ public class TaskLogUpdateExe { if (nextStep != null) { // 只将通过状态(1)的步骤改为未开始(-99) - if (TaskLogStatus.APPROVED.equalsCode(nextStep.getStatus())||TaskLogStatus.IN_PROGRESS.equalsCode(nextStep.getStatus())) { + if (TaskLogStatus.APPROVED.equalsCode(nextStep.getStatus()) + ||TaskLogStatus.IN_PROGRESS.equalsCode(nextStep.getStatus()) + || REJECT_STEP_STATUS.equals(nextStep.getStatus())) { Integer oldStatus = nextStep.getStatus(); nextStep.setStatus(TaskLogStatus.NOT_STARTED.getCode()); resetCount++; @@ -1205,7 +1225,7 @@ public class TaskLogUpdateExe { TaskLogDO branchStartNode = branchInfo.branchStartNode; Long branchStepId = branchInfo.branchStepId; if (!TaskLogStatus.APPROVED.equalsCode(branchStartNode.getStatus())&&!TaskLogStatus.IN_PROGRESS.equalsCode(branchStartNode.getStatus())) { - log.warn("分支节点 {} (stepId={}) 状态不是通过或进行中,无法处理",branchStepId); + log.warn("分支节点 (stepId={}) 状态不是通过或进行中,无法处理",branchStepId); continue; } @@ -1824,6 +1844,7 @@ public class TaskLogUpdateExe { // 签字路径:只覆盖空值 if (source.getSignPath() != null) { target.setSignPath(source.getSignPath()); + target.setSignTime(LocalDateTime.now()); } // 填写次数:只覆盖空值 if (source.getCurrentFillTimes() != null) { @@ -2121,6 +2142,12 @@ public class TaskLogUpdateExe { try { JSONObject otherParams = JSONObject.parseObject(logDO.getOtherParams()); stepInfo.put("otherParams", otherParams); + String hotTime = otherParams.getString("hotTime"); + //工作结束时间 + if (!StringUtils.isBlank(hotTime)) { + stepInfo.put("workEndTime", hotTime); + } + } catch (Exception e) { // 如果不是JSON格式,直接存储字符串 stepInfo.put("otherParams", logDO.getOtherParams()); diff --git a/web-app/src/main/java/com/zcloud/eightwork/command/query/TaskLogQueryExe.java b/web-app/src/main/java/com/zcloud/eightwork/command/query/TaskLogQueryExe.java index fb3c3be..52c31c2 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/command/query/TaskLogQueryExe.java +++ b/web-app/src/main/java/com/zcloud/eightwork/command/query/TaskLogQueryExe.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zcloud.eightwork.command.convertor.EightworkInfoCoConvertor; import com.zcloud.eightwork.command.convertor.TaskLogCoConvertor; import com.zcloud.eightwork.domain.model.TodoCountE; +import com.zcloud.eightwork.domain.model.enums.StepType; import com.zcloud.eightwork.domain.model.enums.TaskLogStatus; import com.zcloud.eightwork.dto.TaskLogPageQry; import com.zcloud.eightwork.dto.clientobject.BlockingStepInfoCO; @@ -63,7 +64,34 @@ public class TaskLogQueryExe { examCenterCOS.forEach(item -> { item.setWorkInfo(workInfos.stream().filter(workInfo -> workInfo.getWorkId().equals(item.getWorkId())).findFirst().orElse(null)); }); + //如果不是分支项目直接返回 + //如果是分支节点,需要展示对应主流程的状态信息 step_type =2是分支流程,需要查询每一条数据对应workid中step_type=1 并且status=0的第一个stepName + //查询结果只能是单一流程,判断是否为分支流程 + if(StepType.BRANCH.getCode().equals(examCenterCOS.get(0).getStepType())){ + //获取这些workId对应的主流程步骤(step_type=1 且 status=0) + List taskLogDOList = taskLogRepository.listAllByWorkIdList(workIds, TaskLogStatus.IN_PROGRESS.getCode(), StepType.NORMAL.getCode()); + if(!CollectionUtils.isEmpty(taskLogDOList)){ + // 按workId分组,获取每个workId的第一个步骤(已经是按stepOrder排序的) + Map workIdToMainStepMap = taskLogDOList.stream() + .collect(Collectors.toMap( + TaskLogDO::getWorkId, + taskLogDO -> taskLogDO, + (existing, replacement) -> existing // 如果有重复,保留第一个 + )); + + // 为分支步骤设置主流程的步骤名称 + examCenterCOS.forEach(item -> { + TaskLogDO mainStep = workIdToMainStepMap.get(item.getWorkId()); + if(mainStep != null){ + item.setStepName(mainStep.getStepName()); + log.info("分支步骤显示主流程状态: workId={}, branchStepId={}, mainStepName={}", + item.getWorkId(), item.getStepId(), mainStep.getStepName()); + } + }); + } + } } + return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex()); } diff --git a/web-client/src/main/java/com/zcloud/eightwork/dto/TaskFlowAddCmd.java b/web-client/src/main/java/com/zcloud/eightwork/dto/TaskFlowAddCmd.java index c9b9ef2..3d88d6b 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/dto/TaskFlowAddCmd.java +++ b/web-client/src/main/java/com/zcloud/eightwork/dto/TaskFlowAddCmd.java @@ -83,7 +83,8 @@ public class TaskFlowAddCmd extends Command { @ApiModelProperty(value = "是否可以打回1是2否", name = "rejectedStepFlag") private Integer rejectedStepFlag; - + @ApiModelProperty(value = "是否填写意见1是2否") + private Integer opinionFlag; @ApiModelProperty(value = "0无分支1有分支开始2有分支结束", name = "branchFlag", required = true) @NotNull(message = "0无分支1有分支开始2有分支结束不能为空") diff --git a/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskFlowCO.java b/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskFlowCO.java index ce2a655..50e8ff1 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskFlowCO.java +++ b/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskFlowCO.java @@ -62,6 +62,8 @@ public class TaskFlowCO extends ClientObject { //是否可以打回1是2否 @ApiModelProperty(value = "是否可以打回1是2否") private Integer rejectedStepFlag; + @ApiModelProperty(value = "是否填写意见1是2否") + private Integer opinionFlag; //0无分支1有分支开始2有分支结束 @ApiModelProperty(value = "0无分支1有分支开始2有分支结束") private Integer branchFlag; diff --git a/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskLogCO.java b/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskLogCO.java index 81632c4..9c1e79f 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskLogCO.java +++ b/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/TaskLogCO.java @@ -103,6 +103,8 @@ public class TaskLogCO extends ClientObject { //是否可以打回1是2否 @ApiModelProperty(value = "是否可以打回1是2否") private Integer rejectedStepFlag; + @ApiModelProperty(value = "是否填写意见1是2否") + private Integer opinionFlag; //0无分支1有分支开始2有分支结束 @ApiModelProperty(value = "0无分支1有分支开始2有分支结束") private Integer branchFlag; diff --git a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskFlowE.java b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskFlowE.java index 956a2ab..6f38db4 100644 --- a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskFlowE.java +++ b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskFlowE.java @@ -48,6 +48,8 @@ public class TaskFlowE extends BaseE { private Integer measuresStepFlag; //是否可以打回1是2否 private Integer rejectedStepFlag; + @ApiModelProperty(value = "是否填写意见1是2否") + private Integer opinionFlag; //0无分支1有分支开始2有分支结束 private Integer branchFlag; //branch_flag == 1 分支节点ID diff --git a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskLogE.java b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskLogE.java index f49bc29..bb50db5 100644 --- a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskLogE.java +++ b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/TaskLogE.java @@ -74,6 +74,8 @@ public class TaskLogE extends BaseE { private Integer measuresStepFlag; //是否可以打回1是2否 private Integer rejectedStepFlag; + @ApiModelProperty(value = "是否填写意见1是2否") + private Integer opinionFlag; //0无分支1有分支开始2有分支结束 private Integer branchFlag; //branch_flag == 1 分支节点ID @@ -131,6 +133,7 @@ public class TaskLogE extends BaseE { this.selectSignStep = log.getSelectSignStep(); this.measuresStepFlag = log.getMeasuresStepFlag(); this.rejectedStepFlag = log.getRejectedStepFlag(); + this.opinionFlag = log.getOpinionFlag(); this.branchFlag = log.getBranchFlag(); this.branchStep = log.getBranchStep(); this.branchMergeStep = log.getBranchMergeStep(); diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskFlowDO.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskFlowDO.java index 8170b03..7c1e081 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskFlowDO.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskFlowDO.java @@ -65,6 +65,8 @@ public class TaskFlowDO extends BaseDO { //是否可以打回1是2否 @ApiModelProperty(value = "是否可以打回1是2否") private Integer rejectedStepFlag; + @ApiModelProperty(value = "是否填写意见1是2否") + private Integer opinionFlag; //0无分支1有分支开始2有分支结束 @ApiModelProperty(value = "0无分支1有分支开始2有分支结束") private Integer branchFlag; diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskLogDO.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskLogDO.java index 661a62c..0859c33 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskLogDO.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/TaskLogDO.java @@ -103,6 +103,8 @@ public class TaskLogDO extends BaseDO { //是否可以打回1是2否 @ApiModelProperty(value = "是否可以打回1是2否") private Integer rejectedStepFlag; + @ApiModelProperty(value = "是否填写意见1是2否") + private Integer opinionFlag; //0无分支1有分支开始2有分支结束 @ApiModelProperty(value = "0无分支1有分支开始2有分支结束") private Integer branchFlag; diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java index ac44349..7c996ab 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java @@ -42,5 +42,13 @@ public interface TaskLogRepository extends BaseRepository { * @return 删除的记录数 */ int physicalDeleteByIds(List ids); + + /** + * 查找对应的分支/主流程 对应的数据 + * @param workIds + * @param status + * @return + */ + List listAllByWorkIdList(List workIds, Integer status, Integer stepType); } diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java index 57c86a2..68c604e 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java @@ -18,6 +18,7 @@ import com.zcloud.gbscommon.utils.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -74,5 +75,21 @@ public class TaskLogRepositoryImpl extends BaseRepositoryImpl listAllByWorkIdList(List workIds, Integer status, Integer stepType) { + LambdaQueryWrapper taskLogDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); + taskLogDOLambdaQueryWrapper.in(TaskLogDO::getWorkId, workIds); + if(status!=null){ + taskLogDOLambdaQueryWrapper.eq(TaskLogDO::getStatus, status); + } + if(stepType!=null){ + taskLogDOLambdaQueryWrapper.eq(TaskLogDO::getStepType, stepType); + } + + taskLogDOLambdaQueryWrapper.orderByAsc(TaskLogDO::getStepOrder) + .orderByAsc(TaskLogDO::getCreateTime); + return list(taskLogDOLambdaQueryWrapper); + } }