Commit e969dbe8b74a770828c4c9b6ec69ac6ceb05d120

Authored by YunaiV
1 parent 848913bf

工作流的 code review

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