From d1abc3daa53eb3f0d23f27dd025901771ab73dad Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 4 Jun 2023 20:18:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=81=E7=A8=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=88=86=E9=A1=B5=EF=BC=8C=E6=9F=A5=E7=9C=8B=E5=9B=BE?= =?UTF-8?q?=E7=89=87=EF=BC=8C=E6=9F=A5=E7=9C=8Bxml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActModelController.java | 5 + .../ActProcessDefinitionController.java | 81 +++++++++ .../domain/bo/ProcessDefinitionBo.java | 31 ++++ .../domain/vo/ProcessDefinitionVo.java | 65 +++++++ .../service/IActProcessDefinitionService.java | 48 +++++ .../impl/ActProcessDefinitionServiceImpl.java | 166 ++++++++++++++++++ 6 files changed, 396 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java index 06b750a0c..af2545299 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java @@ -42,6 +42,11 @@ public class ActModelController extends BaseController { private final IActModelService iActModelService; + /** + * 分页查询模型 + * + * @param modelBo 模型参数 + */ @GetMapping("/list") public TableDataInfo getByPage(ModelBo modelBo) { return iActModelService.getByPage(modelBo); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java new file mode 100644 index 000000000..b83203d83 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java @@ -0,0 +1,81 @@ +package org.dromara.workflow.controller; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.bo.ProcessDefinitionBo; +import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.dromara.workflow.service.IActProcessDefinitionService; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + + +/** + * 流程定义管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/processDefinition") +public class ActProcessDefinitionController extends BaseController { + + private final IActProcessDefinitionService iActProcessDefinitionService; + + /** + * 分页查询 + * + * @param processDefinitionBo 参数 + */ + @GetMapping("/list") + public TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo) { + return iActProcessDefinitionService.getByPage(processDefinitionBo); + } + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + */ + @GetMapping("/getProcessDefinitionListByKey/{key}") + public R> getProcessDefinitionList(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) { + return R.ok("操作成功", iActProcessDefinitionService.getProcessDefinitionListByKey(key)); + } + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + * @param response 响应 + */ + @GetMapping("/processDefinitionImage/{processDefinitionId}") + public void processDefinitionImage(@PathVariable String processDefinitionId, HttpServletResponse response) { + iActProcessDefinitionService.processDefinitionImage(processDefinitionId, response); + } + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + */ + @GetMapping("/processDefinitionXml/{processDefinitionId}") + public R> getXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { + Map map = new HashMap<>(); + String xmlStr = iActProcessDefinitionService.processDefinitionXml(processDefinitionId); + List xml = new ArrayList<>(Arrays.asList(xmlStr.split("\n"))); + map.put("xml", xml); + map.put("xmlStr", xmlStr); + return R.ok(map); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java new file mode 100644 index 000000000..0d7602284 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.workflow.common.PageEntity; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程定义请求对象 + * + * @author may + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ProcessDefinitionBo extends PageEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义名称key + */ + private String key; + /** + * 流程定义名称 + */ + private String name; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java new file mode 100644 index 000000000..52c201d25 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java @@ -0,0 +1,65 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流程定义视图 + * + * @author may + */ +@Data +public class ProcessDefinitionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义id + */ + private String id; + + /** + * 流程定义名称 + */ + private String name; + + /** + * 流程定义标识key + */ + private String key; + + /** + * 流程定义版本 + */ + private int version; + + /** + * 流程定义挂起或激活 1激活 2挂起 + */ + private int suspensionState; + + /** + * 流程xml名称 + */ + private String resourceName; + + /** + * 流程图片名称 + */ + private String diagramResourceName; + + /** + * 流程部署id + */ + private String deploymentId; + + /** + * 流程部署时间 + */ + private Date deploymentTime; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java new file mode 100644 index 000000000..004e9e339 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java @@ -0,0 +1,48 @@ +package org.dromara.workflow.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.ProcessDefinitionBo; +import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.flowable.engine.repository.ProcessDefinition; + +import java.util.List; + +/** + * 流程定义 服务层 + * + * @author may + */ +public interface IActProcessDefinitionService { + /** + * 分页查询 + * + * @param processDefinitionBo 参数 + * @return 返回分页列表 + */ + TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo); + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + * @return 结果 + */ + List getProcessDefinitionListByKey(String key); + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + * @param response 响应 + */ + void processDefinitionImage(String processDefinitionId, HttpServletResponse response); + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + String processDefinitionXml(String processDefinitionId); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java new file mode 100644 index 000000000..565754209 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -0,0 +1,166 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.apache.commons.io.IOUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.workflow.domain.bo.ProcessDefinitionBo; +import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.dromara.workflow.service.IActProcessDefinitionService; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 流程定义 服务层实现 + * + * @author may + */ +@RequiredArgsConstructor +@Service +public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionService { + + private final RepositoryService repositoryService; + + /** + * 分页查询 + * + * @param processDefinitionBo 参数 + * @return 返回分页列表 + */ + @Override + public TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo) { + ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); + query.processDefinitionTenantId(LoginHelper.getTenantId()); + if (StringUtils.isNotEmpty(processDefinitionBo.getKey())) { + query.processDefinitionKey(processDefinitionBo.getKey()); + } + if (StringUtils.isNotEmpty(processDefinitionBo.getName())) { + query.processDefinitionNameLike("%" + processDefinitionBo.getName() + "%"); + } + // 分页查询 + List processDefinitionVoList = new ArrayList<>(); + List definitionList = query.latestVersion().listPage(processDefinitionBo.getPageNum(), processDefinitionBo.getPageSize()); + List deploymentList = null; + if (CollUtil.isNotEmpty(definitionList)) { + List deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList()); + deploymentList = repositoryService.createDeploymentQuery() + .deploymentIds(deploymentIds).list(); + } + for (ProcessDefinition processDefinition : definitionList) { + ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); + if (CollUtil.isNotEmpty(deploymentList)) { + // 部署时间 + deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { + processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); + }); + } + processDefinitionVoList.add(processDefinitionVo); + } + // 总记录数 + long total = query.count(); + + return new TableDataInfo<>(processDefinitionVoList, total); + } + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + */ + @Override + public List getProcessDefinitionListByKey(String key) { + List processDefinitionVoList = new ArrayList<>(); + ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); + List definitionList = query.processDefinitionTenantId(LoginHelper.getTenantId()).processDefinitionKey(key).list(); + List deploymentList = null; + if (CollUtil.isNotEmpty(definitionList)) { + List deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList()); + deploymentList = repositoryService.createDeploymentQuery() + .deploymentIds(deploymentIds).list(); + } + for (ProcessDefinition processDefinition : definitionList) { + ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); + if (CollUtil.isNotEmpty(deploymentList)) { + // 部署时间 + deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { + processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); + }); + } + processDefinitionVoList.add(processDefinitionVo); + } + return CollectionUtil.reverse(processDefinitionVoList); + } + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + * @param response 响应 + */ + @Override + public void processDefinitionImage(String processDefinitionId, HttpServletResponse response) { + InputStream inputStream = null; + try { + // 设置页面不缓存 + response.setHeader("Pragma", "no-cache"); + response.addHeader("Cache-Control", "must-revalidate"); + response.addHeader("Cache-Control", "no-cache"); + response.addHeader("Cache-Control", "no-store"); + response.setDateHeader("Expires", 0); + inputStream = repositoryService.getProcessDiagram(processDefinitionId); + // 响应相关图片 + response.setContentType("image/png"); + + byte[] bytes = IOUtils.toByteArray(inputStream); + ServletOutputStream outputStream = response.getOutputStream(); + outputStream.write(bytes); + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + */ + @Override + public String processDefinitionXml(String processDefinitionId) { + StringBuilder xml = new StringBuilder(); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + InputStream inputStream; + try { + inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); + xml.append(IOUtils.toString(inputStream, StandardCharsets.UTF_8)); + } catch (IOException e) { + e.printStackTrace(); + } + return xml.toString(); + } +}