From 56b85c33227044c587382cfcdad2e5d8f28d3116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=9D=9E=E5=87=A1?= Date: Tue, 12 May 2026 08:13:30 +0000 Subject: [PATCH] Merge #126 into master from cc_20260408_close_up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 歇业管理逻辑修改 * cc_20260408_close_up: (31 commits squashed) - fix:歇业管理(部分) - fix:歇业管理(部分) - fix:审批逻辑修改;拒绝审批实现 - fix:恢复开业申请及审批 - fix:主流程补充 - fix:主流程补充 - fix:字段补充及逻辑修改 - fix:字段补充 - fix - fix:平台处理新增字段 - fix - Merge remote-tracking branch 'origin/cc_20260408_close_up' into cc_20260408_close_up - fix:歇业营业发送短信 - fix:排序 - fix:详情接口新增加盟商手机号字段;申请单日期和已有申请单存在交集时申请失败 - fix:申请单详情接口新增品牌字段 - fix:新增列表筛选条件;审批单状态校验 - Merge branch 'master' into cc_20260408_close_up # Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java - fix:歇业对接三方平台 - fix:歇业对接三方平台 - fix:日志 - fix:歇业后自动恢复营业;抖音自动歇业三方对接 - fix:歇业后自动恢复营业;抖音自动歇业三方对接 - fix:火码平台账号处理状态初始化为已处理 - Merge remote-tracking branch 'origin/cc_20260408_close_up' into cc_20260408_close_up - fix:歇业管理逻辑修改 - Merge branch 'cc_20260511_close_up_modify' into cc_20260408_close_up # Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java # coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java # coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java # coolstore-partner-common/src/main/java/com/cool/store/enums/closeup/CloseUpPlatformEnum.java # coolstore-partner-dao/src/main/java/com/cool/store/dao/closeup/CloseUpPlatformDAO.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/closeup/CloseUpPlatformMapper.java # coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml # coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpApplyFormMapper.xml # coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpPlatformMapper.xml # coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpApplyFormDO.java # coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpPlatformDO.java # coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java # coolstore-partner-service/src/main/java/com/cool/store/service/closeup/CloseUpService.java # coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java # coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java # coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java # coolstore-partner-web/src/main/resources/application-ab.properties # coolstore-partner-web/src/main/resources/application-local.properties # coolstore-partner-web/src/main/resources/application-online.properties # coolstore-partner-web/src/main/resources/application-test.properties - fix:合并冲突 - Merge branch 'master' into cc_20260408_close_up - fix:火码歇业时机修改 - fix Signed-off-by: 王非凡 Merged-by: 正新 CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/126 --- .../com/cool/store/enums/ErrorCodeEnum.java | 2 +- .../cool/store/enums/RocketMqGroupEnum.java | 1 + .../com/cool/store/enums/RocketMqTagEnum.java | 1 + .../enums/closeup/CloseUpPlatformEnum.java | 29 +- .../java/com/cool/store/dao/StoreDao.java | 15 +- .../store/dao/closeup/CloseUpPlatformDAO.java | 12 +- .../com/cool/store/mapper/StoreMapper.java | 7 +- .../mapper/closeup/CloseUpPlatformMapper.java | 2 + .../src/main/resources/mapper/StoreMapper.xml | 13 +- .../mapper/closeup/CloseUpApplyFormMapper.xml | 3 +- .../mapper/closeup/CloseUpPlatformMapper.xml | 23 +- .../dto/closeup/PlatformAsyncStatusDTO.java | 30 ++ .../store/dto/closeup/PlatformStatusDTO.java | 47 ++++ .../entity/closeup/CloseUpApplyFormDO.java | 6 + .../entity/closeup/CloseUpPlatformDO.java | 6 + .../store/mq/consumer/ConsumerClient.java | 15 + .../CloseUpPlanOpenStoreListener.java | 53 ++++ .../store/service/closeup/CloseUpService.java | 11 + .../closeup/PlatformHttpClientRest.java | 261 ++++++++++++++++++ .../closeup/impl/CloseUpServiceImpl.java | 170 +++++++++--- .../controller/webb/PCTestController.java | 30 +- .../com/cool/store/job/XxlJobHandler.java | 34 +++ .../main/resources/application-ab.properties | 4 + .../resources/application-local.properties | 4 + .../resources/application-online.properties | 4 + .../resources/application-test.properties | 4 + 26 files changed, 729 insertions(+), 58 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformAsyncStatusDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformStatusDTO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/CloseUpPlanOpenStoreListener.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/closeup/PlatformHttpClientRest.java 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 1cf36fbcd..15c16d20b 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 @@ -423,7 +423,7 @@ public enum ErrorCodeEnum { CLOSE_STORE_REFUND_MK_USER_NOT_EXIST(1710016, "当前用户不存在每刻权限", null), CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD(1710017, "存在生效中的退款申请!", null), CLOSE_STORE_REFUND_TYPE_ERROR(1710018, "退款类型错误", null), - CLOSE_STORE_ONLY_SUPPORT_OPEN(1710019, "仅支持在营或暂停营业的门店发起闭店申请", null), + CLOSE_STORE_ONLY_SUPPORT_OPEN(1710019, "仅支持在营门店发起闭店申请", null), CLOSE_STORE_ONLY_APPROVAL_ENABLE_SUSPEND(1710020, "仅审批中申请允许中止", null), /** 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 2d6e80929..1086d4a30 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 @@ -40,6 +40,7 @@ public enum RocketMqGroupEnum { VISIT_RECORD_INVALID("visit_record_invalid", new ArrayList<>(Arrays.asList(RocketMqTagEnum.VISIT_RECORD_INVALID))), TP_PENALTY_APPEAL_OVERDUE("tp_penalty_appeal_overdue", new ArrayList<>(Arrays.asList(RocketMqTagEnum.TP_PENALTY_APPEAL_OVERDUE))), CLOSE_UP_APPLY_STORE_UPDATE("close_up_apply_store_update", new ArrayList<>(Arrays.asList(RocketMqTagEnum.CLOSE_UP_APPLY_STORE_UPDATE))), + CLOSE_UP_PLAN_OPEN_STORE("close_up_plan_open_store", new ArrayList<>(Arrays.asList(RocketMqTagEnum.CLOSE_UP_PLAN_OPEN_STORE))), ; private final String group; 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 f5cc0d64f..a3e7dae4b 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 @@ -24,6 +24,7 @@ public enum RocketMqTagEnum { VISIT_RECORD_INVALID("visit_record_invalid", "拜访记录失效"), TP_PENALTY_APPEAL_OVERDUE("tp_penalty_appeal_overdue", "十二分惩处单复议逾期"), CLOSE_UP_APPLY_STORE_UPDATE("close_up_apply_store_update", "歇业申请修改门店状态"), + CLOSE_UP_PLAN_OPEN_STORE("close_up_plan_open_store", "歇业申请计划开店"), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/closeup/CloseUpPlatformEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/closeup/CloseUpPlatformEnum.java index 1c1269e8f..bca2bd939 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/closeup/CloseUpPlatformEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/closeup/CloseUpPlatformEnum.java @@ -14,14 +14,14 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum CloseUpPlatformEnum { - DOUYINTG("douyintg", "抖音", 0, "https://ossfilezx.coolstore.cn/icon/closeup/douyin.png"), - ELEMEWM("elemewm", "饿了么", 0, "https://ossfilezx.coolstore.cn/icon/closeup/ele.png"), - HUOMA("huoma", "火码POS", 0, "https://ossfilezx.coolstore.cn/icon/closeup/huoma.png"), - JINGDONGWM("jingdongwm", "京东外卖", 0, "https://ossfilezx.coolstore.cn/icon/closeup/jingdong.png"), - KUAISHOUTG("kuaishoutg", "快手团购", 0, "https://ossfilezx.coolstore.cn/icon/closeup/kuaishou.png"), - MEITUANTG("meituantg", "美团团购", 0, "https://ossfilezx.coolstore.cn/icon/closeup/meituan.png"), - MEITUANWM("meituanwm", "美团外卖", 0, "https://ossfilezx.coolstore.cn/icon/closeup/meituanwx.png"), - ZHIFUBAO("zhifubao", "支付宝团购", 0, "https://ossfilezx.coolstore.cn/icon/closeup/zhifubao.png"), + DOUYINTG("douyintg", "抖音", 1, 8, "https://ossfilezx.coolstore.cn/icon/closeup/douyin.png"), + ELEMEWM("elemewm", "饿了么", 1, 2, "https://ossfilezx.coolstore.cn/icon/closeup/ele.png"), + HUOMA("huoma", "火码POS", 1, null, "https://ossfilezx.coolstore.cn/icon/closeup/huoma.png"), + JINGDONGWM("jingdongwm", "京东外卖", 1, 4, "https://ossfilezx.coolstore.cn/icon/closeup/jingdong.png"), + KUAISHOUTG("kuaishoutg", "快手团购", 0, null, "https://ossfilezx.coolstore.cn/icon/closeup/kuaishou.png"), + MEITUANTG("meituantg", "美团团购", 1, 1, "https://ossfilezx.coolstore.cn/icon/closeup/meituan.png"), + MEITUANWM("meituanwm", "美团外卖", 1, 1, "https://ossfilezx.coolstore.cn/icon/closeup/meituanwx.png"), + ZHIFUBAO("zhifubao", "支付宝团购", 0, null, "https://ossfilezx.coolstore.cn/icon/closeup/zhifubao.png"), ; /** @@ -36,8 +36,21 @@ public enum CloseUpPlatformEnum { * 关闭类型 */ private final Integer type; + /** + * 平台关闭code + */ + private final Integer platformCode; /** * 图标地址 */ private final String icon; + + public static Integer getPlatformCodeByCode(String code) { + for (CloseUpPlatformEnum value : CloseUpPlatformEnum.values()) { + if (value.code.equals(code)) { + return value.getPlatformCode(); + } + } + return null; + } } 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 38df12dbf..a0110a69a 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 @@ -199,18 +199,21 @@ public class StoreDao { * @param closeUpReason 暂停营业原因 */ public void closeUp(String storeId, String closeUpReason) { - if (storeMapper.updateStatus(storeId, StoreStatusEnum.CLOSE_UP.getValue()) > 0) { - storeMapper.insertOrUpdateCloseUpReason(storeId, closeUpReason); - } + storeMapper.insertOrUpdateCloseUpReason(storeId, closeUpReason, 1); } /** * 暂停营业门店转在营 */ public void closeUpToOpen(String storeId) { - if (storeMapper.updateStatus(storeId, StoreStatusEnum.OPEN.getValue()) > 0) { - storeMapper.insertOrUpdateCloseUpReason(storeId, null); - } + storeMapper.insertOrUpdateCloseUpReason(storeId, null, 0); + } + + /** + * 获取门店歇业状态 + */ + public Integer getCloseUpStatus(String storeId) { + return storeMapper.getCloseUpStatus(storeId); } /** diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/closeup/CloseUpPlatformDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/closeup/CloseUpPlatformDAO.java index 2359f7221..43273ae43 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/closeup/CloseUpPlatformDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/closeup/CloseUpPlatformDAO.java @@ -44,7 +44,7 @@ public class CloseUpPlatformDAO { return list; } - public List getList(Long applyId, Integer status, Integer type) { + public List getList(Long applyId, Integer status, Integer type, Boolean hasTaskId) { Example example = new Example(CloseUpPlatformDO.class); Example.Criteria criteria = example.createCriteria() .andEqualTo("applyId", applyId); @@ -54,6 +54,9 @@ public class CloseUpPlatformDAO { if (Objects.nonNull(type)) { criteria.andEqualTo("type", type); } + if (Boolean.TRUE.equals(hasTaskId)) { + criteria.andIsNotNull("taskId").andNotEqualTo("taskId", ""); + } return closeUpPlatformMapper.selectByExample(example); } @@ -71,6 +74,13 @@ public class CloseUpPlatformDAO { closeUpPlatformMapper.updateByExampleSelective(update, example); } + public void updateStatusAndTaskId(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + closeUpPlatformMapper.updateStatusAndTaskId(list); + } + /** * 根据申请单id删除 */ 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 f6722b9f8..34ea507b0 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 @@ -129,7 +129,12 @@ public interface StoreMapper { */ int insertOrUpdateCloseInfo(@Param("storeId") String storeId, @Param("closeReason") Integer closeReason, @Param("closeNature") Integer closeNature); - int insertOrUpdateCloseUpReason(@Param("storeId") String storeId, @Param("closeUpReason") String closeUpReason); + int insertOrUpdateCloseUpReason(@Param("storeId") String storeId, @Param("closeUpReason") String closeUpReason, @Param("isCloseUp") Integer isCloseUp); + + /** + * 获取门店歇业状态 + */ + Integer getCloseUpStatus(@Param("storeId") String storeId); /** * 查询最近没有订货记录的门店 diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/closeup/CloseUpPlatformMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/closeup/CloseUpPlatformMapper.java index b65c738b1..c46184ed7 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/closeup/CloseUpPlatformMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/closeup/CloseUpPlatformMapper.java @@ -14,4 +14,6 @@ public interface CloseUpPlatformMapper extends Mapper { * 查询待处理的申请单id */ List selectTodoApplyIds(@Param("applyType") Integer applyType, @Param("storeKeyword") String storeKeyword); + + void updateStatusAndTaskId(@Param("list") List list); } \ 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 1036b977d..9504c76a8 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -344,12 +344,19 @@ - INSERT INTO store_extend_info_${enterpriseId}(store_id, close_up_reason) - VALUES(#{storeId}, #{closeUpReason}) + INSERT INTO store_extend_info_${enterpriseId}(store_id, close_up_reason, is_close_up) + VALUES(#{storeId}, #{closeUpReason}, #{isCloseUp}) ON DUPLICATE KEY UPDATE - close_up_reason = VALUES(close_up_reason) + close_up_reason = VALUES(close_up_reason), + is_close_up = VALUES(is_close_up) + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpPlatformMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpPlatformMapper.xml index 4cf2e1344..90c84e259 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpPlatformMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpPlatformMapper.xml @@ -16,13 +16,14 @@ + - INSERT INTO zxjp_close_up_platform(apply_id, apply_type, code, name, status, type, task_start_date, icon) + INSERT INTO zxjp_close_up_platform(apply_id, apply_type, code, name, status, type, task_start_date, icon, task_id) VALUES - (#{item.applyId}, #{item.applyType}, #{item.code}, #{item.name}, #{item.status}, #{item.type}, #{item.taskStartDate}, #{item.icon}) + (#{item.applyId}, #{item.applyType}, #{item.code}, #{item.name}, #{item.status}, #{item.type}, #{item.taskStartDate}, #{item.icon}, #{item.taskId}) @@ -41,4 +42,22 @@ ORDER BY a.create_time DESC + + + UPDATE zxjp_close_up_platform + SET status = CASE id + + WHEN #{item.id} THEN #{item.status} + + END, + task_id = CASE id + + WHEN #{item.id} THEN #{item.taskId} + + END + WHERE id IN + + #{item.id} + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformAsyncStatusDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformAsyncStatusDTO.java new file mode 100644 index 000000000..a70b562ab --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformAsyncStatusDTO.java @@ -0,0 +1,30 @@ +package com.cool.store.dto.closeup; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 平台异步状态DTO + *

