From 73c4c9e6e737585aa5125ddbfa628459ab89f7ac Mon Sep 17 00:00:00 2001
From: pengqiang <pengqiang.it@ciic.com.cn>
Date: Tue, 16 Nov 2021 17:39:06 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=8A=B6=E6=80=81=E6=8E=A7?=
 =?UTF-8?q?=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../work/service/ActListenerService.java      | 14 ++----
 .../work/service/ActProcInsService.java       |  1 -
 .../work/service/ActTaskDefService.java       | 21 ++++++--
 .../work/service/ProjectInstanceService.java  | 50 +++++++++++++++++--
 .../palmte/work/service/ProjectService.java   | 13 +++--
 .../templates/admin/project_approve.ftl       |  2 +-
 6 files changed, 75 insertions(+), 26 deletions(-)

diff --git a/src/main/java/cn/palmte/work/service/ActListenerService.java b/src/main/java/cn/palmte/work/service/ActListenerService.java
index 3dee877..bf67ed7 100644
--- a/src/main/java/cn/palmte/work/service/ActListenerService.java
+++ b/src/main/java/cn/palmte/work/service/ActListenerService.java
@@ -1,23 +1,17 @@
 package cn.palmte.work.service;
 
 
-import cn.palmte.work.config.activiti.ActConstant;
 import cn.palmte.work.utils.ActUtil;
-import com.alibaba.fastjson.JSONObject;
 import org.activiti.engine.RuntimeService;
 import org.activiti.engine.delegate.DelegateExecution;
 import org.activiti.engine.delegate.DelegateTask;
 import org.activiti.engine.runtime.ProcessInstance;
-import org.activiti.engine.runtime.ProcessInstanceQuery;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-
-import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 
 
 /**
@@ -47,15 +41,15 @@ public class ActListenerService {
      * @throws Exception
      */
     public void create(DelegateTask delegateTask) throws Exception {
-        logger.info("--节点创建后监听--  procInsId:{},  {}", delegateTask.getProcessInstanceId(), delegateTask);
+        String procInsId = delegateTask.getProcessInstanceId();
+        logger.info("--节点创建后监听--  procInsId:{},  {}", procInsId, delegateTask);
 
         String procDefId = delegateTask.getProcessDefinitionId();
-        String procInsId = delegateTask.getProcessInstanceId();
         String taskDefKey = delegateTask.getTaskDefinitionKey();
         List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
-        logger.info("addCandidateUsers : {}", candidateUsers);
 
-        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()).singleResult();
+        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
+        logger.info("addCandidateUsers : {}, taskName:{}, hasProcIns:{}", candidateUsers, delegateTask.getName(), processInstance != null);
         if (actUtil.isProjectProcessIns(processInstance)) {
             updateProjectApprover(candidateUsers, processInstance);
         }
diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java
index 89675c5..b65bf49 100644
--- a/src/main/java/cn/palmte/work/service/ActProcInsService.java
+++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java
@@ -74,7 +74,6 @@ public class ActProcInsService {
      * @param variables
      * @return
      */
-    @Transactional(propagation = Propagation.NOT_SUPPORTED)
     public String startProcessInstance(String procDefKey, String businessKey, Map<String, Object> variables) throws Exception {
         List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(procDefKey).active().orderByProcessDefinitionVersion().desc().list();
         if (list == null || list.isEmpty()) {
diff --git a/src/main/java/cn/palmte/work/service/ActTaskDefService.java b/src/main/java/cn/palmte/work/service/ActTaskDefService.java
index bd3187c..bf61200 100644
--- a/src/main/java/cn/palmte/work/service/ActTaskDefService.java
+++ b/src/main/java/cn/palmte/work/service/ActTaskDefService.java
@@ -161,6 +161,7 @@ public class ActTaskDefService {
             }
 
             if (actUtil.isProjectProcessIns(procDefKey)) {
+                //最后一个任务完成后 更新项目状态为审批通过
                 updateProjectPassed(processInstance, actTaskDef, procDefKey);
             }
 
@@ -177,21 +178,33 @@ public class ActTaskDefService {
                 logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName());
             }
 
-
+            //驳回后 更新项目状态为审批不通过
             if (actUtil.isProjectProcessIns(procDefKey)) {
-                projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_UNPASS, procDefKey);
+                int projectId = Integer.parseInt(processInstance.getBusinessKey());
+                projectInstanceService.updateProjectApproveUnPassed(projectId, procDefKey);
+                logger.info("updateProjectUnPassed projectId:{}, proDefKey:{}", projectId, procDefKey);
             }
         }
     }
 
