From 5243873983f80615b575486a95122c029e409f3a Mon Sep 17 00:00:00 2001
From: pengqiang <1067496116@qq.com>
Date: Tue, 9 Aug 2022 15:58:39 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=9A=E7=AD=BE=E5=8A=9F=E8=83=BD=E5=BC=80?=
 =?UTF-8?q?=E5=8F=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/backend/ProjectController.java | 17 ++++
 .../work/service/ActListenerService.java      | 26 +----
 .../work/service/ActTaskDefService.java       | 44 +++++++++
 .../palmte/work/service/ProjectService.java   | 12 +++
 .../java/cn/palmte/work/utils/ActUtil.java    | 16 ++++
 .../templates/admin/project_approve.ftl       | 94 +++++++++++++++++++
 6 files changed, 187 insertions(+), 22 deletions(-)

diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
index 12d3f2e..b9bd648 100644
--- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
+++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
@@ -4,6 +4,7 @@ import cn.palmte.work.bean.*;
 import cn.palmte.work.model.*;
 import cn.palmte.work.pojo.ActHisTask;
 import cn.palmte.work.service.*;
+import cn.palmte.work.utils.ActUtil;
 import cn.palmte.work.utils.FreeMarkerUtil;
 import cn.palmte.work.utils.InterfaceUtil;
 import cn.palmte.work.utils.Utils;
@@ -14,6 +15,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.activiti.engine.HistoryService;
 import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.task.Task;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -81,6 +83,8 @@ public class ProjectController extends BaseController {
     @Autowired
     private ProjectRepository projectRepository;
     @Autowired
+    private ActUtil actUtil;
+    @Autowired
     private NumSeqService numSeqService;
 
     /**
@@ -551,6 +555,10 @@ public class ProjectController extends BaseController {
             model.put("taskRecords", list);
         }
 
+        //当前审批任务
+        Task currentTask = actUtil.getCurrentTask(project.getId());
+        model.put("currentTaskName", currentTask==null ? "" : currentTask.getName());
+
         return "admin/project_approve";
     }
 
@@ -564,6 +572,15 @@ public class ProjectController extends BaseController {
     }
 
 
+    /**
+     * 预算审批 跳到执行董事审批任务
+     */
+    @ResponseBody
+    @RequestMapping("/skipTask/{projectId}/{approvetype}")
+    public ResponseMsg skipTask(@PathVariable int projectId, @PathVariable int approvetype) {
+        return projectService.skipTask(projectId, approvetype);
+    }
+
     /**
      * 查看审核流程
      */
diff --git a/src/main/java/cn/palmte/work/service/ActListenerService.java b/src/main/java/cn/palmte/work/service/ActListenerService.java
index 7ebe017..5a9670d 100644
--- a/src/main/java/cn/palmte/work/service/ActListenerService.java
+++ b/src/main/java/cn/palmte/work/service/ActListenerService.java
@@ -50,38 +50,20 @@ public class ActListenerService {
     public void create(DelegateTask delegateTask) throws Exception {
         String procInsId = delegateTask.getProcessInstanceId();
         logger.info("--节点创建后监听--  procInsId:{},  {}", procInsId, delegateTask);
+        logger.info("**** rwcjjt【{}】任务创建监听 procInsId:{} **** ", delegateTask, procInsId);
 
         String procDefId = delegateTask.getProcessDefinitionId();
         String taskDefKey = delegateTask.getTaskDefinitionKey();
         List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
+        logger.info("**** rwcjjt 任务创建监听 查询候选人 procInsId:{},任务名称:{},候选人:{} **** ", procInsId, delegateTask.getName(), candidateUsers);
 
         ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
-        logger.info("addCandidateUsers : {}, taskName:{}, hasProcIns:{}", candidateUsers, delegateTask.getName(), processInstance != null);
-
         updateProjectApprover(candidateUsers, processInstance, procDefId, taskDefKey);
 
         delegateTask.addCandidateUsers(candidateUsers);
     }
 
 
-    /**
-     * 多实例任务查询办理人
-     *
-     * @param delegateExecution
-     * @throws Exception
-     */
-    public List<String> getMultiCandidateUsers(DelegateExecution delegateExecution) throws Exception {
-        logger.info("--多实例任务查询办理人-- eventName:{}, {}", delegateExecution.getEventName(), delegateExecution);
-        String procInsId = delegateExecution.getProcessInstanceId();
-        String procDefId = delegateExecution.getProcessDefinitionId();
-        String taskDefKey = delegateExecution.getCurrentActivityId();
-
-        List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
-        logger.info("--getMultiCandidateUsers-- {}", candidateUsers);
-        return candidateUsers;
-    }
-
-
     /**
      * 更新项目审批人 四算业务需要
      *
@@ -90,7 +72,6 @@ public class ActListenerService {
      */
     private void updateProjectApprover(List<String> candidateUsers, ProcessInstance processInstance, String procDefId, String taskDefKey) {
         String businessKey = processInstance.getBusinessKey();
-        logger.info("businessKey : {}", businessKey);
         ActTaskDef actTaskDef = actTaskDefService.findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey);
 
         try {
@@ -106,7 +87,8 @@ public class ActListenerService {
                     }
                 }
             }
-
+            logger.info("**** rwcjjt 任务创建监听 更新审批人 procInsId:{}, projectId:{}, adminId:{} **** ",
+                    processInstance.getProcessInstanceId(), businessKey, adminId);
             projectInstanceService.updateApprover(Integer.parseInt(businessKey), adminId);
         } catch (Exception e) {
             logger.error("", e);
diff --git a/src/main/java/cn/palmte/work/service/ActTaskDefService.java b/src/main/java/cn/palmte/work/service/ActTaskDefService.java
index e69b425..f0595c1 100644
--- a/src/main/java/cn/palmte/work/service/ActTaskDefService.java
+++ b/src/main/java/cn/palmte/work/service/ActTaskDefService.java
@@ -96,6 +96,45 @@ public class ActTaskDefService {
         }
     }
 
