From 786f439c72374adae5165b8696748316bc70fc15 Mon Sep 17 00:00:00 2001
From: "HAITIAN-TIM\\67349" <chenmin@seaskysh.com>
Date: Mon, 26 Jun 2023 18:35:48 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E5=8A=A0=E7=AD=BE=E4=BA=BA=E6=A0=A1?=
 =?UTF-8?q?=E9=AA=8C=E6=94=B9=E9=80=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../api/IApproverUserController.java          |   3 +
 .../flowportal/api/IExternalController.java   |  23 ++-
 .../approverUser/ApproverUserConfigOut.java   |  48 ++++++
 .../dto/approverUser/ApproverUserSFPOut.java  |  35 +++++
 .../approverUser/ApproverUserSFPQuery.java    |  68 +++++++++
 .../ApproverUserVerifySFPCmd.java             |  60 ++++++++
 .../seasky/flowportal/enums/UserTypeEnum.java |  45 ++++++
 .../flowportal/pojo/ExternalPostPojo.java     |   2 +
 .../controller/ApproverUserController.java    |  12 +-
 .../controller/ExternalController.java        |  36 +++++
 .../service/ApproverUserService.java          |  12 +-
 .../flowportal/service/FlowService.java       |   7 +
 .../service/VerifyReimbursementService.java   |  33 +++-
 .../service/impl/ApproverUserServiceImpl.java | 141 +++++++++++++++--
 ...angWei_VerifyReimbursementServiceImpl.java |  15 ++
 .../impl/ExpenseReimbursementServiceImpl.java |   1 +
 .../service/impl/ExternalDataServiceImpl.java |   1 +
 .../service/impl/FlowServiceImpl.java         |   8 +
 ...JiaoYu_VerifyReimbursementServiceImpl.java |  14 ++
 ...iaoWei_VerifyReimbursementServiceImpl.java | 143 ++++++++++++++++++
 ...hengFa_VerifyReimbursementServiceImpl.java |  28 +++-
 ...XianDa_VerifyReimbursementServiceImpl.java |  15 ++
 ...JiDian_VerifyReimbursementServiceImpl.java |  26 +++-
 .../seasky/flowportal/utils/ApprovalUtil.java |  11 ++
 24 files changed, 746 insertions(+), 41 deletions(-)
 create mode 100644 ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserConfigOut.java
 create mode 100644 ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPOut.java
 create mode 100644 ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPQuery.java
 create mode 100644 ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserVerifySFPCmd.java
 create mode 100644 ServiceSite/facade/src/main/java/com/seasky/flowportal/enums/UserTypeEnum.java

diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IApproverUserController.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IApproverUserController.java
index e47bf3c2..a52e1ab0 100644
--- a/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IApproverUserController.java
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IApproverUserController.java
@@ -1,6 +1,8 @@
 package com.seasky.flowportal.api;
 
 import com.seasky.flowportal.dto.approverUser.ApproverUserCmd;
+import com.seasky.flowportal.dto.approverUser.ApproverUserConfigOut;
+import com.seasky.flowportal.dto.approverUser.ApproverUserSFPQuery;
 import com.seasky.flowportal.dto.approverUser.ApproverUserQuery;
 import com.seasky.flowportal.dto.response.BaseResultModel;
 import com.seasky.flowportal.dto.user.UserInfoOut;
@@ -42,4 +44,5 @@ public interface IApproverUserController {
     @ApiOperation("[Q]04.鏍¢獙鍔犵浜烘槸鍚︽纭�")
     @PostMapping("/CheckIsSelectUser")
     BaseResultModel<String> verifyReimbursementSelectUser(@RequestBody ExpenseReimbursementSFPCmd cmd) throws Exception;
+
 }
diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IExternalController.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IExternalController.java
index 2ef08d16..efaf9c3d 100644
--- a/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IExternalController.java
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/api/IExternalController.java
@@ -1,11 +1,11 @@
 package com.seasky.flowportal.api;
 
-import com.seasky.core.common.Result;
-import com.seasky.flowportal.dto.departmentInfo.DepartmentInfoOut;
-import com.seasky.flowportal.dto.preApplyFinStatus.PreApplyFinStatusCmd;
-import com.seasky.flowportal.dto.preExpenseApply.*;
-import com.seasky.flowportal.dto.projectInfo.ProjectInfoOut;
-import com.seasky.flowportal.dto.projectInfo.ProjectInfoQuery;
+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.approverUser.ApproverUserVerifySFPCmd;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementSFPCmd;
+import com.seasky.flowportal.dto.preExpenseApply.PreExpenseApplyCmd;
 import com.seasky.flowportal.dto.response.BaseResultModel;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -13,8 +13,6 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.multipart.MultipartFile;
 
 @FeignClient("seasky-flow-portal")
 @RequestMapping("External")
@@ -24,4 +22,13 @@ public interface IExternalController {
     @ApiOperation("[C]01.淇濆瓨鍓嶇疆鐢宠鍗�")
     @PostMapping(path = "/SavePreApply")
     BaseResultModel<String> savePreApply(@RequestBody PreExpenseApplyCmd preExpenseApplyCmd);
+
+    @ApiOperation("[Q]01.淇濆瓨鎶ラ攢鍗曚簳鑾峰彇鍔犵浜洪厤缃�")
+    @PostMapping("/ListApproverUserConfig")
+    BaseResultModel<ApproverUserConfigOut> getApproverUserConfigList(@RequestBody ExpenseReimbursementSFPCmd cmd) throws Exception;
+
+    @ApiOperation("[Q]02.鑾峰彇鍔犵浜轰汉鍛樿寖鍥�")
+    @PostMapping("/ListApproverUser")
+    BaseResultModel<ApproverUserSFPOut> getApproverUserList(@RequestBody ApproverUserSFPQuery query) throws Exception;
+
 }
diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserConfigOut.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserConfigOut.java
new file mode 100644
index 00000000..91e5b1a1
--- /dev/null
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserConfigOut.java
@@ -0,0 +1,48 @@
+package com.seasky.flowportal.dto.approverUser;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @author liyulu
+ * @since 2022/1/29
+ */
+@ApiModel("Dto")
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApproverUserConfigOut implements Serializable {
+
+    @ApiModelProperty(value = "鍔犵浜哄悕绉�")
+    private String name;
+
+    @ApiModelProperty(value = "鏄惁蹇呴€�")
+    private Boolean isRequired;
+
+    @ApiModelProperty(value = "鏄惁鍙閫�")
+    private Boolean isMultiSelected;
+
+    @ApiModelProperty(value = "澶氶€変釜鏁帮紝涓虹┖鍒欎笉闄愬埗涓暟")
+    private Integer number;
+
+    @ApiModelProperty(value = "鍔犵浜鸿鏄�")
+    private String note;
+
+    @ApiModelProperty(value = "鍔犵浜哄瓧娈�")
+    private String fieldName;
+
+    @ApiModelProperty(value = "鎶ラ攢鍗曞彿")
+    @JsonProperty(value = "OrderNo")
+    private String reimbursementCode;
+
+}
diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPOut.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPOut.java
new file mode 100644
index 00000000..e89de177
--- /dev/null
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPOut.java
@@ -0,0 +1,35 @@
+package com.seasky.flowportal.dto.approverUser;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @author liyulu
+ * @since 2022/1/29
+ */
+@ApiModel("Dto")
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApproverUserSFPOut implements Serializable {
+
+    @ApiModelProperty(value = "鐢ㄦ埛ID", example = "123")
+    private String userId;
+
+    @ApiModelProperty(value = "鐢ㄦ埛宸ュ彿")
+    private String userNo;
+
+    @ApiModelProperty(value = "鐢ㄦ埛鍚嶇О")
+    private String userName;
+
+}
diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPQuery.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPQuery.java
new file mode 100644
index 00000000..c49ce4f8
--- /dev/null
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserSFPQuery.java
@@ -0,0 +1,68 @@
+package com.seasky.flowportal.dto.approverUser;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.seasky.flowportal.enums.UserTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.io.Serializable;
+
+/**
+ * @author liyulu
+ * @since 2022/1/29
+ */
+@ApiModel("Dto")
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApproverUserSFPQuery implements Serializable {
+
+    @ApiModelProperty(value = "key")
+    @JsonProperty(value = "Key")
+    private String key;
+
+    @ApiModelProperty(value = "token")
+    @JsonProperty(value = "Token")
+    private String token;
+
+    @ApiModelProperty(value = "鍔犵浜哄悕绉�")
+    private String name;
+
+    @ApiModelProperty(value = "鎶ラ攢鍗曞彿")
+    @JsonProperty(value = "OrderNo")
+    private String reimbursementCode;
+
+    @ApiModelProperty(value = "鐢ㄦ埛宸ュ彿锛屾ā绯婃煡璇�")
+    private String userNo;
+
+    @ApiModelProperty(value = "鐢ㄦ埛濮撳悕锛屾ā绯婃煡璇�")
+    private String userName;
+
+    @ApiModelProperty(value = "鐢ㄦ埛绫诲瀷锛�1鏁欏伐銆�2瀛︾敓锛堜笉浼犳煡鎵€鏈夛級")
+    private Integer userType;
+
+    private String userTypeStr;
+
+    public String getUserTypeStr() {
+        userTypeStr = "";
+        if (ObjectUtils.isEmpty(userType))
+            return userTypeStr;
+        UserTypeEnum userTypeEnum = UserTypeEnum.getValueByIndex(userType);
+        userTypeStr = ObjectUtils.isNotEmpty(userTypeEnum) ? userTypeEnum.getName() : userType.toString();
+        return userTypeStr;
+    }
+
+    @Builder.Default
+    private Integer pageSize = 10;
+    @JsonProperty("pageNO")
+    @Builder.Default
+    private Integer pageIndex = 1;
+}
diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserVerifySFPCmd.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserVerifySFPCmd.java
new file mode 100644
index 00000000..59ac52d0
--- /dev/null
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/dto/approverUser/ApproverUserVerifySFPCmd.java
@@ -0,0 +1,60 @@
+package com.seasky.flowportal.dto.approverUser;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.seasky.flowportal.dto.extendData.BorrowerEndorserSFPCmd;
+import com.seasky.flowportal.dto.extendData.ClaimsEndorserSFPCmd;
+import com.seasky.flowportal.dto.extendData.LeaderEndorserSFPCmd;
+import com.seasky.flowportal.dto.extendData.PayInfoSFPCmd;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author liyulu
+ * @since 2022/1/29
+ */
+@ApiModel("Dto")
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApproverUserVerifySFPCmd implements Serializable {
+
+    @ApiModelProperty(value = "key")
+    @JsonProperty(value = "Key")
+    private String key;
+
+    @ApiModelProperty(value = "token")
+    @JsonProperty(value = "Token")
+    private String token;
+
+    @ApiModelProperty(value = "鎶ラ攢鍗曞彿")
+    @JsonProperty(value = "OrderNo")
+    private String reimbursementCode;
+
+    @ApiModelProperty(value = "鍔犵浜哄瓧娈�1")
+    @JsonProperty(value = "ClaimsEndorser")
+    private List<ClaimsEndorserSFPCmd> claimsEndorser;
+
+    @ApiModelProperty(value = "鍔犵浜哄瓧娈�2")
+    @JsonProperty(value = "LeaderEndorser")
+    private List<LeaderEndorserSFPCmd> leaderEndorser;
+
+    @ApiModelProperty(value = "鍔犵浜哄瓧娈�3")
+    @JsonProperty(value = "BorrowerEndorser")
+    private List<BorrowerEndorserSFPCmd> borrowerEndorser;
+}
diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/enums/UserTypeEnum.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/enums/UserTypeEnum.java
new file mode 100644
index 00000000..57eb8a90
--- /dev/null
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/enums/UserTypeEnum.java
@@ -0,0 +1,45 @@
+package com.seasky.flowportal.enums;
+
+/**
+ * @author liyulu
+ * @since 2022/1/5
+ */
+public enum UserTypeEnum {
+
+    FACULTY("鏁欏伐", 1),
+
+    STUDENT("瀛︾敓", 2);
+
+    /**
+     * 鏋氫妇灞炴€ц鏄�
+     */
+    private final String name;
+    private final int index;
+
+    UserTypeEnum(String name, int index) {
+        this.name = name;
+        this.index = index;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public int getIndex() {
+        return this.index;
+    }
+
+    /**
+     * 閫氳繃key 鏌ユ壘鎻忚堪 鏂规硶
+     *
+     * @param index
+     */
+    public static UserTypeEnum getValueByIndex(int index) {
+        for (UserTypeEnum anEnum : UserTypeEnum.values()) {
+            if (anEnum.getIndex() == index) {
+                return anEnum;
+            }
+        }
+        return null;
+    }
+}
diff --git a/ServiceSite/facade/src/main/java/com/seasky/flowportal/pojo/ExternalPostPojo.java b/ServiceSite/facade/src/main/java/com/seasky/flowportal/pojo/ExternalPostPojo.java
index 270ddb32..5be76276 100644
--- a/ServiceSite/facade/src/main/java/com/seasky/flowportal/pojo/ExternalPostPojo.java
+++ b/ServiceSite/facade/src/main/java/com/seasky/flowportal/pojo/ExternalPostPojo.java
@@ -32,6 +32,8 @@ public class ExternalPostPojo extends BaseDto implements Serializable {
 
     private String userName;
 
+    private String userType;
+
     private String organizationID;
 
     private String organizationCode;
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/controller/ApproverUserController.java b/ServiceSite/src/main/java/com/seasky/flowportal/controller/ApproverUserController.java
index 59215996..8c90e89b 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/controller/ApproverUserController.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/controller/ApproverUserController.java
@@ -16,6 +16,7 @@ import com.seasky.flowportal.enums.PortalResponseCode;
 import com.seasky.flowportal.service.ApproverUserService;
 import com.seasky.flowportal.service.VerifyReimbursementService;
 import com.seasky.flowportal.service.factory.VerifyReimbursementFactory;
+import com.seasky.flowportal.utils.ApprovalUtil;
 import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RestController;
@@ -28,11 +29,6 @@ public class ApproverUserController implements IApproverUserController {
     private ApproverUserService approverUserService;
     @Autowired
     private VerifyReimbursementFactory verifyReimbursementFactory;
-    //@Autowired
-    //@Qualifier("XiNanZhengFa_VerifyReimbursementServiceImpl")   //瑗垮崡鏀挎硶
-    //@Qualifier("ShangLiGong_VerifyReimbursementServiceImpl")  //涓婄悊宸�
-    //@Qualifier("XianDa_VerifyReimbursementServiceImpl")         //璐よ揪
-    //private VerifyReimbursementService verifyReimbursementService;
 
     @Override
     public BaseResultModel<String> saveApproverUser(ApproverUserCmd approverUserCmd) {
@@ -58,11 +54,7 @@ public class ApproverUserController implements IApproverUserController {
     @Override
     @SneakyThrows
     public BaseResultModel<String> verifyReimbursementSelectUser(ExpenseReimbursementSFPCmd cmd) {
-        ExpenseReimbursementCmd expenseReimbursementCmd = MapperUtils.INSTANCE.map(ExpenseReimbursementCmd.class, cmd);
-        expenseReimbursementCmd.setExtendFieldCmd(JSONObject.parseObject(cmd.getExtendField(), ExtendFieldCmd.class));
-        int length = expenseReimbursementCmd.getApplicantDepartment().indexOf('-');
-        expenseReimbursementCmd.setOrganizationCode(expenseReimbursementCmd.getApplicantDepartment().substring(0, length));
-        expenseReimbursementCmd.setOrganizationName(expenseReimbursementCmd.getApplicantDepartment().substring(length + 1));
+        ExpenseReimbursementCmd expenseReimbursementCmd = ApprovalUtil.map(cmd);
         //宸ュ巶绫诲垱寤哄搴斿璞�
         VerifyReimbursementService verifyReimbursementService = verifyReimbursementFactory.createInstance();
         return ok(PortalResponseCode.SUCCESS, verifyReimbursementService.verifyReimbursementSelectUser(expenseReimbursementCmd));
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/controller/ExternalController.java b/ServiceSite/src/main/java/com/seasky/flowportal/controller/ExternalController.java
index 29d77858..5fed80bf 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/controller/ExternalController.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/controller/ExternalController.java
@@ -1,10 +1,20 @@
 package com.seasky.flowportal.controller;
 
 import com.seasky.flowportal.api.IExternalController;
+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.approverUser.ApproverUserVerifySFPCmd;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementCmd;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementSFPCmd;
 import com.seasky.flowportal.dto.preExpenseApply.PreExpenseApplyCmd;
 import com.seasky.flowportal.dto.response.BaseResultModel;
 import com.seasky.flowportal.enums.PortalResponseCode;
+import com.seasky.flowportal.service.ApproverUserService;
 import com.seasky.flowportal.service.PreExpenseApplyService;
+import com.seasky.flowportal.service.VerifyReimbursementService;
+import com.seasky.flowportal.service.factory.VerifyReimbursementFactory;
+import com.seasky.flowportal.utils.ApprovalUtil;
 import com.seasky.flowportal.utils.PortalUtil;
 import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +29,14 @@ public class ExternalController implements IExternalController {
     @Lazy
     private PreExpenseApplyService preExpenseApplyService;
 
+    @Autowired
+    @Lazy
+    private ApproverUserService approverUserService;
+
+    @Autowired
+    @Lazy
+    private VerifyReimbursementFactory verifyReimbursementFactory;
+
     @Override
     @SneakyThrows
     public BaseResultModel<String> savePreApply(PreExpenseApplyCmd preExpenseApplyCmd) {
@@ -26,4 +44,22 @@ public class ExternalController implements IExternalController {
         return ok(PortalResponseCode.SUCCESS, preExpenseApplyService.savePreExpenseApply(preExpenseApplyCmd));
     }
 
+
+
+    @Override
+    @SneakyThrows
+    public BaseResultModel<ApproverUserConfigOut> getApproverUserConfigList(ExpenseReimbursementSFPCmd cmd) {
+        PortalUtil.verifyToken(cmd.getKey(), cmd.getToken());
+        ExpenseReimbursementCmd expenseReimbursementCmd = ApprovalUtil.map(cmd);
+        return ok(PortalResponseCode.SUCCESS, approverUserService.getApproverUserConfigList(expenseReimbursementCmd));
+    }
+
+    @Override
+    @SneakyThrows
+    public BaseResultModel<ApproverUserSFPOut> getApproverUserList(ApproverUserSFPQuery query) {
+        PortalUtil.verifyToken(query.getKey(), query.getToken());
+        return ok(PortalResponseCode.SUCCESS, approverUserService.getApproverUserList(query));
+    }
+
+
 }
\ No newline at end of file
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/ApproverUserService.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/ApproverUserService.java
index c745c1d4..4f1e5467 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/ApproverUserService.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/ApproverUserService.java
@@ -1,10 +1,12 @@
 package com.seasky.flowportal.service;
 
 import com.seasky.core.common.Pagination;
-import com.seasky.flowportal.dto.approverUser.ApproverUserCmd;
-import com.seasky.flowportal.dto.approverUser.ApproverUserOut;
-import com.seasky.flowportal.dto.approverUser.ApproverUserQuery;
+import com.seasky.flowportal.dto.approverUser.*;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementCmd;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementSFPCmd;
+import com.seasky.flowportal.dto.response.BaseResultModel;
 import com.seasky.flowportal.dto.user.UserInfoOut;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -15,4 +17,8 @@ public interface ApproverUserService {
     Pagination<UserInfoOut>  listApproverUser(ApproverUserQuery approverUserQuery);
 
     List<ApproverUserOut> listApproverUserByApplyCodeAndOrderStatus(String applyCode, String orderStatus);
+
+    List<ApproverUserConfigOut> getApproverUserConfigList(ExpenseReimbursementCmd cmd);
+
+    Pagination<ApproverUserSFPOut> getApproverUserList(ApproverUserSFPQuery query);
 }
\ No newline at end of file
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/FlowService.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/FlowService.java
index d22c8446..6574d8d0 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/FlowService.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/FlowService.java
@@ -202,6 +202,13 @@ public abstract class FlowService {
      */
     public abstract ProcessDefinitionOut getProcessDefinitionInfo(String processInstanceId);
 
+    /**
+     * 鑾峰彇鍗曚釜娴佺▼瀹氫箟淇℃伅
+     * @param processDefinitionKey
+     * @return
+     */
+    public abstract ProcessDefinitionOut getProcessDefinitionInfoByKey(String processDefinitionKey);
+
     public abstract String getProcessVariableByProcessInstanceIdAndName(String processInstanceId, String variableName);
 
     //public abstract FlowEngineEnum GetFlowEngine() { return FlowEngineEnum.MyApps; }
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 e9fa76e4..ee894b9c 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/VerifyReimbursementService.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/VerifyReimbursementService.java
@@ -1,8 +1,13 @@
 package com.seasky.flowportal.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.seasky.core.common.Pagination;
+import com.seasky.core.ddd.utils.MapperUtils;
 import com.seasky.core.util.ExceptionUtil;
 import com.seasky.flowportal.dto.approval.ApprovalCmd;
+import com.seasky.flowportal.dto.approverUser.ApproverUserSFPOut;
+import com.seasky.flowportal.dto.approverUser.ApproverUserSFPQuery;
+import com.seasky.flowportal.dto.approverUser.ApproverUserVerifySFPCmd;
 import com.seasky.flowportal.dto.departmentInfo.DepartmentInfoOut;
 import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementCmd;
 import com.seasky.flowportal.dto.preExpenseApply.PreExpenseApplyCmd;
@@ -27,13 +32,31 @@ public abstract class VerifyReimbursementService {
     @Autowired
     protected ExternalDataService externalDataService;
 
-    public String verifyReimbursementSelectUser(ExpenseReimbursementCmd expenseReimbursementCmd) {
-        return "";
-    }
+    public String verifyReimbursementSelectUser(ExpenseReimbursementCmd expenseReimbursementCmd) { return ""; }
+
     public String verifyPreExpenseApplySelectUser(PreExpenseApplyCmd preExpenseApplyCmd) { return ""; }
     public String verifyReimbursementFlow(ExpenseReimbursementCmd cmd) { return ""; }
-
-
+    public String getAssigneeNameByNodeName(String nodeName) { return ""; }
+    public List<String> getApproverUserNodeNameList(ExpenseReimbursementCmd expenseReimbursementCmd) { return new ArrayList<>(); }
+    public Pagination<ApproverUserSFPOut> getApproverUserList(ApproverUserSFPQuery query) {
+        List<ApproverUserSFPOut> approverUserSFPOutList = new ArrayList<>();
+        Page page = new Page<>(query.getPageIndex(), query.getPageSize());
+        UserInfoQuery userInfoQuery = UserInfoQuery.builder()
+                .userNo(query.getUserNo())
+                .userName(query.getUserName())
+                .pageIndex(query.getPageIndex())
+                .pageSize(query.getPageSize())
+                .userType(query.getUserTypeStr())
+                .build();
+        Pagination<UserInfoOut> userInfoPage = externalDataService.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);
+    }
 
     //鏍¢獙鎶ラ攢浜烘槸鍚︾瓑浜庨」鐩儴闂ㄨ礋璐d汉
     public Boolean checkApplyUserEqualsOrgCharge(ApprovalCmd cmd) {
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ApproverUserServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ApproverUserServiceImpl.java
index 5eae6cec..3b0d94b3 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ApproverUserServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ApproverUserServiceImpl.java
@@ -1,47 +1,73 @@
 package com.seasky.flowportal.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.seasky.core.common.Pagination;
+import com.seasky.core.common.ResponseCode;
+import com.seasky.core.common.Result;
 import com.seasky.core.ddd.utils.MapperUtils;
 import com.seasky.core.util.ExceptionUtil;
+import com.seasky.flow.api.IRepositoryController;
+import com.seasky.flow.dto.flow.FlowNode;
+import com.seasky.flow.dto.processDefinition.ProcessDefinitionOut;
+import com.seasky.flow.dto.repository.RepositoryQueryQry;
+import com.seasky.flowportal.config.BaseConfigProperties;
 import com.seasky.flowportal.domain.po.ApproverUserPo;
-import com.seasky.flowportal.dto.approverUser.ApproverUserCmd;
-import com.seasky.flowportal.dto.approverUser.ApproverUserOut;
-import com.seasky.flowportal.dto.approverUser.ApproverUserQuery;
+import com.seasky.flowportal.domain.po.ExpenseReimbursementPo;
+import com.seasky.flowportal.dto.approverUser.*;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementCmd;
 import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementOut;
 import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementQuery;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementSFPCmd;
+import com.seasky.flowportal.dto.projectInfo.ProjectInfoOut;
 import com.seasky.flowportal.dto.user.UserInfoOut;
+import com.seasky.flowportal.enums.ApplyCategoryEnum;
+import com.seasky.flowportal.enums.OrderStatusEnum;
+import com.seasky.flowportal.enums.PortalResponseCode;
 import com.seasky.flowportal.mapper.ApproverUserMapper;
-import com.seasky.flowportal.service.ApproverUserService;
-import com.seasky.flowportal.service.ExpenseReimbursementService;
-import com.seasky.flowportal.service.ExternalDataService;
-import com.seasky.flowportal.service.FlowService;
+import com.seasky.flowportal.mapper.ExpenseReimbursementMapper;
+import com.seasky.flowportal.service.*;
+import com.seasky.flowportal.service.factory.VerifyReimbursementFactory;
+import com.seasky.flowportal.utils.BaseConfigUtil;
+import org.activiti.bpmn.model.ExtensionAttribute;
 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.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.seasky.flowportal.dto.response.PortalResponse.ok;
+
 @Service
 public class ApproverUserServiceImpl implements ApproverUserService {
     @Autowired
+    @Lazy
     private ApproverUserMapper approverUserMapper;
 
     @Autowired
+    @Lazy
     private ExternalDataService externalDataService;
 
     @Autowired
+    @Lazy
     private FlowService flowService;
 
     @Autowired
+    @Lazy
     private ExpenseReimbursementService expenseReimbursementService;
 
+    @Autowired
+    @Lazy
+    private VerifyReimbursementFactory verifyReimbursementFactory;
+
+    @Autowired
+    @Lazy
+    private ExpenseReimbursementMapper expenseReimbursementMapper;
+
     @Override
     public String saveApproverUser(ApproverUserCmd approverUserCmd) {
         if (ObjectUtils.isNotEmpty(approverUserCmd.getUserNo())) {
@@ -109,4 +135,97 @@ public class ApproverUserServiceImpl implements ApproverUserService {
         List<ApproverUserPo> approverUserPoList = approverUserMapper.selectList(queryWrapper);
         return MapperUtils.INSTANCE.mapAsList(ApproverUserOut.class, approverUserPoList);
     }
+
+    @Override
+    public List<ApproverUserConfigOut> getApproverUserConfigList(ExpenseReimbursementCmd cmd) {
+        if (ObjectUtils.isEmpty(cmd.getReimbursementCode()))
+            throw ExceptionUtil.getException(ResponseCode.DATA_VERIFY_EXCEPTION, "鍗曞彿涓嶈兘涓虹┖");
+        QueryWrapper<ExpenseReimbursementPo> expenseReimbursementQueryWrapper = new QueryWrapper<>();
+        expenseReimbursementQueryWrapper.eq("reimbursement_code", cmd.getReimbursementCode());
+        expenseReimbursementQueryWrapper.eq("order_status", OrderStatusEnum.NOTAPPLY.getName());
+        ExpenseReimbursementPo reimbursementPo = expenseReimbursementMapper.selectOne(expenseReimbursementQueryWrapper);
+        Long id = ObjectUtils.isNotEmpty(reimbursementPo) ? reimbursementPo.getId() : null;
+        cmd.setOrderStatus(OrderStatusEnum.NOTAPPLY.getName());
+        reimbursementPo = MapperUtils.INSTANCE.map(ExpenseReimbursementPo.class, cmd);
+        reimbursementPo.setPayInfoJson(JSON.toJSONString(cmd.getPayInfo()));
+        reimbursementPo.setBackCount(0);
+        if (ObjectUtils.isEmpty(id)) {
+            expenseReimbursementMapper.insert(reimbursementPo);
+        } else {
+            reimbursementPo.setId(id);
+            expenseReimbursementMapper.updateById(reimbursementPo);
+        }
+        BaseConfigProperties baseConfigProperties = BaseConfigUtil.getBaseConfigProperties();
+        String defKey = baseConfigProperties.getProcessDefinitionMap().get(cmd.getReimbursementType());
+        if (ObjectUtils.isEmpty(defKey)) {
+            throw ExceptionUtil.getException(null, "鑾峰彇鍔犵浜洪厤缃け璐ワ紝鏈尮閰嶇殑娴佺▼瀹氫箟锛�" + cmd.getReimbursementType());
+        }
+        ProcessDefinitionOut processDefinitionInfo = flowService.getProcessDefinitionInfoByKey(defKey);
+        List<FlowNode> approverNodeList = new ArrayList<>();
+        List<FlowNode> flowNodeList = processDefinitionInfo.getFlowNodeList();
+        if (ObjectUtils.isNotEmpty(flowNodeList))
+            approverNodeList = flowNodeList.stream().filter(node ->
+                    Boolean.parseBoolean(getExtensionAttributeValue(node, "isPreSelectApprover"))
+            ).collect(Collectors.toList());
+        approverNodeList = approverNodeList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
+                -> new TreeSet<>(Comparator.comparing(FlowNode:: getName))), ArrayList::new));
+
+        List<ApproverUserConfigOut> approverUserConfigOutList = new ArrayList<>();
+        try {
+            //宸ュ巶绫诲垱寤哄搴斿璞�
+            VerifyReimbursementService verifyReimbursementService = verifyReimbursementFactory.createInstance();
+            List<String> approverUserNodeNameList = verifyReimbursementService.getApproverUserNodeNameList(cmd);
+            for (FlowNode node : approverNodeList) {
+                if (!approverUserNodeNameList.contains(node.getName()))
+                    continue;
+                String assigneeName = verifyReimbursementService.getAssigneeNameByNodeName(node.getName());
+                ApproverUserConfigOut approverUserConfigOut = ApproverUserConfigOut.builder()
+                        .name(ObjectUtils.isEmpty(assigneeName) ? node.getName() : assigneeName)
+                        .note(node.getDocumentation())
+                        .isRequired(false)
+                        .isMultiSelected(false)
+                        .reimbursementCode(cmd.getReimbursementCode())
+                        .build();
+                approverUserConfigOut.setIsRequired(Boolean.parseBoolean(getExtensionAttributeValue(node, "isMustSelectApprover")));
+                approverUserConfigOut.setIsMultiSelected(Boolean.parseBoolean(getExtensionAttributeValue(node, "isSelectApprovers")));
+                approverUserConfigOut.setNumber(Integer.parseInt(getExtensionAttributeValue(node, "selectApproverNumber")));
+                String assignee = node.getAssignee();
+                if (assignee.contains("claimsEndorser"))
+                    approverUserConfigOut.setFieldName("ClaimsEndorser");
+                if (assignee.contains("leaderEndorser"))
+                    approverUserConfigOut.setFieldName("LeaderEndorser");
+                if (assignee.contains("borrowerEndorser"))
+                    approverUserConfigOut.setFieldName("BorrowerEndorser");
+                approverUserConfigOutList.add(approverUserConfigOut);
+            }
+        } catch (Exception e) {
+            throw ExceptionUtil.getException(null, "鑾峰彇鍔犵浜洪厤缃け璐�");
+        }
+        return approverUserConfigOutList;
+    }
+
+    private String getExtensionAttributeValue(FlowNode node, String key) {
+        Map<String, List<ExtensionAttribute>> attributesMap = node.getAttributes();
+        if (ObjectUtils.isEmpty(attributesMap))
+            return "";
+        List<ExtensionAttribute> attributes = attributesMap.get(key);
+        if (ObjectUtils.isEmpty(attributes))
+            return "";
+        ExtensionAttribute attribute = attributes.get(0);
+        if (ObjectUtils.isEmpty(attribute))
+            return "";
+        return ObjectUtils.defaultIfNull(attribute.getValue(), "");
+    }
+
+    @Override
+    public Pagination<ApproverUserSFPOut> getApproverUserList(ApproverUserSFPQuery query) {
+        try {
+            //宸ュ巶绫诲垱寤哄搴斿璞�
+            VerifyReimbursementService verifyReimbursementService = verifyReimbursementFactory.createInstance();
+            return verifyReimbursementService.getApproverUserList(query);
+        } catch (Exception e) {
+            throw ExceptionUtil.getException(null, "鑾峰彇鍔犵浜轰汉鍛樿寖鍥村け璐�");
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/DangWei_VerifyReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/DangWei_VerifyReimbursementServiceImpl.java
index 053159e2..da22e84d 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/DangWei_VerifyReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/DangWei_VerifyReimbursementServiceImpl.java
@@ -120,6 +120,13 @@ public class DangWei_VerifyReimbursementServiceImpl extends VerifyReimbursementS
                 throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_DEL_FAILURE, "閫夋嫨鐨�" + assigneeName + "鑼冨洿涓嶆纭紝璇烽噸鏂伴€夋嫨鍚庢彁浜わ紒");
         }
     }
+
+    @Override
+    public String getAssigneeNameByNodeName(String nodeName) {
+        AssigneeEnum assigneeEnum = AssigneeEnum.getValueByNodeName(nodeName);
+        return ObjectUtils.isEmpty(assigneeEnum) ? "" : assigneeEnum.getName();
+    }
+
     /**缁忚垂绫诲瀷*/
     public enum FundsTypeEnum {
         CommunalExpense("鍏敤缁忚垂"),
@@ -251,5 +258,13 @@ public class DangWei_VerifyReimbursementServiceImpl extends VerifyReimbursementS
         public String getNodeName(){
             return  this.nodeName;
         }
+        public static AssigneeEnum getValueByNodeName(String nodeName) {
+            for (AssigneeEnum anEnum : AssigneeEnum.values()) {
+                if (anEnum.getNodeName().equals(nodeName)) {
+                    return anEnum;
+                }
+            }
+            return null;
+        }
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExpenseReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExpenseReimbursementServiceImpl.java
index 10557923..6d61427a 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExpenseReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExpenseReimbursementServiceImpl.java
@@ -1262,6 +1262,7 @@ public class ExpenseReimbursementServiceImpl implements ExpenseReimbursementServ
         if (ObjectUtils.isNotEmpty(expenseReimbursementPo)
                 && !OrderStatusEnum.BACK.getName().equals(expenseReimbursementPo.getOrderStatus())
                 && !OrderStatusEnum.FINISH.getName().equals(expenseReimbursementPo.getOrderStatus())
+                && !OrderStatusEnum.NOTAPPLY.getName().equals(expenseReimbursementPo.getOrderStatus())
                 && !finstatus) {
             cmd.setId(expenseReimbursementPo.getId());
             cmd.setProcessInstanceId(expenseReimbursementPo.getProcessInstanceId());
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExternalDataServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExternalDataServiceImpl.java
index a02dfaf6..aab619e6 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExternalDataServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ExternalDataServiceImpl.java
@@ -166,6 +166,7 @@ public class ExternalDataServiceImpl implements ExternalDataService {
         baseExternalPost.setPageSize(userInfoQuery.getPageSize());
         baseExternalPost.setUserNo(userInfoQuery.getUserNo());
         baseExternalPost.setUserName(userInfoQuery.getUserName());
+        baseExternalPost.setUserType(userInfoQuery.getUserType());
         baseExternalPost.setRoleID(userInfoQuery.getRoleId());
         String response = HttpUtil.post(BaseConfigUtil.getInterfaceUrl(InterfaceUrlConstant.BASE_DATA_LIST_USER_INFO), JSON.toJSONString(baseExternalPost), timeout);
         JSONObject userJsonObj = JSONObject.parseObject(response);
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/FlowServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/FlowServiceImpl.java
index b3c9efdd..5820a7f4 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/FlowServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/FlowServiceImpl.java
@@ -822,6 +822,13 @@ public class FlowServiceImpl extends FlowService {
             throw ExceptionUtil.getException(null, processInstanceResult.getDescription());
         }
         String processDefinitionKey = processInstanceResult.getData().get(0).getProcessDefinitionKey();
+        processDefinitionInfo = getProcessDefinitionInfoByKey(processDefinitionKey);
+        return processDefinitionInfo;
+    }
+
+    @Override
+    public ProcessDefinitionOut getProcessDefinitionInfoByKey(String processDefinitionKey) {
+        ProcessDefinitionOut processDefinitionInfo = null;
         Result<ProcessDefinitionOut> processDefinitionResult = iRepositoryController.getProcessDefinitionByKey(RepositoryQueryQry.builder().processDefinitionKey(processDefinitionKey).build());
         if (ObjectUtils.isNotEmpty(processDefinitionResult) && ObjectUtils.isNotEmpty(processDefinitionResult.getData())) {
             processDefinitionInfo = processDefinitionResult.getData().get(0);
@@ -829,6 +836,7 @@ public class FlowServiceImpl extends FlowService {
         return processDefinitionInfo;
     }
 
+
     @Override
     public String getProcessVariableByProcessInstanceIdAndName(String processInstanceId, String variableName) {
         ProcessQueryQry processQueryQry = new ProcessQueryQry();
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoShiJiaoYu_VerifyReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoShiJiaoYu_VerifyReimbursementServiceImpl.java
index 1b5f8846..b3399bef 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoShiJiaoYu_VerifyReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoShiJiaoYu_VerifyReimbursementServiceImpl.java
@@ -105,6 +105,12 @@ public class JiaoShiJiaoYu_VerifyReimbursementServiceImpl extends VerifyReimburs
             throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_DEL_FAILURE, "閫夋嫨鐨�" + assigneeName + "鑼冨洿涓嶆纭紝璇烽噸鏂伴€夋嫨鍚庢彁浜わ紒");
     }
 
+    @Override
+    public String getAssigneeNameByNodeName(String nodeName) {
+        AssigneeEnum assigneeEnum = AssigneeEnum.getValueByNodeName(nodeName);
+        return ObjectUtils.isEmpty(assigneeEnum) ? "" : assigneeEnum.getName();
+    }
+
     /**鑺傜偣*/
     public enum AssigneeEnum {
         OriginalUnitSubLeader("鍘熷崟浣嶅垎绠¢瀵�", "鍘熷崟浣嶅垎绠¢瀵�"),
@@ -129,5 +135,13 @@ public class JiaoShiJiaoYu_VerifyReimbursementServiceImpl extends VerifyReimburs
         public String getNodeName(){
             return  this.nodeName;
         }
+        public static AssigneeEnum getValueByNodeName(String nodeName) {
+            for (AssigneeEnum anEnum : AssigneeEnum.values()) {
+                if (anEnum.getNodeName().equals(nodeName)) {
+                    return anEnum;
+                }
+            }
+            return null;
+        }
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoWei_VerifyReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoWei_VerifyReimbursementServiceImpl.java
index da90f375..d9312258 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoWei_VerifyReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/JiaoWei_VerifyReimbursementServiceImpl.java
@@ -4,24 +4,41 @@ import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.core.util.HttpUtil;
+import com.seasky.flow.dto.flow.FlowNode;
+import com.seasky.flow.dto.processDefinition.ProcessDefinitionOut;
 import com.seasky.flowportal.config.BaseConfigProperties;
+import com.seasky.flowportal.domain.po.ExpenseReimbursementPo;
+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.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.ReimbursementTypeEnum;
+import com.seasky.flowportal.mapper.ExpenseReimbursementMapper;
 import com.seasky.flowportal.service.VerifyReimbursementService;
 import com.seasky.flowportal.utils.BaseConfigUtil;
 import com.seasky.flowportal.utils.PortalUtil;
 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;
+import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.TreeSet;
 import java.util.stream.Collectors;
 
 /**
@@ -32,6 +49,10 @@ import java.util.stream.Collectors;
 @Slf4j
 public class JiaoWei_VerifyReimbursementServiceImpl extends VerifyReimbursementService {
 
+    @Autowired
+    @Lazy
+    private ExpenseReimbursementMapper expenseReimbursementMapper;
+
     @Override
     public String verifyReimbursementSelectUser(ExpenseReimbursementCmd expenseReimbursementCmd) {
 
@@ -126,6 +147,112 @@ public class JiaoWei_VerifyReimbursementServiceImpl extends VerifyReimbursementS
                 throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_DEL_FAILURE, "閫夋嫨鐨�" + assigneeName + "鑼冨洿涓嶆纭紝璇烽噸鏂伴€夋嫨鍚庢彁浜わ紒");
         }
     }
+
+
+    @Override
+    public String getAssigneeNameByNodeName(String nodeName) {
+        AssigneeEnum assigneeEnum = AssigneeEnum.getValueByNodeName(nodeName);
+        return ObjectUtils.isEmpty(assigneeEnum) ? "" : assigneeEnum.getName();
+    }
+
+    @Override
+    public List<String> getApproverUserNodeNameList(ExpenseReimbursementCmd cmd) {
+        log.info(JSONObject.toJSONString(BeanUtil.beanToMap(cmd)));
+        List<String> nodeNameList = new ArrayList<>();
+        ReimbursementTypeEnum reimbursementTypeEnum = ReimbursementTypeEnum.getValueByName(cmd.getReimbursementType());
+        if (ObjectUtils.isEmpty(reimbursementTypeEnum))
+            throw ExceptionUtil.getException(null, "鎶ラ攢绫诲瀷閿欒");
+        switch (reimbursementTypeEnum) {
+            case DailyReimbursement:
+            case TravelBusinessReimbursement:
+            case LoanApply: {
+                String eP3_FundsType = getProjectExtendPropertyValue(cmd.getFundsProject(), 3);
+                if (ObjectUtils.isEmpty(eP3_FundsType))
+                    throw ExceptionUtil.getException(null, "鏈煡璇㈠埌缁忚垂绫诲瀷锛岄」鐩紪鍙凤細" + cmd.getFundsProject());
+                FundsTypeEnum fundsTypeEnum = FundsTypeEnum.getValueByName(eP3_FundsType);
+                if (ObjectUtils.isEmpty(fundsTypeEnum))
+                    break;
+                boolean isCommunalExpense = FundsTypeEnum.CommunalExpense.equals(fundsTypeEnum);
+                if (isCommunalExpense) {
+                    String eP0_ReimbursementContent = getProjectExtendPropertyValue(cmd.getFundsProject(), 0);
+                    if (ObjectUtils.isEmpty(eP0_ReimbursementContent))
+                        throw ExceptionUtil.getException(null, "鏈煡璇㈠埌鎶ラ攢鍐呭锛岄」鐩紪鍙凤細" + cmd.getFundsProject());
+                    ReimbursementContentEnum reimbursementContentEnum = ReimbursementContentEnum.getValueByName(eP0_ReimbursementContent);
+                    if (ObjectUtils.isEmpty(reimbursementContentEnum))
+                        break;
+                    switch (reimbursementContentEnum) {
+                        case OfficeExpense:
+                        case OfficialVehicle:
+                        case WelfareExpense_Other:
+                        case RetireeBenefitAndActivityExpense:
+                        case ConferenceFee:
+                        case OfficialReception:
+                            nodeNameList.add(AssigneeEnum.SubCommitteeLeader.getNodeName());
+                            break;
+                        case TrainingFee:
+                            if (cmd.getReimbursementAmount().compareTo(BigDecimal.valueOf(20000)) >= 0)
+                                nodeNameList.add(AssigneeEnum.SubCommitteeLeader.getNodeName());
+                            break;
+                        case WelfareExpense_ChildcareOverhead:
+                            if (checkApplyUserEqualsApplyOrgCharge(cmd))
+                                nodeNameList.add(AssigneeEnum.SubCommitteeLeader.getNodeName());
+                            break;
+                    }
+                    break;
+                }
+
+                switch (fundsTypeEnum) {
+                    case RecurringItem:
+                        nodeNameList.add(AssigneeEnum.SubCommitteeLeader.getNodeName());
+                        break;
+                    case OrgDailyOperatingExpense:
+                        if (cmd.getReimbursementAmount().compareTo(BigDecimal.valueOf(5000)) > 0)
+                            nodeNameList.add(AssigneeEnum.SubCommitteeLeader.getNodeName());
+                        break;
+                }
+                break;
+            }
+            default:
+                break;
+        }
+        return nodeNameList;
+    }
+
+    @Override
+    public Pagination<ApproverUserSFPOut> getApproverUserList(ApproverUserSFPQuery query) {
+        if (ObjectUtils.isEmpty(query.getReimbursementCode()))
+            throw ExceptionUtil.getException(ResponseCode.DATA_VERIFY_EXCEPTION, "鍗曞彿涓嶈兘涓虹┖");
+        QueryWrapper<ExpenseReimbursementPo> expenseReimbursementQueryWrapper = new QueryWrapper<>();
+        expenseReimbursementQueryWrapper.eq("reimbursement_code", query.getReimbursementCode());
+        expenseReimbursementQueryWrapper.eq("order_status", OrderStatusEnum.NOTAPPLY.getName());
+        ExpenseReimbursementPo reimbursementPo = expenseReimbursementMapper.selectOne(expenseReimbursementQueryWrapper);
+        if (ObjectUtils.isEmpty(reimbursementPo))
+            throw ExceptionUtil.getException(ResponseCode.DATA_VERIFY_EXCEPTION, "鏈煡璇㈠埌鍗曟嵁淇℃伅锛屽崟鍙凤細" + query.getReimbursementCode());
+        ReimbursementTypeEnum reimbursementTypeEnum = ReimbursementTypeEnum.getValueByName(reimbursementPo.getReimbursementType());
+        if (ObjectUtils.isEmpty(reimbursementTypeEnum))
+            throw ExceptionUtil.getException(null, "鎶ラ攢绫诲瀷閿欒");
+
+        AssigneeEnum assigneeEnum = AssigneeEnum.getValueByName(query.getName());
+        if (ObjectUtils.isEmpty(assigneeEnum))
+            throw ExceptionUtil.getException(null, "鍔犵浜虹被鍨嬮敊璇�");
+
+        List<ApproverUserSFPOut> approverUserSFPOutList = new ArrayList<>();
+        Page page = new Page<>(query.getPageIndex(), query.getPageSize());
+        switch (reimbursementTypeEnum) {
+            case DailyReimbursement:
+            case TravelBusinessReimbursement:
+            case LoanApply: {
+                switch (assigneeEnum) {
+                    case SubCommitteeLeader:
+                    default:
+                        return super.getApproverUserList(query);
+                }
+            }
+            default:
+                break;
+        }
+        return Pagination.fromPage(page);
+    }
     /**缁忚垂绫诲瀷*/
     public enum FundsTypeEnum {
         CommunalExpense("鍏敤缁忚垂"),
@@ -224,5 +351,21 @@ public class JiaoWei_VerifyReimbursementServiceImpl extends VerifyReimbursementS
         public String getNodeName(){
             return  this.nodeName;
         }
+        public static AssigneeEnum getValueByNodeName(String nodeName) {
+            for (AssigneeEnum anEnum : AssigneeEnum.values()) {
+                if (anEnum.getNodeName().equals(nodeName)) {
+                    return anEnum;
+                }
+            }
+            return null;
+        }
+        public static AssigneeEnum getValueByName(String name) {
+            for (AssigneeEnum anEnum : AssigneeEnum.values()) {
+                if (anEnum.getName().equals(name)) {
+                    return anEnum;
+                }
+            }
+            return null;
+        }
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XiNanZhengFa_VerifyReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XiNanZhengFa_VerifyReimbursementServiceImpl.java
index d35edd5d..0ef198a2 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XiNanZhengFa_VerifyReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XiNanZhengFa_VerifyReimbursementServiceImpl.java
@@ -111,6 +111,14 @@ public class XiNanZhengFa_VerifyReimbursementServiceImpl extends VerifyReimburse
             }
         }
     }
+
+    @Override
+    public String getAssigneeNameByNodeName(String nodeName) {
+        AssigneeEnum assigneeEnum = AssigneeEnum.getValueByNodeName(nodeName);
+        return ObjectUtils.isEmpty(assigneeEnum) ? "" : assigneeEnum.getName();
+    }
+
+
     //璧勯噾鎬ц川
     public enum Reserved1Enum {
         Flow1("娴佺▼1"),
@@ -158,19 +166,35 @@ public class XiNanZhengFa_VerifyReimbursementServiceImpl extends VerifyReimburse
 
     //鑺傜偣
     public enum AssigneeEnum {
-        SubjectLeaderOrInstructor("瀛︾甯﹀ご浜烘垨鎸囧鑰佸笀")
+        SubjectLeaderOrInstructor("瀛︾甯﹀ご浜烘垨鎸囧鑰佸笀", "瀛︾甯﹀ご浜烘垨鎸囧鑰佸笀"),
+        SubjectLeader("瀛︾甯﹀ご浜�", "瀛︾甯﹀ご浜�"),
+        Instructor("鎸囧鑰佸笀", "鎸囧鑰佸笀")
         ;
 
         /**
          * 鏋氫妇灞炴€ц鏄�
          */
         private final String name;
-        AssigneeEnum(String name) {
+        private final String nodeName;
+
+        AssigneeEnum(String name, String nodeName) {
             this.name = name;
+            this.nodeName = nodeName;
         }
 
         public String getName(){
             return  this.name;
         }
+        public String getNodeName(){
+            return  this.nodeName;
+        }
+        public static AssigneeEnum getValueByNodeName(String nodeName) {
+            for (AssigneeEnum anEnum : AssigneeEnum.values()) {
+                if (anEnum.getNodeName().equals(nodeName)) {
+                    return anEnum;
+                }
+            }
+            return null;
+        }
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XianDa_VerifyReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XianDa_VerifyReimbursementServiceImpl.java
index 7cc18dd8..06d33768 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XianDa_VerifyReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/XianDa_VerifyReimbursementServiceImpl.java
@@ -208,6 +208,13 @@ public class XianDa_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
             //return PortalResponse.ok(PortalResponseCode.INCOMPLETE_INFO, "闇€瑕佷竴涓�" + assigneeName + "瀹℃壒锛岃閲嶆柊閫夋嫨鍚庢彁浜わ紒");
             throw ExceptionUtil.getException(ResponseCode.SERVER_INTERNAL_TOKEN_DEL_FAILURE, "閫夋嫨鐨�" + assigneeName + "鑼冨洿涓嶆纭紝璇烽噸鏂伴€夋嫨鍚庢彁浜わ紒");
     }
+
+    @Override
+    public String getAssigneeNameByNodeName(String nodeName) {
+        AssigneeEnum assigneeEnum = AssigneeEnum.getValueByNodeName(nodeName);
+        return ObjectUtils.isEmpty(assigneeEnum) ? "" : assigneeEnum.getName();
+    }
+
     /**瑙掕壊*/
     public enum RoleEnum {
         SubSchoolLeader("鍒嗙鏍¢瀵�"),
@@ -267,5 +274,13 @@ public class XianDa_VerifyReimbursementServiceImpl extends VerifyReimbursementSe
         public String getNodeName(){
             return  this.nodeName;
         }
+        public static AssigneeEnum getValueByNodeName(String nodeName) {
+            for (AssigneeEnum anEnum : AssigneeEnum.values()) {
+                if (anEnum.getNodeName().equals(nodeName)) {
+                    return anEnum;
+                }
+            }
+            return null;
+        }
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ZheJiangJiDian_VerifyReimbursementServiceImpl.java b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ZheJiangJiDian_VerifyReimbursementServiceImpl.java
index 720e130a..153c343a 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ZheJiangJiDian_VerifyReimbursementServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/service/impl/ZheJiangJiDian_VerifyReimbursementServiceImpl.java
@@ -143,6 +143,14 @@ public class ZheJiangJiDian_VerifyReimbursementServiceImpl extends VerifyReimbur
         }
     }
 
+
+    @Override
+    public String getAssigneeNameByNodeName(String nodeName) {
+        AssigneeEnum assigneeEnum = AssigneeEnum.getValueByNodeName(nodeName);
+        return ObjectUtils.isEmpty(assigneeEnum) ? "" : assigneeEnum.getName();
+    }
+
+
     //鏀嚭椤�
     public enum ExpenseDetailContentEnum {
         OfficialReception("鍏姟鎺ュ緟璐�"),
@@ -215,19 +223,33 @@ public class ZheJiangJiDian_VerifyReimbursementServiceImpl extends VerifyReimbur
 
     //鑺傜偣
     public enum AssigneeEnum {
-        CounterSigner("鍔犵浜�")
+        CounterSigner("鍔犵浜�", "鍔犵浜�")
         ;
 
         /**
          * 鏋氫妇灞炴€ц鏄�
          */
         private final String name;
-        AssigneeEnum(String name) {
+        private final String nodeName;
+
+        AssigneeEnum(String name, String nodeName) {
             this.name = name;
+            this.nodeName = nodeName;
         }
 
         public String getName(){
             return  this.name;
         }
+        public String getNodeName(){
+            return  this.nodeName;
+        }
+        public static AssigneeEnum getValueByNodeName(String nodeName) {
+            for (AssigneeEnum anEnum : AssigneeEnum.values()) {
+                if (anEnum.getNodeName().equals(nodeName)) {
+                    return anEnum;
+                }
+            }
+            return null;
+        }
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java b/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java
index 7217b3af..02889c8f 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java
@@ -1,6 +1,7 @@
 package com.seasky.flowportal.utils;
 
 import com.alibaba.fastjson.JSON;
+import com.seasky.core.ddd.utils.MapperUtils;
 import com.seasky.core.util.ExceptionUtil;
 import com.seasky.flow.dto.flow.HistoricActivityInstanceOut;
 import com.seasky.flow.dto.task.NodeOut;
@@ -9,6 +10,8 @@ import com.seasky.flowportal.constant.Constant;
 import com.seasky.flowportal.domain.po.ExpenseReimbursementPo;
 import com.seasky.flowportal.domain.po.PreExpenseApplyPo;
 import com.seasky.flowportal.dto.approval.ApprovalCmd;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementCmd;
+import com.seasky.flowportal.dto.expenseReimbursement.ExpenseReimbursementSFPCmd;
 import com.seasky.flowportal.dto.flow.FlowOut;
 import com.seasky.flowportal.dto.flow.FlowQuery;
 import com.seasky.flowportal.dto.signature.SignatureCmd;
@@ -58,6 +61,14 @@ public class ApprovalUtil {
     public void setExpenseReimbursementMapper(ExpenseReimbursementMapper expenseReimbursementMapper) { ApprovalUtil.expenseReimbursementMapper = expenseReimbursementMapper; }
 
 
+    public static ExpenseReimbursementCmd map(ExpenseReimbursementSFPCmd cmd){
+        ExpenseReimbursementCmd expenseReimbursementCmd = MapperUtils.INSTANCE.map(ExpenseReimbursementCmd.class, cmd);
+        expenseReimbursementCmd.getExtendFieldCmd();
+        int length = expenseReimbursementCmd.getApplicantDepartment().indexOf('-');
+        expenseReimbursementCmd.setOrganizationCode(expenseReimbursementCmd.getApplicantDepartment().substring(0, length));
+        expenseReimbursementCmd.setOrganizationName(expenseReimbursementCmd.getApplicantDepartment().substring(length + 1));
+        return expenseReimbursementCmd;
+    }
     public static String claimsFlowLog(ApprovalCmd cmd){
         UserInfoOut userInfo;
         try {
-- 
GitLab


From 06cee62108048a551dec4c3af86b95f020ab8128 Mon Sep 17 00:00:00 2001
From: "HAITIAN-TIM\\67349" <chenmin@seaskysh.com>
Date: Wed, 28 Jun 2023 17:52:13 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=AD=BE=E7=AB=A0?=
 =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/seasky/flowportal/utils/ApprovalUtil.java     | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java b/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java
index 02889c8f..a6c3a033 100644
--- a/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java
+++ b/ServiceSite/src/main/java/com/seasky/flowportal/utils/ApprovalUtil.java
@@ -368,11 +368,14 @@ public class ApprovalUtil {
                                     .applyName(cmd.getApplicantName())
                                     .orderCode(cmd.getOrderCode())
                                     .build();
+                            SignatureOut signatureOut = null;
                             List<SignatureOut> signatureList = signatureService.getSignature(SignatureQuery.builder().orderCode(cmd.getOrderCode()).build());
-                            SignatureOut signatureOut = signatureList.stream().filter(s -> s.getUserNo().equals(approveUser.getUserNo())).findFirst().orElse(null);
+                            if (ObjectUtils.isNotEmpty(signatureList))
+                                signatureOut = signatureList.stream().filter(s -> s.getUserNo().equals(approveUser.getUserNo())).findFirst().orElse(null);
                             if (ObjectUtils.isEmpty(signatureOut)) {
                                 signatureList = signatureService.getSignatureByUserCode(approveUser.getUserNo());
-                                signatureOut = signatureList.stream().filter(s -> s.getUserNo().equals(approveUser.getUserNo())).findFirst().orElse(null);
+                                if (ObjectUtils.isNotEmpty(signatureList))
+                                    signatureOut = signatureList.stream().filter(s -> s.getUserNo().equals(approveUser.getUserNo())).findFirst().orElse(null);
                             }
                             if (ObjectUtils.isNotEmpty(signatureOut)) {
                                 signatureCmd.setKeySn(signatureOut.getKeySn());
-- 
GitLab