初步完善模型发布流程

This commit is contained in:
yunlong.li
2021-11-18 18:23:56 +08:00
parent 3f90e79d8a
commit a829e8d083
9 changed files with 236 additions and 148 deletions

View File

@ -1,32 +1,21 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TodoTaskRespVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelCreateVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelRespVo;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelUpdateVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelVO;
import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.BpmModelService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.*;
import org.activiti.engine.repository.Model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/**
* 工作流模型
@ -49,14 +38,14 @@ public class ModelController {
@PostMapping("/create")
@ApiOperation(value = "新建模型")
public CommonResult<String> newModel(@RequestBody ModelCreateVO modelCreateVO) {
return bpmModelService.newModel(modelCreateVO);
public CommonResult<String> newModel(@RequestBody ModelVO modelVO) {
return bpmModelService.newModel(modelVO);
}
@PostMapping("/update")
@ApiOperation(value = "修改模型属性")
public CommonResult<String> updateModel(@RequestBody ModelUpdateVO modelUpdateVO) {
return bpmModelService.updateModel(modelUpdateVO);
public CommonResult<String> updateModel(@RequestBody ModelVO modelVO) {
return bpmModelService.updateModel(modelVO);
}
@PostMapping("/delete")
@ -72,9 +61,9 @@ public class ModelController {
}
@GetMapping("/exportBpmnXml")
@ApiOperation(value = "导出模型")
public void export(@RequestParam String deploymentId, HttpServletResponse response) throws IOException {
FileResp fileResp = bpmModelService.exportBpmnXml(deploymentId);
@ApiOperation(value = "导出模型Xml")
public void export(@RequestParam String modelId, HttpServletResponse response) throws IOException {
FileResp fileResp = bpmModelService.exportBpmnXml(modelId);
ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte());
}

View File

@ -1,24 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 新增模型 VO
* @author yunlongn
*/
@Data
public class ModelCreateVO {
@ApiModelProperty(value = "模型名字", required = true)
private String name;
@ApiModelProperty(value = "模型描述")
private String description;
@ApiModelProperty(value = "版本号")
private Integer revision;
@ApiModelProperty(value = "key值")
private String key;
}

View File