+    /**
+     * 最后一个任务完成后 更新项目状态为审批通过
+     *
+     * @param processInstance
+     * @param actTaskDef
+     * @param procDefKey
+     */
     private void updateProjectPassed(ProcessInstance processInstance, ActTaskDef actTaskDef, String procDefKey) {
+        int projectId = Integer.parseInt(processInstance.getBusinessKey());
         if (ActConstant.PROCESS_DEFKEY_FINAL.equals(procDefKey)) {
             if ("财务总监".equals(actTaskDef.getTaskName())) {
-                projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_PASSED, procDefKey);
+                logger.info("updateProjectPassed1 projectId:{}, proDefKey:{}", projectId, procDefKey);
+                projectInstanceService.updateProjectApprovePassed(projectId,  procDefKey);
             }
         } else {
             if ("执行董事".equals(actTaskDef.getTaskName())) {
-                projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_PASSED, procDefKey);
+                logger.info("updateProjectPassed2 projectId:{}, proDefKey:{}", projectId, procDefKey);
+                projectInstanceService.updateProjectApprovePassed(projectId,  procDefKey);
             }
         }
 
diff --git a/src/main/java/cn/palmte/work/service/ProjectInstanceService.java b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java
index ef361a4..b70470d 100644
--- a/src/main/java/cn/palmte/work/service/ProjectInstanceService.java
+++ b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java
@@ -1,6 +1,7 @@
 package cn.palmte.work.service;
 
 import cn.palmte.work.bean.ApproveStatusEnum;
+import cn.palmte.work.bean.StatusEnum;
 import cn.palmte.work.config.activiti.ActConstant;
 import cn.palmte.work.model.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -117,17 +118,15 @@ public class ProjectInstanceService {
     }
 
     /**
-     * 更新对应审批状态
-     * @param projectId 项目id
-     * @param approveStatusEnum 审批状态 1待审核,2审核通过,3审核不通过
-     * @see ApproveStatusEnum
+     * 项目审批不通过
      * @param processKey 审批类型
      * @see ActConstant#PROCESS_DEFKEY_ESTIMATE
      * @see ActConstant#PROCESS_DEFKEY_BUDGET
      * @see ActConstant#PROCESS_DEFKEY_SETTLE
      * @see ActConstant#PROCESS_DEFKEY_FINAL
      */
