java110 4 gadi atpakaļ
vecāks
revīzija
a4954c7ff8

+ 32 - 0
service-common/pom.xml

@@ -37,6 +37,38 @@
             <artifactId>activiti-spring-boot-starter-basic</artifactId>
         </dependency>
 
+		<dependency>
+			<groupId>org.activiti</groupId>
+			<artifactId>activiti-json-converter</artifactId>
+			<version>6.0.0</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.activiti</groupId>
+					<artifactId>activiti-bpmn-model</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.xmlgraphics</groupId>
+			<artifactId>batik-codec</artifactId>
+			<version>1.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.xmlgraphics</groupId>
+			<artifactId>batik-css</artifactId>
+			<version>1.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.xmlgraphics</groupId>
+			<artifactId>batik-svg-dom</artifactId>
+			<version>1.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.xmlgraphics</groupId>
+			<artifactId>batik-svggen</artifactId>
+			<version>1.7</version>
+		</dependency>
+
 
     </dependencies>
 

+ 77 - 0
service-common/src/main/java/com/java110/common/api/ModelController.java

@@ -0,0 +1,77 @@
+package com.java110.common.api;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.activiti.editor.constants.ModelDataJsonConstants;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.repository.Model;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @author luobaimang
+ * @date 2019/11/28
+ */
+@Controller
+public class ModelController {
+
+    private static final Logger logger = LoggerFactory.getLogger(ModelController.class);
+
+    @Autowired
+    private RepositoryService repositoryService;
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    /**
+     * 创建模型
+     * @param response
+     * @param name 模型名称
+     * @param key 模型key
+     */
+    @RequestMapping("/create")
+    @ResponseBody
+    public String create(HttpServletResponse response, String name, String key) throws IOException {
+        logger.info("创建模型入参name:{},key:{}",name,key);
+        Model model = repositoryService.newModel();
+        ObjectNode modelNode = objectMapper.createObjectNode();
+        modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
+        modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, "");
+        modelNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
+        model.setName(name);
+        model.setKey(key);
+        model.setMetaInfo(modelNode.toString());
+        repositoryService.saveModel(model);
+        createObjectNode(model.getId());
+        logger.info("创建模型结束,返回模型ID:{}",model.getId());
+        return model.getId();
+    }
+
+    /**
+     * 创建模型时完善ModelEditorSource
+     * @param modelId
+     */
+    @SuppressWarnings("deprecation")
+    private void createObjectNode(String modelId){
+        logger.info("创建模型完善ModelEditorSource入参模型ID:{}",modelId);
+        ObjectNode editorNode = objectMapper.createObjectNode();
+        editorNode.put("id", "canvas");
+        editorNode.put("resourceId", "canvas");
+        ObjectNode stencilSetNode = objectMapper.createObjectNode();
+        stencilSetNode.put("namespace","http://b3mn.org/stencilset/bpmn2.0#");
+        editorNode.put("stencilset", stencilSetNode);
+        try {
+            repositoryService.addModelEditorSource(modelId,editorNode.toString().getBytes("utf-8"));
+        } catch (Exception e) {
+            logger.info("创建模型时完善ModelEditorSource服务异常:{}",e);
+        }
+        logger.info("创建模型完善ModelEditorSource结束");
+    }
+
+}

+ 136 - 0
service-common/src/main/java/com/java110/common/api/ModelRestController.java

@@ -0,0 +1,136 @@
+package com.java110.common.api;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+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.batik.transcoder.TranscoderInput;
+import org.apache.batik.transcoder.TranscoderOutput;
+import org.apache.batik.transcoder.image.PNGTranscoder;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+/**
+ * @author luobaimang
+ * @date 2019/11/28
+ */
+@RestController
+@RequestMapping("service")
+public class ModelRestController implements ModelDataJsonConstants {
+
+        protected static final Logger LOGGER = LoggerFactory.getLogger(ModelRestController.class);
+
+        @Autowired
+        private RepositoryService repositoryService;
+
+        @Autowired
+        private ObjectMapper objectMapper;
+
+        /**
+         * 更新流程
+         *
+         * @param modelId     模型ID
+         * @param name        流程模型名称
+         * @param description
+         * @param json_xml    流程文件
+         * @param svg_xml     图片
+         */
+        @RequestMapping(value = "/model/{modelId}/save", method = RequestMethod.PUT)
+        @ResponseStatus(value = HttpStatus.OK)
+        public void saveModel(@PathVariable String modelId
+                , String name, String description
+                , String json_xml, String svg_xml) {
+            try {
+
+                Model model = repositoryService.getModel(modelId);
+
+                ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
+
+                modelJson.put(MODEL_NAME, name);
+                modelJson.put(MODEL_DESCRIPTION, description);
+                modelJson.put(ModelDataJsonConstants.MODEL_REVISION, model.getVersion() + 1);
+                model.setMetaInfo(modelJson.toString());
+                model.setName(name);
+                repositoryService.saveModel(model);
+
+                repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));
+
+                InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));
+                TranscoderInput input = new TranscoderInput(svgStream);
+
+                PNGTranscoder transcoder = new PNGTranscoder();
+                // Setup output
+                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+                TranscoderOutput output = new TranscoderOutput(outStream);
+
+                // Do the transformation
+                transcoder.transcode(input, output);
+                final byte[] result = outStream.toByteArray();
+                repositoryService.addModelEditorSourceExtra(model.getId(), result);
+                outStream.close();
+            } catch (Exception e) {
+                LOGGER.error("Error saving model", e);
+                throw new ActivitiException("Error saving model", e);
+            }
+        }
+
+
+    /**
+     * 获取model的节点信息,编辑器根据返回的json进行绘图
+     *
+     * @param modelId
+     * @return
+     */
+    @SuppressWarnings("deprecation")
+    @RequestMapping(value = "/model/{modelId}/json", method = RequestMethod.GET, produces = "application/json")
+    public ObjectNode getEditorJson(@PathVariable String modelId) {
+        ObjectNode modelNode = null;
+        Model model = repositoryService.getModel(modelId);
+        if (model != null) {
+            try {
+                if (StringUtils.isNotEmpty(model.getMetaInfo())) {
+                    modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
+                } else {
+                    modelNode = objectMapper.createObjectNode();
+                    modelNode.put(MODEL_NAME, model.getName());
+                }
+                modelNode.put(MODEL_ID, model.getId());
+                ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(
+                        new String(repositoryService.getModelEditorSource(model.getId()), "utf-8"));
+                modelNode.put("model", editorJsonNode);
+            } catch (Exception e) {
+                LOGGER.error("Error creating model JSON", e);
+                throw new ActivitiException("Error creating model JSON", e);
+            }
+        }
+        return modelNode;
+    }
+
+    /**
+     * 获取编辑器组件及配置项信息
+     * 获取流程json文件
+     *
+     * @return
+     */
+    @RequestMapping(value = "/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
+    @ResponseBody
+    public String getStencilset() {
+        InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");
+        try {
+            return IOUtils.toString(stencilsetStream, "utf-8");
+        } catch (Exception e) {
+            throw new ActivitiException("Error while loading stencil set", e);
+        }
+    }
+}