Browse Source

重构工作流(7)

zhouhao 6 years ago
parent
commit
898b04ab03
15 changed files with 224 additions and 174 deletions
  1. 0 5
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ActivityConfigEntity.java
  2. 0 5
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ProcessDefineConfigEntity.java
  3. 8 11
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ProcessHistoryEntity.java
  4. 3 20
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/BpmTaskService.java
  5. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/WorkFlowFormService.java
  6. 20 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/BpmProcessServiceImpl.java
  7. 90 43
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/BpmTaskServiceImpl.java
  8. 11 9
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/WorkFlowFormServiceImpl.java
  9. 39 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/request/RejectTaskRequest.java
  10. 17 53
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableModelManagerController.java
  11. 13 11
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableProcessController.java
  12. 5 2
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/diagram/ProcessInstanceHighlightsResource.java
  13. 15 12
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/hsweb-starter.js
  14. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ActivityConfigMapper.xml
  15. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ProcessDefineConfigMapper.xml

+ 0 - 5
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ActivityConfigEntity.java

@@ -38,11 +38,6 @@ public class ActivityConfigEntity extends SimpleGenericEntity<String> {
      */
     private String formId;
 
-    /**
-     * 前端表单模版ID
-     */
-    private String formTemplateId;
-
     /**
      * 节点办理候选人维度,用于设置该环节的办理人,json格式,由CandidateDimensionParser解析
      */

+ 0 - 5
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ProcessDefineConfigEntity.java

@@ -32,11 +32,6 @@ public class ProcessDefineConfigEntity extends SimpleGenericEntity<String> {
     @NotBlank(groups = CreateGroup.class)
     private String formId;
 
-    /**
-     * 前端表单模版ID
-     */
-    private String formTemplateId;
-
     /**
      * 权限维度,用于控制不同人,可发起不同的流程
      */

+ 8 - 11
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ProcessHistoryEntity.java

@@ -6,6 +6,7 @@ import org.hswebframework.web.commons.entity.SimpleGenericEntity;
 
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -33,20 +34,9 @@ public class ProcessHistoryEntity extends SimpleGenericEntity<String> {
     @NotBlank(message = "[processInstanceId]不能为空")
     private String processInstanceId;
 
-    @NotBlank(message = "[taskId]不能为空")
-    private String taskId;
-
-    @NotBlank(message = "[taskDefineKey]不能为空")
-    private String taskDefineKey;
-
-    @NotBlank(message = "[taskName]不能为空")
-    private String taskName;
-
     @NotBlank(message = "[businessKey]不能为空")
     private String businessKey;
 
-    private Map<String, Object> data;
-
     @NotNull(message = "[createTime]不能为空")
     private Date createTime;
 
@@ -56,4 +46,11 @@ public class ProcessHistoryEntity extends SimpleGenericEntity<String> {
     @NotBlank(message = "[creatorName]不能为空")
     private String creatorName;
 
+    private Map<String, Object> data = new HashMap<>();
+
+    private String taskId;
+
+    private String taskDefineKey;
+
+    private String taskName;
 }

+ 3 - 20
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/BpmTaskService.java

@@ -4,6 +4,7 @@ import org.activiti.engine.history.HistoricProcessInstance;
 import org.activiti.engine.impl.pvm.process.ActivityImpl;
 import org.activiti.engine.task.Task;
 import org.hswebframework.web.workflow.service.request.CompleteTaskRequest;
+import org.hswebframework.web.workflow.service.request.RejectTaskRequest;
 
 import java.util.Collection;
 import java.util.List;
@@ -68,24 +69,6 @@ public interface BpmTaskService {
     void claim(String taskId, String userId);
 
 
-    /**
-     * 预留等待签收的任务
-     *
-     * @param userId 用户id
-     * @return 任务信息
-     * @throws Exception
-     */
-    List<Task> claimList(String userId);
-
-    /**
-     * 已签收待办理的任务
-     *
-     * @param userId 用户id
-     * @return 任务信息
-     * @throws Exception
-     */
-    List<Task> todoList(String userId);
-
     /**
      * 完成任务
      *
@@ -104,9 +87,9 @@ public interface BpmTaskService {
     /**
      * 驳回
      *
-     * @param taskId
+     * @param request
      */
-    void reject(String taskId);
+    void reject(RejectTaskRequest request);
 
     /**
      * 设置办理人

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/WorkFlowFormService.java

@@ -16,7 +16,7 @@ import java.util.List;
 public interface WorkFlowFormService {
     void saveProcessForm(ProcessInstance instance, SaveFormRequest request);
 
-    void saveTaskForm(Task task, SaveFormRequest request);
+    void saveTaskForm(ProcessInstance instance,Task task, SaveFormRequest request);
 
     <T> PagerResult<T> selectProcessForm(String processDefineId, QueryParamEntity queryParam);
 

+ 20 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/BpmProcessServiceImpl.java

@@ -1,5 +1,6 @@
 package org.hswebframework.web.workflow.service.imp;
 
+import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.runtime.Job;
 import org.activiti.engine.runtime.ProcessInstance;
@@ -7,8 +8,10 @@ import org.activiti.engine.task.Task;
 import org.hswebframework.utils.StringUtils;
 import org.hswebframework.web.NotFoundException;
 import org.hswebframework.web.id.IDGenerator;
+import org.hswebframework.web.workflow.dao.entity.ProcessHistoryEntity;
 import org.hswebframework.web.workflow.service.BpmProcessService;
 import org.hswebframework.web.workflow.service.BpmTaskService;
+import org.hswebframework.web.workflow.service.ProcessHistoryService;
 import org.hswebframework.web.workflow.service.WorkFlowFormService;
 import org.hswebframework.web.workflow.service.request.SaveFormRequest;
 import org.hswebframework.web.workflow.service.request.StartProcessRequest;
@@ -37,6 +40,9 @@ public class BpmProcessServiceImpl extends AbstractFlowableService implements Bp
     @Autowired
     private WorkFlowFormService workFlowFormService;
 
+    @Autowired
+    private ProcessHistoryService processHistoryService;
+
     @Override
     public List<ProcessDefinition> getAllProcessDefinition() {
         return repositoryService.createProcessDefinitionQuery().latestVersion().active().list();
@@ -113,6 +119,20 @@ public class BpmProcessServiceImpl extends AbstractFlowableService implements Bp
                     .userName(request.getCreatorName())
                     .formData(request.getFormData())
                     .build());
+
+            ProcessHistoryEntity history = ProcessHistoryEntity.builder()
+                    .type("start")
+                    .typeText("启动流程")
+                    .businessKey(businessKey)
+                    .creatorId(request.getCreatorId())
+                    .creatorName(request.getCreatorName())
+                    .processInstanceId(processInstance.getProcessInstanceId())
+                    .processDefineId(processInstance.getProcessDefinitionId())
+                    .build();
+
+            processHistoryService.insert(history);
+
+
         } finally {
             identityService.setAuthenticatedUserId(null);
         }

+ 90 - 43
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/BpmTaskServiceImpl.java

@@ -1,9 +1,12 @@
 package org.hswebframework.web.workflow.service.imp;
 
+import lombok.SneakyThrows;
+import org.activiti.engine.history.HistoricActivityInstance;
 import org.activiti.engine.history.HistoricProcessInstance;
 import org.activiti.engine.history.HistoricTaskInstance;
 import org.activiti.engine.impl.RepositoryServiceImpl;
 import org.activiti.engine.impl.TaskServiceImpl;
+import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
 import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
 import org.activiti.engine.impl.pvm.PvmActivity;
 import org.activiti.engine.impl.pvm.PvmTransition;
@@ -13,11 +16,14 @@ import org.activiti.engine.impl.pvm.process.TransitionImpl;
 import org.activiti.engine.runtime.Execution;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
+import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
 import org.hswebframework.utils.StringUtils;
 import org.hswebframework.web.BusinessException;
 import org.hswebframework.web.NotFoundException;
 import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.User;
+import org.hswebframework.web.workflow.dao.entity.ProcessHistoryEntity;
+import org.hswebframework.web.workflow.service.ProcessHistoryService;
 import org.hswebframework.web.workflow.service.config.ProcessConfigurationService;
 import org.hswebframework.web.workflow.service.BpmActivityService;
 import org.hswebframework.web.workflow.service.BpmTaskService;
@@ -25,6 +31,7 @@ import org.hswebframework.web.workflow.flowable.utils.JumpTaskCmd;
 import org.hswebframework.web.workflow.service.WorkFlowFormService;
 import org.hswebframework.web.workflow.service.config.CandidateInfo;
 import org.hswebframework.web.workflow.service.request.CompleteTaskRequest;
+import org.hswebframework.web.workflow.service.request.RejectTaskRequest;
 import org.hswebframework.web.workflow.service.request.SaveFormRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,6 +61,12 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
     @Autowired
     private WorkFlowFormService workFlowFormService;
 
+    @Autowired
+    private ProcessHistoryService processHistoryService;
+
+    @Autowired
+    private SqlExecutor sqlExecutor;
+
     @Override
     public List<Task> selectNowTask(String procInstId) {
         return taskService.createTaskQuery()
@@ -80,36 +93,14 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
                 .singleResult();
         if (task == null) {
             throw new NotFoundException("无法签收此任务");
-            //return; // fix null point
         }
         if (!StringUtils.isNullOrEmpty(task.getAssignee())) {
-            logger.warn("该任务已被签收!");
+            throw new BusinessException("任务已签售");
         } else {
             taskService.claim(taskId, userId);
         }
     }
 
-
-    @Override
-    public List<Task> claimList(String userId) {
-        // 等待签收的任务
-        return taskService.createTaskQuery()
-                .taskCandidateUser(userId)
-                .includeProcessVariables()
-                .active()
-                .list();
-    }
-
-    @Override
-    public List<Task> todoList(String userId) {
-        // 已经签收的任务
-        return taskService.createTaskQuery()
-                .taskAssignee(userId)
-                .includeProcessVariables()
-                .active()
-                .list();
-    }
-
     @Override
     public void complete(CompleteTaskRequest request) {
         request.tryValidate();
@@ -135,8 +126,12 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
             transientVariables.putAll(request.getVariables());
         }
 
+        ProcessInstance instance = runtimeService.createProcessInstanceQuery()
+                .processInstanceId(task.getProcessInstanceId())
+                .singleResult();
+
         //保存表单数据
-        workFlowFormService.saveTaskForm(task, SaveFormRequest.builder()
+        workFlowFormService.saveTaskForm(instance, task, SaveFormRequest.builder()
                 .userName(request.getCompleteUserName())
                 .userId(request.getCompleteUserId())
                 .formData(request.getFormData())
@@ -162,21 +157,42 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
                 setCandidate(request.getCompleteUserId(), next);
             }
         }
+
+        ProcessHistoryEntity history = ProcessHistoryEntity.builder()
+                .businessKey(instance.getBusinessKey())
+                .type("complete")
+                .typeText("完成任务")
+                .creatorId(request.getCompleteUserId())
+                .creatorName(request.getCompleteUserName())
+                .processDefineId(instance.getProcessDefinitionId())
+                .processInstanceId(instance.getProcessInstanceId())
+                .taskId(task.getId())
+                .taskDefineKey(task.getTaskDefinitionKey())
+                .taskName(task.getName())
+                .build();
+
+        processHistoryService.insert(history);
     }
 
 
     @Override
-    public void reject(String taskId) {
-        // 先判定是否存在历史环节
-        String oldTaskId = selectVariableLocalByTaskId(taskId, "oldTaskId").toString();
-        HistoricTaskInstance taskInstance = historyService.createHistoricTaskInstanceQuery().taskId(oldTaskId).singleResult();
-        if (taskInstance == null) {
-            throw new NotFoundException("历史任务环节不存在,taskId:" + oldTaskId);
-        }
+    @SneakyThrows
+    public void reject(RejectTaskRequest request) {
+        request.tryValidate();
+        String activityId = request.getActivityId();
 
-        Task task = selectTaskByTaskId(taskId);
+        //从任务历史中查找
+        HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery()
+                .taskDefinitionKey(activityId)
+                .processInstanceId(request.getProcessInstanceId())
+                .singleResult();
+        if (task == null) {
+            throw new NotFoundException("历史任务环节不存在");
+        }
 
-        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
+        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
+                .processInstanceId(task.getProcessInstanceId())
+                .singleResult();
         if (processInstance == null) {
             throw new NotFoundException("流程已经结束");
         }
@@ -185,25 +201,22 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
 
         ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(task.getProcessDefinitionId());
         if (definition == null) {
-            throw new NotFoundException("流程定义未找到");
+            throw new BusinessException("流程定义未找到");
         }
 
         ActivityExecution execution = (ActivityExecution) runtimeService.createExecutionQuery()
                 .executionId(task.getExecutionId()).singleResult();
         // 是否并行节点
         if (execution.isConcurrent()) {
-            throw new NotFoundException("并行节点不允许驳回,taskId:" + task.getId());
+            throw new BusinessException("并行节点不允许驳回");
         }
 
         // 是否存在定时任务
         long num = managementService.createJobQuery().executionId(task.getExecutionId()).count();
         if (num > 0) {
-            throw new NotFoundException("当前环节不允许驳回");
+            throw new BusinessException("当前环节不允许驳回");
         }
 
-        // 驳回
-
-
         // 取得上一步活动
         ActivityImpl currActivity = definition.findActivity(task.getTaskDefinitionKey());
         List<PvmTransition> nextTransitionList = currActivity.getIncomingTransitions();
@@ -225,17 +238,51 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
         // 完成任务
         List<Task> tasks = taskService.createTaskQuery()
                 .processInstanceId(processInstance.getId())
-                .taskDefinitionKey(task.getTaskDefinitionKey()).list();
+                .taskDefinitionKey(task.getTaskDefinitionKey())
+                .list();
+
         for (Task t : tasks) {
             taskService.complete(t.getId(), variables);
             historyService.deleteHistoricTaskInstance(t.getId());
+            //删除连线
+            List<HistoricActivityInstance> instance = historyService.createHistoricActivityInstanceQuery()
+                    .processInstanceId(processInstance.getProcessInstanceId())
+                    .activityId(t.getTaskDefinitionKey())
+                    .list();
+            for (HistoricActivityInstance historicActivityInstance : instance) {
+                sqlExecutor.delete("delete from act_hi_actinst where id_= #{id}", historicActivityInstance);
+            }
         }
-        // 恢复方向
+       // 恢复方向
         for (TransitionImpl transitionImpl : newTransitions) {
             currActivity.getOutgoingTransitions().remove(transitionImpl);
         }
         pvmTransitionList.addAll(oriPvmTransitionList);
 
+        //重新设置候选人
+        List<Task> nowTasks = selectNowTask(processInstance.getProcessInstanceId());
+        Task tmp = null;
+        for (Task nowTask : nowTasks) {
+            setCandidate(request.getRejectUserId(), nowTask);
+            tmp = nowTask;
+        }
+
+        ProcessHistoryEntity history = ProcessHistoryEntity.builder()
+                .businessKey(processInstance.getBusinessKey())
+                .type("reject")
+                .typeText("驳回")
+                .creatorId(request.getRejectUserId())
+                .creatorName(request.getRejectUserName())
+                .processDefineId(processInstance.getProcessDefinitionId())
+                .processInstanceId(processInstance.getProcessInstanceId())
+                .taskId(tmp != null ? tmp.getId() : null)
+                .taskDefineKey(tmp != null ? tmp.getTaskDefinitionKey() : null)
+                .taskName(tmp != null ? tmp.getName() : null)
+                .data(request.getData())
+                .build();
+
+        historyService.deleteHistoricTaskInstance(task.getId());
+        processHistoryService.insert(history);
     }
 
     public Task jumpTask(Task task, String activityId) {
@@ -272,8 +319,8 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
     }
 
     @Override
-    public Object selectVariableLocalByTaskId(String taskId, String variableName) {
-        return taskService.getVariableLocal(taskId, variableName);
+    public String selectVariableLocalByTaskId(String taskId, String variableName) {
+        return (String) taskService.getVariableLocal(taskId, variableName);
     }
 
     @Override

+ 11 - 9
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/WorkFlowFormServiceImpl.java

@@ -94,7 +94,7 @@ public class WorkFlowFormServiceImpl extends AbstractFlowableService implements
     }
 
     @Override
-    public void saveTaskForm(Task task, SaveFormRequest request) {
+    public void saveTaskForm(ProcessInstance instance, Task task, SaveFormRequest request) {
         request.tryValidate();
 
         ActivityConfigEntity entity = activityConfigService.selectByProcessDefineIdAndActivityId(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
@@ -105,6 +105,7 @@ public class WorkFlowFormServiceImpl extends AbstractFlowableService implements
 
         Map<String, Object> formData = request.getFormData();
 
+        acceptStartProcessFormData(instance, formData);
         acceptTaskFormData(task, formData);
 
         dynamicFormOperationService.saveOrUpdate(entity.getFormId(), formData);
@@ -114,11 +115,6 @@ public class WorkFlowFormServiceImpl extends AbstractFlowableService implements
     protected void acceptTaskFormData(Task task,
                                       Map<String, Object> formData) {
 
-        ProcessInstance instance = runtimeService.createProcessInstanceQuery()
-                .processInstanceId(task.getProcessInstanceId())
-                .singleResult();
-
-        acceptStartProcessFormData(instance, formData);
 
         formData.put("processTaskId", task.getId());
         formData.put("processTaskDefineKey", task.getTaskDefinitionKey());
@@ -127,10 +123,16 @@ public class WorkFlowFormServiceImpl extends AbstractFlowableService implements
     }
 
     protected void acceptStartProcessFormData(ProcessInstance instance,
-                                              Map<String, Object> formData) {
-
-        String processDefinitionName = ((ExecutionEntity) instance).getProcessDefinition().getName();
 
+                                              Map<String, Object> formData) {
+        String processDefinitionName;
+        try {
+            processDefinitionName = ((ExecutionEntity) instance).getProcessDefinition().getName();
+        } catch (NullPointerException e) {
+            processDefinitionName = repositoryService.createProcessDefinitionQuery()
+                    .processDefinitionId(instance.getProcessDefinitionId())
+                    .singleResult().getName();
+        }
         formData.put("id", instance.getBusinessKey());
         formData.put("processDefineId", instance.getProcessDefinitionId());
         formData.put("processDefineKey", instance.getProcessDefinitionKey());

+ 39 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/request/RejectTaskRequest.java

@@ -0,0 +1,39 @@
+package org.hswebframework.web.workflow.service.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotBlank;
+import org.hswebframework.web.commons.bean.Bean;
+import org.hswebframework.web.commons.bean.ValidateBean;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RejectTaskRequest implements ValidateBean {
+    private static final long serialVersionUID = 7625759475416169067L;
+
+    @NotBlank(message = "[rejectUserId]不能为空")
+    private String rejectUserId;
+
+    @NotBlank(message = "[rejectUserName]不能为空")
+    private String rejectUserName;
+
+    @NotBlank(message = "[processInstanceId]不能为空")
+    private String processInstanceId;
+
+    @NotBlank(message = "[activityId]不能为空")
+    private String activityId;
+
+    //自定义数据,将会记录到流程历史记录里,比如回退原因等
+    private Map<String, Object> data = new HashMap<>();
+}

+ 17 - 53
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableModelManagerController.java

@@ -13,6 +13,7 @@ import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.editor.language.json.converter.BpmnJsonConverter;
 import org.activiti.engine.RepositoryService;
+import org.activiti.engine.impl.persistence.entity.ModelEntity;
 import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.repository.Model;
 import org.activiti.engine.repository.ModelQuery;
@@ -28,9 +29,11 @@ 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.bean.FastBeanCopier;
 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.util.QueryUtils;
 import org.hswebframework.web.workflow.web.request.ModelCreateRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -66,54 +69,14 @@ public class FlowableModelManagerController {
     @ApiOperation("获取模型列表")
     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());
-                    }
-                    break;
-                default:
-                    break;
-            }
-        });
-        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");
+        return ResponseMessage.ok(
+                QueryUtils.doQuery(modelQuery, param,
+                        model -> FastBeanCopier.copy(model, new ModelEntity()),
+                        (term, modelQuery1) -> {
+                            if ("latestVersion".equals(term.getColumn())) {
+                                modelQuery1.latestVersion();
+                            }
+                        }));
     }
 
     @PostMapping
@@ -213,13 +176,14 @@ public class FlowableModelManagerController {
             response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
 
             /*创建输入流*/
-            ByteArrayInputStream in = new ByteArrayInputStream(exportBytes);
-            IOUtils.copy(in, response.getOutputStream());
+            try (ByteArrayInputStream in = new ByteArrayInputStream(exportBytes)) {
+                IOUtils.copy(in, response.getOutputStream());
+                response.flushBuffer();
+                in.close();
+            }
 
-            response.flushBuffer();
-            in.close();
         } catch (Exception e) {
-            log.error("导出model的xml文件失败:modelId={}, dimension={}", modelId, type, e);
+            log.error("导出model的xml文件失败:modelId={}, type={}", modelId, type, e);
         }
     }
 

+ 13 - 11
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableProcessController.java

@@ -35,6 +35,7 @@ import org.hswebframework.web.workflow.service.config.ProcessConfigurationServic
 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.RejectTaskRequest;
 import org.hswebframework.web.workflow.service.request.StartProcessRequest;
 import org.hswebframework.web.workflow.util.QueryUtils;
 import org.hswebframework.web.workflow.web.response.CandidateDetail;
@@ -313,19 +314,20 @@ public class FlowableProcessController {
         return ResponseMessage.ok();
     }
 
-    @PutMapping("/reject/{taskId}")
+    @PutMapping("/reject/{processInstanceId}/{activityId}")
     @Authorize(merge = false)
     @ApiOperation("驳回")
-    public ResponseMessage<Void> reject(@PathVariable String taskId,
-                                          @RequestBody(required = false) Map<String, Object> formData,
-                                          Authentication authentication) {
-//        bpmTaskService.reject();
-        // 办理
-        bpmTaskService.complete(CompleteTaskRequest.builder()
-                .taskId(taskId)
-                .completeUserId(authentication.getUser().getId())
-                .completeUserName(authentication.getUser().getName())
-                .formData(formData)
+    public ResponseMessage<Void> reject(@PathVariable String processInstanceId,
+                                        @PathVariable String activityId,
+                                        @RequestBody Map<String, Object> data,
+                                        Authentication authentication) {
+        // 驳回
+        bpmTaskService.reject(RejectTaskRequest.builder()
+                .processInstanceId(processInstanceId)
+                .activityId(activityId)
+                .rejectUserId(authentication.getUser().getId())
+                .rejectUserName(authentication.getUser().getName())
+                .data(data)
                 .build());
         return ResponseMessage.ok();
     }

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

@@ -60,8 +60,11 @@ public class ProcessInstanceHighlightsResource {
         JSONArray activitiesArray = new JSONArray();
         JSONArray flowsArray = new JSONArray();
 
-        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
-        ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processInstance.getProcessDefinitionId());
+        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
+                .processInstanceId(processInstanceId)
+                .singleResult();
+        ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService
+                .getProcessDefinition(processInstance.getProcessDefinitionId());
 
         responseJSON.put("processDefinitionId", processInstance.getProcessDefinitionId());
 

+ 15 - 12
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/hsweb-starter.js

@@ -26,8 +26,8 @@ function install(context) {
         .addColumn().name("proc_def_key").alias("processDefineKey").comment("模板定义KEY").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("proc_def_id").alias("processDefineId").comment("模板定义ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("form_id").alias("formId").comment("表单ID").length(32).jdbcType(java.sql.JDBCType.VARCHAR).commit()
-        .addColumn().name("template_id").alias("formTemplateId").length(32).comment("前端模板配置").jdbcType(java.sql.JDBCType.VARCHAR).commit()
         .addColumn().name("permission_dimension").alias("permissionDimension").comment("启动权限配置").jdbcType(java.sql.JDBCType.CLOB).length(32).commit()
+        .addColumn().name("properties").alias("properties").comment("其他配置").jdbcType(java.sql.JDBCType.CLOB).commit()
         .addColumn().name("create_time").alias("createTime").comment("创建时间").datetime().commit()
         .addColumn().name("update_time").alias("updateTime").comment("修改时间").datetime().commit()
         .addColumn().name("status").alias("status").comment("状态").jdbcType(java.sql.JDBCType.TINYINT).commit()
@@ -40,26 +40,29 @@ function install(context) {
         .addColumn().name("proc_def_id").alias("processDefineId").comment("模板定义ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("act_id").alias("activityId").comment("元图ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("form_id").alias("formId").comment("表单ID").length(32).jdbcType(java.sql.JDBCType.VARCHAR).commit()
-        .addColumn().name("template_id").alias("formTemplateId").length(32).comment("前端模板配置").jdbcType(java.sql.JDBCType.VARCHAR).commit()
         .addColumn().name("candidate_dimension").alias("candidateDimension").comment("候选人维度").jdbcType(java.sql.JDBCType.CLOB).length(32).commit()
         .addColumn().name("create_time").alias("createTime").comment("创建时间").datetime().commit()
         .addColumn().name("update_time").alias("updateTime").comment("修改时间").datetime().commit()
         .addColumn().name("status").alias("status").comment("状态").jdbcType(java.sql.JDBCType.TINYINT).commit()
+        .addColumn().name("properties").alias("properties").comment("其他配置").jdbcType(java.sql.JDBCType.CLOB).commit()
         .comment("工作流环节自定义配置")
         .commit();
 
     database.createOrAlter("s_wf_proc_his")
         .addColumn().name("u_id").alias("id").comment("ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).primaryKey().commit()
-        .addColumn().name("proc_def_key").alias("processDefineKey").comment("模板定义KEY").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
-        .addColumn().name("proc_def_id").alias("processDefineId").comment("模板定义ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
-        .addColumn().name("act_id").alias("activityId").comment("元图ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
-        .addColumn().name("form_id").alias("formId").comment("表单ID").length(32).jdbcType(java.sql.JDBCType.VARCHAR).commit()
-        .addColumn().name("template_id").alias("formTemplateId").length(32).comment("前端模板配置").jdbcType(java.sql.JDBCType.VARCHAR).commit()
-        .addColumn().name("candidate_dimension").alias("candidateDimension").comment("候选人维度").jdbcType(java.sql.JDBCType.CLOB).length(32).commit()
-        .addColumn().name("create_time").alias("createTime").comment("创建时间").datetime().commit()
-        .addColumn().name("update_time").alias("updateTime").comment("修改时间").datetime().commit()
-        .addColumn().name("status").alias("status").comment("状态").jdbcType(java.sql.JDBCType.TINYINT).commit()
-        .comment("工作流环节自定义配置")
+        .addColumn().name("proc_ins_id").alias("processInstanceId").comment("流程实例ID").notNull().jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
+        .addColumn().name("proc_def_id").alias("processDefineId").comment("模板定义ID").notNull().jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
+        .addColumn().name("type").alias("type").comment("类型").notNull().jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
+        .addColumn().name("type_text").alias("typeText").comment("类型说明").notNull().length(128).jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("task_id").alias("taskId").length(32).comment("任务ID").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("task_name").alias("taskName").length(32).comment("任务名称").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("task_def_key").alias("taskDefineKey").length(64).comment("任务定义KEY").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("biz_key").alias("businessKey").length(32).comment("业务主键").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("data").alias("data").comment("相关数据").jdbcType(java.sql.JDBCType.CLOB).commit()
+        .addColumn().name("create_time").alias("createTime").notNull().comment("创建时间").datetime().commit()
+        .addColumn().name("creator_id").alias("creatorId").length(32).notNull().comment("创建人ID").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .addColumn().name("creator_name").alias("creatorName").length(32).notNull().comment("创建人姓名").jdbcType(java.sql.JDBCType.VARCHAR).commit()
+        .comment("工作流流程历史")
         .commit();
 }
 

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ActivityConfigMapper.xml

@@ -9,8 +9,8 @@
         <result property="processDefineKey" column="proc_def_key" javaType="String" jdbcType="VARCHAR"/>
         <result property="processDefineId" column="proc_def_id" javaType="String" jdbcType="VARCHAR"/>
         <result property="formId" column="form_id" javaType="String" jdbcType="VARCHAR"/>
-        <result property="formTemplateId" column="template_id" javaType="String" jdbcType="VARCHAR"/>
         <result property="candidateDimension" column="candidate_dimension" javaType="String" jdbcType="CLOB"/>
+        <result property="properties" column="properties" javaType="java.util.Map" jdbcType="CLOB"/>
 
         <result property="createTime" column="create_time" javaType="date" jdbcType="TIMESTAMP"/>
         <result property="updateTime" column="update_time" javaType="date" jdbcType="TIMESTAMP"/>

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ProcessDefineConfigMapper.xml

@@ -8,8 +8,8 @@
         <result property="processDefineKey" column="proc_def_key" javaType="String" jdbcType="VARCHAR"/>
         <result property="processDefineId" column="proc_def_id" javaType="String" jdbcType="VARCHAR"/>
         <result property="formId" column="form_id" javaType="String" jdbcType="VARCHAR"/>
-        <result property="formTemplateId" column="template_id" javaType="String" jdbcType="VARCHAR"/>
         <result property="permissionDimension" column="permission_dimension" javaType="String" jdbcType="CLOB"/>
+        <result property="properties" column="properties" javaType="java.util.Map" jdbcType="CLOB"/>
 
         <result property="createTime" column="create_time" javaType="date" jdbcType="TIMESTAMP"/>
         <result property="updateTime" column="update_time" javaType="date" jdbcType="TIMESTAMP"/>