diff --git a/coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java b/coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java
index e97b4e698..4b315af7f 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java
@@ -6,7 +6,7 @@ package com.cool.store.common;
*
*
* @author wangff
- * @since 2025/11/4
+ * @since 2025/3/6
*/
public interface InsertGroup {
}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java b/coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java
index ead1d3ded..779fc84c3 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java
@@ -6,7 +6,7 @@ package com.cool.store.common;
*
*
* @author wangff
- * @since 2025/11/4
+ * @since 2025/3/6
*/
public interface UpdateGroup {
}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java
index 8081b0051..47b9e1dba 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java
@@ -209,6 +209,11 @@ public class CommonConstants {
public static final String ONLINE_ENV = "online";
public static final String AMOUNT_KEY = "amount:{0}:{1}";
+ /**
+ * 闭店状态
+ */
+ public static final String CLOSED = "closed";
+
public static final String WX_SELF_AUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
/**
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java
index e20a622be..f86343a8a 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java
@@ -289,7 +289,7 @@ public class RedisConstant {
public static final String HUO_MA_STORE_ID = "huo_ma_store_id";
public static final String HUO_MA_TOKEN= "huo_ma_token:{0}";
-
+
/**
* 钱包开通失败/打标失败原因 wallet_open_fail:storeId:1/2 1平安/2网商
*/
@@ -304,4 +304,29 @@ public class RedisConstant {
* 网商账户是否已激活
*/
public static final String WALLET_ONLINE_BANK_ACTIVATED = "wallet_online_bank_activated:{0}";
+
+ /**
+ * 闭店退款申请人
+ */
+ public static final String CLOSE_STORE_REFUND_SUBMIT_USER = "zxjp_refund_submit_user";
+
+ /**
+ * 闭店账号初始化
+ */
+ public static final String CLOSE_STORE_ACCOUNT_INIT = "zxjp_close_store_account";
+
+ /**
+ * 闭店资料初始化
+ */
+ public static final String CLOSE_STORE_FILE_INIT = "zxjp_close_store_file";
+
+ /**
+ * 闭店资料模板
+ */
+ public static final String CLOSE_STORE_FILE_TEMPLATE = "zxjp_close_store_file_template";
+
+ /**
+ * 每刻退款用户信息
+ */
+ public static final String MK_USER_MAPPING = "zxjp_mk_user_mapping";
}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
index 426cd5a8a..87da1c8ec 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
@@ -321,12 +321,32 @@ public enum ErrorCodeEnum {
SHOP_NAME_INVALID(1610014, "门店名称包含禁止关键词",null),
//装修
TEAM_USED(1612001,"该装修团队有门店使用,无法删除,请确认!",null),
+ CURRENT_BRAND_SORT_NUMBER_EXIST(16100007,"当前品牌已存在该排序数字!",null),
+ CONTRACT_CONFIG_NOT_EXIST(16100008,"合同配置不存在!",null),
WALLET_OPEN_ACCOUNT_FAIL(1620001,"钱包开通失败",null),
WALLET_WITH_DRAWER_FAIL(1620002,"提现失败",null),
WALLET_API_ERROR(1620003,"{0}",null),
- CURRENT_BRAND_SORT_NUMBER_EXIST(16100007,"当前品牌已存在该排序数字!",null),
- CONTRACT_CONFIG_NOT_EXIST(16100008,"合同配置不存在!",null),
+
+ // 171闭店
+ CLOSE_STORE_SUB_STAGE_ERROR(171002, "当前流程状态异常", null),
+ STORE_NOT_EXIST(1710003,"门店不存在!",null),
+ STORE_NOT_OPEN(1710004,"当期门店状态为已闭店!请确认!",null),
+ CLOSE_STORE_INFO_NOT_EXIST(1710005,"闭店申请信息不存在!",null),
+ CLOSE_STORE_EXIST_ONGOING_RECORD(1710006,"当前门店有进行中的闭店申请,请确认!",null),
+ CLOSE_STORE_HAS_BEEN_COMPLETED(1710007,"该审批已结束",null),
+ NO_APPROVAL_AUTHORITY(1710008,"您没有审批权限!",null),
+ CLOSE_STORE_AUDIT_RECORD_NOT_EXIST(1710009,"闭店审批记录不存在!",null),
+ CLOSE_STORE_CANCEL_ERROR(1710010,"该闭店申请已审批无法取消",null),
+ CLOSE_STORE_CANCELED(1710011,"该闭店申请已取消",null),
+ CLOSE_STORE_IS_NOT_APPLICANT(1710012, "非申请发起人无法取消!",null),
+ CLOSE_STORE_REFUND_INFO_NOT_EXIST(1710013,"退款信息不存在",null),
+ CLOSE_STORE_FILE_STATUS_ERROR(1710014, "材料上传状态错误,请检查材料上传情况", null),
+ CLOSE_STORE_FILE_NOT_EXIST(1710015, "闭店材料不存在", null),
+ CLOSE_STORE_REFUND_MK_USER_NOT_EXIST(1710016, "当前用户不存在每刻权限", null),
+ CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD(1710017, "存在生效中的退款申请!", null),
+ CLOSE_STORE_REFUND_TYPE_ERROR(1710018, "退款类型错误", null),
+
/**
* 181 十二分制
*/
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java
index 68ebaf10f..73b600d3f 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java
@@ -34,7 +34,9 @@ public enum RocketMqGroupEnum {
STORE_USER_UPDATE("store_user_update", new ArrayList<>(Arrays.asList(RocketMqTagEnum.STORE_USER_UPDATE))),
- SHOP_DECORATION_ASSIGN("shop_decoration_assign", new ArrayList<>(Arrays.asList(RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN)))
+ SHOP_DECORATION_ASSIGN("shop_decoration_assign", new ArrayList<>(Arrays.asList(RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN))),
+
+ STORE_MASTER_ISSUE("store_master_issue", new ArrayList<>(Arrays.asList(RocketMqTagEnum.STORE_MASTER_ISSUE))),
;
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java
index b8b2bba54..f630aebb8 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java
@@ -19,7 +19,8 @@ public enum RocketMqTagEnum {
PARTNER_LICENSE_SYNC_QUEUE("partner_license_sync_queue", "招商证照信息同步"),
BUSINESS_SYNC("business_sync", "工商食安信息同步"),
STORE_USER_UPDATE("store_user_update", "门店信息人员变更同步菜品"),
- DELAY_SHOP_DECORATION_ASSIGN("shop_decoration_assign","门店装修分配");
+ DELAY_SHOP_DECORATION_ASSIGN("shop_decoration_assign","门店装修分配"),
+ STORE_MASTER_ISSUE("store_master_issue","门店主数据下发"),
;
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/AccountCloseTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/AccountCloseTypeEnum.java
new file mode 100644
index 000000000..85b7deba0
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/AccountCloseTypeEnum.java
@@ -0,0 +1,25 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 闭店账号关闭类型枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Getter
+@AllArgsConstructor
+public enum AccountCloseTypeEnum {
+
+ DIRECT_CLOSE(0, "直接关闭"),
+ APPLY_CLOSE(1, "申请关闭"),
+ ;
+
+ private final Integer type;
+
+ private final String msg;
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountStatusEnum.java
new file mode 100644
index 000000000..ca06bc00f
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountStatusEnum.java
@@ -0,0 +1,26 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 闭店账号状态枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Getter
+@AllArgsConstructor
+public enum CloseStoreAccountStatusEnum {
+
+ IN_USE(1, "使用中"),
+ CLOSED(2, "已关闭"),
+ CLOSING(3, "关闭中"),
+ ;
+
+ private final Integer status;
+
+ private final String msg;
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountTypeEnum.java
new file mode 100644
index 000000000..4f1a90130
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountTypeEnum.java
@@ -0,0 +1,34 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 闭店账号类型枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Getter
+@AllArgsConstructor
+public enum CloseStoreAccountTypeEnum {
+
+ IT_ACCOUNT(0, "IT账号"),
+ TAKE_OUT_ACCOUNT(1, "外卖账号"),
+ ;
+
+ private final Integer type;
+
+ private final String msg;
+
+ public static String getMsgByType(Integer type) {
+ for (CloseStoreAccountTypeEnum value : CloseStoreAccountTypeEnum.values()) {
+ if (value.getType().equals(type)) {
+ return value.getMsg();
+ }
+ }
+ return null;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAuditStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAuditStatusEnum.java
new file mode 100644
index 000000000..a609eed65
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAuditStatusEnum.java
@@ -0,0 +1,27 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 闭店审批状态枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Getter
+@AllArgsConstructor
+public enum CloseStoreAuditStatusEnum {
+
+ PENDING(0, "待处理"),
+ PASS(1, "通过"),
+ REJECTED(2, "拒绝"),
+
+ ;
+
+ private final Integer status;
+
+ private final String msg;
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreFileEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreFileEnum.java
new file mode 100644
index 000000000..d7eff679b
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreFileEnum.java
@@ -0,0 +1,30 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 闭店材料 枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/11/27
+ */
+@Getter
+@AllArgsConstructor
+public enum CloseStoreFileEnum {
+
+ HT("close_store_file_ht", "合同"),
+ YJT("close_store_file_yjt", "押金条"),
+ SQS("close_store_file_sqs", "授权书"),
+ MTZ("close_store_file_mtz", "门头字摧毁照片"),
+ TKD("close_store_file_tkd", "退款单"),
+ SFZ("close_store_file_sfz", "身份证复印件"),
+ YHK("close_store_file_yhk", "银行卡复印件"),
+ ;
+
+ private final String code;
+
+ private final String desc;
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStageEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStageEnum.java
new file mode 100644
index 000000000..0ada6c799
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStageEnum.java
@@ -0,0 +1,49 @@
+package com.cool.store.enums.close;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 11:21
+ * @Version 1.0
+ */
+public enum CloseStoreStageEnum {
+
+ CLOSE_STORE_STAGE_1(1, "材料上交"),
+ CLOSE_STORE_STAGE_2(2, "账号关闭"),
+ CLOSE_STORE_STAGE_3(3, "退款"),
+ ;
+
+ /**
+ * 闭店阶段
+ */
+ private Integer closeStoreStage;
+
+ /**
+ * 闭店阶段名称
+ */
+ private String closeStoreName;
+
+
+
+ CloseStoreStageEnum(Integer closeStoreStage, String closeStoreName) {
+ this.closeStoreStage = closeStoreStage;
+ this.closeStoreName = closeStoreName;
+ }
+
+ public static CloseStoreStageEnum getCloseStoreStageEnum(Integer closeStoreStage) {
+ for (CloseStoreStageEnum closeStoreStageEnum : CloseStoreStageEnum.values()) {
+ if (closeStoreStageEnum.getCloseStoreStage().equals(closeStoreStage)) {
+ return closeStoreStageEnum;
+ }
+ }
+ return null;
+ }
+
+
+ public Integer getCloseStoreStage() {
+ return closeStoreStage;
+ }
+
+ public String getCloseStoreName() {
+ return closeStoreName;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStatusEnum.java
new file mode 100644
index 000000000..a0b54e7fe
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStatusEnum.java
@@ -0,0 +1,81 @@
+package com.cool.store.enums.close;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 18:57
+ * @Version 1.0
+ */
+public enum CloseStoreStatusEnum {
+ // 督导审批中
+ UNDER_APPROVAL(1, "审批中"),
+ // 大区老总审批中
+ MANAGER_UNDER_APPROVAL(2, "审批中"),
+ REVIEW_NOT_APPROVED(5, "审批拒绝"),
+ CANCELED(10, "已取消"),
+ CLOSING(15, "闭店中"),
+ COMPLETED(20, "已完成"),
+
+ ;
+ private Integer closeStoreStatus;
+
+ private String closeStoreStatusName;
+
+
+ CloseStoreStatusEnum(Integer closeStoreStatus, String closeStoreStatusName) {
+ this.closeStoreStatus = closeStoreStatus;
+ this.closeStoreStatusName = closeStoreStatusName;
+ }
+
+ public Integer getCloseStoreStatus() {
+ return closeStoreStatus;
+ }
+
+ public String getCloseStoreStatusName() {
+ return closeStoreStatusName;
+ }
+
+ public static CloseStoreStatusEnum getByCloseStoreStatus(Integer closeStoreStatus){
+ for (CloseStoreStatusEnum value : CloseStoreStatusEnum.values()) {
+ if (value.getCloseStoreStatus().equals(closeStoreStatus)){
+ return value;
+ }
+ }
+ return null;
+ }
+
+ public static String getNameByStatus(Integer closeStoreStatus) {
+ for (CloseStoreStatusEnum value : CloseStoreStatusEnum.values()) {
+ if (value.getCloseStoreStatus().equals(closeStoreStatus)){
+ return value.getCloseStoreStatusName();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 获取下一个审批通过状态
+ * @param status 审批状态
+ * @return 审批状态
+ */
+ public static Integer getNextPassStatus(Integer status) {
+ CloseStoreStatusEnum currentStatus = getByCloseStoreStatus(status);
+ if (currentStatus == null) {
+ throw new IllegalArgumentException("闭店申请状态为空");
+ }
+ switch (currentStatus) {
+ case UNDER_APPROVAL:
+ return MANAGER_UNDER_APPROVAL.getCloseStoreStatus();
+ case MANAGER_UNDER_APPROVAL:
+ return CLOSING.getCloseStoreStatus();
+ case CLOSING:
+ return COMPLETED.getCloseStoreStatus();
+ default:
+ return null;
+ }
+ }
+
+ public static boolean isApprove(Integer status) {
+ return CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus().equals(status)
+ || CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(status);
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageEnum.java
new file mode 100644
index 000000000..37de0ec29
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageEnum.java
@@ -0,0 +1,132 @@
+package com.cool.store.enums.close;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author zhangchenbiao
+ * @FileName: ShopStageEnum
+ * @Description:店铺阶段
+ * @date 2024-04-10 17:34
+ */
+public enum CloseStoreSubStageEnum {
+
+ CLOSE_STORE_SUB_STAGE_10(CloseStoreStageEnum.CLOSE_STORE_STAGE_1, 10, "关店所需材料上交", 1),
+ CLOSE_STORE_SUB_STAGE_20(CloseStoreStageEnum.CLOSE_STORE_STAGE_2, 20, "账号关闭", 2),
+ CLOSE_STORE_SUB_STAGE_30(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 30, "押金退款", 3),
+ CLOSE_STORE_SUB_STAGE_40(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 40, "货款退款", 3),
+ ;
+
+ /**
+ * 阶段
+ */
+ private CloseStoreStageEnum closeStoreStageEnum;
+
+ /**
+ * 子阶段
+ */
+ private Integer closeStoreSubStage;
+
+ /**
+ * 子阶段名称
+ */
+ private String closeStoreSubStageName;
+
+ /**
+ * 计划完成天数
+ */
+ private Integer planCompleteDays;
+
+ CloseStoreSubStageEnum(CloseStoreStageEnum closeStoreStageEnum, Integer closeStoreSubStage, String closeStoreSubStageName, Integer planCompleteDays) {
+ this.closeStoreStageEnum = closeStoreStageEnum;
+ this.closeStoreSubStage = closeStoreSubStage;
+ this.closeStoreSubStageName = closeStoreSubStageName;
+ this.planCompleteDays = planCompleteDays;
+ }
+
+
+ public static List getShopStageEnum(Integer closeStoreStage) {
+ List resultList = new ArrayList<>();
+ for (CloseStoreSubStageEnum closeStoreSubStageEnum : CloseStoreSubStageEnum.values()) {
+ if (closeStoreSubStageEnum.getCloseStoreStageEnum().getCloseStoreStage().equals(closeStoreStage)) {
+ resultList.add(closeStoreSubStageEnum);
+ }
+ }
+ return resultList;
+ }
+
+ public CloseStoreStageEnum getCloseStoreStageEnum() {
+ return closeStoreStageEnum;
+ }
+
+ public Integer getCloseStoreSubStage() {
+ return closeStoreSubStage;
+ }
+
+ public String getCloseStoreSubStageName() {
+ return closeStoreSubStageName;
+ }
+
+ public Integer getPlanCompleteDays() {
+ return planCompleteDays;
+ }
+
+ /**
+ * 获取各阶段的初始状态
+ *
+ * @return
+ */
+ public CloseStoreSubStageStatusEnum getInitStatus() {
+ switch (this) {
+ case CLOSE_STORE_SUB_STAGE_10:
+ return CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_10;
+ case CLOSE_STORE_SUB_STAGE_20:
+ case CLOSE_STORE_SUB_STAGE_30:
+ case CLOSE_STORE_SUB_STAGE_40:
+ return CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_00;
+ default:
+ return null;
+ }
+ }
+
+
+ public String getPlanCompleteTime(LocalDate planCompleteTime) {
+ switch (this) {
+ default:
+ return planCompleteTime.plusDays(getPlanCompleteDays()).toString();
+ }
+ }
+
+ /**
+ * 获取下一个开启的子阶段
+ */
+ public static List getNextSubStage(CloseStoreSubStageEnum currentSubStage) {
+ switch (currentSubStage) {
+ case CLOSE_STORE_SUB_STAGE_10:
+ return Arrays.asList(CLOSE_STORE_SUB_STAGE_20, CLOSE_STORE_SUB_STAGE_30, CLOSE_STORE_SUB_STAGE_40);
+ default:
+ return null;
+ }
+ }
+
+ public static CloseStoreSubStageEnum getSubStageByStage(Integer subStage) {
+ for (CloseStoreSubStageEnum value : CloseStoreSubStageEnum.values()) {
+ if (value.getCloseStoreSubStage().equals(subStage)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+ public static String getSubStageNameBySubStage(Integer subStage) {
+ for (CloseStoreSubStageEnum value : CloseStoreSubStageEnum.values()) {
+ if (value.getCloseStoreSubStage().equals(subStage)) {
+ return value.getCloseStoreSubStageName();
+ }
+ }
+ return null;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java
new file mode 100644
index 000000000..5b087da7f
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java
@@ -0,0 +1,168 @@
+package com.cool.store.enums.close;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author zhangchenbiao
+ * @FileName: ShopStageStatusEnum
+ * @Description:店铺阶段状态
+ * @date 2024-04-10 17:34
+ */
+public enum CloseStoreSubStageStatusEnum {
+
+ CLOSE_STORE_SUB_STAGE_STATUS_00(null, -100, "未开始", Boolean.FALSE),
+
+ /**
+ * 材料上传
+ */
+ CLOSE_STORE_SUB_STAGE_STATUS_10(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 100, "待内勤填写地址", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_15(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 110, "未提交", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_16(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 120, "待督导审核", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_17(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 130, "督导审批驳回", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_18(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 140, "待内勤审核", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_19(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 150, "内勤审批驳回", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_20(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 160, "已完成", Boolean.TRUE),
+
+ /**
+ * 账号关闭
+ */
+ CLOSE_STORE_SUB_STAGE_STATUS_25(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20, 200, "进行中", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_30(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20, 210, "已完成", Boolean.TRUE),
+
+ /**
+ * 押金退款
+ */
+ CLOSE_STORE_SUB_STAGE_STATUS_35(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30, 310, "待退款", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_40(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30, 330, "已完成", Boolean.TRUE),
+
+ /**
+ * 货款退款
+ */
+ CLOSE_STORE_SUB_STAGE_STATUS_45(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_40, 410, "待退款", Boolean.FALSE),
+ CLOSE_STORE_SUB_STAGE_STATUS_50(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_40, 430, "已完成", Boolean.TRUE),
+
+ ;
+
+ private CloseStoreSubStageEnum closeStoreSubStageEnum;
+
+ private Integer shopSubStageStatus;
+
+ private String shopSubStageStatusName;
+
+ private boolean isTerminated;
+
+
+ CloseStoreSubStageStatusEnum(CloseStoreSubStageEnum closeStoreSubStageEnum, Integer shopSubStageStatus, String shopSubStageStatusName, Boolean isTerminated) {
+ this.closeStoreSubStageEnum = closeStoreSubStageEnum;
+ this.shopSubStageStatus = shopSubStageStatus;
+ this.shopSubStageStatusName = shopSubStageStatusName;
+ this.isTerminated = isTerminated;
+ }
+
+ public static List getCloseStoreSubStageStatusEnum(CloseStoreSubStageEnum closeStoreSubStageEnum) {
+ List resultList = new ArrayList<>();
+ for (CloseStoreSubStageStatusEnum stageStatusEnum : CloseStoreSubStageStatusEnum.values()) {
+ if (Objects.nonNull(stageStatusEnum.getCloseStoreSubStageEnum()) && stageStatusEnum.getCloseStoreSubStageEnum().equals(closeStoreSubStageEnum)) {
+ resultList.add(stageStatusEnum);
+ }
+ }
+ return resultList;
+ }
+
+ public CloseStoreSubStageEnum getCloseStoreSubStageEnum() {
+ return closeStoreSubStageEnum;
+ }
+
+ public Integer getShopSubStageStatus() {
+ return shopSubStageStatus;
+ }
+
+ public String getShopSubStageStatusName() {
+ return shopSubStageStatusName;
+ }
+
+ public String getShopSubStageName() {
+ return closeStoreSubStageEnum.getCloseStoreSubStageName();
+ }
+
+ public boolean isTerminated() {
+ return isTerminated;
+ }
+
+ public static CloseStoreSubStageStatusEnum getCloseStoreSubStageStatusEnum(Integer CloseStoreSubStageStatus) {
+ for (CloseStoreSubStageStatusEnum storeSubStageStatusEnum : CloseStoreSubStageStatusEnum.values()) {
+ if (Objects.nonNull(storeSubStageStatusEnum.getShopSubStageStatus()) && storeSubStageStatusEnum.getShopSubStageStatus().equals(CloseStoreSubStageStatus)) {
+ return storeSubStageStatusEnum;
+ }
+ }
+ return CLOSE_STORE_SUB_STAGE_STATUS_00;
+ }
+
+ public static CloseStoreSubStageStatusEnum getByStatus(Integer shopSubStageStatus) {
+ for (CloseStoreSubStageStatusEnum statusEnum : CloseStoreSubStageStatusEnum.values()) {
+ if (statusEnum.getShopSubStageStatus().equals(shopSubStageStatus)) {
+ return statusEnum;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 获取下一个阶段状态
+ * @param current 当前阶段状态
+ * @return 阶段状态
+ */
+ public static CloseStoreSubStageStatusEnum getNextStageStatus(CloseStoreSubStageStatusEnum current) {
+ switch (current) {
+ case CLOSE_STORE_SUB_STAGE_STATUS_10:
+ return CLOSE_STORE_SUB_STAGE_STATUS_15;
+ case CLOSE_STORE_SUB_STAGE_STATUS_15:
+ case CLOSE_STORE_SUB_STAGE_STATUS_17:
+ return CLOSE_STORE_SUB_STAGE_STATUS_16;
+ case CLOSE_STORE_SUB_STAGE_STATUS_16:
+ case CLOSE_STORE_SUB_STAGE_STATUS_19:
+ return CLOSE_STORE_SUB_STAGE_STATUS_18;
+ case CLOSE_STORE_SUB_STAGE_STATUS_18:
+ return CLOSE_STORE_SUB_STAGE_STATUS_20;
+ case CLOSE_STORE_SUB_STAGE_STATUS_25:
+ return CLOSE_STORE_SUB_STAGE_STATUS_30;
+ case CLOSE_STORE_SUB_STAGE_STATUS_35:
+ return CLOSE_STORE_SUB_STAGE_STATUS_40;
+ case CLOSE_STORE_SUB_STAGE_STATUS_45:
+ return CLOSE_STORE_SUB_STAGE_STATUS_50;
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * 获取子流程的开始阶段状态
+ * @param subStage 子流程
+ * @return 阶段状态
+ */
+ public static CloseStoreSubStageStatusEnum getOpenStageStatus(CloseStoreSubStageEnum subStage) {
+ switch (subStage) {
+ case CLOSE_STORE_SUB_STAGE_10:
+ return CLOSE_STORE_SUB_STAGE_STATUS_10;
+ case CLOSE_STORE_SUB_STAGE_20:
+ return CLOSE_STORE_SUB_STAGE_STATUS_25;
+ case CLOSE_STORE_SUB_STAGE_30:
+ return CLOSE_STORE_SUB_STAGE_STATUS_35;
+ case CLOSE_STORE_SUB_STAGE_40:
+ return CLOSE_STORE_SUB_STAGE_STATUS_45;
+ default:
+ return null;
+ }
+ }
+
+ public static String getStatusNameByStatus(Integer status) {
+ for (CloseStoreSubStageStatusEnum statusEnum : CloseStoreSubStageStatusEnum.values()) {
+ if (statusEnum.getShopSubStageStatus().equals(status)) {
+ return statusEnum.getShopSubStageStatusName();
+ }
+ }
+ return null;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseTypeEnum.java
new file mode 100644
index 000000000..fd4f64b35
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseTypeEnum.java
@@ -0,0 +1,30 @@
+package com.cool.store.enums.close;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 18:43
+ * @Version 1.0
+ */
+public enum CloseTypeEnum {
+
+ INITIATE(1, "主动发起"),
+ NO_ORDER_AUTO(2, "未订货自动发起"),
+ ;
+
+ CloseTypeEnum(Integer closeType, String closeTypeName) {
+ this.closeType = closeType;
+ this.closeTypeName = closeTypeName;
+ }
+
+ private Integer closeType;
+
+ private String closeTypeName;
+
+ public Integer getCloseType() {
+ return closeType;
+ }
+
+ public String getCloseTypeName() {
+ return closeTypeName;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/FileStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/FileStatusEnum.java
new file mode 100644
index 000000000..83afcd4c3
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/FileStatusEnum.java
@@ -0,0 +1,38 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 闭店材料状态 枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/11/26
+ */
+@Getter
+@AllArgsConstructor
+public enum FileStatusEnum {
+
+ NOT_UPLOAD(0, "未上传"),
+ QUALIFIED(1, "合格"),
+ UNQUALIFIED(2, "不合格"),
+ UPLOADED(3, "已上传"),
+ APPROVING(4, "审批中"),
+ MODIFIED(5, "已修改"),
+ ;
+
+ private final Integer status;
+
+ private final String desc;
+
+ public static String getDescByStatus(Integer status) {
+ for (FileStatusEnum value : FileStatusEnum.values()) {
+ if (value.status.equals(status)) {
+ return value.desc;
+ }
+ }
+ return null;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RecordTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RecordTypeEnum.java
new file mode 100644
index 000000000..16c9724ee
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RecordTypeEnum.java
@@ -0,0 +1,30 @@
+package com.cool.store.enums.close;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/23 13:45
+ * @Version 1.0
+ */
+public enum RecordTypeEnum {
+
+ CLOSE_STORE_RECORD_TYPE_10(1, "申请提交"),
+ CLOSE_STORE_RECORD_TYPE_20(2, "审批操作"),
+ ;
+
+ private Integer recordType;
+
+ private String recordTypeName;
+
+ RecordTypeEnum(Integer recordType, String recordTypeName) {
+ this.recordType = recordType;
+ this.recordTypeName = recordTypeName;
+ }
+
+ public Integer getRecordType() {
+ return recordType;
+ }
+
+ public String getRecordTypeName() {
+ return recordTypeName;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RefundPayStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RefundPayStatusEnum.java
new file mode 100644
index 000000000..0f0dc5a2f
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RefundPayStatusEnum.java
@@ -0,0 +1,37 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 退款支付状态枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/12/1
+ */
+@Getter
+@AllArgsConstructor
+public enum RefundPayStatusEnum {
+
+ APPROVING("APPROVING", "审批中"),
+ ABANDON("ABANDON", "作废"),
+ SETTLEMENT("SETTLEMENT", "结算中"),
+ PAY_SUCCESS("PAY_SUCCESS", "支付成功"),
+ PAY_FAIL("PAY_FAIL", "支付失败"),
+ ;
+
+ private final String status;
+
+ private final String desc;
+
+ public static String getDescByStatus(String status) {
+ for (RefundPayStatusEnum value : values()) {
+ if (value.status.equals(status)) {
+ return value.desc;
+ }
+ }
+ return "";
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/XgjRefundPayStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/XgjRefundPayStatusEnum.java
new file mode 100644
index 000000000..47c8f179f
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/XgjRefundPayStatusEnum.java
@@ -0,0 +1,29 @@
+package com.cool.store.enums.close;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 新管家退管单支付状态枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Getter
+@AllArgsConstructor
+public enum XgjRefundPayStatusEnum {
+
+ APPROVING("APPROVING", "审批中"),
+ ABANDON("ABANDON", "作废"),
+ SETTLEMENT("SETTLEMENT", "结算中"),
+ PAY_SUCCESS("PAY_SUCCESS", "支付成功"),
+ PAY_FAIL("PAY_FAIL", "支付失败"),
+ REJECTED("REJECTED", "驳回")
+ ;
+
+ private final String status;
+
+ private final String desc;
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseNatureEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseNatureEnum.java
new file mode 100644
index 000000000..529bc58d9
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseNatureEnum.java
@@ -0,0 +1,39 @@
+package com.cool.store.enums.master;
+
+import com.cool.store.enums.close.CloseTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 门店闭店性质枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/9/16
+ */
+@Getter
+@AllArgsConstructor
+public enum StoreCloseNatureEnum {
+ // 这里的描述跟标品略微不同,但是描述不要改!!!跟每刻保持一致!!!
+ REQUIRE_CLOSE(0, "我们管理要求闭店", CloseTypeEnum.NO_ORDER_AUTO),
+
+ ONESELF_CLOSE(1, "加盟商自行闭店", CloseTypeEnum.INITIATE),
+ ;
+
+
+ private final Integer code;
+
+ private final String desc;
+
+ private final CloseTypeEnum closeType;
+
+ public static String getDescByCode(Integer code) {
+ for (StoreCloseNatureEnum value : StoreCloseNatureEnum.values()) {
+ if (value.code.equals(code)) {
+ return value.desc;
+ }
+ }
+ return null;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseReasonEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseReasonEnum.java
new file mode 100644
index 000000000..79c3fe32f
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseReasonEnum.java
@@ -0,0 +1,57 @@
+package com.cool.store.enums.master;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * 门店闭店原因枚举类
+ *
+ *
+ * @author wangff
+ * @since 2025/9/16
+ */
+@Getter
+@AllArgsConstructor
+public enum StoreCloseReasonEnum {
+ // 这里的描述跟标品略微不同,但是描述不要改!!!跟每刻保持一致!!!
+ REASON0(0, "不进货(外购)", StoreCloseNatureEnum.REQUIRE_CLOSE),
+ REASON1(1, "门店形象差(不升级)", StoreCloseNatureEnum.REQUIRE_CLOSE),
+ REASON2(2, "顾客投诉率高", StoreCloseNatureEnum.REQUIRE_CLOSE),
+ REASON3(3, "加盟老板失联", StoreCloseNatureEnum.REQUIRE_CLOSE),
+ REASON4(4, "其他严重违反加盟规定", StoreCloseNatureEnum.REQUIRE_CLOSE),
+ REASON5(5, "卫生操作不达标", StoreCloseNatureEnum.REQUIRE_CLOSE),
+
+ REASON6(6, "人员不足", StoreCloseNatureEnum.ONESELF_CLOSE),
+ REASON7(7, "商圈转移或拆迁", StoreCloseNatureEnum.ONESELF_CLOSE),
+ REASON8(8, "生意差", StoreCloseNatureEnum.ONESELF_CLOSE),
+ REASON9(9, "房东不租", StoreCloseNatureEnum.ONESELF_CLOSE),
+ REASON19(10, "想转行或想长休", StoreCloseNatureEnum.ONESELF_CLOSE),
+
+ ;
+
+
+ private final Integer code;
+
+ private final String desc;
+
+ private final StoreCloseNatureEnum closeNature;
+
+ public static String getDescByCode(Integer code) {
+ for (StoreCloseReasonEnum value : StoreCloseReasonEnum.values()) {
+ if (value.code.equals(code)) {
+ return value.desc;
+ }
+ }
+ return null;
+ }
+
+ public static StoreCloseReasonEnum getByCode(Integer code) {
+ for (StoreCloseReasonEnum value : StoreCloseReasonEnum.values()) {
+ if (value.code.equals(code)) {
+ return value;
+ }
+ }
+ return null;
+ }
+}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java
index 4d6936f79..60afd26c8 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java
@@ -4,6 +4,7 @@ import cn.hutool.core.bean.copier.CopyOptions;
import com.github.pagehelper.PageInfo;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -51,4 +52,13 @@ public class BeanUtil extends cn.hutool.core.bean.BeanUtil {
newPage.setList(list);
return newPage;
}
+
+ public static void copyPropertiesIgnoreId(Object source, Object target, String... ignoreProperties) {
+ if (source == null || target == null) {
+ return;
+ }
+ String[] mergedIgnoreProperties = Arrays.copyOf(ignoreProperties, ignoreProperties.length + 1);
+ mergedIgnoreProperties[ignoreProperties.length] = "id";
+ copyProperties(source, target, mergedIgnoreProperties);
+ }
}
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java
index e66faa121..df0471985 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java
@@ -161,6 +161,13 @@ public class CoolDateUtils {
return LocalDate.now().format(getDateFormatter(DATE_FORMAT_DAY));
}
+ /**
+ * 获取当前时间字符串 (yyyy-MM-dd HH:mm:ss)
+ */
+ public static String getCurrentDateTime() {
+ return LocalDateTime.now().format(getDateFormatter(DATE_FORMAT_SEC));
+ }
+
/**
* 获取上月同一天的日期字符串 (yyyy-MM-dd)
* 如果上个月没有同一天(如当前是3月31日,但2月没有31日),则返回上个月的最后一天
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java
index 4ff5d3615..059983b81 100644
--- a/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java
+++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java
@@ -22,16 +22,16 @@ import java.util.stream.Collectors;
@Slf4j
public class RocketMqUtil {
- private static final String INSTANCE_ID = "MQ_INST_1947409023213164_BX3sLZnA";
+ private static final String INSTANCE_ID = "MQ_INST_1748142459508127_BZfpFxuJ";
/**
* 本地
*/
private static final String LOCAL_INSTANCE_ID = "MQ_INST_1255228665351616_BX3wfyPO";
- private static final String INSTANCE_ID_ONLINE_HD_PRE = "MQ_INST_1947409023213164_BX5N7rwl";
- private static final String ACCESS_KEY = "LTAI5tJbgtyoHUvofTaeP1RP";
- private static final String ACCESS_SECRET = "myg755iCx0j4PyQkHMaUVeOr0bw1tA";
+ private static final String INSTANCE_ID_ONLINE_HD_PRE = "MQ_INST_1748142459508127_BZegx2xc";
+ private static final String ACCESS_KEY = "LTAI5tGBwmXwZkMuHK4MudMJ";
+ private static final String ACCESS_SECRET = "bnZoUMRQ9834STgz5E291YrqlBu6yn";
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
@@ -61,6 +61,11 @@ public class RocketMqUtil {
return new Client(config);
}
+ public static void main(String[] args) throws Exception {
+// initGroup("local");
+// initOnlineAndHdAndPreGroup("online");
+ }
+
/**
* 新增测试、开发环境的group
* @author chenyupeng
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAccountInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAccountInfoDAO.java
new file mode 100644
index 000000000..48b65066e
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAccountInfoDAO.java
@@ -0,0 +1,75 @@
+package com.cool.store.dao;
+
+import com.alibaba.fastjson.JSONObject;
+import com.cool.store.constants.RedisConstant;
+import com.cool.store.entity.CloseStoreAccountInfoDO;
+import com.cool.store.mapper.CloseStoreAccountInfoMapper;
+import com.cool.store.utils.RedisUtilPool;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+import java.util.List;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 16:54
+ * @Version 1.0
+ */
+@Repository
+@RequiredArgsConstructor
+public class CloseStoreAccountInfoDAO {
+ private final CloseStoreAccountInfoMapper closeStoreAccountInfoMapper;
+ private final RedisUtilPool redisUtilPool;
+
+ /**
+ * 根据闭店申请id查询
+ * @param closeStoreId 闭店申请id
+ * @return 账号列表
+ */
+ public List getByCloseStoreId(Long closeStoreId) {
+ return closeStoreAccountInfoMapper.select(CloseStoreAccountInfoDO.builder().closeStoreId(closeStoreId).build());
+ }
+
+ /**
+ * 根据主键id查询
+ * @param id 主键id
+ * @return 账号信息
+ */
+ public CloseStoreAccountInfoDO getById(Long id) {
+ return closeStoreAccountInfoMapper.selectByPrimaryKey(id);
+ }
+
+ /**
+ * 修改账号状态
+ * @param id 主键id
+ * @param status 状态
+ */
+ public void updateStatus(Long id, Integer status) {
+ closeStoreAccountInfoMapper.updateByPrimaryKeySelective(CloseStoreAccountInfoDO.builder().id(id).status(status).build());
+ }
+
+ /**
+ * 初始化数据
+ * @param closeStoreId 闭店申请id
+ */
+ public void init(Long closeStoreId) {
+ String accountInitJson = redisUtilPool.getString(RedisConstant.CLOSE_STORE_ACCOUNT_INIT);
+ List accountList = JSONObject.parseArray(accountInitJson, CloseStoreAccountInfoDO.class);
+ accountList.forEach(v -> v.setCloseStoreId(closeStoreId));
+ closeStoreAccountInfoMapper.insertBatch(accountList);
+ }
+
+ /**
+ * 是否存在未关闭的账号
+ * @param closeStoreId 闭店申请id
+ * @return 是否存在
+ */
+ public boolean existNotCloseAccount(Long closeStoreId) {
+ Example example = new Example(CloseStoreAccountInfoDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andNotEqualTo("status", 2);
+ return closeStoreAccountInfoMapper.selectCountByExample(example) > 0;
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAuditRecordDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAuditRecordDAO.java
new file mode 100644
index 000000000..722b61a6e
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAuditRecordDAO.java
@@ -0,0 +1,170 @@
+package com.cool.store.dao;
+
+import com.cool.store.entity.CloseStoreAuditRecordDO;
+import com.cool.store.enums.close.CloseStoreAuditStatusEnum;
+import com.cool.store.enums.close.RecordTypeEnum;
+import com.cool.store.mapper.CloseStoreAuditRecordMapper;
+import com.cool.store.request.close.store.CloseStoreQueryRequest;
+import com.cool.store.vo.close.store.CloseStoreInfoListVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 16:52
+ * @Version 1.0
+ */
+@Repository
+public class CloseStoreAuditRecordDAO {
+
+ @Resource
+ private CloseStoreAuditRecordMapper closeStoreAuditRecordMapper;
+
+
+ /**
+ * 提交新增记录
+ * @param closeStoreId
+ * @param userId
+ * @return
+ */
+ public int addSubmitRecord(Long closeStoreId, String userId, String userName) {
+ CloseStoreAuditRecordDO closeStoreAuditRecordDO = CloseStoreAuditRecordDO.builder()
+ .closeStoreId(closeStoreId)
+ .recordType(RecordTypeEnum.CLOSE_STORE_RECORD_TYPE_10.getRecordType())
+ .actionRemark("")
+ .finishTaskTime(new Date())
+ .receiveTaskTime(new Date())
+ .handlerUserId(userId)
+ .handlerUserName(userName)
+ .auditStatus(CloseStoreAuditStatusEnum.PASS.getStatus())
+ .handlerUserIds(getUserIds(Collections.singletonList(userId)))
+ .build();
+ return closeStoreAuditRecordMapper.insertSelective(closeStoreAuditRecordDO);
+ }
+
+ /**
+ * 提交审批记录
+ * @param closeStoreId
+ * @param userIdList
+ * @return
+ */
+ public int addApproveRecord(Long closeStoreId, List userIdList) {
+ CloseStoreAuditRecordDO closeStoreAuditRecordDO = CloseStoreAuditRecordDO.builder()
+ .closeStoreId(closeStoreId)
+ .recordType(RecordTypeEnum.CLOSE_STORE_RECORD_TYPE_20.getRecordType())
+ .receiveTaskTime(new Date())
+ .handlerUserIds(getUserIds(userIdList))
+ .auditStatus(CloseStoreAuditStatusEnum.PENDING.getStatus())
+ .build();
+ return closeStoreAuditRecordMapper.insertSelective(closeStoreAuditRecordDO);
+ }
+
+ private String getUserIds(List userIds) {
+ String userIdStr = userIds.stream()
+ .filter(StringUtils::isNotBlank)
+ .distinct()
+ .collect(Collectors.joining(","));
+ return "," + userIdStr + ",";
+ }
+
+ /**
+ * 首次发起流程 添加审批记录
+ */
+ public void addRecord(Long closeStoreId, String userId, String userName, List userIdList) {
+ //新增提交审批
+ addSubmitRecord(closeStoreId, userId, userName);
+ //新增审批记录
+ addApproveRecord(closeStoreId, userIdList);
+ }
+
+ /**
+ * 审批记录更新
+ * @param closeStoreAuditRecordDO
+ */
+ public void updateRecord(CloseStoreAuditRecordDO closeStoreAuditRecordDO) {
+ closeStoreAuditRecordMapper.updateByPrimaryKeySelective(closeStoreAuditRecordDO);
+ }
+
+
+ /**
+ * 流程记录列表
+ * @param closeStoreId
+ * @return
+ */
+ public List getRecordListByCloseStoreId(Long closeStoreId) {
+ if (closeStoreId == null){
+ return new ArrayList<>();
+ }
+ return closeStoreAuditRecordMapper.getRecordListByCloseStoreId(closeStoreId);
+ }
+
+ /**
+ * 根据id查询审批记录
+ * @param id 审批记录id
+ * @return 审批记录
+ */
+ public CloseStoreAuditRecordDO getById(Long id) {
+ return closeStoreAuditRecordMapper.selectByPrimaryKey(id);
+ }
+
+ /**
+ * 删除待处理的审批记录
+ * @param closeStoreId 闭店申请id
+ */
+ public void deletePendingRecord(Long closeStoreId) {
+ Example example = new Example(CloseStoreAuditRecordDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andEqualTo("auditStatus", CloseStoreAuditStatusEnum.PENDING.getStatus())
+ .andEqualTo("deleted", 0);
+ closeStoreAuditRecordMapper.updateByExampleSelective(CloseStoreAuditRecordDO.builder().deleted(1).build(), example);
+ }
+
+ /**
+ * 查询权限下的闭店申请审批记录
+ * @param request 闭店申请查询Request
+ * @param userId 用户id
+ * @param isAdmin 是管理员权限
+ * @return 闭店申请记录列表VO列表
+ */
+ public PageInfo getCloseStoreAuditList(CloseStoreQueryRequest request, String userId, Boolean isAdmin) {
+ PageHelper.startPage(request.getPageNum(), request.getPageSize());
+ List list = closeStoreAuditRecordMapper.getCloseStoreAuditList(request, userId, isAdmin);
+ return new PageInfo<>(list);
+ }
+
+ /**
+ * 根据闭店申请id查询审批记录
+ * @param closeStoreId 闭店申请id
+ * @return 审批记录列表
+ */
+ public List getListByCloseStoreId(Long closeStoreId) {
+ Example example = new Example(CloseStoreAuditRecordDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andEqualTo("deleted", 0);
+ example.setOrderByClause("id ASC");
+ return closeStoreAuditRecordMapper.selectByExample(example);
+ }
+
+ /**
+ * 获取待处理的审批记录
+ * @param closeStoreId 闭店申请id
+ * @return 闭店申请审批记录
+ */
+ public CloseStoreAuditRecordDO getPendingAuditRecord(Long closeStoreId) {
+ Example example = new Example(CloseStoreAuditRecordDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andEqualTo("auditStatus", CloseStoreAuditStatusEnum.PENDING.getStatus())
+ .andEqualTo("deleted", 0);
+ return closeStoreAuditRecordMapper.selectOneByExample(example);
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileDetailDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileDetailDAO.java
new file mode 100644
index 000000000..9569a1e67
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileDetailDAO.java
@@ -0,0 +1,75 @@
+package com.cool.store.dao;
+
+import com.cool.store.request.close.file.CloseStoreMailAddressRequest;
+import com.cool.store.entity.CloseStoreFileDetailDO;
+import com.cool.store.mapper.CloseStoreFileDetailMapper;
+import com.cool.store.request.close.file.CloseStoreFileApproveRequest;
+import com.cool.store.request.close.file.CloseStoreMailInfoRequest;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+/**
+ *
+ * 闭店资料详情DAO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@RequiredArgsConstructor
+@Repository
+public class CloseStoreFileDetailDAO {
+ private final CloseStoreFileDetailMapper closeStoreFileDetailMapper;
+
+ /**
+ * 新增或编辑闭店资料邮寄地址信息
+ * @param request 闭店资料邮寄地址信息Request
+ * @return boolean
+ */
+ public boolean insertOrUpdateMailAddress(CloseStoreMailAddressRequest request) {
+ return closeStoreFileDetailMapper.insertOrUpdateMailAddress(request) > 0;
+ }
+
+ /**
+ * 新增或编辑闭店资料邮寄信息
+ * @param request 闭店资料邮寄信息Request
+ * @param mailStatus 邮寄状态
+ */
+ public void insertOrUpdateMailInfo(CloseStoreMailInfoRequest request, Boolean mailStatus) {
+ closeStoreFileDetailMapper.insertOrUpdateMailInfo(request, mailStatus);
+ }
+
+ /**
+ * 新增或编辑闭店资料信息
+ *
+ * @param request 闭店材料审批Request
+ */
+ public void insertOrUpdateFileInfoSelective(CloseStoreFileApproveRequest request, Boolean approveComplete) {
+ closeStoreFileDetailMapper.insertOrUpdateFileInfoSelective(request, approveComplete);
+ }
+
+ /**
+ * 根据闭店申请id查询
+ * @param closeStoreId 闭店申请id
+ * @return 闭店资料详情
+ */
+ public CloseStoreFileDetailDO getByCloseStoreId(Long closeStoreId) {
+ return closeStoreFileDetailMapper.selectOne(CloseStoreFileDetailDO.builder().closeStoreId(closeStoreId).build());
+ }
+
+ /**
+ * 初始化数据
+ * @param closeStoreId 闭店申请id
+ */
+ public void init(Long closeStoreId) {
+ CloseStoreFileDetailDO detailDO = CloseStoreFileDetailDO.builder().closeStoreId(closeStoreId).build();
+ closeStoreFileDetailMapper.insertSelective(detailDO);
+ }
+
+ public void updateByCloseStoreIdSelective(CloseStoreFileDetailDO detailDO) {
+ Example example = new Example(CloseStoreFileDetailDO.class);
+ example.createCriteria().andEqualTo("closeStoreId", detailDO.getCloseStoreId());
+ closeStoreFileDetailMapper.updateByExampleSelective(detailDO, example);
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileInfoDAO.java
new file mode 100644
index 000000000..6030f43d7
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileInfoDAO.java
@@ -0,0 +1,87 @@
+package com.cool.store.dao;
+
+import com.alibaba.fastjson.JSONObject;
+import com.cool.store.constants.RedisConstant;
+import com.cool.store.entity.CloseStoreFileInfoDO;
+import com.cool.store.enums.close.FileStatusEnum;
+import com.cool.store.mapper.CloseStoreFileInfoMapper;
+import com.cool.store.utils.RedisUtilPool;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+import java.util.List;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 16:53
+ * @Version 1.0
+ */
+@Repository
+@RequiredArgsConstructor
+public class CloseStoreFileInfoDAO {
+ private final CloseStoreFileInfoMapper closeStoreFileInfoMapper;
+ private final RedisUtilPool redisUtilPool;
+
+ /**
+ * 批量更新
+ * @param list 实体列表
+ * @return boolean
+ */
+ public boolean updateBatch(List list) {
+ return closeStoreFileInfoMapper.updateBatch(list) > 0;
+ }
+
+ /**
+ * 根据闭店申请id查询
+ * @param closeStoreId 闭店申请id
+ * @return 实体列表
+ */
+ public List getByCloseStoreId(Long closeStoreId) {
+ return closeStoreFileInfoMapper.select(CloseStoreFileInfoDO.builder().closeStoreId(closeStoreId).build());
+ }
+
+ /**
+ * 初始化数据
+ * @param closeStoreId 闭店申请id
+ */
+ public void init(Long closeStoreId) {
+ String fileInitJson = redisUtilPool.getString(RedisConstant.CLOSE_STORE_FILE_INIT);
+ List list = JSONObject.parseArray(fileInitJson, CloseStoreFileInfoDO.class);
+ list.forEach(v -> v.setCloseStoreId(closeStoreId));
+ closeStoreFileInfoMapper.insertBatch(list);
+ }
+
+ /**
+ * 提交材料
+ */
+ public Boolean updateFile(Long id, String urls) {
+ return closeStoreFileInfoMapper.updateFile(id, urls) > 0;
+ }
+
+ /**
+ * 根据闭店申请id将所有资料状态改为审批中
+ */
+ public void updateAllFileStatus(Long closeStoreId) {
+ Example example = new Example(CloseStoreFileInfoDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId);
+ closeStoreFileInfoMapper.updateByExampleSelective(CloseStoreFileInfoDO.builder().fileStatus(FileStatusEnum.APPROVING.getStatus()).build(), example);
+ }
+
+ public void updateSelective(CloseStoreFileInfoDO closeStoreFileInfoDO) {
+ closeStoreFileInfoMapper.updateByPrimaryKeySelective(closeStoreFileInfoDO);
+ }
+
+ public CloseStoreFileInfoDO getById(Long id) {
+ return closeStoreFileInfoMapper.selectByPrimaryKey(id);
+ }
+
+ /**
+ * 更新材料状态为审批状态
+ * @param closeStoreId 闭店申请id
+ */
+ public void updateFileStatusToApproveStatus(Long closeStoreId) {
+ closeStoreFileInfoMapper.updateFileStatusToApproveStatus(closeStoreId);
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreInfoDAO.java
new file mode 100644
index 000000000..a47736dfe
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreInfoDAO.java
@@ -0,0 +1,86 @@
+package com.cool.store.dao;
+
+import com.cool.store.entity.CloseStoreInfoDO;
+import com.cool.store.enums.close.CloseStoreStatusEnum;
+import com.cool.store.mapper.CloseStoreInfoMapper;
+import com.cool.store.request.close.store.CloseStoreQueryRequest;
+import com.cool.store.vo.close.store.CloseStoreInfoListVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 16:52
+ * @Version 1.0
+ */
+@Repository
+public class CloseStoreInfoDAO {
+ @Resource
+ private CloseStoreInfoMapper closeStoreInfoMapper;
+
+ public int insertSelective(CloseStoreInfoDO closeStoreInfoDO) {
+ return closeStoreInfoMapper.insertSelective(closeStoreInfoDO);
+ }
+ public int updateSelective(CloseStoreInfoDO closeStoreInfoDO) {
+ return closeStoreInfoMapper.updateByPrimaryKeySelective(closeStoreInfoDO);
+ }
+
+ /**
+ * 根据id查询
+ * @param id 主键id
+ * @return 闭店信息
+ */
+ public CloseStoreInfoDO getById(Long id) {
+ return closeStoreInfoMapper.selectByPrimaryKey(id);
+ }
+
+ /**
+ * 是否存在进行中的闭店申请
+ * @param storeId 门店id
+ * @return 是否存在
+ */
+ public boolean existOngoingRecord(String storeId) {
+ Example example = new Example(CloseStoreInfoDO.class);
+ example.createCriteria().andEqualTo("storeId", storeId)
+ .andIn("closeStatus", Arrays.asList(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus(), CloseStoreStatusEnum.CLOSING.getCloseStoreStatus()));
+ return closeStoreInfoMapper.selectCountByExample(example) > 0;
+ }
+
+ /**
+ * 查询闭店申请记录
+ * @param request 闭店申请查询Request
+ * @return 闭店申请记录列表VO
+ */
+ public PageInfo getCloseStoreInfoList(CloseStoreQueryRequest request, List regionIds) {
+ PageHelper.startPage(request.getPageNum(), request.getPageSize());
+ List list = closeStoreInfoMapper.getCloseStoreInfoList(request, regionIds);
+ return new PageInfo<>(list);
+ }
+
+ /**
+ * 根据申请人id查询闭店申请记录
+ * @param applyUserId 申请人id
+ * @return 闭店申请记录列表
+ */
+ public List getListByApplyUserId(String applyUserId, Integer closeType, String storeId) {
+ Example example = new Example(CloseStoreInfoDO.class);
+ Example.Criteria criteria = example.createCriteria()
+ .andEqualTo("applyUserId", applyUserId);
+ if (StringUtils.isNotBlank(storeId)) {
+ criteria.andEqualTo("storeId", storeId);
+ }
+ if (Objects.nonNull(closeType)) {
+ criteria.andEqualTo("closeType", closeType);
+ }
+ example.setOrderByClause("create_time DESC");
+ return closeStoreInfoMapper.selectByExample(example);
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreRefundInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreRefundInfoDAO.java
new file mode 100644
index 000000000..7af58fc06
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreRefundInfoDAO.java
@@ -0,0 +1,124 @@
+package com.cool.store.dao;
+
+import com.cool.store.entity.CloseStoreRefundInfoDO;
+import com.cool.store.enums.close.RefundPayStatusEnum;
+import com.cool.store.mapper.CloseStoreRefundInfoMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *
+ * 闭店退款信息DAO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Repository
+@RequiredArgsConstructor
+public class CloseStoreRefundInfoDAO {
+ private final CloseStoreRefundInfoMapper closeStoreRefundInfoMapper;
+
+ /**
+ * 根据id查询
+ */
+ public CloseStoreRefundInfoDO getById(Long id) {
+ return closeStoreRefundInfoMapper.selectByPrimaryKey(id);
+ }
+
+ /**
+ * 更新退款状态
+ * @param id id
+ * @param refundStatus 退款状态
+ */
+ public void updateRefundStatus(Long id, String refundStatus, Date refundTime) {
+ closeStoreRefundInfoMapper.updateByPrimaryKeySelective(CloseStoreRefundInfoDO.builder().id(id).refundStatus(refundStatus).refundTime(refundTime).build());
+ }
+
+ /**
+ * 根据id批量更新退款状态
+ * @param list 退款信息列表
+ */
+ public void updateRefundStatusBatchById(List list) {
+ closeStoreRefundInfoMapper.updateRefundStatusBatchById(list);
+ }
+
+ /**
+ * 编辑
+ */
+ public boolean updateSelective(CloseStoreRefundInfoDO closeStoreRefundInfoDO) {
+ return closeStoreRefundInfoMapper.updateByPrimaryKeySelective(closeStoreRefundInfoDO) > 0;
+ }
+
+ /**
+ * 新增
+ */
+ public boolean insertSelective(CloseStoreRefundInfoDO closeStoreRefundInfoDO) {
+ return closeStoreRefundInfoMapper.insertSelective(closeStoreRefundInfoDO) > 0;
+ }
+
+ /**
+ * 根据闭店申请id查询
+ * @param closeStoreId 闭店申请id
+ * @param type 退款类型(闭店子阶段code)
+ * @return 退款信息
+ */
+ public CloseStoreRefundInfoDO getByCloseStoreId(Long closeStoreId, Integer type) {
+ return closeStoreRefundInfoMapper.selectOne(CloseStoreRefundInfoDO.builder().closeStoreId(closeStoreId).type(type).build());
+ }
+
+ /**
+ * 根据闭店申请id查询列表
+ * @param closeStoreId 闭店申请id
+ * @return 退款信息列表
+ */
+ public List getListByCloseStoreId(Long closeStoreId, Integer type) {
+ Example example = new Example(CloseStoreRefundInfoDO.class);
+ Example.Criteria criteria = example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId);
+ if (Objects.nonNull(type)) {
+ criteria.andEqualTo("type", type);
+ }
+ example.setOrderByClause("create_time DESC");
+ return closeStoreRefundInfoMapper.selectByExample(example);
+ }
+
+ /**
+ * 根据id删除
+ */
+ public void removeById(Long id) {
+ closeStoreRefundInfoMapper.deleteByPrimaryKey(id);
+ }
+
+ /**
+ * 是否存在非作废状态的记录
+ * @param closeStoreId 闭店申请id
+ * @param type 退款类型
+ * @return 是否存在
+ */
+ public boolean existEffectiveRecord(Long closeStoreId, Integer type) {
+ Example example = new Example(CloseStoreRefundInfoDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andNotEqualTo("refundStatus", RefundPayStatusEnum.ABANDON.getStatus())
+ .andEqualTo("type", type);
+ return closeStoreRefundInfoMapper.selectCountByExample(example) > 0;
+ }
+
+ /**
+ * 获取未完成的退款记录
+ * @return 退款信息
+ */
+ public List getUnfinishedRecords() {
+ Example example = new Example(CloseStoreRefundInfoDO.class);
+ example.createCriteria()
+ .andNotIn("refundStatus", Arrays.asList(RefundPayStatusEnum.PAY_SUCCESS.getStatus(), RefundPayStatusEnum.ABANDON.getStatus()));
+ return closeStoreRefundInfoMapper.selectByExample(example);
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreStageInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreStageInfoDAO.java
new file mode 100644
index 000000000..2f720169d
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreStageInfoDAO.java
@@ -0,0 +1,209 @@
+package com.cool.store.dao;
+
+import cn.hutool.core.collection.CollStreamUtil;
+import com.alibaba.excel.util.CollectionUtils;
+import com.cool.store.entity.CloseStoreStageInfoDO;
+import com.cool.store.enums.ErrorCodeEnum;
+import com.cool.store.enums.close.CloseStoreStageEnum;
+import com.cool.store.enums.close.CloseStoreSubStageEnum;
+import com.cool.store.enums.close.CloseStoreSubStageStatusEnum;
+import com.cool.store.exception.ServiceException;
+import com.cool.store.mapper.CloseStoreStageInfoMapper;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/22 16:54
+ * @Version 1.0
+ */
+@Repository
+public class CloseStoreStageInfoDAO {
+
+ @Resource
+ private CloseStoreStageInfoMapper closeStoreStageInfoMapper;
+
+ /**
+ * 根据闭店阶段查询闭店阶段信息
+ * @param closeStoreId 闭店申请id
+ * @param shopStage 闭店阶段
+ * @param shopSubStage 闭店子阶段,非必填
+ * @return 闭店阶段信息
+ */
+ public CloseStoreStageInfoDO getByStage(Long closeStoreId, Integer shopStage, Integer shopSubStage) {
+ Example example = new Example(CloseStoreStageInfoDO.class);
+ Example.Criteria criteria = example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andEqualTo("shopStage", shopStage)
+ .andEqualTo("deleted", 0);
+ if (Objects.nonNull(shopSubStage)) {
+ criteria.andEqualTo("shopSubStage", shopSubStage);
+ }
+ return closeStoreStageInfoMapper.selectOneByExample(example);
+ }
+
+ /**
+ * 根据子阶段查询闭店阶段信息
+ * @param closeStoreId 闭店申请id
+ * @param subStageList 子阶段列表
+ * @return 阶段信息列表
+ */
+ public List getBySubStage(Long closeStoreId, List subStageList) {
+ if (CollectionUtils.isEmpty(subStageList)) {
+ return Collections.emptyList();
+ }
+ Example example = new Example(CloseStoreStageInfoDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andIn("shopSubStage", subStageList)
+ .andEqualTo("deleted", 0);
+ return closeStoreStageInfoMapper.selectByExample(example);
+ }
+
+ /**
+ * 查询闭店阶段信息
+ * @param closeStoreId 闭店申请id
+ * @return 阶段信息列表
+ */
+ public List getList(Long closeStoreId) {
+ Example example = new Example(CloseStoreStageInfoDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andEqualTo("deleted", 0);
+ example.setOrderByClause("shop_sub_stage ASC");
+ return closeStoreStageInfoMapper.selectByExample(example);
+ }
+
+ /**
+ * 存在未完成的闭店阶段
+ * @param closeStoreId 闭店申请id
+ * @return boolean
+ */
+ public boolean existUnfinishedStage(Long closeStoreId) {
+ return closeStoreStageInfoMapper.selectCount(
+ CloseStoreStageInfoDO.builder()
+ .closeStoreId(closeStoreId)
+ .isTerminated(0)
+ .deleted(0)
+ .build()
+ ) > 0;
+ }
+
+ /**
+ * 校验闭店阶段流程是否为期望流程
+ * @param closeStoreId 闭店申请id
+ * @param shopStage 闭店阶段
+ * @param shopSubStage 闭店子阶段
+ * @param expectedStageStatus 期望闭店子阶段状态
+ */
+ public void verifyStage(Long closeStoreId, CloseStoreStageEnum shopStage, CloseStoreSubStageEnum shopSubStage, CloseStoreSubStageStatusEnum... expectedStageStatus) {
+ CloseStoreStageInfoDO stageInfoDO = getByStage(closeStoreId, shopStage.getCloseStoreStage(), Objects.nonNull(shopSubStage) ? shopSubStage.getCloseStoreSubStage() : null);
+ if (Objects.isNull(stageInfoDO)) {
+ throw new RuntimeException("未查询到审批阶段信息");
+ }
+ if (Objects.nonNull(expectedStageStatus) && expectedStageStatus.length > 0) {
+ for (CloseStoreSubStageStatusEnum stageStatus : expectedStageStatus) {
+ if (stageStatus.getShopSubStageStatus().equals(stageInfoDO.getShopSubStageStatus())) {
+ return;
+ }
+ }
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_SUB_STAGE_ERROR);
+ }
+ }
+
+ /**
+ * 初始化闭店阶段信息
+ * @param closeStoreId 闭店申请id
+ */
+ public void initStageInfo(Long closeStoreId) {
+ List stageInfoList = new ArrayList<>();
+ LocalDate now = LocalDate.now();
+ for (CloseStoreSubStageEnum subStageEnum : CloseStoreSubStageEnum.values()) {
+ CloseStoreSubStageStatusEnum initStatus = subStageEnum.getInitStatus();
+ CloseStoreStageInfoDO stageInfo = CloseStoreStageInfoDO.builder()
+ .closeStoreId(closeStoreId)
+ .shopStage(subStageEnum.getCloseStoreStageEnum().getCloseStoreStage())
+ .shopSubStage(subStageEnum.getCloseStoreSubStage())
+ .shopSubStageStatus(Objects.nonNull(initStatus) ? initStatus.getShopSubStageStatus() : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_00.getShopSubStageStatus())
+ .isTerminated(0)
+ .planCompleteTime(subStageEnum.getPlanCompleteTime(now))
+ .build();
+ stageInfoList.add(stageInfo);
+ }
+ closeStoreStageInfoMapper.insertBatch(stageInfoList);
+ }
+
+ /**
+ * 批量更新Selective
+ * @param list 阶段信息列表
+ * @return 是否成功
+ */
+ public Boolean updateBatchSelective(List list) {
+ if (CollectionUtils.isEmpty(list)) {
+ return false;
+ }
+ return closeStoreStageInfoMapper.updateBatchSelective(list) > 0;
+ }
+
+ /**
+ * 更新Selective
+ * @param stageInfoDO 阶段信息
+ * @return 是否成功
+ */
+ public Boolean updateSelective(CloseStoreStageInfoDO stageInfoDO) {
+ return closeStoreStageInfoMapper.updateByPrimaryKeySelective(stageInfoDO) > 0;
+ }
+
+ /**
+ * 已完成阶段数
+ * @param closeStoreId 闭店申请id
+ * @return 已完成阶段数
+ */
+ public int getCompleteCount(Long closeStoreId) {
+ Example example = new Example(CloseStoreStageInfoDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andEqualTo("isTerminated", 1)
+ .andEqualTo("deleted", 0);
+ return closeStoreStageInfoMapper.selectCountByExample(example);
+ }
+
+ /**
+ * 已完成阶段数
+ * @param closeStoreIds 闭店申请id列表
+ * @return 已完成阶段数
+ */
+ public Map getCompleteCountMap(List closeStoreIds) {
+ if (CollectionUtils.isEmpty(closeStoreIds)) {
+ return Collections.emptyMap();
+ }
+ Example example = new Example(CloseStoreStageInfoDO.class);
+ example.createCriteria()
+ .andIn("closeStoreId", closeStoreIds)
+ .andEqualTo("isTerminated", 1)
+ .andEqualTo("deleted", 0);
+ example.selectProperties("closeStoreId");
+ List list = closeStoreStageInfoMapper.selectByExample(example);
+ return CollStreamUtil.groupBy(list, CloseStoreStageInfoDO::getCloseStoreId, Collectors.counting());
+ }
+
+ /**
+ * 修改子阶段状态
+ * @param closeStoreId 闭店申请id
+ * @param subStatus 子阶段状态枚举类
+ */
+ public void updateSubStageStatus(Long closeStoreId, CloseStoreSubStageStatusEnum subStatus) {
+ CloseStoreSubStageEnum subStage = subStatus.getCloseStoreSubStageEnum();
+ Example example = new Example(CloseStoreStageInfoDO.class);
+ example.createCriteria()
+ .andEqualTo("closeStoreId", closeStoreId)
+ .andEqualTo("shopSubStage", subStage.getCloseStoreSubStage())
+ .andEqualTo("deleted", 0);
+ closeStoreStageInfoMapper.updateByExampleSelective(CloseStoreStageInfoDO.builder().shopSubStageStatus(subStatus.getShopSubStageStatus()).build(), example);
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java
index 91b95e073..20dab3b50 100644
--- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java
@@ -14,6 +14,10 @@ import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
@Repository
public class StoreDao {
@@ -146,4 +150,35 @@ public class StoreDao {
public boolean updateStoreScore(String storeId, BigDecimal score) {
return storeMapper.updateStoreScore(storeId, score) > 0;
}
+ /**
+ * 修改门店营业状态
+ * @param storeId 门店id
+ * @param storeStatus 门店营业状态
+ */
+ public void updateStoreStatus(String storeId, String storeStatus) {
+ storeMapper.updateStoreStatus(storeId,storeStatus);
+ }
+
+ /**
+ * 门店状态改为闭店
+ * @param storeId 门店id
+ * @param closeReason 闭店原因
+ * @param closeNature 闭店性质
+ */
+ public void closeStore(String storeId, Integer closeReason, Integer closeNature, Date actualCloseData) {
+ if (storeMapper.closeStore(storeId, actualCloseData) > 0) {
+ storeMapper.insertOrUpdateCloseInfo(storeId, closeReason, closeNature);
+ }
+ }
+
+ /**
+ * 查询最近没有订货记录的门店
+ * @param latestDate 最近订货时间
+ * @param businessTypes 商圈类型
+ * @param inBusinessType 在列表内
+ * @return 门店列表
+ */
+ public List getNoOrderStore(LocalDate latestDate, List businessTypes, Boolean inBusinessType) {
+ return storeMapper.getNoOrderStore(latestDate, businessTypes, inBusinessType);
+ }
}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java
index 75a361452..b23f6492b 100644
--- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java
@@ -34,4 +34,11 @@ public class StoreMasterSignerInfoDAO {
List list = storeMasterSignerInfoMapper.selectByStoreIds(storeIds);
return CollStreamUtil.toMap(list, StoreMasterSignerInfoDO::getStoreId, v -> v);
}
+
+ /**
+ * 根据门店id查询
+ */
+ public StoreMasterSignerInfoDO getByStoreId(String storeId) {
+ return storeMasterSignerInfoMapper.selectOne(StoreMasterSignerInfoDO.builder().storeId(storeId).build());
+ }
}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAccountInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAccountInfoMapper.java
new file mode 100644
index 000000000..a86624df3
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAccountInfoMapper.java
@@ -0,0 +1,16 @@
+package com.cool.store.mapper;
+
+import com.cool.store.entity.CloseStoreAccountInfoDO;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+public interface CloseStoreAccountInfoMapper extends Mapper {
+
+ /**
+ * 批量新增
+ * @param list 账号列表
+ * @return int
+ */
+ int insertBatch(List list);
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAuditRecordMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAuditRecordMapper.java
new file mode 100644
index 000000000..3d3d555dc
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAuditRecordMapper.java
@@ -0,0 +1,32 @@
+package com.cool.store.mapper;
+
+import com.cool.store.entity.CloseStoreAuditRecordDO;
+import com.cool.store.request.close.store.CloseStoreQueryRequest;
+import com.cool.store.vo.close.store.CloseStoreInfoListVO;
+import org.apache.ibatis.annotations.Param;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+public interface CloseStoreAuditRecordMapper extends Mapper {
+
+ /**
+ * 根据closeStoreId查询记录
+ * @param closeStoreId
+ * @return
+ */
+ List getRecordListByCloseStoreId( @Param("closeStoreId") Long closeStoreId);
+
+
+ /**
+ * 查询权限下的闭店申请审批记录
+ * @param request 闭店申请查询Request
+ * @param userId 用户id
+ * @param isAdmin 是管理员权限
+ * @return 闭店申请记录列表VO列表
+ */
+ List getCloseStoreAuditList(@Param("request") CloseStoreQueryRequest request,
+ @Param("userId") String userId,
+ @Param("isAdmin") Boolean isAdmin);
+
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileDetailMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileDetailMapper.java
new file mode 100644
index 000000000..2124b2092
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileDetailMapper.java
@@ -0,0 +1,35 @@
+package com.cool.store.mapper;
+
+import com.cool.store.request.close.file.CloseStoreMailAddressRequest;
+import com.cool.store.entity.CloseStoreFileDetailDO;
+import com.cool.store.request.close.file.CloseStoreFileApproveRequest;
+import com.cool.store.request.close.file.CloseStoreMailInfoRequest;
+import org.apache.ibatis.annotations.Param;
+import tk.mybatis.mapper.common.Mapper;
+
+public interface CloseStoreFileDetailMapper extends Mapper {
+
+ /**
+ * 新增或编辑闭店资料邮寄地址信息
+ * @param request 闭店资料邮寄地址信息Request
+ * @return int
+ */
+ int insertOrUpdateMailAddress(CloseStoreMailAddressRequest request);
+
+ /**
+ * 新增或编辑闭店资料邮寄信息
+ * @param request 闭店资料邮寄信息Request
+ * @param mailStatus 邮寄状态
+ * @return int
+ */
+ int insertOrUpdateMailInfo(@Param("request") CloseStoreMailInfoRequest request,
+ @Param("mailStatus") Boolean mailStatus);
+
+ /**
+ * 新增或编辑闭店资料信息
+ * @param request 闭店材料审批Request
+ * @return int
+ */
+ int insertOrUpdateFileInfoSelective(@Param("request") CloseStoreFileApproveRequest request,
+ @Param("approveComplete") Boolean approveComplete);
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileInfoMapper.java
new file mode 100644
index 000000000..68847b2f2
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileInfoMapper.java
@@ -0,0 +1,37 @@
+package com.cool.store.mapper;
+
+import com.cool.store.entity.CloseStoreFileInfoDO;
+import org.apache.ibatis.annotations.Param;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+public interface CloseStoreFileInfoMapper extends Mapper {
+
+ /**
+ * 批量更新
+ * @param list 实体列表
+ * @return int
+ */
+ int updateBatch(List list);
+
+ /**
+ * 批量新增
+ * @param list 实体列表
+ * @return int
+ */
+ int insertBatch(List list);
+
+ /**
+ * 修改材料
+ * @param id 主键id
+ * @param urls 图片列表
+ */
+ int updateFile(@Param("id") Long id, @Param("urls") String urls);
+
+ /**
+ * 更新材料状态为审批状态
+ * @param closeStoreId 闭店申请id
+ */
+ void updateFileStatusToApproveStatus(@Param("closeStoreId") Long closeStoreId);
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreInfoMapper.java
new file mode 100644
index 000000000..68a23b45b
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreInfoMapper.java
@@ -0,0 +1,19 @@
+package com.cool.store.mapper;
+
+import com.cool.store.entity.CloseStoreInfoDO;
+import com.cool.store.request.close.store.CloseStoreQueryRequest;
+import com.cool.store.vo.close.store.CloseStoreInfoListVO;
+import org.apache.ibatis.annotations.Param;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+public interface CloseStoreInfoMapper extends Mapper {
+
+ /**
+ * 查询闭店申请记录
+ * @param request 闭店申请查询Request
+ * @return 闭店申请记录列表VO
+ */
+ List getCloseStoreInfoList(@Param("request") CloseStoreQueryRequest request, @Param("regionIds") List regionIds);
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreRefundInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreRefundInfoMapper.java
new file mode 100644
index 000000000..37725f2b2
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreRefundInfoMapper.java
@@ -0,0 +1,20 @@
+package com.cool.store.mapper;
+
+import com.cool.store.entity.CloseStoreRefundInfoDO;
+import org.apache.ibatis.annotations.Param;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+public interface CloseStoreRefundInfoMapper extends Mapper {
+
+ /**
+ * 批量新增
+ */
+ void insertBatch(@Param("list") List list);
+
+ /**
+ * 根据id批量更新退款状态
+ */
+ void updateRefundStatusBatchById(@Param("list") List list);
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreStageInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreStageInfoMapper.java
new file mode 100644
index 000000000..db036551b
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreStageInfoMapper.java
@@ -0,0 +1,23 @@
+package com.cool.store.mapper;
+
+import com.cool.store.entity.CloseStoreStageInfoDO;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+public interface CloseStoreStageInfoMapper extends Mapper {
+
+ /**
+ * 批量新增
+ * @param list 阶段信息列表
+ * @return int
+ */
+ int insertBatch(List list);
+
+ /**
+ * 批量更新Selective
+ * @param list 阶段信息列表
+ * @return int
+ */
+ int updateBatchSelective(List list);
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java
index fef08b58a..2234439d5 100644
--- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java
@@ -8,6 +8,8 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
import java.util.List;
@Mapper
@@ -78,4 +80,34 @@ public interface StoreMapper {
* @param score 积分
*/
int updateStoreScore(String storeId, BigDecimal score);
+ /**
+ * 修改门店营业状态
+ * @param storeId 门店id
+ * @param storeStatus 门店营业状态
+ */
+ void updateStoreStatus(@Param("storeId") String storeId, @Param("storeStatus") String storeStatus);
+
+ /**
+ * 门店状态改为闭店
+ * @param storeId 门店id
+ */
+ int closeStore(@Param("storeId") String storeId, @Param("actualCloseData") Date actualCloseData);
+
+ /**
+ * 新增或编辑闭店信息
+ * @param storeId 门店id
+ * @param closeReason 闭店原因
+ * @param closeNature 闭店性质
+ * @return int
+ */
+ int insertOrUpdateCloseInfo(@Param("storeId") String storeId, @Param("closeReason") Integer closeReason, @Param("closeNature") Integer closeNature);
+
+ /**
+ * 查询最近没有订货记录的门店
+ * @param latestDate 最近订货时间
+ * @param businessTypes 商圈类型
+ * @param inBusinessType 在列表内
+ * @return 门店列表
+ */
+ List getNoOrderStore(@Param("latestDate") LocalDate latestDate, @Param("businessTypes") List businessTypes, @Param("inBusinessType") Boolean inBusinessType);
}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java
index 67e2231e3..546b29a2c 100644
--- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java
@@ -3,6 +3,7 @@ package com.cool.store.mapper.store;
import com.cool.store.entity.store.StoreMasterSignerInfoDO;
import org.apache.ibatis.annotations.Param;
+import tk.mybatis.mapper.common.Mapper;
import java.util.List;
@@ -10,7 +11,7 @@ import java.util.List;
* @author zhangchenbiao
* @date 2025-09-23 11:32
*/
-public interface StoreMasterSignerInfoMapper {
+public interface StoreMasterSignerInfoMapper extends Mapper {
/**
* 根据门店id查询签约信息
diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAccountInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAccountInfoMapper.xml
new file mode 100644
index 000000000..7016be403
--- /dev/null
+++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAccountInfoMapper.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO zxjp_close_store_account_info (close_store_id, system_name, system_code, account_type, status, close_type)
+ VALUES
+
+ (#{item.closeStoreId}, #{item.systemName}, #{item.systemCode}, #{item.accountType}, #{item.status}, #{item.closeType})
+
+
+
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAuditRecordMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAuditRecordMapper.xml
new file mode 100644
index 000000000..6d4e77299
--- /dev/null
+++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAuditRecordMapper.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileDetailMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileDetailMapper.xml
new file mode 100644
index 000000000..d502e058a
--- /dev/null
+++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileDetailMapper.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO zxjp_close_store_file_detail
+ (close_store_id, mail_address, mail_addressee, mail_mobile)
+ VALUES
+ (#{closeStoreId}, #{mailAddress}, #{mailAddressee}, #{mailMobile})
+ ON DUPLICATE KEY UPDATE
+ mail_address = VALUES(mail_address),
+ mail_addressee = VALUES(mail_addressee),
+ mail_mobile = VALUES(mail_mobile)
+
+
+
+ INSERT INTO zxjp_close_store_file_detail
+ (close_store_id, mail_number, mail_company, mail_status)
+ VALUES
+ (#{request.closeStoreId}, #{request.mailNumber}, #{request.mailCompany}, #{mailStatus})
+ ON DUPLICATE KEY UPDATE
+ mail_number = VALUES(mail_number),
+ mail_company = VALUES(mail_company),
+ mail_status = VALUES(mail_status)
+
+
+
+ INSERT INTO zxjp_close_store_file_detail
+
+ close_store_id,
+ bank_account,
+ bank_opening,
+ refund_account,
+ approve_complete,
+
+
+ #{request.closeStoreId},
+ #{request.bankAccount},
+ #{request.bankOpening},
+ #{request.refundAccount},
+ #{approveComplete},
+
+ ON DUPLICATE KEY UPDATE
+
+ bank_account = VALUES(bank_account),
+ bank_opening = VALUES(bank_opening),
+ refund_account = VALUES(refund_account),
+ approve_complete = VALUES(approve_complete),
+
+
+
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileInfoMapper.xml
new file mode 100644
index 000000000..ef6924f0a
--- /dev/null
+++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileInfoMapper.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UPDATE zxjp_close_store_file_info
+
+
+
+ WHEN id = #{item.id} THEN #{item.mailStatus}
+
+
+
+
+ WHEN id = #{item.id} THEN #{item.approveStatus}
+
+
+
+
+ WHEN id = #{item.id} THEN #{item.approveOpinion}
+
+
+
+ WHERE id IN
+
+ #{item.id}
+
+
+
+
+ INSERT INTO zxjp_close_store_file_info (close_store_id, file_code, file_name, mail_status, approve_status, approve_opinion)
+ VALUES
+
+ (#{item.closeStoreId}, #{item.fileCode}, #{item.fileName}, #{item.mailStatus}, #{item.approveStatus}, #{item.approveOpinion})
+
+
+
+
+ UPDATE zxjp_close_store_file_info
+ SET urls = #{urls},
+ file_status = CASE WHEN file_status = 2 THEN 5 WHEN file_status = 5 THEN 5 ELSE 3 END
+ WHERE id = #{id} AND file_status IN (0, 2, 3, 5)
+
+
+
+ UPDATE zxjp_close_store_file_info
+ SET file_status = approve_status
+ WHERE close_store_id = #{closeStoreId}
+
+
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreInfoMapper.xml
new file mode 100644
index 000000000..0b79a0263
--- /dev/null
+++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreInfoMapper.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreRefundInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreRefundInfoMapper.xml
new file mode 100644
index 000000000..2a47b27c6
--- /dev/null
+++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreRefundInfoMapper.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO zxjp_close_store_refund_info (
+ close_store_id,
+ refund_no,
+ type,
+ refund_status,
+ refund_order_no,
+ refund_time,
+ invoice_title,
+ submitter_id,
+ submitter_name,
+ refund_reason,
+ refund_type,
+ refund_project,
+ remark,
+ business_code,
+ business_name,
+ business_account,
+ expense_type_code,
+ expense_apply_time,
+ expected_amount,
+ actual_amount,
+ deduct_amount,
+ deduct_reason,
+ close_reason,
+ ) VALUES
+
+ (
+ #{item.closeStoreId,jdbcType=BIGINT},
+ #{item.refundNo,jdbcType=VARCHAR},
+ #{item.type,jdbcType=INTEGER},
+ #{item.refundStatus,jdbcType=BIT},
+ #{item.refundOrderNo,jdbcType=VARCHAR},
+ #{item.refundTime,jdbcType=TIMESTAMP},
+ #{item.invoiceTitle,jdbcType=VARCHAR},
+ #{item.submitterId,jdbcType=VARCHAR},
+ #{item.submitterName,jdbcType=VARCHAR},
+ #{item.refundReason,jdbcType=VARCHAR},
+ #{item.refundType,jdbcType=VARCHAR},
+ #{item.refundProject,jdbcType=VARCHAR},
+ #{item.remark,jdbcType=VARCHAR},
+ #{item.businessCode,jdbcType=VARCHAR},
+ #{item.businessName,jdbcType=VARCHAR},
+ #{item.businessAccount,jdbcType=VARCHAR},
+ #{item.expenseTypeCode,jdbcType=VARCHAR},
+ #{item.expenseApplyTime,jdbcType=DATE},
+ #{item.expectedAmount,jdbcType=DECIMAL},
+ #{item.actualAmount,jdbcType=DECIMAL},
+ #{item.deductAmount,jdbcType=DECIMAL},
+ #{item.deductReason,jdbcType=VARCHAR},
+ #{item.closeReason,jdbcType=TINYINT},
+ )
+
+
+
+
+ UPDATE zxjp_close_store_refund_info
+
+
+
+ WHEN id = #{item.id} THEN #{item.refundStatus}
+
+
+
+ WHERE id IN
+
+ #{item.id}
+
+
+
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreStageInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreStageInfoMapper.xml
new file mode 100644
index 000000000..4c72c5023
--- /dev/null
+++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreStageInfoMapper.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO zxjp_close_store_stage_info (close_store_id, shop_stage, shop_sub_stage, shop_sub_stage_status, is_terminated, plan_complete_time, actual_complete_time, remark, audit_id)
+ VALUES
+
+ (#{item.closeStoreId}, #{item.shopStage}, #{item.shopSubStage}, #{item.shopSubStageStatus}, #{item.isTerminated}, #{item.planCompleteTime}, #{item.actualCompleteTime}, #{item.remark}, #{item.auditId})
+
+
+
+
+
+ UPDATE zxjp_close_store_stage_info
+
+
+ shop_stage = #{item.shopStage},
+
+
+ shop_sub_stage = #{item.shopSubStage},
+
+
+ shop_sub_stage_status = #{item.shopSubStageStatus},
+
+
+ is_terminated = #{item.isTerminated},
+
+
+ plan_complete_time = #{item.planCompleteTime},
+
+
+ actual_complete_time = #{item.actualCompleteTime},
+
+
+ remark = #{item.remark},
+
+
+ audit_id = #{item.auditId},
+
+ update_time = NOW()
+
+ WHERE id = #{item.id}
+
+
+
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml
index 8477b4708..1a974b618 100644
--- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml
+++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml
@@ -285,4 +285,46 @@
ON DUPLICATE KEY UPDATE
score = values(score)
+
+
+ UPDATE store_${enterpriseId}
+ SET store_status = #{storeStatus}
+ WHERE store_id = #{storeId} AND is_delete = 'effective'
+
+
+
+ UPDATE store_${enterpriseId}
+ SET store_status = 'closed',
+ close_store_time = #{actualCloseData}
+ WHERE store_id = #{storeId} AND is_delete = 'effective' AND store_status != 'closed'
+
+
+
+ INSERT INTO store_extend_info_${enterpriseId}(store_id, close_reason, close_nature)
+ VALUES(#{storeId}, #{closeReason}, #{closeNature})
+ ON DUPLICATE KEY UPDATE
+ close_reason = VALUES(close_reason),
+ close_nature = VALUES(close_nature)
+
+
+
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/close/CloseStoreMkUserDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/close/CloseStoreMkUserDTO.java
new file mode 100644
index 000000000..ff198278c
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/close/CloseStoreMkUserDTO.java
@@ -0,0 +1,34 @@
+package com.cool.store.dto.close;
+
+import lombok.Data;
+
+/**
+ *
+ * 每刻用户信息DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+public class CloseStoreMkUserDTO {
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 工号
+ */
+ private String jobnumber;
+
+ /**
+ * 部门编码
+ */
+ private String depCode;
+
+ /**
+ * 部门名称
+ */
+ private String depName;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreMasterIssueDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreMasterIssueDTO.java
new file mode 100644
index 000000000..ce1562300
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreMasterIssueDTO.java
@@ -0,0 +1,30 @@
+package com.cool.store.dto.store;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ *
+ * 门店主数据下发DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/10
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoreMasterIssueDTO {
+ /**
+ * 企业id
+ */
+ private String enterpriseId;
+
+ /**
+ * 门店id列表
+ */
+ private List storeIds;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjBranchBankDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjBranchBankDTO.java
new file mode 100644
index 000000000..d27727998
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjBranchBankDTO.java
@@ -0,0 +1,23 @@
+package com.cool.store.dto.xgj;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 新管家支行DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/12/1
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class XgjBranchBankDTO {
+ @ApiModelProperty("银行名称")
+ private String matchBankName;
+
+ @ApiModelProperty("支行号")
+ private String basBankNo;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerAccountDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerAccountDTO.java
new file mode 100644
index 000000000..81bc3e8a0
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerAccountDTO.java
@@ -0,0 +1,32 @@
+package com.cool.store.dto.xgj;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 新管家供应商账户信息DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class XgjPartnerAccountDTO {
+ @ApiModelProperty("账户名称")
+ private String accountName;
+
+ @ApiModelProperty("银行账号")
+ private String accountNumber;
+
+ @ApiModelProperty("开户银行")
+ private String bankName;
+
+ @ApiModelProperty("开户支行号")
+ private String bankBranchNo;
+
+ @ApiModelProperty("账户类型")
+ private String accountType;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerDTO.java
new file mode 100644
index 000000000..ecda12762
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerDTO.java
@@ -0,0 +1,43 @@
+package com.cool.store.dto.xgj;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 新管家供应商DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class XgjPartnerDTO {
+ @ApiModelProperty("父节点名称")
+ private String parentName;
+
+ @ApiModelProperty("父节点编码")
+ private String parentBizCode;
+
+ @ApiModelProperty("往来单位名称")
+ private String name;
+
+ @ApiModelProperty("往来单位英文名")
+ private String nameEN;
+
+ @ApiModelProperty("往来单位编码")
+ private String businessCode;
+
+ @ApiModelProperty("往来单位关系")
+ private List partnerType;
+
+ @ApiModelProperty("往来单位性质")
+ private List partnerProperty;
+
+ @ApiModelProperty("账户信息")
+ private List accounts;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerPageDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerPageDTO.java
new file mode 100644
index 000000000..5b7f9052c
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerPageDTO.java
@@ -0,0 +1,25 @@
+package com.cool.store.dto.xgj;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 新管家分页DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class XgjPartnerPageDTO {
+ @ApiModelProperty("是否有下一页")
+ private Boolean hasNextPage;
+
+ @ApiModelProperty("列表")
+ private List dataList;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPayResultDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPayResultDTO.java
new file mode 100644
index 000000000..4c5d97b48
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPayResultDTO.java
@@ -0,0 +1,31 @@
+package com.cool.store.dto.xgj;
+
+import com.cool.store.enums.close.XgjRefundPayStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 信管家支付结果DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/12/3
+ */
+@Data
+public class XgjPayResultDTO {
+ /**
+ * {@link XgjRefundPayStatusEnum#getStatus()}
+ */
+ @ApiModelProperty("支付状态")
+ private String status;
+
+ @ApiModelProperty("msg")
+ private String message;
+
+ @ApiModelProperty("每刻订单号")
+ private String outNo;
+
+ @ApiModelProperty("支付成功时间,yyyy-MM-dd HH:mm:ss")
+ private String paySuccessTime;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPaymentDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPaymentDTO.java
new file mode 100644
index 000000000..26e61b9d5
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPaymentDTO.java
@@ -0,0 +1,33 @@
+package com.cool.store.dto.xgj;
+
+import com.cool.store.enums.close.XgjRefundPayStatusEnum;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 新管家单据支付结果DTO
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class XgjPaymentDTO {
+ @ApiModelProperty("每刻单号")
+ private String outNo;
+
+ @ApiModelProperty("新管家单号")
+ private String orderNo;
+
+ /**
+ * {@link XgjRefundPayStatusEnum#getStatus()}
+ */
+ @ApiModelProperty("支付状态")
+ private String status;
+
+ @ApiModelProperty("反馈信息")
+ private String message;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAccountInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAccountInfoDO.java
new file mode 100644
index 000000000..15e466c21
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAccountInfoDO.java
@@ -0,0 +1,70 @@
+package com.cool.store.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "zxjp_close_store_account_info")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreAccountInfoDO {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 闭店申请ID
+ */
+ @Column(name = "close_store_id")
+ private Long closeStoreId;
+
+ /**
+ * 系统名称
+ */
+ @Column(name = "system_name")
+ private String systemName;
+
+ /**
+ * 系统code
+ */
+ @Column(name = "system_code")
+ private String systemCode;
+
+ /**
+ * 账号分类,0-IT账号,1-外卖账号
+ */
+ @Column(name = "account_type")
+ private Integer accountType;
+
+ /**
+ * 状态:1-使用中, 2-已关闭, 3-关闭中
+ */
+ @Column(name = "status")
+ private Integer status;
+
+ /**
+ * 关闭类型,0直接关闭,1申请关闭
+ */
+ @Column(name = "close_type")
+ private Integer closeType;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "update_time")
+ private Date updateTime;
+
+
+}
\ No newline at end of file
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAuditRecordDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAuditRecordDO.java
new file mode 100644
index 000000000..71ae2a6c0
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAuditRecordDO.java
@@ -0,0 +1,92 @@
+package com.cool.store.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "zxjp_close_store_audit_record")
+@Data@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CloseStoreAuditRecordDO {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 闭店申请ID
+ */
+ @Column(name = "close_store_id")
+ private Long closeStoreId;
+
+ /**
+ * 记录类型:1-申请提交,2-审批操作
+ */
+ @Column(name = "record_type")
+ private Integer recordType;
+
+ /**
+ * 备注
+ */
+ @Column(name = "action_remark")
+ private String actionRemark;
+
+ /**
+ * 实际处理人
+ */
+ @Column(name = "handler_user_id")
+ private String handlerUserId;
+
+ /**
+ * 实际处理人名称
+ */
+ @Column(name = "handler_user_name")
+ private String handlerUserName;
+
+ /**
+ * 处理人集合
+ */
+ @Column(name = "handler_user_ids")
+ private String handlerUserIds;
+
+ /**
+ * 收到任务时间
+ */
+ @Column(name = "receive_task_time")
+ private Date receiveTaskTime;
+
+ /**
+ * 完成任务时间
+ */
+ @Column(name = "finish_task_time")
+ private Date finishTaskTime;
+
+ /**
+ * 审核状态 0待处理,1通过,2拒绝
+ */
+ @Column(name = "audit_status")
+ private Integer auditStatus;
+
+ /**
+ * 删除标识
+ */
+ private Integer deleted;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "updated_time")
+ private Date updatedTime;
+
+
+}
\ No newline at end of file
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileDetailDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileDetailDO.java
new file mode 100644
index 000000000..e2984f665
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileDetailDO.java
@@ -0,0 +1,115 @@
+package com.cool.store.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import javax.persistence.*;
+
+/**
+ *
+ * 闭店资料详情
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Table(name = "zxjp_close_store_file_detail")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreFileDetailDO {
+ /**
+ * id
+ */
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 闭店申请ID
+ */
+ @Column(name = "close_store_id")
+ private Long closeStoreId;
+
+ /**
+ * 审批完成状态
+ */
+ @Column(name = "approve_complete")
+ private Integer approveComplete;
+
+ /**
+ * 邮件单号
+ */
+ @Column(name = "mail_number")
+ private String mailNumber;
+
+ /**
+ * 邮件状态,0未邮寄,1已邮寄
+ */
+ @Column(name = "mail_status")
+ private Integer mailStatus;
+
+ /**
+ * 快递公司
+ */
+ @Column(name = "mail_company")
+ private String mailCompany;
+
+ /**
+ * 材料邮寄地址
+ */
+ @Column(name = "mail_address")
+ private String mailAddress;
+
+ /**
+ * 收件人
+ */
+ @Column(name = "mail_addressee")
+ private String mailAddressee;
+
+ /**
+ * 收件人手机号
+ */
+ @Column(name = "mail_mobile")
+ private String mailMobile;
+
+ /**
+ * 户名
+ */
+ @Column(name = "bank_account")
+ private String bankAccount;
+
+ /**
+ * 开户行
+ */
+ @Column(name = "bank_opening")
+ private String bankOpening;
+
+ /**
+ * 退款账号
+ */
+ @Column(name = "refund_account")
+ private String refundAccount;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "update_time")
+ private Date updateTime;
+
+ /**
+ * 督导审批意见
+ */
+ @Column(name = "remark")
+ private String remark;
+}
\ No newline at end of file
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileInfoDO.java
new file mode 100644
index 000000000..e511658f5
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileInfoDO.java
@@ -0,0 +1,80 @@
+package com.cool.store.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "zxjp_close_store_file_info")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreFileInfoDO {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 闭店申请ID
+ */
+ @Column(name = "close_store_id")
+ private Long closeStoreId;
+
+ /**
+ * 资料code
+ */
+ @Column(name = "file_code")
+ private String fileCode;
+
+ /**
+ * 资料名称
+ */
+ @Column(name = "file_name")
+ private String fileName;
+
+ /**
+ * 邮件状态
+ */
+ @Column(name = "mail_status")
+ private Integer mailStatus;
+
+ /**
+ * 材料审批状态 1-合格 2-不合格
+ */
+ @Column(name = "approve_status")
+ private Integer approveStatus;
+
+ /**
+ * 材料状态 0-未上传 1-合格 2-不合格 3-已上传 4-审批中 5-已修改
+ */
+ @Column(name = "file_status")
+ private Integer fileStatus;
+
+ /**
+ * 审批意见
+ */
+ @Column(name = "approve_opinion")
+ private String approveOpinion;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "update_time")
+ private Date updateTime;
+
+ /**
+ * 图片列表
+ */
+ @Column(name = "urls")
+ private String urls;
+}
\ No newline at end of file
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreInfoDO.java
new file mode 100644
index 000000000..b7ee3ee80
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreInfoDO.java
@@ -0,0 +1,98 @@
+package com.cool.store.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "zxjp_close_store_info")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreInfoDO {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 闭店申请单号
+ */
+ @Column(name = "close_store_no")
+ private String closeStoreNo;
+
+ /**
+ * 门店ID
+ */
+ @Column(name = "store_id")
+ private String storeId;
+
+ /**
+ * 区域ID
+ */
+ @Column(name = "region_id")
+ private Long regionId;
+
+ /**
+ * 计划闭店日期
+ */
+ @Column(name = "plan_close_data")
+ private Date planCloseData;
+
+ /**
+ * 实际闭店日期
+ */
+ @Column(name = "actual_close_data")
+ private Date actualCloseData;
+
+ /**
+ * 闭店发起方式 1-主动发起 2-云流水发起
+ */
+ @Column(name = "close_type")
+ private Integer closeType;
+
+ /**
+ * 闭店原因
+ */
+ @Column(name = "close_reason")
+ private Integer closeReason;
+
+ /**
+ * 闭店原因说明
+ */
+ @Column(name = "reason_description")
+ private String reasonDescription;
+
+ /**
+ * 闭店状态 1-审批中 5-审核未通过 10-进行中 15已完成 20-已取消
+ */
+ @Column(name = "close_status")
+ private Integer closeStatus;
+
+ /**
+ * 督导
+ */
+ @Column(name = "supervisor_user_id")
+ private String supervisorUserId;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "update_time")
+ private Date updateTime;
+
+ /**
+ * 发起人id
+ */
+ @Column(name = "apply_user_id")
+ private String applyUserId;
+}
\ No newline at end of file
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreRefundInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreRefundInfoDO.java
new file mode 100644
index 000000000..83d37eee1
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreRefundInfoDO.java
@@ -0,0 +1,190 @@
+package com.cool.store.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "zxjp_close_store_refund_info")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreRefundInfoDO {
+ /**
+ * id
+ */
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 闭店申请id
+ */
+ @Column(name = "close_store_id")
+ private Long closeStoreId;
+
+ /**
+ * 退款申请单号
+ */
+ @Column(name = "refund_no")
+ private String refundNo;
+
+ /**
+ * 退款类型(闭店子阶段code)
+ */
+ private Integer type;
+
+ /**
+ * 退款状态
+ */
+ @Column(name = "refund_status")
+ private String refundStatus;
+
+ /**
+ * 每刻退款单号
+ */
+ @Column(name = "refund_order_no")
+ private String refundOrderNo;
+
+ /**
+ * 退款时间
+ */
+ @Column(name = "refund_time")
+ private Date refundTime;
+
+ /**
+ * 公司抬头
+ */
+ @Column(name = "invoice_title")
+ private String invoiceTitle;
+
+ /**
+ * 提交人id
+ */
+ @Column(name = "submitter_id")
+ private String submitterId;
+
+ /**
+ * 提交人名称
+ */
+ @Column(name = "submitter_name")
+ private String submitterName;
+
+ /**
+ * 退款事由
+ */
+ @Column(name = "refund_reason")
+ private String refundReason;
+
+ /**
+ * 退款类型,加盟部/加盟公司等
+ */
+ @Column(name = "refund_type")
+ private String refundType;
+
+ /**
+ * 退款项目,加盟关店设备退款/加盟关店费用等
+ */
+ @Column(name = "refund_project")
+ private String refundProject;
+
+ /**
+ * 其他说明
+ */
+ private String remark;
+
+ /**
+ * 退款加盟商编码
+ */
+ @Column(name = "business_code")
+ private String businessCode;
+
+ /**
+ * 退款加盟商名称
+ */
+ @Column(name = "business_name")
+ private String businessName;
+
+ /**
+ * 退款加盟商收款账户
+ */
+ @Column(name = "business_account")
+ private String businessAccount;
+
+ /**
+ * 费用类型code
+ */
+ @Column(name = "expense_type_code")
+ private String expenseTypeCode;
+
+ /**
+ * 费用申请日期
+ */
+ @Column(name = "expense_apply_time")
+ private Date expenseApplyTime;
+
+ /**
+ * 应退金额
+ */
+ @Column(name = "expected_amount")
+ private BigDecimal expectedAmount;
+
+ /**
+ * 实退金额
+ */
+ @Column(name = "actual_amount")
+ private BigDecimal actualAmount;
+
+ /**
+ * 扣款金额
+ */
+ @Column(name = "deduct_amount")
+ private BigDecimal deductAmount;
+
+ /**
+ * 扣款原因
+ */
+ @Column(name = "deduct_reason")
+ private String deductReason;
+
+ /**
+ * 闭店原因
+ */
+ @Column(name = "close_reason")
+ private Integer closeReason;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "update_time")
+ private Date updateTime;
+
+ /**
+ * 银行账户
+ */
+ @Column(name = "account_number")
+ private String accountNumber;
+
+ /**
+ * 开户行
+ */
+ @Column(name = "bank_name")
+ private String bankName;
+
+ /**
+ * 联行号
+ */
+ @Column(name = "bank_branch_no")
+ private String bankBranchNo;
+}
\ No newline at end of file
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreStageInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreStageInfoDO.java
new file mode 100644
index 000000000..0ead7337b
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreStageInfoDO.java
@@ -0,0 +1,92 @@
+package com.cool.store.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "zxjp_close_store_stage_info")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreStageInfoDO {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 闭店申请ID
+ */
+ @Column(name = "close_store_id")
+ private Long closeStoreId;
+
+ /**
+ * 闭店阶段
+ */
+ @Column(name = "shop_stage")
+ private Integer shopStage;
+
+ /**
+ * 闭店子阶段
+ */
+ @Column(name = "shop_sub_stage")
+ private Integer shopSubStage;
+
+ /**
+ * 店铺阶段状态
+ */
+ @Column(name = "shop_sub_stage_status")
+ private Integer shopSubStageStatus;
+
+ /**
+ * 当前阶段是否结束 0未结束 1已结束
+ */
+ @Column(name = "is_terminated")
+ private Integer isTerminated;
+
+ /**
+ * 预估完成时间
+ */
+ @Column(name = "plan_complete_time")
+ private String planCompleteTime;
+
+ /**
+ * 实际完成时间
+ */
+ @Column(name = "actual_complete_time")
+ private String actualCompleteTime;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * xfsg_shop_audit_info.id
+ */
+ @Column(name = "audit_id")
+ private Long auditId;
+
+ /**
+ * 删除标识
+ */
+ private Integer deleted;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "update_time")
+ private Date updateTime;
+
+
+}
\ No newline at end of file
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java
index f3518fc6f..69f5450f5 100644
--- a/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java
+++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java
@@ -18,6 +18,7 @@ import lombok.NoArgsConstructor;
@Builder
@NoArgsConstructor
@AllArgsConstructor
+@Table(name = "store_master_signer_info_${enterpriseId}")
public class StoreMasterSignerInfoDO implements Serializable {
@ApiModelProperty("主键")
private Long id;
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileApproveRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileApproveRequest.java
new file mode 100644
index 000000000..bf08bca0c
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileApproveRequest.java
@@ -0,0 +1,42 @@
+package com.cool.store.request.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ *
+ * 闭店材料审批Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreFileApproveRequest {
+ @ApiModelProperty(value = "闭店申请id", required = true)
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("材料信息列表")
+ @NotEmpty(message = "材料信息列表不能为空")
+ private List fileList;
+
+ @ApiModelProperty("户名")
+ private String bankAccount;
+
+ @ApiModelProperty("开户行")
+ private String bankOpening;
+
+ @ApiModelProperty("退款账号")
+ private String refundAccount;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileAuditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileAuditRequest.java
new file mode 100644
index 000000000..dbe814b64
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileAuditRequest.java
@@ -0,0 +1,28 @@
+package com.cool.store.request.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店审批Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/26
+ */
+@Data
+public class CloseStoreFileAuditRequest {
+ @ApiModelProperty("闭店申请id")
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("审批状态 1通过 2拒绝")
+ @NotNull(message = "审批状态不能为空")
+ private Integer status;
+
+ @ApiModelProperty("审批意见")
+ private String remark;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileInfoRequest.java
new file mode 100644
index 000000000..cf5597712
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileInfoRequest.java
@@ -0,0 +1,46 @@
+package com.cool.store.request.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店材料信息Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+public class CloseStoreFileInfoRequest {
+ @ApiModelProperty("闭店申请id")
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("闭店材料id")
+ @NotNull(message = "闭店材料id不能为空")
+ private Long id;
+
+ @ApiModelProperty("邮件状态 0-未邮寄 1已邮寄")
+ private Integer mailStatus;
+
+ @ApiModelProperty("材料审批状态 1-合格 2-不合格")
+ private Integer approveStatus;
+
+ @ApiModelProperty("审批意见")
+ private String approveOpinion;
+
+ @ApiModelProperty("图片列表")
+ private String urls;
+
+ @ApiModelProperty("户名")
+ private String bankAccount;
+
+ @ApiModelProperty("开户行")
+ private String bankOpening;
+
+ @ApiModelProperty("退款账号")
+ private String refundAccount;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileSubmitRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileSubmitRequest.java
new file mode 100644
index 000000000..4eec07d50
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileSubmitRequest.java
@@ -0,0 +1,28 @@
+package com.cool.store.request.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店材料提交Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/26
+ */
+@Data
+public class CloseStoreFileSubmitRequest {
+ @ApiModelProperty("闭店申请id")
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("闭店材料id")
+ @NotNull(message = "闭店材料id不能为空")
+ private Long id;
+
+ @ApiModelProperty("图片列表,逗号隔开")
+ private String urls;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailAddressRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailAddressRequest.java
new file mode 100644
index 000000000..fe37770ed
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailAddressRequest.java
@@ -0,0 +1,30 @@
+package com.cool.store.request.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店资料邮寄地址信息Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+public class CloseStoreMailAddressRequest {
+ @ApiModelProperty(value = "闭店申请ID", required = true)
+ @NotNull(message = "闭店申请ID不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("材料邮寄地址")
+ private String mailAddress;
+
+ @ApiModelProperty("收件人")
+ private String mailAddressee;
+
+ @ApiModelProperty("收件人手机号")
+ private String mailMobile;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailInfoRequest.java
new file mode 100644
index 000000000..72baeaf99
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailInfoRequest.java
@@ -0,0 +1,29 @@
+package com.cool.store.request.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店资料邮寄信息Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+public class CloseStoreMailInfoRequest {
+ @ApiModelProperty(value = "闭店申请ID", required = true)
+ @NotNull(message = "闭店申请ID不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty(value = "邮件单号", required = true)
+ @NotBlank(message = "邮件单号不能为空")
+ private String mailNumber;
+
+ @ApiModelProperty("快递公司")
+ private String mailCompany;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundAddRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundAddRequest.java
new file mode 100644
index 000000000..28c3bd644
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundAddRequest.java
@@ -0,0 +1,141 @@
+package com.cool.store.request.close.refund;
+
+import com.cool.store.dto.close.CloseStoreMkUserDTO;
+import com.cool.store.entity.CloseStoreRefundInfoDO;
+import com.cool.store.entity.StoreDO;
+import com.cool.store.enums.master.StoreCloseReasonEnum;
+import com.cool.store.request.xgj.XgjReimburseFeeRequest;
+import com.cool.store.request.xgj.XgjReimburseRequest;
+import com.cool.store.utils.CoolDateUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.Date;
+
+/**
+ *
+ * 闭店退款新增Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Data
+public class CloseStoreRefundAddRequest {
+ @ApiModelProperty("闭店申请id")
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("退款类型")
+ @NotNull(message = "退款类型不能为空")
+ private Integer type;
+
+ @ApiModelProperty("公司抬头,字典表close_store_invoice_title")
+ @NotBlank(message = "公司抬头")
+ private String invoiceTitle;
+
+ @ApiModelProperty("提交人每刻工号")
+ private String submitterId;
+
+ @ApiModelProperty("提交人名称")
+ private String submitterName;
+
+ @ApiModelProperty("退款事由")
+ @NotBlank(message = "退款事由")
+ private String refundReason;
+
+ @ApiModelProperty("退款类型,字典表编码close_store_refund_type")
+ @NotBlank(message = "退款类型不能为空")
+ private String refundType;
+
+ @ApiModelProperty("其他说明")
+ private String remark;
+
+ @ApiModelProperty("退款加盟商编码")
+ @NotBlank(message = "退款加盟商编码不能为空")
+ private String businessCode;
+
+ @ApiModelProperty("退款加盟商名称")
+ @NotBlank(message = "退款加盟商名称不能为空")
+ private String businessName;
+
+ @ApiModelProperty("退款加盟商收款账户")
+ @NotBlank(message = "退款加盟商收款账户不能为空")
+ private String businessAccount;
+
+ @ApiModelProperty("退款项目,type=30固定为'加盟关店费用',type=40固定为'加盟关店贷款退款'")
+ @NotBlank(message = "退款项目不能为空")
+ private String refundProject;
+
+ @ApiModelProperty("费用申请日期")
+ @NotNull(message = "费用申请日期不能为空")
+ private Date expenseApplyTime;
+
+ @ApiModelProperty("费用类型code,测试环境目前写死'04.006'")
+ @NotBlank(message = "费用类型code不能为空")
+ private String expenseTypeCode;
+
+ @ApiModelProperty("应退金额")
+ @NotNull(message = "应退金额不能为空")
+ private BigDecimal expectedAmount;
+
+ @ApiModelProperty("实退金额")
+ @NotNull(message = "实退金额不能为空")
+ private BigDecimal actualAmount;
+
+ @ApiModelProperty("扣款金额")
+ @NotNull(message = "扣款金额不能为空")
+ private BigDecimal deductAmount;
+
+ @ApiModelProperty("扣款原因")
+ private String deductReason;
+
+ @ApiModelProperty("银行账户")
+ @NotBlank(message = "银行账户不能为空")
+ private String accountNumber;
+
+ @ApiModelProperty("开户行")
+ @NotBlank(message = "开户行不能为空")
+ private String bankName;
+
+ @ApiModelProperty("联行号")
+ @NotBlank(message = "联行号不能为空")
+ private String bankBranchNo;
+
+ public XgjReimburseRequest convertToXgjRequest(CloseStoreMkUserDTO mkUserDTO, Integer closeReason, StoreDO storeDO) {
+ StoreCloseReasonEnum closeReasonEnum = StoreCloseReasonEnum.getByCode(closeReason);
+ return XgjReimburseRequest.builder()
+ .legalEntity(invoiceTitle)
+ .coverUser(mkUserDTO.getJobnumber())
+ .reimburseName(refundReason)
+ .cf175(refundType)
+ .cf176(refundProject)
+ .cf333(closeReasonEnum.getCloseNature().getDesc())
+ .cf334(closeReasonEnum.getDesc())
+ .cf177(storeDO.getStoreNum())
+ .cf178(storeDO.getStoreName())
+ .comments(remark)
+ .tradingPartner(businessCode)
+ .cf242("375|其他合法收入——资金退还")
+ .cf243("")
+ .bankAcctNumber(accountNumber)
+ .bankName(bankName)
+ .accountType("BANK")
+ .bankBranchNo(bankBranchNo)
+ .expenseList(Collections.singletonList(
+ XgjReimburseFeeRequest.builder()
+ .expenseTypeCode(expenseTypeCode)
+ .consumeAmount(expectedAmount)
+ .refundAmount(actualAmount)
+ .deductionAmount(deductAmount)
+ .consumeTime(CoolDateUtils.DateFormat(expenseApplyTime, "yyyy-MM-dd HH:mm:ss"))
+ .build()
+ ))
+ .build();
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundQueryRequest.java
new file mode 100644
index 000000000..9092195a9
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundQueryRequest.java
@@ -0,0 +1,26 @@
+package com.cool.store.request.close.refund;
+
+import com.cool.store.common.PageBasicInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店退款查询Request
+ *
+ *
+ * @author wangff
+ * @since 2025/12/2
+ */
+@Data
+public class CloseStoreRefundQueryRequest extends PageBasicInfo {
+ @ApiModelProperty("闭店申请id")
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("退款类型,30/40")
+ @NotNull(message = "退款类型不能为空")
+ private Integer type;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundSkipRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundSkipRequest.java
new file mode 100644
index 000000000..cadad4d37
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundSkipRequest.java
@@ -0,0 +1,21 @@
+package com.cool.store.request.close.refund;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 退款流程跳过Request
+ *
+ *
+ * @author wangff
+ * @since 2025/12/3
+ */
+@Data
+public class CloseStoreRefundSkipRequest {
+ @ApiModelProperty("闭店申请id")
+ private Long closeStoreId;
+
+ @ApiModelProperty("退款类型,30/40")
+ private Integer type;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundUpdateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundUpdateRequest.java
new file mode 100644
index 000000000..36dc140e4
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundUpdateRequest.java
@@ -0,0 +1,100 @@
+package com.cool.store.request.close.refund;
+
+import com.cool.store.dto.close.CloseStoreMkUserDTO;
+import com.cool.store.entity.CloseStoreRefundInfoDO;
+import com.cool.store.entity.StoreDO;
+import com.cool.store.enums.master.StoreCloseReasonEnum;
+import com.cool.store.request.xgj.XgjReimburseFeeRequest;
+import com.cool.store.request.xgj.XgjReimburseRequest;
+import com.cool.store.utils.CoolDateUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.Date;
+
+/**
+ *
+ * 闭店退款更新Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Data
+public class CloseStoreRefundUpdateRequest {
+ @ApiModelProperty("退款记录id")
+ @NotNull(message = "退款记录id不能为空")
+ private Long id;
+
+ @ApiModelProperty("闭店申请id")
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+
+ @ApiModelProperty("公司抬头,字典表close_store_invoice_title")
+ @NotBlank(message = "公司抬头")
+ private String invoiceTitle;
+
+ @ApiModelProperty("提交人每刻工号")
+ private String submitterId;
+
+ @ApiModelProperty("提交人名称")
+ private String submitterName;
+
+ @ApiModelProperty("退款事由")
+ @NotBlank(message = "退款事由")
+ private String refundReason;
+
+ @ApiModelProperty("退款类型,字典表编码close_store_refund_type")
+ @NotBlank(message = "退款类型不能为空")
+ private String refundType;
+
+ @ApiModelProperty("其他说明")
+ private String remark;
+
+ @ApiModelProperty("退款加盟商编码")
+ @NotBlank(message = "退款加盟商编码不能为空")
+ private String businessCode;
+
+ @ApiModelProperty("退款加盟商名称")
+ @NotBlank(message = "退款加盟商名称不能为空")
+ private String businessName;
+
+ @ApiModelProperty("费用申请日期")
+ @NotNull(message = "费用申请日期不能为空")
+ private Date expenseApplyTime;
+
+ @ApiModelProperty("费用类型code,测试环境目前写死'04.006'")
+ @NotBlank(message = "费用类型code不能为空")
+ private String expenseTypeCode;
+
+ @ApiModelProperty("应退金额")
+ @NotNull(message = "应退金额不能为空")
+ private BigDecimal expectedAmount;
+
+ @ApiModelProperty("实退金额")
+ @NotNull(message = "实退金额不能为空")
+ private BigDecimal actualAmount;
+
+ @ApiModelProperty("扣款金额")
+ @NotNull(message = "扣款金额不能为空")
+ private BigDecimal deductAmount;
+
+ @ApiModelProperty("扣款原因")
+ private String deductReason;
+
+ @ApiModelProperty("银行账户")
+ @NotBlank(message = "银行账户不能为空")
+ private String accountNumber;
+
+ @ApiModelProperty("开户行")
+ @NotBlank(message = "开户行不能为空")
+ private String bankName;
+
+ @ApiModelProperty("联行号")
+ @NotBlank(message = "联行号不能为空")
+ private String bankBranchNo;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreApplyRequest.java
new file mode 100644
index 000000000..0185e93b8
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreApplyRequest.java
@@ -0,0 +1,42 @@
+package com.cool.store.request.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/23 15:57
+ * @Version 1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CloseStoreApplyRequest {
+
+ @ApiModelProperty("计划关店时间")
+ @NotNull(message = "计划关店时间不能为空")
+ private Date planCloseDate;
+
+ @ApiModelProperty("关店原因")
+ @NotNull(message = "闭店原因不能为空")
+ private Integer closeReason;
+
+ @ApiModelProperty("闭店原因说明")
+ private String reasonDescription;
+
+ @ApiModelProperty(value = "闭店发起方式", hidden = true)
+ private Integer closeType;
+
+ @ApiModelProperty("门店id")
+ @NotBlank(message = "门店id不能为空")
+ private String storeId;
+
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreAuditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreAuditRequest.java
new file mode 100644
index 000000000..3c3a9f818
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreAuditRequest.java
@@ -0,0 +1,31 @@
+package com.cool.store.request.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ *
+ * 闭店申请审批Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Data
+public class CloseStoreAuditRequest {
+ @ApiModelProperty("审批记录id")
+ @NotNull(message = "审批记录id不能为空")
+ private Long auditRecordId;
+
+ @ApiModelProperty("审批意见")
+ private String remark;
+
+ @ApiModelProperty("正式闭店时间")
+ private Date actualCloseData;
+
+ @ApiModelProperty("闭店原因")
+ private Integer closeReason;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreCancelRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreCancelRequest.java
new file mode 100644
index 000000000..5d479d15e
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreCancelRequest.java
@@ -0,0 +1,21 @@
+package com.cool.store.request.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 取消闭店申请Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/13
+ */
+@Data
+public class CloseStoreCancelRequest {
+ @ApiModelProperty("闭店申请id")
+ @NotNull(message = "闭店申请id不能为空")
+ private Long closeStoreId;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreQueryRequest.java
new file mode 100644
index 000000000..0dd5360d9
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreQueryRequest.java
@@ -0,0 +1,51 @@
+package com.cool.store.request.close.store;
+
+import com.cool.store.common.PageBasicInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 闭店申请查询Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Data
+public class CloseStoreQueryRequest extends PageBasicInfo {
+ @ApiModelProperty("审核状态 0待处理,1通过,2拒绝")
+ private Integer auditStatus;
+
+ @ApiModelProperty("门店名称/编号")
+ private String storeNameOrNum;
+
+ @ApiModelProperty("所属品牌,逗号隔开")
+ private String joinBrandList;
+
+ @ApiModelProperty("签约人姓名")
+ private String signerName;
+
+ @ApiModelProperty("签约人电话")
+ private String signerMobile;
+
+ @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起")
+ private Integer closeType;
+
+ @ApiModelProperty("闭店状态")
+ private Integer closeStatus;
+
+ @ApiModelProperty("闭店申请单号")
+ private String closeStoreNo;
+
+ @ApiModelProperty(value = "是否查询store表", hidden = true)
+ private Boolean queryStore = false;
+
+ @ApiModelProperty(value = "是否查询signer表", hidden = true)
+ private Boolean querySigner = false;
+
+ @ApiModelProperty(value = "所属品牌列表", hidden = true)
+ private List joinBrands;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/MiniCloseStoreQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/MiniCloseStoreQueryRequest.java
new file mode 100644
index 000000000..2f2e54209
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/MiniCloseStoreQueryRequest.java
@@ -0,0 +1,19 @@
+package com.cool.store.request.close.store;
+
+import com.cool.store.common.PageBasicInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * mini闭店申请查询Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Data
+public class MiniCloseStoreQueryRequest extends PageBasicInfo {
+ @ApiModelProperty("门店id")
+ private String storeId;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ReCloseStoreApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ReCloseStoreApplyRequest.java
new file mode 100644
index 000000000..31352da5d
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ReCloseStoreApplyRequest.java
@@ -0,0 +1,18 @@
+package com.cool.store.request.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/24 10:18
+ * @Version 1.0
+ */
+@Data
+public class ReCloseStoreApplyRequest {
+
+ @ApiModelProperty("闭店信息ID")
+ private Long closeStoreId;
+
+
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ThirdCloseStoreApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ThirdCloseStoreApplyRequest.java
new file mode 100644
index 000000000..d2f5704f0
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ThirdCloseStoreApplyRequest.java
@@ -0,0 +1,47 @@
+package com.cool.store.request.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ *
+ * 三方闭店申请Request
+ *
+ *
+ * @author wangff
+ * @since 2025/10/23
+ */
+@Data
+public class ThirdCloseStoreApplyRequest {
+ @ApiModelProperty("计划关店时间")
+ @NotNull(message = "计划关店时间不能为空")
+ private Date planCloseDate;
+
+ @ApiModelProperty("关店原因")
+ @NotNull(message = "闭店原因不能为空")
+ private Integer closeReason;
+
+ @ApiModelProperty("闭店原因说明")
+ private String reasonDescription;
+
+ @ApiModelProperty("门店编码")
+ @NotBlank(message = "门店编码不能为空")
+ private String storeNum;
+
+ @ApiModelProperty(value = "闭店发起方式", hidden = true)
+ private Integer closeType;
+
+ public CloseStoreApplyRequest convert(String storeId) {
+ return CloseStoreApplyRequest.builder()
+ .planCloseDate(planCloseDate)
+ .closeReason(closeReason)
+ .reasonDescription(reasonDescription)
+ .storeId(storeId)
+ .closeType(closeType)
+ .build();
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/huoma/AccountCloseRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/huoma/AccountCloseRequest.java
new file mode 100644
index 000000000..0685d282e
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/huoma/AccountCloseRequest.java
@@ -0,0 +1,24 @@
+package com.cool.store.request.huoma;
+
+import lombok.Data;
+
+/**
+ *
+ * 火码账号关闭Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/5
+ */
+@Data
+public class AccountCloseRequest {
+ /**
+ * 门店编码
+ */
+ private String shop_sn;
+
+ /**
+ * 门店开关 0关店 1开店
+ */
+ private Integer enable;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjAccountCloseRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjAccountCloseRequest.java
new file mode 100644
index 000000000..4f6370e77
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjAccountCloseRequest.java
@@ -0,0 +1,25 @@
+package com.cool.store.request.xgj;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ * 新管家账号关闭Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/27
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class XgjAccountCloseRequest {
+ @ApiModelProperty("门店编码")
+ private String storeCode;
+
+ @ApiModelProperty("关店时间,yyyy-MM-dd HH:mm:ss")
+ private String closeTime;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjBankQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjBankQueryRequest.java
new file mode 100644
index 000000000..14b261d1a
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjBankQueryRequest.java
@@ -0,0 +1,18 @@
+package com.cool.store.request.xgj;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 新管家支行查询Request
+ *
+ *
+ * @author wangff
+ * @since 2025/12/1
+ */
+@Data
+public class XgjBankQueryRequest {
+ @ApiModelProperty("支行行名")
+ private String openBankName;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerAccountRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerAccountRequest.java
new file mode 100644
index 000000000..87ee14d04
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerAccountRequest.java
@@ -0,0 +1,30 @@
+package com.cool.store.request.xgj;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 新管家供应商账户信息Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+public class XgjPartnerAccountRequest {
+ @ApiModelProperty("账户名称")
+ private String accountName;
+
+ @ApiModelProperty("银行账号")
+ private String accountNumber;
+
+ @ApiModelProperty("开户银行")
+ private String bankName;
+
+ @ApiModelProperty("开户支行号")
+ private String bankBranchNo;
+
+ @ApiModelProperty("账户类型")
+ private String accountType;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerQueryRequest.java
new file mode 100644
index 000000000..f8bd953ae
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerQueryRequest.java
@@ -0,0 +1,38 @@
+package com.cool.store.request.xgj;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 新管家往来单位查询Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+public class XgjPartnerQueryRequest {
+ @ApiModelProperty("查询开始(创建/更新)时间戳(包含、秒级)")
+ private Long startTime;
+
+ @ApiModelProperty("查询结束时间戳")
+ private Long endTime;
+
+ @ApiModelProperty("分页序号(默认为1)")
+ private Integer pageNo;
+
+ @ApiModelProperty("分页大小(默认50,上限150)")
+ private Integer pageSize;
+
+ @ApiModelProperty("往来单位编码")
+ private List bizCodes;
+
+ @ApiModelProperty("分类的业务编码")
+ private String parentBizCode;
+
+ @ApiModelProperty("往来单位编码/名字")
+ private String keyword;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPaymentRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPaymentRequest.java
new file mode 100644
index 000000000..d0653a8b3
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPaymentRequest.java
@@ -0,0 +1,22 @@
+package com.cool.store.request.xgj;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ * 新管家获取单据支付结果Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class XgjPaymentRequest {
+ @ApiModelProperty("每刻单号")
+ private String outNo;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseFeeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseFeeRequest.java
new file mode 100644
index 000000000..8e432fef3
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseFeeRequest.java
@@ -0,0 +1,41 @@
+package com.cool.store.request.xgj;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * 新管家报销单费用明细Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class XgjReimburseFeeRequest {
+ @ApiModelProperty(value = "费用类型编码", required = true)
+ private String expenseTypeCode;
+
+ @ApiModelProperty(value = "应退金额", required = true)
+ private BigDecimal consumeAmount;
+
+ @ApiModelProperty(value = "实退金额", required = true)
+ private BigDecimal refundAmount;
+
+ @ApiModelProperty(value = "扣款金额", required = true)
+ private BigDecimal deductionAmount;
+
+ @ApiModelProperty(value = "消费时间,yyyy-MM-dd HH:mm:ss", required = true)
+ private String consumeTime;
+
+ @ApiModelProperty(value = "备注说明", required = false)
+ private String comments;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseRequest.java
new file mode 100644
index 000000000..f36d5d902
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseRequest.java
@@ -0,0 +1,109 @@
+package com.cool.store.request.xgj;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.cool.store.utils.UUIDUtils;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ *
+ * 新管家报销单Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class XgjReimburseRequest {
+
+ @ApiModelProperty("公司抬头")
+ private String legalEntity;
+
+ @ApiModelProperty("提交人(编码)")
+ private String coverUser;
+
+ @ApiModelProperty("退款事由")
+ private String reimburseName;
+
+ @ApiModelProperty("退款类型(填提供的中文选项)")
+ @JsonProperty("CF175")
+ @JSONField(name = "CF175")
+ private String cf175;
+
+ @ApiModelProperty("退款项目(填提供的中文选项)")
+ @JsonProperty("CF176")
+ @JSONField(name = "CF176")
+ private String cf176;
+
+ @ApiModelProperty("关店分类(填提供的中文选项)")
+ @JsonProperty("CF333")
+ @JSONField(name = "CF333")
+ private String cf333;
+
+ @ApiModelProperty("关店原因1(填提供的中文选项),管理要求闭店时填写")
+ @JsonProperty("CF334")
+ @JSONField(name = "CF334")
+ private String cf334;
+
+ @ApiModelProperty("关店原因2(填提供的中文选项),加盟商自行闭店时填写")
+ @JsonProperty("CF335")
+ @JSONField(name = "CF335")
+ private String cf335;
+
+ @ApiModelProperty("门店编码")
+ @JsonProperty("CF177")
+ @JSONField(name = "CF177")
+ private String cf177;
+
+ @ApiModelProperty("门店名称")
+ @JsonProperty("CF178")
+ @JSONField(name = "CF178")
+ private String cf178;
+
+ @ApiModelProperty("其他说明")
+ private String comments;
+
+ @ApiModelProperty("退款加盟商编码")
+ private String tradingPartner;
+
+ @ApiModelProperty("汇款用途(填提供的中文选项)")
+ @JsonProperty("CF242")
+ @JSONField(name = "CF242")
+ private String cf242;
+
+ @ApiModelProperty("汇款备注(填提供的中文选项)")
+ @JsonProperty("CF243")
+ @JSONField(name = "CF243")
+ private String cf243;
+
+ @ApiModelProperty("账户名")
+ private String bankAcctName;
+
+ @ApiModelProperty("银行账户")
+ private String bankAcctNumber;
+
+ @ApiModelProperty("开户行")
+ private String bankName;
+
+ @ApiModelProperty("收款账户类型")
+ private String accountType;
+
+ @ApiModelProperty("联行号")
+ private String bankBranchNo;
+
+ @ApiModelProperty("费用明细")
+ private List expenseList;
+
+ public static void main(String[] args) {
+ System.out.println(UUIDUtils.get32UUID());
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjSavePartnerRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjSavePartnerRequest.java
new file mode 100644
index 000000000..def60728d
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjSavePartnerRequest.java
@@ -0,0 +1,40 @@
+package com.cool.store.request.xgj;
+
+import com.cool.store.utils.UUIDUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 新管家同步供应商Request
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Data
+public class XgjSavePartnerRequest {
+ @ApiModelProperty("往来单位名称")
+ private String name;
+
+ @ApiModelProperty("往来单位编码")
+ private String businessCode;
+
+ @ApiModelProperty("所属分类")
+ private String parentName;
+
+ @ApiModelProperty("所属分类编码")
+ private String parentBizCode;
+
+ @ApiModelProperty("往来关系")
+ private String partnerType;
+
+ @ApiModelProperty("往来性质")
+ private String partnerProperty;
+
+ @ApiModelProperty("往来单位账户列表")
+ private List accounts;
+}
+
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/account/CloseStoreAccountVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/account/CloseStoreAccountVO.java
new file mode 100644
index 000000000..6fbc26241
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/account/CloseStoreAccountVO.java
@@ -0,0 +1,41 @@
+package com.cool.store.vo.close.account;
+
+import com.cool.store.enums.close.CloseStoreAccountTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 闭店账号VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Data
+public class CloseStoreAccountVO {
+ @ApiModelProperty("id")
+ private Long id;
+
+ @ApiModelProperty("账号名称")
+ private String systemName;
+
+ @ApiModelProperty("系统code")
+ private String systemCode;
+
+ @ApiModelProperty("账号分类,0-IT账号,1-外卖账号")
+ private Integer accountType;
+
+ @ApiModelProperty("账号分类")
+ private String accountTypeName;
+
+ @ApiModelProperty("账号状态,1-使用中, 2-已关闭, 3-关闭中")
+ private Integer status;
+
+ @ApiModelProperty("关闭类型,0直接关闭,1申请关闭")
+ private Integer closeType;
+
+ public String getAccountTypeName() {
+ return CloseStoreAccountTypeEnum.getMsgByType(accountType);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailMiniVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailMiniVO.java
new file mode 100644
index 000000000..de4e09003
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailMiniVO.java
@@ -0,0 +1,45 @@
+package com.cool.store.vo.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 小程序闭店资料详情VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+public class CloseStoreFileDetailMiniVO {
+
+ @ApiModelProperty("闭店申请id")
+ private Long closeStoreId;
+
+ @ApiModelProperty("邮件单号")
+ private String mailNumber;
+
+ @ApiModelProperty("邮件状态,0未邮寄,1已邮寄")
+ private Integer mailStatus;
+
+ @ApiModelProperty("快递公司")
+ private String mailCompany;
+
+ @ApiModelProperty("材料邮寄地址")
+ private String mailAddress;
+
+ @ApiModelProperty("收件人")
+ private String mailAddressee;
+
+ @ApiModelProperty("收件人手机号")
+ private String mailMobile;
+
+ @ApiModelProperty("材料信息列表")
+ private List fileList;
+
+ @ApiModelProperty("督导审批意见")
+ private String remark;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailVO.java
new file mode 100644
index 000000000..55604f868
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailVO.java
@@ -0,0 +1,54 @@
+package com.cool.store.vo.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 闭店资料详情VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+public class CloseStoreFileDetailVO {
+
+ @ApiModelProperty("闭店申请id")
+ private Long closeStoreId;
+
+ @ApiModelProperty("邮件单号")
+ private String mailNumber;
+
+ @ApiModelProperty("邮件状态,0未邮寄,1已邮寄")
+ private Integer mailStatus;
+
+ @ApiModelProperty("快递公司")
+ private String mailCompany;
+
+ @ApiModelProperty("材料邮寄地址")
+ private String mailAddress;
+
+ @ApiModelProperty("收件人")
+ private String mailAddressee;
+
+ @ApiModelProperty("收件人手机号")
+ private String mailMobile;
+
+ @ApiModelProperty("材料信息列表")
+ private List fileList;
+
+ @ApiModelProperty("户名")
+ private String bankAccount;
+
+ @ApiModelProperty("开户行")
+ private String bankOpening;
+
+ @ApiModelProperty("退款账号")
+ private String refundAccount;
+
+ @ApiModelProperty("督导审批意见")
+ private String remark;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoMiniVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoMiniVO.java
new file mode 100644
index 000000000..93dd1ac58
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoMiniVO.java
@@ -0,0 +1,47 @@
+package com.cool.store.vo.close.file;
+
+import com.cool.store.enums.close.FileStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 小程序闭店材料信息VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+public class CloseStoreFileInfoMiniVO {
+ @ApiModelProperty("id")
+ private Long id;
+
+ @ApiModelProperty("资料code")
+ private String fileCode;
+
+ @ApiModelProperty("资料名称")
+ private String fileName;
+
+ @ApiModelProperty("材料审批状态 1-合格 2-不合格")
+ private Integer approveStatus;
+
+ @ApiModelProperty("材料状态 0-未上传 1-合格 2-不合格 3-已上传 4-审批中 5-已修改")
+ private Integer fileStatus;
+
+ @ApiModelProperty("材料状态")
+ private String fileStatusName;
+
+ @ApiModelProperty("审批意见")
+ private String approveOpinion;
+
+ @ApiModelProperty("模板链接")
+ private String templateUrl;
+
+ @ApiModelProperty("图片列表")
+ private String urls;
+
+ public String getFileStatusName() {
+ return FileStatusEnum.getDescByStatus(this.fileStatus);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoVO.java
new file mode 100644
index 000000000..7a3985304
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoVO.java
@@ -0,0 +1,39 @@
+package com.cool.store.vo.close.file;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 闭店材料信息VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Data
+public class CloseStoreFileInfoVO {
+ @ApiModelProperty("id")
+ private Long id;
+
+ @ApiModelProperty("资料code")
+ private String fileCode;
+
+ @ApiModelProperty("资料名称")
+ private String fileName;
+
+ @ApiModelProperty("邮件状态 0-未邮寄 1已邮寄")
+ private Integer mailStatus;
+
+ @ApiModelProperty("材料审批状态 1-合格 2-不合格")
+ private Integer approveStatus;
+
+ @ApiModelProperty("材料状态 0-未上传 1-合格 2-不合格 3-已上传 4-审批中 5-已修改")
+ private Integer fileStatus;
+
+ @ApiModelProperty("审批意见")
+ private String approveOpinion;
+
+ @ApiModelProperty("图片列表")
+ private String urls;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundDetailVO.java
new file mode 100644
index 000000000..520c60837
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundDetailVO.java
@@ -0,0 +1,138 @@
+package com.cool.store.vo.close.refund;
+
+import com.cool.store.annotation.DictField;
+import com.cool.store.enums.close.RefundPayStatusEnum;
+import com.cool.store.enums.master.StoreCloseReasonEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ *
+ * 闭店退款详情VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Data
+public class CloseStoreRefundDetailVO {
+ // ===== 单据信息 =====
+ @ApiModelProperty("退款单id")
+ private Long id;
+
+ @ApiModelProperty("闭店申请id")
+ private Long closeStoreId;
+
+ @ApiModelProperty("退款申请单号")
+ private String refundNo;
+
+ @ApiModelProperty("退款类型(闭店子阶段code)")
+ private Integer type;
+
+ @ApiModelProperty("退款状态")
+ private String refundStatus;
+
+ @ApiModelProperty("退款状态名称")
+ @DictField
+ private String refundStatusName;
+
+ @ApiModelProperty("每刻退款单号")
+ private String refundOrderNo;
+
+ @ApiModelProperty("退款时间")
+ private Date refundTime;
+
+ // ===== 基础信息 =====
+ @ApiModelProperty("公司抬头")
+ private String invoiceTitle;
+
+ @ApiModelProperty("公司抬头名称")
+ @DictField
+ private String invoiceTitleName;
+
+ @ApiModelProperty("提交人id")
+ private String submitterId;
+
+ @ApiModelProperty("提交人名称")
+ private String submitterName;
+
+ // ===== 闭店信息 =====
+ @ApiModelProperty("关店原因")
+ private Integer closeReason;
+
+ @ApiModelProperty("关店原因名称")
+ private String closeReasonName;
+
+ @ApiModelProperty("关店分类名称")
+ private String closeNatureName;
+
+ // ===== 退款信息 =====
+ @ApiModelProperty("退款事由")
+ private String refundReason;
+
+ @ApiModelProperty("退款类型")
+ private String refundType;
+
+ @ApiModelProperty("退款类型")
+ private String refundTypeName;
+
+ @ApiModelProperty("退款项目")
+ private String refundProject;
+
+ @ApiModelProperty("其他说明")
+ private String remark;
+
+ @ApiModelProperty("退款加盟商编码")
+ private String businessCode;
+
+ @ApiModelProperty("退款加盟商名称")
+ private String businessName;
+
+ @ApiModelProperty("退款加盟商收款账户")
+ private String businessAccount;
+
+ // ===== 费用信息 =====
+ @ApiModelProperty("费用类型code")
+ private String expenseTypeCode;
+
+ @ApiModelProperty("费用申请日期")
+ private Date expenseApplyTime;
+
+ @ApiModelProperty("应退金额")
+ private BigDecimal expectedAmount;
+
+ @ApiModelProperty("实退金额")
+ private BigDecimal actualAmount;
+
+ @ApiModelProperty("扣款金额")
+ private BigDecimal deductAmount;
+
+ @ApiModelProperty("扣款原因")
+ private String deductReason;
+
+ @ApiModelProperty("银行账户")
+ private String accountNumber;
+
+ @ApiModelProperty("开户行")
+ private String bankName;
+
+ @ApiModelProperty("联行号")
+ private String bankBranchNo;
+
+ public String getRefundStatusName() {
+ return RefundPayStatusEnum.getDescByStatus(refundStatus);
+ }
+
+ public String getCloseNatureName() {
+ StoreCloseReasonEnum closeReasonEnum = StoreCloseReasonEnum.getByCode(closeReason);
+ return Objects.nonNull(closeReasonEnum) ? closeReasonEnum.getCloseNature().getDesc() : "";
+ }
+
+ public String getCloseReasonName() {
+ return StoreCloseReasonEnum.getDescByCode(closeReason);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundListVO.java
new file mode 100644
index 000000000..055b35c3a
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundListVO.java
@@ -0,0 +1,46 @@
+package com.cool.store.vo.close.refund;
+
+import com.cool.store.enums.close.RefundPayStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * 闭店退款列表VO
+ *
+ *
+ * @author wangff
+ * @since 2025/12/2
+ */
+@Data
+public class CloseStoreRefundListVO {
+ @ApiModelProperty("id")
+ private Long id;
+
+ @ApiModelProperty("退款申请单号")
+ private String refundNo;
+
+ @ApiModelProperty("退款状态")
+ private String refundStatus;
+
+ @ApiModelProperty("退款状态名称")
+ private String refundStatusName;
+
+ @ApiModelProperty("每刻退款单号")
+ private String refundOrderNo;
+
+ @ApiModelProperty("退款时间")
+ private Date refundTime;
+
+ @ApiModelProperty("退款加盟商名称")
+ private String businessName;
+
+ @ApiModelProperty("退款加盟商收款账户")
+ private String businessAccount;
+
+ public String getRefundStatusName() {
+ return RefundPayStatusEnum.getDescByStatus(this.refundStatus);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundSimpleVO.java
new file mode 100644
index 000000000..5f481e8f2
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundSimpleVO.java
@@ -0,0 +1,45 @@
+package com.cool.store.vo.close.refund;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ *
+ * 闭店退款简单信息VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Data
+public class CloseStoreRefundSimpleVO {
+ @ApiModelProperty("id")
+ private Long id;
+
+ @ApiModelProperty("退款类型(闭店子阶段code)")
+ private Integer type;
+
+ @ApiModelProperty("闭店申请id")
+ private Long closeStoreId;
+
+ @ApiModelProperty("退款申请单号")
+ private String refundNo;
+
+ @ApiModelProperty("每刻退款单号")
+ private String refundOrderNo;
+
+ @ApiModelProperty("退款项目")
+ private String refundProject;
+
+ @ApiModelProperty("退款状态")
+ private String refundStatus;
+
+ @ApiModelProperty("退款时间")
+ private Date refundTime;
+
+ @ApiModelProperty("应退金额")
+ private BigDecimal expectedAmount;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreAuditRecordVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreAuditRecordVO.java
new file mode 100644
index 000000000..15a7bdba0
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreAuditRecordVO.java
@@ -0,0 +1,30 @@
+package com.cool.store.vo.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * 审批记录VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Data
+public class CloseStoreAuditRecordVO {
+
+ @ApiModelProperty("实际处理人名称")
+ private String handlerUserName;
+
+ @ApiModelProperty("完成任务时间")
+ private Date finishTaskTime;
+
+ @ApiModelProperty("审核状态 0待处理,1通过,2拒绝")
+ private Integer auditStatus;
+
+ @ApiModelProperty("备注")
+ private String actionRemark;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoDetailVO.java
new file mode 100644
index 000000000..c64c7d2b4
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoDetailVO.java
@@ -0,0 +1,96 @@
+package com.cool.store.vo.close.store;
+
+import com.cool.store.enums.close.CloseStoreStatusEnum;
+import com.cool.store.enums.master.BrandTypeEnum;
+import com.cool.store.enums.master.StoreCloseReasonEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * 闭店申请详情VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Data
+public class CloseStoreInfoDetailVO {
+ @ApiModelProperty("闭店申请id")
+ private Long id;
+
+ @ApiModelProperty("审批记录id")
+ private Long auditId;
+
+ @ApiModelProperty("闭店申请单号")
+ private String closeStoreNo;
+
+ @ApiModelProperty("门店id")
+ private String storeId;
+
+ @ApiModelProperty("门店名称")
+ private String storeName;
+
+ @ApiModelProperty("门店编号")
+ private String storeNum;
+
+ @ApiModelProperty("所属品牌")
+ private Integer joinBrand;
+
+ @ApiModelProperty("所属品牌名称")
+ private Integer joinBrandName;
+
+ @ApiModelProperty("详细地址")
+ private String storeAddress;
+
+ @ApiModelProperty("签约人1姓名")
+ private String signer1Name;
+
+ @ApiModelProperty("签约人1手机号")
+ private String signer1Mobile;
+
+ @ApiModelProperty("签约人2姓名")
+ private String signer2Name;
+
+ @ApiModelProperty("签约人2手机号")
+ private String signer2Mobile;
+
+ @ApiModelProperty("计划闭店时间")
+ private Date planCloseData;
+
+ @ApiModelProperty("正式闭店时间")
+ private Date actualCloseData;
+
+ @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起")
+ private Integer closeType;
+
+ @ApiModelProperty("闭店原因")
+ private Integer closeReason;
+
+ @ApiModelProperty("闭店原因名称")
+ private String closeReasonName;
+
+ @ApiModelProperty("闭店原因说明")
+ private String reasonDescription;
+
+ @ApiModelProperty("闭店状态")
+ private Integer closeStatus;
+
+ @ApiModelProperty("闭店状态名称")
+ private String closeStatusName;
+
+
+ public String getCloseStatusName() {
+ return CloseStoreStatusEnum.getNameByStatus(closeStatus);
+ }
+
+ public String getJoinBrandName() {
+ return BrandTypeEnum.getDescByCode(joinBrand);
+ }
+
+ public String getCloseReasonName() {
+ return StoreCloseReasonEnum.getDescByCode(closeReason);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoListVO.java
new file mode 100644
index 000000000..198522069
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoListVO.java
@@ -0,0 +1,85 @@
+package com.cool.store.vo.close.store;
+
+import com.cool.store.enums.close.CloseStoreStatusEnum;
+import com.cool.store.enums.master.BrandTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * 闭店申请记录列表VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Data
+public class CloseStoreInfoListVO {
+ @ApiModelProperty("审批记录id")
+ private Long auditRecordId;
+
+ @ApiModelProperty("闭店申请id")
+ private Long closeStoreId;
+
+ @ApiModelProperty("闭店申请单号")
+ private String closeStoreNo;
+
+ @ApiModelProperty("门店id")
+ private String storeId;
+
+ @ApiModelProperty("门店名称")
+ private String storeName;
+
+ @ApiModelProperty("门店编号")
+ private String storeNum;
+
+ @ApiModelProperty("所属品牌")
+ private Integer joinBrand;
+
+ @ApiModelProperty("所属品牌名称")
+ private String joinBrandName;
+
+ @ApiModelProperty("详细地址")
+ private String storeAddress;
+
+ @ApiModelProperty("签约人1姓名")
+ private String signer1Name;
+
+ @ApiModelProperty("签约人1手机号")
+ private String signer1Mobile;
+
+ @ApiModelProperty("签约人2姓名")
+ private String signer2Name;
+
+ @ApiModelProperty("签约人2手机号")
+ private String signer2Mobile;
+
+ @ApiModelProperty("计划闭店时间")
+ private Date planCloseData;
+
+ @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起")
+ private Integer closeType;
+
+ @ApiModelProperty("闭店状态")
+ private Integer closeStatus;
+
+ @ApiModelProperty("闭店状态名称")
+ private String closeStatusName;
+
+ @ApiModelProperty("已完成流程数量")
+ private Integer completeProcessNum;
+
+ @ApiModelProperty("总流程数量")
+ private Integer totalProcessNum;
+
+
+ public String getCloseStatusName() {
+ return CloseStoreStatusEnum.getNameByStatus(closeStatus);
+ }
+
+ public String getJoinBrandName() {
+ return BrandTypeEnum.getDescByCode(joinBrand);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSimpleVO.java
new file mode 100644
index 000000000..d45251c05
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSimpleVO.java
@@ -0,0 +1,50 @@
+package com.cool.store.vo.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 闭店申请简单信息VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Data
+public class CloseStoreSimpleVO {
+ @ApiModelProperty("门店id")
+ private String storeId;
+
+ @ApiModelProperty("门店名称")
+ private String storeName;
+
+ @ApiModelProperty("门店编号")
+ private String storeNum;
+
+ @ApiModelProperty("闭店状态名称")
+ private String closeStatusName;
+
+ @ApiModelProperty("签约人1姓名")
+ private String signer1Name;
+
+ @ApiModelProperty("签约人1手机号")
+ private String signer1Mobile;
+
+ @ApiModelProperty("签约人2姓名")
+ private String signer2Name;
+
+ @ApiModelProperty("签约人2手机号")
+ private String signer2Mobile;
+
+ @ApiModelProperty("已完成流程数量")
+ private Integer completeProcessNum;
+
+ @ApiModelProperty("总流程数量")
+ private Integer totalProcessNum;
+
+ @ApiModelProperty("闭店流程阶段信息")
+ private List stageList;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreStatusVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreStatusVO.java
new file mode 100644
index 000000000..acfc4dae5
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreStatusVO.java
@@ -0,0 +1,25 @@
+package com.cool.store.vo.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ * 闭店状态VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/10
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CloseStoreStatusVO {
+ @ApiModelProperty("闭店状态编码")
+ private Integer closeStatus;
+
+ @ApiModelProperty("闭店状态")
+ private String closeStatusName;
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSubStageStatusVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSubStageStatusVO.java
new file mode 100644
index 000000000..9f4d69832
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSubStageStatusVO.java
@@ -0,0 +1,49 @@
+package com.cool.store.vo.close.store;
+
+import com.cool.store.enums.close.CloseStoreSubStageEnum;
+import com.cool.store.enums.close.CloseStoreSubStageStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 闭店流程子阶段状态VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/16
+ */
+@Data
+public class CloseStoreSubStageStatusVO {
+ @ApiModelProperty("闭店阶段")
+ private Integer shopStage;
+
+ @ApiModelProperty("闭店子阶段")
+ private Integer shopSubStage;
+
+ @ApiModelProperty("闭店子阶段名称")
+ private String shopSubStageName;
+
+ @ApiModelProperty("店铺阶段状态")
+ private Integer shopSubStageStatus;
+
+ @ApiModelProperty("阶段状态名称")
+ private String shopSubStageStatusName;
+
+ @ApiModelProperty("当前阶段是否结束 0未结束 1已结束")
+ private Integer isTerminated;
+
+ @ApiModelProperty("预估完成时间")
+ private String planCompleteTime;
+
+ @ApiModelProperty("实际完成时间")
+ private String actualCompleteTime;
+
+ public String getShopSubStageName() {
+ return CloseStoreSubStageEnum.getSubStageNameBySubStage(shopSubStage);
+ }
+
+ public String getShopSubStageStatusName() {
+ return CloseStoreSubStageStatusEnum.getStatusNameByStatus(shopSubStageStatus);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/MiniCloseStoreSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/MiniCloseStoreSimpleVO.java
new file mode 100644
index 000000000..7ebda0023
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/MiniCloseStoreSimpleVO.java
@@ -0,0 +1,52 @@
+package com.cool.store.vo.close.store;
+
+import com.cool.store.enums.close.CloseStoreStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * mini闭店申请简单信息VO
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Data
+public class MiniCloseStoreSimpleVO {
+ @ApiModelProperty("闭店申请id")
+ private Long id;
+
+ @ApiModelProperty("闭店申请单号")
+ private String closeStoreNo;
+
+ @ApiModelProperty("门店id")
+ private String storeId;
+
+ @ApiModelProperty("门店名称")
+ private String storeName;
+
+ @ApiModelProperty("门店编号")
+ private String storeNum;
+
+ @ApiModelProperty("闭店状态")
+ private Integer closeStatus;
+
+ @ApiModelProperty("闭店状态名称")
+ private String closeStatusName;
+
+ @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起")
+ private Integer closeType;
+
+ @ApiModelProperty("计划闭店时间")
+ private Date planCloseData;
+
+ @ApiModelProperty("申请日期")
+ private Date createTime;
+
+ public String getCloseStatusName() {
+ return CloseStoreStatusEnum.getNameByStatus(closeStatus);
+ }
+}
diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/StoreCloseReasonVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/StoreCloseReasonVO.java
new file mode 100644
index 000000000..4fbe4b55f
--- /dev/null
+++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/StoreCloseReasonVO.java
@@ -0,0 +1,28 @@
+package com.cool.store.vo.close.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ * 门店闭店原因VO
+ *
+ *
+ * @author wangff
+ * @since 2025/9/16
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoreCloseReasonVO {
+ @ApiModelProperty("闭店原因编码")
+ private Integer closeReasonCode;
+
+ @ApiModelProperty("闭店原因描述")
+ private String closeReasonDesc;
+
+ @ApiModelProperty("闭店发起方式")
+ private Integer closeType;
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java
index 7c764ccf9..fa7a0b9e5 100644
--- a/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java
@@ -1,6 +1,7 @@
package com.cool.store.service;
import com.cool.store.request.OrderSummaryRequest;
+import com.cool.store.request.huoma.AccountCloseRequest;
import com.cool.store.request.huoma.ShopBasicInfoRequest;
import com.cool.store.response.IncomeBaseResponse;
import com.cool.store.response.IncomeSummaryResponse;
@@ -53,4 +54,11 @@ public interface HuoMaService {
* @description:获取店铺交易分析
*/
IncomeSummaryResponse getIncomeSummary (OrderSummaryRequest requestBody);
+
+ /**
+ * 账号关闭
+ * @param requestBody 火码账号关闭Request
+ * @return 火码账号关闭Response
+ */
+ Boolean accountClose(AccountCloseRequest requestBody);
}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdXgjService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdXgjService.java
new file mode 100644
index 000000000..6373d5519
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdXgjService.java
@@ -0,0 +1,60 @@
+package com.cool.store.service;
+
+import com.cool.store.dto.xgj.XgjBranchBankDTO;
+import com.cool.store.dto.xgj.XgjPartnerPageDTO;
+import com.cool.store.dto.xgj.XgjPayResultDTO;
+import com.cool.store.request.xgj.*;
+
+import java.util.List;
+
+/**
+ *
+ * 新管家三方接口服务类
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+public interface ThirdXgjService {
+
+ /**
+ * 新管家账号关闭
+ * @param request 新管家账号关闭Request
+ * @return 是否成功
+ */
+ String accountClose(XgjAccountCloseRequest request);
+
+ /**
+ * 新管家报销单
+ * @param request 新管家报销单Request
+ * @return 每刻单号
+ */
+ String reimburse(XgjReimburseRequest request);
+
+ /**
+ * 新管家供应商同步
+ * @param request 新管家同步供应商Request
+ * @return java.lang.String
+ */
+ String savePartner(XgjSavePartnerRequest request);
+
+ /**
+ * 获取单据支付结果
+ * @param request 新管家获取单据支付结果Request
+ * @return 新管家单据支付结果DTO
+ */
+ XgjPayResultDTO queryOrderStatus(XgjPaymentRequest request);
+
+ /**
+ * 查询往来单位列表
+ * @param request 新管家往来单位查询Request
+ * @return 新管家分页DTO
+ */
+ XgjPartnerPageDTO queryPartnerPage(XgjPartnerQueryRequest request);
+
+ /**
+ * 查询支行列表
+ * @return 新管家支行列表
+ */
+ List queryBranchBankList(XgjBankQueryRequest request);
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseFactory.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseFactory.java
new file mode 100644
index 000000000..33eb38fea
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseFactory.java
@@ -0,0 +1,34 @@
+package com.cool.store.service.close;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * 账号关闭工厂
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Service
+@RequiredArgsConstructor
+public class AccountCloseFactory {
+ private final Map map = new HashMap<>();
+
+
+ @Autowired
+ public AccountCloseFactory(AccountCloseStrategy[] accountCloseStrategies) {
+ for (AccountCloseStrategy accountCloseStrategy : accountCloseStrategies) {
+ map.put(accountCloseStrategy.getSystemCode(), accountCloseStrategy);
+ }
+ }
+
+ public AccountCloseStrategy getByCode(String systemCode) {
+ return map.get(systemCode);
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseStrategy.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseStrategy.java
new file mode 100644
index 000000000..5a9eff2d9
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseStrategy.java
@@ -0,0 +1,23 @@
+package com.cool.store.service.close;
+
+/**
+ *
+ * 账号关闭
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+public interface AccountCloseStrategy {
+
+ /**
+ * 申请账号关闭
+ * @return 是否成功
+ */
+ Boolean accountClose(String storeId);
+
+ /**
+ * 获取系统code
+ */
+ String getSystemCode();
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreAccountService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreAccountService.java
new file mode 100644
index 000000000..ad35868a6
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreAccountService.java
@@ -0,0 +1,36 @@
+package com.cool.store.service.close;
+
+import com.cool.store.vo.close.account.CloseStoreAccountVO;
+
+import java.util.List;
+
+/**
+ *
+ * 闭店账号关闭 服务类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+public interface CloseStoreAccountService {
+
+ /**
+ * 查询账号列表
+ * @param closeStoreId 闭店申请id
+ * @return 闭店账号VO列表
+ */
+ List getAccountList(Long closeStoreId);
+
+ /**
+ * 账号关闭
+ * @param id 主键id
+ * @return 是否成功
+ */
+ Boolean closeAccount(Long id);
+
+ /**
+ * 校验所有账号关闭状态并更新阶段
+ * @param closeStoreId 闭店申请id
+ */
+ void verifyAndUpdateStage(Long closeStoreId);
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreFileService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreFileService.java
new file mode 100644
index 000000000..d993765d4
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreFileService.java
@@ -0,0 +1,72 @@
+package com.cool.store.service.close;
+
+import com.cool.store.request.close.file.*;
+import com.cool.store.vo.close.file.CloseStoreFileDetailMiniVO;
+import com.cool.store.vo.close.file.CloseStoreFileDetailVO;
+
+/**
+ *
+ * 闭店资料 服务类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+public interface CloseStoreFileService {
+
+ /**
+ * 更新材料邮寄地址
+ * @param request 闭店资料邮寄地址信息Request
+ * @return 是否成功
+ */
+ Boolean updateMailAddress(CloseStoreMailAddressRequest request);
+
+ /**
+ * 提交材料审批
+ * @param request 闭店材料审批Request
+ * @return 是否成功
+ */
+ Boolean submitFileApprove(CloseStoreFileApproveRequest request);
+
+ /**
+ * 单个材料提交审批
+ * @param request 闭店材料信息Request
+ * @return 是否成功
+ */
+ Boolean submitFileApproveSingle(CloseStoreFileInfoRequest request);
+
+ /**
+ * 查询闭店资料详情
+ * @param closeStoreId 闭店申请id
+ * @return 闭店资料详情VO
+ */
+ CloseStoreFileDetailVO getFileDetail(Long closeStoreId);
+
+ /**
+ * 查询小程序闭店资料详情
+ * @param closeStoreId 闭店申请id
+ * @return 小程序闭店资料详情VO
+ */
+ CloseStoreFileDetailMiniVO getMiniFileDetail(Long closeStoreId);
+
+ /**
+ * 提交材料
+ * @param request 闭店资料邮寄信息Request
+ * @return 是否成功
+ */
+ Boolean submitFile(CloseStoreMailInfoRequest request);
+
+ /**
+ * 修改材料
+ * @param request 闭店材料提交Request
+ * @return 是否成功
+ */
+ Boolean updateFile(CloseStoreFileSubmitRequest request);
+
+ /**
+ * 督导审批
+ * @param request 审批Request
+ * @return 是否成功
+ */
+ Boolean supervisionAudit(CloseStoreFileAuditRequest request);
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreRefundService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreRefundService.java
new file mode 100644
index 000000000..e41223713
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreRefundService.java
@@ -0,0 +1,82 @@
+package com.cool.store.service.close;
+
+import com.cool.store.dto.close.CloseStoreMkUserDTO;
+import com.cool.store.request.close.refund.CloseStoreRefundAddRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundUpdateRequest;
+import com.cool.store.vo.close.refund.CloseStoreRefundDetailVO;
+import com.cool.store.vo.close.refund.CloseStoreRefundListVO;
+import com.cool.store.vo.close.refund.CloseStoreRefundSimpleVO;
+import com.github.pagehelper.PageInfo;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 闭店退款 服务类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+public interface CloseStoreRefundService {
+
+ /**
+ * 新增退款记录
+ * @param request 闭店退款新增Request
+ */
+ Boolean addRefund(CloseStoreRefundAddRequest request);
+
+ /**
+ * 编辑退款记录
+ * @param request 闭店退款更新Request
+ */
+ Boolean updateRefund(CloseStoreRefundUpdateRequest request);
+
+ /**
+ * 获取当前用户的每刻用户信息
+ * @return 每刻用户信息DTO
+ */
+ CloseStoreMkUserDTO getCurrentMkUser();
+
+ /**
+ * 查询退款详情
+ * @param id 退款信息id
+ * @return 闭店退款详情VO
+ */
+ CloseStoreRefundDetailVO getRefundDetail(Long id);
+
+ /**
+ * 完成退款
+ */
+ void completeRefund(Long refundId, Date refundTime);
+
+ /**
+ * 查询退款简单信息列表
+ * @param closeStoreId 闭店申请id
+ * @return 闭店退款简单信息VO列表
+ */
+ List getRefundSimpleList(Long closeStoreId);
+
+ /**
+ * 跳过流程
+ * @param request 退款流程跳过Request
+ */
+ void skip(CloseStoreRefundSkipRequest request);
+
+ /**
+ * 退款分页查询
+ * @param request 闭店退款查询Request
+ * @return 闭店退款列表VO列表
+ */
+ PageInfo refundPage(CloseStoreRefundQueryRequest request);
+
+ /**
+ * 刷新退款订单状态
+ * @param request 闭店退款查询Request
+ * @return 是否成功
+ */
+ Boolean refreshRefundOrderStatus(CloseStoreRefundQueryRequest request);
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreService.java
new file mode 100644
index 000000000..b48a7e148
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreService.java
@@ -0,0 +1,130 @@
+package com.cool.store.service.close;
+
+
+import com.cool.store.enums.close.CloseStoreSubStageEnum;
+import com.cool.store.request.close.store.*;
+import com.cool.store.response.AuditInfoResponse;
+import com.cool.store.vo.close.store.*;
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/23 15:48
+ * @Version 1.0
+ */
+public interface CloseStoreService {
+
+
+ /**
+ * 申请闭店
+ * @param request 闭店申请Request
+ * @return 是否成功
+ */
+ Boolean applyCloseStore(CloseStoreApplyRequest request);
+
+ /**
+ * 拒绝之后 重新提交申请
+ * @param request 闭店申请Request
+ * @return 是否成功
+ */
+ Boolean reApplyCloseStore(ReCloseStoreApplyRequest request);
+
+ /**
+ * 第三方申请闭店
+ * @param request 三方闭店申请Request
+ * @return 是否成功
+ */
+ Boolean thirdApplyCloseStore(ThirdCloseStoreApplyRequest request);
+
+ /**
+ * 审批通过
+ * @param request 闭店申请审批Request
+ * @return 是否成功
+ */
+ Boolean auditPass(CloseStoreAuditRequest request);
+
+ /**
+ * 审批拒绝
+ * @param request 闭店申请审批Request
+ * @return 是否成功
+ */
+ Boolean auditReject(CloseStoreAuditRequest request);
+
+ /**
+ * 取消闭店申请
+ * @param closeStoreId 闭店申请id
+ * @return 是否成功
+ */
+ Boolean cancelApply(Long closeStoreId);
+
+ /**
+ * 查询权限下的闭店申请审批记录
+ * @param request 闭店申请查询Request
+ * @return 闭店申请记录列表VO列表
+ */
+ PageInfo closeStoreAuditList(CloseStoreQueryRequest request);
+
+ /**
+ * 查询闭店申请列表
+ * @param request 闭店申请查询Request
+ * @return 闭店申请记录列表VO列表
+ */
+ PageInfo closeStoreInfoList(CloseStoreQueryRequest request);
+
+ /**
+ * 查询闭店审批记录
+ * @param closeStoreId 闭店申请id
+ * @return 审批记录VO列表
+ */
+ List getAuditRecordList(Long closeStoreId);
+
+ /**
+ * 获取闭店申请详情
+ * @param closeStoreId 闭店申请id
+ * @return 闭店申请详情VO
+ */
+ CloseStoreInfoDetailVO getCloseStoreInfoDetail(Long closeStoreId, Boolean queryAuditId);
+
+ /**
+ * 根据审批id获取闭店申请详情
+ * @param closeStoreAuditId 审批id
+ * @return 闭店申请详情VO
+ */
+ CloseStoreInfoDetailVO getCloseStoreInfoDetailByAuditId(Long closeStoreAuditId);
+
+ /**
+ * 闭店原因列表
+ * @param closeType 闭店发起方式
+ * @return 门店闭店原因VO
+ */
+ List getStoreCloseReasonList(Integer closeType);
+
+ /**
+ * 获取闭店申请简单信息
+ * @param closeStoreId 闭店申请id
+ * 闭店申请简单信息VO
+ */
+ CloseStoreSimpleVO getCloseStoreSimpleInfo(Long closeStoreId);
+
+ /**
+ * mini分页查询
+ * @param request 查询参数
+ * @return mini闭店申请简单信息VO
+ */
+ PageInfo getMiniCloseStoreSimpleInfoList(MiniCloseStoreQueryRequest request);
+
+ /**
+ * 获取闭店状态列表
+ * @return 闭店状态列表
+ */
+ List getCloseStoreStatusList();
+
+ /**
+ * 闭店流程流转
+ * @param closeStoreId 闭店申请id
+ * @param currentStage 当前阶段
+ */
+ void closeStoreProcessFlow(Long closeStoreId, CloseStoreSubStageEnum currentStage);
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/AbstractAccountClose.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/AbstractAccountClose.java
new file mode 100644
index 000000000..2bccfcd78
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/AbstractAccountClose.java
@@ -0,0 +1,37 @@
+package com.cool.store.service.close.impl;
+
+import com.cool.store.dao.StoreDao;
+import com.cool.store.entity.StoreDO;
+import com.cool.store.enums.ErrorCodeEnum;
+import com.cool.store.exception.ServiceException;
+import com.cool.store.service.close.AccountCloseStrategy;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+
+/**
+ *
+ * 账号关闭
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+public abstract class AbstractAccountClose implements AccountCloseStrategy {
+ @Resource
+ private StoreDao storeDao;
+
+ @Override
+ public Boolean accountClose(String storeId) {
+ // 各平台待对接
+ return true;
+ }
+
+ protected StoreDO getStore(String storeId) {
+ StoreDO storeDO = storeDao.getByStoreId(storeId);
+ if (Objects.isNull(storeDO)) {
+ throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
+ }
+ return storeDO;
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreAccountServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreAccountServiceImpl.java
new file mode 100644
index 000000000..38b440c4b
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreAccountServiceImpl.java
@@ -0,0 +1,80 @@
+package com.cool.store.service.close.impl;
+
+import com.cool.store.dao.CloseStoreAccountInfoDAO;
+import com.cool.store.dao.CloseStoreInfoDAO;
+import com.cool.store.dao.CloseStoreStageInfoDAO;
+import com.cool.store.entity.CloseStoreAccountInfoDO;
+import com.cool.store.entity.CloseStoreInfoDO;
+import com.cool.store.enums.close.*;
+import com.cool.store.service.close.AccountCloseFactory;
+import com.cool.store.service.close.AccountCloseStrategy;
+import com.cool.store.service.close.CloseStoreAccountService;
+import com.cool.store.service.close.CloseStoreService;
+import com.cool.store.utils.BeanUtil;
+import com.cool.store.vo.close.account.CloseStoreAccountVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *
+ * 闭店账号关闭 服务实现类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Service
+@RequiredArgsConstructor
+public class CloseStoreAccountServiceImpl implements CloseStoreAccountService {
+ private final CloseStoreAccountInfoDAO closeStoreAccountInfoDAO;
+ private final AccountCloseFactory accountCloseFactory;
+ private final CloseStoreStageInfoDAO closeStoreStageInfoDAO;
+ private final CloseStoreService closeStoreService;
+ private final CloseStoreInfoDAO closeStoreInfoDAO;
+
+ @Override
+ public List getAccountList(Long closeStoreId) {
+ List list = closeStoreAccountInfoDAO.getByCloseStoreId(closeStoreId);
+ return BeanUtil.toList(list, CloseStoreAccountVO.class);
+ }
+
+ @Override
+ public Boolean closeAccount(Long id) {
+ CloseStoreAccountInfoDO accountInfo = closeStoreAccountInfoDAO.getById(id);
+ if (Objects.nonNull(accountInfo)) {
+ closeStoreStageInfoDAO.verifyStage(accountInfo.getCloseStoreId(), CloseStoreStageEnum.CLOSE_STORE_STAGE_2, CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20, CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_25);
+ if (AccountCloseTypeEnum.APPLY_CLOSE.getType().equals(accountInfo.getCloseType())) {
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(accountInfo.getCloseStoreId());
+ // 申请关闭
+ AccountCloseStrategy accountClose = accountCloseFactory.getByCode(accountInfo.getSystemCode());
+ if (Objects.nonNull(accountClose) && accountClose.accountClose(closeStoreInfoDO.getStoreId())) {
+ closeStoreAccountInfoDAO.updateStatus(id, CloseStoreAccountStatusEnum.CLOSED.getStatus());
+ verifyAndUpdateStage(accountInfo.getCloseStoreId());
+ return true;
+ }
+ } else {
+ // 直接关闭
+ closeStoreAccountInfoDAO.updateStatus(id, CloseStoreAccountStatusEnum.CLOSED.getStatus());
+ verifyAndUpdateStage(accountInfo.getCloseStoreId());
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void verifyAndUpdateStage(Long closeStoreId) {
+ if (!closeStoreAccountInfoDAO.existNotCloseAccount(closeStoreId)) {
+ // 所有账号已关闭,校验当前阶段
+ CloseStoreStageEnum currentStage = CloseStoreStageEnum.CLOSE_STORE_STAGE_2;
+ CloseStoreSubStageEnum currentSubStage = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20;
+ CloseStoreSubStageStatusEnum currentExpectedSubStageStatus = CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_25;
+ closeStoreStageInfoDAO.verifyStage(closeStoreId, currentStage, currentSubStage, currentExpectedSubStageStatus);
+ // 流程流转
+ closeStoreService.closeStoreProcessFlow(closeStoreId, currentSubStage);
+ }
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreFileServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreFileServiceImpl.java
new file mode 100644
index 000000000..d44f77e00
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreFileServiceImpl.java
@@ -0,0 +1,211 @@
+package com.cool.store.service.close.impl;
+
+import com.cool.store.constants.CommonConstants;
+import com.cool.store.constants.RedisConstant;
+import com.cool.store.dao.CloseStoreFileDetailDAO;
+import com.cool.store.dao.CloseStoreFileInfoDAO;
+import com.cool.store.dao.CloseStoreStageInfoDAO;
+import com.cool.store.entity.CloseStoreFileInfoDO;
+import com.cool.store.enums.ErrorCodeEnum;
+import com.cool.store.enums.close.*;
+import com.cool.store.exception.ServiceException;
+import com.cool.store.request.close.file.*;
+import com.cool.store.entity.CloseStoreFileDetailDO;
+import com.cool.store.service.close.CloseStoreFileService;
+import com.cool.store.service.close.CloseStoreService;
+import com.cool.store.utils.BeanUtil;
+import com.cool.store.utils.RedisUtilPool;
+import com.cool.store.vo.close.file.CloseStoreFileDetailMiniVO;
+import com.cool.store.vo.close.file.CloseStoreFileDetailVO;
+import com.cool.store.vo.close.file.CloseStoreFileInfoVO;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
+
+import static com.cool.store.enums.close.CloseStoreSubStageStatusEnum.*;
+
+/**
+ *
+ * 闭店资料 服务实现类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Service
+@RequiredArgsConstructor
+public class CloseStoreFileServiceImpl implements CloseStoreFileService {
+ private final CloseStoreFileDetailDAO closeStoreFileDetailDAO;
+ private final CloseStoreFileInfoDAO closeStoreFileInfoDAO;
+ private final CloseStoreStageInfoDAO closeStoreStageInfoDAO;
+ private final CloseStoreService closeStoreService;
+ private final RedisUtilPool redisUtilPool;
+
+ private static final CloseStoreStageEnum STAGE = CloseStoreStageEnum.CLOSE_STORE_STAGE_1;
+ private static final CloseStoreSubStageEnum SUB_STAGE = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10;
+
+ @Override
+ @Transactional
+ public Boolean updateMailAddress(CloseStoreMailAddressRequest request) {
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_10);
+
+ closeStoreFileDetailDAO.insertOrUpdateMailAddress(request);
+ closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE);
+ return true;
+ }
+
+ @Override
+ @Transactional
+ public Boolean submitFileApprove(CloseStoreFileApproveRequest request) {
+ // 校验流程是否在材料待审批阶段
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_18);
+ // 修改材料详情
+ boolean approveCompleted = ListUtils.emptyIfNull(request.getFileList()).stream().allMatch(v -> CommonConstants.INDEX_ONE.equals(v.getApproveStatus()));
+ closeStoreFileDetailDAO.insertOrUpdateFileInfoSelective(request, approveCompleted);
+ // 修改所有材料的审批状态
+ if (CollectionUtils.isNotEmpty(request.getFileList())) {
+ List fileList = BeanUtil.toList(request.getFileList(), CloseStoreFileInfoDO.class);
+ closeStoreFileInfoDAO.updateBatch(fileList);
+ }
+ // 全部材料合格,流程流转
+ if (approveCompleted) {
+ closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE);
+ }
+ return true;
+ }
+
+ @Override
+ @Transactional
+ public Boolean submitFileApproveSingle(CloseStoreFileInfoRequest request) {
+ // 校验流程是否在材料待审批阶段
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_18);
+ // 更新其他字段
+ updateFileField(request);
+ // 更新材料审批信息
+ CloseStoreFileInfoDO updateFileInfoDO = CloseStoreFileInfoDO.builder()
+ .id(request.getId())
+ .approveStatus(request.getApproveStatus())
+ .mailStatus(request.getMailStatus())
+ .approveOpinion(request.getApproveOpinion())
+ .urls(request.getUrls())
+ .build();
+ closeStoreFileInfoDAO.updateSelective(updateFileInfoDO);
+ // 校验所有材料是否审批完成,完成后流程流转
+ verifyComplete(request);
+ return true;
+ }
+
+ /**
+ * 校验所有材料是否全部完成邮寄和审批完成
+ */
+ private void verifyComplete(CloseStoreFileInfoRequest request) {
+ List fileList = closeStoreFileInfoDAO.getByCloseStoreId(request.getCloseStoreId());
+ boolean completeApprove = fileList.stream().allMatch(v -> Objects.nonNull(v.getApproveStatus()) && CommonConstants.INDEX_ONE.equals(v.getMailStatus()));
+ if (completeApprove) {
+ closeStoreFileDetailDAO.insertOrUpdateFileInfoSelective(CloseStoreFileApproveRequest.builder().closeStoreId(request.getCloseStoreId()).build(), true);
+ boolean pass = fileList.stream().allMatch(v -> CommonConstants.INDEX_ONE.equals(v.getApproveStatus()));
+ // 更新材料状态为审批状态
+ closeStoreFileInfoDAO.updateFileStatusToApproveStatus(request.getCloseStoreId());
+ if (pass) {
+ closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE);
+ } else {
+ closeStoreStageInfoDAO.updateSubStageStatus(request.getCloseStoreId(), CLOSE_STORE_SUB_STAGE_STATUS_19);
+ }
+ }
+ }
+
+ /**
+ * 更新其他字段
+ */
+ private void updateFileField(CloseStoreFileInfoRequest request) {
+ CloseStoreFileInfoDO fileInfoDO = closeStoreFileInfoDAO.getById(request.getId());
+ if (Objects.isNull(fileInfoDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_FILE_NOT_EXIST);
+ }
+ if (CloseStoreFileEnum.TKD.getCode().equals(fileInfoDO.getFileCode())) {
+ boolean f = Stream.of(request.getBankAccount(), request.getBankOpening(), request.getRefundAccount()).anyMatch(StringUtils::isNotBlank);
+ if (f) {
+ CloseStoreFileApproveRequest approveRequest = CloseStoreFileApproveRequest.builder()
+ .closeStoreId(request.getCloseStoreId())
+ .bankAccount(request.getBankAccount())
+ .bankOpening(request.getBankOpening())
+ .refundAccount(request.getRefundAccount())
+ .build();
+ closeStoreFileDetailDAO.insertOrUpdateFileInfoSelective(approveRequest, false);
+ }
+ }
+ }
+
+ @Override
+ public CloseStoreFileDetailVO getFileDetail(Long closeStoreId) {
+ CloseStoreFileDetailDO fileDetailDO = closeStoreFileDetailDAO.getByCloseStoreId(closeStoreId);
+ CloseStoreFileDetailVO detailVO = BeanUtil.toBean(fileDetailDO, CloseStoreFileDetailVO.class);
+
+ List fileList = closeStoreFileInfoDAO.getByCloseStoreId(closeStoreId);
+ List fileVOList = BeanUtil.toList(fileList, CloseStoreFileInfoVO.class);
+ detailVO.setFileList(fileVOList);
+
+ return detailVO;
+ }
+
+ @Override
+ public CloseStoreFileDetailMiniVO getMiniFileDetail(Long closeStoreId) {
+ CloseStoreFileDetailVO fileDetail = getFileDetail(closeStoreId);
+ CloseStoreFileDetailMiniVO result = BeanUtil.toBean(fileDetail, CloseStoreFileDetailMiniVO.class);
+ if (CollectionUtils.isNotEmpty(result.getFileList())) {
+ result.getFileList().forEach(v -> v.setTemplateUrl(redisUtilPool.hashGet(RedisConstant.CLOSE_STORE_FILE_TEMPLATE, v.getFileCode())));
+ }
+ return result;
+ }
+
+ @Override
+ @Transactional
+ public Boolean submitFile(CloseStoreMailInfoRequest request) {
+ // 校验流程是否在材料待上传阶段
+ CloseStoreSubStageStatusEnum[] conditions = {CLOSE_STORE_SUB_STAGE_STATUS_15, CLOSE_STORE_SUB_STAGE_STATUS_17, CLOSE_STORE_SUB_STAGE_STATUS_19};
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, conditions);
+ // 修改邮寄信息
+ closeStoreFileDetailDAO.insertOrUpdateMailInfo(request, true);
+ // 校验所有材料是否上传完成,完成后流程流转
+ List files = closeStoreFileInfoDAO.getByCloseStoreId(request.getCloseStoreId());
+ List verifyList = Arrays.asList(FileStatusEnum.UPLOADED.getStatus(), FileStatusEnum.MODIFIED.getStatus(), FileStatusEnum.QUALIFIED.getStatus());
+ boolean verify = files.stream().allMatch(v -> verifyList.contains(v.getFileStatus()));
+ if (verify) {
+ closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE);
+ }
+ return true;
+ }
+
+ @Override
+ public Boolean updateFile(CloseStoreFileSubmitRequest request) {
+ CloseStoreSubStageStatusEnum[] conditions = {CLOSE_STORE_SUB_STAGE_STATUS_15, CLOSE_STORE_SUB_STAGE_STATUS_17, CLOSE_STORE_SUB_STAGE_STATUS_19};
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, conditions);
+ return closeStoreFileInfoDAO.updateFile(request.getId(), request.getUrls());
+ }
+
+ @Override
+ @Transactional
+ public Boolean supervisionAudit(CloseStoreFileAuditRequest request) {
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_16);
+ if (CommonConstants.INDEX_ONE.equals(request.getStatus())) {
+ // 所有资料状态改为审批中
+ closeStoreFileInfoDAO.updateAllFileStatus(request.getCloseStoreId());
+ // 流程流转
+ closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE);
+ } else {
+ // 修改督导审批意见
+ closeStoreFileDetailDAO.updateByCloseStoreIdSelective(CloseStoreFileDetailDO.builder().closeStoreId(request.getCloseStoreId()).remark(request.getRemark()).build());
+ // 修改阶段状态
+ closeStoreStageInfoDAO.updateSubStageStatus(request.getCloseStoreId(), CLOSE_STORE_SUB_STAGE_STATUS_17);
+ }
+ return true;
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreRefundServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreRefundServiceImpl.java
new file mode 100644
index 000000000..ea6bf2555
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreRefundServiceImpl.java
@@ -0,0 +1,225 @@
+package com.cool.store.service.close.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.cool.store.constants.RedisConstant;
+import com.cool.store.context.CurrentUserHolder;
+import com.cool.store.dao.*;
+import com.cool.store.dto.close.CloseStoreMkUserDTO;
+import com.cool.store.dto.xgj.XgjPayResultDTO;
+import com.cool.store.entity.CloseStoreInfoDO;
+import com.cool.store.entity.CloseStoreRefundInfoDO;
+import com.cool.store.entity.EnterpriseUserDO;
+import com.cool.store.entity.StoreDO;
+import com.cool.store.enums.ErrorCodeEnum;
+import com.cool.store.enums.close.CloseStoreSubStageEnum;
+import com.cool.store.enums.close.CloseStoreSubStageStatusEnum;
+import com.cool.store.enums.close.RefundPayStatusEnum;
+import com.cool.store.enums.close.XgjRefundPayStatusEnum;
+import com.cool.store.exception.ServiceException;
+import com.cool.store.request.close.refund.CloseStoreRefundAddRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundUpdateRequest;
+import com.cool.store.request.xgj.XgjPaymentRequest;
+import com.cool.store.request.xgj.XgjReimburseRequest;
+import com.cool.store.service.ThirdXgjService;
+import com.cool.store.service.close.CloseStoreRefundService;
+import com.cool.store.service.close.CloseStoreService;
+import com.cool.store.service.dict.impl.DictService;
+import com.cool.store.utils.BeanUtil;
+import com.cool.store.utils.CoolDateUtils;
+import com.cool.store.utils.RedisUtilPool;
+import com.cool.store.vo.close.refund.CloseStoreRefundDetailVO;
+import com.cool.store.vo.close.refund.CloseStoreRefundListVO;
+import com.cool.store.vo.close.refund.CloseStoreRefundSimpleVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *
+ * 闭店退款 服务实现类
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Service
+@RequiredArgsConstructor
+public class CloseStoreRefundServiceImpl implements CloseStoreRefundService {
+ private final CloseStoreRefundInfoDAO closeStoreRefundInfoDAO;
+ private final CloseStoreInfoDAO closeStoreInfoDAO;
+ private final CloseStoreStageInfoDAO closeStoreStageInfoDAO;
+ private final CloseStoreService closeStoreService;
+ private final StoreDao storeDao;
+ private final RedisUtilPool redisUtilPool;
+ private final ThirdXgjService thirdXgjService;
+ private final EnterpriseUserDAO enterpriseUserDAO;
+ private final DictService dictService;
+
+ @Override
+ public Boolean addRefund(CloseStoreRefundAddRequest request) {
+ if (!CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.getCloseStoreSubStage().equals(request.getType())
+ && !CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_40.getCloseStoreSubStage().equals(request.getType())) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_TYPE_ERROR);
+ }
+ CloseStoreMkUserDTO mkUser = getCurrentMkUser();
+ // 校验是否有每刻权限
+ if (Objects.isNull(mkUser)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_MK_USER_NOT_EXIST);
+ }
+ // 是否存在非作废状态的记录,则不能新增
+ if (closeStoreRefundInfoDAO.existEffectiveRecord(request.getCloseStoreId(), request.getType())) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD);
+ }
+ CloseStoreInfoDO closeStoreInfo = closeStoreInfoDAO.getById(request.getCloseStoreId());
+ if (Objects.isNull(closeStoreInfo)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
+ }
+ StoreDO storeDO = storeDao.getByStoreId(closeStoreInfo.getStoreId());
+ if (Objects.isNull(storeDO)) {
+ throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
+ }
+
+ CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(request.getType());
+ CloseStoreSubStageStatusEnum expectedStageStatus = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.equals(subStage) ? CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_35 : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_45;
+ assert subStage != null;
+ // 校验阶段状态
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), subStage.getCloseStoreStageEnum(), subStage, expectedStageStatus);
+
+ CloseStoreRefundInfoDO refundInfoDO = BeanUtil.toBean(request, CloseStoreRefundInfoDO.class);
+ refundInfoDO.setRefundNo(generateCloseStoreNo());
+ // 提交新管家
+ XgjReimburseRequest xgjReimburseRequest = request.convertToXgjRequest(mkUser, closeStoreInfo.getCloseReason(), storeDO);
+ String orderNo = thirdXgjService.reimburse(xgjReimburseRequest);
+ refundInfoDO.setRefundOrderNo(orderNo);
+ refundInfoDO.setRefundStatus(RefundPayStatusEnum.APPROVING.getStatus());
+ refundInfoDO.setSubmitterId(StringUtils.isNotBlank(refundInfoDO.getSubmitterId()) ? refundInfoDO.getSubmitterId() : mkUser.getJobnumber());
+ refundInfoDO.setSubmitterName(StringUtils.isNotBlank(refundInfoDO.getSubmitterName()) ? refundInfoDO.getSubmitterName() : mkUser.getName());
+ return closeStoreRefundInfoDAO.insertSelective(refundInfoDO);
+ }
+
+ @Override
+ public Boolean updateRefund(CloseStoreRefundUpdateRequest request) {
+ CloseStoreMkUserDTO mkUser = getCurrentMkUser();
+ // 校验是否有每刻权限
+ if (Objects.isNull(mkUser)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_MK_USER_NOT_EXIST);
+ }
+ CloseStoreRefundInfoDO old = closeStoreRefundInfoDAO.getById(request.getId());
+ if (Objects.isNull(old)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_INFO_NOT_EXIST);
+ }
+ CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(old.getType());
+ CloseStoreSubStageStatusEnum expectedStageStatus = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.equals(subStage) ? CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_35 : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_45;
+ assert subStage != null;
+ // 校验阶段状态
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), subStage.getCloseStoreStageEnum(), subStage, expectedStageStatus);
+
+ CloseStoreRefundInfoDO refundInfoDO = BeanUtil.toBean(request, CloseStoreRefundInfoDO.class);
+ refundInfoDO.setSubmitterId(StringUtils.isNotBlank(refundInfoDO.getSubmitterId()) ? refundInfoDO.getSubmitterId() : mkUser.getJobnumber());
+ refundInfoDO.setSubmitterName(StringUtils.isNotBlank(refundInfoDO.getSubmitterName()) ? refundInfoDO.getSubmitterName() : mkUser.getName());
+ return closeStoreRefundInfoDAO.updateSelective(refundInfoDO);
+ }
+
+ @Override
+ public CloseStoreMkUserDTO getCurrentMkUser() {
+ EnterpriseUserDO user = enterpriseUserDAO.getUserInfoById(CurrentUserHolder.getUserId());
+ String mkUserStr = redisUtilPool.hashGet(RedisConstant.MK_USER_MAPPING, user.getJobnumber());
+ if (StringUtils.isNotBlank(mkUserStr)) {
+ return JSONObject.parseObject(mkUserStr, CloseStoreMkUserDTO.class);
+ }
+ return null;
+ }
+
+ @Override
+ public CloseStoreRefundDetailVO getRefundDetail(Long id) {
+ CloseStoreRefundInfoDO refundInfoDO = closeStoreRefundInfoDAO.getById(id);
+ if (Objects.nonNull(refundInfoDO)) {
+ CloseStoreRefundDetailVO vo = BeanUtil.toBean(refundInfoDO, CloseStoreRefundDetailVO.class);
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(refundInfoDO.getCloseStoreId());
+ if (Objects.nonNull(closeStoreInfoDO)) {
+ vo.setCloseReason(closeStoreInfoDO.getCloseReason());
+ }
+ dictService.fillDictField(vo);
+ return vo;
+ }
+ return null;
+ }
+
+ @Override
+ @Transactional
+ public void completeRefund(Long refundId, Date refundTime) {
+ CloseStoreRefundInfoDO refundInfoDO = closeStoreRefundInfoDAO.getById(refundId);
+ if (Objects.nonNull(refundInfoDO) && !RefundPayStatusEnum.PAY_SUCCESS.getStatus().equals(refundInfoDO.getRefundStatus())) {
+ CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(refundInfoDO.getType());
+ if (Objects.nonNull(subStage)) {
+ // 修改退款状态
+ closeStoreRefundInfoDAO.updateRefundStatus(refundId, RefundPayStatusEnum.PAY_SUCCESS.getStatus(), refundTime);
+ // 流程流转
+ closeStoreService.closeStoreProcessFlow(refundInfoDO.getCloseStoreId(), subStage);
+ }
+ }
+ }
+
+ @Override
+ public List getRefundSimpleList(Long closeStoreId) {
+ List list = closeStoreRefundInfoDAO.getListByCloseStoreId(closeStoreId, null);
+ return BeanUtil.toList(list, CloseStoreRefundSimpleVO.class);
+ }
+
+ @Override
+ @Transactional
+ public void skip(CloseStoreRefundSkipRequest request) {
+ CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(request.getType());
+ CloseStoreSubStageStatusEnum expectedStageStatus = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.equals(subStage) ? CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_35 : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_45;
+ assert subStage != null;
+ closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), subStage.getCloseStoreStageEnum(), subStage, expectedStageStatus);
+ // 流程流转
+ closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), subStage);
+ }
+
+ @Override
+ public PageInfo refundPage(CloseStoreRefundQueryRequest request) {
+ PageHelper.startPage(request.getPageNum(), request.getPageSize());
+ List list = closeStoreRefundInfoDAO.getListByCloseStoreId(request.getCloseStoreId(), request.getType());
+ PageInfo page = new PageInfo<>(list);
+ return BeanUtil.toPage(page, CloseStoreRefundListVO.class);
+ }
+
+ @Override
+ public Boolean refreshRefundOrderStatus(CloseStoreRefundQueryRequest request) {
+ List list = closeStoreRefundInfoDAO.getListByCloseStoreId(request.getCloseStoreId(), request.getType());
+ List updateList = new ArrayList<>();
+ for (CloseStoreRefundInfoDO refundInfoDO : list) {
+ if (StringUtils.isNotBlank(refundInfoDO.getRefundOrderNo())) {
+ XgjPayResultDTO xgjPayResultDTO = thirdXgjService.queryOrderStatus(new XgjPaymentRequest(refundInfoDO.getRefundOrderNo()));
+ String xgjStatus = xgjPayResultDTO.getStatus();
+ String refundStatus = XgjRefundPayStatusEnum.REJECTED.getStatus().equals(xgjStatus) ? RefundPayStatusEnum.APPROVING.getStatus() : xgjStatus;
+ if (!refundInfoDO.getRefundStatus().equals(refundStatus)) {
+ updateList.add(CloseStoreRefundInfoDO.builder().id(refundInfoDO.getId()).refundStatus(refundStatus).build());
+ }
+ }
+ }
+ if (CollectionUtils.isNotEmpty(updateList)) {
+ closeStoreRefundInfoDAO.updateRefundStatusBatchById(list);
+ }
+ return true;
+ }
+
+ /**
+ * 生成退款申请单号
+ */
+ private String generateCloseStoreNo(){
+ return "T" + CoolDateUtils.getTodayMillis();
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreServiceImpl.java
new file mode 100644
index 000000000..4b0d37a32
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreServiceImpl.java
@@ -0,0 +1,621 @@
+package com.cool.store.service.close.impl;
+
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.cool.store.constants.CommonConstants;
+import com.cool.store.context.CurrentUserHolder;
+import com.cool.store.context.LoginUserInfo;
+import com.cool.store.context.PartnerUserHolder;
+import com.cool.store.dao.*;
+import com.cool.store.dao.store.StoreMasterSignerInfoDAO;
+import com.cool.store.dto.store.StoreMasterIssueDTO;
+import com.cool.store.entity.*;
+import com.cool.store.entity.store.StoreMasterSignerInfoDO;
+import com.cool.store.enums.*;
+import com.cool.store.enums.close.*;
+import com.cool.store.enums.master.StoreCloseReasonEnum;
+import com.cool.store.exception.ServiceException;
+import com.cool.store.mq.producer.SimpleMessageService;
+import com.cool.store.request.close.store.*;
+import com.cool.store.response.AuditInfoResponse;
+import com.cool.store.service.UserAuthMappingService;
+import com.cool.store.service.close.CloseStoreService;
+import com.cool.store.utils.BeanUtil;
+import com.cool.store.utils.CoolDateUtils;
+import com.cool.store.utils.poi.StringUtils;
+import com.cool.store.vo.PartnerUserInfoVO;
+import com.cool.store.vo.close.store.*;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.ListUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author suzhuhong
+ * @Date 2025/9/23 15:48
+ * @Version 1.0
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class CloseStoreServiceImpl implements CloseStoreService {
+
+ private final CloseStoreInfoDAO closeStoreInfoDAO;
+ private final CloseStoreAuditRecordDAO closeStoreAuditRecordDAO;
+ private final UserAuthMappingService userAuthMappingService;
+ private final CloseStoreFileInfoDAO closeStoreFileInfoDAO;
+ private final CloseStoreFileDetailDAO closeStoreFileDetailDAO;
+ private final CloseStoreAccountInfoDAO closeStoreAccountInfoDAO;
+ private final CloseStoreStageInfoDAO closeStoreStageInfoDAO;
+ private final StoreDao storeDao;
+ private final RegionDao regionDao;
+ private final EnterpriseUserRoleDao enterpriseUserRoleDao;
+ private final StoreMasterSignerInfoDAO storeMasterSignerInfoDAO;
+ private final SimpleMessageService simpleMessageService;
+ private final CloseStoreRefundInfoDAO closeStoreRefundInfoDAO;
+ private final EnterpriseUserDAO enterpriseUserDAO;
+
+ @Value("${mybatis.configuration.variables.enterpriseId}")
+ private String enterpriseId;
+
+
+ @Override
+ @Transactional
+ public Boolean applyCloseStore(CloseStoreApplyRequest request) {
+ // 查询当前当前门店 校验门店状态
+ StoreDO store = storeDao.getByStoreId(request.getStoreId());
+ if (store == null){
+ throw new ServiceException(ErrorCodeEnum.STORE_NOT_EXIST);
+ }
+ if (CommonConstants.CLOSED.equals(store.getStoreStatus())){
+ throw new ServiceException(ErrorCodeEnum.STORE_NOT_OPEN);
+ }
+ // 校验是否有正在进行的申请
+ if (closeStoreInfoDAO.existOngoingRecord(request.getStoreId())) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_EXIST_ONGOING_RECORD);
+ }
+ RegionDO regionDO = regionDao.getRegionByStoreId(store.getStoreId());
+ if (Objects.isNull(regionDO)) {
+ throw new ServiceException(ErrorCodeEnum.REGION_NOT_EXIST);
+ }
+ String userId, userName;
+ if (CloseTypeEnum.INITIATE.getCloseType().equals(request.getCloseType())) {
+ // 主动发起的申请人为加盟商,从C端登录用户信息中获取
+ PartnerUserInfoVO user = PartnerUserHolder.getUser();
+ userId = user.getPartnerId();
+ userName = user.getUsername();
+ if (StringUtils.isBlank(userName)) {
+ userName = user.getMobile();
+ }
+ } else {
+ userId = AIEnum.AI_ID.getCode();
+ userName = AIEnum.AI_NAME.getCode();
+ }
+ CloseStoreInfoDO closeStoreInfoDO = new CloseStoreInfoDO();
+ closeStoreInfoDO.setCloseStoreNo(generateCloseStoreNo());
+ closeStoreInfoDO.setStoreId(request.getStoreId());
+ closeStoreInfoDO.setRegionId(regionDO.getId());
+ closeStoreInfoDO.setPlanCloseData(request.getPlanCloseDate());
+ closeStoreInfoDO.setCloseType(request.getCloseType());
+ closeStoreInfoDO.setCloseReason(request.getCloseReason());
+ closeStoreInfoDO.setReasonDescription(request.getReasonDescription());
+ closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus());
+ closeStoreInfoDO.setApplyUserId(userId);
+ closeStoreInfoDAO.insertSelective(closeStoreInfoDO);
+ // 查询督导
+ List auditUserIds = getAuditUserIds(regionDO.getId(), UserRoleEnum.SUPERVISION);
+ closeStoreAuditRecordDAO.addRecord(closeStoreInfoDO.getId(), userId, userName, auditUserIds);
+ return Boolean.TRUE;
+ }
+
+ @Override
+ @Transactional
+ public Boolean reApplyCloseStore(ReCloseStoreApplyRequest request) {
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(request.getCloseStoreId());
+ if (Objects.isNull(closeStoreInfoDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
+ }
+ CloseStoreApplyRequest applyRequest = CloseStoreApplyRequest.builder()
+ .planCloseDate(closeStoreInfoDO.getPlanCloseData())
+ .closeReason(closeStoreInfoDO.getCloseReason())
+ .reasonDescription(closeStoreInfoDO.getReasonDescription())
+ .closeType(closeStoreInfoDO.getCloseType())
+ .storeId(closeStoreInfoDO.getStoreId())
+ .build();
+ return applyCloseStore(applyRequest);
+ }
+
+ @Override
+ @Transactional
+ public Boolean thirdApplyCloseStore(ThirdCloseStoreApplyRequest request) {
+ StoreDO storeDO = storeDao.getByStoreNum(request.getStoreNum());
+ if (Objects.isNull(storeDO)) {
+ throw new ServiceException(ErrorCodeEnum.STORE_NOT_EXIST);
+ }
+ CloseStoreApplyRequest closeRequest = request.convert(storeDO.getStoreId());
+ return applyCloseStore(closeRequest);
+ }
+
+ @Override
+ @Transactional
+ public Boolean auditPass(CloseStoreAuditRequest request) {
+ CloseStoreAuditRecordDO auditRecordDO = closeStoreAuditRecordDAO.getById(request.getAuditRecordId());
+ // 校验审批权限
+ auditVerify(auditRecordDO);
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(auditRecordDO.getCloseStoreId());
+ if (Objects.isNull(closeStoreInfoDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
+ }
+ // 修改闭店申请信息
+ Integer currentCloseStatus = closeStoreInfoDO.getCloseStatus();
+ Integer nextCloseStatus = CloseStoreStatusEnum.getNextPassStatus(currentCloseStatus);
+ if (Objects.nonNull(request.getCloseReason())) {
+ closeStoreInfoDO.setCloseReason(request.getCloseReason());
+ }
+ closeStoreInfoDO.setActualCloseData(request.getActualCloseData());
+ closeStoreInfoDO.setCloseStatus(nextCloseStatus);
+ closeStoreInfoDAO.updateSelective(closeStoreInfoDO);
+ // 修改闭店审批信息
+ auditRecordDO.setAuditStatus(CloseStoreAuditStatusEnum.PASS.getStatus());
+ auditRecordDO.setActionRemark(request.getRemark());
+ auditRecordDO.setHandlerUserId(CurrentUserHolder.getUserId());
+ auditRecordDO.setHandlerUserName(CurrentUserHolder.getUser().getName());
+ auditRecordDO.setFinishTaskTime(new Date());
+ closeStoreAuditRecordDAO.updateRecord(auditRecordDO);
+ // 督导审批结束后为大区经理审批
+ if (CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(nextCloseStatus)) {
+ // 新增大区老总审批
+ List auditUserIds = getAuditUserIds(closeStoreInfoDO.getRegionId(), UserRoleEnum.REGION_MANAGER);
+ closeStoreAuditRecordDAO.addApproveRecord(closeStoreInfoDO.getId(), auditUserIds);
+ } else {
+ // 完成闭店,再进入闭店流程
+ closeStoreFlowInit(closeStoreInfoDO, closeStoreInfoDO.getStoreId(), closeStoreInfoDO.getCloseReason());
+ }
+ return true;
+ }
+
+ @Override
+ @Transactional
+ public Boolean auditReject(CloseStoreAuditRequest request) {
+ CloseStoreAuditRecordDO auditRecordDO = closeStoreAuditRecordDAO.getById(request.getAuditRecordId());
+ // 校验审批权限
+ auditVerify(auditRecordDO);
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(auditRecordDO.getCloseStoreId());
+ if (Objects.isNull(closeStoreInfoDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
+ }
+ closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.REVIEW_NOT_APPROVED.getCloseStoreStatus());
+ closeStoreInfoDAO.updateSelective(closeStoreInfoDO);
+ // 修改闭店审批信息
+ auditRecordDO.setAuditStatus(CloseStoreAuditStatusEnum.REJECTED.getStatus());
+ auditRecordDO.setActionRemark(request.getRemark());
+ auditRecordDO.setHandlerUserId(CurrentUserHolder.getUserId());
+ auditRecordDO.setHandlerUserName(CurrentUserHolder.getUser().getName());
+ auditRecordDO.setFinishTaskTime(new Date());
+ closeStoreAuditRecordDAO.updateRecord(auditRecordDO);
+ return true;
+ }
+
+ @Override
+ @Transactional
+ public Boolean cancelApply(Long closeStoreId) {
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId);
+ if (Objects.isNull(closeStoreInfoDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
+ }
+ if (CloseStoreStatusEnum.CANCELED.getCloseStoreStatus().equals(closeStoreInfoDO.getCloseStatus())) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_CANCELED);
+ }
+ // 未审批前能够取消
+ if (!CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus().equals(closeStoreInfoDO.getCloseStatus())) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_CANCEL_ERROR);
+ }
+ // 非申请人无法取消
+ if (!closeStoreInfoDO.getApplyUserId().equals(PartnerUserHolder.getUser().getPartnerId())) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_IS_NOT_APPLICANT);
+ }
+ // 修改闭店申请信息
+ closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.CANCELED.getCloseStoreStatus());
+ closeStoreInfoDAO.updateSelective(closeStoreInfoDO);
+ // 删除待处理的审批记录
+ closeStoreAuditRecordDAO.deletePendingRecord(closeStoreId);
+ return true;
+ }
+
+ @Override
+ public PageInfo closeStoreAuditList(CloseStoreQueryRequest request) {
+ closeStoreRecordQueryBefore(request);
+ if (Objects.isNull(request.getAuditStatus())) {
+ request.setAuditStatus(CloseStoreAuditStatusEnum.PENDING.getStatus());
+ }
+ LoginUserInfo user = CurrentUserHolder.getUser();
+ Boolean isAdmin = enterpriseUserRoleDao.checkIsAdmin(user.getUserId());
+ PageInfo pageInfo = closeStoreAuditRecordDAO.getCloseStoreAuditList(request, user.getUserId(), isAdmin);
+ fillCloseStoreRecord(request, pageInfo.getList());
+ return pageInfo;
+ }
+
+ @Override
+ public PageInfo closeStoreInfoList(CloseStoreQueryRequest request) {
+ closeStoreRecordQueryBefore(request);
+ request.setQueryStore(true);
+ String userId = CurrentUserHolder.getUserId();
+ Boolean isAdmin = enterpriseUserRoleDao.checkIsAdmin(userId);
+ List regionIds = new ArrayList<>();
+ if (!isAdmin) {
+ List userAuthMappingDOS = userAuthMappingService.listUserAuthMappingByUserId(userId);
+ if (CollectionUtils.isEmpty(userAuthMappingDOS)) {
+ return new PageInfo<>();
+ }
+ regionIds = CollStreamUtil.toList(userAuthMappingDOS, UserAuthMappingDO::getMappingId);
+ }
+ PageInfo pageInfo = closeStoreInfoDAO.getCloseStoreInfoList(request, regionIds);
+ fillCloseStoreRecord(request, pageInfo.getList());
+ List closeStoreIds = CollStreamUtil.toList(pageInfo.getList(), CloseStoreInfoListVO::getCloseStoreId);
+ Map completeCountMap = closeStoreStageInfoDAO.getCompleteCountMap(closeStoreIds);
+ pageInfo.getList().forEach(v -> {
+ v.setCompleteProcessNum(completeCountMap.getOrDefault(v.getCloseStoreId(), 0L).intValue());
+ v.setTotalProcessNum(CloseStoreSubStageEnum.values().length);
+ });
+ return pageInfo;
+ }
+
+ @Override
+ public List getAuditRecordList(Long closeStoreId) {
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId);
+ if (Objects.isNull(closeStoreInfoDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
+ }
+ List list = closeStoreAuditRecordDAO.getListByCloseStoreId(closeStoreId);
+ Set userIds = new HashSet<>();
+ list.forEach(v -> {
+ if (!CommonConstants.INDEX_ONE.equals(v.getRecordType()) || CloseTypeEnum.NO_ORDER_AUTO.getCloseType().equals(closeStoreInfoDO.getCloseType())) {
+ userIds.addAll(StringUtils.isNotBlank(v.getHandlerUserIds()) ? Arrays.asList(v.getHandlerUserIds().split(",")) : Collections.emptyList());
+ }
+ });
+ Map userMap = enterpriseUserDAO.getUserMap(new ArrayList<>(userIds));
+ List result = new ArrayList<>();
+ for (int i = 0; i < list.size(); i++) {
+ CloseStoreAuditRecordDO auditRecordDO = list.get(i);
+ AuditInfoResponse auditInfo = AuditInfoResponse.builder()
+ .type(getAuditInfoType(auditRecordDO))
+ // 0加盟商发起 1云流水发起 2督导审批 3大区经理审批
+ .execute(i == 0 ? (CloseTypeEnum.INITIATE.getCloseType().equals(closeStoreInfoDO.getCloseType()) ? 0 : 1) : i + 1)
+ .status(CommonConstants.INDEX_ZERO.equals(auditRecordDO.getAuditStatus()) ? 0 : 1)
+ .createTime(auditRecordDO.getCreateTime())
+ .remark(auditRecordDO.getActionRemark())
+ .actualUserId(auditRecordDO.getHandlerUserId())
+ .build();
+ List auditUserList = Arrays.stream(auditRecordDO.getHandlerUserIds().split(","))
+ .filter(StringUtils::isNotBlank)
+ .map(v -> {
+ String userName = null, avatar = null;
+ if (CommonConstants.INDEX_ZERO.equals(auditInfo.getExecute())) {
+ userName = auditRecordDO.getHandlerUserName();
+ } else {
+ EnterpriseUserDO user = userMap.get(v);
+ if (Objects.nonNull(user)) {
+ userName = user.getName();
+ avatar = user.getAvatar();
+ }
+ }
+ return new AuditInfoResponse.AuditUserInfoVO(v, userName, avatar);
+ })
+ .collect(Collectors.toList());
+ auditInfo.setList(auditUserList);
+ result.add(auditInfo);
+ }
+ return result;
+ }
+
+ private Integer getAuditInfoType(CloseStoreAuditRecordDO auditRecordDO) {
+ if (CommonConstants.INDEX_ONE.equals(auditRecordDO.getRecordType())) {
+ return OperationLogAuditEnum.SUBMIT_AUDIT.getCode();
+ } else {
+ switch (auditRecordDO.getAuditStatus()) {
+ case 0:
+ return OperationLogAuditEnum.WAIT_AUDIT.getCode();
+ case 1:
+ return OperationLogAuditEnum.PASS.getCode();
+ case 2:
+ return OperationLogAuditEnum.REFUSE.getCode();
+ default:
+ return null;
+ }
+ }
+ }
+
+ @Override
+ public CloseStoreInfoDetailVO getCloseStoreInfoDetail(Long closeStoreId, Boolean queryAuditId) {
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId);
+ if (Objects.isNull(closeStoreInfoDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
+ }
+ CloseStoreInfoDetailVO vo = new CloseStoreInfoDetailVO();
+ BeanUtil.copyProperties(closeStoreInfoDO, vo);
+
+ StoreDO storeDO = storeDao.getByStoreId(closeStoreInfoDO.getStoreId());
+ if (Objects.nonNull(storeDO)) {
+ BeanUtil.copyPropertiesIgnoreId(storeDO, vo);
+ }
+ StoreMasterSignerInfoDO signerInfoDO = storeMasterSignerInfoDAO.getByStoreId(closeStoreInfoDO.getStoreId());
+ if (Objects.nonNull(signerInfoDO)) {
+ BeanUtil.copyPropertiesIgnoreId(signerInfoDO, vo);
+ }
+ if (Boolean.TRUE.equals(queryAuditId)) {
+ CloseStoreAuditRecordDO pendingAuditRecord = closeStoreAuditRecordDAO.getPendingAuditRecord(closeStoreId);
+ if (Objects.nonNull(pendingAuditRecord)) {
+ vo.setAuditId(pendingAuditRecord.getId());
+ }
+ }
+ return vo;
+ }
+
+ @Override
+ public CloseStoreInfoDetailVO getCloseStoreInfoDetailByAuditId(Long closeStoreAuditId) {
+ CloseStoreAuditRecordDO auditRecordDO = closeStoreAuditRecordDAO.getById(closeStoreAuditId);
+ if (Objects.isNull(auditRecordDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_AUDIT_RECORD_NOT_EXIST);
+ }
+ CloseStoreInfoDetailVO vo = getCloseStoreInfoDetail(auditRecordDO.getCloseStoreId(), null);
+ vo.setAuditId(auditRecordDO.getId());
+ return vo;
+ }
+
+ @Override
+ public List getStoreCloseReasonList(Integer closeType) {
+ return Arrays.stream(StoreCloseReasonEnum.values())
+ .filter(v -> Objects.isNull(closeType) || v.getCloseNature().getCloseType().getCloseType().equals(closeType))
+ .map(v -> new StoreCloseReasonVO(v.getCode(), v.getDesc(), v.getCloseNature().getCloseType().getCloseType()))
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public CloseStoreSimpleVO getCloseStoreSimpleInfo(Long closeStoreId) {
+ CloseStoreInfoDetailVO detail = getCloseStoreInfoDetail(closeStoreId, null);
+ CloseStoreSimpleVO vo = BeanUtil.toBean(detail, CloseStoreSimpleVO.class);
+ vo.setCompleteProcessNum(closeStoreStageInfoDAO.getCompleteCount(closeStoreId));
+ vo.setTotalProcessNum(CloseStoreSubStageEnum.values().length);
+ List stageInfoList = closeStoreStageInfoDAO.getList(closeStoreId);
+ List subStageList = BeanUtil.toList(stageInfoList, CloseStoreSubStageStatusVO.class);
+ vo.setStageList(subStageList);
+ return vo;
+ }
+
+ @Override
+ public PageInfo getMiniCloseStoreSimpleInfoList(MiniCloseStoreQueryRequest request) {
+ String userId = PartnerUserHolder.getUser().getPartnerId();
+ PageHelper.startPage(request.getPageNum(), request.getPageSize());
+ List list = closeStoreInfoDAO.getListByApplyUserId(userId, CloseTypeEnum.INITIATE.getCloseType(), request.getStoreId());
+ PageInfo pageInfo = new PageInfo<>(list);
+ PageInfo voPage = BeanUtil.toPage(pageInfo, MiniCloseStoreSimpleVO.class);
+
+ Set storeIds = CollStreamUtil.toSet(list, CloseStoreInfoDO::getStoreId);
+ List storeList = storeDao.getEffectiveStoreByStoreIds(new ArrayList<>(storeIds));
+ Map storeMap = CollStreamUtil.toMap(storeList, StoreDO::getStoreId, v -> v);
+
+ voPage.getList().forEach(v -> {
+ StoreDO storeDO = storeMap.get(v.getStoreId());
+ if (Objects.nonNull(storeDO)) {
+ BeanUtil.copyPropertiesIgnoreId(storeDO, v, "createTime");
+ }
+ });
+ return voPage;
+ }
+
+ @Override
+ public List getCloseStoreStatusList() {
+ return Arrays.stream(CloseStoreStatusEnum.values())
+ .filter(v -> v != CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL)
+ .map(v -> new CloseStoreStatusVO(v.getCloseStoreStatus(), v.getCloseStoreStatusName()))
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ @Transactional
+ public void closeStoreProcessFlow(Long closeStoreId, CloseStoreSubStageEnum currentSubStage) {
+ CloseStoreStageInfoDO currentStage = closeStoreStageInfoDAO.getByStage(closeStoreId, currentSubStage.getCloseStoreStageEnum().getCloseStoreStage(), currentSubStage.getCloseStoreSubStage());
+ CloseStoreSubStageStatusEnum stageStatus = CloseStoreSubStageStatusEnum.getByStatus(currentStage.getShopSubStageStatus());
+ // 已结束或未开始的流程不流转
+ if (Objects.nonNull(stageStatus) && !CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_00.equals(stageStatus) && !stageStatus.isTerminated()) {
+ // 下个子阶段状态
+ CloseStoreSubStageStatusEnum nextStageStatus = CloseStoreSubStageStatusEnum.getNextStageStatus(stageStatus);
+ if (Objects.nonNull(nextStageStatus)) {
+ log.info("进入子阶段下一阶段:{}, status:{}[{}]", nextStageStatus.getShopSubStageName(), nextStageStatus.getShopSubStageStatusName(), nextStageStatus.getShopSubStageStatus());
+ currentStage.setShopSubStageStatus(nextStageStatus.getShopSubStageStatus());
+ currentStage.setIsTerminated(nextStageStatus.isTerminated() ? 1 : 0);
+ currentStage.setUpdateTime(new Date());
+ if (nextStageStatus.isTerminated()) {
+ currentStage.setActualCompleteTime(CoolDateUtils.getCurrentDateTime());
+ }
+ closeStoreStageInfoDAO.updateSelective(currentStage);
+ if (nextStageStatus.isTerminated()) {
+ // 当前子阶段结束,开始下一个子阶段
+ log.info("当前子阶段结束,进入下一个子阶段");
+ openNextSubStage(closeStoreId, currentSubStage);
+ }
+ }
+ }
+
+ }
+
+ /**
+ * 开启下一个子阶段
+ * @param closeStoreId 闭店申请ID
+ * @param currentSubStage 当前子阶段
+ */
+ public void openNextSubStage(Long closeStoreId, CloseStoreSubStageEnum currentSubStage) {
+ // 根据当前子阶段获取下一个需要开启的子阶段列表
+ List nextSubStages = CloseStoreSubStageEnum.getNextSubStage(currentSubStage);
+ if (CollectionUtils.isEmpty(nextSubStages)) {
+ // 不存在下一子阶段,校验当前所有子阶段状态,修改闭店申请状态
+ log.info("当前子阶段结束,不存在下一子阶段");
+ verifyAndUpdateCloseStoreStatus(closeStoreId);
+ return;
+ }
+ log.info("开启子阶段:{}", StringUtils.join(CollStreamUtil.toList(nextSubStages, CloseStoreSubStageEnum::getCloseStoreSubStageName), ","));
+ List subStageList = CollStreamUtil.toList(nextSubStages, CloseStoreSubStageEnum::getCloseStoreSubStage);
+ List stageInfoList = closeStoreStageInfoDAO.getBySubStage(closeStoreId, subStageList);
+ Map> stageMap = CollStreamUtil.group2Map(stageInfoList, CloseStoreStageInfoDO::getShopStage, CloseStoreStageInfoDO::getShopSubStage);
+
+ List updateStageList = new ArrayList<>();
+ for (CloseStoreSubStageEnum nextSubStage : nextSubStages) {
+ CloseStoreStageInfoDO stageInfoDO = stageMap.getOrDefault(nextSubStage.getCloseStoreStageEnum().getCloseStoreStage(), Collections.emptyMap())
+ .get(nextSubStage.getCloseStoreSubStage());
+ if (Objects.nonNull(stageInfoDO)) {
+ // 获取子阶段开始的状态
+ CloseStoreSubStageStatusEnum openStageStatus = CloseStoreSubStageStatusEnum.getOpenStageStatus(nextSubStage);
+ if (Objects.nonNull(openStageStatus)) {
+ CloseStoreStageInfoDO updateStageInfo = CloseStoreStageInfoDO.builder()
+ .id(stageInfoDO.getId())
+ .shopSubStageStatus(openStageStatus.getShopSubStageStatus())
+ .build();
+ updateStageList.add(updateStageInfo);
+ }
+ }
+ }
+ if (CollectionUtils.isNotEmpty(updateStageList)) {
+ closeStoreStageInfoDAO.updateBatchSelective(updateStageList);
+ }
+ }
+
+ /**
+ * 校验当前所有子阶段状态,修改闭店申请状态
+ * @param closeStoreId 闭店申请ID
+ */
+ public void verifyAndUpdateCloseStoreStatus(Long closeStoreId) {
+ if (!closeStoreStageInfoDAO.existUnfinishedStage(closeStoreId)) {
+ // 所有子阶段都完成,修改闭店申请状态为已完成
+ CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId);
+ if (Objects.nonNull(closeStoreInfoDO)) {
+ log.info("所有子阶段完成");
+ closeStoreInfoDAO.updateSelective(CloseStoreInfoDO.builder().id(closeStoreId).closeStatus(CloseStoreStatusEnum.COMPLETED.getCloseStoreStatus()).build());
+ }
+ }
+ }
+
+
+ /**
+ * 查询前置处理
+ */
+ private void closeStoreRecordQueryBefore(CloseStoreQueryRequest request) {
+ request.setQueryStore(StringUtils.isNotBlank(request.getStoreNameOrNum()) || StringUtils.isNotBlank(request.getJoinBrandList()));
+ request.setQuerySigner(StringUtils.isNotBlank(request.getSignerName()) || StringUtils.isNotBlank(request.getSignerMobile()));
+ if (StringUtils.isNotBlank(request.getJoinBrandList())) {
+ request.setJoinBrands(Arrays.stream(request.getJoinBrandList().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
+ }
+ }
+
+ /**
+ * 补充字段
+ */
+ private void fillCloseStoreRecord(CloseStoreQueryRequest request, List list) {
+ Set storeIds = new HashSet<>();
+ Set signerStoreIds = new HashSet<>();
+ if (!request.getQueryStore() || !request.getQuerySigner()) {
+ for (CloseStoreInfoListVO v : list) {
+ if (!request.getQueryStore()) {
+ storeIds.add(v.getStoreId());
+ }
+ if (!request.getQuerySigner()) {
+ signerStoreIds.add(v.getStoreId());
+ }
+ }
+ }
+ Map storeMap = Collections.emptyMap();
+ Map signerMap = Collections.emptyMap();
+ if (CollectionUtil.isNotEmpty(storeIds)) {
+ List storeList = storeDao.getEffectiveStoreByStoreIds(new ArrayList<>(storeIds));
+ storeMap = CollStreamUtil.toMap(storeList, StoreDO::getStoreId, v -> v);
+ }
+ if (CollectionUtil.isNotEmpty(signerStoreIds)) {
+ signerMap = storeMasterSignerInfoDAO.getSignerMapByStoreIds(new ArrayList<>(signerStoreIds));
+ }
+ if (!request.getQueryStore() || !request.getQuerySigner()) {
+ for (CloseStoreInfoListVO v : list) {
+ StoreDO storeDO = storeMap.get(v.getStoreId());
+ if (Objects.nonNull(storeDO)) {
+ BeanUtil.copyPropertiesIgnoreId(storeDO, v);
+ }
+ StoreMasterSignerInfoDO signerInfoDO = signerMap.get(v.getStoreId());
+ if (Objects.nonNull(signerInfoDO)) {
+ BeanUtil.copyPropertiesIgnoreId(signerInfoDO, v);
+ }
+ }
+ }
+ }
+
+ /**
+ * 进入闭店流程初始化
+ */
+ private void closeStoreFlowInit(CloseStoreInfoDO closeStoreInfoDO, String storeId, Integer closeReason) {
+ Long closeStoreId = closeStoreInfoDO.getId();
+ // 闭店资料初始化
+ closeStoreFileInfoDAO.init(closeStoreId);
+ closeStoreFileDetailDAO.init(closeStoreId);
+ // 闭店账号初始化
+ closeStoreAccountInfoDAO.init(closeStoreId);
+ // 闭店流程初始化
+ closeStoreStageInfoDAO.initStageInfo(closeStoreId);
+ // 门店改为闭店,闭店时间为当前时间
+ StoreCloseReasonEnum closeReasonEnum = StoreCloseReasonEnum.getByCode(closeReason);
+ assert closeReasonEnum != null;
+ storeDao.closeStore(storeId, closeReasonEnum.getCode(), closeReasonEnum.getCloseNature().getCode(), closeStoreInfoDO.getActualCloseData());
+ // 用mq通知主应用下发门店主数据
+ try {
+ StoreMasterIssueDTO storeMasterIssueDTO = new StoreMasterIssueDTO(enterpriseId, Collections.singletonList(storeId));
+ simpleMessageService.send(JSONObject.toJSONString(storeMasterIssueDTO), RocketMqTagEnum.STORE_MASTER_ISSUE);
+ } catch (Exception e) {
+ log.error("mq通知主应用下发门店主数据失败");
+ }
+ }
+
+ /**
+ * 审批校验
+ * @param auditRecordDO 审批记录
+ */
+ private void auditVerify(CloseStoreAuditRecordDO auditRecordDO) {
+ if (Objects.isNull(auditRecordDO)) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_AUDIT_RECORD_NOT_EXIST);
+ }
+ if (!CloseStoreAuditStatusEnum.PENDING.getStatus().equals(auditRecordDO.getAuditStatus())) {
+ throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_HAS_BEEN_COMPLETED);
+ }
+ // 是否有审批权限
+ String currentUserId = CurrentUserHolder.getUserId();
+ if (StringUtils.isBlank(auditRecordDO.getHandlerUserIds())) {
+ throw new ServiceException(ErrorCodeEnum.NO_APPROVAL_AUTHORITY);
+ }
+ List userIds = Arrays.asList(auditRecordDO.getHandlerUserIds().split(","));
+ if (!userIds.contains(currentUserId)) {
+ throw new ServiceException(ErrorCodeEnum.NO_APPROVAL_AUTHORITY);
+ }
+ }
+
+ /**
+ * 获取拥有区域管辖权限的指定角色用户
+ * @param regionId 区域id
+ * @param userRoleEnum 角色枚举
+ * @return 用户id列表
+ */
+ private List getAuditUserIds(Long regionId, UserRoleEnum userRoleEnum) {
+ List allUserByRoleEnumAndRegionId = userAuthMappingService.getAllUserByRoleEnumAndRegionId(userRoleEnum, regionId);
+ return ListUtils.emptyIfNull(allUserByRoleEnumAndRegionId).stream().map(EnterpriseUserDO::getUserId).distinct().collect(Collectors.toList());
+ }
+
+ /**
+ * 生成闭店申请单号
+ */
+ private String generateCloseStoreNo(){
+ return "C" + CoolDateUtils.getTodayMillis();
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/HuomaAccountClose.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/HuomaAccountClose.java
new file mode 100644
index 000000000..64bc2a88e
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/HuomaAccountClose.java
@@ -0,0 +1,35 @@
+package com.cool.store.service.close.impl;
+
+import com.cool.store.entity.StoreDO;
+import com.cool.store.request.huoma.AccountCloseRequest;
+import com.cool.store.service.HuoMaService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 火码账号关闭
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Service
+@RequiredArgsConstructor
+public class HuomaAccountClose extends AbstractAccountClose {
+ private final HuoMaService huoMaService;
+
+ @Override
+ public String getSystemCode() {
+ return "huoma";
+ }
+
+ @Override
+ public Boolean accountClose(String storeId) {
+ StoreDO storeDO = getStore(storeId);
+ AccountCloseRequest request = new AccountCloseRequest();
+ request.setShop_sn(storeDO.getStoreNum());
+ request.setEnable(0);
+ return huoMaService.accountClose(request);
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/XinguanjiaAccountClose.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/XinguanjiaAccountClose.java
new file mode 100644
index 000000000..279a514c9
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/XinguanjiaAccountClose.java
@@ -0,0 +1,37 @@
+package com.cool.store.service.close.impl;
+
+import com.cool.store.entity.StoreDO;
+import com.cool.store.request.xgj.XgjAccountCloseRequest;
+import com.cool.store.service.ThirdXgjService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ *
+ * 新掌柜账号关闭
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Service
+@RequiredArgsConstructor
+public class XinguanjiaAccountClose extends AbstractAccountClose {
+ private final ThirdXgjService thirdXgjService;
+
+ @Override
+ public String getSystemCode() {
+ return "xinguanjia";
+ }
+
+ @Override
+ public Boolean accountClose(String storeId) {
+ StoreDO storeDO = getStore(storeId);
+ String closeTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ thirdXgjService.accountClose(new XgjAccountCloseRequest(storeDO.getStoreNum(), closeTime));
+ return true;
+ }
+}
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java
index e782f319b..602e91bc7 100644
--- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java
@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.request.OrderSummaryRequest;
+import com.cool.store.request.huoma.AccountCloseRequest;
import com.cool.store.request.huoma.ShopBasicInfoRequest;
import com.cool.store.response.IncomeBaseResponse;
import com.cool.store.response.IncomeSummaryResponse;
@@ -22,6 +23,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
+import java.util.List;
import java.util.Map;
/**
@@ -85,6 +87,13 @@ public class ThirdHuoMaServiceImpl implements HuoMaService {
return executeApiCall(apiUrl,requestBody,IncomeSummaryResponse.class);
}
+ @Override
+ public Boolean accountClose(AccountCloseRequest requestBody) {
+ String apiUrl = url + "/dzgV1/shop/setShopEnableSwitch";
+ executeApiCall(apiUrl, requestBody, List.class);
+ return true;
+ }
+
private T executeApiCall(String url, Object requestBody, Class responseType) {
// 1. 打印请求前日志
diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdXgjServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdXgjServiceImpl.java
new file mode 100644
index 000000000..e64757871
--- /dev/null
+++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdXgjServiceImpl.java
@@ -0,0 +1,247 @@
+package com.cool.store.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.cool.store.dto.xgj.XgjBranchBankDTO;
+import com.cool.store.dto.xgj.XgjPartnerPageDTO;
+import com.cool.store.dto.xgj.XgjPayResultDTO;
+import com.cool.store.enums.ErrorCodeEnum;
+import com.cool.store.exception.ServiceException;
+import com.cool.store.request.xgj.*;
+import com.cool.store.response.XgjAccessTokenDTO;
+import com.cool.store.response.oppty.OpportunityApiResponse;
+import com.cool.store.service.ThirdXgjService;
+import com.cool.store.utils.HmacSigner;
+import com.cool.store.utils.poi.StringUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * 新管家三方接口 服务实现类
+ *
+ *
+ * @author wangff
+ * @since 2025/11/28
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class ThirdXgjServiceImpl implements ThirdXgjService {
+ @Value("${xgj.api.auth.url}")
+ private String xgjUrl;
+
+ @Value("${xgj.api.token.url}")
+ private String xgjTokenUrl;
+
+ @Value("${xgj.api.auth.username}")
+ private String xgjUsername;
+
+ @Value("${xgj.api.auth.secret}")
+ private String xgjSecret;
+
+ @Resource
+ OkHttpClient okHttpClient;
+ @Resource
+ ObjectMapper objectMapper;
+
+ @Override
+ public String accountClose(XgjAccountCloseRequest request) {
+ String apiUrl = xgjUrl + "/dmp/dmp-join/open/closeStore";
+ return executePostApiCall(apiUrl, request, String.class);
+ }
+
+ @Override
+ public String reimburse(XgjReimburseRequest request) {
+ String apiUrl = xgjUrl + "/dmp/dmp-join/open/dmpJoinCloseOpen";
+ return executePostApiCall(apiUrl, request, String.class);
+ }
+
+ @Override
+ public String savePartner(XgjSavePartnerRequest request) {
+ String apiUrl = xgjUrl + "/dmp/dmp-join/open/saveMKPartner";
+ return executePostApiCall(apiUrl, request, String.class);
+ }
+
+ @Override
+ public XgjPayResultDTO queryOrderStatus(XgjPaymentRequest request) {
+ String apiUrl = xgjUrl + "/dmp/dmp-join/open/quryOrderStatus";
+ return executePostApiCall(apiUrl, request, XgjPayResultDTO.class);
+ }
+
+ @Override
+ public XgjPartnerPageDTO queryPartnerPage(XgjPartnerQueryRequest request) {
+ String apiUrl = xgjUrl + "/dmp/dmp-join/open/partnerPage";
+ return executePostApiCall(apiUrl, request, XgjPartnerPageDTO.class);
+ }
+
+ @Override
+ public List queryBranchBankList(XgjBankQueryRequest request) {
+ String apiUrl = xgjUrl = "/dmp-payment/open/queryOpenBankNoByBankName";
+ return executePostApiCall(apiUrl, request, List.class);
+ }
+
+ private T executePostApiCall(String url, Object requestBody, Class responseType) {
+ // 1. 打印请求前日志
+ logRequest(url, requestBody);
+
+ try {
+ String accessToken = getXgjAccessToken().getAccess_token();
+
+ Request request = buildRequest(requestBody, url,accessToken);
+
+ request.headers().names().forEach(x->{
+ log.info(x+": {}",request.header(x));
+ });
+
+ try (Response response = okHttpClient.newCall(request).execute()) {
+ // 2. 获取原始响应内容
+ String responseBody = response.body().string();
+
+ // 3. 打印响应日志
+ logResponse(url, response.code(), responseBody);
+
+ if (!response.isSuccessful()) {
+ throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,
+ "HTTP请求失败,状态码: " + response.code());
+ }
+
+ // 4. 解析响应
+ JavaType javaType = objectMapper.getTypeFactory()
+ .constructParametricType(OpportunityApiResponse.class, responseType);
+
+ OpportunityApiResponse apiResponse = objectMapper.readValue(responseBody, javaType);
+
+ if (apiResponse.getCode() != 200) {
+ throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,apiResponse.getMsg());
+ }
+ return apiResponse.getData();
+ }
+ } catch (ServiceException e) {
+ throw e;
+ } catch (Exception e) {
+ log.error("API调用异常 - URL: {}, 错误: {}", url, e.getMessage(), e);
+ throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage());
+ }
+ }
+
+ private void logRequest(String url, Object requestBody) {
+ if (log.isInfoEnabled()) {
+ try {
+ log.info("\n======= 请求开始 =======\n" +
+ "API地址: {}\n" +
+ "请求参数: {}\n" +
+ "======= 请求结束 =======",
+ url,
+ objectMapper.writerWithDefaultPrettyPrinter()
+ .writeValueAsString(requestBody));
+ } catch (JsonProcessingException e) {
+ log.warn("日志JSON序列化失败", e);
+ }
+ }
+ }
+
+ public XgjAccessTokenDTO getXgjAccessToken() {
+ String apiUrl = xgjTokenUrl + "/oauth2/token?grant_type=client_credentials&scope=server";
+ String clientId = "dmp-join";
+ String clientSecret = "dmp20250528";
+ String auth = clientId + ":" + clientSecret;
+ String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
+ byte[] bytes = new byte[0];
+ Request request = new Request.Builder()
+ .url(apiUrl)
+ .post(RequestBody.create(MediaType.parse("application/json; charset=UTF-8"),bytes))
+ .header("Authorization", "Basic " + encodedAuth)
+ .build();
+ try (Response response = okHttpClient.newCall(request).execute()) {
+ if (!response.isSuccessful()) {
+ throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,
+ "HTTP请求失败,状态码: " + response.code());
+ }
+ String responseBody = response.body().string();
+ XgjAccessTokenDTO xgjAccessTokenDTO = objectMapper.readValue(responseBody, XgjAccessTokenDTO.class);
+ return xgjAccessTokenDTO;
+ } catch (ServiceException e) {
+ throw e;
+ } catch (Exception e) {
+ log.error("API调用异常 - URL: {}, 错误: {}", apiUrl, e.getMessage(), e);
+ throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage());
+ }
+ }
+
+ private Request buildRequest(Object requestBody, String url,String accessToken) {
+
+ try {
+ Map authHeaders = HmacSigner.generateHeaders(
+ xgjUsername, xgjSecret, JSONObject.toJSONString(requestBody));
+
+ log.debug("签名生成 - 签名结果: {}", JSONObject.toJSONString(authHeaders));
+
+ RequestBody body = RequestBody.create(MediaType.parse("application/json"),
+ JSONObject.toJSONString(requestBody)
+ );
+ log.info(JSONObject.toJSONString(requestBody));
+ Request.Builder builder = new Request.Builder()
+ .url(url)
+ .post(body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("x-Date", authHeaders.get("x-Date"))
+ .addHeader("Digest", authHeaders.get("Digest"));
+ if (!url.contains("get-token-byshopcode")&& StringUtils.isEmpty(accessToken)){
+ builder.addHeader("Authorization", authHeaders.get("Authorization"));
+ }
+ //新管家特定接口
+ if (StringUtils.isNotEmpty(accessToken)){
+ builder.addHeader("Authorization", "Bearer "+accessToken);
+ }
+ return builder.build();
+ } catch (Exception e) {
+ throw new ServiceException(ErrorCodeEnum.THIRD_API_SIGN_ERROR);
+ }
+ }
+
+ /**
+ * 记录响应日志
+ */
+ private void logResponse(String url, int statusCode, String responseBody) {
+ if (log.isInfoEnabled()) {
+ try {
+ // 尝试美化JSON输出
+ Object json = objectMapper.readValue(responseBody, Object.class);
+ String prettyResponse = objectMapper.writerWithDefaultPrettyPrinter()
+ .writeValueAsString(json);
+
+ log.info("\n======= 响应开始 =======\n" +
+ "API地址: {}\n" +
+ "HTTP状态码: {}\n" +
+ "响应内容: {}\n" +
+ "======= 响应结束 =======",
+ url,
+ statusCode,
+ prettyResponse);
+ } catch (Exception e) {
+ // 非JSON响应或解析失败时直接输出原始内容
+ log.info("\n======= 响应开始 =======\n" +
+ "API地址: {}\n" +
+ "HTTP状态码: {}\n" +
+ "原始响应: {}\n" +
+ "======= 响应结束 =======",
+ url,
+ statusCode,
+ responseBody);
+ }
+ }
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreAccountController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreAccountController.java
new file mode 100644
index 000000000..bc4cb2292
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreAccountController.java
@@ -0,0 +1,48 @@
+package com.cool.store.controller.webb;
+
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreAccountService;
+import com.cool.store.vo.close.account.CloseStoreAccountVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ *
+ * 闭店账号关闭 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Api(tags = "闭店账号关闭")
+@RestController
+@RequestMapping("/pc/close/account")
+@RequiredArgsConstructor
+@Validated
+public class CloseStoreAccountController {
+ private final CloseStoreAccountService closeStoreAccountService;
+
+ @ApiOperation("获取账号列表")
+ @GetMapping("/accountList")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long")
+ public ResponseResult> accountList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreAccountService.getAccountList(closeStoreId));
+ }
+
+ @ApiOperation("账号关闭")
+ @PostMapping("/accountClose")
+ @ApiImplicitParam(name = "id", value = "列表接口中返回的id", required = true, dataType = "Long")
+ public ResponseResult accountClose(@NotNull(message = "id不能为空") Long id) {
+ return ResponseResult.success(closeStoreAccountService.closeAccount(id));
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreController.java
new file mode 100644
index 000000000..588c19ad0
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreController.java
@@ -0,0 +1,100 @@
+package com.cool.store.controller.webb;
+
+import com.cool.store.request.close.store.CloseStoreQueryRequest;
+import com.cool.store.request.close.store.CloseStoreAuditRequest;
+import com.cool.store.response.AuditInfoResponse;
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreService;
+import com.cool.store.vo.close.store.*;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ *
+ * 闭店审批 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Api(tags = "闭店管理")
+@RestController
+@RequestMapping("/pc/close/store")
+@RequiredArgsConstructor
+@Validated
+public class CloseStoreController {
+ private final CloseStoreService closeStoreService;
+
+ @ApiOperation("闭店审批待办")
+ @GetMapping("/todoPage")
+ public ResponseResult> getAuditTodoList(CloseStoreQueryRequest request) {
+ return ResponseResult.success(closeStoreService.closeStoreAuditList(request));
+ }
+
+ @ApiOperation("闭店管理列表")
+ @GetMapping("/recordPage")
+ public ResponseResult> getCloseStoreRecordList(CloseStoreQueryRequest request) {
+ return ResponseResult.success(closeStoreService.closeStoreInfoList(request));
+ }
+
+ @ApiOperation("审批通过")
+ @PostMapping("/audit/pass")
+ public ResponseResult auditPass(@RequestBody CloseStoreAuditRequest request) {
+ return ResponseResult.success(closeStoreService.auditPass(request));
+ }
+
+ @ApiOperation("审批拒绝")
+ @PostMapping("/audit/reject")
+ public ResponseResult auditReject(@RequestBody CloseStoreAuditRequest request) {
+ return ResponseResult.success(closeStoreService.auditReject(request));
+ }
+
+ @ApiOperation("查询闭店审批记录")
+ @GetMapping("/audit/list")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query")
+ public ResponseResult> getAuditList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreService.getAuditRecordList(closeStoreId));
+ }
+
+ @ApiOperation("根据闭店申请id获取闭店申请详细")
+ @GetMapping("/detail")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query")
+ public ResponseResult getCloseStoreDetail(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreService.getCloseStoreInfoDetail(closeStoreId, true));
+ }
+
+ @ApiOperation("根据闭店申请id获取闭店申请简单信息")
+ @GetMapping("/simple")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query")
+ public ResponseResult getCloseStoreSimple(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreService.getCloseStoreSimpleInfo(closeStoreId));
+ }
+
+ @ApiOperation("根据审批id获取闭店申请详细")
+ @GetMapping("/detailByAudit")
+ @ApiImplicitParam(name = "closeStoreAuditId", value = "审批id", required = true, dataType = "Long", paramType = "query")
+ public ResponseResult getCloseStoreDetailByAuditId(@NotNull(message = "审批id不能为空") Long closeStoreAuditId) {
+ return ResponseResult.success(closeStoreService.getCloseStoreInfoDetailByAuditId(closeStoreAuditId));
+ }
+
+ @ApiOperation("闭店原因列表")
+ @GetMapping("/closeReasonList")
+ @ApiImplicitParam(name = "closeType", value = "闭店发起方式,1主动发起,2云流水发起", required = true, dataType = "Integer", paramType = "query")
+ public ResponseResult> getStoreCloseReasonList(Integer closeType) {
+ return ResponseResult.success(closeStoreService.getStoreCloseReasonList(closeType));
+ }
+
+ @ApiOperation("闭店状态列表")
+ @GetMapping("/closeStatusList")
+ public ResponseResult> getCloseStoreStatusList() {
+ return ResponseResult.success(closeStoreService.getCloseStoreStatusList());
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreFileController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreFileController.java
new file mode 100644
index 000000000..48870fdb5
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreFileController.java
@@ -0,0 +1,69 @@
+package com.cool.store.controller.webb;
+
+import com.cool.store.request.close.file.*;
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreFileService;
+import com.cool.store.vo.close.file.CloseStoreFileDetailVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店材料 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Api(tags = "闭店材料")
+@RestController
+@RequestMapping("/pc/close/file")
+@RequiredArgsConstructor
+@Validated
+public class CloseStoreFileController {
+ private final CloseStoreFileService closeStoreFileService;
+
+ @ApiOperation("更新材料邮寄地址")
+ @PostMapping("/updateMailAddress")
+ public ResponseResult updateMailAddress(@RequestBody @Valid CloseStoreMailAddressRequest request) {
+ return ResponseResult.success(closeStoreFileService.updateMailAddress(request));
+ }
+
+ @ApiOperation("查询闭店材料详情")
+ @GetMapping("/detail")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long")
+ public ResponseResult getFileDetail(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreFileService.getFileDetail(closeStoreId));
+ }
+
+ @ApiOperation("提交材料")
+ @PostMapping("/submitFile")
+ public ResponseResult submitFile(@RequestBody @Valid CloseStoreMailInfoRequest request) {
+ return ResponseResult.success(closeStoreFileService.submitFile(request));
+ }
+
+ @ApiOperation("修改单个材料")
+ @PostMapping("/updateFile")
+ public ResponseResult updateFile(@RequestBody @Valid CloseStoreFileSubmitRequest request) {
+ return ResponseResult.success(closeStoreFileService.updateFile(request));
+ }
+
+ @ApiOperation("单个材料提交审批")
+ @PostMapping("/submitFileApproveSingle")
+ public ResponseResult submitFileApproveSingle(@RequestBody @Valid CloseStoreFileInfoRequest request) {
+ return ResponseResult.success(closeStoreFileService.submitFileApproveSingle(request));
+ }
+
+ @ApiOperation("督导审批")
+ @PostMapping("/supervisionAudit")
+ public ResponseResult supervisionAudit(@RequestBody @Valid CloseStoreFileAuditRequest request) {
+ return ResponseResult.success(closeStoreFileService.supervisionAudit(request));
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreRefundController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreRefundController.java
new file mode 100644
index 000000000..5c39e30da
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreRefundController.java
@@ -0,0 +1,82 @@
+package com.cool.store.controller.webb;
+
+import com.cool.store.dto.close.CloseStoreMkUserDTO;
+import com.cool.store.request.close.refund.CloseStoreRefundAddRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest;
+import com.cool.store.request.close.refund.CloseStoreRefundUpdateRequest;
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreRefundService;
+import com.cool.store.vo.close.refund.CloseStoreRefundDetailVO;
+import com.cool.store.vo.close.refund.CloseStoreRefundListVO;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 闭店退款 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Api(tags = "闭店退款")
+@RestController
+@RequestMapping("/pc/close/refund")
+@RequiredArgsConstructor
+@Validated
+public class CloseStoreRefundController {
+ private final CloseStoreRefundService closeStoreRefundService;
+
+ @ApiOperation("获取当前用户的每刻用户信息")
+ @GetMapping("/getCurrentMkUser")
+ public ResponseResult getCurrentMkUser() {
+ return ResponseResult.success(closeStoreRefundService.getCurrentMkUser());
+ }
+
+ @ApiOperation("获取退款详细信息")
+ @GetMapping("/detail")
+ @ApiImplicitParam(name = "id", value = "退款信息id", required = true, dataType = "Long")
+ public ResponseResult detail(@NotNull(message = "退款信息id不能为空") Long id) {
+ return ResponseResult.success(closeStoreRefundService.getRefundDetail(id));
+ }
+
+ @ApiOperation("新增退款信息")
+ @PostMapping("/addRefund")
+ public ResponseResult addRefund(@RequestBody @Valid CloseStoreRefundAddRequest request) {
+ return ResponseResult.success(closeStoreRefundService.addRefund(request));
+ }
+
+ @ApiOperation("编辑退款信息")
+ @PostMapping("/updateRefund")
+ public ResponseResult updateRefund(@RequestBody @Valid CloseStoreRefundUpdateRequest request) {
+ return ResponseResult.success(closeStoreRefundService.updateRefund(request));
+ }
+
+ @ApiOperation("跳过")
+ @PostMapping("/skip")
+ public ResponseResult skip(@RequestBody @Validated CloseStoreRefundSkipRequest request) {
+ closeStoreRefundService.skip(request);
+ return ResponseResult.success(true);
+ }
+
+ @ApiOperation("退款信息列表")
+ @GetMapping("/refundPage")
+ public ResponseResult> refundPage(@Validated CloseStoreRefundQueryRequest request) {
+ return ResponseResult.success(closeStoreRefundService.refundPage(request));
+ }
+
+ @ApiOperation("退款状态刷新")
+ @PostMapping("/refresh")
+ public ResponseResult refresh(@RequestBody @Validated CloseStoreRefundQueryRequest request) {
+ return ResponseResult.success(closeStoreRefundService.refreshRefundOrderStatus(request));
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java
index 280ba1548..1b05e4ce1 100644
--- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java
@@ -15,6 +15,7 @@ import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
@@ -33,6 +34,7 @@ import java.util.Map;
@RestController
@RequestMapping("pc/sys/dict")
@RequiredArgsConstructor
+@Validated
public class DictManagerController {
private final DictGroupService groupService;
private final DictTableInfoService tableService;
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java
index d062235ff..033ae4b55 100644
--- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java
@@ -1,15 +1,16 @@
package com.cool.store.controller.webb;
import com.alibaba.fastjson.JSONObject;
-import com.cool.store.context.PartnerUserHolder;
import com.cool.store.dto.*;
import com.cool.store.dto.store.StoreUserPositionDTO;
import com.cool.store.dto.wallet.PaymentDTO;
import com.cool.store.dto.wx.MiniProgramFreeLoginDTO;
import com.cool.store.handler.WeChatHandler;
+import com.cool.store.enums.close.CloseTypeEnum;
import com.cool.store.request.OpenApiStoreRequest;
import com.cool.store.request.StoreCodeDTO;
import com.cool.store.request.*;
+import com.cool.store.request.close.store.ThirdCloseStoreApplyRequest;
import com.cool.store.request.notice.ThirdHandleMessageRequest;
import com.cool.store.request.notice.ThirdMatterRequest;
import com.cool.store.request.wallet.AccountTradeCallbackRequest;
@@ -17,11 +18,11 @@ import com.cool.store.request.wallet.AddTagCallbackNoticeRequest;
import com.cool.store.request.wallet.OnlineCommercialBankCallbackRequest;
import com.cool.store.request.xgj.FranchiseFeeCallBackRequest;
import com.cool.store.request.xgj.ReceiptCallBackRequest;
-import com.cool.store.response.ResponseResult;
import com.cool.store.response.bigdata.ApiResponse;
import com.cool.store.service.*;
import com.cool.store.service.wallet.WalletService;
import com.cool.store.utils.poi.StringUtils;
+import com.cool.store.service.close.CloseStoreService;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -64,6 +65,8 @@ public class OpenApiController {
WeChatHandler weChatHandler;
@Resource
WalletService walletService;
+ @Resource
+ CloseStoreService closeStoreService;
@PostMapping("/statusRefresh")
public ApiResponse statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java
index 3ddcb6d12..5987e8b9b 100644
--- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java
@@ -7,7 +7,10 @@ import com.cool.store.dto.*;
import com.cool.store.dto.contract.ContractCallbackDTO;
import com.cool.store.dto.*;
import com.cool.store.dto.huoma.*;
+import com.cool.store.dto.xgj.XgjBranchBankDTO;
+import com.cool.store.dto.xgj.XgjPartnerPageDTO;
import com.cool.store.dto.wallet.*;
+import com.cool.store.dto.xgj.XgjPayResultDTO;
import com.cool.store.entity.*;
import com.cool.store.enums.DownSystemTypeEnum;
import com.cool.store.enums.FranchiseBrandEnum;
@@ -23,10 +26,12 @@ import com.cool.store.mapper.SignFranchiseMapper;
import com.cool.store.mq.util.HttpRestTemplateService;
import com.cool.store.request.*;
import com.cool.store.request.bigdata.ProfitDataRequest;
+import com.cool.store.request.close.store.CloseStoreApplyRequest;
import com.cool.store.request.huoma.ShopBasicInfoRequest;
import com.cool.store.request.oppty.*;
import com.cool.store.request.wallet.*;
import com.cool.store.request.xgj.PushFranchiseFeeRequest;
+import com.cool.store.request.xgj.*;
import com.cool.store.response.ResponseResult;
import com.cool.store.response.bigdata.ActDataResponse;
import com.cool.store.response.bigdata.ApiResponse;
@@ -37,6 +42,7 @@ import com.cool.store.response.oppty.CityResponse;
import com.cool.store.response.oppty.OpportunityDetailResponse;
import com.cool.store.response.oppty.OpportunityInfoPageResponse;
import com.cool.store.service.*;
+import com.cool.store.service.close.CloseStoreService;
import com.cool.store.service.impl.CommonService;
import com.cool.store.service.impl.UserAuthMappingServiceImpl;
import com.cool.store.service.wallet.WalletApiService;
@@ -112,6 +118,46 @@ public class PCTestController {
@Autowired
WeChatHandler weChatHandler;
+ @Resource
+ ThirdXgjService thirdXgjService;
+ @Resource
+ CloseStoreService closeStoreService;
+
+ @PostMapping("/applyCloseStore")
+ public ResponseResult applyCloseStore(@RequestBody @Valid CloseStoreApplyRequest request) {
+ return ResponseResult.success(closeStoreService.applyCloseStore(request));
+ }
+
+ @PostMapping("/reimburse")
+ public ResponseResult reimburse(@RequestBody XgjReimburseRequest request) {
+ return ResponseResult.success(thirdXgjService.reimburse(request));
+ }
+
+ @PostMapping("/savePartner")
+ public ResponseResult savePartner(@RequestBody XgjSavePartnerRequest request) {
+ return ResponseResult.success(thirdXgjService.savePartner(request));
+ }
+
+ @PostMapping("/queryOrderStatus")
+ public ResponseResult queryOrderStatus(@RequestBody XgjPaymentRequest request) {
+ return ResponseResult.success(thirdXgjService.queryOrderStatus(request));
+ }
+
+ @PostMapping("/queryPartnerPage")
+ public ResponseResult queryPartnerPage(@RequestBody XgjPartnerQueryRequest request) {
+ return ResponseResult.success(thirdXgjService.queryPartnerPage(request));
+ }
+
+ @PostMapping("/queryBranchBankList")
+ public ResponseResult> queryBranchBankList(@RequestBody XgjBankQueryRequest request) {
+ return ResponseResult.success(thirdXgjService.queryBranchBankList(request));
+ }
+
+ @PostMapping("/accountClose")
+ public ResponseResult accountClose(@RequestBody XgjAccountCloseRequest request) {
+ return ResponseResult.success(thirdXgjService.accountClose(request));
+ }
+
@GetMapping("/syncStore")
public ResponseResult syncStore(@RequestParam("shopId")Long shopId){
syncMainSysServer.syncStore(shopId);
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreAccountController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreAccountController.java
new file mode 100644
index 000000000..125890eec
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreAccountController.java
@@ -0,0 +1,40 @@
+package com.cool.store.controller.webc;
+
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreAccountService;
+import com.cool.store.vo.close.account.CloseStoreAccountVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ *
+ * 闭店账号关闭 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/8
+ */
+@Api(tags = "mini账号关闭")
+@RestController
+@RequestMapping("/mini/close/account")
+@RequiredArgsConstructor
+@Validated
+public class MiniCloseStoreAccountController {
+ private final CloseStoreAccountService closeStoreAccountService;
+
+ @ApiOperation("获取账号列表")
+ @GetMapping("/accountList")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long")
+ public ResponseResult> accountList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreAccountService.getAccountList(closeStoreId));
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreController.java
new file mode 100644
index 000000000..8e2768be1
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreController.java
@@ -0,0 +1,78 @@
+package com.cool.store.controller.webc;
+
+import com.cool.store.enums.close.CloseTypeEnum;
+import com.cool.store.request.close.store.CloseStoreApplyRequest;
+import com.cool.store.request.close.store.CloseStoreCancelRequest;
+import com.cool.store.request.close.store.MiniCloseStoreQueryRequest;
+import com.cool.store.request.close.store.ReCloseStoreApplyRequest;
+import com.cool.store.response.AuditInfoResponse;
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreService;
+import com.cool.store.vo.close.store.*;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ *
+ * 闭店审批 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/9
+ */
+@Api(tags = "mini闭店管理")
+@RestController
+@RequestMapping("/mini/close/store")
+@RequiredArgsConstructor
+@Validated
+public class MiniCloseStoreController {
+ private final CloseStoreService closeStoreService;
+
+ @ApiOperation("申请闭店")
+ @PostMapping("/apply")
+ public ResponseResult applyCloseStore(@RequestBody @Valid CloseStoreApplyRequest request) {
+ request.setCloseType(CloseTypeEnum.INITIATE.getCloseType());
+ return ResponseResult.success(closeStoreService.applyCloseStore(request));
+ }
+
+ @ApiOperation("拒绝后重新提交申请闭店")
+ @PostMapping("/reapply")
+ public ResponseResult reApplyCloseStore(@RequestBody @Valid ReCloseStoreApplyRequest request) {
+ return ResponseResult.success(closeStoreService.reApplyCloseStore(request));
+ }
+
+ @ApiOperation("闭店申请列表")
+ @GetMapping("/page")
+ public ResponseResult> closeStorePage(MiniCloseStoreQueryRequest request) {
+ return ResponseResult.success(closeStoreService.getMiniCloseStoreSimpleInfoList(request));
+ }
+
+ @ApiOperation("查询闭店审批记录")
+ @GetMapping("/audit/list")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query")
+ public ResponseResult> getAuditList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreService.getAuditRecordList(closeStoreId));
+ }
+
+ @ApiOperation("闭店原因列表")
+ @GetMapping("/closeReasonList")
+ @ApiImplicitParam(name = "closeType", value = "闭店发起方式,1主动发起,2云流水发起", required = true, dataType = "Integer", paramType = "query")
+ public ResponseResult> getStoreCloseReasonList(Integer closeType) {
+ return ResponseResult.success(closeStoreService.getStoreCloseReasonList(closeType));
+ }
+
+ @ApiOperation("取消闭店申请")
+ @PostMapping("/cancel")
+ public ResponseResult cancelCloseStore(@RequestBody @Valid CloseStoreCancelRequest request) {
+ return ResponseResult.success(closeStoreService.cancelApply(request.getCloseStoreId()));
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreFileController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreFileController.java
new file mode 100644
index 000000000..b70c35832
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreFileController.java
@@ -0,0 +1,52 @@
+package com.cool.store.controller.webc;
+
+import com.cool.store.request.close.file.CloseStoreFileSubmitRequest;
+import com.cool.store.request.close.file.CloseStoreMailInfoRequest;
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreFileService;
+import com.cool.store.vo.close.file.CloseStoreFileDetailMiniVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * 小程序闭店材料 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/7
+ */
+@Api(tags = "mini闭店材料")
+@RestController
+@RequestMapping("/mini/close/file")
+@RequiredArgsConstructor
+@Validated
+public class MiniCloseStoreFileController {
+ private final CloseStoreFileService closeStoreFileService;
+
+ @ApiOperation("查询闭店材料详情")
+ @GetMapping("/detail")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long")
+ public ResponseResult getFileDetail(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreFileService.getMiniFileDetail(closeStoreId));
+ }
+
+ @ApiOperation("提交材料")
+ @PostMapping("/submitFile")
+ public ResponseResult submitFile(@RequestBody @Valid CloseStoreMailInfoRequest request) {
+ return ResponseResult.success(closeStoreFileService.submitFile(request));
+ }
+
+ @ApiOperation("修改单个材料")
+ @PostMapping("/updateFile")
+ public ResponseResult updateFile(@RequestBody @Valid CloseStoreFileSubmitRequest request) {
+ return ResponseResult.success(closeStoreFileService.updateFile(request));
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreRefundController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreRefundController.java
new file mode 100644
index 000000000..a1b82ab6b
--- /dev/null
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreRefundController.java
@@ -0,0 +1,38 @@
+package com.cool.store.controller.webc;
+
+import com.cool.store.response.ResponseResult;
+import com.cool.store.service.close.CloseStoreRefundService;
+import com.cool.store.vo.close.refund.CloseStoreRefundSimpleVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ *
+ * 闭店退款 前端控制器
+ *
+ *
+ * @author wangff
+ * @since 2025/10/13
+ */
+@Api(tags = "mini闭店退款")
+@RestController
+@RequestMapping("/mini/close/refund")
+@RequiredArgsConstructor
+@Validated
+public class MiniCloseStoreRefundController {
+ private final CloseStoreRefundService closeStoreRefundService;
+
+ @ApiOperation("退款信息列表")
+ @GetMapping("/list")
+ @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long")
+ public ResponseResult> list(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) {
+ return ResponseResult.success(closeStoreRefundService.getRefundSimpleList(closeStoreId));
+ }
+}
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java
index 61bad4ad0..2d440997d 100644
--- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java
+++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java
@@ -30,6 +30,8 @@ import com.cool.store.response.caipin.StoreUserResponse;
import com.cool.store.response.xfsgFirstOderListResponse;
import com.cool.store.service.*;
import com.cool.store.service.wallet.WalletService;
+import com.cool.store.service.close.CloseStoreAccountService;
+import com.cool.store.service.close.CloseStoreRefundService;
import com.cool.store.utils.poi.ExcelUtil;
import com.cool.store.utils.poi.StringUtils;
import com.cool.store.vo.RegionPathNameVO;
@@ -49,10 +51,7 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
@@ -96,6 +95,11 @@ public class TestController {
LinePayDAO linePayDAO;
@Resource
OpenApiService openApiService;
+ @Resource
+ private CloseStoreAccountService closeStoreAccountService;
+ @Resource
+ private CloseStoreRefundService closeStoreRefundService;
+
@PostMapping("/testXgjCallback")
public ResponseResult testXgjCallback(Long linePayId) {
@@ -114,6 +118,18 @@ public class TestController {
return ResponseResult.success(true);
}
+ @GetMapping("/completeRefund")
+ public ResponseResult completeRefund(Long refundId) {
+ closeStoreRefundService.completeRefund(refundId, new Date());
+ return ResponseResult.success(true);
+ }
+
+ @GetMapping("/verifyAndUpdateAccountClose")
+ public ResponseResult verifyAndUpdateAccountClose(Long closeStoreId) {
+ closeStoreAccountService.verifyAndUpdateStage(closeStoreId);
+ return ResponseResult.success(true);
+ }
+
@PostMapping("/getFirstOrders")
public ResponseResult getFirstOrders(@RequestBody xfsgFirstOrderListRequest storeCodeList) {
xfsgFirstOderListResponse firstOrderList = coolStoreStartFlowService.getFirstOrderList(storeCodeList);
diff --git a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java
index 0fe2fe07b..ee6ebb11b 100644
--- a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java
+++ b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java
@@ -7,10 +7,15 @@ import com.cool.store.dao.*;
import com.cool.store.dao.tp.TpApplyFormDAO;
import com.cool.store.dto.*;
import com.cool.store.dto.store.StoreOrderTimeDTO;
+import com.cool.store.dto.xgj.XgjPayResultDTO;
import com.cool.store.entity.*;
import com.cool.store.entity.tp.TpApplyFormDO;
import com.cool.store.enums.*;
import com.cool.store.enums.tp.TpFormStatusEnum;
+import com.cool.store.enums.close.CloseTypeEnum;
+import com.cool.store.enums.close.RefundPayStatusEnum;
+import com.cool.store.enums.close.XgjRefundPayStatusEnum;
+import com.cool.store.enums.master.StoreCloseReasonEnum;
import com.cool.store.mapper.ApplyLicenseMapper;
import com.cool.store.mapper.LineInfoMapper;
import com.cool.store.mapper.TrainingExperienceMapper;
@@ -19,14 +24,20 @@ import com.cool.store.mq.util.HttpRestTemplateService;
import com.cool.store.request.ZxjpApiRequest;
import com.cool.store.request.bigdata.LatestOrderDateRequest;
import com.cool.store.request.tp.TpApplyQueryRequest;
+import com.cool.store.request.close.store.CloseStoreApplyRequest;
+import com.cool.store.request.xgj.XgjPaymentRequest;
import com.cool.store.response.bigdata.LatestOrderDateResponse;
import com.cool.store.service.*;
+import com.cool.store.service.close.CloseStoreRefundService;
+import com.cool.store.service.close.CloseStoreService;
import com.cool.store.service.impl.CommonService;
import com.cool.store.service.tp.TpApplyService;
+import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.MDCUtils;
import com.cool.store.utils.poi.DateUtils;
import com.cool.store.utils.poi.StringUtils;
import com.github.pagehelper.PageHelper;
+import com.google.common.collect.Lists;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
@@ -110,6 +121,14 @@ public class XxlJobHandler {
TpApplyFormDAO tpApplyFormDAO;
@Resource
TpApplyService tpApplyService;
+ @Resource
+ CloseStoreService closeStoreService;
+ @Resource
+ CloseStoreRefundInfoDAO closeStoreRefundInfoDAO;
+ @Resource
+ ThirdXgjService thirdXgjService;
+ @Resource
+ CloseStoreRefundService closeStoreRefundService;
/**
@@ -438,6 +457,68 @@ public class XxlJobHandler {
log.info("------end latestOrderDate------");
}
+ /**
+ * 学校店自动发起闭店
+ */
+ @XxlJob("schoolStoreApplyClose")
+ public void schoolStoreApplyClose() {
+ MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString());
+ log.info("------start schoolStoreApplyClose------");
+ String param = XxlJobHelper.getJobParam();
+ String monthQueryLimit = "3";
+ if (StringUtils.isNotBlank(param)) {
+ monthQueryLimit = param;
+ }
+ autoApplyClose(monthQueryLimit, Arrays.asList("store_school_internal", "store_school_external"), true);
+ log.info("------end schoolStoreApplyClose------");
+ }
+
+ /**
+ * 普通店自动发起闭店
+ */
+ @XxlJob("normalStoreApplyClose")
+ public void normalStoreApplyClose() {
+ MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString());
+ log.info("------start normalStoreApplyClose------");
+ String param = XxlJobHelper.getJobParam();
+ String monthQueryLimit = "1";
+ if (StringUtils.isNotBlank(param)) {
+ monthQueryLimit = param;
+ }
+ autoApplyClose(monthQueryLimit, Arrays.asList("store_school_internal", "store_school_external"), false);
+ log.info("------end normalStoreApplyClose------");
+ }
+
+ private void autoApplyClose(String monthQueryLimit, List businessTypes, Boolean inBusinessType) {
+ boolean hasNext = true;
+ int pageNum = 1;
+ int pageSize = CommonConstants.BATCH_SIZE;
+ LocalDate latestDate = LocalDate.now().minusMonths(Long.parseLong(monthQueryLimit)).plusDays(1);
+ while (hasNext) {
+ PageHelper.startPage(pageNum, pageSize);
+ List storeList = storeDao.getNoOrderStore(latestDate, businessTypes, inBusinessType);
+ if (CollectionUtils.isEmpty(storeList)) {
+ break;
+ }
+ hasNext = storeList.size() >= pageSize;
+ for (StoreDO storeDO : storeList) {
+ try {
+ CloseStoreApplyRequest applyRequest = CloseStoreApplyRequest.builder()
+ .planCloseDate(DateUtils.parseDate(LocalDate.now().plusMonths(1).toString()))
+ .closeReason(StoreCloseReasonEnum.REASON0.getCode())
+ .closeType(CloseTypeEnum.NO_ORDER_AUTO.getCloseType())
+ .storeId(storeDO.getStoreId())
+ .build();
+ closeStoreService.applyCloseStore(applyRequest);
+ } catch (Exception e) {
+ log.info("自动闭店申请发起失败, storeId:{}, storeName:{}", storeDO.getStoreId(), storeDO.getStoreName());
+ log.info("自动闭店申请发起失败", e);
+ }
+ }
+ pageNum++;
+ }
+ }
+
public Date parseDate(LatestOrderDateResponse v, DateFormat format) {
try {
return format.parse(v.getLatest_buy_date());
@@ -487,4 +568,71 @@ public class XxlJobHandler {
}
log.info("------end tpPenaltyAppealOverdue------");
}
+
+ /**
+ * 退款订单状态更新
+ */
+ @XxlJob("refundOrderStatus")
+ public void refundOrderStatus() {
+ MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString());
+ log.info("------start refundOrderStatus------");
+ boolean hasNext = true;
+ int pageNum = 1;
+ int pageSize = CommonConstants.BATCH_SIZE;
+ List updateList = new ArrayList<>();
+ List completeList = new ArrayList<>();
+ while (hasNext) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = closeStoreRefundInfoDAO.getUnfinishedRecords();
+ if (CollectionUtils.isEmpty(list)) {
+ break;
+ }
+ hasNext = list.size() >= pageSize;
+ for (CloseStoreRefundInfoDO refundInfoDO : list) {
+ try {
+ if (StringUtils.isNotBlank(refundInfoDO.getRefundOrderNo())) {
+ XgjPayResultDTO xgjPayResultDTO = thirdXgjService.queryOrderStatus(new XgjPaymentRequest(refundInfoDO.getRefundOrderNo()));
+ String xgjStatus = xgjPayResultDTO.getStatus();
+ String refundStatus = XgjRefundPayStatusEnum.REJECTED.getStatus().equals(xgjStatus) ? RefundPayStatusEnum.APPROVING.getStatus() : xgjStatus;
+ if (!refundInfoDO.getRefundStatus().equals(refundStatus)) {
+ CloseStoreRefundInfoDO update = CloseStoreRefundInfoDO.builder()
+ .id(refundInfoDO.getId())
+ .refundStatus(refundStatus)
+ .refundTime(CoolDateUtils.parseDate(xgjPayResultDTO.getPaySuccessTime(), "yyyy-MM-dd HH:mm:ss"))
+ .build();
+ if (refundStatus.equals(RefundPayStatusEnum.PAY_SUCCESS.getStatus())) {
+ completeList.add(update);
+ } else {
+ updateList.add(update);
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.info("退款状态查询失败, refundId:{}", refundInfoDO.getId());
+ log.info("退款状态查询失败", e);
+ }
+ }
+ pageNum++;
+ }
+ if (CollectionUtils.isNotEmpty(updateList)) {
+ for (List list : Lists.partition(updateList, CommonConstants.BATCH_SIZE)) {
+ try {
+ closeStoreRefundInfoDAO.updateRefundStatusBatchById(list);
+ } catch (Exception e) {
+ log.error("退款状态更新失败");
+ }
+ }
+ }
+ if (CollectionUtils.isNotEmpty(completeList)) {
+ for (CloseStoreRefundInfoDO refundInfoDO : completeList) {
+ try {
+ closeStoreRefundService.completeRefund(refundInfoDO.getId(), refundInfoDO.getRefundTime());
+ } catch (Exception e) {
+ log.error("退款状态更新失败, refundId:{}", refundInfoDO.getId());
+ log.error("退款状态更新失败", e);
+ }
+ }
+ }
+ log.info("------end refundOrderStatus------");
+ }
}
diff --git a/coolstore-partner-web/src/main/resources/application-ab.properties b/coolstore-partner-web/src/main/resources/application-ab.properties
index ba49de141..e26125f33 100644
--- a/coolstore-partner-web/src/main/resources/application-ab.properties
+++ b/coolstore-partner-web/src/main/resources/application-ab.properties
@@ -82,7 +82,7 @@ aliyun.sms.accessKeyId=LTAI5tAVZ3r9UtSpLGcmGoQn
aliyun.sms.accessKeySecret=WIMjO4BjVg3YAHwmplq86yOyS2HMpa
aliyun.sms.signName=酷店掌
-mybatis.configuration.variables.enterpriseId=e17cd2dc350541df8a8b0af9bd27f77d
+mybatis.configuration.variables.enterpriseId=5558ce7a3aa84e3590392fcaa8697ffb
enterprise.dingCorpId=dingef2502a50df74ccc35c2f4657eb6378f
qywx.task.notice.url2=https://tstore-h5.coolstore.cn/?corpId=%s&appType=%s#/notice?target=%s¬iceType=zx&corpId=%s&appType=%s&eid=%s
diff --git a/coolstore-partner-web/src/main/resources/application-local.properties b/coolstore-partner-web/src/main/resources/application-local.properties
index 43af7137a..9487f444e 100644
--- a/coolstore-partner-web/src/main/resources/application-local.properties
+++ b/coolstore-partner-web/src/main/resources/application-local.properties
@@ -32,7 +32,7 @@ isv.domain=https://abstore-isv.coolstore.cn/isv
#rocketmq \u914D\u7F6E
rocketmq.accessKey=LTAI5tGBwmXwZkMuHK4MudMJ
rocketmq.secretKey=bnZoUMRQ9834STgz5E291YrqlBu6yn
-rocketmq.nameSrvAdder=http://MQ_INST_1748142459508127_BZfpFxuJ.cn-hangzhou.mq.aliyuncs.com:8080
+rocketmq.nameSrvAdder=http://MQ_INST_1748142459508127_BZfpFxuJ.cn-hangzhou.mq.aliyuncs.com:80
rocketmq.topic=zx_simple_message
rocketmq.orderTopic=zx_order_message