Forráskód Böngészése

重构工作流(5)

zhouhao 6 éve
szülő
commit
b554443231
15 módosított fájl, 436 hozzáadás és 190 törlés
  1. 12 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/pom.xml
  2. 2 12
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/entity/SimpleProcessDefinition.java
  3. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/flowable/FlowableAutoConfiguration.java
  4. 93 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/util/QueryUtils.java
  5. 17 73
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableDeploymentController.java
  6. 98 35
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableCoreController.java
  7. 0 69
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableUtilsController.java
  8. 14 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/diagram/ProcessDefinitionDiagramLayoutResource.java
  9. 14 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/diagram/ProcessInstanceDiagramLayoutResource.java
  10. 13 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/diagram/ProcessInstanceHighlightsResource.java
  11. 38 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/ActivityInfo.java
  12. 40 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/ProcessDefinitionInfo.java
  13. 46 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/ProcessInfo.java
  14. 44 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/TaskInfo.java
  15. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/flowable/WorkFlowProcessTests.groovy

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

@@ -20,6 +20,18 @@
             <version>${project.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.flowable</groupId>
+            <artifactId>flowable-diagram-rest</artifactId>
+            <version>${flowable.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.flowable</groupId>
+                    <artifactId>flowable-common-rest</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <dependency>
             <groupId>org.flowable</groupId>
             <artifactId>flowable-spring-boot-starter-basic</artifactId>

+ 2 - 12
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/entity/SimpleProcessDefinition.java

@@ -10,11 +10,11 @@ import org.hswebframework.web.commons.bean.Bean;
  */
 @Getter
 @Setter
-public class SimpleProcessDefinition implements ProcessDefinition, Bean {
+public class SimpleProcessDefinition implements Bean {
 
     private static final long serialVersionUID = -7246626050183062980L;
 
-    private String id;
+    private String  id;
     private String  category;
     private String  name;
     private String  key;
@@ -54,14 +54,4 @@ public class SimpleProcessDefinition implements ProcessDefinition, Bean {
         this.suspended = suspended;
     }
 
-
-    @Override
-    public boolean hasGraphicalNotation() {
-        return hasGraphicalNotation;
-    }
-
-    @Override
-    public boolean hasStartFormKey() {
-        return hasStartFormKey;
-    }
 }

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/flowable/FlowableAutoConfiguration.java

@@ -27,7 +27,7 @@ public class FlowableAutoConfiguration {
     private List<SessionFactory> sessionFactories;
 
     @Bean
-    public ProcessEngineConfigurationConfigurer processEngineConfigurationConfigurer(PlatformTransactionManager transactionManager) {
+    public ProcessEngineConfigurationConfigurer processEngineConfigurationConfigurer() {
         return configuration -> {
             configuration
                     .setAsyncExecutorActivate(false)

+ 93 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/util/QueryUtils.java

@@ -0,0 +1,93 @@
+package org.hswebframework.web.workflow.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.activiti.engine.query.Query;
+import org.hswebframework.ezorm.core.param.Sort;
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.core.param.TermType;
+import org.hswebframework.utils.StringUtils;
+import org.hswebframework.web.bean.FastBeanCopier;
+import org.hswebframework.web.commons.entity.PagerResult;
+import org.hswebframework.web.commons.entity.param.QueryParamEntity;
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Slf4j
+public class QueryUtils {
+
+    public static <U, T extends Query<?, U>> PagerResult<U> doQuery(T query, QueryParamEntity entity) {
+        return doQuery(query,
+                entity,
+                Function.identity());
+    }
+
+    public static <U, R, T extends Query<?, U>> PagerResult<R> doQuery(T query, QueryParamEntity entity, Function<U, R> mapping) {
+        return doQuery(query,
+                entity,
+                mapping,
+                (term, tuQuery) -> log.warn("不支持的查询条件:{}{}", term.getTermType(), term.getColumn()));
+    }
+
+    public static <U, R, T extends Query<?, U>> PagerResult<R> doQuery(T query,
+                                                                       QueryParamEntity entity,
+                                                                       Function<U, R> mapping,
+                                                                       BiConsumer<Term, T> notFound) {
+        applyQueryParam(query, entity, notFound);
+        int total = (int) query.count();
+        if (total == 0) {
+            return PagerResult.empty();
+        }
+        entity.rePaging(total);
+        List<R> list = query.listPage(entity.getPageIndex(), entity.getPageSize() * (entity.getPageIndex() + 1))
+                .stream()
+                .map(mapping)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        return PagerResult.of(total, list);
+    }
+
+    public static <U, T extends Query<?, U>> void applyQueryParam(T query, QueryParamEntity entity, BiConsumer<Term, T> notFound) {
+        Class type = query.getClass();
+        for (Term term : entity.getTerms()) {
+            String name = term.getColumn();
+            if (TermType.like.equals(term.getTermType())) {
+                name = name.concat("Like");
+            } else if (TermType.in.equals(term.getTermType())) {
+                name = name.concat("s");
+            }
+            Method method = ReflectionUtils.findMethod(type, name);
+            if (method == null) {
+                notFound.accept(term, query);
+                continue;
+            }
+            if (method.getParameterCount() != 1) {
+                log.debug("查询参数:[{} {}]不支持,method:{}", term.getTermType(), name, method);
+                continue;
+            }
+            Object value = FastBeanCopier.DEFAULT_CONVERT.convert(term.getValue(), method.getParameterTypes()[0], FastBeanCopier.EMPTY_CLASS_ARRAY);
+            ReflectionUtils.invokeMethod(method, query, value);
+        }
+        for (Sort sort : entity.getSorts()) {
+            String name = sort.getName();
+            Method method = ReflectionUtils.findMethod(type, "orderBy" + StringUtils.toUpperCaseFirstOne(name));
+            if (method != null && method.getParameterCount() == 0) {
+                ReflectionUtils.invokeMethod(method, query);
+            }
+            if ("asc".equals(sort.getOrder())) {
+                query.asc();
+            } else {
+                query.desc();
+            }
+        }
+    }
+}

+ 17 - 73
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableDeploymentController.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
 import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.editor.constants.ModelDataJsonConstants;
@@ -30,6 +31,9 @@ import org.hswebframework.web.workflow.service.BpmActivityService;
 import org.hswebframework.web.workflow.service.BpmProcessService;
 import org.hswebframework.web.workflow.service.BpmTaskService;
 import org.hswebframework.web.workflow.service.imp.AbstractFlowableService;
+import org.hswebframework.web.workflow.util.QueryUtils;
+import org.hswebframework.web.workflow.web.response.ActivityInfo;
+import org.hswebframework.web.workflow.web.response.ProcessDefinitionInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.util.StreamUtils;
@@ -63,9 +67,9 @@ public class FlowableDeploymentController extends AbstractFlowableService {
     private final static String MODEL_ID = "modelId";
 
     @Autowired
-    BpmTaskService bpmTaskService;
+    BpmTaskService     bpmTaskService;
     @Autowired
-    BpmProcessService bpmProcessService;
+    BpmProcessService  bpmProcessService;
     @Autowired
     BpmActivityService bpmActivityService;
 
@@ -75,51 +79,10 @@ public class FlowableDeploymentController extends AbstractFlowableService {
     @GetMapping
     @ApiOperation("查询流程定义列表")
     @Authorize(action = Permission.ACTION_QUERY)
-    public ResponseMessage<PagerResult<ProcessDefinition>> QueryProcessList(QueryParamEntity param) {
+    public ResponseMessage<PagerResult<ProcessDefinitionInfo>> queryProcessList(QueryParamEntity param) {
         ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
-        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)) {
-                        processDefinitionQuery.processDefinitionNameLike(stringValue);
-                    } else {
-                        processDefinitionQuery.processDefinitionName(stringValue);
-                    }
-                    break;
-                case "key":
-                    if (term.getTermType().equals(TermType.like)) {
-                        processDefinitionQuery.processDefinitionKeyLike(stringValue);
-                    } else {
-                        processDefinitionQuery.processDefinitionKey(stringValue);
-                    }
-                    break;
-                case "category":
-                    if (term.getTermType().equals(TermType.like)) {
-                        processDefinitionQuery.processDefinitionCategoryLike(stringValue);
-                    } else {
-                        processDefinitionQuery.processDefinitionCategory(stringValue);
-                    }
-                    break;
-                case "deploymentId":
-                    processDefinitionQuery.deploymentId(stringValue);
-                    break;
-            }
-        });
-        int total = (int) processDefinitionQuery.count();
-        param.rePaging(total);
-        if (total == 0) {
-            return ResponseMessage.ok(PagerResult.empty());
-        }
-        List<ProcessDefinition> models = processDefinitionQuery
-                .listPage(param.getPageIndex(), param.getPageSize() * (param.getPageIndex() + 1))
-                .stream()
-                .map(SimpleProcessDefinition::new)
-                .collect(Collectors.toList());
-
 
-        return ResponseMessage.ok(new PagerResult<>(total, models));
+        return ResponseMessage.ok(QueryUtils.doQuery(processDefinitionQuery, param, ProcessDefinitionInfo::of));
     }
 
     /**
@@ -129,7 +92,7 @@ public class FlowableDeploymentController extends AbstractFlowableService {
     @PostMapping(value = "/deploy")
     @ApiOperation("上传流程定义文件并部署流程")
     @Authorize(action = "deploy")
-    public ResponseMessage<Deployment> deploy(@RequestParam(value = "file") MultipartFile file) throws IOException {
+    public ResponseMessage<Deployment> deploy(@RequestPart(value = "file") MultipartFile file) throws IOException {
         // 获取上传的文件名
         String fileName = file.getOriginalFilename();
 
@@ -162,9 +125,9 @@ public class FlowableDeploymentController extends AbstractFlowableService {
     @GetMapping(value = "/{processDefinitionId}/resource/{resourceName}")
     @ApiOperation("读取流程资源")
     @Authorize(action = Permission.ACTION_QUERY)
+    @SneakyThrows
     public void readResource(@PathVariable String processDefinitionId
-            , @PathVariable String resourceName, HttpServletResponse response)
-            throws Exception {
+            , @PathVariable String resourceName, HttpServletResponse response) {
         ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery();
         ProcessDefinition pd = pdq.processDefinitionId(processDefinitionId).singleResult();
 
@@ -177,10 +140,6 @@ public class FlowableDeploymentController extends AbstractFlowableService {
 
     /***
      * 流程定义转换Model
-     * @param processDefinitionId
-     * @return
-     * @throws UnsupportedEncodingException
-     * @throws XMLStreamException
      */
     @PutMapping(value = "/convert-to-model/{processDefinitionId}")
     @ApiOperation("流程定义转换模型")
@@ -194,11 +153,13 @@ public class FlowableDeploymentController extends AbstractFlowableService {
         }
         InputStream bpmnStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),
                 processDefinition.getResourceName());
+
         XMLInputFactory xif = XMLInputFactory.newInstance();
         InputStreamReader in = new InputStreamReader(bpmnStream, "UTF-8");
         XMLStreamReader xtr = xif.createXMLStreamReader(in);
         BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr);
 
+
         BpmnJsonConverter converter = new BpmnJsonConverter();
         com.fasterxml.jackson.databind.node.ObjectNode modelNode = converter.convertToJson(bpmnModel);
         org.activiti.engine.repository.Model modelData = repositoryService.newModel();
@@ -226,44 +187,27 @@ public class FlowableDeploymentController extends AbstractFlowableService {
     @DeleteMapping(value = "/deployment/{deploymentId}")
     @ApiOperation("删除部署的流程")
     @Authorize(action = Permission.ACTION_DELETE)
-    public ResponseMessage<String> deleteProcessDefinition(
+    public ResponseMessage<Void> deleteProcessDefinition(
             @PathVariable("deploymentId") String deploymentId
             , @RequestParam(defaultValue = "false") boolean cascade) {
         repositoryService.deleteDeployment(deploymentId, cascade);
         return ResponseMessage.ok();
     }
 
-//    /**
-//     * 删除部署的流程,级联删除流程实例
-//     *
-//     * @param deploymentId 流程部署ID
-//     */
-//    @DeleteMapping(value = "/deploy")
-//    public ResponseMessage<String> deleteProcess(@RequestParam("deploymentId") String deploymentId) {
-//        repositoryService.deleteDeployment(deploymentId, true);
-//        return ResponseMessage.ok();
-//    }
 
     /**
      * 查看当前节点流程图
-     *
-     * @param processInstanceId
-     * @return 当前节点
      */
     @GetMapping("/{processInstanceId}/activity")
     @ApiOperation("查看当前流程活动节点流程图")
     @Authorize(action = Permission.ACTION_QUERY)
-    public ResponseMessage<Map<String, Object>> getProcessInstanceActivity(@PathVariable String processInstanceId) {
+    public ResponseMessage<ActivityInfo> getProcessInstanceActivity(@PathVariable String processInstanceId) {
         HistoricProcessInstance processInstance = bpmTaskService.selectHisProInst(processInstanceId);
         if (processInstance != null) {
-            JSONObject jsonObject = new JSONObject();
             ActivityImpl activity = bpmActivityService.getActivityByProcInstId(processInstance.getProcessDefinitionId(), processInstance.getId());
-            jsonObject.put("activity", activity);
-            jsonObject.put("procDefId", processInstance.getProcessDefinitionId());
-            return ResponseMessage.ok(jsonObject);
+            return ResponseMessage.ok(ActivityInfo.of(activity));
         } else {
             throw new NotFoundException("流程不存在");
-//            jsonObject.put("message", "获取流程图失败");
         }
     }
 
@@ -273,7 +217,7 @@ public class FlowableDeploymentController extends AbstractFlowableService {
     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());
+            ImageIO.write(ImageIO.read(inputStream), "png", response.getOutputStream());
         }
     }
 }

+ 98 - 35
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableCoreController.java

@@ -2,46 +2,50 @@ package org.hswebframework.web.workflow.web;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.activiti.engine.HistoryService;
 import org.activiti.engine.RepositoryService;
 import org.activiti.engine.RuntimeService;
-import org.activiti.engine.impl.pvm.process.ActivityImpl;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.history.HistoricTaskInstanceQuery;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.runtime.ProcessInstanceQuery;
 import org.activiti.engine.task.Task;
+import org.activiti.engine.task.TaskQuery;
 import org.hswebframework.web.NotFoundException;
 import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.Permission;
 import org.hswebframework.web.authorization.annotation.Authorize;
-import org.hswebframework.web.authorization.exception.UnAuthorizedException;
 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.organizational.authorization.PersonnelAuthentication;
-import org.hswebframework.web.service.form.DynamicFormOperationService;
 import org.hswebframework.web.workflow.service.ActivityConfigurationService;
-import org.hswebframework.web.workflow.service.BpmActivityService;
 import org.hswebframework.web.workflow.service.BpmProcessService;
 import org.hswebframework.web.workflow.service.BpmTaskService;
 import org.hswebframework.web.workflow.service.request.CompleteTaskRequest;
 import org.hswebframework.web.workflow.service.request.StartProcessRequest;
+import org.hswebframework.web.workflow.util.QueryUtils;
+import org.hswebframework.web.workflow.web.response.ProcessInfo;
+import org.hswebframework.web.workflow.web.response.TaskInfo;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
+
 
 /**
  * @author zhouhao
- * @date 2017/9/5.
+ * @since 3.0.0-RC
  */
 @RestController
-@RequestMapping("/workflow/process/")
-@Api(tags = "工作流-流程管理", description = "工作流流程管理")
-@Authorize(permission = "workflow-process", description = "工作流流程管理")
-public class FlowableCoreController {
+@RequestMapping("/workflow/process")
+@Api(tags = "工作流-流程管理", description = "工作流-流程管理")
+@Authorize(permission = "workflow-process", description = "工作流-流程管理")
+public class FlowableProcessController {
+
+    @Autowired
+    private RuntimeService runtimeService;
 
     @Autowired
     private BpmTaskService bpmTaskService;
@@ -55,6 +59,61 @@ public class FlowableCoreController {
     @Autowired
     private ActivityConfigurationService activityConfigurationService;
 
+    @Autowired
+    private TaskService taskService;
+
+    @Autowired
+    private HistoryService historyService;
+
+    @GetMapping("/doing")
+    @Authorize(action = Permission.ACTION_QUERY)
+    @ApiOperation("查询进行中的流程信息")
+    public ResponseMessage<PagerResult<ProcessInfo>> queryProcess(QueryParamEntity query) {
+        ProcessInstanceQuery instanceQuery = runtimeService.createProcessInstanceQuery();
+
+        PagerResult<ProcessInfo> result = QueryUtils.doQuery(instanceQuery, query, ProcessInfo::of, (term, q) -> {
+            if ("status".equals(term.getColumn())) {
+                switch (String.valueOf(term.getValue())) {
+                    case "active":
+                        q.active();
+                        break;
+                    case "suspended":
+                        q.suspended();
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+
+        return ResponseMessage.ok(result).exclude(query.getExcludes()).include(query.getIncludes());
+    }
+
+    @GetMapping("/tasks")
+    @Authorize(action = Permission.ACTION_QUERY)
+    @ApiOperation("查询当前用户的历史任务信息")
+    public ResponseMessage<PagerResult<TaskInfo>> getHistory(QueryParamEntity query, Authentication authentication) {
+        HistoricTaskInstanceQuery historyQuery = historyService.createHistoricTaskInstanceQuery();
+        historyQuery.taskAssignee(authentication.getUser().getId());
+
+        PagerResult<TaskInfo> result = QueryUtils.doQuery(historyQuery, query, TaskInfo::of, (term, q) -> {
+            if ("status".equals(term.getColumn())) {
+                switch (String.valueOf(term.getValue())) {
+                    case "finished":
+                        q.finished();
+                        break;
+                    case "processFinished":
+                        q.processFinished();
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+
+        return ResponseMessage.ok(result).exclude(query.getExcludes()).include(query.getIncludes());
+    }
+
     @PostMapping("start/key/{defineKey}")
     @ApiOperation("提交表单数据并根据流程定义key启动流程")
     @Authorize(merge = false)
@@ -86,9 +145,6 @@ public class FlowableCoreController {
         return ResponseMessage.ok(instance.getId());
     }
 
-    /**
-     * 提交表单数据并启动流程
-     */
     @PostMapping("start/id/{defId}")
     @ApiOperation("提交表单数据并根据流程定义ID启动流程")
     @Authorize(merge = false)
@@ -118,39 +174,45 @@ public class FlowableCoreController {
         return ResponseMessage.ok(instance.getId());
     }
 
-    /**
-     * 获取待签收的任务
-     */
+    @GetMapping("todo")
+    @ApiOperation("获取待办任务")
+    @Authorize(merge = false)
+    public ResponseMessage<PagerResult<TaskInfo>> getTodoLst(QueryParamEntity query, Authentication authentication) {
+        TaskQuery taskQuery = taskService.createTaskQuery();
+
+        taskQuery.taskAssignee(authentication.getUser().getId());
+
+        PagerResult<TaskInfo> result = QueryUtils.doQuery(taskQuery, query, TaskInfo::of);
+
+        return ResponseMessage.ok(result).exclude(query.getExcludes()).include(query.getIncludes());
+    }
+
     @GetMapping("claims")
-    @ApiOperation("获取所有待签收的任务")
+    @ApiOperation("获取待签收任务")
     @Authorize(merge = false)
-    public ResponseMessage<List<Task>> getMyTasks(Authentication authentication) {
+    public ResponseMessage<PagerResult<TaskInfo>> getClaims(QueryParamEntity query, Authentication authentication) {
+        TaskQuery taskQuery = taskService.createTaskQuery();
+
+        taskQuery.taskCandidateUser(authentication.getUser().getId());
 
-        List<Task> tasks = bpmTaskService.claimList(authentication.getUser().getId());
+        PagerResult<TaskInfo> result = QueryUtils.doQuery(taskQuery, query, TaskInfo::of);
 
-        return ResponseMessage.ok(tasks)
-                .include(Task.class, "id", "name", "createTime", "executionId"
-                        , "parentTaskId", "processInstanceId", "processDefinitionId", "taskDefinitionKey")
-                .exclude(Task.class, "definition", "mainFormData");
+        return ResponseMessage.ok(result);
     }
 
     @PutMapping("claim/{taskId}")
     @ApiOperation("签收任务")
+    @Authorize(merge = false)
     public ResponseMessage<Void> claim(@PathVariable String taskId, Authentication authentication) {
         bpmTaskService.claim(taskId, authentication.getUser().getId());
         return ResponseMessage.ok();
     }
 
-    /**
-     * 办理任务
-     *
-     * @param taskId 办理任务
-     * @return 办理
-     */
     @PutMapping("complete/{taskId}")
-    public ResponseMessage<Map<String, Object>> complete(@PathVariable String taskId,
-                                                         @RequestBody(required = false) Map<String, Object> formData,
-                                                         Authentication authentication) {
+    @Authorize(merge = false)
+    public ResponseMessage<Void> complete(@PathVariable String taskId,
+                                          @RequestBody(required = false) Map<String, Object> formData,
+                                          Authentication authentication) {
         // 办理
         bpmTaskService.complete(CompleteTaskRequest.builder()
                 .taskId(taskId)
@@ -160,4 +222,5 @@ public class FlowableCoreController {
                 .build());
         return ResponseMessage.ok();
     }
+
 }

+ 0 - 69
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableUtilsController.java

@@ -1,69 +0,0 @@
-package org.hswebframework.web.workflow.web;
-
-import io.swagger.annotations.Api;
-import org.activiti.engine.impl.pvm.process.ActivityImpl;
-import org.hswebframework.web.authorization.annotation.Authorize;
-import org.hswebframework.web.controller.message.ResponseMessage;
-import org.hswebframework.web.workflow.service.BpmActivityService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @Author wangwei
- * @Date 2017/9/4.
- */
-@RestController
-@RequestMapping("workflow/utils")
-@Api(tags = "工作流-节点配置", description = "工作流节点配置")
-@Authorize(permission = "workflow-utils", description = "节点配置")
-public class FlowableUtilsController {
-
-    @Autowired
-    BpmActivityService bpmActivityService;
-
-
-    /**
-     * 获取流程所有配置节点
-     *
-     * @param procDefId
-     * @return
-     */
-    @GetMapping("{procDefId}/acts")
-    public ResponseMessage<List<Map<String, Object>>> acts(@PathVariable String procDefId) {
-        List<Map<String, Object>> list = new ArrayList<>();
-        List<ActivityImpl> activities = bpmActivityService.getActivitiesById(procDefId, null);
-        for (ActivityImpl activity : activities) {
-            Map<String, Object> map = new HashMap<>();
-            if ("startEvent".equals(activity.getProperty("type"))) {
-                map.put("id", activity.getId());
-                map.put("name", "流程发起者");
-//                map.put("info", actDefService.selectSingle(single(ActDefEntity.actId, activity.getId())));
-            } else if ("userTask".equals(activity.getProperty("type"))) {
-                map.put("id", activity.getId());
-                map.put("name", activity.getProperty("name").toString());
-//                map.put("info", actDefService.selectSingle(single(ActDefEntity.actId, activity.getId())));
-            }
-            if (map.size() > 0) {
-                list.add(map);
-            }
-        }
-        return ResponseMessage.ok(list);
-    }
-
-    /**
-     * 给流程节点配置表单与人员矩阵
-     *
-     * @param actDefEntity
-     * @return
-     */
-//    @PostMapping("act")
-//    public ResponseMessage<String> setActClaimDef(@RequestBody ActDefEntity actDefEntity) {
-//        return ResponseMessage.ok(actDefService.saveOrUpdate(actDefEntity));
-//    }
-
-}

+ 14 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/diagram/ProcessDefinitionDiagramLayoutResource.java

@@ -0,0 +1,14 @@
+package org.hswebframework.web.workflow.web.diagram;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@RestController
+@RequestMapping("/workflow/service/")
+public class ProcessDefinitionDiagramLayoutResource extends org.activiti.rest.diagram.services.ProcessDefinitionDiagramLayoutResource {
+}

+ 14 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/diagram/ProcessInstanceDiagramLayoutResource.java

@@ -0,0 +1,14 @@
+package org.hswebframework.web.workflow.web.diagram;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@RestController
+@RequestMapping("/workflow/service/")
+public class ProcessInstanceDiagramLayoutResource extends org.activiti.rest.diagram.services.ProcessInstanceDiagramLayoutResource {
+
+}

+ 13 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/diagram/ProcessInstanceHighlightsResource.java

@@ -0,0 +1,13 @@
+package org.hswebframework.web.workflow.web.diagram;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@RestController
+@RequestMapping("/workflow/service/")
+public class ProcessInstanceHighlightsResource extends org.activiti.rest.diagram.services.ProcessInstanceHighlightsResource {
+}

+ 38 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/ActivityInfo.java

@@ -0,0 +1,38 @@
+package org.hswebframework.web.workflow.web.response;
+
+import lombok.Data;
+import org.activiti.bpmn.model.Activity;
+import org.activiti.engine.impl.pvm.process.ActivityImpl;
+import org.hswebframework.web.commons.bean.Bean;
+
+import java.util.Map;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Data
+public class ActivityInfo implements Bean {
+    private static final long serialVersionUID = -3273391092933844118L;
+    private String id;
+
+    private int x      = -1;
+    private int y      = -1;
+    private int width  = -1;
+    private int height = -1;
+
+    private String processDefinitionId;
+    private String processDefinitionKey;
+    private String processDefinitionName;
+
+    private Map<String, Object> properties;
+
+    public static ActivityInfo of(ActivityImpl activity) {
+        ActivityInfo info = new ActivityInfo();
+        info.copyFrom(activity);
+        info.setProcessDefinitionId(activity.getProcessDefinition().getId());
+        info.setProcessDefinitionKey(activity.getProcessDefinition().getKey());
+        info.setProcessDefinitionName(activity.getProcessDefinition().getName());
+        return info;
+    }
+}

+ 40 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/ProcessDefinitionInfo.java

@@ -0,0 +1,40 @@
+package org.hswebframework.web.workflow.web.response;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.hswebframework.web.commons.bean.Bean;
+
+/**
+ * @author zhouhao
+ */
+@Data
+public class ProcessDefinitionInfo implements Bean {
+
+    private static final long serialVersionUID = -7246626050183062980L;
+
+    private String  id;
+    private String  category;
+    private String  name;
+    private String  key;
+    private String  description;
+    private int     version;
+    private String  resourceName;
+    private String  deploymentId;
+    private String  diagramResourceName;
+    private boolean suspended;
+    private boolean hasStartFormKey;
+    private boolean hasGraphicalNotation;
+    private String  tenantId;
+
+    public static ProcessDefinitionInfo of(ProcessDefinition definition) {
+        ProcessDefinitionInfo info = new ProcessDefinitionInfo();
+        info.copyFrom(definition);
+
+        info.hasGraphicalNotation = definition.hasGraphicalNotation();
+        info.hasStartFormKey = definition.hasStartFormKey();
+        return info;
+    }
+
+}

+ 46 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/ProcessInfo.java

@@ -0,0 +1,46 @@
+package org.hswebframework.web.workflow.web.response;
+
+import lombok.Data;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.hswebframework.web.commons.bean.Bean;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Data
+public class ProcessInfo implements Bean {
+
+    private static final long serialVersionUID = 6903869441158752614L;
+
+    private String id;
+
+    private String processDefinitionId;
+
+    private String processDefinitionKey;
+
+    private String processDefinitionName;
+
+    private Integer processDefinitionVersion;
+
+    private String deploymentId;
+
+    private String activityId;
+
+    private String activityName;
+
+    private String processInstanceId;
+
+    private String businessKey;
+
+    private String parentId;
+
+    private boolean suspended;
+
+    public static ProcessInfo of(ProcessInstance processInstance) {
+        ProcessInfo info = new ProcessInfo();
+        info.copyFrom(processInstance);
+        info.suspended = processInstance.isSuspended();
+        return info;
+    }
+}

+ 44 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/TaskInfo.java

@@ -0,0 +1,44 @@
+package org.hswebframework.web.workflow.web.response;
+
+import lombok.Data;
+import org.hswebframework.web.commons.bean.Bean;
+
+import java.util.Date;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Data
+public class TaskInfo implements Bean {
+
+    private static final long serialVersionUID = 8648745689340116922L;
+    private String id;
+    private int    revision;
+    private String owner;
+    private String assignee;
+    private String initialAssignee;
+    private String parentTaskId;
+    private String name;
+    private String localizedName;
+    private String description;
+    private String localizedDescription;
+    private int    priority;
+    private Date   createTime;
+    private Date   dueDate;
+    private int    suspensionState;
+    private String category;
+    private String executionId;
+    private String processInstanceId;
+    private String processDefinitionId;
+    private String taskDefinitionKey;
+    private String formKey;
+    private String eventName;
+
+    public static TaskInfo of(org.activiti.engine.task.TaskInfo task) {
+        TaskInfo taskInfo = new TaskInfo();
+        taskInfo.copyFrom(task);
+
+        return taskInfo;
+    }
+}

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

@@ -2,6 +2,7 @@ package org.hswebframework.web.workflow.flowable
 
 import com.alibaba.fastjson.JSON
 import org.activiti.engine.RuntimeService
+import org.activiti.engine.TaskService
 import org.activiti.engine.impl.persistence.entity.ExecutionEntity
 import org.activiti.engine.runtime.ProcessInstance
 import org.hswebframework.web.authorization.AuthenticationInitializeService
@@ -49,6 +50,9 @@ class WorkFlowProcessTests extends Specification {
     @Autowired
     private RuntimeService runtimeService;
 
+    @Autowired
+    private TaskService taskService;
+
     void setup() {
         mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
     }