-    public void updateApproveStatus(int projectId, ApproveStatusEnum approveStatusEnum, String processKey){
+    public void updateProjectApproveUnPassed(int projectId, String processKey){
+        ApproveStatusEnum approveStatusEnum = ApproveStatusEnum.APPROVAL_UNPASS;
         Project project = projectRepository.findOne(projectId);
         if(ActConstant.PROCESS_DEFKEY_ESTIMATE.equals(processKey)){
             project.setApproveStatusEstimate(approveStatusEnum.getApproveStatus());
@@ -142,4 +141,45 @@ public class ProjectInstanceService {
         project.setLastUpdateTime(new Date());
         projectRepository.saveAndFlush(project);
     }
+
+
+    /**
+     * 项目审批通过
+     *
+     * @param projectId
+     * @param processKey
+     */
+    public void updateProjectApprovePassed(int projectId, String processKey){
+        ApproveStatusEnum approveStatusEnum = ApproveStatusEnum.APPROVAL_PASSED;
+        Project project = projectRepository.findOne(projectId);
+        if(ActConstant.PROCESS_DEFKEY_ESTIMATE.equals(processKey)){
+            //概算完成
+            project.setApproveStatusEstimate(approveStatusEnum.getApproveStatus());
+            project.setStatus(StatusEnum.ESTIMATE_ACCOUNTS.getStatus());
+            project.setStatusDesc(StatusEnum.ESTIMATE_ACCOUNTS.getStatusDesc());
+
+        }else if(ActConstant.PROCESS_DEFKEY_BUDGET.equals(processKey)){
+            //预算完成
+            project.setApproveStatusBudget(approveStatusEnum.getApproveStatus());
+            project.setStatus(StatusEnum.BUDGET_ACCOUNTS.getStatus());
+            project.setStatusDesc(StatusEnum.BUDGET_ACCOUNTS.getStatusDesc());
+
+        }else if(ActConstant.PROCESS_DEFKEY_SETTLE.equals(processKey)){
+            project.setApproveStatusSettle(approveStatusEnum.getApproveStatus());
+
+        }else if(ActConstant.PROCESS_DEFKEY_FINAL.equals(processKey)){
+            //决算完成
+            project.setApproveStatusFinal(approveStatusEnum.getApproveStatus());
+            project.setStatus(StatusEnum.FINAL_ACCOUNTS.getStatus());
+            project.setStatusDesc(StatusEnum.FINAL_ACCOUNTS.getStatusDesc());
+
+        }
+
+        project.setApproveId(0);
+        project.setApproveName("");
+
+        project.setLastUpdateTime(new Date());
+        projectRepository.saveAndFlush(project);
+    }
+
 }
diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java
index dc7aa4c..fa04f4d 100644
--- a/src/main/java/cn/palmte/work/service/ProjectService.java
+++ b/src/main/java/cn/palmte/work/service/ProjectService.java
@@ -152,14 +152,18 @@ public class ProjectService {
     /**
      * 编辑概算保存项目并发起审核
      */
-    @Transactional(rollbackFor = RuntimeException.class)
-    public Project estimateEditSaveAndApprove(Project project,
+//    @Transactional(rollbackFor = RuntimeException.class)
+    public void estimateEditSaveAndApprove(Project project,
                                     Project projectInDb,
                                     EstimateBean estimateBean,
                                     Admin admin) throws Exception {
 
-        if(null != projectInDb.getApproveStatusEstimate() &&
-                ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == projectInDb.getApproveStatusEstimate()){
+        Integer approveStatusEstimate = projectInDb.getApproveStatusEstimate();
+
+        estimateEditSave(project, projectInDb, estimateBean, admin, ApproveStatusEnum.APPROVAL_PENDING);
+
+        if(null != approveStatusEstimate &&
+                ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == approveStatusEstimate){
             //审核不通过的情况下重新编辑后就完成当前任务【此时任务节点在第一个,也就是发起审批】
             List<String> estimateProcessInsIds = projectInstanceService.getEstimateProcessInsIds(projectInDb);
             if(CollectionUtil.isNotEmpty(estimateProcessInsIds)){
@@ -171,7 +175,6 @@ public class ProjectService {
             //第一次或者重新发起一个流程实例【第一次或者以前的审批都已经过了】
             projectInstanceService.startEstimateProcessInstance(projectInDb, admin);
         }
-        return estimateEditSave(project, projectInDb, estimateBean, admin, ApproveStatusEnum.APPROVAL_PENDING);
     }
     /**
      * 编辑概算保存项目
diff --git a/src/main/resources/templates/admin/project_approve.ftl b/src/main/resources/templates/admin/project_approve.ftl
index e18fe13..bb34804 100644
--- a/src/main/resources/templates/admin/project_approve.ftl
+++ b/src/main/resources/templates/admin/project_approve.ftl
@@ -2004,7 +2004,7 @@
 
                                                 <div class="am-u-sm-12 am-u-md-4 switch-button" style="height: 25px;">
                                                     <label class="am-radio-inline">
-                                                        <input type="radio"  value="2" name="docVlGender" required> 审核通过
+                                                        <input type="radio"  value="2" checked="checked" name="docVlGender" required> 审核通过
                                                     </label>
                                                     <label class="am-radio-inline">
                                                         <input type="radio" value="3"  name="docVlGender"> 审核不通过