Browse Source

集成Activiti

xian 6 years ago
parent
commit
d2b5196238

+ 36 - 0
watero-rst-interface/src/main/java/com/iamberry/rst/faces/approval/ApprovalTaskService.java

@@ -0,0 +1,36 @@
+package com.iamberry.rst.faces.approval;
+
+import java.util.Map;
+
+/**
+ * 审批任务
+ * @author 献
+ * @company 深圳爱贝源科技有限公司
+ * @date 2018/9/25 16:02
+ * @tel 18271840547
+ * @website www.iamberry.com
+ */
+public interface ApprovalTaskService {
+
+    /**
+     * 提交审批申请
+     * @param  type   1:生成订单审批;2:提货申请
+     * @return key=pid,表示本次申请的id,需要保存; key=status,表示审批状态(0:没有审批人,1:还有审批人); key=users,数组,为系统用户登录名,如果多个需要为每个人都保存审批任务; key=taskId,审批任务的id
+     */
+    Map<String, Object> salesmanSubmitApply(int type);
+
+    /**
+     * 完成审批
+     * @param pid       提交审批申请时获取到的pid
+     * @param taskId    提交审批申请时获取到的taskId
+     * @return key=status 1:表示没有下一个审批人 0:表示还有下一个审批人,需要增加任务; key=users,数组,为系统用户登录名,如果多个需要为每个人都保存审批任务; key=taskId,审批任务的id
+     */
+    Map<String, Object> completeTask(String pid, String taskId);
+
+    /**
+     * 删除审核任务(当业务员撤销、审核驳回时需要调用此接口)
+     * @param pid       提交生产申请时获取到的pid
+     * @param reason    说明(eg:业务员撤销审核)不允许为空
+     */
+    void revokeTask(String pid, String reason);
+}

+ 111 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/approval/ApprovalTaskServiceImpl.java

@@ -0,0 +1,111 @@
+package com.iamberry.rst.service.approval;
+
+import com.iamberry.rst.faces.approval.ApprovalTaskService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 献
+ * @company 深圳爱贝源科技有限公司
+ * @date 2018/9/25 16:03
+ * @tel 18271840547
+ * @website www.iamberry.com
+ */
+@Service
+public class ApprovalTaskServiceImpl implements ApprovalTaskService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApprovalTaskServiceImpl.class);
+
+    @Autowired
+    private RuntimeService runtimeService;
+
+    @Autowired
+    private TaskService taskService;
+
+    private static final String GENERATION_APPROVAL_KEY = "GenerationApproval";
+
+    private static final String APPLICATION_FOR_DELIVERY_KEY = "ApplicationForDelivery";
+
+    private static final String SPLIT_ASSIGNEE_CHAR = "&";
+
+    @Override
+    public Map<String, Object> salesmanSubmitApply(int type) {
+        Map<String, Object> result = new HashMap<>(4);
+        result.put("status", 1);
+        // 使用流程定义的key启动流程实例
+        ProcessInstance pi = runtimeService.startProcessInstanceByKey(type == 1 ? GENERATION_APPROVAL_KEY : APPLICATION_FOR_DELIVERY_KEY);
+        // 因为第一个审批节点为用户自己,所以默认启动并通过第一个审批流程
+        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
+        if (task == null) {
+            result.put("status", 0);
+            result.put("key", pi.getId());
+            return result;
+        }
+        taskService.complete(task.getId());
+        // 寻找下一个审批人
+        Map<String, Object> approver = findTaskNextAssignee(pi.getId());
+        if (approver == null) {
+            result.put("status", 0);
+            result.put("key", pi.getId());
+            return result;
+        }
+        result.put("key", pi.getId());
+        result.put("users", approver.get("assignee"));
+        result.put("taskId", approver.get("taskId"));
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> completeTask(String pid, String taskId) {
+        Map<String, Object> result = new HashMap<>(3);
+        result.put("status", 0);
+        // 提交任务
+        taskService.complete(taskId);
+        // 是否存在下一个审批人
+        Map<String, Object> approver = findTaskNextAssignee(pid);
+        if (approver == null) {
+            result.put("status", 1);
+            return result;
+        }
+        result.put("users", approver.get("assignee"));
+        result.put("taskId", approver.get("taskId"));
+        return result;
+    }
+
+    @Override
+    public void revokeTask(String pid, String reason) {
+        runtimeService.deleteProcessInstance(pid, reason);
+    }
+
+    /**
+     * 寻找任务的下一个审批人
+     * @param pid 任务实例id
+     * @return 审批人,系统中用户的登录名
+     */
+    private Map<String, Object> findTaskNextAssignee(String pid) {
+        Map<String, Object> result = new HashMap<>(2);
+        // 搜索当前实例的待处理信息
+        Task nextTask = taskService.createTaskQuery().processInstanceId(pid).singleResult();
+        if (nextTask == null) {
+            return null;
+        }
+        String assignee = nextTask.getAssignee();
+        if (assignee.contains(SPLIT_ASSIGNEE_CHAR)) {
+            result.put("taskId", nextTask.getId());
+            result.put("assignee", assignee.split(SPLIT_ASSIGNEE_CHAR));
+            return  result;
+        }
+        result.put("taskId", nextTask.getId());
+        result.put("assignee", assignee);
+        return  result;
+    }
+}