diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approval/ApprovalCmd.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approval/ApprovalCmd.java
index 7b94db2f9a3c64087cdfb6c716c56ffd9d2d6a0d..a12d967b6d73319c99bbb91bcee5c19722f2daa8 100644
--- a/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approval/ApprovalCmd.java
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approval/ApprovalCmd.java
@@ -99,6 +99,10 @@ public class ApprovalCmd extends BaseCmd {
 
     @ApiModelProperty(value = "椤圭洰缂栧彿")
     protected String fundsProject;
+    public void setFundsProject(String fundsProject) {
+        this.fundsProject = fundsProject;
+        getFundsProjectCodeList();
+    }
 
     @ApiModelProperty(value = "椤圭洰鍚嶇О")
     protected String fundsProjectName;
@@ -109,6 +113,12 @@ public class ApprovalCmd extends BaseCmd {
         return fundsProjectCode;
     }
 
+    protected List<String> fundsProjectCodeList;
+    public List<String> getFundsProjectCodeList() {
+        fundsProjectCodeList = Arrays.stream(ObjectUtils.defaultIfNull(fundsProject, "").split(",")).collect(Collectors.toList());
+        return fundsProjectCodeList;
+    }
+
     /**椤圭洰*/
     protected String fundsProjectCodeAndName;
 
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/VerifyReimbursementService.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/VerifyReimbursementService.java
index 39a30aeceac2f5fb88bed5fba8ecf527cf437bc4..b5ca18321bb0e03abe886ad06b0feb90507e3520 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/VerifyReimbursementService.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/VerifyReimbursementService.java
@@ -70,13 +70,16 @@ public abstract class VerifyReimbursementService {
 
     public List<String> getApproverUserNodeNameList(ExpenseReimbursementCmd cmd, List<String> counterSignerList) {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
-        log.info(JSONObject.toJSONString(BeanUtil.beanToMap(cmd)));
+        log.info(String.format("getApproverUserNodeNameList: cmd: %s", JSONObject.toJSONString(BeanUtil.beanToMap(cmd))));
+        log.info(String.format("getApproverUserNodeNameList: counterSignerList: %s", JSONObject.toJSONString(counterSignerList)));
         List<String> nodeNameList = new ArrayList<>();
         List<String> orderStatusList = orderStatusList(cmd);
+        log.info(String.format("getApproverUserNodeNameList: orderStatusList: %s", JSONObject.toJSONString(orderStatusList)));
         if (ObjectUtils.isNotEmpty(orderStatusList) && ObjectUtils.isNotEmpty(counterSignerList)) {
             orderStatusList.retainAll(counterSignerList);
             nodeNameList = orderStatusList;
         }
+        log.info(String.format("getApproverUserNodeNameList: nodeNameList: %s", JSONObject.toJSONString(nodeNameList)));
         return nodeNameList;
     }
 
@@ -472,7 +475,7 @@ public abstract class VerifyReimbursementService {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
         List<String> projectChargeList = getProjectChargeList(cmd);
         if (ObjectUtils.isEmpty(projectChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return projectChargeList.contains(cmd.getApplicantNo());
     }
 
@@ -484,7 +487,7 @@ public abstract class VerifyReimbursementService {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
         List<String> projectChargeList = getProjectSecondChargeOrFirstChangeList(cmd);
         if (ObjectUtils.isEmpty(projectChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return projectChargeList.contains(cmd.getApplicantNo());
     }
 
@@ -495,7 +498,7 @@ public abstract class VerifyReimbursementService {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
         List<String> projectOrgChargeList = getProjectOrgChargeList(cmd);
         if (ObjectUtils.isEmpty(projectOrgChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰閮ㄩ棬璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return projectOrgChargeList.contains(cmd.getApplicantNo());
     }
 
@@ -506,7 +509,7 @@ public abstract class VerifyReimbursementService {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
         List<DepartmentInfoOut> departmentInfoList = ExternalDataUtil.INSTANCE.getDepartmentInfoListByOrgFilter(instanceId, cmd.getOrganizationCode());
         if (ObjectUtils.isEmpty(departmentInfoList))
-            throw ExceptionUtil.getException(null, "鏌ヨ鐢宠浜烘墍鍦ㄩ儴闂ㄨ礋璐d汉淇℃伅澶辫触,閮ㄩ棬缂栧彿锛�" + cmd.getOrganizationCode());
+            return false;
         for (DepartmentInfoOut department : departmentInfoList) {
             boolean applyUserEqualsApplyOrgCharge = cmd.getApplicantNo().equals(department.getChargeNo()) && cmd.getApplicantName().equals(department.getChargeName());
             if (applyUserEqualsApplyOrgCharge)
@@ -572,7 +575,7 @@ public abstract class VerifyReimbursementService {
         String payeeNo = cmd.getPayeeNoList().get(0);
         List<String> projectChargeList = getProjectChargeList(cmd);
         if (ObjectUtils.isEmpty(projectChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return projectChargeList.contains(payeeNo);
     }
 
@@ -586,7 +589,7 @@ public abstract class VerifyReimbursementService {
         String payeeNo = cmd.getPayeeNoList().get(0);
         List<String> projectOrgChargeList = getProjectOrgChargeList(cmd);
         if (ObjectUtils.isEmpty(projectOrgChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰閮ㄩ棬璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return projectOrgChargeList.contains(payeeNo);
     }
 
@@ -597,7 +600,7 @@ public abstract class VerifyReimbursementService {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
         List<String> projectChargeList = getProjectChargeList(cmd);
         if (ObjectUtils.isEmpty(projectChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return !Collections.disjoint(cmd.getPayeeNoList(), projectChargeList);
     }
 
@@ -608,7 +611,7 @@ public abstract class VerifyReimbursementService {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
         List<String> projectOrgChargeList = getProjectOrgChargeList(cmd);
         if (ObjectUtils.isEmpty(projectOrgChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰閮ㄩ棬璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return !Collections.disjoint(cmd.getPayeeNoList(), projectOrgChargeList);
     }
 
@@ -637,7 +640,7 @@ public abstract class VerifyReimbursementService {
         List<String> travelPersonNoList = ObjectUtils.isEmpty(extendFieldCmd) ? new ArrayList<>() : extendFieldCmd.getTravelPersonNoList();
         List<String> projectOrgChargeList = getProjectOrgChargeList(cmd);
         if (ObjectUtils.isEmpty(projectOrgChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰閮ㄩ棬璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return !Collections.disjoint(travelPersonNoList, projectOrgChargeList);
     }
 
@@ -663,7 +666,7 @@ public abstract class VerifyReimbursementService {
         List<String> travelPersonNoList = ObjectUtils.isEmpty(extendFieldCmd) ? new ArrayList<>() : extendFieldCmd.getTravelPersonNoList();
         List<String> projectChargeList = getProjectChargeList(cmd);
         if (ObjectUtils.isEmpty(projectChargeList))
-            throw ExceptionUtil.getException(null, "鏌ヨ椤圭洰璐熻矗浜轰俊鎭け璐�,椤圭洰缂栧彿锛�" + cmd.getFundsProject());
+            return false;
         return !Collections.disjoint(travelPersonNoList, projectChargeList);
     }
 
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/WaiMao_VerifyReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/WaiMao_VerifyReimbursementServiceImpl.java
index 054b4c6c0d60cbea9a3f08c25dfc6b486ac095ba..a28bfb1a83205034f845a430d52e4f383389d0a2 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/WaiMao_VerifyReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/WaiMao_VerifyReimbursementServiceImpl.java
@@ -5,30 +5,28 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.seasky.core.common.Pagination;
 import com.seasky.core.common.ResponseCode;
-import com.seasky.core.ddd.utils.MapperUtils;
 import com.seasky.core.util.ExceptionUtil;
 import com.seasky.flowportal.constant.Constant;
 import com.seasky.flowportal.domain.po.ExpenseReimbursementPo;
 import com.seasky.flowportal.dto.approval.ApprovalCmd;
-import com.seasky.flowportal.dto.approverUser.ApproverUserConfigOut;
 import com.seasky.flowportal.dto.approverUser.ApproverUserSFPOut;
 import com.seasky.flowportal.dto.approverUser.ApproverUserSFPQuery;
 import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementCmd;
 import com.seasky.flowportal.dto.extendData.ExtendFieldCmd;
-import com.seasky.flowportal.dto.preExpenseApply.PreExpenseApplyCmd;
 import com.seasky.flowportal.dto.user.UserInfoOut;
 import com.seasky.flowportal.dto.user.UserInfoQuery;
-import com.seasky.flowportal.enums.ApplyCategoryEnum;
-import com.seasky.flowportal.enums.OrderStatusEnum;
-import com.seasky.flowportal.enums.PreExpenseTypeEnum;
-import com.seasky.flowportal.enums.ReimbursementTypeEnum;
+import com.seasky.flowportal.dto.userContainingVerification.UserContainingVerificationOut;
+import com.seasky.flowportal.dto.userContainingVerification.UserContainingVerificationsOut;
+import com.seasky.flowportal.enums.*;
+import com.seasky.flowportal.service.FlowService;
 import com.seasky.flowportal.service.VerifyReimbursementService;
-import com.seasky.flowportal.utils.ApprovalUtil;
 import com.seasky.flowportal.utils.BaseConfigUtil;
 import com.seasky.flowportal.utils.BaseInOutUtil;
 import com.seasky.flowportal.utils.ExternalDataUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -43,6 +41,10 @@ import java.util.stream.Collectors;
 @Slf4j
 public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementService {
 
+    @Autowired
+    @Lazy
+    private FlowService flowService;
+
     private static List<String> laborCostList = Arrays.asList( "鏍″浜哄憳鍔冲姟璐�", "瀛︾敓鍔冲姟璐�");
     @Override
     public Map<String, Object> getCreateFlowBusinessData(ApprovalCmd cmd) {
@@ -50,10 +52,9 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
         if (ApplyCategoryEnum.isPreApply(cmd.getOrderType()))
             return businessData;
 
-        if (ObjectUtils.isNotEmpty(cmd.getFundsProject())) {
-            boolean payeeIsProjectCharge = Boolean.TRUE.equals(super.checkPayeeEqualsProjectCharge((ExpenseReimbursementCmd) cmd) &&
-                    super.checkApplyUserEqualsProjectCharge(cmd));
-            businessData.put("payeeIsProjectCharge", payeeIsProjectCharge);
+        if (cmd instanceof ExpenseReimbursementCmd) {
+            boolean needAddSigner = needAddSigner((ExpenseReimbursementCmd) cmd);
+            businessData.put("needAddSigner", needAddSigner);
         }
         return businessData;
     }
@@ -62,40 +63,39 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
     public String verifyReimbursementSelectUser(ExpenseReimbursementCmd cmd) {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
         log.info(JSONObject.toJSONString(BeanUtil.beanToMap(cmd)));
-        List<ApproverUserConfigOut> approverUserConfigOutList = getApproverUserConfigList(cmd);
-        if (ObjectUtils.isNotEmpty(approverUserConfigOutList)) {
-            for (ApproverUserConfigOut config : approverUserConfigOutList) {
-                checkAddSignerInfo(config, cmd);
-            }
+        List<String> approverUserNodeNameList = getApproverUserNodeNameList(cmd);
+        List<UserInfoOut> addSignUserList = null;
+        if (approverUserNodeNameList.contains(AssigneeEnum.ClaimsEndorser.getNodeName())) {
+            addSignUserList = cmd.getClaimsEndorser().stream().map(s -> UserInfoOut.builder().userNo(s.getClaimsEndorserNo()).userName(s.getClaimsEndorserName()).build()).collect(Collectors.toList());
+            checkAddSignerInfo(addSignUserList, AssigneeEnum.ClaimsEndorser, cmd);
+        }
+        if (approverUserNodeNameList.contains(AssigneeEnum.LeaderEndorser.getNodeName())) {
+            addSignUserList = cmd.getLeaderEndorser().stream().map(s -> UserInfoOut.builder().userNo(s.getLeaderEndorserNo()).userName(s.getLeaderEndorserName()).build()).collect(Collectors.toList());
+            checkAddSignerInfo(addSignUserList, AssigneeEnum.LeaderEndorser, cmd);
         }
         return "";
     }
 
     //鏍¢獙鍔犵浜轰俊鎭�
-    private void checkAddSignerInfo(ApproverUserConfigOut config, ExpenseReimbursementCmd cmd) {
+    private void checkAddSignerInfo(List<UserInfoOut> addSignUserList, AssigneeEnum assigneeEnum, ExpenseReimbursementCmd cmd) {
         Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
-        String assigneeName = config.getName();
-        WaiMao_VerifyReimbursementServiceImpl.AssigneeEnum assigneeEnum = WaiMao_VerifyReimbursementServiceImpl.AssigneeEnum.getValueByName(assigneeName);
         if (ObjectUtils.isEmpty(assigneeEnum))
             throw ExceptionUtil.getException(null, "鍔犵浜虹被鍨嬮敊璇�");
-        List<UserInfoOut> addSignUserList = ApprovalUtil.getAddSignUserList(cmd, config.getFieldName());
-        if (Boolean.TRUE.equals(config.getIsRequired()) && ObjectUtils.isEmpty(addSignUserList)) {
-            Integer number = ObjectUtils.defaultIfNull(config.getNumber(), 1);
-            throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_SAVE_FAILURE, String.format("闇€瑕�%s涓�%s瀹℃壒锛岃閲嶆柊閫夋嫨鍚庢彁浜わ紒", number, assigneeName));
+        String assigneeName = assigneeEnum.getName();
+        if (ObjectUtils.isEmpty(addSignUserList)) {
+            //钖祫鏍¢獙鍔犵浜哄繀濉� 澶勭悊閿欒鐮佷负4001
+            throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_SAVE_FAILURE, "闇€瑕佷竴涓�" + assigneeName + "瀹℃壒锛岃閲嶆柊閫夋嫨鍚庢彁浜わ紒");
         }
         if (addSignUserList.stream().anyMatch(s -> ObjectUtils.isEmpty(s.getUserNo()) || ObjectUtils.isEmpty(s.getUserName()))) {
             //钖祫鏍¢獙鍔犵浜哄繀濉� 澶勭悊閿欒鐮佷负4001
             throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_SAVE_FAILURE, assigneeName + "缂哄皯宸ュ彿鎴栧鍚嶏紒");
         }
 
-        if (WaiMao_VerifyReimbursementServiceImpl.AssigneeEnum.ClaimsEndorser.equals(assigneeEnum)) {
+        if (AssigneeEnum.ClaimsEndorser.equals(assigneeEnum)) {
             List<String> userNoList = addSignUserList.stream().map(UserInfoOut::getUserNo).collect(Collectors.toList());
             for (UserInfoOut user : addSignUserList) {
                 if (user.getUserNo().equals(cmd.getApplicantNo()))
                     continue;
-                List<String> projectChargeList = super.getProjectChargeList(cmd);
-                if (projectChargeList.contains(user.getUserNo()))
-                    continue;
                 userNoList.remove(user.getUserNo());
             }
             if (ObjectUtils.isNotEmpty(userNoList))
@@ -103,7 +103,7 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
                 //return PortalResponse.ok(PortalResponseCode.INCOMPLETE_INFO, "闇€瑕佷竴涓�" + assigneeName + "瀹℃壒锛岃閲嶆柊閫夋嫨鍚庢彁浜わ紒");
                 throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_DEL_FAILURE, "閫夋嫨鐨�" + assigneeName + "鑼冨洿涓嶆纭紝璇烽噸鏂伴€夋嫨鍚庢彁浜わ紒");
         }
-        if (WaiMao_VerifyReimbursementServiceImpl.AssigneeEnum.LeaderEndorser.equals(assigneeEnum)) {
+        if (AssigneeEnum.LeaderEndorser.equals(assigneeEnum)) {
             List<String> userNoList = addSignUserList.stream().map(UserInfoOut::getUserNo).collect(Collectors.toList());
             UserInfoQuery query = UserInfoQuery.builder().roleName(assigneeEnum.getName()).pageSize(100).build();
             query.setInstanceId(instanceId);
@@ -121,95 +121,37 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
         }
     }
 
-    //鏍¢獙鍔犵浜轰俊鎭�
-    private void checkAddSignerInfo(List<UserInfoOut> addSignUserList, AssigneeEnum assigneeEnum, ExpenseReimbursementCmd expenseReimbursementCmd) {
-        Long instanceId = BaseInOutUtil.verifyInstanceId(expenseReimbursementCmd);
-        if (ObjectUtils.isEmpty(assigneeEnum))
-            throw ExceptionUtil.getException(null, "鍔犵浜虹被鍨嬮敊璇�");
-        String assigneeName = assigneeEnum.getName();
-        if (ObjectUtils.isEmpty(addSignUserList)) {
-            //钖祫鏍¢獙鍔犵浜哄繀濉� 澶勭悊閿欒鐮佷负4001
-            throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_SAVE_FAILURE, "闇€瑕佷竴涓�" + assigneeName + "瀹℃壒锛岃閲嶆柊閫夋嫨鍚庢彁浜わ紒");
-        }
-        if (addSignUserList.stream().anyMatch(s -> ObjectUtils.isEmpty(s.getUserNo()) || ObjectUtils.isEmpty(s.getUserName()))) {
-            //钖祫鏍¢獙鍔犵浜哄繀濉� 澶勭悊閿欒鐮佷负4001
-            throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_SAVE_FAILURE, assigneeName + "缂哄皯宸ュ彿鎴栧鍚嶏紒");
-        }
-
-        if (AssigneeEnum.ClaimsEndorser.equals(assigneeEnum)) {
-            List<UserInfoOut> claimsEndorserList = ExternalDataUtil.INSTANCE.getUserListInRole(instanceId, assigneeEnum.getName());
-            List<String> userNoList = addSignUserList.stream().map(UserInfoOut::getUserNo).collect(Collectors.toList());
-            for (UserInfoOut user : addSignUserList) {
-                boolean isContainUser = ObjectUtils.isNotEmpty(claimsEndorserList) && claimsEndorserList.stream().anyMatch(subSchoolLeader -> subSchoolLeader.getUserNo().equals(user.getUserNo()));
-                if (isContainUser)
-                    userNoList.remove(user.getUserNo());
+    private boolean needAddSigner(ExpenseReimbursementCmd cmd) {
+        boolean addSigner = cmd.getFundsProjectCodeList().stream().noneMatch(code ->
+                ObjectUtils.isNotEmpty(code) && code.length() >= 3 && 'C' == Character.toUpperCase(code.charAt(2))
+        );;
+        if (!addSigner)
+            addSigner = checkApplyUserEqualsProjectCharge(cmd);
+        if (!addSigner) {
+            if (OrderTypesEnum.isSalary(cmd.getOrderType())) {
+                ExtendFieldCmd extendFieldCmd = cmd.getExtendFieldCmd();
+                Map<String, Boolean> payeeContainingMap = ObjectUtils.isEmpty(extendFieldCmd) ? null : extendFieldCmd.getPayeeContainingMap();
+                addSigner = ObjectUtils.isNotEmpty(payeeContainingMap) && payeeContainingMap.get("0");
             }
-            if (ObjectUtils.isNotEmpty(userNoList))
-                //钖祫鏍¢獙鍔犵浜哄繀濉� 澶勭悊閿欒鐮佷负4001
-                //return PortalResponse.ok(PortalResponseCode.INCOMPLETE_INFO, "闇€瑕佷竴涓�" + assigneeName + "瀹℃壒锛岃閲嶆柊閫夋嫨鍚庢彁浜わ紒");
-                throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_DEL_FAILURE, "閫夋嫨鐨�" + assigneeName + "鑼冨洿涓嶆纭紝璇烽噸鏂伴€夋嫨鍚庢彁浜わ紒");
+            else
+                addSigner = super.checkPayeeEqualsProjectCharge(cmd);
         }
-    }
-
-    @Override
-    public List<ApproverUserConfigOut> getApproverUserConfigList(ExpenseReimbursementCmd cmd) {
-        Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
-        List<ApproverUserConfigOut> list = new ArrayList<>();
-        String orderCode = cmd.getReimbursementCode();
-        BigDecimal amount = cmd.getOrderAmount();
-        ReimbursementTypeEnum reimbursementTypeEnum = ReimbursementTypeEnum.getValueByName(cmd.getOrderType());
-        if (ObjectUtils.isEmpty(reimbursementTypeEnum))
-            throw ExceptionUtil.getException(null, "鍗曟嵁绫诲瀷閿欒");
-        //#region 鍔犵浜洪厤缃畾涔�
-        ApproverUserConfigOut signator = ApproverUserConfigOut.builder()
-                .name(WaiMao_VerifyReimbursementServiceImpl.AssigneeEnum.ClaimsEndorser.getName())
-                .note("鍙栭儴闂ㄧ殑鐢ㄦ埛")
-                .isRequired(true)
-                .isMultiSelected(true)
-                .reimbursementCode(orderCode)
-                .fieldName("ClaimsEndorser")
-                .build();
-        ApproverUserConfigOut signatorNotRequired = MapperUtils.INSTANCE.map(ApproverUserConfigOut.class, signator);
-        signatorNotRequired.setIsRequired(false);
-        ApproverUserConfigOut subSchoolLeader = ApproverUserConfigOut.builder()
-                .name(WaiMao_VerifyReimbursementServiceImpl.AssigneeEnum.LeaderEndorser.getName())
-                .note("鍙栬鑹蹭负鈥滃垎绠℃牎棰嗗鈥濈殑鐢ㄦ埛")
-                .isRequired(true)
-                .isMultiSelected(true)
-                .reimbursementCode(orderCode)
-                .fieldName("LeaderEndorser")
-                .build();
-        //#endregion
-        switch (reimbursementTypeEnum) {
-            case DailyReimbursement:
-            case TravelBusinessReimbursement:
-            case DailyReimbursementV5:
-            case TravelBusinessReimbursementV5:
-            case LoanApply:
-            case LoanApplyV5:
-                if (Boolean.TRUE.equals(checkApplyUserEqualsProjectCharge(cmd)) || Boolean.TRUE.equals(checkPayeeEqualsProjectCharge(cmd))) {
-                    list.add(signator);
-                }
-                if (amount.compareTo(Constant.Amount._10W) >= 0)
-                    list.add(subSchoolLeader);
-                break;
-            case SalaryReimbursement:
-                ExtendFieldCmd extendFieldCmd = cmd.getExtendFieldCmd();
-                String extendedField1 = ObjectUtils.isEmpty(extendFieldCmd) ? "" : extendFieldCmd.getExtendedfield1();
-                if (laborCostList.stream().anyMatch(laborCost -> laborCost.equals(extendedField1))) {
-                    Map<String, Boolean> payeeContainingMap = ObjectUtils.isEmpty(extendFieldCmd) ? null : extendFieldCmd.getPayeeContainingMap();
-                    boolean payeeIsProjectCharge = ObjectUtils.isNotEmpty(payeeContainingMap) && payeeContainingMap.get("0");
-                    if (checkApplyUserEqualsProjectCharge(cmd) || payeeIsProjectCharge) {
-                        list.add(signator);
+        if (!addSigner) {
+            List<String> claimsEndorserNoList = cmd.getClaimsEndorserNoList();
+            if (ObjectUtils.isEmpty(claimsEndorserNoList)) {
+                String processInstanceId = cmd.getProcessInstanceId();
+                if (ObjectUtils.isNotEmpty(processInstanceId)) {
+                    try {
+                        String processVariable = flowService.getProcessVariableByProcessInstanceIdAndName(processInstanceId, "model");
+                        JSONObject jsonObject = JSONObject.parseObject(processVariable);
+                        claimsEndorserNoList = jsonObject.getJSONArray("claimsEndorserNoList").toJavaList(String.class);
                     }
+                    catch (Exception ignored) { }
                 }
-                if (amount.compareTo(Constant.Amount._10W) >= 0)
-                    list.add(subSchoolLeader);
-                break;
-            default:
-                break;
+            }
+            addSigner = ObjectUtils.isNotEmpty(claimsEndorserNoList);
         }
-        return list;
+        return addSigner;
     }
 
     @Override
@@ -232,14 +174,18 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
                     throw ExceptionUtil.getException(null, "鍗曟嵁绫诲瀷閿欒");
                 switch (reimbursementTypeEnum) {
                     case DailyReimbursement:
-                    case TravelBusinessReimbursement:
                     case LoanApply:
-                    case SalaryReimbursement:
                     case DailyReimbursementV5:
-                    case TravelBusinessReimbursementV5:
                     case LoanApplyV5:
                         result = dailyReimbursementProcess(cmd);
                         break;
+                    case TravelBusinessReimbursement:
+                    case TravelBusinessReimbursementV5:
+                        result = travelBusinessReimbursementProcess(cmd);
+                        break;
+                    case SalaryReimbursement:
+                        result = salaryProcess(cmd);
+                        break;
                     default:
                         break;
                 }
@@ -257,7 +203,55 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
         List<String> result = new ArrayList<>();
         ExpenseReimbursementCmd model = (ExpenseReimbursementCmd) cmd;
 
-        result.add(AssigneeEnum.ClaimsEndorser.getNodeName());
+        boolean needAddSigner = needAddSigner(model);
+        if (needAddSigner)
+            result.add(AssigneeEnum.ClaimsEndorser.getNodeName());
+
+        List<String> fp3List = ObjectUtils.defaultIfNull(super.getProjectFixedPropertyValueList(instanceId, cmd.getFundsProject(), 3), new ArrayList<>());
+        boolean needBigAmountAudit = fp3List.contains("鏁欒偛鍙戝睍鍩洪噾浼�") ? !"鍩洪噾浼�".equals(cmd.getOrganizationName()) : !fp3List.contains("鍏氳垂");
+        if (needBigAmountAudit) {
+            BigDecimal amount = cmd.getOrderAmount();
+            if (amount.compareTo(Constant.Amount._10W) >= 0)
+                result.add(AssigneeEnum.LeaderEndorser.getNodeName());
+        }
+        result.add(OrderStatusEnum.FINISH.getName());
+        return result;
+    }
+
+    private List<String> travelBusinessReimbursementProcess(ApprovalCmd cmd) {
+        Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
+        List<String> result = new ArrayList<>();
+        ExpenseReimbursementCmd model = (ExpenseReimbursementCmd) cmd;
+
+        boolean needAddSigner = needAddSigner(model);
+        if (needAddSigner)
+            result.add(AssigneeEnum.ClaimsEndorser.getNodeName());
+        BigDecimal amount = cmd.getOrderAmount();
+        if (amount.compareTo(Constant.Amount._10W) >= 0)
+            result.add(AssigneeEnum.LeaderEndorser.getNodeName());
+        result.add(OrderStatusEnum.FINISH.getName());
+        return result;
+    }
+
+    private List<String> salaryProcess(ApprovalCmd cmd) {
+        Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
+        List<String> result = new ArrayList<>();
+        ExpenseReimbursementCmd model = (ExpenseReimbursementCmd) cmd;
+
+        boolean needAddSigner = needAddSigner(model);
+        if (needAddSigner)
+            result.add(AssigneeEnum.ClaimsEndorser.getNodeName());
+
+        List<String> fp3List = ObjectUtils.defaultIfNull(super.getProjectFixedPropertyValueList(instanceId, cmd.getFundsProject(), 3), new ArrayList<>());
+        ExtendFieldCmd extendFieldCmd = cmd.getExtendFieldCmd();
+        String extendedfield1 = ObjectUtils.isEmpty(extendFieldCmd) ? null : extendFieldCmd.getExtendedfield1();
+        boolean needBigAmountAudit = laborCostList.contains(extendedfield1)
+                && (fp3List.contains("鏁欒偛鍙戝睍鍩洪噾浼�") ? !"鍩洪噾浼�".equals(cmd.getOrganizationName()) : !fp3List.contains("鍏氳垂"));
+        if (needBigAmountAudit) {
+            BigDecimal amount = cmd.getOrderAmount();
+            if (amount.compareTo(Constant.Amount._10W) >= 0)
+                result.add(AssigneeEnum.LeaderEndorser.getNodeName());
+        }
         result.add(OrderStatusEnum.FINISH.getName());
         return result;
     }
@@ -265,7 +259,8 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
     @Override
     public List<String> getApproverUserNodeNameList(ExpenseReimbursementCmd cmd) {
         List<String> counterSignerList = Arrays.asList(
-                AssigneeEnum.ClaimsEndorser.getNodeName()
+                AssigneeEnum.ClaimsEndorser.getNodeName(),
+                AssigneeEnum.LeaderEndorser.getNodeName()
         );
         return getApproverUserNodeNameList(cmd, counterSignerList);
     }
@@ -296,20 +291,14 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
                 UserInfoQuery userInfoQuery = UserInfoQuery.builder()
                         .userNo(qry.getUserNo())
                         .userName(qry.getUserName())
-                        .roleName(assigneeEnum.getName())
                         .pageIndex(qry.getPageIndex())
                         .pageSize(qry.getPageSize())
                         .userType(BaseConfigUtil.getUserType(qry.getUserType()))
                         .build();
                 userInfoQuery.setInstanceId(instanceId);
-                Pagination<UserInfoOut> userInfoPage = ExternalDataUtil.INSTANCE.getUserInfoPage(userInfoQuery);
-                List<UserInfoOut> userInfoList = userInfoPage.getRecords();
-                if (ObjectUtils.isNotEmpty(userInfoList))
-                    approverUserSFPOutList = MapperUtils.INSTANCE.mapAsList(ApproverUserSFPOut.class, userInfoList);
-                page.setRecords(approverUserSFPOutList);
-                page.setTotal(userInfoPage.getTotal());
-                page.setPages(userInfoPage.getPages());
-                return Pagination.fromPage(page);
+                if (AssigneeEnum.LeaderEndorser.equals(assigneeEnum))
+                    userInfoQuery.setRoleName(assigneeEnum.getName());
+                return getApproverUserList(userInfoQuery);
             }
             default:
                 break;
@@ -317,13 +306,30 @@ public class WaiMao_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
         return Pagination.fromPage(page);
     }
 
+    @Override
+    public UserContainingVerificationsOut getContainingVerificationUserList(ExpenseReimbursementCmd cmd) {
+        Long instanceId = BaseInOutUtil.verifyInstanceId(cmd);
+        UserContainingVerificationsOut userContainingVerificationsOut = new UserContainingVerificationsOut();
+        List<UserContainingVerificationOut> payeeContainingVerification = new ArrayList<>();
+        //椤圭洰绗竴璐熻矗浜�
+        List<String> projectChargeList = super.getProjectChargeList(cmd);
+        UserContainingVerificationOut payeeContainingProjectCharge = UserContainingVerificationOut.builder()
+                .userType(UserContainingTypeEnum.PROJECT_FIRST_CHARGE.getIndex())
+                .userNoList(projectChargeList)
+                .build();
+        payeeContainingVerification.add(payeeContainingProjectCharge);
+
+        userContainingVerificationsOut.setPayeeContainingVerification(payeeContainingVerification);
+        return userContainingVerificationsOut;
+    }
+
     /**
      * 鑺傜偣
      */
     public enum AssigneeEnum {
 
         ClaimsEndorser("鍔犵浜�", "鍔犵浜哄鎵�"),
-        LeaderEndorser("鍒嗙鏍¢瀵�", "鍒嗙鏍″鎵�")
+        LeaderEndorser("鍒嗙鏍¢瀵�", "鍒嗙鏍¢瀵煎鎵�")
         ;
 
         /**