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() {}
+ });
}
});
});