Quellcode durchsuchen

增加flowable工作流

zhouhao vor 7 Jahren
Ursprung
Commit
380f17240a

+ 55 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/pom.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-system-workflow</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-system-workflow-flowable-modeler</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-authorization-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-commons-controller</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-system-workflow-flowable</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.0.26</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-logging</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>

+ 195 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/java/org/hswebframework/web/workflow/flowable/modeler/FlowableModelController.java

@@ -0,0 +1,195 @@
+package org.hswebframework.web.workflow.flowable.modeler;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.batik.transcoder.TranscoderException;
+import org.flowable.bpmn.converter.BpmnXMLConverter;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.editor.language.json.converter.BpmnJsonConverter;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.repository.Deployment;
+import org.flowable.engine.repository.Model;
+import org.flowable.engine.repository.ModelQuery;
+import org.apache.batik.transcoder.TranscoderInput;
+import org.apache.batik.transcoder.TranscoderOutput;
+import org.apache.batik.transcoder.image.PNGTranscoder;
+import org.apache.commons.lang3.StringUtils;
+import org.hsweb.ezorm.core.PropertyWrapper;
+import org.hsweb.ezorm.core.SimplePropertyWrapper;
+import org.hsweb.ezorm.core.param.TermType;
+import org.hswebframework.web.NotFoundException;
+import org.hswebframework.web.authorization.annotation.Authorize;
+import org.hswebframework.web.commons.entity.PagerResult;
+import org.hswebframework.web.commons.entity.param.QueryParamEntity;
+import org.hswebframework.web.controller.message.ResponseMessage;
+import org.hswebframework.web.logging.AccessLogger;
+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.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/workflow")
+@Authorize(permission = "workflow-model-manager")
+public class FlowableModelController {
+    @Autowired
+    private RepositoryService repositoryService;
+
+    private final static String MODEL_ID = "modelId";
+    private final static String MODEL_NAME = "name";
+    private final static String MODEL_REVISION = "revision";
+    private final static String MODEL_DESCRIPTION = "description";
+    private final static String MODEL_KEY = "key";
+
+    @RequestMapping(value = "/models", method = RequestMethod.GET)
+    @Authorize(action = "R")
+    public ResponseMessage<PagerResult<Model>> getModelList(QueryParamEntity param) {
+        ModelQuery modelQuery = repositoryService.createModelQuery();
+        param.getTerms().forEach((term) -> {
+
+            PropertyWrapper valueWrapper = new SimplePropertyWrapper(term.getValue());
+            String stringValue = valueWrapper.toString();
+            switch (term.getColumn()) {
+                case "name":
+                    if (term.getTermType().equals(TermType.like))
+                        modelQuery.modelNameLike(stringValue);
+                    else
+                        modelQuery.modelName(stringValue);
+                    break;
+                case "key":
+                    modelQuery.modelKey(stringValue);
+                    break;
+                case "category":
+                    if (term.getTermType().equals(TermType.like)) {
+                        modelQuery.modelCategoryLike(stringValue);
+                    } else if (term.getTermType().equals(TermType.not)) {
+                        modelQuery.modelCategoryNotEquals(stringValue);
+                    } else
+                        modelQuery.modelCategory(stringValue);
+                    break;
+                case "tenantId":
+                    if (term.getTermType().equals(TermType.like))
+                        modelQuery.modelTenantIdLike(stringValue);
+                    else
+                        modelQuery.modelTenantId(stringValue);
+                    break;
+                case "version":
+                    if ("latest".equals(stringValue))
+                        modelQuery.latestVersion();
+                    else
+                        modelQuery.modelVersion(valueWrapper.toInt());
+            }
+        });
+        modelQuery.orderByCreateTime().desc();
+        int total = (int) modelQuery.count();
+        param.rePaging(total);
+        List<Model> models = modelQuery.listPage(param.getPageIndex(), param.getPageSize() * (param.getPageIndex() + 1));
+        return ResponseMessage.ok(new PagerResult<>(total, models))
+                .exclude(Model.class, "metaInfo", "persistentState");
+    }
+
+    @RequestMapping(value = "/model/{modelId}/json", method = RequestMethod.GET)
+    @AccessLogger("获取模型定义json")
+    @Authorize(action = "R")
+    public Object getEditorJson(@PathVariable String modelId) throws Exception {
+        JSONObject modelNode;
+        Model model = repositoryService.getModel(modelId);
+        if (model == null) throw new NotFoundException("模型不存在");
+        if (StringUtils.isNotEmpty(model.getMetaInfo())) {
+            modelNode = JSON.parseObject(model.getMetaInfo());
+        } else {
+            modelNode = new JSONObject();
+            modelNode.put(MODEL_NAME, model.getName());
+        }
+        modelNode.put(MODEL_ID, model.getId());
+        modelNode.put("model", JSON.parse(new String(repositoryService.getModelEditorSource(model.getId()))));
+        return modelNode;
+    }
+
+    @RequestMapping(value = "/model", method = RequestMethod.POST)
+    @ResponseStatus(value = HttpStatus.CREATED)
+    @Authorize(action = "C")
+    public ResponseMessage createModel(@RequestBody JSONObject model) throws Exception {
+        JSONObject stencilset = new JSONObject();
+        stencilset.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
+        JSONObject editorNode = new JSONObject();
+        editorNode.put("id", "canvas");
+        editorNode.put("resourceId", "canvas");
+        editorNode.put("stencilset", stencilset);
+        JSONObject modelObjectNode = new JSONObject();
+        modelObjectNode.put(MODEL_REVISION, 1);
+        modelObjectNode.put(MODEL_DESCRIPTION, model.getString(MODEL_DESCRIPTION));
+        modelObjectNode.put(MODEL_KEY, model.getString(MODEL_KEY));
+        modelObjectNode.put(MODEL_NAME, model.getString(MODEL_NAME));
+        modelObjectNode.put(MODEL_DESCRIPTION, model.getString(MODEL_DESCRIPTION));
+
+        Model modelData = repositoryService.newModel();
+        modelData.setMetaInfo(modelObjectNode.toJSONString());
+        modelData.setName(model.getString(MODEL_NAME));
+        modelData.setKey(model.getString(MODEL_KEY));
+        repositoryService.saveModel(modelData);
+        repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));
+        return ResponseMessage.ok(modelData);
+    }
+
+    @RequestMapping(value = "/model/{modelId}/deploy", method = RequestMethod.PUT)
+    @ResponseStatus(value = HttpStatus.OK)
+    @Authorize(action = "deploy")
+    public ResponseMessage deployModel(@PathVariable String modelId) throws Exception {
+        Model modelData = repositoryService.getModel(modelId);
+        if (modelData == null) throw new NotFoundException("模型不存在!");
+        ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
+        BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
+        byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
+        String processName = modelData.getName() + ".bpmn20.xml";
+        Deployment deployment = repositoryService.createDeployment()
+                .name(modelData.getName())
+                .addString(processName, new String(bpmnBytes, "utf8"))
+                .deploy();
+        return ResponseMessage.ok(deployment).include(Deployment.class, "id", "name", "new");
+    }
+
+    @RequestMapping(value = "/model/{modelId}/save", method = RequestMethod.PUT)
+    @ResponseStatus(value = HttpStatus.OK)
+    @Authorize(action = "U")
+    public void saveModel(@PathVariable String modelId,
+                          @RequestParam Map<String, String> values) throws TranscoderException, IOException {
+            Model model = repositoryService.getModel(modelId);
+            JSONObject modelJson = JSON.parseObject(model.getMetaInfo());
+
+            modelJson.put(MODEL_NAME, values.get("name"));
+            modelJson.put(MODEL_DESCRIPTION, values.get("description"));
+
+            model.setMetaInfo(modelJson.toString());
+            model.setName(values.get("name"));
+
+            repositoryService.saveModel(model);
+
+            repositoryService.addModelEditorSource(model.getId(), values.get("json_xml").getBytes("utf-8"));
+
+            InputStream svgStream = new ByteArrayInputStream(values.get("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();
+
+    }
+
+
+}

+ 18 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/test/java/org/hswebframework/web/workflow/flowable/modeler/FlowableModelTest.java

@@ -0,0 +1,18 @@
+package org.hswebframework.web.workflow.flowable.modeler;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by zhouhao on 2017/7/20.
+ */
+@SpringBootApplication
+public class FlowableModelTest {
+
+    public static void main(String[] args) {
+        SpringApplication.run(FlowableModelTest.class,args);
+    }
+
+}

+ 16 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/test/resources/application.yml

@@ -0,0 +1,16 @@
+spring:
+    aop:
+        auto: true
+        proxy-target-class: true
+    datasource:
+       url : jdbc:h2:mem:example
+       username : sa
+       password :
+       type: com.alibaba.druid.pool.DruidDataSource
+       driver-class-name : org.h2.Driver
+    cache:
+       type: simple
+
+logging:
+  level:
+      org.flowable: debug

+ 0 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/test/resources/processes/README.md


+ 86 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/pom.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-system-workflow</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-system-workflow-flowable</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.flowable</groupId>
+            <artifactId>flowable-spring-boot-starter-basic</artifactId>
+            <version>${flowable.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>log4j</artifactId>
+                    <groupId>log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.flowable</groupId>
+            <artifactId>flowable-json-converter</artifactId>
+            <version>${flowable.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>batik-parser</artifactId>
+            <version>${batik.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>batik-transcoder</artifactId>
+            <version>${batik.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>commons-logging</artifactId>
+                    <groupId>commons-logging</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>batik-bridge</artifactId>
+            <version>${batik.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>batik-codec</artifactId>
+            <version>${batik.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>batik-css</artifactId>
+            <version>${batik.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>batik-svg-dom</artifactId>
+            <version>${batik.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>batik-svggen</artifactId>
+            <version>${batik.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.imgscalr</groupId>
+            <artifactId>imgscalr-lib</artifactId>
+            <version>4.2</version>
+        </dependency>
+        <dependency>
+            <groupId>math.geom2d</groupId>
+            <artifactId>javaGeom</artifactId>
+            <version>0.11.1</version>
+        </dependency>
+    </dependencies>
+</project>

+ 9 - 0
hsweb-system/hsweb-system-workflow/pom.xml

@@ -10,6 +10,15 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>hsweb-system-workflow</artifactId>
+    <packaging>pom</packaging>
+    <properties>
+        <batik.version>1.7</batik.version>
+        <flowable.version>6.1.0</flowable.version>
+    </properties>
+    <modules>
+        <module>hsweb-system-workflow-flowable</module>
+        <module>hsweb-system-workflow-flowable-modeler</module>
+    </modules>
 
 
 </project>