+ * + * @author wangff + * @since 2026/4/27 + */ +@Data +public class PlatformAsyncStatusDTO { + @ApiModelProperty("任务id") + private Long taskId; + + @ApiModelProperty("状态 1 - 待执行; 2 - 执行中; 50 - 执行成功; 60 - 执行失败") + private String status; + + @ApiModelProperty("结果消息") + private String message; + + @ApiModelProperty("门店编码") + private String shopSn; + + @ApiModelProperty("平台编号") + private String platformCode; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformStatusDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformStatusDTO.java new file mode 100644 index 000000000..45de01c44 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/closeup/PlatformStatusDTO.java @@ -0,0 +1,47 @@ +package com.cool.store.dto.closeup; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 平台营业状态修改DTO + *

+ * + * @author wangff + * @since 2026/4/16 + */ +@Data +public class PlatformStatusDTO { + @ApiModelProperty("门店编号") + private String shopSn; + + @ApiModelProperty("门店名称") + private String shopName; + + @ApiModelProperty("营业状态:1-营业,0-歇业") + private Integer isOpen; + + @ApiModelProperty("各平台更新结果列表") + private List platformResults; + + @Data + public static class PlatformUpdateResult { + @ApiModelProperty("平台编号") + private String platformCode; + + @ApiModelProperty("平台名称") + private String platformName; + + @ApiModelProperty("是否更新成功:true-成功,false-失败") + private Boolean success; + + @ApiModelProperty("结果消息") + private String message; + + @ApiModelProperty("任务ID(仅抖音平台异步操作时返回,用于查询任务状态)") + private String taskId; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpApplyFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpApplyFormDO.java index a9850e668..8efbb6409 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpApplyFormDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpApplyFormDO.java @@ -109,4 +109,10 @@ public class CloseUpApplyFormDO { */ @Column(name = "updated_time") private Date updatedTime; + + /** + * 是否恢复营业,申请恢复营业通过或者到营业时间置1 + */ + @Column(name = "is_open") + private Integer isOpen; } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpPlatformDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpPlatformDO.java index f33c51cc8..416d59e3c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpPlatformDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpPlatformDO.java @@ -75,4 +75,10 @@ public class CloseUpPlatformDO { */ @Column(name = "update_time") private Date updateTime; + + /** + * 任务id + */ + @Column(name = "task_id") + private String taskId; } \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java index 19d6039c3..527789f8a 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java @@ -42,6 +42,8 @@ public class ConsumerClient { private TpPenaltyAppealListener tpPenaltyAppealListener; @Resource private CloseUpApplyStoreUpdateListener closeUpApplyStoreUpdateListener; + @Resource + private CloseUpPlanOpenStoreListener closeUpPlanOpenStoreListener; /** * 获取通用配置 @@ -160,4 +162,17 @@ public class ConsumerClient { return consumerBean; } + @Bean(initMethod = "start", destroyMethod = "shutdown") + public ConsumerBean closeUpPlanOpenStore() { + RocketMqGroupEnum groupEnum = RocketMqGroupEnum.CLOSE_UP_PLAN_OPEN_STORE; + ConsumerBean consumerBean = new ConsumerBean(); + //配置文件 + Properties properties = getCommonProperties(groupEnum); + consumerBean.setProperties(properties); + Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, closeUpPlanOpenStoreListener); + //订阅多个topic如上面设置 + consumerBean.setSubscriptionTable(commonSubscriptionTable); + return consumerBean; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/CloseUpPlanOpenStoreListener.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/CloseUpPlanOpenStoreListener.java new file mode 100644 index 000000000..d9bc3bbb1 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/CloseUpPlanOpenStoreListener.java @@ -0,0 +1,53 @@ +package com.cool.store.mq.consumer.listener; + +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.cool.store.constants.CommonConstants; +import com.cool.store.service.closeup.CloseUpService; +import com.cool.store.utils.RedisUtilPool; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +/** + *

+ * 歇业管理自动营业 + *

+ * + * @author wangff + * @since 2026/4/28 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CloseUpPlanOpenStoreListener implements MessageListener { + private final RedisUtilPool redisUtilPool; + private final CloseUpService closeUpService; + + @Override + public Action consume(Message message, ConsumeContext consumeContext) { + String text = new String(message.getBody()); + if (StringUtils.isBlank(text)) { + log.info("消息体为空,tag:{},messageId:{}", message.getTag(), message.getMsgID()); + return Action.CommitMessage; + } + String lockKey = "CloseUpPlanOpenStoreListener:" + message.getMsgID(); + boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES); + if (lock) { + try { + closeUpService.closeUpAutoOpen(Long.valueOf(text)); + } catch (Exception e) { + log.error("CloseUpPlanOpenStoreListener consume error", e); + return Action.ReconsumeLater; + } finally { + redisUtilPool.delKey(lockKey); + } + log.info("消费成功,tag:{},messageId:{},reqBody={}", message.getTag(), message.getMsgID(), text); + return Action.CommitMessage; + } + return Action.ReconsumeLater; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/CloseUpService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/CloseUpService.java index b679bc889..ca42dc64d 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/CloseUpService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/CloseUpService.java @@ -1,5 +1,6 @@ package com.cool.store.service.closeup; +import com.cool.store.entity.closeup.CloseUpPlatformDO; import com.cool.store.request.closeup.*; import com.cool.store.response.AuditInfoResponse; import com.cool.store.vo.closeup.CloseUpApplyFormSimpleVO; @@ -84,4 +85,14 @@ public interface CloseUpService { * 平台关闭开启处理 */ Boolean handlePlatform(CloseUpPlatformHandleRequest request); + + /** + * 根据任务id查询平台状态 + */ + void queryPlatformStatusByTaskId(CloseUpPlatformDO platformDO); + + /** + * 歇业申请门店自动恢复营业 + */ + void closeUpAutoOpen(Long applyId); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/PlatformHttpClientRest.java b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/PlatformHttpClientRest.java new file mode 100644 index 000000000..9fb3b2a1c --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/PlatformHttpClientRest.java @@ -0,0 +1,261 @@ +package com.cool.store.service.closeup; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dto.closeup.PlatformAsyncStatusDTO; +import com.cool.store.dto.closeup.PlatformStatusDTO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import okhttp3.FormBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; +import java.security.MessageDigest; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + *

+ * 平台接口请求 + *

+ * + * @author wangff + * @since 2026/4/16 + */ +@Service +@Slf4j +public class PlatformHttpClientRest { + @Autowired + private OkHttpClient okHttpClient; + + @Autowired + private ObjectMapper objectMapper; + + @Value("${closeup.platform.url}") + private String baseUrl; + @Value("${closeup.platform.username}") + private String username; + @Value("${closeup.platform.secret}") + private String secret; + + /** + * 门店外卖团购平台状态修改 + * @param storeNum 门店编码 + * @param platformCode 平台 1-美团, 2-饿了么,4-京东,允许二进制位组合进行批量关闭 + * @param isOpen 营业状态:1-营业,0-歇业 + * @return 平台营业状态修改DTO + */ + public PlatformStatusDTO platformCloseUp(String storeNum, String platformCode, Integer isOpen) { + String url = baseUrl + "/zx/wechat/food/updateShopOpenStatus/" + storeNum + "/" + platformCode; + try { + // 生成签名 + SignatureInfo signatureInfo = generateSignature(storeNum, platformCode, isOpen); + + FormBody formBody = new FormBody.Builder() + .add("isOpen", String.valueOf(isOpen)) + .build(); + + // 发起HTTP请求 + String responseJson = executePost(url, signatureInfo, formBody); + + // 解析响应 + return parseResponse(responseJson, PlatformStatusDTO.class); + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("发送POST请求失败: {}", url, e); + throw new RuntimeException("接口调用异常: " + e.getMessage(), e); + } + } + + /** + * 门店外卖团购平台状态修改 + * @param storeNum 门店编码 + * @param platformCode 平台 1-美团, 2-饿了么,4-京东,允许二进制位组合进行批量关闭 + * @param taskId 任务id + * @return 平台异步状态DTO + */ + public PlatformAsyncStatusDTO queryPlatformStatusByTaskId(String storeNum, String platformCode, Long taskId) { + String url = baseUrl + "/zx/wechat/food/queryUpdateShopOpenStatus/" + storeNum + "/" + platformCode; + try { + // 生成签名 + SignatureInfo signatureInfo = generateSignature(storeNum, platformCode, taskId); + + FormBody formBody = new FormBody.Builder() + .add("taskId", String.valueOf(taskId)) + .build(); + + // 发起HTTP请求 + String responseJson = executePost(url, signatureInfo, formBody); + + // 解析响应 + return parseResponse(responseJson, PlatformAsyncStatusDTO.class); + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("发送POST请求失败: {}", url, e); + throw new RuntimeException("接口调用异常: " + e.getMessage(), e); + } + } + + private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256"; + private static final String SHA256_ALGORITHM = "SHA-256"; + + /** + * 生成签名信息 + */ + public SignatureInfo generateSignature(String shopSn, String platformCode, Object param) throws Exception { + // 1. 生成 x-date + String xDate = getCurrentGMTTime(); + + // 2. 构建请求数据 + String data = shopSn + (platformCode != null ? platformCode : "") + (Objects.nonNull(param) ? param.toString() : ""); + log.info("data: {}", data); + + // 3. 计算 x-digest + String xDigest = computeSHA256Digest(data); + + // 4. 构建签名字符串 + String signingString = "x-date: " + xDate + "\n" + "digest: " + xDigest; + + // 5. 计算 x-signature + String xSignature = computeHmacSignature(signingString, secret); + + return new SignatureInfo(xDate, xDigest, xSignature); + } + + /** + * 获取当前GMT时间字符串 + */ + private static String getCurrentGMTTime() { + SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); + sdf.setTimeZone(TimeZone.getTimeZone("GMT")); + return sdf.format(new Date()); + } + + /** + * 计算SHA-256摘要并转换为Base64 + */ + private static String computeSHA256Digest(String data) throws Exception { + if (data == null || data.isEmpty()) { + return ""; + } + MessageDigest digest = MessageDigest.getInstance(SHA256_ALGORITHM); + byte[] hash = digest.digest(data.getBytes("UTF-8")); + String base64sha256 = Base64.getEncoder().encodeToString(hash); + return "SHA-256=" + base64sha256; + } + + /** + * 计算HMAC-SHA256签名并转换为Base64 + */ + private static String computeHmacSignature(String data, String secret) throws Exception { + Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); + SecretKeySpec secretKeySpec = new SecretKeySpec(secret.getBytes("UTF-8"), HMAC_SHA256_ALGORITHM); + mac.init(secretKeySpec); + byte[] hmacBytes = mac.doFinal(data.getBytes("UTF-8")); + return Base64.getEncoder().encodeToString(hmacBytes); + } + + /** + * 发送HTTP请求 + */ + private String executePost(String url, SignatureInfo signatureInfo, FormBody formBody) throws IOException { + Request request = new Request.Builder() + .url(url) + .post(formBody) + .header("x-date", signatureInfo.getXDate()) + .header("x-digest", signatureInfo.getDigest()) + .header("x-signature", signatureInfo.getSignature()) + .header("Content-Type", "application/x-www-form-urlencoded") + .build(); + + log.info("发送POST请求: {}, 数据: {}, formBody: {}", url, objectMapper.writeValueAsString(signatureInfo), JSONObject.toJSONString(formBody)); + + try (Response response = okHttpClient.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,response.code() + " " + response.message()); + } + + String responseBody = response.body().string(); + log.info("收到响应: {}", responseBody); + + checkBusinessResponseCode(responseBody); + + return responseBody; + } + } + + private void checkBusinessResponseCode(String responseJson) throws IOException { + try { + Map responseMap = objectMapper.readValue(responseJson, + new TypeReference>() { + }); + + String code = MapUtils.getString(responseMap, "code"); + if (StringUtils.isNotBlank(code) && !"000".equals(code)) { + String msg = MapUtils.getString(responseMap, "msg"); + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, + "code: " + code + ", msg: " + msg); + } + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + // 如果解析失败,说明可能不是标准格式,继续处理 + log.debug("无法解析响应码格式: {}", e.getMessage()); + } + } + + private T parseResponse(String responseJson, Class responseType) throws Exception { + // 解析为通用响应格式 + Map responseMap = objectMapper.readValue(responseJson, + new TypeReference>() {}); + + + // 如果返回类型是Map,直接返回 + if (responseType == Map.class) { + return (T) responseMap; + } + + // 提取data字段 + Object data = responseMap.get("data"); + if (data != null && responseType != Object.class) { + if (data instanceof List) { + // 保持List结构,让调用方处理具体类型转换 + return (T) JSONObject.toJSONString(data); + } + return objectMapper.convertValue(data, responseType); + } + + return objectMapper.convertValue(responseMap, responseType); + } + + /** + * 签名信息封装类 + */ + @Data + public static class SignatureInfo { + private String xDate; + private String digest; + private String signature; + + public SignatureInfo(String xDate, String digest, String signature) { + this.xDate = xDate; + this.digest = digest; + this.signature = signature; + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java index 274ae13ea..02f4b10ac 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java @@ -11,6 +11,8 @@ import com.cool.store.dao.*; import com.cool.store.dao.closeup.CloseUpApplyFormDAO; import com.cool.store.dao.closeup.CloseUpAuditRecordDAO; import com.cool.store.dao.closeup.CloseUpPlatformDAO; +import com.cool.store.dto.closeup.PlatformAsyncStatusDTO; +import com.cool.store.dto.closeup.PlatformStatusDTO; import com.cool.store.dto.store.StoreMasterIssueDTO; import com.cool.store.entity.*; import com.cool.store.entity.closeup.CloseUpApplyFormDO; @@ -18,6 +20,7 @@ import com.cool.store.entity.closeup.CloseUpAuditRecordDO; import com.cool.store.entity.closeup.CloseUpPlatformDO; import com.cool.store.enums.*; import com.cool.store.enums.close.CloseStoreAuditStatusEnum; +import com.cool.store.enums.closeup.CloseUpPlatformEnum; import com.cool.store.enums.closeup.CloseUpStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mq.producer.SimpleMessageService; @@ -26,6 +29,7 @@ import com.cool.store.response.AuditInfoResponse; import com.cool.store.service.UserAuthMappingService; import com.cool.store.service.closeup.CloseUpService; import com.cool.store.service.closeup.PlatformAutoStrategy; +import com.cool.store.service.closeup.PlatformHttpClientRest; import com.cool.store.service.sms.AliyunSmsService; import com.cool.store.utils.BeanUtil; import com.cool.store.vo.PartnerUserInfoVO; @@ -73,6 +77,7 @@ public class CloseUpServiceImpl implements CloseUpService { private final LineInfoDAO lineInfoDAO; private final EnterpriseUserDAO enterpriseUserDAO; private final AliyunSmsService aliyunSmsService; + private final PlatformHttpClientRest platformHttpClientRest; @Value("${mybatis.configuration.variables.enterpriseId}") private String enterpriseId; @@ -199,19 +204,20 @@ public class CloseUpServiceImpl implements CloseUpService { simpleMessageService.send(String.valueOf(formDO.getId()), RocketMqTagEnum.CLOSE_UP_APPLY_STORE_UPDATE, formDO.getPlanOpenDate().getTime()); } else { log.info("直接变更"); - storeStatusAndPlatformUpdate(formDO.getStoreId(), formDO.getId(), formDO.getType(), formDO.getSourceApplyId(), false); + storeStatusAndPlatformUpdate(formDO, false); } // 修改源歇业申请单 CloseUpApplyFormDO updateSourceForm = CloseUpApplyFormDO.builder() .id(formDO.getSourceApplyId()) .actualOpenDate(formDO.getActualOpenDate()) .status(CloseUpStatusEnum.APPLY_OPEN_PASS.getStatus()) + .isOpen(1) .build(); applyFormDAO.updateByPrimaryKeySelective(updateSourceForm); // 初始化各外卖团购平台账号 List platformList = platformDAO.init(formDO.getId(), formDO.getType(), formDO.getActualOpenDate()); // 根据平台类型自动开启 - autoPlatform(formDO.getType(), platformList); + autoPlatform(formDO.getStoreId(), formDO.getType(), platformList); } /** @@ -222,6 +228,7 @@ public class CloseUpServiceImpl implements CloseUpService { // 过去的单据不处理 if (Objects.nonNull(formDO.getActualOpenDate()) && formDO.getActualOpenDate().before(now) || Objects.isNull(formDO.getActualOpenDate()) && formDO.getPlanOpenDate().before(now)) { + log.info("过期单据不处理"); return; } // 根据实际闭店时间判断直接修改主数据还是定时任务修改主数据 @@ -231,12 +238,12 @@ public class CloseUpServiceImpl implements CloseUpService { simpleMessageService.send(String.valueOf(formDO.getId()), RocketMqTagEnum.CLOSE_UP_APPLY_STORE_UPDATE, formDO.getActualCloseDate().getTime()); } else { log.info("直接变更"); - storeStatusAndPlatformUpdate(formDO.getStoreId(), formDO.getId(), formDO.getType(), formDO.getSourceApplyId(), false); + storeStatusAndPlatformUpdate(formDO, false); } // 初始化各外卖团购平台账号 List platformList = platformDAO.init(formDO.getId(), formDO.getType(), formDO.getActualCloseDate()); // 根据平台类型自动关闭 - autoPlatform(formDO.getType(), platformList); + autoPlatform(formDO.getStoreId(), formDO.getType(), platformList); } @Override @@ -395,7 +402,7 @@ public class CloseUpServiceImpl implements CloseUpService { @Override public List getPlatformListByApplyId(Long applyId) { - List list = platformDAO.getList(applyId, null, null); + List list = platformDAO.getList(applyId, null, null, null); return BeanUtil.toList(list, CloseUpPlatformVO.class); } @@ -486,29 +493,61 @@ public class CloseUpServiceImpl implements CloseUpService { /** * 自动开启关闭各平台 */ - private void autoPlatform(Integer applyType, List list) { - List updateIds = new ArrayList<>(); - for (CloseUpPlatformDO platformDO : list) { - // 待处理且自动关闭 - if (platformDO.getStatus().equals(0) && platformDO.getType().equals(1) && (new Date()).after(platformDO.getTaskStartDate())) { - PlatformAutoStrategy platformAuto = platformAutoFactory.getByCode(platformDO.getCode()); - if (Objects.isNull(platformAuto)) { - log.info("平台不存在实现类, code:{} name:{}", platformDO.getCode(), platformDO.getName()); - } else { - boolean update = false; - if (applyType.equals(0)) { - update = platformAuto.close(); - } else if (applyType.equals(1)) { - update = platformAuto.open(); + public void autoPlatform(String storeId, Integer applyType, List list) { + try { + StoreDO storeDO = storeDao.getByStoreId(storeId); + if (Objects.isNull(storeDO)) { + return; + } + int platformCode = 0; + List unClosePlatformList = list.stream() + .filter(platformDO -> platformDO.getStatus().equals(0) + && platformDO.getType().equals(1) + && !(new Date()).before(platformDO.getTaskStartDate())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(unClosePlatformList)) { + log.info("未处理的自动关闭平台为空"); + return; + } + + List updatePlatformList = new ArrayList<>(); + // 歇业平台 + for (CloseUpPlatformDO v : unClosePlatformList) { + Integer ongoingPlatformCode = CloseUpPlatformEnum.getPlatformCodeByCode(v.getCode()); + if (Objects.nonNull(ongoingPlatformCode)) { + platformCode = platformCode | ongoingPlatformCode; + } + } + if (platformCode == 0) { + log.info("未处理的自动关闭平台为空platformCode=0"); + return; + } + PlatformStatusDTO platformStatusDTO = platformHttpClientRest.platformCloseUp(storeDO.getStoreNum(), String.valueOf(platformCode), applyType); + if (Objects.nonNull(platformStatusDTO) && CollectionUtils.isNotEmpty(platformStatusDTO.getPlatformResults())) { + Map map = CollStreamUtil.toMap(platformStatusDTO.getPlatformResults(), PlatformStatusDTO.PlatformUpdateResult::getPlatformCode, v -> v); + for (CloseUpPlatformDO closeUpPlatformDO : unClosePlatformList) { + if (CloseUpPlatformEnum.HUOMA.getCode().equals(closeUpPlatformDO.getCode())) { + CloseUpPlatformDO updatePlatform = CloseUpPlatformDO.builder().id(closeUpPlatformDO.getId()).status(1).build(); + updatePlatformList.add(updatePlatform); + continue; } - if (update) { - updateIds.add(platformDO.getId()); + Integer platformCodeByCode = CloseUpPlatformEnum.getPlatformCodeByCode(closeUpPlatformDO.getCode()); + PlatformStatusDTO.PlatformUpdateResult result = map.get(String.valueOf(platformCodeByCode)); + if (Objects.nonNull(result) && Boolean.TRUE.equals(result.getSuccess())) { + CloseUpPlatformDO updatePlatform = CloseUpPlatformDO.builder() + .id(closeUpPlatformDO.getId()) + .status(result.getPlatformCode().equals("8") ? 0 : 1) + .taskId(result.getPlatformCode().equals("8") ? result.getTaskId() : null) + .build(); + updatePlatformList.add(updatePlatform); + } else { + log.info("平台更新失败, platformCodeByCode:{}: {}", platformCodeByCode, JSONObject.toJSONString(result)); } } } - } - if (CollectionUtils.isNotEmpty(updateIds)) { - platformDAO.updateStatusByIds(updateIds, 1); + platformDAO.updateStatusAndTaskId(updatePlatformList); + } catch (Exception e) { + log.info("平台自动歇业/营业失败", e); } } @@ -519,7 +558,7 @@ public class CloseUpServiceImpl implements CloseUpService { public void storeStatusAndPlatformUpdate(Long formId) { CloseUpApplyFormDO formDO = applyFormDAO.getById(formId); if (Objects.nonNull(formDO)) { - storeStatusAndPlatformUpdate(formDO.getStoreId(), formDO.getId(), formDO.getType(), formDO.getSourceApplyId(), true); + storeStatusAndPlatformUpdate(formDO, true); } } @@ -529,29 +568,90 @@ public class CloseUpServiceImpl implements CloseUpService { return true; } + @Override + public void queryPlatformStatusByTaskId(CloseUpPlatformDO platformDO) { + if (platformDO.getStatus().equals(1) || StringUtils.isBlank(platformDO.getTaskId())) { + log.info("任务已处理或不存在任务id"); + } + CloseUpApplyFormDO formDO = applyFormDAO.getById(platformDO.getApplyId()); + if (Objects.isNull(formDO)) { + log.error("申请单不存在"); + return; + } + StoreDO storeDO = storeDao.getEffectiveByStoreId(formDO.getStoreId()); + if (Objects.isNull(storeDO)) { + log.error("门店不存在"); + return; + } + Integer platformCode = CloseUpPlatformEnum.getPlatformCodeByCode(platformDO.getCode()); + if (Objects.isNull(platformCode)) { + log.error("不存在对应平台编码"); + return; + } + PlatformAsyncStatusDTO result = platformHttpClientRest.queryPlatformStatusByTaskId(storeDO.getStoreNum(), String.valueOf(platformCode), Long.valueOf(platformDO.getTaskId())); + if (Objects.nonNull(result) && result.getStatus().equals("50")) { + platformDAO.updateStatusByIds(Collections.singletonList(platformDO.getId()), 1); + } + } + + @Override + public void closeUpAutoOpen(Long applyId) { + CloseUpApplyFormDO formDO = applyFormDAO.getById(applyId); + if (Objects.isNull(formDO)) { + log.info("申请单不存在"); + return; + } + if (formDO.getIsOpen().equals(1)) { + log.info("门店已经营业或提前申请恢复营业"); + return; + } + // 校验门店是否为歇业状态 + StoreDO storeDO = storeDao.getEffectiveByStoreId(formDO.getStoreId()); + if (Objects.isNull(storeDO)) { + log.info("门店不存在"); + return; + } + if (!StoreStatusEnum.CLOSE_UP.getValue().equals(storeDO.getStoreStatus())) { + log.info("门店不是歇业状态"); + return; + } + CloseUpApplyFormDO update = CloseUpApplyFormDO.builder() + .id(applyId) + .isOpen(1) + .build(); + applyFormDAO.updateByPrimaryKeySelective(update); + // 校验歇业单是否已经恢复过营业 + storeDao.closeUpToOpen(formDO.getStoreId()); + log.info("歇业申请后门店自动恢复营业, storeId:{}", formDO.getStoreId()); + } + /** * 修改主数据并处理各外卖团购平台开闭店 */ - private void storeStatusAndPlatformUpdate(String storeId, Long applyId, Integer applyType, Long sourceApplyId, boolean autoPlatform) { + private void storeStatusAndPlatformUpdate(CloseUpApplyFormDO formDO, boolean autoPlatform) { + String storeId = formDO.getStoreId(); + Integer applyType = formDO.getType(); + Long sourceApplyId = formDO.getSourceApplyId(); StoreDO storeDO = storeDao.getByStoreId(storeId); if (Objects.isNull(storeDO)) { return; } // 主数据状态修改 boolean storeUpdate = false; + Integer isCloseUp = storeDao.getCloseUpStatus(storeId); if (applyType.equals(0)) { - if (StoreStatusEnum.OPEN.getValue().equals(storeDO.getStoreStatus())) { + if (StoreStatusEnum.OPEN.getValue().equals(storeDO.getStoreStatus()) && isCloseUp.equals(0)) { storeDao.closeUp(storeId, "close_up_special_reason"); storeUpdate = true; - } else { - log.info("门店不处于在营状态,修改为暂停营业失败"); + Date openTime = Objects.nonNull(formDO.getActualOpenDate()) ? formDO.getActualOpenDate() : formDO.getPlanOpenDate(); + if (Objects.nonNull(openTime)) { + simpleMessageService.send(String.valueOf(formDO.getId()), RocketMqTagEnum.CLOSE_UP_PLAN_OPEN_STORE, openTime.getTime()); + } } } else { - if (StoreStatusEnum.CLOSE_UP.getValue().equals(storeDO.getStoreStatus())) { + if (StoreStatusEnum.OPEN.getValue().equals(storeDO.getStoreStatus()) && isCloseUp.equals(1)) { storeDao.closeUpToOpen(storeId); storeUpdate = true; - } else { - log.info("门店不处于暂停营业状态,修改为在营失败"); } // 删除歇业申请的平台数据 if (Objects.nonNull(sourceApplyId)) { @@ -560,8 +660,8 @@ public class CloseUpServiceImpl implements CloseUpService { } if (autoPlatform) { // 自动开关平台 - List platformList = platformDAO.getList(applyId, 0, applyType); - autoPlatform(applyType, platformList); + List platformList = platformDAO.getList(formDO.getId(), 0, 1, null); + autoPlatform(storeId, applyType, platformList); } if (StringUtils.isNotBlank(storeDO.getTelephone())) { aliyunSmsService.sendNotice(storeDO.getTelephone(), applyType.equals(0) ? SmsNoticeTypeEnum.CLOSE_UP_CLOSE_NOTICE : SmsNoticeTypeEnum.CLOSE_UP_OPEN_NOTICE); @@ -575,6 +675,8 @@ public class CloseUpServiceImpl implements CloseUpService { } catch (Exception e) { log.error("mq通知主应用下发门店主数据失败"); } + } else { + log.info("门店歇业状态修改失败,当前门店状态:{}, 歇业状态:{}", storeDO.getStoreStatus(), isCloseUp); } } 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 a613910f3..53bd18e0d 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 @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.annotation.Debounce; import com.cool.store.constants.CommonConstants; import com.cool.store.dao.*; +import com.cool.store.dao.closeup.CloseUpApplyFormDAO; +import com.cool.store.dao.closeup.CloseUpPlatformDAO; import com.cool.store.dao.bonus.BonusDistributionRuleDAO; import com.cool.store.dao.fees.WalletPayInfoDAO; import com.cool.store.dto.*; @@ -15,6 +17,8 @@ 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.entity.closeup.CloseUpApplyFormDO; +import com.cool.store.entity.closeup.CloseUpPlatformDO; import com.cool.store.entity.bonus.BonusDistributionRuleDO; import com.cool.store.entity.fees.WalletPayInfoDO; import com.cool.store.enums.*; @@ -52,6 +56,8 @@ import com.cool.store.response.storeopen.StoreRecipesResponse; import com.cool.store.service.*; import com.cool.store.service.bonus.BonusService; import com.cool.store.service.close.CloseStoreService; +import com.cool.store.service.closeup.PlatformHttpClientRest; +import com.cool.store.service.closeup.impl.CloseUpServiceImpl; import com.cool.store.service.fees.WalletPayInfoService; import com.cool.store.service.impl.CommonService; import com.cool.store.service.impl.UserAuthMappingServiceImpl; @@ -144,7 +150,12 @@ public class PCTestController { SignFranchiseService signFranchiseService; @Resource WalletPayInfoService walletPayInfoService; - + @Resource + CloseUpServiceImpl closeUpService; + @Resource + CloseUpApplyFormDAO closeUpApplyFormDAO; + @Resource + CloseUpPlatformDAO closeUpPlatformDAO; @Resource ThirdStoreOpenDataService thirdStoreOpenDataService; @Resource @@ -152,6 +163,23 @@ public class PCTestController { @Resource BonusDistributionRuleDAO bonusRuleDAO; + @PostMapping("/closeUpAutoOpen") + public void closeUpAutoOpen(Long applyId) { + closeUpService.closeUpAutoOpen(applyId); + } + + @PostMapping("/queryPlatformStatus") + public void queryPlatformStatus() { + xxlJobHandler.queryPlatformStatus(); + } + + @PostMapping("/autoPlatform") + public void autoPlatform(Long applyId) { + CloseUpApplyFormDO formDO = closeUpApplyFormDAO.getById(applyId); + List platformList = closeUpPlatformDAO.getList(applyId, 0, 1, null); + closeUpService.autoPlatform(formDO.getStoreId(), formDO.getType(), platformList); + } + @PostMapping("/normalStoreApplyClose") @Debounce(timeMs = 10000, diffUser = false) public ResponseResult normalStoreApplyClose() { 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 86ae066ea..134767e67 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 @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; import com.cool.store.dao.*; +import com.cool.store.dao.closeup.CloseUpPlatformDAO; import com.cool.store.dao.bonus.BonusDistributionRuleDAO; import com.cool.store.dao.tp.TpApplyFormDAO; import com.cool.store.dao.wallet.WalletTradeDAO; @@ -14,6 +15,7 @@ import com.cool.store.dto.store.StoreExtendSoftOpenDTO; import com.cool.store.dto.store.StoreMasterIssueDTO; import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.*; +import com.cool.store.entity.closeup.CloseUpPlatformDO; import com.cool.store.entity.bonus.BonusDistributionRuleDO; import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.entity.wallet.WalletTradeDO; @@ -38,6 +40,7 @@ import com.cool.store.service.*; import com.cool.store.service.bonus.BonusService; import com.cool.store.service.close.CloseStoreRefundService; import com.cool.store.service.close.CloseStoreService; +import com.cool.store.service.closeup.CloseUpService; import com.cool.store.service.fees.WalletPayInfoService; import com.cool.store.service.impl.CommonService; import com.cool.store.service.store.PreAllocationRecordService; @@ -157,12 +160,17 @@ public class XxlJobHandler { CloseStoreInfoDAO closeStoreInfoDAO; @Resource ThirdStoreOpenDataService thirdStoreOpenDataService; + @Resource + CloseUpPlatformDAO closeUpPlatformDAO; + @Resource + CloseUpService closeUpService; private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + /** * @Auther: wangshuo * @Date: 2024/4/29 @@ -789,6 +797,32 @@ public class XxlJobHandler { log.info("------end withdrawUpdate------"); } + @XxlJob("queryPlatformStatus") + public void queryPlatformStatus() { + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + log.info("------start queryPlatformStatus------"); + boolean hasNext = true; + int pageNum = 1; + int pageSize = CommonConstants.BATCH_SIZE; + while (hasNext) { + PageHelper.startPage(pageNum, pageSize); + List list = closeUpPlatformDAO.getList(null, 0, null, true); + hasNext = list.size() >= pageSize; + if (CollectionUtils.isEmpty(list)) { + break; + } + for (CloseUpPlatformDO closeUpPlatformDO : list) { + try { + closeUpService.queryPlatformStatusByTaskId(closeUpPlatformDO); + } catch (Exception e) { + log.error("查询平台状态失败, closeUpPlatformId:{}", closeUpPlatformDO.getId(), e); + } + } + pageNum++; + } + log.info("------end queryPlatformStatus------"); + } + /** * 每月统计上一个月门店的实收数据并入库 * 建议每月1日凌晨执行 diff --git a/coolstore-partner-web/src/main/resources/application-ab.properties b/coolstore-partner-web/src/main/resources/application-ab.properties index 1803c5173..3bc939ec3 100644 --- a/coolstore-partner-web/src/main/resources/application-ab.properties +++ b/coolstore-partner-web/src/main/resources/application-ab.properties @@ -180,6 +180,10 @@ cool.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0erPAWesjkp9 wallet.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB wallet.org.id=140732221567301 +closeup.platform.url=http://101.132.32.88:30081 +closeup.platform.username=qcOasjPiy7Bsb6y +closeup.platform.secret=6ezC98lNx5b1IQt + store.open.url=https://zhengxin.zhidiansoft.com:5943 store.open.appId=289704779317445 store.open.appKey=IGSAEQoakR2HEaYx diff --git a/coolstore-partner-web/src/main/resources/application-local.properties b/coolstore-partner-web/src/main/resources/application-local.properties index 2d487403c..9489f03a0 100644 --- a/coolstore-partner-web/src/main/resources/application-local.properties +++ b/coolstore-partner-web/src/main/resources/application-local.properties @@ -178,6 +178,10 @@ liePin.baseUrl=https://open-xhopen-qa53.qa.xunhou.cn liePin.tenantId=12833 liePin.mobile=13345565081 +closeup.platform.url=http://101.132.32.88:30081 +closeup.platform.username=qcOasjPiy7Bsb6y +closeup.platform.secret=6ezC98lNx5b1IQt + store.open.url=https://zhengxin.zhidiansoft.com:5943 store.open.appId=289704779317445 store.open.appKey=IGSAEQoakR2HEaYx diff --git a/coolstore-partner-web/src/main/resources/application-online.properties b/coolstore-partner-web/src/main/resources/application-online.properties index 600a50851..8e7c7dd55 100644 --- a/coolstore-partner-web/src/main/resources/application-online.properties +++ b/coolstore-partner-web/src/main/resources/application-online.properties @@ -175,6 +175,10 @@ cool.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAleyT39qxm9Vi wallet.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB wallet.org.id=420289242456261 +closeup.platform.url=https://zx-portal.huomayunping.com:3001 +closeup.platform.username=qcOasjPiy7Bsb6y +closeup.platform.secret=6ezC98lNx5b1IQt + store.open.url=https://zhengxin.zhidiansoft.com:5943 store.open.appId=289704779317445 store.open.appKey=IGSAEQoakR2HEaYx diff --git a/coolstore-partner-web/src/main/resources/application-test.properties b/coolstore-partner-web/src/main/resources/application-test.properties index 48673fdb7..f8f9a76fa 100644 --- a/coolstore-partner-web/src/main/resources/application-test.properties +++ b/coolstore-partner-web/src/main/resources/application-test.properties @@ -180,6 +180,10 @@ cool.api.rsa.private.key=MIIEpQIBAAKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4 cool.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0erPAWesjkp9J4htmfCyqKS9npmT9dW3KqWTfb4c7x/QBUtKuokWOO0XikHd4bGUa9kl+twSv/5A3kYz1B9eg6wRuDJoads+G5U7rVQjzdoUtLaf3lNXkuSehl4uHUPQfNa6vcmvzraXPxJjEpYzj9WZh7uJqq2oSgw42H1qdbFCXSaE5BwsOb+2vZXjzh4RO10Sy3Qb1UqGsoZoxVzrtDeEctCjrecFyQr96L2UtYa4NTxSTfu4rgObrwIOMvqqnLsXEzK/rd6kIHYjkZYQCOa48AedWp2YKQ7Ldclj+VMLnXvl42J9exVkbs++8k3P5sI9fdZX4Ey2RBjnSoAo/QIDAQAB wallet.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB +closeup.platform.url=http://101.132.32.88:30081 +closeup.platform.username=qcOasjPiy7Bsb6y +closeup.platform.secret=6ezC98lNx5b1IQt + store.open.url=https://zhengxin.zhidiansoft.com:5943 store.open.appId=289704779317445 store.open.appKey=IGSAEQoakR2HEaYx