Commit f47f6d934ee23cc98c440cfb62246b9c4fa8802f
1 parent
f8d6f1e2
【代码评审】Bpm:数据报表
Showing
3 changed files
with
180 additions
and
132 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java
| @@ -362,6 +362,7 @@ public class BpmSimpleModelNodeVO { | @@ -362,6 +362,7 @@ public class BpmSimpleModelNodeVO { | ||
| 362 | @Valid | 362 | @Valid |
| 363 | private List<HttpRequestParam> body; | 363 | private List<HttpRequestParam> body; |
| 364 | 364 | ||
| 365 | + // TODO @json:可能未来看情况,搞个 HttpResponseParam;得看看有没别的业务需要,抽象统一 | ||
| 365 | /** | 366 | /** |
| 366 | * 请求返回处理设置,用于修改流程表单值 | 367 | * 请求返回处理设置,用于修改流程表单值 |
| 367 | * | 368 | * |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java
| @@ -8,7 +8,6 @@ import lombok.Data; | @@ -8,7 +8,6 @@ import lombok.Data; | ||
| 8 | import org.springframework.format.annotation.DateTimeFormat; | 8 | import org.springframework.format.annotation.DateTimeFormat; |
| 9 | 9 | ||
| 10 | import java.time.LocalDateTime; | 10 | import java.time.LocalDateTime; |
| 11 | -import java.util.Map; | ||
| 12 | 11 | ||
| 13 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 12 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 14 | 13 | ||
| @@ -40,7 +39,7 @@ public class BpmProcessInstancePageReqVO extends PageParam { | @@ -40,7 +39,7 @@ public class BpmProcessInstancePageReqVO extends PageParam { | ||
| 40 | @Schema(description = "发起用户编号", example = "1024") | 39 | @Schema(description = "发起用户编号", example = "1024") |
| 41 | private Long startUserId; // 注意,只有在【流程实例】菜单,才使用该参数 | 40 | private Long startUserId; // 注意,只有在【流程实例】菜单,才使用该参数 |
| 42 | 41 | ||
| 43 | - @Schema(description = "动态表单字段查询JSON Str", example = "{}") | ||
| 44 | - private String formFieldsParams; | 42 | + @Schema(description = "动态表单字段查询 JSON Str", example = "{}") |
| 43 | + private String formFieldsParams; // SpringMVC 在 get 请求下,无法方便的定义 Map 类型的参数,所以通过 String 接收后,逻辑里面转换 | ||
| 45 | 44 | ||
| 46 | } | 45 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
| @@ -7,7 +7,6 @@ import cn.hutool.core.lang.Assert; | @@ -7,7 +7,6 @@ import cn.hutool.core.lang.Assert; | ||
| 7 | import cn.hutool.core.util.ArrayUtil; | 7 | import cn.hutool.core.util.ArrayUtil; |
| 8 | import cn.hutool.core.util.ObjectUtil; | 8 | import cn.hutool.core.util.ObjectUtil; |
| 9 | import cn.hutool.core.util.StrUtil; | 9 | import cn.hutool.core.util.StrUtil; |
| 10 | -import cn.hutool.json.JSONObject; | ||
| 11 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 10 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 12 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; | 11 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; |
| 13 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 12 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| @@ -134,69 +133,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -134,69 +133,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 134 | 133 | ||
| 135 | @Override | 134 | @Override |
| 136 | public HistoricProcessInstance getHistoricProcessInstance(String id) { | 135 | public HistoricProcessInstance getHistoricProcessInstance(String id) { |
| 137 | - return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).includeProcessVariables().singleResult(); | 136 | + return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).includeProcessVariables() |
| 137 | + .singleResult(); | ||
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | @Override | 140 | @Override |
| 141 | public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) { | 141 | public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) { |
| 142 | - return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables().list(); | ||
| 143 | - } | ||
| 144 | - | ||
| 145 | - @Override | ||
| 146 | - public PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId, | ||
| 147 | - BpmProcessInstancePageReqVO pageReqVO) { | ||
| 148 | - // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 | ||
| 149 | - HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() | ||
| 150 | - .includeProcessVariables() | ||
| 151 | - .processInstanceTenantId(FlowableUtils.getTenantId()) | ||
| 152 | - .orderByProcessInstanceStartTime().desc(); | ||
| 153 | - if (userId != null) { // 【我的流程】菜单时,需要传递该字段 | ||
| 154 | - processInstanceQuery.startedBy(String.valueOf(userId)); | ||
| 155 | - } else if (pageReqVO.getStartUserId() != null) { // 【管理流程】菜单时,才会传递该字段 | ||
| 156 | - processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); | ||
| 157 | - } | ||
| 158 | - if (StrUtil.isNotEmpty(pageReqVO.getName())) { | ||
| 159 | - processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); | ||
| 160 | - } | ||
| 161 | - if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { | ||
| 162 | - processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); | ||
| 163 | - } | ||
| 164 | - if (StrUtil.isNotEmpty(pageReqVO.getCategory())) { | ||
| 165 | - processInstanceQuery.processDefinitionCategory(pageReqVO.getCategory()); | ||
| 166 | - } | ||
| 167 | - if (pageReqVO.getStatus() != null) { | ||
| 168 | - processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); | ||
| 169 | - } | ||
| 170 | - if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { | ||
| 171 | - processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); | ||
| 172 | - processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); | ||
| 173 | - } | ||
| 174 | - if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { | ||
| 175 | - processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); | ||
| 176 | - processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); | ||
| 177 | - } | ||
| 178 | - // 表单字段查询 | ||
| 179 | - // TODO 应支持多种类型的查询方式,目前只有字符串全等 | ||
| 180 | - if (StrUtil.isNotEmpty(pageReqVO.getFormFieldsParams())) { | ||
| 181 | - JSONObject formFieldsParams = new JSONObject(pageReqVO.getFormFieldsParams()); | ||
| 182 | - for (Map.Entry<String, Object> field : formFieldsParams.entrySet()) { | ||
| 183 | - if (StrUtil.isNotEmpty(field.getValue().toString())) { | ||
| 184 | - processInstanceQuery.variableValueEquals(field.getKey(), field.getValue()); | ||
| 185 | - } | ||
| 186 | - } | ||
| 187 | - } | ||
| 188 | - // 查询数量 | ||
| 189 | - long processInstanceCount = processInstanceQuery.count(); | ||
| 190 | - if (processInstanceCount == 0) { | ||
| 191 | - return PageResult.empty(processInstanceCount); | ||
| 192 | - } | ||
| 193 | - // 查询列表 | ||
| 194 | - List<HistoricProcessInstance> processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); | ||
| 195 | - return new PageResult<>(processInstanceList, processInstanceCount); | 142 | + return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables() |
| 143 | + .list(); | ||
| 196 | } | 144 | } |
| 197 | 145 | ||
| 198 | private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel, | 146 | private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel, |
| 199 | - String activityId, String taskId) { | 147 | + String activityId, String taskId) { |
| 200 | // 1. 获取流程活动编号。流程活动 Id 为空事,从流程任务中获取流程活动 Id | 148 | // 1. 获取流程活动编号。流程活动 Id 为空事,从流程任务中获取流程活动 Id |
| 201 | if (StrUtil.isEmpty(activityId) && StrUtil.isNotEmpty(taskId)) { | 149 | if (StrUtil.isEmpty(activityId) && StrUtil.isNotEmpty(taskId)) { |
| 202 | activityId = Optional.ofNullable(taskService.getHistoricTask(taskId)) | 150 | activityId = Optional.ofNullable(taskService.getHistoricTask(taskId)) |
| @@ -229,8 +177,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -229,8 +177,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 229 | } | 177 | } |
| 230 | // 1.3 读取其它相关数据 | 178 | // 1.3 读取其它相关数据 |
| 231 | ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( | 179 | ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( |
| 232 | - historicProcessInstance != null ? historicProcessInstance.getProcessDefinitionId() : reqVO.getProcessDefinitionId()); | ||
| 233 | - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(processDefinition.getId()); | 180 | + historicProcessInstance != null ? historicProcessInstance.getProcessDefinitionId() |
| 181 | + : reqVO.getProcessDefinitionId()); | ||
| 182 | + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService | ||
| 183 | + .getProcessDefinitionInfo(processDefinition.getId()); | ||
| 234 | BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processDefinition.getId()); | 184 | BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processDefinition.getId()); |
| 235 | 185 | ||
| 236 | // 2.1 已结束 + 进行中的活动节点 | 186 | // 2.1 已结束 + 进行中的活动节点 |
| @@ -239,24 +189,29 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -239,24 +189,29 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 239 | List<HistoricActivityInstance> activities = null; // 流程实例列表 | 189 | List<HistoricActivityInstance> activities = null; // 流程实例列表 |
| 240 | if (reqVO.getProcessInstanceId() != null) { | 190 | if (reqVO.getProcessInstanceId() != null) { |
| 241 | activities = taskService.getActivityListByProcessInstanceId(reqVO.getProcessInstanceId()); | 191 | activities = taskService.getActivityListByProcessInstanceId(reqVO.getProcessInstanceId()); |
| 242 | - List<HistoricTaskInstance> tasks = taskService.getTaskListByProcessInstanceId(reqVO.getProcessInstanceId(), true); | 192 | + List<HistoricTaskInstance> tasks = taskService.getTaskListByProcessInstanceId(reqVO.getProcessInstanceId(), |
| 193 | + true); | ||
| 243 | endActivityNodes = getEndActivityNodeList(startUserId, bpmnModel, processDefinitionInfo, | 194 | endActivityNodes = getEndActivityNodeList(startUserId, bpmnModel, processDefinitionInfo, |
| 244 | historicProcessInstance, processInstanceStatus, activities, tasks); | 195 | historicProcessInstance, processInstanceStatus, activities, tasks); |
| 245 | - runActivityNodes = getRunApproveNodeList(startUserId, bpmnModel, processDefinition, processVariables, activities, tasks); | 196 | + runActivityNodes = getRunApproveNodeList(startUserId, bpmnModel, processDefinition, processVariables, |
| 197 | + activities, tasks); | ||
| 246 | } | 198 | } |
| 247 | 199 | ||
| 248 | // 2.2 流程已经结束,直接 return,无需预测 | 200 | // 2.2 流程已经结束,直接 return,无需预测 |
| 249 | if (BpmProcessInstanceStatusEnum.isProcessEndStatus(processInstanceStatus)) { | 201 | if (BpmProcessInstanceStatusEnum.isProcessEndStatus(processInstanceStatus)) { |
| 250 | - return buildApprovalDetail(reqVO, bpmnModel, processDefinition, processDefinitionInfo, historicProcessInstance, | 202 | + return buildApprovalDetail(reqVO, bpmnModel, processDefinition, processDefinitionInfo, |
| 203 | + historicProcessInstance, | ||
| 251 | processInstanceStatus, endActivityNodes, runActivityNodes, null, null); | 204 | processInstanceStatus, endActivityNodes, runActivityNodes, null, null); |
| 252 | } | 205 | } |
| 253 | 206 | ||
| 254 | // 3.1 计算当前登录用户的待办任务 | 207 | // 3.1 计算当前登录用户的待办任务 |
| 255 | - // TODO @jason:有一个极端情况,如果一个用户有 2 个 task A 和 B,A 已经通过,B 需要审核。这个时,通过 A 进来,todo 拿到 B,会不会表单权限不一致哈。 | 208 | + // TODO @jason:有一个极端情况,如果一个用户有 2 个 task A 和 B,A 已经通过,B 需要审核。这个时,通过 A 进来,todo 拿到 |
| 209 | + // B,会不会表单权限不一致哈。 | ||
| 256 | BpmTaskRespVO todoTask = taskService.getFirstTodoTask(loginUserId, reqVO.getProcessInstanceId()); | 210 | BpmTaskRespVO todoTask = taskService.getFirstTodoTask(loginUserId, reqVO.getProcessInstanceId()); |
| 257 | 211 | ||
| 258 | // 3.2 预测未运行节点的审批信息 | 212 | // 3.2 预测未运行节点的审批信息 |
| 259 | - List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel, processDefinitionInfo, | 213 | + List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel, |
| 214 | + processDefinitionInfo, | ||
| 260 | processVariables, activities); | 215 | processVariables, activities); |
| 261 | 216 | ||
| 262 | // 4. 拼接最终数据 | 217 | // 4. 拼接最终数据 |
| @@ -264,34 +219,93 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -264,34 +219,93 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 264 | processInstanceStatus, endActivityNodes, runActivityNodes, simulateActivityNodes, todoTask); | 219 | processInstanceStatus, endActivityNodes, runActivityNodes, simulateActivityNodes, todoTask); |
| 265 | } | 220 | } |
| 266 | 221 | ||
| 222 | + @Override | ||
| 223 | + @SuppressWarnings("unchecked") | ||
| 224 | + public PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId, | ||
| 225 | + BpmProcessInstancePageReqVO pageReqVO) { | ||
| 226 | + // 1. 构建查询条件 | ||
| 227 | + HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() | ||
| 228 | + .includeProcessVariables() | ||
| 229 | + .processInstanceTenantId(FlowableUtils.getTenantId()) | ||
| 230 | + .orderByProcessInstanceStartTime().desc(); | ||
| 231 | + if (userId != null) { // 【我的流程】菜单时,需要传递该字段 | ||
| 232 | + processInstanceQuery.startedBy(String.valueOf(userId)); | ||
| 233 | + } else if (pageReqVO.getStartUserId() != null) { // 【管理流程】菜单时,才会传递该字段 | ||
| 234 | + processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); | ||
| 235 | + } | ||
| 236 | + if (StrUtil.isNotEmpty(pageReqVO.getName())) { | ||
| 237 | + processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); | ||
| 238 | + } | ||
| 239 | + if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { | ||
| 240 | + processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); | ||
| 241 | + } | ||
| 242 | + if (StrUtil.isNotEmpty(pageReqVO.getCategory())) { | ||
| 243 | + processInstanceQuery.processDefinitionCategory(pageReqVO.getCategory()); | ||
| 244 | + } | ||
| 245 | + if (pageReqVO.getStatus() != null) { | ||
| 246 | + processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, | ||
| 247 | + pageReqVO.getStatus()); | ||
| 248 | + } | ||
| 249 | + if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { | ||
| 250 | + processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); | ||
| 251 | + processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); | ||
| 252 | + } | ||
| 253 | + if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { | ||
| 254 | + processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); | ||
| 255 | + processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); | ||
| 256 | + } | ||
| 257 | + // 表单字段查询 | ||
| 258 | + Map<String, Object> formFieldsParams = JsonUtils.parseObject(pageReqVO.getFormFieldsParams(), Map.class); | ||
| 259 | + if (CollUtil.isNotEmpty(formFieldsParams)) { | ||
| 260 | + formFieldsParams.forEach((key, value) -> { | ||
| 261 | + if (StrUtil.isEmpty(String.valueOf(value))) { | ||
| 262 | + return; | ||
| 263 | + } | ||
| 264 | + // TODO @lesan:应支持多种类型的查询方式,目前只有字符串全等 | ||
| 265 | + processInstanceQuery.variableValueEquals(key, value); | ||
| 266 | + }); | ||
| 267 | + } | ||
| 268 | + | ||
| 269 | + // 2.1 查询数量 | ||
| 270 | + long processInstanceCount = processInstanceQuery.count(); | ||
| 271 | + if (processInstanceCount == 0) { | ||
| 272 | + return PageResult.empty(processInstanceCount); | ||
| 273 | + } | ||
| 274 | + // 2.2 查询列表 | ||
| 275 | + List<HistoricProcessInstance> processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), | ||
| 276 | + pageReqVO.getPageSize()); | ||
| 277 | + return new PageResult<>(processInstanceList, processInstanceCount); | ||
| 278 | + } | ||
| 279 | + | ||
| 267 | /** | 280 | /** |
| 268 | * 拼接审批详情的最终数据 | 281 | * 拼接审批详情的最终数据 |
| 269 | * <p> | 282 | * <p> |
| 270 | * 主要是,拼接审批人的用户信息、部门信息 | 283 | * 主要是,拼接审批人的用户信息、部门信息 |
| 271 | */ | 284 | */ |
| 272 | private BpmApprovalDetailRespVO buildApprovalDetail(BpmApprovalDetailReqVO reqVO, | 285 | private BpmApprovalDetailRespVO buildApprovalDetail(BpmApprovalDetailReqVO reqVO, |
| 273 | - BpmnModel bpmnModel, | ||
| 274 | - ProcessDefinition processDefinition, | ||
| 275 | - BpmProcessDefinitionInfoDO processDefinitionInfo, | ||
| 276 | - HistoricProcessInstance processInstance, | ||
| 277 | - Integer processInstanceStatus, | ||
| 278 | - List<ActivityNode> endApprovalNodeInfos, | ||
| 279 | - List<ActivityNode> runningApprovalNodeInfos, | ||
| 280 | - List<ActivityNode> simulateApprovalNodeInfos, | ||
| 281 | - BpmTaskRespVO todoTask) { | 286 | + BpmnModel bpmnModel, |
| 287 | + ProcessDefinition processDefinition, | ||
| 288 | + BpmProcessDefinitionInfoDO processDefinitionInfo, | ||
| 289 | + HistoricProcessInstance processInstance, | ||
| 290 | + Integer processInstanceStatus, | ||
| 291 | + List<ActivityNode> endApprovalNodeInfos, | ||
| 292 | + List<ActivityNode> runningApprovalNodeInfos, | ||
| 293 | + List<ActivityNode> simulateApprovalNodeInfos, | ||
| 294 | + BpmTaskRespVO todoTask) { | ||
| 282 | // 1. 获取所有需要读取用户信息的 userIds | 295 | // 1. 获取所有需要读取用户信息的 userIds |
| 283 | - List<ActivityNode> approveNodes = newArrayList(asList(endApprovalNodeInfos, runningApprovalNodeInfos, simulateApprovalNodeInfos)); | 296 | + List<ActivityNode> approveNodes = newArrayList( |
| 297 | + asList(endApprovalNodeInfos, runningApprovalNodeInfos, simulateApprovalNodeInfos)); | ||
| 284 | Set<Long> userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds(processInstance, approveNodes, todoTask); | 298 | Set<Long> userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds(processInstance, approveNodes, todoTask); |
| 285 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); | 299 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| 286 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); | 300 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); |
| 287 | 301 | ||
| 288 | - | ||
| 289 | // 2. 表单权限 | 302 | // 2. 表单权限 |
| 290 | String taskId = reqVO.getTaskId() == null && todoTask != null ? todoTask.getId() : reqVO.getTaskId(); | 303 | String taskId = reqVO.getTaskId() == null && todoTask != null ? todoTask.getId() : reqVO.getTaskId(); |
| 291 | Map<String, String> formFieldsPermission = getFormFieldsPermission(bpmnModel, reqVO.getActivityId(), taskId); | 304 | Map<String, String> formFieldsPermission = getFormFieldsPermission(bpmnModel, reqVO.getActivityId(), taskId); |
| 292 | 305 | ||
| 293 | // 3. 拼接数据 | 306 | // 3. 拼接数据 |
| 294 | - return BpmProcessInstanceConvert.INSTANCE.buildApprovalDetail(bpmnModel, processDefinition, processDefinitionInfo, processInstance, | 307 | + return BpmProcessInstanceConvert.INSTANCE.buildApprovalDetail(bpmnModel, processDefinition, |
| 308 | + processDefinitionInfo, processInstance, | ||
| 295 | processInstanceStatus, approveNodes, todoTask, formFieldsPermission, userMap, deptMap); | 309 | processInstanceStatus, approveNodes, todoTask, formFieldsPermission, userMap, deptMap); |
| 296 | } | 310 | } |
| 297 | 311 | ||
| @@ -299,17 +313,19 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -299,17 +313,19 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 299 | * 获得【已结束】的活动节点们 | 313 | * 获得【已结束】的活动节点们 |
| 300 | */ | 314 | */ |
| 301 | private List<ActivityNode> getEndActivityNodeList(Long startUserId, BpmnModel bpmnModel, | 315 | private List<ActivityNode> getEndActivityNodeList(Long startUserId, BpmnModel bpmnModel, |
| 302 | - BpmProcessDefinitionInfoDO processDefinitionInfo, | ||
| 303 | - HistoricProcessInstance historicProcessInstance, Integer processInstanceStatus, | ||
| 304 | - List<HistoricActivityInstance> activities, List<HistoricTaskInstance> tasks) { | 316 | + BpmProcessDefinitionInfoDO processDefinitionInfo, |
| 317 | + HistoricProcessInstance historicProcessInstance, Integer processInstanceStatus, | ||
| 318 | + List<HistoricActivityInstance> activities, List<HistoricTaskInstance> tasks) { | ||
| 305 | // 遍历 tasks 列表,只处理已结束的 UserTask | 319 | // 遍历 tasks 列表,只处理已结束的 UserTask |
| 306 | - // 为什么不通过 activities 呢?因为,加签场景下,它只存在于 tasks,没有 activities,导致如果遍历 activities 的话,它无法成为一个节点 | 320 | + // 为什么不通过 activities 呢?因为,加签场景下,它只存在于 tasks,没有 activities,导致如果遍历 activities |
| 321 | + // 的话,它无法成为一个节点 | ||
| 307 | List<HistoricTaskInstance> endTasks = filterList(tasks, task -> task.getEndTime() != null); | 322 | List<HistoricTaskInstance> endTasks = filterList(tasks, task -> task.getEndTime() != null); |
| 308 | List<ActivityNode> approvalNodes = convertList(endTasks, task -> { | 323 | List<ActivityNode> approvalNodes = convertList(endTasks, task -> { |
| 309 | FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); | 324 | FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); |
| 310 | ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName()) | 325 | ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName()) |
| 311 | - .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) ? | ||
| 312 | - BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() : BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) | 326 | + .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) |
| 327 | + ? BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() | ||
| 328 | + : BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) | ||
| 313 | .setStatus(FlowableUtils.getTaskStatus(task)) | 329 | .setStatus(FlowableUtils.getTaskStatus(task)) |
| 314 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) | 330 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) |
| 315 | .setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime())) | 331 | .setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime())) |
| @@ -334,7 +350,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -334,7 +350,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 334 | .setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) | 350 | .setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) |
| 335 | .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()) | 351 | .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()) |
| 336 | .setStatus(startTask.getStatus()).setTasks(ListUtil.of(startTask)) | 352 | .setStatus(startTask.getStatus()).setTasks(ListUtil.of(startTask)) |
| 337 | - .setStartTime(DateUtils.of(activity.getStartTime())).setEndTime(DateUtils.of(activity.getEndTime())); | 353 | + .setStartTime(DateUtils.of(activity.getStartTime())) |
| 354 | + .setEndTime(DateUtils.of(activity.getEndTime())); | ||
| 338 | approvalNodes.add(0, startNode); | 355 | approvalNodes.add(0, startNode); |
| 339 | return; | 356 | return; |
| 340 | } | 357 | } |
| @@ -347,7 +364,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -347,7 +364,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 347 | ActivityNode endNode = new ActivityNode().setId(activity.getId()) | 364 | ActivityNode endNode = new ActivityNode().setId(activity.getId()) |
| 348 | .setName(BpmSimpleModelNodeTypeEnum.END_NODE.getName()) | 365 | .setName(BpmSimpleModelNodeTypeEnum.END_NODE.getName()) |
| 349 | .setNodeType(BpmSimpleModelNodeTypeEnum.END_NODE.getType()).setStatus(processInstanceStatus) | 366 | .setNodeType(BpmSimpleModelNodeTypeEnum.END_NODE.getType()).setStatus(processInstanceStatus) |
| 350 | - .setStartTime(DateUtils.of(activity.getStartTime())).setEndTime(DateUtils.of(activity.getEndTime())); | 367 | + .setStartTime(DateUtils.of(activity.getStartTime())) |
| 368 | + .setEndTime(DateUtils.of(activity.getEndTime())); | ||
| 351 | String reason = FlowableUtils.getProcessInstanceReason(historicProcessInstance); | 369 | String reason = FlowableUtils.getProcessInstanceReason(historicProcessInstance); |
| 352 | if (StrUtil.isNotEmpty(reason)) { | 370 | if (StrUtil.isNotEmpty(reason)) { |
| 353 | endNode.setTasks(singletonList(new ActivityNodeTask().setId(endNode.getId()) | 371 | endNode.setTasks(singletonList(new ActivityNodeTask().setId(endNode.getId()) |
| @@ -363,15 +381,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -363,15 +381,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 363 | * 获得【进行中】的活动节点们 | 381 | * 获得【进行中】的活动节点们 |
| 364 | */ | 382 | */ |
| 365 | private List<ActivityNode> getRunApproveNodeList(Long startUserId, | 383 | private List<ActivityNode> getRunApproveNodeList(Long startUserId, |
| 366 | - BpmnModel bpmnModel, | ||
| 367 | - ProcessDefinition processDefinition, | ||
| 368 | - Map<String, Object> processVariables, | ||
| 369 | - List<HistoricActivityInstance> activities, | ||
| 370 | - List<HistoricTaskInstance> tasks) { | 384 | + BpmnModel bpmnModel, |
| 385 | + ProcessDefinition processDefinition, | ||
| 386 | + Map<String, Object> processVariables, | ||
| 387 | + List<HistoricActivityInstance> activities, | ||
| 388 | + List<HistoricTaskInstance> tasks) { | ||
| 371 | // 构建运行中的任务,基于 activityId 分组 | 389 | // 构建运行中的任务,基于 activityId 分组 |
| 372 | List<HistoricActivityInstance> runActivities = filterList(activities, activity -> activity.getEndTime() == null | 390 | List<HistoricActivityInstance> runActivities = filterList(activities, activity -> activity.getEndTime() == null |
| 373 | && (StrUtil.equalsAny(activity.getActivityType(), ELEMENT_TASK_USER))); | 391 | && (StrUtil.equalsAny(activity.getActivityType(), ELEMENT_TASK_USER))); |
| 374 | - Map<String, List<HistoricActivityInstance>> runningTaskMap = convertMultiMap(runActivities, HistoricActivityInstance::getActivityId); | 392 | + Map<String, List<HistoricActivityInstance>> runningTaskMap = convertMultiMap(runActivities, |
| 393 | + HistoricActivityInstance::getActivityId); | ||
| 375 | 394 | ||
| 376 | // 按照 activityId 分组,构建 ApprovalNodeInfo 节点 | 395 | // 按照 activityId 分组,构建 ApprovalNodeInfo 节点 |
| 377 | Map<String, HistoricTaskInstance> taskMap = convertMap(tasks, HistoricTaskInstance::getId); | 396 | Map<String, HistoricTaskInstance> taskMap = convertMap(tasks, HistoricTaskInstance::getId); |
| @@ -381,8 +400,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -381,8 +400,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 381 | // 构建活动节点 | 400 | // 构建活动节点 |
| 382 | FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, activityId); | 401 | FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, activityId); |
| 383 | HistoricActivityInstance firstActivity = CollUtil.getFirst(taskActivities); // 取第一个任务,会签/或签的任务,开始时间相同 | 402 | HistoricActivityInstance firstActivity = CollUtil.getFirst(taskActivities); // 取第一个任务,会签/或签的任务,开始时间相同 |
| 384 | - ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()).setName(firstActivity.getActivityName()) | ||
| 385 | - .setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()).setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) | 403 | + ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()) |
| 404 | + .setName(firstActivity.getActivityName()) | ||
| 405 | + .setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) | ||
| 406 | + .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) | ||
| 386 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) | 407 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) |
| 387 | .setStartTime(DateUtils.of(CollUtil.getFirst(taskActivities).getStartTime())) | 408 | .setStartTime(DateUtils.of(CollUtil.getFirst(taskActivities).getStartTime())) |
| 388 | .setTasks(new ArrayList<>()); | 409 | .setTasks(new ArrayList<>()); |
| @@ -395,7 +416,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -395,7 +416,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 395 | taskService.getAllChildrenTaskListByParentTaskId(activity.getTaskId(), tasks), | 416 | taskService.getAllChildrenTaskListByParentTaskId(activity.getTaskId(), tasks), |
| 396 | childTask -> childTask.getEndTime() == null); | 417 | childTask -> childTask.getEndTime() == null); |
| 397 | if (CollUtil.isNotEmpty(childrenTasks)) { | 418 | if (CollUtil.isNotEmpty(childrenTasks)) { |
| 398 | - activityNode.getTasks().addAll(convertList(childrenTasks, BpmProcessInstanceConvert.INSTANCE::buildApprovalTaskInfo)); | 419 | + activityNode.getTasks().addAll( |
| 420 | + convertList(childrenTasks, BpmProcessInstanceConvert.INSTANCE::buildApprovalTaskInfo)); | ||
| 399 | } | 421 | } |
| 400 | } | 422 | } |
| 401 | // 处理每个任务的 candidateUsers 属性:如果是依次审批,需要预测它的后续审批人。因为 Task 是审批完一个,创建一个新的 Task | 423 | // 处理每个任务的 candidateUsers 属性:如果是依次审批,需要预测它的后续审批人。因为 Task 是审批完一个,创建一个新的 Task |
| @@ -405,8 +427,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -405,8 +427,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 405 | // 截取当前审批人位置后面的候选人,不包含当前审批人 | 427 | // 截取当前审批人位置后面的候选人,不包含当前审批人 |
| 406 | ActivityNodeTask approvalTaskInfo = CollUtil.getFirst(activityNode.getTasks()); | 428 | ActivityNodeTask approvalTaskInfo = CollUtil.getFirst(activityNode.getTasks()); |
| 407 | Assert.notNull(approvalTaskInfo, "任务不能为空"); | 429 | Assert.notNull(approvalTaskInfo, "任务不能为空"); |
| 408 | - int index = CollUtil.indexOf(candidateUserIds, userId -> ObjectUtils.equalsAny(userId, approvalTaskInfo.getOwner(), | ||
| 409 | - approvalTaskInfo.getAssignee())); // 委派或者向前加签情况,需要先比较 owner | 430 | + int index = CollUtil.indexOf(candidateUserIds, |
| 431 | + userId -> ObjectUtils.equalsAny(userId, approvalTaskInfo.getOwner(), | ||
| 432 | + approvalTaskInfo.getAssignee())); // 委派或者向前加签情况,需要先比较 owner | ||
| 410 | activityNode.setCandidateUserIds(CollUtil.sub(candidateUserIds, index + 1, candidateUserIds.size())); | 433 | activityNode.setCandidateUserIds(CollUtil.sub(candidateUserIds, index + 1, candidateUserIds.size())); |
| 411 | } | 434 | } |
| 412 | return activityNode; | 435 | return activityNode; |
| @@ -417,10 +440,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -417,10 +440,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 417 | * 获得【预测(未来)】的活动节点们 | 440 | * 获得【预测(未来)】的活动节点们 |
| 418 | */ | 441 | */ |
| 419 | private List<ActivityNode> getSimulateApproveNodeList(Long startUserId, BpmnModel bpmnModel, | 442 | private List<ActivityNode> getSimulateApproveNodeList(Long startUserId, BpmnModel bpmnModel, |
| 420 | - BpmProcessDefinitionInfoDO processDefinitionInfo, | ||
| 421 | - Map<String, Object> processVariables, | ||
| 422 | - List<HistoricActivityInstance> activities) { | ||
| 423 | - // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance 包括了历史的操作,不是只有 startEvent 到当前节点的记录 | 443 | + BpmProcessDefinitionInfoDO processDefinitionInfo, |
| 444 | + Map<String, Object> processVariables, | ||
| 445 | + List<HistoricActivityInstance> activities) { | ||
| 446 | + // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance | ||
| 447 | + // 包括了历史的操作,不是只有 startEvent 到当前节点的记录 | ||
| 424 | Set<String> runActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId); | 448 | Set<String> runActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId); |
| 425 | // 情况一:BPMN 设计器 | 449 | // 情况一:BPMN 设计器 |
| 426 | if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) { | 450 | if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) { |
| @@ -430,7 +454,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -430,7 +454,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 430 | } | 454 | } |
| 431 | // 情况二:SIMPLE 设计器 | 455 | // 情况二:SIMPLE 设计器 |
| 432 | if (Objects.equals(BpmModelTypeEnum.SIMPLE.getType(), processDefinitionInfo.getModelType())) { | 456 | if (Objects.equals(BpmModelTypeEnum.SIMPLE.getType(), processDefinitionInfo.getModelType())) { |
| 433 | - BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), BpmSimpleModelNodeVO.class); | 457 | + BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), |
| 458 | + BpmSimpleModelNodeVO.class); | ||
| 434 | List<BpmSimpleModelNodeVO> simpleNodes = SimpleModelUtils.simulateProcess(simpleModel, processVariables); | 459 | List<BpmSimpleModelNodeVO> simpleNodes = SimpleModelUtils.simulateProcess(simpleModel, processVariables); |
| 435 | return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(startUserId, bpmnModel, | 460 | return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(startUserId, bpmnModel, |
| 436 | processDefinitionInfo, processVariables, simpleNode, runActivityIds)); | 461 | processDefinitionInfo, processVariables, simpleNode, runActivityIds)); |
| @@ -439,9 +464,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -439,9 +464,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 439 | } | 464 | } |
| 440 | 465 | ||
| 441 | private ActivityNode buildNotRunApproveNodeForSimple(Long startUserId, BpmnModel bpmnModel, | 466 | private ActivityNode buildNotRunApproveNodeForSimple(Long startUserId, BpmnModel bpmnModel, |
| 442 | - BpmProcessDefinitionInfoDO processDefinitionInfo, Map<String, Object> processVariables, | ||
| 443 | - BpmSimpleModelNodeVO node, Set<String> runActivityIds) { | ||
| 444 | - // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance 包括了历史的操作,不是只有 startEvent 到当前节点的记录 | 467 | + BpmProcessDefinitionInfoDO processDefinitionInfo, Map<String, Object> processVariables, |
| 468 | + BpmSimpleModelNodeVO node, Set<String> runActivityIds) { | ||
| 469 | + // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance | ||
| 470 | + // 包括了历史的操作,不是只有 startEvent 到当前节点的记录 | ||
| 445 | if (runActivityIds.contains(node.getId())) { | 471 | if (runActivityIds.contains(node.getId())) { |
| 446 | return null; | 472 | return null; |
| 447 | } | 473 | } |
| @@ -474,12 +500,13 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -474,12 +500,13 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 474 | } | 500 | } |
| 475 | 501 | ||
| 476 | private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel, | 502 | private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel, |
| 477 | - BpmProcessDefinitionInfoDO processDefinitionInfo, Map<String, Object> processVariables, | ||
| 478 | - FlowElement node, Set<String> runActivityIds) { | 503 | + BpmProcessDefinitionInfoDO processDefinitionInfo, Map<String, Object> processVariables, |
| 504 | + FlowElement node, Set<String> runActivityIds) { | ||
| 479 | if (runActivityIds.contains(node.getId())) { | 505 | if (runActivityIds.contains(node.getId())) { |
| 480 | return null; | 506 | return null; |
| 481 | } | 507 | } |
| 482 | - ActivityNode activityNode = new ActivityNode().setId(node.getId()).setStatus(BpmTaskStatusEnum.NOT_START.getStatus()); | 508 | + ActivityNode activityNode = new ActivityNode().setId(node.getId()) |
| 509 | + .setStatus(BpmTaskStatusEnum.NOT_START.getStatus()); | ||
| 483 | 510 | ||
| 484 | // 1. 开始节点 | 511 | // 1. 开始节点 |
| 485 | if (node instanceof StartEvent) { | 512 | if (node instanceof StartEvent) { |
| @@ -505,7 +532,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -505,7 +532,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 505 | } | 532 | } |
| 506 | 533 | ||
| 507 | private List<Long> getTaskCandidateUserList(BpmnModel bpmnModel, String activityId, | 534 | private List<Long> getTaskCandidateUserList(BpmnModel bpmnModel, String activityId, |
| 508 | - Long startUserId, String processDefinitionId, Map<String, Object> processVariables) { | 535 | + Long startUserId, String processDefinitionId, Map<String, Object> processVariables) { |
| 509 | Set<Long> userIds = taskCandidateInvoker.calculateUsersByActivity(bpmnModel, activityId, | 536 | Set<Long> userIds = taskCandidateInvoker.calculateUsersByActivity(bpmnModel, activityId, |
| 510 | startUserId, processDefinitionId, processVariables); | 537 | startUserId, processDefinitionId, processVariables); |
| 511 | return new ArrayList<>(userIds); | 538 | return new ArrayList<>(userIds); |
| @@ -519,14 +546,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -519,14 +546,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 519 | return null; | 546 | return null; |
| 520 | } | 547 | } |
| 521 | // 1.2 获得流程定义 | 548 | // 1.2 获得流程定义 |
| 522 | - BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()); | 549 | + BpmnModel bpmnModel = processDefinitionService |
| 550 | + .getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()); | ||
| 523 | if (bpmnModel == null) { | 551 | if (bpmnModel == null) { |
| 524 | return null; | 552 | return null; |
| 525 | } | 553 | } |
| 526 | BpmSimpleModelNodeVO simpleModel = null; | 554 | BpmSimpleModelNodeVO simpleModel = null; |
| 527 | BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( | 555 | BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( |
| 528 | processInstance.getProcessDefinitionId()); | 556 | processInstance.getProcessDefinitionId()); |
| 529 | - if (processDefinitionInfo != null && BpmModelTypeEnum.SIMPLE.getType().equals(processDefinitionInfo.getModelType())) { | 557 | + if (processDefinitionInfo != null |
| 558 | + && BpmModelTypeEnum.SIMPLE.getType().equals(processDefinitionInfo.getModelType())) { | ||
| 530 | simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), BpmSimpleModelNodeVO.class); | 559 | simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), BpmSimpleModelNodeVO.class); |
| 531 | } | 560 | } |
| 532 | // 1.3 获得流程实例对应的活动实例列表 + 任务列表 | 561 | // 1.3 获得流程实例对应的活动实例列表 + 任务列表 |
| @@ -538,10 +567,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -538,10 +567,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 538 | activityInstance -> activityInstance.getEndTime() == null); | 567 | activityInstance -> activityInstance.getEndTime() == null); |
| 539 | Set<String> finishedTaskActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, | 568 | Set<String> finishedTaskActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, |
| 540 | activityInstance -> activityInstance.getEndTime() != null | 569 | activityInstance -> activityInstance.getEndTime() != null |
| 541 | - && ObjectUtil.notEqual(activityInstance.getActivityType(), BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); | 570 | + && ObjectUtil.notEqual(activityInstance.getActivityType(), |
| 571 | + BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); | ||
| 542 | Set<String> finishedSequenceFlowActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, | 572 | Set<String> finishedSequenceFlowActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, |
| 543 | activityInstance -> activityInstance.getEndTime() != null | 573 | activityInstance -> activityInstance.getEndTime() != null |
| 544 | - && ObjectUtil.equals(activityInstance.getActivityType(), BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); | 574 | + && ObjectUtil.equals(activityInstance.getActivityType(), |
| 575 | + BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); | ||
| 545 | // 特殊:会签情况下,会有部分已完成(审批)、部分未完成(待审批),此时需要 finishedTaskActivityIds 移除掉 | 576 | // 特殊:会签情况下,会有部分已完成(审批)、部分未完成(待审批),此时需要 finishedTaskActivityIds 移除掉 |
| 546 | finishedTaskActivityIds.removeAll(unfinishedTaskActivityIds); | 577 | finishedTaskActivityIds.removeAll(unfinishedTaskActivityIds); |
| 547 | // 特殊:如果流程实例被拒绝,则需要计算是哪个活动节点。 | 578 | // 特殊:如果流程实例被拒绝,则需要计算是哪个活动节点。 |
| @@ -559,8 +590,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -559,8 +590,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 559 | Set<Long> userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds02(processInstance, tasks); | 590 | Set<Long> userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds02(processInstance, tasks); |
| 560 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); | 591 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| 561 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); | 592 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); |
| 562 | - return BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceBpmnModelView(processInstance, tasks, bpmnModel, simpleModel, | ||
| 563 | - unfinishedTaskActivityIds, finishedTaskActivityIds, finishedSequenceFlowActivityIds, rejectTaskActivityIds, | 593 | + return BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceBpmnModelView(processInstance, tasks, bpmnModel, |
| 594 | + simpleModel, | ||
| 595 | + unfinishedTaskActivityIds, finishedTaskActivityIds, finishedSequenceFlowActivityIds, | ||
| 596 | + rejectTaskActivityIds, | ||
| 564 | userMap, deptMap); | 597 | userMap, deptMap); |
| 565 | } | 598 | } |
| 566 | 599 | ||
| @@ -570,7 +603,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -570,7 +603,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 570 | @Transactional(rollbackFor = Exception.class) | 603 | @Transactional(rollbackFor = Exception.class) |
| 571 | public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { | 604 | public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { |
| 572 | // 获得流程定义 | 605 | // 获得流程定义 |
| 573 | - ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); | 606 | + ProcessDefinition definition = processDefinitionService |
| 607 | + .getProcessDefinition(createReqVO.getProcessDefinitionId()); | ||
| 574 | // 发起流程 | 608 | // 发起流程 |
| 575 | return createProcessInstance0(userId, definition, createReqVO.getVariables(), null, | 609 | return createProcessInstance0(userId, definition, createReqVO.getVariables(), null, |
| 576 | createReqVO.getStartUserSelectAssignees()); | 610 | createReqVO.getStartUserSelectAssignees()); |
| @@ -580,16 +614,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -580,16 +614,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 580 | public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { | 614 | public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { |
| 581 | return FlowableUtils.executeAuthenticatedUserId(userId, () -> { | 615 | return FlowableUtils.executeAuthenticatedUserId(userId, () -> { |
| 582 | // 获得流程定义 | 616 | // 获得流程定义 |
| 583 | - ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); | 617 | + ProcessDefinition definition = processDefinitionService |
| 618 | + .getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); | ||
| 584 | // 发起流程 | 619 | // 发起流程 |
| 585 | - return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey(), | 620 | + return createProcessInstance0(userId, definition, createReqDTO.getVariables(), |
| 621 | + createReqDTO.getBusinessKey(), | ||
| 586 | createReqDTO.getStartUserSelectAssignees()); | 622 | createReqDTO.getStartUserSelectAssignees()); |
| 587 | }); | 623 | }); |
| 588 | } | 624 | } |
| 589 | 625 | ||
| 590 | private String createProcessInstance0(Long userId, ProcessDefinition definition, | 626 | private String createProcessInstance0(Long userId, ProcessDefinition definition, |
| 591 | - Map<String, Object> variables, String businessKey, | ||
| 592 | - Map<String, List<Long>> startUserSelectAssignees) { | 627 | + Map<String, Object> variables, String businessKey, |
| 628 | + Map<String, List<Long>> startUserSelectAssignees) { | ||
| 593 | // 1.1 校验流程定义 | 629 | // 1.1 校验流程定义 |
| 594 | if (definition == null) { | 630 | if (definition == null) { |
| 595 | throw exception(PROCESS_DEFINITION_NOT_EXISTS); | 631 | throw exception(PROCESS_DEFINITION_NOT_EXISTS); |
| @@ -597,7 +633,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -597,7 +633,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 597 | if (definition.isSuspended()) { | 633 | if (definition.isSuspended()) { |
| 598 | throw exception(PROCESS_DEFINITION_IS_SUSPENDED); | 634 | throw exception(PROCESS_DEFINITION_IS_SUSPENDED); |
| 599 | } | 635 | } |
| 600 | - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(definition.getId()); | 636 | + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService |
| 637 | + .getProcessDefinitionInfo(definition.getId()); | ||
| 601 | if (processDefinitionInfo == null) { | 638 | if (processDefinitionInfo == null) { |
| 602 | throw exception(PROCESS_DEFINITION_NOT_EXISTS); | 639 | throw exception(PROCESS_DEFINITION_NOT_EXISTS); |
| 603 | } | 640 | } |
| @@ -616,9 +653,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -616,9 +653,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 616 | variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, userId); // 设置流程变量,发起人 ID | 653 | variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, userId); // 设置流程变量,发起人 ID |
| 617 | variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 流程实例状态:审批中 | 654 | variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 流程实例状态:审批中 |
| 618 | BpmProcessInstanceStatusEnum.RUNNING.getStatus()); | 655 | BpmProcessInstanceStatusEnum.RUNNING.getStatus()); |
| 619 | - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达式需要添加此变量为 true,不影响没配置 skipExpression 的节点 | 656 | + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达式需要添加此变量为 |
| 657 | + // true,不影响没配置 | ||
| 658 | + // skipExpression 的节点 | ||
| 620 | if (CollUtil.isNotEmpty(startUserSelectAssignees)) { | 659 | if (CollUtil.isNotEmpty(startUserSelectAssignees)) { |
| 621 | - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees); | 660 | + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, |
| 661 | + startUserSelectAssignees); | ||
| 622 | } | 662 | } |
| 623 | 663 | ||
| 624 | // 3. 创建流程 | 664 | // 3. 创建流程 |
| @@ -648,7 +688,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -648,7 +688,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 648 | return instance.getId(); | 688 | return instance.getId(); |
| 649 | } | 689 | } |
| 650 | 690 | ||
| 651 | - private void validateStartUserSelectAssignees(ProcessDefinition definition, Map<String, List<Long>> startUserSelectAssignees) { | 691 | + private void validateStartUserSelectAssignees(ProcessDefinition definition, |
| 692 | + Map<String, List<Long>> startUserSelectAssignees) { | ||
| 652 | // 1. 获得发起人自选审批人的 UserTask/ServiceTask 列表 | 693 | // 1. 获得发起人自选审批人的 UserTask/ServiceTask 列表 |
| 653 | BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(definition.getId()); | 694 | BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(definition.getId()); |
| 654 | List<Task> tasks = BpmTaskCandidateStartUserSelectStrategy.getStartUserSelectTaskList(bpmnModel); | 695 | List<Task> tasks = BpmTaskCandidateStartUserSelectStrategy.getStartUserSelectTaskList(bpmnModel); |
| @@ -683,7 +724,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -683,7 +724,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 683 | throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); | 724 | throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); |
| 684 | } | 725 | } |
| 685 | // 1.3 校验允许撤销审批中的申请 | 726 | // 1.3 校验允许撤销审批中的申请 |
| 686 | - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(instance.getProcessDefinitionId()); | 727 | + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService |
| 728 | + .getProcessDefinitionInfo(instance.getProcessDefinitionId()); | ||
| 687 | Assert.notNull(processDefinitionInfo, "流程定义({})不存在", processDefinitionInfo); | 729 | Assert.notNull(processDefinitionInfo, "流程定义({})不存在", processDefinitionInfo); |
| 688 | if (processDefinitionInfo.getAllowCancelRunningProcess() != null // 防止未配置 AllowCancelRunningProcess , 默认为可取消 | 730 | if (processDefinitionInfo.getAllowCancelRunningProcess() != null // 防止未配置 AllowCancelRunningProcess , 默认为可取消 |
| 689 | && Boolean.FALSE.equals(processDefinitionInfo.getAllowCancelRunningProcess())) { | 731 | && Boolean.FALSE.equals(processDefinitionInfo.getAllowCancelRunningProcess())) { |
| @@ -721,9 +763,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -721,9 +763,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 721 | 763 | ||
| 722 | @Override | 764 | @Override |
| 723 | public void updateProcessInstanceReject(ProcessInstance processInstance, String reason) { | 765 | public void updateProcessInstanceReject(ProcessInstance processInstance, String reason) { |
| 724 | - runtimeService.setVariable(processInstance.getProcessInstanceId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, | 766 | + runtimeService.setVariable(processInstance.getProcessInstanceId(), |
| 767 | + BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, | ||
| 725 | BpmProcessInstanceStatusEnum.REJECT.getStatus()); | 768 | BpmProcessInstanceStatusEnum.REJECT.getStatus()); |
| 726 | - runtimeService.setVariable(processInstance.getProcessInstanceId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON, | 769 | + runtimeService.setVariable(processInstance.getProcessInstanceId(), |
| 770 | + BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON, | ||
| 727 | BpmReasonEnum.REJECT_TASK.format(reason)); | 771 | BpmReasonEnum.REJECT_TASK.format(reason)); |
| 728 | } | 772 | } |
| 729 | 773 | ||
| @@ -734,18 +778,22 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -734,18 +778,22 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 734 | // 注意:需要基于 instance 设置租户编号,避免 Flowable 内部异步时,丢失租户编号 | 778 | // 注意:需要基于 instance 设置租户编号,避免 Flowable 内部异步时,丢失租户编号 |
| 735 | FlowableUtils.execute(instance.getTenantId(), () -> { | 779 | FlowableUtils.execute(instance.getTenantId(), () -> { |
| 736 | // 1.1 获取当前状态 | 780 | // 1.1 获取当前状态 |
| 737 | - Integer status = (Integer) instance.getProcessVariables().get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); | ||
| 738 | - String reason = (String) instance.getProcessVariables().get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON); | 781 | + Integer status = (Integer) instance.getProcessVariables() |
| 782 | + .get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); | ||
| 783 | + String reason = (String) instance.getProcessVariables() | ||
| 784 | + .get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON); | ||
| 739 | // 1.2 当流程状态还是审批状态中,说明审批通过了,则变更下它的状态 | 785 | // 1.2 当流程状态还是审批状态中,说明审批通过了,则变更下它的状态 |
| 740 | // 为什么这么处理?因为流程完成,并且完成了,说明审批通过了 | 786 | // 为什么这么处理?因为流程完成,并且完成了,说明审批通过了 |
| 741 | if (Objects.equals(status, BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { | 787 | if (Objects.equals(status, BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { |
| 742 | status = BpmProcessInstanceStatusEnum.APPROVE.getStatus(); | 788 | status = BpmProcessInstanceStatusEnum.APPROVE.getStatus(); |
| 743 | - runtimeService.setVariable(instance.getId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, status); | 789 | + runtimeService.setVariable(instance.getId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, |
| 790 | + status); | ||
| 744 | } | 791 | } |
| 745 | 792 | ||
| 746 | // 2. 发送对应的消息通知 | 793 | // 2. 发送对应的消息通知 |
| 747 | if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) { | 794 | if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) { |
| 748 | - messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceApproveMessage(instance)); | 795 | + messageService.sendMessageWhenProcessInstanceApprove( |
| 796 | + BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceApproveMessage(instance)); | ||
| 749 | } else if (Objects.equals(status, BpmProcessInstanceStatusEnum.REJECT.getStatus())) { | 797 | } else if (Objects.equals(status, BpmProcessInstanceStatusEnum.REJECT.getStatus())) { |
| 750 | messageService.sendMessageWhenProcessInstanceReject( | 798 | messageService.sendMessageWhenProcessInstanceReject( |
| 751 | BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceRejectMessage(instance, reason)); | 799 | BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceRejectMessage(instance, reason)); |