工作流的 code review

This commit is contained in:
YunaiV 2021-11-10 09:11:29 +08:00
parent 848913bf2f
commit e969dbe8b7
5 changed files with 25 additions and 22 deletions

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow; package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow;
import cn.hutool.core.io.IoUtil;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@ -60,6 +61,7 @@ public class TaskController {
return success(taskService.getHistorySteps(processInstanceId)); return success(taskService.getHistorySteps(processInstanceId));
} }
// TODO @Li: 项目里暂时不使用 path 路径参数监控等麻烦
/** /**
* 返回高亮的流转图SVG * 返回高亮的流转图SVG
* @param processInstanceId * @param processInstanceId
@ -70,6 +72,4 @@ public class TaskController {
ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte()); ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte());
} }
} }

View File

@ -2,12 +2,15 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
import lombok.Data; import lombok.Data;
// TODO @Li1改成 HighlightImgRespVO 2swagger 注解要补充3fileByte => fileContent
/** /**
* 文件输出类 * 文件输出类
*
* @author yunlongn * @author yunlongn
*/ */
@Data @Data
public class FileResp { public class FileResp {
/** /**
* 文件名字 * 文件名字
*/ */
@ -17,4 +20,5 @@ public class FileResp {
* 文件输出流 * 文件输出流
*/ */
private byte[] fileByte; private byte[] fileByte;
} }

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.adminserver.modules.bpm.enums.oa; package cn.iocoder.yudao.adminserver.modules.bpm.enums.oa;
import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.exception.ErrorCode;
// TODO @jason错误码整理下和其它模块保持一致包括前缀
/** /**
* activiti 系统 错误码枚举类 * activiti 系统 错误码枚举类
* *
@ -9,6 +11,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
* activiti 系统使用 1-003-000-000 * activiti 系统使用 1-003-000-000
*/ */
public interface OAErrorCodeConstants { public interface OAErrorCodeConstants {
ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在"); ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在");
ErrorCode PM_POST_NOT_EXISTS = new ErrorCode(1003001002, "项目经理岗位未设置"); ErrorCode PM_POST_NOT_EXISTS = new ErrorCode(1003001002, "项目经理岗位未设置");
ErrorCode DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1003001003, "部门的项目经理不存在"); ErrorCode DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1003001003, "部门的项目经理不存在");
@ -19,4 +22,5 @@ public interface OAErrorCodeConstants {
ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1003001008, "流程实例不存在"); ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1003001008, "流程实例不存在");
ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1003001009, "获取高亮流程图异常"); ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1003001009, "获取高亮流程图异常");
} }

View File

