Pārlūkot izejas kodu

优化工作流

zhou-hao 7 gadi atpakaļ
vecāks
revīzija
a0737bef34
11 mainītis faili ar 200 papildinājumiem un 174 dzēšanām
  1. 6 92
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/pom.xml
  2. 35 25
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/controller/FlowableCoreController.java
  3. 43 34
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/controller/FlowableDeploymentController.java
  4. 36 19
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/controller/FlowableModelManagerController.java
  5. 19 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/entity/ModelCreateRequest.java
  6. 56 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/pom.xml
  7. 5 4
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/java/org/hswebframework/web/workflow/flowable/ControllerTest.java
  8. 0 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/java/org/hswebframework/web/workflow/flowable/TestApplication.java
  9. 0 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/resources/application-dev.yml
  10. 0 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/resources/application.yml
  11. 0 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/resources/processes/README.md

+ 6 - 92
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/pom.xml

@@ -101,11 +101,11 @@
             <version>${project.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-access-logging-aop</artifactId>
-            <version>${project.version}</version>
-        </dependency>
+        <!--<dependency>-->
+        <!--<groupId>org.hswebframework.web</groupId>-->
+        <!--<artifactId>hsweb-access-logging-aop</artifactId>-->
+        <!--<version>${project.version}</version>-->
+        <!--</dependency>-->
         <dependency>
             <groupId>org.hswebframework.web</groupId>
             <artifactId>hsweb-system-organizational-service-api</artifactId>
@@ -121,98 +121,12 @@
             <artifactId>hsweb-system-workflow-service-api</artifactId>
             <version>${project.version}</version>
         </dependency>
-       <!---->
-        <!--<dependency>-->
-            <!--<groupId>org.mybatis</groupId>-->
-            <!--<artifactId>mybatis-spring</artifactId>-->
-            <!--<version>RELEASE</version>-->
-        <!--</dependency>-->
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-
-        <!--               test             -->
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <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>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-            <version>4.3.7.RELEASE</version>
-            <scope>test</scope>
-        </dependency>
         <dependency>
             <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-spring-boot-starter</artifactId>
+            <artifactId>hsweb-system-dynamic-form-service-api</artifactId>
             <version>${project.version}</version>
-            <scope>test</scope>
         </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-system-workflow-service-simple</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-system-workflow-dao-mybatis</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-system-dynamic-form-service-simple</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <!--               test             -->
-
 
     </dependencies>
 </project>

+ 35 - 25
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/controller/FlowableCoreController.java

@@ -1,10 +1,16 @@
 package org.hswebframework.web.workflow.flowable.controller;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
 import org.activiti.engine.impl.pvm.process.ActivityImpl;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.task.Task;
 import org.hswebframework.web.NotFoundException;
+import org.hswebframework.web.authorization.Permission;
+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.commons.entity.param.UpdateParamEntity;
 import org.hswebframework.web.controller.message.ResponseMessage;
 import org.hswebframework.web.entity.workflow.ActDefEntity;
@@ -18,9 +24,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static org.hswebframework.web.commons.entity.param.QueryParamEntity.single;
 
@@ -30,6 +38,8 @@ import static org.hswebframework.web.commons.entity.param.QueryParamEntity.singl
  */
 @RestController
 @RequestMapping("/workflow/proc-def/")
+@Api(tags = "工作流-流程管理",description = "工作流流程管理")
+@Authorize(permission = "workflow-process",description = "工作流流程管理")
 public class FlowableCoreController {
     @Autowired
     BpmTaskService bpmTaskService;
@@ -47,42 +57,42 @@ public class FlowableCoreController {
     }
     /**
      * 获取所有可用流程(流程配置与流程启动都可用该方法获取)
-     * @return
+     * @return key为流程定义的id。value为name
      */
-    @GetMapping("index")
-    public ResponseMessage<Map<String, Object>> index(){
+    @GetMapping("/available")
+    @ApiOperation("获取所有可用流程定义信息")
+    @Authorize(action = Permission.ACTION_QUERY)
+    public ResponseMessage<Map<String, String>> getALlAvailableProcessDefinition(){
         List<ProcessDefinition> list = bpmProcessService.getAllProcessDefinition();
-        Map<String, Object> map = new HashMap<>();
-        for(ProcessDefinition processDefinition : list){
-            map.put(processDefinition.getName(),processDefinition.getId());
-        }
-        return ResponseMessage.ok(map);
+        return ResponseMessage.ok(list
+                .stream()
+                .collect(Collectors.toMap(ProcessDefinition::getId,ProcessDefinition::getName)));
     }
 
     /**
-     * 进入流程表单
-     * @param procDefId
-     * @return
+     * 查询流程表单数据
+     * @param procDefId 流程定义id
      */
-    @GetMapping("open-form/{id}")
-    public ResponseMessage<Map<String,PagerResult<Object>>> openForm(@PathVariable("id") String procDefId){
+    @GetMapping("form/{id}")
+    @ApiOperation("查询流程的表单数据")
+    @Authorize(action = Permission.ACTION_QUERY)
+    public ResponseMessage<PagerResult<Object>> openForm(@PathVariable("id") String procDefId, QueryParamEntity param){
         assertDynamicFormReady();
         Map<String,PagerResult<Object>> map = new HashMap<>();
         ActivityImpl activity = bpmActivityService.getStartEvent(procDefId);
+
         ActDefEntity actDefEntity = actDefService.selectSingle(single(ActDefEntity.actId,activity.getId()));
-        map.put(activity.getProcessDefinition().getKey(),
-                dynamicFormOperationService.selectPager(actDefEntity.getFormId(), null));
-        return ResponseMessage.ok(map);
+        if(actDefEntity!=null){
+            return ResponseMessage.ok(dynamicFormOperationService.selectPager(actDefEntity.getFormId(),param));
+        }
+        throw new NotFoundException("表单不存在");
     }
 
     /**
-     * 保存表单,启动流程
-     * @param formId
-     * @param defId
-     * @param data
-     * @return
+     * 提交表单数据并启动流程
      */
     @PostMapping("start/{formId}-{defId}")
+    @ApiOperation("提交表单数据并启动流程")
     public ResponseMessage<Map<String, Object>> startProc(@PathVariable String formId,@PathVariable String defId, @RequestBody Map<String, Object> data) {
         assertDynamicFormReady();
         PersonnelAuthorization authorization = PersonnelAuthorization
@@ -99,6 +109,7 @@ public class FlowableCoreController {
      * @return
      */
     @GetMapping("tasks")
+    @ApiOperation("获取代办任务")
     public ResponseMessage<List<Task>> getMyTasks() {
         PersonnelAuthorization authorization = PersonnelAuthorization
                 .current()
@@ -111,20 +122,19 @@ public class FlowableCoreController {
     }
 
     /**
-     * 办理
+     * 办理任务
      * @param formId
      * @param taskId
-     * @param paramEntity
      * @return
      */
     @PutMapping("complete/{formId}-{taskId}")
-    public ResponseMessage<Map<String,Object>> complete(@PathVariable String formId,@PathVariable String taskId, @RequestBody UpdateParamEntity<Map<String, Object>> paramEntity){
+    public ResponseMessage<Map<String,Object>> complete(@PathVariable String formId,@PathVariable String taskId){
         assertDynamicFormReady();
         PersonnelAuthorization authorization = PersonnelAuthorization
                 .current()
                 .orElseThrow(NotFoundException::new);
         String userId = authorization.getPersonnel().getId();
-        dynamicFormOperationService.update(formId,paramEntity);
+//        dynamicFormOperationService.update(formId,null);
         // 认领
         bpmTaskService.claim(taskId,userId);
         // 办理

+ 43 - 34
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/controller/FlowableDeploymentController.java

@@ -3,6 +3,8 @@ package org.hswebframework.web.workflow.flowable.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.editor.constants.ModelDataJsonConstants;
@@ -10,6 +12,7 @@ import org.activiti.editor.language.json.converter.BpmnJsonConverter;
 import org.activiti.engine.history.HistoricProcessInstance;
 import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
 import org.activiti.engine.impl.pvm.process.ActivityImpl;
+import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.repository.DeploymentBuilder;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.repository.ProcessDefinitionQuery;
@@ -18,6 +21,8 @@ import org.hswebframework.ezorm.core.PropertyWrapper;
 import org.hswebframework.ezorm.core.SimplePropertyWrapper;
 import org.hswebframework.ezorm.core.param.TermType;
 import org.hswebframework.web.NotFoundException;
+import org.hswebframework.web.authorization.Permission;
+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;
@@ -27,10 +32,12 @@ import org.hswebframework.web.workflow.flowable.service.BpmProcessService;
 import org.hswebframework.web.workflow.flowable.service.BpmTaskService;
 import org.hswebframework.web.workflow.flowable.utils.FlowableAbstract;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.util.StreamUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletResponse;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
@@ -51,30 +58,29 @@ import java.util.zip.ZipInputStream;
  * @Date 2017/8/10.
  */
 @RestController
-@RequestMapping("/workflow/process/definition/")
+@RequestMapping("/workflow/process/definition")
+@Api(tags = "工作流-流程定义管理", description = "工作流流程定义管理")
+@Authorize(permission = "workflow-definition", description = "工作流-流程定义管理")
 public class FlowableDeploymentController extends FlowableAbstract {
 
-    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";
+    private final static String MODEL_ID = "modelId";
 
     @Autowired
-    BpmTaskService     bpmTaskService;
+    BpmTaskService bpmTaskService;
     @Autowired
-    BpmProcessService  bpmProcessService;
+    BpmProcessService bpmProcessService;
     @Autowired
     BpmActivityService bpmActivityService;
 
     /**
      * 流程定义列表
      */
-    @GetMapping("/processList")
-    public ResponseMessage<PagerResult<ProcessDefinition>> processList(QueryParamEntity param) {
+    @GetMapping
+    @ApiOperation("查询流程定义列表")
+    @Authorize(action = Permission.ACTION_QUERY)
+    public ResponseMessage<PagerResult<ProcessDefinition>> QueryProcessList(QueryParamEntity param) {
         ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
         param.getTerms().forEach((term) -> {
-
             PropertyWrapper valueWrapper = new SimplePropertyWrapper(term.getValue());
             String stringValue = valueWrapper.toString();
             switch (term.getColumn()) {
@@ -124,7 +130,9 @@ public class FlowableDeploymentController extends FlowableAbstract {
      * 加载ZIP文件中的流程
      */
     @PostMapping(value = "/deploy")
-    public ResponseMessage<Object> deploy(@RequestParam(value = "file") MultipartFile file) throws IOException {
+    @ApiOperation("上传流程定义文件并部署流程")
+    @Authorize(action = "deploy")
+    public ResponseMessage<Deployment> deploy(@RequestParam(value = "file") MultipartFile file) throws IOException {
         // 获取上传的文件名
         String fileName = file.getOriginalFilename();
 
@@ -143,9 +151,9 @@ public class FlowableDeploymentController extends FlowableAbstract {
             // 其他类型的文件直接部署
             deployment.addInputStream(fileName, fileInputStream);
         }
-        deployment.deploy();
+        Deployment result = deployment.deploy();
 
-        return ResponseMessage.ok();
+        return ResponseMessage.ok(result);
     }
 
     /**
@@ -155,6 +163,8 @@ public class FlowableDeploymentController extends FlowableAbstract {
      * @param resourceName        资源名称
      */
     @GetMapping(value = "/{processDefinitionId}/resource/{resourceName}")
+    @ApiOperation("读取流程资源")
+    @Authorize(action = Permission.ACTION_QUERY)
     public void readResource(@PathVariable String processDefinitionId
             , @PathVariable String resourceName, HttpServletResponse response)
             throws Exception {
@@ -162,15 +172,10 @@ public class FlowableDeploymentController extends FlowableAbstract {
         ProcessDefinition pd = pdq.processDefinitionId(processDefinitionId).singleResult();
 
         // 通过接口读取
-        InputStream resourceAsStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), resourceName);
-        StreamUtils.copy(resourceAsStream, response.getOutputStream());
+        try (InputStream resourceAsStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), resourceName)) {
+            StreamUtils.copy(resourceAsStream, response.getOutputStream());
+        }
 
-//        // 输出资源内容到相应对象
-//        byte[] b = new byte[1024];
-//        int len = -1;
-//        while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
-//            response.getOutputStream().write(b, 0, len);
-//        }
     }
 
     /***
@@ -181,7 +186,9 @@ public class FlowableDeploymentController extends FlowableAbstract {
      * @throws XMLStreamException
      */
     @PutMapping(value = "/convert-to-model/{processDefinitionId}")
-    public ResponseMessage<Map<String, Object>> convertToModel(@PathVariable("processDefinitionId") String processDefinitionId)
+    @ApiOperation("流程定义转换模型")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<String> convertToModel(@PathVariable("processDefinitionId") String processDefinitionId)
             throws UnsupportedEncodingException, XMLStreamException {
         ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                 .processDefinitionId(processDefinitionId).singleResult();
@@ -211,7 +218,7 @@ public class FlowableDeploymentController extends FlowableAbstract {
         repositoryService.saveModel(modelData);
 
         repositoryService.addModelEditorSource(modelData.getId(), modelNode.toString().getBytes("utf-8"));
-        return ResponseMessage.ok(Collections.singletonMap(MODEL_ID, modelData.getId()));
+        return ResponseMessage.ok(modelData.getId());
     }
 
     /**
@@ -220,6 +227,8 @@ public class FlowableDeploymentController extends FlowableAbstract {
      * @param deploymentId 流程部署ID
      */
     @DeleteMapping(value = "/deployment/{deploymentId}")
+    @ApiOperation("删除部署的流程")
+    @Authorize(action = Permission.ACTION_DELETE)
     public ResponseMessage<String> deleteProcessDefinition(
             @PathVariable("deploymentId") String deploymentId
             , @RequestParam(defaultValue = "false") boolean cascade) {
@@ -245,6 +254,8 @@ public class FlowableDeploymentController extends FlowableAbstract {
      * @return 当前节点
      */
     @GetMapping("/{processInstanceId}/activity")
+    @ApiOperation("查看当前流程活动节点流程图")
+    @Authorize(action = Permission.ACTION_QUERY)
     public ResponseMessage<Map<String, Object>> getProcessInstanceActivity(@PathVariable String processInstanceId) {
         HistoricProcessInstance processInstance = bpmTaskService.selectHisProInst(processInstanceId);
         if (processInstance != null) {
@@ -254,20 +265,18 @@ public class FlowableDeploymentController extends FlowableAbstract {
             jsonObject.put("procDefId", processInstance.getProcessDefinitionId());
             return ResponseMessage.ok(jsonObject);
         } else {
-            throw new NotFoundException("获取流程图失败");
+            throw new NotFoundException("流程不存在");
 //            jsonObject.put("message", "获取流程图失败");
         }
     }
 
     @GetMapping("/{processInstanceId}/image")
-    public void findPic(@PathVariable String processInstanceId, HttpServletResponse response) throws IOException {
-        InputStream inputStream = bpmProcessService.findProcessPic(processInstanceId);
-        StreamUtils.copy(inputStream, response.getOutputStream());
-
-//            byte[] b = new byte[1024];
-//            int len;
-//            while ((len = inputStream.read(b, 0, 1024)) != -1) {
-//                response.getOutputStream().write(b, 0, len);
-//            }
+    @ApiOperation("查看当前流程活动节点流程图")
+    @Authorize(action = Permission.ACTION_QUERY)
+    public void getProcessImage(@PathVariable String processInstanceId, HttpServletResponse response) throws IOException {
+        try (InputStream inputStream = bpmProcessService.findProcessPic(processInstanceId)) {
+            response.setContentType(MediaType.IMAGE_PNG_VALUE);
+            ImageIO.write(ImageIO.read(inputStream),"png",response.getOutputStream());
+        }
     }
 }

+ 36 - 19
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/controller/FlowableModelManagerController.java

@@ -4,6 +4,10 @@ import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
 import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.editor.language.json.converter.BpmnJsonConverter;
@@ -16,9 +20,12 @@ import org.hswebframework.ezorm.core.PropertyWrapper;
 import org.hswebframework.ezorm.core.SimplePropertyWrapper;
 import org.hswebframework.ezorm.core.param.TermType;
 import org.hswebframework.web.NotFoundException;
+import org.hswebframework.web.authorization.Permission;
+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.workflow.flowable.entity.ModelCreateRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
@@ -30,18 +37,23 @@ import java.util.List;
 
 @RestController
 @RequestMapping("/workflow/model/")
+@Api(tags = "工作流-模型管理", description = "工作流模型管理")
+@Authorize(permission = "workflow-model", description = "工作流模型管理")
+@Slf4j
 public class FlowableModelManagerController {
 
     @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_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";
+    private final static String MODEL_KEY = "key";
 
-    @GetMapping("getModelList")
+    @GetMapping
+    @Authorize(action = Permission.ACTION_QUERY)
+    @ApiOperation("获取模型列表")
     public ResponseMessage<PagerResult<Model>> getModelList(QueryParamEntity param) {
         ModelQuery modelQuery = repositoryService.createModelQuery();
         param.getTerms().forEach((term) -> {
@@ -94,9 +106,10 @@ public class FlowableModelManagerController {
                 .exclude(Model.class, "metaInfo", "persistentState");
     }
 
-    @PostMapping("createModel")
+    @PostMapping
     @ResponseStatus(value = HttpStatus.CREATED)
-    public ResponseMessage createModel(@RequestBody JSONObject model) throws Exception {
+    @ApiOperation("创建模型")
+    public ResponseMessage<Model> createModel(@RequestBody ModelCreateRequest model) throws Exception {
         JSONObject stencilset = new JSONObject();
         stencilset.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
         JSONObject editorNode = new JSONObject();
@@ -105,21 +118,23 @@ public class FlowableModelManagerController {
         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.getDescription());
+        modelObjectNode.put(MODEL_KEY, model.getKey());
+        modelObjectNode.put(MODEL_NAME, model.getName());
 
         Model modelData = repositoryService.newModel();
         modelData.setMetaInfo(modelObjectNode.toJSONString());
-        modelData.setName(model.getString(MODEL_NAME));
-        modelData.setKey(model.getString(MODEL_KEY));
+        modelData.setName(model.getName());
+        modelData.setKey(model.getKey());
         repositoryService.saveModel(modelData);
         repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));
         return ResponseMessage.ok(modelData);
     }
 
-    @PutMapping("{modelId}/deploy")
-    public ResponseMessage deployModel(@PathVariable String modelId) throws Exception {
+    @PostMapping("{modelId}/deploy")
+    @ApiOperation("发布模型")
+    @Authorize(action = "deploy")
+    public ResponseMessage<Deployment> deployModel(@PathVariable String modelId) throws Exception {
         Model modelData = repositoryService.getModel(modelId);
         if (modelData == null) {
             throw new NotFoundException("模型不存在!");
@@ -141,10 +156,12 @@ public class FlowableModelManagerController {
      * @param modelId 模型ID
      * @param type    导出文件类型(bpmn\json)
      */
-    @RequestMapping(value = "export/{modelId}/{type}", method = RequestMethod.GET)
-    public void export(@PathVariable("modelId") String modelId,
-                       @PathVariable("type") String type,
-                       HttpServletResponse response) {
+    @GetMapping(value = "export/{modelId}/{type}")
+    @ApiOperation("导出模型")
+    @Authorize(action = "export")
+    public void export(@PathVariable("modelId") @ApiParam("模型ID") String modelId,
+                       @PathVariable("type") @ApiParam(value = "类型", allowableValues = "bpmn,json", example = "json") String type,
+                       @ApiParam(hidden = true) HttpServletResponse response) {
         try {
             Model modelData = repositoryService.getModel(modelId);
             BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
@@ -190,7 +207,7 @@ public class FlowableModelManagerController {
             response.flushBuffer();
             in.close();
         } catch (Exception e) {
-//            logger.error("导出model的xml文件失败:modelId={}, type={}", modelId, type, e);
+            log.error("导出model的xml文件失败:modelId={}, type={}", modelId, type, e);
         }
     }
 

+ 19 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/entity/ModelCreateRequest.java

@@ -0,0 +1,19 @@
+package org.hswebframework.web.workflow.flowable.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("工作流模型创建请求")
+public class ModelCreateRequest {
+
+    @ApiModelProperty(value = "模型标识",example = "test_model")
+    private String key;
+
+    @ApiModelProperty(value = "模型名称",example = "测试模型")
+    private String name;
+
+    @ApiModelProperty(value = "模型说明")
+    private String description;
+}

+ 56 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/pom.xml

@@ -32,5 +32,61 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
+
+        <!--               test             -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <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>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-spring-boot-starter</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </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-system-dynamic-form-starter</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

+ 5 - 4
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/java/org/hswebframework/web/workflow/flowable/ControllerTest.java

@@ -9,23 +9,24 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 
 import java.util.List;
 
 /**
- * TODO 完善rest测试
  * @Author wangwei
  * @Date 2017/8/1.
  */
+@Configuration
+@ComponentScan("org.hswebframework.web.workflow")
 public class ControllerTest extends SimpleWebApplicationTests {
 
     @Test
     public void testRest() throws Exception {
         //todo 获取所有可办理流程
-        JSONObject result = testGet("/workflow/proc-def/index").exec().resultAsJson();
-        result = result.getJSONObject("result");
-        Assert.assertNotNull(result);
+        JSONObject result = testGet("/workflow/process/definition").exec().resultAsJson();
+        Assert.assertNotNull( result.getJSONObject("result"));
         Assert.assertEquals(200, result.get("status"));
         System.out.println(result);
     }

hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/java/org/hswebframework/web/workflow/flowable/TestApplication.java → hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/java/org/hswebframework/web/workflow/flowable/TestApplication.java


hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/resources/application-dev.yml → hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/resources/application-dev.yml


hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/resources/application.yml → hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/resources/application.yml


hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/resources/processes/README.md → hsweb-system/hsweb-system-workflow/hsweb-system-workflow-starter/src/test/resources/processes/README.md