From 603f40e0d8493353085892f94875cd2265650014 Mon Sep 17 00:00:00 2001 From: wanggeng <450292408@qq.com> Date: Wed, 1 Sep 2021 16:36:47 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E9=A1=B5=E9=9D=A2=E6=A0=B7=E5=BC=8F=E3=80=822.?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9F=A5=E7=9C=8B=E6=B5=81=E7=A8=8B=E5=9B=BE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/ActivitiModelController.java | 15 ++++++++- .../api/ActivitiModelEditorController.java | 15 ++++++--- .../api/ActivitiModelSaveController.java | 12 +++++-- .../route/ActivitiRouteController.java | 23 ++++++++++++- .../activiti/IActivitiModelService.java | 9 ++++++ .../impl/ActivitiModelServiceImpl.java | 32 +++++++++++++++++++ .../main/resources/static/editor-app/app.js | 4 +-- .../resources/templates/activiti/list.html | 29 +++++++++++++++-- 8 files changed, 125 insertions(+), 14 deletions(-) diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java index 460f971f..2312f21b 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java @@ -5,9 +5,10 @@ import ink.wgink.common.base.DefaultBaseController; import ink.wgink.exceptions.ParamsException; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.module.activiti.service.activiti.IActivitiModelService; +import ink.wgink.pojo.result.ErrorResult; import ink.wgink.pojo.result.SuccessResult; import ink.wgink.util.RegexUtil; -import io.swagger.annotations.Api; +import io.swagger.annotations.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -35,6 +36,11 @@ public class ActivitiModelController extends DefaultBaseController { @Autowired private IActivitiModelService activitiModelService; + @ApiOperation(value = "保存模型", notes = "保存模型接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PutMapping("save/{modelId}") public SuccessResult saveModel(@PathVariable String modelId, String name, String description, String json_xml, String svg_xml) throws Exception { name = name.trim().replace("\\s", ""); @@ -48,11 +54,18 @@ public class ActivitiModelController extends DefaultBaseController { return new SuccessResult(); } + @ApiOperation(value = "模型json数据", notes = "模型json数据接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @GetMapping("json/{modelId}") public JSONObject getEditorJson(@PathVariable String modelId) throws UnsupportedEncodingException { return activitiModelService.getEditorJson(modelId); } + @ApiOperation(value = "汉化配置json数据", notes = "汉化配置json数据接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @GetMapping("editor/stencilset") public JSONObject getStencilset() throws IOException { return activitiModelService.getStencilset(); diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelEditorController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelEditorController.java index 558efa33..9ad57e51 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelEditorController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelEditorController.java @@ -14,8 +14,10 @@ package ink.wgink.module.activiti.controller.api; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; +import ink.wgink.exceptions.base.SystemException; +import ink.wgink.pojo.result.ErrorResult; +import io.swagger.annotations.*; import org.activiti.editor.constants.ModelDataJsonConstants; -import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; import org.apache.commons.lang3.StringUtils; @@ -36,7 +38,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("service") public class ActivitiModelEditorController implements ModelDataJsonConstants { - protected static final Logger LOGGER = LoggerFactory.getLogger(ActivitiModelEditorController.class); + protected static final Logger LOG = LoggerFactory.getLogger(ActivitiModelEditorController.class); @Autowired private RepositoryService repositoryService; @@ -44,6 +46,11 @@ public class ActivitiModelEditorController implements ModelDataJsonConstants { @Autowired private ObjectMapper objectMapper; + @ApiOperation(value = "模型编辑时的json数据", notes = "模型编辑时的json数据接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @GetMapping("model/{modelId}/json") public JSONObject getEditorJson(@PathVariable String modelId) { JSONObject result = null; @@ -62,8 +69,8 @@ public class ActivitiModelEditorController implements ModelDataJsonConstants { JSONObject editorJson = JSONObject.parseObject(readTree); result.put("model", editorJson); } catch (Exception e) { - LOGGER.error("Error creating model JSON", e); - throw new ActivitiException("Error creating model JSON", e); + LOG.error(e.getMessage(), e); + throw new SystemException(e.getMessage(), e); } } return result; diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelSaveController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelSaveController.java index 1251c458..1c0a4ce1 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelSaveController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelSaveController.java @@ -14,6 +14,8 @@ package ink.wgink.module.activiti.controller.api; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import ink.wgink.pojo.result.ErrorResult; +import io.swagger.annotations.*; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; @@ -42,7 +44,7 @@ import java.io.InputStream; @RequestMapping("service") public class ActivitiModelSaveController implements ModelDataJsonConstants { - protected static final Logger LOGGER = LoggerFactory.getLogger(ActivitiModelSaveController.class); + protected static final Logger LOG = LoggerFactory.getLogger(ActivitiModelSaveController.class); @Autowired private RepositoryService repositoryService; @@ -50,6 +52,11 @@ public class ActivitiModelSaveController implements ModelDataJsonConstants { @Autowired private ObjectMapper objectMapper; + @ApiOperation(value = "保存流程模型", notes = "保存流程模型接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PutMapping("model/{modelId}/save") public void saveModel(@PathVariable String modelId, String name, String description, String json_xml, String svg_xml) { try { @@ -81,8 +88,7 @@ public class ActivitiModelSaveController implements ModelDataJsonConstants { outStream.close(); } catch (Exception e) { - LOGGER.error("Error saving model", e); - throw new ActivitiException("Error saving model", e); + throw new ActivitiException("保存模型异常", e); } } } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java index d765dbc3..da1d8cf9 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/route/ActivitiRouteController.java @@ -1,12 +1,18 @@ package ink.wgink.module.activiti.controller.route; import ink.wgink.interfaces.consts.ISystemConstant; -import io.swagger.annotations.Api; +import ink.wgink.module.activiti.service.activiti.IActivitiModelService; +import ink.wgink.pojo.result.ErrorResult; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; 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.servlet.ModelAndView; +import javax.servlet.http.HttpServletResponse; + /** * @ClassName: ActivitiRouteController * @Description: activiti路由 @@ -19,6 +25,10 @@ import org.springframework.web.servlet.ModelAndView; @RequestMapping(ISystemConstant.ROUTE_PREFIX + "/activiti") public class ActivitiRouteController { + @Autowired + private IActivitiModelService activitiModelService; + + @GetMapping("list") public ModelAndView list() { ModelAndView mv = new ModelAndView("activiti/list"); @@ -37,4 +47,15 @@ public class ActivitiRouteController { return mv; } + + @ApiOperation(value = "查看流程图", notes = "查看流程图接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deploymentId", value = "流程部署ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("get-process-image/{deploymentId}") + public void getProcessImage(HttpServletResponse response, @PathVariable("deploymentId") String deploymentId) { + activitiModelService.getProcessImage(response, deploymentId); + } + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java index a314be94..5ea78f05 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java @@ -2,6 +2,7 @@ package ink.wgink.module.activiti.service.activiti; import com.alibaba.fastjson.JSONObject; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -22,4 +23,12 @@ public interface IActivitiModelService { JSONObject getEditorJson(String modelId) throws UnsupportedEncodingException; JSONObject getStencilset() throws IOException; + + /** + * 查看部署流程图 + * + * @param response 响应 + * @param deploymentId 部署ID + */ + void getProcessImage(HttpServletResponse response, String deploymentId); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java index 18d02325..69fbc6ed 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java @@ -3,12 +3,17 @@ package ink.wgink.module.activiti.service.activiti.impl; import com.alibaba.fastjson.JSONObject; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.UpdateException; +import ink.wgink.exceptions.base.SystemException; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.module.activiti.service.activiti.IActivitiModelService; import ink.wgink.util.ResourceUtil; +import org.activiti.bpmn.model.BpmnModel; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.image.impl.DefaultProcessDiagramGenerator; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.PNGTranscoder; @@ -17,7 +22,9 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletResponse; import java.io.*; +import java.util.ArrayList; /** * When you feel like quitting. Think about why you started @@ -41,6 +48,9 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct if (model == null) { throw new SearchException("模型不存在"); } + if (!StringUtils.isBlank(model.getDeploymentId())) { + throw new UpdateException("已经部署的流程无法编辑"); + } JSONObject modelObject = JSONObject.parseObject(model.getMetaInfo()); modelObject.put(MODEL_NAME, name); @@ -92,4 +102,26 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct String result = IOUtils.toString(fileInputStream, ISystemConstant.CHARSET_UTF8); return JSONObject.parseObject(result); } + + @Override + public void getProcessImage(HttpServletResponse response, String deploymentId) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); + if (processDefinition == null) { + throw new SearchException("流程定义不存在,请检查流程部署情况"); + } + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + DefaultProcessDiagramGenerator defaultProcessDiagramGenerator = new DefaultProcessDiagramGenerator(); + response.setContentType("text/xml"); + try (InputStream inputStream = defaultProcessDiagramGenerator.generateDiagram(bpmnModel, new ArrayList<>(), new ArrayList<>(), "Heiti SC", "Heiti SC", "宋体"); + OutputStream outputStream = response.getOutputStream(); + ) { + byte[] buf = new byte[1024]; + for (int size; (size = inputStream.read(buf)) != -1; ) { + outputStream.write(buf, 0, size); + } + outputStream.flush(); + } catch (IOException e) { + throw new SystemException("流程图生成错误", e); + } + } } diff --git a/module-activiti/src/main/resources/static/editor-app/app.js b/module-activiti/src/main/resources/static/editor-app/app.js index f20bc54d..12b2d8b9 100644 --- a/module-activiti/src/main/resources/static/editor-app/app.js +++ b/module-activiti/src/main/resources/static/editor-app/app.js @@ -239,8 +239,8 @@ activitiModeler } var totalAvailable = jQuery(window).height() - offset.top - mainHeader.height() - 21; - canvas.height(totalAvailable - propSectionHeight); - jQuery('#paletteSection').height(totalAvailable); + canvas.height(totalAvailable - propSectionHeight - 38); + jQuery('#paletteSection').height(totalAvailable - 38); // Update positions of the resize-markers, according to the canvas diff --git a/module-activiti/src/main/resources/templates/activiti/list.html b/module-activiti/src/main/resources/templates/activiti/list.html index 0271d6c1..69560b0d 100644 --- a/module-activiti/src/main/resources/templates/activiti/list.html +++ b/module-activiti/src/main/resources/templates/activiti/list.html @@ -117,13 +117,20 @@ } } }, + {field: 'option', width: 80, title: '流程图', align:'center', fixed: 'right', + templet: function(row) { + if(!row.deploymentId) { + return '-'; + } + return ''; + } + }, {field: 'option', width: 80, title: '操作', align:'center', fixed: 'right', templet: function(row) { if(!row.deploymentId) { return ''; - } else { - return ''; } + return ''; } }, ] @@ -205,9 +212,13 @@ } else if(checkDatas.length > 1) { top.dialog.msg(top.dataMessage.table.selectOneEdit); } else { + if(checkDatas[0].deploymentId) { + top.dialog.msg('已经部署的流程不能编辑'); + return; + } top.dialog.open({ url: top.restAjax.path('route/activiti/update?modelId={modelId}', [checkDatas[0].id]), - title: '编辑流程图', + title: false, width: '90%', height: '90%', onClose: function() { @@ -259,6 +270,18 @@ top.dialog.close(loadLayerIndex); }); }); + } else if(layEvent === 'flowChatEvent') { + if(!data.deploymentId) { + top.dialog.msg('流程未部署,无法查看流程图'); + return; + } + top.dialog.open({ + url: top.restAjax.path('route/activiti/get-process-image/{deploymentId}', [data.deploymentId]), + title: '流程图', + width: '800px', + height: '400px', + onClose: function() {} + }); } }); });