@ -5,7 +5,6 @@ import cn.hutool.core.io.IoUtil;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*; import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
import cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow.TaskConvert; import cn.iocoder.yudao.adminserver.modules.bpm.convert.workflow.TaskConvert;
import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService; import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.TaskService;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
@ -33,17 +32,18 @@ import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URLEncoder; import java.util.ArrayList;
import java.util.*; import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.*; import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.HIGHLIGHT_IMG_ERROR;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@Slf4j @Slf4j
@Service @Service
@ -166,7 +166,7 @@ public class TaskServiceImpl implements TaskService {
@Override @Override
public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) { public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) {
final Task task = taskRuntime.task(taskQuery.getTaskId()); final Task task = taskRuntime.task(taskQuery.getTaskId());
// 转换结果 // 转换结果 TODO @jason放到 convert 类里
TodoTaskRespVO respVO = new TodoTaskRespVO(); TodoTaskRespVO respVO = new TodoTaskRespVO();
respVO.setFormKey(task.getFormKey()); respVO.setFormKey(task.getFormKey());
respVO.setBusinessKey(task.getBusinessKey()); respVO.setBusinessKey(task.getBusinessKey());
@ -175,7 +175,6 @@ public class TaskServiceImpl implements TaskService {
return respVO; return respVO;
} }
@Override @Override
public FileResp getHighlightImg(String processInstanceId) { public FileResp getHighlightImg(String processInstanceId) {
// 查询历史 // 查询历史
@ -184,7 +183,7 @@ public class TaskServiceImpl implements TaskService {
HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
// 如果不存在实例 说明数据异常 // 如果不存在实例 说明数据异常
if (hpi == null) { if (hpi == null) {
throw ServiceExceptionUtil.exception(PROCESS_INSTANCE_NOT_EXISTS); throw exception(PROCESS_INSTANCE_NOT_EXISTS);
} }
// 没有结束时间说明流程在执行过程中 // 没有结束时间说明流程在执行过程中
// TODO @Li一些 runtimeService 的查询貌似比较通用是不是抽一些小方法出来 // TODO @Li一些 runtimeService 的查询貌似比较通用是不是抽一些小方法出来
@ -194,9 +193,7 @@ public class TaskServiceImpl implements TaskService {
// 获取所有活动节点 // 获取所有活动节点
List<HistoricActivityInstance> finishedInstances = historyService.createHistoricActivityInstanceQuery() List<HistoricActivityInstance> finishedInstances = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId).finished().list(); .processInstanceId(processInstanceId).finished().list();
// TODO @LihighLightedActivities 结果可以使用 CollUtils.buildList() 方法即使不用也应该用 stream简洁很重要 finishedInstances.stream().map(HistoricActivityInstance::getActivityId)
finishedInstances.stream()
.map(HistoricActivityInstance::getActivityId)
.forEach(highLightedActivities::add); .forEach(highLightedActivities::add);
// 已完成的节点+当前节点 // 已完成的节点+当前节点
highLightedActivities.addAll(runtimeService.getActiveActivityIds(processInstanceId)); highLightedActivities.addAll(runtimeService.getActiveActivityIds(processInstanceId));
@ -209,13 +206,14 @@ public class TaskServiceImpl implements TaskService {
try (InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, highLightedFlowIds, try (InputStream inputStream = processDiagramGenerator.generateDiagram(bpmnModel, highLightedActivities, highLightedFlowIds,
"宋体", "宋体", "宋体")){ "宋体", "宋体", "宋体")){
FileResp fileResp = new FileResp(); FileResp fileResp = new FileResp();
String picName = hpi.getProcessDefinitionName() + ".svg"; String picName = hpi.getProcessDefinitionName() + ".svg"; // TODO @Li一次性的变量可以直接 set 的时候直接拼接
fileResp.setFileName(picName); fileResp.setFileName(picName);
fileResp.setFileByte(IoUtil.readBytes(inputStream)); fileResp.setFileByte(IoUtil.readBytes(inputStream));
return fileResp; return fileResp;
} catch (IOException e) { } catch (IOException e) {
// TODO @Lilog.error("[getHighlightImg][流程({}) 生成图表失败]", processInstanceId, e)
log.error(ExceptionUtils.getStackTrace(e)); log.error(ExceptionUtils.getStackTrace(e));
throw ServiceExceptionUtil.exception(HIGHLIGHT_IMG_ERROR); throw exception(HIGHLIGHT_IMG_ERROR);
} }
} }

View File

@ -1,7 +1,6 @@
package cn.iocoder.yudao.framework.activiti.config; package cn.iocoder.yudao.framework.activiti.config;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.activiti.api.runtime.shared.identity.UserGroupManager;
import org.activiti.image.ProcessDiagramGenerator; import org.activiti.image.ProcessDiagramGenerator;
import org.activiti.image.impl.DefaultProcessDiagramGenerator; import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import org.activiti.spring.SpringProcessEngineConfiguration; import org.activiti.spring.SpringProcessEngineConfiguration;
@ -14,10 +13,8 @@ import org.springframework.stereotype.Component;
@Configuration @Configuration
public class YudaoActivitiConfiguration { public class YudaoActivitiConfiguration {
/** /**
* 流程中生成基于图表交换信息的 svg 的类 提供绘制方法 * Activiti 流程图的生成器目前管理后台的流程图 svg通过它绘制生成
* @return ProcessDiagramGenerator
*/ */
@Bean @Bean
public ProcessDiagramGenerator processDiagramGenerator() { public ProcessDiagramGenerator processDiagramGenerator() {