Commit e969dbe8b74a770828c4c9b6ec69ac6ceb05d120
1 parent
848913bf
工作流的 code review
Showing
5 changed files
with
25 additions
and
22 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/TaskController.java
| 1 | package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow; | 1 | package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.io.IoUtil; | ||
| 3 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; | 4 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; |
| 4 | import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; | 5 | import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| @@ -60,6 +61,7 @@ public class TaskController { | @@ -60,6 +61,7 @@ public class TaskController { | ||
| 60 | return success(taskService.getHistorySteps(processInstanceId)); | 61 | return success(taskService.getHistorySteps(processInstanceId)); |
| 61 | } | 62 | } |
| 62 | 63 | ||
| 64 | + // TODO @Li: 项目里,暂时不使用 path 路径参数,监控等麻烦 | ||
| 63 | /** | 65 | /** |
| 64 | * 返回高亮的流转图SVG | 66 | * 返回高亮的流转图SVG |
| 65 | * @param processInstanceId | 67 | * @param processInstanceId |
| @@ -70,6 +72,4 @@ public class TaskController { | @@ -70,6 +72,4 @@ public class TaskController { | ||
| 70 | ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte()); | 72 | ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte()); |
| 71 | } | 73 | } |
| 72 | 74 | ||
| 73 | - | ||
| 74 | - | ||
| 75 | } | 75 | } |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/FileResp.java
| @@ -2,12 +2,15 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; | @@ -2,12 +2,15 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo; | ||
| 2 | 2 | ||
| 3 | import lombok.Data; | 3 | import lombok.Data; |
| 4 | 4 | ||
| 5 | +// TODO @Li:1)改成 HighlightImgRespVO 吧。2)swagger 注解要补充;3)fileByte => fileContent | ||
| 5 | /** | 6 | /** |
| 6 | * 文件输出类 | 7 | * 文件输出类 |
| 8 | + * | ||
| 7 | * @author yunlongn | 9 | * @author yunlongn |
| 8 | */ | 10 | */ |
| 9 | @Data | 11 | @Data |
| 10 | public class FileResp { | 12 | public class FileResp { |
| 13 | + | ||
| 11 | /** | 14 | /** |
| 12 | * 文件名字 | 15 | * 文件名字 |
| 13 | */ | 16 | */ |
| @@ -17,4 +20,5 @@ public class FileResp { | @@ -17,4 +20,5 @@ public class FileResp { | ||
| 17 | * 文件输出流 | 20 | * 文件输出流 |
| 18 | */ | 21 | */ |
| 19 | private byte[] fileByte; | 22 | private byte[] fileByte; |
| 23 | + | ||
| 20 | } | 24 | } |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/oa/OAErrorCodeConstants.java
| 1 | package cn.iocoder.yudao.adminserver.modules.bpm.enums.oa; | 1 | package cn.iocoder.yudao.adminserver.modules.bpm.enums.oa; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.exception.ErrorCode; | 3 | import cn.iocoder.yudao.framework.common.exception.ErrorCode; |
| 4 | + | ||
| 5 | +// TODO @jason:错误码整理下,和其它模块保持一致。包括前缀 | ||
| 4 | /** | 6 | /** |
| 5 | * activiti 系统 错误码枚举类 | 7 | * activiti 系统 错误码枚举类 |
| 6 | * | 8 | * |
| @@ -9,6 +11,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; | @@ -9,6 +11,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; | ||
| 9 | * activiti 系统,使用 1-003-000-000 段 | 11 | * activiti 系统,使用 1-003-000-000 段 |
| 10 | */ | 12 | */ |
| 11 | public interface OAErrorCodeConstants { | 13 | public interface OAErrorCodeConstants { |
| 14 | + | ||
| 12 | ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在"); | 15 | ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在"); |
| 13 | ErrorCode PM_POST_NOT_EXISTS = new ErrorCode(1003001002, "项目经理岗位未设置"); | 16 | ErrorCode PM_POST_NOT_EXISTS = new ErrorCode(1003001002, "项目经理岗位未设置"); |
| 14 | ErrorCode DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1003001003, "部门的项目经理不存在"); | 17 | ErrorCode DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1003001003, "部门的项目经理不存在"); |
| @@ -19,4 +22,5 @@ public interface OAErrorCodeConstants { | @@ -19,4 +22,5 @@ public interface OAErrorCodeConstants { | ||
| 19 | 22 | ||
| 20 | ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1003001008, "流程实例不存在"); | 23 | ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1003001008, "流程实例不存在"); |
| 21 | ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1003001009, "获取高亮流程图异常"); | 24 | ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1003001009, "获取高亮流程图异常"); |
| 25 | + | ||
| 22 | } | 26 | } |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/TaskServiceImpl.java
| @@ -5,7 +5,6 @@ import cn.hutool.core.io.IoUtil; | @@ -5,7 +5,6 @@ import cn.hutool.core.io.IoUtil; | ||
| 5 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; | 5 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; |
| 6 | import cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow.TaskConvert; | 6 | import cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow.TaskConvert; |
| 7 | import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; | 7 | import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; |
| 8 | -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; | ||
| 9 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 8 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 10 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 9 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 11 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; | 10 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| @@ -33,17 +32,18 @@ import org.apache.commons.lang3.exception.ExceptionUtils; | @@ -33,17 +32,18 @@ import org.apache.commons.lang3.exception.ExceptionUtils; | ||
| 33 | import org.springframework.stereotype.Service; | 32 | import org.springframework.stereotype.Service; |
| 34 | import org.springframework.transaction.annotation.Transactional; | 33 | import org.springframework.transaction.annotation.Transactional; |
| 35 | 34 | ||
| 36 | - | ||
| 37 | import javax.annotation.Resource; | 35 | import javax.annotation.Resource; |
| 38 | -import javax.servlet.http.HttpServletResponse; | ||
| 39 | -import java.io.ByteArrayOutputStream; | ||
| 40 | import java.io.IOException; | 36 | import java.io.IOException; |
| 41 | import java.io.InputStream; | 37 | import java.io.InputStream; |
| 42 | -import java.net.URLEncoder; | ||
| 43 | -import java.util.*; | 38 | +import java.util.ArrayList; |
| 39 | +import java.util.List; | ||
| 40 | +import java.util.Map; | ||
| 41 | +import java.util.Optional; | ||
| 44 | import java.util.stream.Collectors; | 42 | import java.util.stream.Collectors; |
| 45 | 43 | ||
| 46 | -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.*; | 44 | +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.HIGHLIGHT_IMG_ERROR; |
| 45 | +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS; | ||
| 46 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 47 | 47 | ||
| 48 | @Slf4j | 48 | @Slf4j |
| 49 | @Service | 49 | @Service |
| @@ -166,7 +166,7 @@ public class TaskServiceImpl implements TaskService { | @@ -166,7 +166,7 @@ public class TaskServiceImpl implements TaskService { | ||
| 166 | @Override | 166 | @Override |
| 167 | public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) { | 167 | public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) { |
| 168 | final Task task = taskRuntime.task(taskQuery.getTaskId()); | 168 | final Task task = taskRuntime.task(taskQuery.getTaskId()); |
| 169 | - // 转换结果 | 169 | + // 转换结果 TODO @jason:放到 convert 类里 |
| 170 | TodoTaskRespVO respVO = new TodoTaskRespVO(); | 170 | TodoTaskRespVO respVO = new TodoTaskRespVO(); |
| 171 | respVO.setFormKey(task.getFormKey()); | 171 | respVO.setFormKey(task.getFormKey()); |
| 172 | respVO.setBusinessKey(task.getBusinessKey()); | 172 | respVO.setBusinessKey(task.getBusinessKey()); |
| @@ -175,7 +175,6 @@ public class TaskServiceImpl implements TaskService { | @@ -175,7 +175,6 @@ public class TaskServiceImpl implements TaskService { | ||
| 175 | return respVO; | 175 | return respVO; |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | - | ||
| 179 | @Override | 178 | @Override |
| 180 | public FileResp getHighlightImg(String processInstanceId) { | 179 | public FileResp getHighlightImg(String processInstanceId) { |
| 181 | // 查询历史 | 180 | // 查询历史 |
| @@ -184,7 +183,7 @@ public class TaskServiceImpl implements TaskService { | @@ -184,7 +183,7 @@ public class TaskServiceImpl implements TaskService { | ||
| 184 | HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); | 183 | HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); |
| 185 | // 如果不存在实例。 说明数据异常 | 184 | // 如果不存在实例。 说明数据异常 |
| 186 | if (hpi == null) { | 185 | if (hpi == null) { |
| 187 | - throw ServiceExceptionUtil.exception(PROCESS_INSTANCE_NOT_EXISTS); | 186 | + throw exception(PROCESS_INSTANCE_NOT_EXISTS); |
| 188 | } | 187 | } |
| 189 | // 没有结束时间。说明流程在执行过程中 | 188 | // 没有结束时间。说明流程在执行过程中 |
| 190 | // TODO @Li:一些 runtimeService 的查询,貌似比较通用,是不是抽一些小方法出来 | 189 | // TODO @Li:一些 runtimeService 的查询,貌似比较通用,是不是抽一些小方法出来 |
| @@ -194,9 +193,7 @@ public class TaskServiceImpl implements TaskService { | @@ -194,9 +193,7 @@ public class TaskServiceImpl implements TaskService { | ||
| 194 | // 获取所有活动节点 | 193 | // 获取所有活动节点 |
| 195 | List<HistoricActivityInstance> finishedInstances = historyService.createHistoricActivityInstanceQuery() | 194 | List<HistoricActivityInstance> finishedInstances = historyService.createHistoricActivityInstanceQuery() |
| 196 | .processInstanceId(processInstanceId).finished().list(); | 195 | .processInstanceId(processInstanceId).finished().list(); |
| 197 | - // TODO @Li:highLightedActivities 结果,可以使用 CollUtils.buildList() 方法。即使不用,也应该用 stream。简洁很重要。 | ||
| 198 | - finishedInstances.stream() | ||
| 199 | - .map(HistoricActivityInstance::getActivityId) | 196 | + finishedInstances.stream().map(HistoricActivityInstance::getActivityId) |
| 200 | .forEach(highLightedActivities::add); | 197 | .forEach(highLightedActivities::add); |
| 201 | // 已完成的节点+当前节点 | 198 | // 已完成的节点+当前节点 |
| 202 | highLightedActivities.addAll(runtimeService.getActiveActivityIds(processInstanceId)); | 199 | highLightedActivities.addAll(runtimeService.getActiveActivityIds(processInstanceId)); |
| @@ -209,13 +206,14 @@ public class TaskServiceImpl implements TaskService { | @@ -209,13 +206,14 @@ public class TaskServiceImpl implements TaskService { | ||
| 209 | try (InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, highLightedFlowIds, | 206 | try (InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, highLightedFlowIds, |
| 210 | "宋体", "宋体", "宋体")){ | 207 | "宋体", "宋体", "宋体")){ |
| 211 | FileResp fileResp = new FileResp(); | 208 | FileResp fileResp = new FileResp(); |
| 212 | - String picName = hpi.getProcessDefinitionName() + ".svg"; | 209 | + String picName = hpi.getProcessDefinitionName() + ".svg"; // TODO @Li:一次性的变量,可以直接 set 的时候,直接拼接 |
| 213 | fileResp.setFileName(picName); | 210 | fileResp.setFileName(picName); |
| 214 | fileResp.setFileByte(IoUtil.readBytes(inputStream)); | 211 | fileResp.setFileByte(IoUtil.readBytes(inputStream)); |
| 215 | return fileResp; | 212 | return fileResp; |
| 216 | } catch (IOException e) { | 213 | } catch (IOException e) { |
| 214 | + // TODO @Li:log.error("[getHighlightImg][流程({}) 生成图表失败]", processInstanceId, e) | ||
| 217 | log.error(ExceptionUtils.getStackTrace(e)); | 215 | log.error(ExceptionUtils.getStackTrace(e)); |
| 218 | - throw ServiceExceptionUtil.exception(HIGHLIGHT_IMG_ERROR); | 216 | + throw exception(HIGHLIGHT_IMG_ERROR); |
| 219 | } | 217 | } |
| 220 | } | 218 | } |
| 221 | 219 |
yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/config/YudaoActivitiConfiguration.java
| 1 | package cn.iocoder.yudao.framework.activiti.config; | 1 | package cn.iocoder.yudao.framework.activiti.config; |
| 2 | 2 | ||
| 3 | import lombok.AllArgsConstructor; | 3 | import lombok.AllArgsConstructor; |
| 4 | -import org.activiti.api.runtime.shared.identity.UserGroupManager; | ||
| 5 | import org.activiti.image.ProcessDiagramGenerator; | 4 | import org.activiti.image.ProcessDiagramGenerator; |
| 6 | import org.activiti.image.impl.DefaultProcessDiagramGenerator; | 5 | import org.activiti.image.impl.DefaultProcessDiagramGenerator; |
| 7 | import org.activiti.spring.SpringProcessEngineConfiguration; | 6 | import org.activiti.spring.SpringProcessEngineConfiguration; |
| @@ -14,13 +13,11 @@ import org.springframework.stereotype.Component; | @@ -14,13 +13,11 @@ import org.springframework.stereotype.Component; | ||
| 14 | @Configuration | 13 | @Configuration |
| 15 | public class YudaoActivitiConfiguration { | 14 | public class YudaoActivitiConfiguration { |
| 16 | 15 | ||
| 17 | - | ||
| 18 | /** | 16 | /** |
| 19 | - * 流程中生成基于图表交换信息的 svg 的类。 提供绘制方法 | ||
| 20 | - * @return ProcessDiagramGenerator | 17 | + * Activiti 流程图的生成器。目前管理后台的流程图 svg,通过它绘制生成。 |
| 21 | */ | 18 | */ |
| 22 | @Bean | 19 | @Bean |
| 23 | - public ProcessDiagramGenerator processDiagramGenerator (){ | 20 | + public ProcessDiagramGenerator processDiagramGenerator() { |
| 24 | return new DefaultProcessDiagramGenerator(); | 21 | return new DefaultProcessDiagramGenerator(); |
| 25 | } | 22 | } |
| 26 | 23 |