Browse Source

重构工作流(03)

zhou-hao 6 years ago
parent
commit
72d0a47377
12 changed files with 177 additions and 112 deletions
  1. 42 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/pom.xml
  2. 6 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimension.java
  3. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimensionParser.java
  4. 41 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java
  5. 9 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/CandidateDimensionParserStrategy.java
  6. 0 3
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/META-INF/spring.factories
  7. 0 47
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ActDefMapper.xml
  8. 0 46
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ProcDefFormMapper.xml
  9. 2 14
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/flowable/TestApplication.java
  10. 64 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/flowable/WorkFlowModelTests.groovy
  11. 7 0
      hsweb-tests/pom.xml
  12. 5 0
      pom.xml

+ 42 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/pom.xml

@@ -122,6 +122,48 @@
             <artifactId>hsweb-system-dynamic-form-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>io.vavr</groupId>
+            <artifactId>vavr</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-system-authorization-starter</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-system-organizational-starter</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-tests</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-starter</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </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>
     </dependencies>
 
 </project>

+ 6 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimension.java

@@ -1,5 +1,7 @@
 package org.hswebframework.web.workflow.dimension;
 
+import java.io.Serializable;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -8,6 +10,9 @@ import java.util.List;
  */
 public interface CandidateDimension {
 
-    List<String> getCandidatUserIdList();
+    List<String> getCandidateUserIdList();
+
+
+    CandidateDimension empty =  Collections::emptyList;
 
 }

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimensionParser.java

@@ -6,5 +6,5 @@ package org.hswebframework.web.workflow.dimension;
  * @since 3.0.0-RC
  */
 public interface CandidateDimensionParser {
-    CandidateDimension parse(String JSONConfig);
+    CandidateDimension parse(String jsonConfig);
 }

+ 41 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java

@@ -0,0 +1,41 @@
+package org.hswebframework.web.workflow.dimension;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import io.vavr.Lazy;
+import org.apache.commons.collections.CollectionUtils;
+import org.hswebframework.web.workflow.dimension.parser.CandidateDimensionParserStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class DefaultCandidateDimensionParser implements CandidateDimensionParser {
+
+
+    @Autowired(required = false)
+    private List<CandidateDimensionParserStrategy> strategies;
+
+    @Override
+    public CandidateDimension parse(String jsonConfig) {
+        JSONObject jsonObject = JSON.parseObject(jsonConfig);
+        String type = jsonObject.getString("type");
+        List<String> ids = jsonObject.getJSONArray("list").toJavaList(String.class);
+
+        if (StringUtils.isEmpty(type) || CollectionUtils.isEmpty(strategies) || CollectionUtils.isEmpty(ids)) {
+            return CandidateDimension.empty;
+        }
+
+        return Lazy.val(() ->
+                (CandidateDimension) () -> strategies
+                        .stream()
+                        .filter(strategy -> strategy.support(type))
+                        .map(strategy -> strategy.parse(ids))
+                        .filter(CollectionUtils::isNotEmpty)
+                        .flatMap(Collection::stream)
+                        .collect(Collectors.toList()), CandidateDimension.class);
+
+    }
+}

+ 9 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/CandidateDimensionParserStrategy.java

@@ -0,0 +1,9 @@
+package org.hswebframework.web.workflow.dimension.parser;
+
+import java.util.List;
+
+public interface CandidateDimensionParserStrategy {
+    boolean support(String type);
+
+    List<String> parse(List<String> ids);
+}

+ 0 - 3
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/META-INF/spring.factories

@@ -1,3 +0,0 @@
-# Auto Configure
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.hswebframework.web.workflow.starter.WorkFlowAutoConfiguration

+ 0 - 47
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ActDefMapper.xml

@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.hswebframework.web.dao.workflow.ActDefDao">
-    <resultMap id="ActDefResultMap" type="org.hswebframework.web.entity.workflow.SimpleActDefEntity">
-        <id property="id" column="u_id" javaType="string" jdbcType="VARCHAR"/>
-        <result property="actId" column="act_id" javaType="String" jdbcType="VARCHAR"/>
-        <result property="formId" column="form_id" javaType="String" jdbcType="VARCHAR"/>
-        <result property="defId" column="def_id" javaType="String" jdbcType="VARCHAR"/>
-    </resultMap>
-
-    <!--用于动态生成sql所需的配置-->
-    <sql id="config">
-        <bind name="resultMapId" value="'ActDefResultMap'"/>
-        <bind name="tableName" value="'s_act_def'"/>
-    </sql>
-
-    <insert id="insert" parameterType="org.hswebframework.web.entity.workflow.SimpleActDefEntity">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildInsertSql"/>
-    </insert>
-
-    <delete id="deleteByPk" parameterType="String">
-        delete from s_act_def where u_id =#{id}
-    </delete>
-
-    <delete id="delete" parameterType="org.hswebframework.web.commons.entity.Entity">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildDeleteSql"/>
-    </delete>
-
-    <update id="update" parameterType="org.hswebframework.web.commons.entity.Entity">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildUpdateSql"/>
-    </update>
-
-    <select id="query" parameterType="org.hswebframework.web.commons.entity.Entity" resultMap="ActDefResultMap">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildSelectSql"/>
-    </select>
-
-    <select id="count" parameterType="org.hswebframework.web.commons.entity.Entity" resultType="int">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildTotalSql"/>
-    </select>
-</mapper>