@ -8,9 +8,9 @@ import lombok.Data;
* @author yunlongn
*/
@Data
public class ModelUpdateVO {
public class ModelVO {
@ApiModelProperty(value = "模型Id", required = true)
@ApiModelProperty(value = "模型Id")
private String id;
@ApiModelProperty(value = "模型名字", required = true)
@ -27,6 +27,4 @@ public class ModelUpdateVO {
@ApiModelProperty(value = "bpmnXml")
private String bpmnXml;
}

View File

@ -1,16 +1,12 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelCreateVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelRespVo;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelUpdateVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelVO;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.activiti.engine.repository.Model;
import javax.servlet.http.HttpServletResponse;
/**
* 工作流模型接口
* @author yunlongn
@ -27,16 +23,16 @@ public interface BpmModelService {
/**
* 新增一个模型
* @param modelCreateVO 模型对象
* @param modelVO 模型对象
* @return 返回成功
*/
CommonResult<String> newModel(ModelCreateVO modelCreateVO);
CommonResult<String> newModel(ModelVO modelVO);
/**
* 修改模型属性填充bpmn数据
* @param modelUpdateVO 模型对象
* @param modelVO 模型对象
* @return 返回成功
*/
CommonResult<String> updateModel(ModelUpdateVO modelUpdateVO);
CommonResult<String> updateModel(ModelVO modelVO);
/**
* 部署模型 使模型成为一个 process

View File

@ -1,12 +1,9 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.impl;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelCreateVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelRespVo;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelUpdateVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelVO;
import cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants;
import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.BpmModelService;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
@ -15,26 +12,20 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.activiti.engine.repository.ModelQuery;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.servlet.http.HttpServletResponse;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
@ -64,64 +55,67 @@ public class BpmModelServiceImpl implements BpmModelService {
}
@Override
public CommonResult<String> newModel(ModelCreateVO modelCreateVO) {
public CommonResult<String> newModel(ModelVO modelVO) {
try {
//初始化一个空模型
Model model = repositoryService.newModel();
String name = Optional.ofNullable(modelCreateVO.getName()).orElse("new-process");
String name = Optional.ofNullable(modelVO.getName()).orElse("new-process");
//设置一些默认信息
model.setName(name);
model.setKey(Optional.ofNullable(modelCreateVO.getKey()).orElse("processKey"));
model.setMetaInfo(JsonUtils.toJsonString(modelCreateVO));
model.setKey(Optional.ofNullable(modelVO.getKey()).orElse("processKey"));
model.setMetaInfo(JsonUtils.toJsonString(modelVO));
repositoryService.saveModel(model);
return CommonResult.success("保存成功");
if (!ObjectUtils.isEmpty(modelVO.getBpmnXml())) {
repositoryService.addModelEditorSource(model.getId(), modelVO.getBpmnXml().getBytes(StandardCharsets.UTF_8));
}
return CommonResult.success(model.getId());
}catch (Exception e){
log.info("模型创建失败modelCreateVO = {} e = {} ", modelCreateVO, ExceptionUtils.getStackTrace(e));
log.info("模型创建失败modelVO = {} e = {} ", modelVO, ExceptionUtils.getStackTrace(e));
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR);
}
}
@Override
public CommonResult<String> updateModel(ModelUpdateVO modelUpdateVO) {
public CommonResult<String> updateModel(ModelVO modelVO) {
try {
Model model = repositoryService.getModel(modelUpdateVO.getId());
Model model = repositoryService.getModel(modelVO.getId());
if (ObjectUtils.isEmpty(model)) {
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
}
// 只能修改名字跟描述
ModelCreateVO modelCreateVO = JsonUtils.parseObject(model.getMetaInfo(), ModelCreateVO.class);
ModelVO modelCreateVO = JsonUtils.parseObject(model.getMetaInfo(), ModelVO.class);
if (ObjectUtils.isEmpty(modelCreateVO)) {
modelCreateVO = new ModelCreateVO();
modelCreateVO = new ModelVO();
}
modelCreateVO.setName(modelUpdateVO.getName());
modelCreateVO.setDescription(modelUpdateVO.getDescription());
modelCreateVO.setName(modelVO.getName());
modelCreateVO.setDescription(modelVO.getDescription());
model.setMetaInfo(JsonUtils.toJsonString(modelCreateVO));
model.setName(modelUpdateVO.getName());
model.setName(modelVO.getName());
model.setKey(modelVO.getKey());
// 更新模型
repositoryService.saveModel(model);
repositoryService.addModelEditorSource(model.getId(), modelUpdateVO.getBpmnXml().getBytes(StandardCharsets.UTF_8));
repositoryService.addModelEditorSource(model.getId(), modelVO.getBpmnXml().getBytes(StandardCharsets.UTF_8));
return CommonResult.success("保存成功");
}catch (Exception e){
log.info("模型更新失败modelUpdateVO = {} e = {} ", modelUpdateVO, ExceptionUtils.getStackTrace(e));
log.info("模型更新失败modelVO = {}", modelVO, e);
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR);
}
}
@Override
public CommonResult<String> deploy(String modelId) {
// 获取模型
Model modelData = repositoryService.getModel(modelId);
if (ObjectUtils.isEmpty(modelData)) {
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
}
byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
if (bytes == null) {
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
}
try {
Model modelData = repositoryService.getModel(modelId);
if (ObjectUtils.isEmpty(modelData)) {
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
}
byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
if (bytes == null) {
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
}
// 将xml转换为流
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
XMLInputFactory xif = XMLInputFactory.newInstance();
@ -148,21 +142,21 @@ public class BpmModelServiceImpl implements BpmModelService {
}
@Override
public FileResp exportBpmnXml(String deploymentId) {
// 查询流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
if (ObjectUtils.isEmpty(pd)) {
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_PROCESS_DEFINITION_NOT_EXISTS);
public FileResp exportBpmnXml(String modelId) {
try {
Model modelData = repositoryService.getModel(modelId);
if (ObjectUtils.isEmpty(modelData)) {
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
}
byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
FileResp fileResp = new FileResp();
fileResp.setFileName(String.format("%s.bpmn", Optional.ofNullable(modelData.getName()).orElse("流程图")));
fileResp.setFileByte(bytes);
return fileResp;
} catch (Exception e) {
log.info("模型部署失败modelId = {} e = {} ", modelId, ExceptionUtils.getStackTrace(e));
throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR);
}
String resourceName = Optional.ofNullable(pd.getDiagramResourceName()).orElse(pd.getResourceName());
InputStream inputStream = repositoryService.getResourceAsStream(deploymentId,
resourceName);
FileResp fileResp = new FileResp();
fileResp.setFileName(String.format("%s.bpmn", Optional.ofNullable(pd.getName()).orElse("流程图")));
fileResp.setFileByte(IoUtil.readBytes(inputStream));
return fileResp;
}
@Override