+    /**
+     * 预算跳过剩下审批任务直接到执行董事节点
+     * @param procInsId
+     */
+    public void skipTaskByProcInsId(String procInsId) {
+        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
+        if (ActConstant.PROCESS_DEFKEY_BUDGET.equals(processInstance.getProcessDefinitionKey())) {
+            throw new RuntimeException("只有预算审批流程才能执行会签");
+        }
+
+        //完成当前任务
+        Task task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult();
+        if ("执行董事".equals(task.getName())) {
+            throw new RuntimeException("当前状态不能用会签功能,请使用审批功能。");
+        }
+        completeTask(task.getId(), procInsId, "申请会签", ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus());
+
+
+        //非执行董事节点自动跳过
+        task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult();
+        while (!"执行董事".equals(task.getName())) {
+            completeSkipTask(task, processInstance, "会签,任务自动审批通过", ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus());
+            task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult();
+        }
+    }
+
+
+    private void completeSkipTask(Task task, ProcessInstance processInstance, String message, int type) {
+        String taskId = task.getId();
+        ActTaskDef actTaskDef = findFirstByProcDefIdAndTaskKey(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
+
+        Authentication.setAuthenticatedUserId("-1");
+        taskService.addComment(taskId, processInstance.getProcessInstanceId(), message);
+        taskService.setAssignee(taskId, "-1");
+
+        if (ActConstant.TASK_TYPE_SINGE == actTaskDef.getTaskType()) {
+            handleSinge(processInstance, taskId, type, actTaskDef);
+        }
+    }
 
     /**
      * 或签处理
@@ -311,6 +350,11 @@ public class ActTaskDefService {
      */
     private void setAssign(ActHisTask actHisTask) {
         if (StringUtils.isNotBlank(actHisTask.getAssign())) {
+            if ("-1".equals(actHisTask.getAssign())) {
+                actHisTask.setAssign("系统");
+                return;
+            }
+
             String userName = accountService.getNameById(Integer.parseInt(actHisTask.getAssign()));
             actHisTask.setAssign(userName);
             return;
diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java
index 62382d9..7a0e7b0 100644
--- a/src/main/java/cn/palmte/work/service/ProjectService.java
+++ b/src/main/java/cn/palmte/work/service/ProjectService.java
@@ -222,6 +222,18 @@ public class ProjectService {
     }
 
 
+    public ResponseMsg skipTask(int projectId, int approvetype) {
+        List<ProjectInstanceRelation> relationList = projectInstanceRelationRepository.findByProjectIdOrderByCreateTimeDesc(projectId);
+        if (relationList == null || relationList.isEmpty()) {
+            return ResponseMsg.buildFailedMsg("会签失败");
+        }
+
+        ProjectInstanceRelation projectInstanceRelation = relationList.get(0);
+        actTaskDefService.skipTaskByProcInsId(projectInstanceRelation.getProcessInsId());
+
+        return ResponseMsg.buildSuccessMsg("会签成功", approvetype);
+    }
+
     /**
      * 更新项目状态和审批状态
      */
diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java
index 0fee77b..5f53887 100644
--- a/src/main/java/cn/palmte/work/utils/ActUtil.java
+++ b/src/main/java/cn/palmte/work/utils/ActUtil.java
@@ -3,6 +3,8 @@ package cn.palmte.work.utils;
 import cn.palmte.work.config.activiti.ActConstant;
 import cn.palmte.work.config.activiti.DeleteTaskCommand;
 import cn.palmte.work.config.activiti.JumpCommand;
+import cn.palmte.work.model.ProjectInstanceRelation;
+import cn.palmte.work.model.ProjectInstanceRelationRepository;
 import cn.palmte.work.service.AccountService;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.bpmn.model.FlowNode;
@@ -47,8 +49,22 @@ public class ActUtil {
     private TaskService taskService;
     @Autowired
     private AccountService accountService;
+    @Autowired
+    private ProjectInstanceRelationRepository projectInstanceRelationRepository;
 
 
+    public Task getCurrentTask(int projectId) {
+        try {
+            List<ProjectInstanceRelation> relationList = projectInstanceRelationRepository
+                    .findByProjectIdOrderByCreateTimeDesc(projectId);
+            ProjectInstanceRelation projectInstanceRelation = relationList.get(0);
+            return taskService.createTaskQuery().processInstanceId(projectInstanceRelation.getProcessInsId()).singleResult();
+        } catch (Exception e) {
+            logger.error("", e);
+            return null;
+        }
+    }
+
     /**
      * 获取流程实例里的变量
      *
diff --git a/src/main/resources/templates/admin/project_approve.ftl b/src/main/resources/templates/admin/project_approve.ftl
index cb87402..a4de9ae 100644
--- a/src/main/resources/templates/admin/project_approve.ftl
+++ b/src/main/resources/templates/admin/project_approve.ftl
@@ -2470,6 +2470,53 @@
                     </div>
                 </div>
 
+
+                <#--会签弹窗-->
+                <div class="am-modal am-modal-prompt" style="width: 1000px;max-height:600px;overflow-y:auto;"
+                     tabindex="-1" id="my-approve2">
+                    <div class="am-modal-dialog">
+                        <div style="word-wrap:break-word; word-break:break-all; " class="am-modal-hd">会签—${project.name}</div>
+                        <div class="am-modal-bd" style="border-bottom: none">
+                            <form method="post" class="am-form" id="tmpForm" action="${base}/procurement/type/save">
+                                <div class="am-tabs am-margin" data-am-tabs>
+                                    <div class="am-tabs-bd">
+                                        <div class="am-tab-panel am-fade am-in am-active" id="tab1">
+
+                                            <div class="am-g am-form-group am-margin-top">
+                                                <div class="am-u-sm-4 am-u-md-2 am-text-right">会签单</div>
+
+                                                <div class="am-u-sm-12 am-u-md-4 switch-button" style="height: 25px;">
+                                                    <label class="am-radio-inline">
+                                                        <input type="file" name="myFile" />
+                                                    </label>
+
+                                                </div>
+
+                                                <div class="am-hide-sm-only am-u-md-1" style="color: red;"></div>
+                                                <div class="am-u-sm-2 am-u-md-5 input-msg"></div>
+                                            </div>
+
+                                        </div>
+                                    </div>
+                                </div>
+                            </form>
+                        </div>
+                        <div class="am-modal-footer">
+                            <button type="button"
+                                    class="am-btn am-btn-default am-btn-xs am-text-secondary"
+                                    onclick="$('#my-approve2').modal('close')">
+                                取消
+                            </button>
+                            <span style="margin-left: 100px"></span>
+                            <button type="button"
+                                    class="am-btn am-btn-default am-btn-xs am-text-secondary"
+                                    onclick="completeHuiQianTask('${project.id}')">
+                                确定
+                            </button>
+                        </div>
+                    </div>
+                </div>
+
                 <!--选项卡(tabs)end-->
                 <div class="am-margin">
                     <button type="button" class="am-btn am-btn-warning am-btn-xs" onclick="javascript:history.go(-1);">
@@ -2478,6 +2525,11 @@
                     <#if adminId==project.approveId>
                         <button type="submit" class="am-btn am-btn-primary am-btn-xs" id="saveFinal">审核</button>
                     </#if>
+
+                    <#--预算状态  待审核状态 -->
+                    <#if project.status==5 && project.approveStatusBudget==1 && currentTaskName != "执行董事" >
+                        <button type="submit" class="am-btn am-btn-primary am-btn-xs" id="huiQian">会签</button>
+                    </#if>
                 </div>
             </form>
 
@@ -2511,6 +2563,17 @@
                 }
             });
         });
+
+        $("#huiQian").click(function () {
+            $('#my-approve2').modal({
+                relatedTarget: this,
+                onConfirm: function (e) {
+                },
+                onCancel: function (e) {
+                }
+            });
+        });
+
         $("#incomeAddBtn").click(function () {
             appendTrIncome();
         });
@@ -2554,6 +2617,37 @@
         });
     };
 
+
+    var completeHuiQianTask = function (projectId) {
+        var approvetype = $("#type").val();
+        var params = {
+            message: ""
+        };
+        $.ajax({
+            url: '${base}/project/skipTask/' + projectId + "/" + approvetype,
+            data: JSON.stringify(params),
+            dataType: "json",
+            contentType: "application/json",
+            type: 'post',
+            async: false,
+            success: function (data) {
+                if (data.status == 0) {
+                    alert(data.msg);
+                    refreshMyApproveMsg();
+                    var urlType = data.data;
+                    if(urlType == 1){
+                        location.href = "${base}/project/list";
+                    }else {
+                        location.href = "${base}/project/listApprove";
+                    }
+
+                } else if (data.status == 1) {
+                    alert(data.msg);
+                }
+            }
+        });
+    };
+
     layui.use('laydate', function(){
         var laydate = layui.laydate;