+ 0 - 46
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ProcDefFormMapper.xml

@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.hswebframework.web.dao.workflow.ProcDefFormDao">
-    <resultMap id="ProcDefFormResultMap" type="org.hswebframework.web.entity.workflow.SimpleProcDefFormEntity">
-              <id property="id" column="u_id" javaType="string" jdbcType="VARCHAR"/>
-            <result property="defKey" column="def_key" javaType="String" jdbcType="VARCHAR"/>
-            <result property="formId" column="form_id" javaType="String" jdbcType="VARCHAR"/>
-    </resultMap>
-
-    <!--用于动态生成sql所需的配置-->
-    <sql id="config">
-        <bind name="resultMapId" value="'ProcDefFormResultMap'"/>
-        <bind name="tableName" value="'s_def_form'"/>
-    </sql>
-  
-    <insert id="insert" parameterType="org.hswebframework.web.entity.workflow.SimpleProcDefFormEntity" >
-        <include refid="config"/>
-        <include refid="BasicMapper.buildInsertSql"/>
-    </insert>
-
-    <delete id="deleteByPk" parameterType="String">
-        delete from s_def_form where u_id =#{id}
-    </delete>
-
-    <delete id="delete" parameterType="org.hswebframework.web.commons.entity.Entity">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildDeleteSql"/>
-    </delete>
-
-    <update id="update" parameterType="org.hswebframework.web.commons.entity.Entity">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildUpdateSql"/>
-    </update>
-
-    <select id="query" parameterType="org.hswebframework.web.commons.entity.Entity" resultMap="ProcDefFormResultMap">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildSelectSql"/>
-    </select>
-
-    <select id="count" parameterType="org.hswebframework.web.commons.entity.Entity" resultType="int">
-        <include refid="config"/>
-        <include refid="BasicMapper.buildTotalSql"/>
-    </select>
-</mapper>

+ 2 - 14
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/flowable/TestApplication.java

@@ -1,25 +1,13 @@
 package org.hswebframework.web.workflow.flowable;
 
-import org.hswebframework.web.service.organizational.RelationDefineService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.test.context.ActiveProfiles;
+import org.springframework.context.annotation.ComponentScan;
 
 /**
- * TODO 完成注释
- *
  * @author zhouhao
  */
 @SpringBootApplication
-@ActiveProfiles("dev")
+@ComponentScan("org.hswebframework.web.workflow")
 public class TestApplication {
-    @Autowired
-    RelationDefineService relationDefineService;
 
-    public static void main(String[] args) {
-        SpringApplication application = new SpringApplication(TestApplication.class);
-        application.setAdditionalProfiles("dev");
-        application.run(args);
-    }
 }

+ 64 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/flowable/WorkFlowModelTests.groovy

@@ -0,0 +1,64 @@
+package org.hswebframework.web.workflow.flowable
+
+import com.alibaba.fastjson.JSON
+import org.hswebframework.web.authorization.AuthenticationInitializeService
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.context.ConfigurableApplicationContext
+import org.springframework.http.MediaType
+import org.springframework.test.context.ContextConfiguration
+import org.springframework.test.context.web.WebAppConfiguration
+import org.springframework.test.web.servlet.MockMvc
+import org.springframework.test.web.servlet.setup.MockMvcBuilders
+import spock.lang.Shared
+import spock.lang.Specification
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+/**
+ * @author zhouhao
+ * @since
+ */
+@WebAppConfiguration
+@ContextConfiguration
+@SpringBootTest(classes = [TestApplication.class], properties = ["classpath:application.yml"])
+class WorkFlowModelTests extends Specification {
+    @Autowired
+    private ConfigurableApplicationContext context;
+
+    @Shared
+    private MockMvc mockMvc;
+
+    @Autowired
+    private AuthenticationInitializeService initializeService;
+
+    void setup() {
+        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
+    }
+
+    def "Add Model"() {
+        setup:
+        //添加模型
+        def json = mockMvc.perform(post("/workflow/model/")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content("""
+                        {
+                            "key":"testModel",
+                            "name":"测试模型"
+                        }
+                        """))
+                .andExpect(status().is(201))
+                .andReturn().getResponse().getContentAsString();
+        println(json)
+
+        and:
+        def jsonObject = JSON.parseObject(json)
+        def id = jsonObject.getJSONObject("result").getString("id");
+
+        expect:
+        jsonObject != null
+        id != null
+    }
+
+}

+ 7 - 0
hsweb-tests/pom.xml

@@ -17,11 +17,18 @@
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
+
         <dependency>
             <groupId>javax.el</groupId>
             <artifactId>el-api</artifactId>
             <version>2.2</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>

+ 5 - 0
pom.xml

@@ -278,6 +278,11 @@
 
     <dependencyManagement>
         <dependencies>
+            <dependency>
+                <groupId>io.vavr</groupId>
+                <artifactId>vavr</artifactId>
+                <version>0.9.2</version>
+            </dependency>
             <dependency>
                 <groupId>org.projectlombok</groupId>
                 <artifactId>lombok</artifactId>