Merge #126 into master from cc_20260408_close_up

歇业管理逻辑修改

* 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: 王非凡 <accounts_67eba0c5fee9c49c80c8e2b4@mail.teambition.com>
Merged-by: 正新 <accounts_6964c7bcd2a2c377c5bbd01b@mail.teambition.com>

CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/126
This commit is contained in:
王非凡
2026-05-12 08:13:30 +00:00
committed by 正新
parent 27af1561ac
commit 56b85c3322
26 changed files with 729 additions and 58 deletions

View File

@@ -423,7 +423,7 @@ public enum ErrorCodeEnum {
CLOSE_STORE_REFUND_MK_USER_NOT_EXIST(1710016, "当前用户不存在每刻权限", null), CLOSE_STORE_REFUND_MK_USER_NOT_EXIST(1710016, "当前用户不存在每刻权限", null),
CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD(1710017, "存在生效中的退款申请!", null), CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD(1710017, "存在生效中的退款申请!", null),
CLOSE_STORE_REFUND_TYPE_ERROR(1710018, "退款类型错误", 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), CLOSE_STORE_ONLY_APPROVAL_ENABLE_SUSPEND(1710020, "仅审批中申请允许中止", null),
/** /**

View File

@@ -40,6 +40,7 @@ public enum RocketMqGroupEnum {
VISIT_RECORD_INVALID("visit_record_invalid", new ArrayList<>(Arrays.asList(RocketMqTagEnum.VISIT_RECORD_INVALID))), 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))), 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_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; private final String group;

View File

@@ -24,6 +24,7 @@ public enum RocketMqTagEnum {
VISIT_RECORD_INVALID("visit_record_invalid", "拜访记录失效"), VISIT_RECORD_INVALID("visit_record_invalid", "拜访记录失效"),
TP_PENALTY_APPEAL_OVERDUE("tp_penalty_appeal_overdue", "十二分惩处单复议逾期"), TP_PENALTY_APPEAL_OVERDUE("tp_penalty_appeal_overdue", "十二分惩处单复议逾期"),
CLOSE_UP_APPLY_STORE_UPDATE("close_up_apply_store_update", "歇业申请修改门店状态"), CLOSE_UP_APPLY_STORE_UPDATE("close_up_apply_store_update", "歇业申请修改门店状态"),
CLOSE_UP_PLAN_OPEN_STORE("close_up_plan_open_store", "歇业申请计划开店"),
; ;

View File

@@ -14,14 +14,14 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum CloseUpPlatformEnum { public enum CloseUpPlatformEnum {
DOUYINTG("douyintg", "抖音", 0, "https://ossfilezx.coolstore.cn/icon/closeup/douyin.png"), DOUYINTG("douyintg", "抖音", 1, 8, "https://ossfilezx.coolstore.cn/icon/closeup/douyin.png"),
ELEMEWM("elemewm", "饿了么", 0, "https://ossfilezx.coolstore.cn/icon/closeup/ele.png"), ELEMEWM("elemewm", "饿了么", 1, 2, "https://ossfilezx.coolstore.cn/icon/closeup/ele.png"),
HUOMA("huoma", "火码POS", 0, "https://ossfilezx.coolstore.cn/icon/closeup/huoma.png"), HUOMA("huoma", "火码POS", 1, null, "https://ossfilezx.coolstore.cn/icon/closeup/huoma.png"),
JINGDONGWM("jingdongwm", "京东外卖", 0, "https://ossfilezx.coolstore.cn/icon/closeup/jingdong.png"), JINGDONGWM("jingdongwm", "京东外卖", 1, 4, "https://ossfilezx.coolstore.cn/icon/closeup/jingdong.png"),
KUAISHOUTG("kuaishoutg", "快手团购", 0, "https://ossfilezx.coolstore.cn/icon/closeup/kuaishou.png"), KUAISHOUTG("kuaishoutg", "快手团购", 0, null, "https://ossfilezx.coolstore.cn/icon/closeup/kuaishou.png"),
MEITUANTG("meituantg", "美团团购", 0, "https://ossfilezx.coolstore.cn/icon/closeup/meituan.png"), MEITUANTG("meituantg", "美团团购", 1, 1, "https://ossfilezx.coolstore.cn/icon/closeup/meituan.png"),
MEITUANWM("meituanwm", "美团外卖", 0, "https://ossfilezx.coolstore.cn/icon/closeup/meituanwx.png"), MEITUANWM("meituanwm", "美团外卖", 1, 1, "https://ossfilezx.coolstore.cn/icon/closeup/meituanwx.png"),
ZHIFUBAO("zhifubao", "支付宝团购", 0, "https://ossfilezx.coolstore.cn/icon/closeup/zhifubao.png"), ZHIFUBAO("zhifubao", "支付宝团购", 0, null, "https://ossfilezx.coolstore.cn/icon/closeup/zhifubao.png"),
; ;
/** /**
@@ -36,8 +36,21 @@ public enum CloseUpPlatformEnum {
* 关闭类型 * 关闭类型
*/ */
private final Integer type; private final Integer type;
/**
* 平台关闭code
*/
private final Integer platformCode;
/** /**
* 图标地址 * 图标地址
*/ */
private final String icon; 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;
}
} }

View File

@@ -199,18 +199,21 @@ public class StoreDao {
* @param closeUpReason 暂停营业原因 * @param closeUpReason 暂停营业原因
*/ */
public void closeUp(String storeId, String closeUpReason) { public void closeUp(String storeId, String closeUpReason) {
if (storeMapper.updateStatus(storeId, StoreStatusEnum.CLOSE_UP.getValue()) > 0) { storeMapper.insertOrUpdateCloseUpReason(storeId, closeUpReason, 1);
storeMapper.insertOrUpdateCloseUpReason(storeId, closeUpReason);
}
} }
/** /**
* 暂停营业门店转在营 * 暂停营业门店转在营
*/ */
public void closeUpToOpen(String storeId) { public void closeUpToOpen(String storeId) {
if (storeMapper.updateStatus(storeId, StoreStatusEnum.OPEN.getValue()) > 0) { storeMapper.insertOrUpdateCloseUpReason(storeId, null, 0);
storeMapper.insertOrUpdateCloseUpReason(storeId, null); }
}
/**
* 获取门店歇业状态
*/
public Integer getCloseUpStatus(String storeId) {
return storeMapper.getCloseUpStatus(storeId);
} }
/** /**

View File

@@ -44,7 +44,7 @@ public class CloseUpPlatformDAO {
return list; return list;
} }
public List<CloseUpPlatformDO> getList(Long applyId, Integer status, Integer type) { public List<CloseUpPlatformDO> getList(Long applyId, Integer status, Integer type, Boolean hasTaskId) {
Example example = new Example(CloseUpPlatformDO.class); Example example = new Example(CloseUpPlatformDO.class);
Example.Criteria criteria = example.createCriteria() Example.Criteria criteria = example.createCriteria()
.andEqualTo("applyId", applyId); .andEqualTo("applyId", applyId);
@@ -54,6 +54,9 @@ public class CloseUpPlatformDAO {
if (Objects.nonNull(type)) { if (Objects.nonNull(type)) {
criteria.andEqualTo("type", type); criteria.andEqualTo("type", type);
} }
if (Boolean.TRUE.equals(hasTaskId)) {
criteria.andIsNotNull("taskId").andNotEqualTo("taskId", "");
}
return closeUpPlatformMapper.selectByExample(example); return closeUpPlatformMapper.selectByExample(example);
} }
@@ -71,6 +74,13 @@ public class CloseUpPlatformDAO {
closeUpPlatformMapper.updateByExampleSelective(update, example); closeUpPlatformMapper.updateByExampleSelective(update, example);
} }
public void updateStatusAndTaskId(List<CloseUpPlatformDO> list) {
if (CollectionUtils.isEmpty(list)) {
return;
}
closeUpPlatformMapper.updateStatusAndTaskId(list);
}
/** /**
* 根据申请单id删除 * 根据申请单id删除
*/ */

View File

@@ -129,7 +129,12 @@ public interface StoreMapper {
*/ */
int insertOrUpdateCloseInfo(@Param("storeId") String storeId, @Param("closeReason") Integer closeReason, @Param("closeNature") Integer closeNature); 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);
/** /**
* 查询最近没有订货记录的门店 * 查询最近没有订货记录的门店

View File

@@ -14,4 +14,6 @@ public interface CloseUpPlatformMapper extends Mapper<CloseUpPlatformDO> {
* 查询待处理的申请单id * 查询待处理的申请单id
*/ */
List<Long> selectTodoApplyIds(@Param("applyType") Integer applyType, @Param("storeKeyword") String storeKeyword); List<Long> selectTodoApplyIds(@Param("applyType") Integer applyType, @Param("storeKeyword") String storeKeyword);
void updateStatusAndTaskId(@Param("list") List<CloseUpPlatformDO> list);
} }

View File

@@ -344,12 +344,19 @@
</insert> </insert>
<insert id="insertOrUpdateCloseUpReason"> <insert id="insertOrUpdateCloseUpReason">
INSERT INTO store_extend_info_${enterpriseId}(store_id, close_up_reason) INSERT INTO store_extend_info_${enterpriseId}(store_id, close_up_reason, is_close_up)
VALUES(#{storeId}, #{closeUpReason}) VALUES(#{storeId}, #{closeUpReason}, #{isCloseUp})
ON DUPLICATE KEY UPDATE 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)
</insert> </insert>
<select id="getCloseUpStatus" resultType="java.lang.Integer">
SELECT IFNULL(MAX(is_close_up), 0)
FROM store_extend_info_${enterpriseId}
WHERE store_id = #{storeId}
</select>
<select id="getNoOrderStore" resultType="com.cool.store.entity.StoreDO"> <select id="getNoOrderStore" resultType="com.cool.store.entity.StoreDO">
SELECT * FROM store_${enterpriseId} a SELECT * FROM store_${enterpriseId} a
LEFT JOIN store_extend_info_${enterpriseId} b ON a.store_id = b.store_id LEFT JOIN store_extend_info_${enterpriseId} b ON a.store_id = b.store_id

View File

@@ -21,10 +21,11 @@
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="updated_time" jdbcType="TIMESTAMP" property="updatedTime" /> <result column="updated_time" jdbcType="TIMESTAMP" property="updatedTime" />
<result column="urls" jdbcType="LONGVARCHAR" property="urls" /> <result column="urls" jdbcType="LONGVARCHAR" property="urls" />
<result column="is_open" jdbcType="TINYINT" property="isOpen" />
</resultMap> </resultMap>
<sql id="Base_Column_List_A"> <sql id="Base_Column_List_A">
a.id, a.type, a.store_id, a.apply_no, a.line_id, a.status, a.plan_close_date, a.actual_close_date, a.plan_open_date, a.actual_open_date, a.id, a.type, a.store_id, a.apply_no, a.line_id, a.status, a.plan_close_date, a.actual_close_date, a.plan_open_date, a.actual_open_date,
a.user_id, a.reason, a.source_apply_id, a.create_time, a.updated_time, a.urls a.user_id, a.reason, a.source_apply_id, a.create_time, a.updated_time, a.urls, a.is_open
</sql> </sql>
<select id="getList" parameterType="com.cool.store.request.closeup.CloseUpQueryRequest" resultMap="BaseResultMap"> <select id="getList" parameterType="com.cool.store.request.closeup.CloseUpQueryRequest" resultMap="BaseResultMap">

View File

@@ -16,13 +16,14 @@
<result column="icon" jdbcType="VARCHAR" property="icon" /> <result column="icon" jdbcType="VARCHAR" property="icon" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="task_id" jdbcType="VARCHAR" property="taskId" />
</resultMap> </resultMap>
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id"> <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
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 VALUES
<foreach collection="list" item="item" separator=","> <foreach collection="list" item="item" separator=",">
(#{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})
</foreach> </foreach>
</insert> </insert>
@@ -41,4 +42,22 @@
</if> </if>
ORDER BY a.create_time DESC ORDER BY a.create_time DESC
</select> </select>
<update id="updateStatusAndTaskId">
UPDATE zxjp_close_up_platform
SET status = CASE id
<foreach collection="list" item="item">
WHEN #{item.id} THEN #{item.status}
</foreach>
END,
task_id = CASE id
<foreach collection="list" item="item">
WHEN #{item.id} THEN #{item.taskId}
</foreach>
END
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>
</mapper> </mapper>

View File

@@ -0,0 +1,30 @@
package com.cool.store.dto.closeup;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* <p>
* 平台异步状态DTO
* </p>
*
* @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;
}

View File

@@ -0,0 +1,47 @@
package com.cool.store.dto.closeup;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* <p>
* 平台营业状态修改DTO
* </p>
*
* @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<PlatformUpdateResult> 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;
}
}

View File

@@ -109,4 +109,10 @@ public class CloseUpApplyFormDO {
*/ */
@Column(name = "updated_time") @Column(name = "updated_time")
private Date updatedTime; private Date updatedTime;
/**
* 是否恢复营业申请恢复营业通过或者到营业时间置1
*/
@Column(name = "is_open")
private Integer isOpen;
} }

View File

@@ -75,4 +75,10 @@ public class CloseUpPlatformDO {
*/ */
@Column(name = "update_time") @Column(name = "update_time")
private Date updateTime; private Date updateTime;
/**
* 任务id
*/
@Column(name = "task_id")
private String taskId;
} }

View File

@@ -42,6 +42,8 @@ public class ConsumerClient {
private TpPenaltyAppealListener tpPenaltyAppealListener; private TpPenaltyAppealListener tpPenaltyAppealListener;
@Resource @Resource
private CloseUpApplyStoreUpdateListener closeUpApplyStoreUpdateListener; private CloseUpApplyStoreUpdateListener closeUpApplyStoreUpdateListener;
@Resource
private CloseUpPlanOpenStoreListener closeUpPlanOpenStoreListener;
/** /**
* 获取通用配置 * 获取通用配置
@@ -160,4 +162,17 @@ public class ConsumerClient {
return consumerBean; 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<Subscription, MessageListener> commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, closeUpPlanOpenStoreListener);
//订阅多个topic如上面设置
consumerBean.setSubscriptionTable(commonSubscriptionTable);
return consumerBean;
}
} }

View File

@@ -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;
/**
* <p>
* 歇业管理自动营业
* </p>
*
* @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;
}
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.service.closeup; package com.cool.store.service.closeup;
import com.cool.store.entity.closeup.CloseUpPlatformDO;
import com.cool.store.request.closeup.*; import com.cool.store.request.closeup.*;
import com.cool.store.response.AuditInfoResponse; import com.cool.store.response.AuditInfoResponse;
import com.cool.store.vo.closeup.CloseUpApplyFormSimpleVO; import com.cool.store.vo.closeup.CloseUpApplyFormSimpleVO;
@@ -84,4 +85,14 @@ public interface CloseUpService {
* 平台关闭开启处理 * 平台关闭开启处理
*/ */
Boolean handlePlatform(CloseUpPlatformHandleRequest request); Boolean handlePlatform(CloseUpPlatformHandleRequest request);
/**
* 根据任务id查询平台状态
*/
void queryPlatformStatusByTaskId(CloseUpPlatformDO platformDO);
/**
* 歇业申请门店自动恢复营业
*/
void closeUpAutoOpen(Long applyId);
} }

View File

@@ -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.*;
/**
* <p>
* 平台接口请求
* </p>
*
* @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<String, Object> responseMap = objectMapper.readValue(responseJson,
new TypeReference<Map<String, Object>>() {
});
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> T parseResponse(String responseJson, Class<T> responseType) throws Exception {
// 解析为通用响应格式
Map<String, Object> responseMap = objectMapper.readValue(responseJson,
new TypeReference<Map<String, Object>>() {});
// 如果返回类型是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;
}
}
}

View File

@@ -11,6 +11,8 @@ import com.cool.store.dao.*;
import com.cool.store.dao.closeup.CloseUpApplyFormDAO; import com.cool.store.dao.closeup.CloseUpApplyFormDAO;
import com.cool.store.dao.closeup.CloseUpAuditRecordDAO; import com.cool.store.dao.closeup.CloseUpAuditRecordDAO;
import com.cool.store.dao.closeup.CloseUpPlatformDAO; 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.dto.store.StoreMasterIssueDTO;
import com.cool.store.entity.*; import com.cool.store.entity.*;
import com.cool.store.entity.closeup.CloseUpApplyFormDO; 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.entity.closeup.CloseUpPlatformDO;
import com.cool.store.enums.*; import com.cool.store.enums.*;
import com.cool.store.enums.close.CloseStoreAuditStatusEnum; 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.enums.closeup.CloseUpStatusEnum;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
import com.cool.store.mq.producer.SimpleMessageService; 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.UserAuthMappingService;
import com.cool.store.service.closeup.CloseUpService; import com.cool.store.service.closeup.CloseUpService;
import com.cool.store.service.closeup.PlatformAutoStrategy; 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.service.sms.AliyunSmsService;
import com.cool.store.utils.BeanUtil; import com.cool.store.utils.BeanUtil;
import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.PartnerUserInfoVO;
@@ -73,6 +77,7 @@ public class CloseUpServiceImpl implements CloseUpService {
private final LineInfoDAO lineInfoDAO; private final LineInfoDAO lineInfoDAO;
private final EnterpriseUserDAO enterpriseUserDAO; private final EnterpriseUserDAO enterpriseUserDAO;
private final AliyunSmsService aliyunSmsService; private final AliyunSmsService aliyunSmsService;
private final PlatformHttpClientRest platformHttpClientRest;
@Value("${mybatis.configuration.variables.enterpriseId}") @Value("${mybatis.configuration.variables.enterpriseId}")
private String 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()); simpleMessageService.send(String.valueOf(formDO.getId()), RocketMqTagEnum.CLOSE_UP_APPLY_STORE_UPDATE, formDO.getPlanOpenDate().getTime());
} else { } else {
log.info("直接变更"); log.info("直接变更");
storeStatusAndPlatformUpdate(formDO.getStoreId(), formDO.getId(), formDO.getType(), formDO.getSourceApplyId(), false); storeStatusAndPlatformUpdate(formDO, false);
} }
// 修改源歇业申请单 // 修改源歇业申请单
CloseUpApplyFormDO updateSourceForm = CloseUpApplyFormDO.builder() CloseUpApplyFormDO updateSourceForm = CloseUpApplyFormDO.builder()
.id(formDO.getSourceApplyId()) .id(formDO.getSourceApplyId())
.actualOpenDate(formDO.getActualOpenDate()) .actualOpenDate(formDO.getActualOpenDate())
.status(CloseUpStatusEnum.APPLY_OPEN_PASS.getStatus()) .status(CloseUpStatusEnum.APPLY_OPEN_PASS.getStatus())
.isOpen(1)
.build(); .build();
applyFormDAO.updateByPrimaryKeySelective(updateSourceForm); applyFormDAO.updateByPrimaryKeySelective(updateSourceForm);
// 初始化各外卖团购平台账号 // 初始化各外卖团购平台账号
List<CloseUpPlatformDO> platformList = platformDAO.init(formDO.getId(), formDO.getType(), formDO.getActualOpenDate()); List<CloseUpPlatformDO> 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) if (Objects.nonNull(formDO.getActualOpenDate()) && formDO.getActualOpenDate().before(now)
|| Objects.isNull(formDO.getActualOpenDate()) && formDO.getPlanOpenDate().before(now)) { || Objects.isNull(formDO.getActualOpenDate()) && formDO.getPlanOpenDate().before(now)) {
log.info("过期单据不处理");
return; 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()); simpleMessageService.send(String.valueOf(formDO.getId()), RocketMqTagEnum.CLOSE_UP_APPLY_STORE_UPDATE, formDO.getActualCloseDate().getTime());
} else { } else {
log.info("直接变更"); log.info("直接变更");
storeStatusAndPlatformUpdate(formDO.getStoreId(), formDO.getId(), formDO.getType(), formDO.getSourceApplyId(), false); storeStatusAndPlatformUpdate(formDO, false);
} }
// 初始化各外卖团购平台账号 // 初始化各外卖团购平台账号
List<CloseUpPlatformDO> platformList = platformDAO.init(formDO.getId(), formDO.getType(), formDO.getActualCloseDate()); List<CloseUpPlatformDO> platformList = platformDAO.init(formDO.getId(), formDO.getType(), formDO.getActualCloseDate());
// 根据平台类型自动关闭 // 根据平台类型自动关闭
autoPlatform(formDO.getType(), platformList); autoPlatform(formDO.getStoreId(), formDO.getType(), platformList);
} }
@Override @Override
@@ -395,7 +402,7 @@ public class CloseUpServiceImpl implements CloseUpService {
@Override @Override
public List<CloseUpPlatformVO> getPlatformListByApplyId(Long applyId) { public List<CloseUpPlatformVO> getPlatformListByApplyId(Long applyId) {
List<CloseUpPlatformDO> list = platformDAO.getList(applyId, null, null); List<CloseUpPlatformDO> list = platformDAO.getList(applyId, null, null, null);
return BeanUtil.toList(list, CloseUpPlatformVO.class); return BeanUtil.toList(list, CloseUpPlatformVO.class);
} }
@@ -486,29 +493,61 @@ public class CloseUpServiceImpl implements CloseUpService {
/** /**
* 自动开启关闭各平台 * 自动开启关闭各平台
*/ */
private void autoPlatform(Integer applyType, List<CloseUpPlatformDO> list) { public void autoPlatform(String storeId, Integer applyType, List<CloseUpPlatformDO> list) {
List<Long> updateIds = new ArrayList<>(); try {
for (CloseUpPlatformDO platformDO : list) { StoreDO storeDO = storeDao.getByStoreId(storeId);
// 待处理且自动关闭 if (Objects.isNull(storeDO)) {
if (platformDO.getStatus().equals(0) && platformDO.getType().equals(1) && (new Date()).after(platformDO.getTaskStartDate())) { return;
PlatformAutoStrategy platformAuto = platformAutoFactory.getByCode(platformDO.getCode()); }
if (Objects.isNull(platformAuto)) { int platformCode = 0;
log.info("平台不存在实现类, code:{} name:{}", platformDO.getCode(), platformDO.getName()); List<CloseUpPlatformDO> unClosePlatformList = list.stream()
} else { .filter(platformDO -> platformDO.getStatus().equals(0)
boolean update = false; && platformDO.getType().equals(1)
if (applyType.equals(0)) { && !(new Date()).before(platformDO.getTaskStartDate()))
update = platformAuto.close(); .collect(Collectors.toList());
} else if (applyType.equals(1)) { if (CollectionUtils.isEmpty(unClosePlatformList)) {
update = platformAuto.open(); log.info("未处理的自动关闭平台为空");
return;
}
List<CloseUpPlatformDO> 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<String, PlatformStatusDTO.PlatformUpdateResult> 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) { Integer platformCodeByCode = CloseUpPlatformEnum.getPlatformCodeByCode(closeUpPlatformDO.getCode());
updateIds.add(platformDO.getId()); 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));
} }
} }
} }
} platformDAO.updateStatusAndTaskId(updatePlatformList);
if (CollectionUtils.isNotEmpty(updateIds)) { } catch (Exception e) {
platformDAO.updateStatusByIds(updateIds, 1); log.info("平台自动歇业/营业失败", e);
} }
} }
@@ -519,7 +558,7 @@ public class CloseUpServiceImpl implements CloseUpService {
public void storeStatusAndPlatformUpdate(Long formId) { public void storeStatusAndPlatformUpdate(Long formId) {
CloseUpApplyFormDO formDO = applyFormDAO.getById(formId); CloseUpApplyFormDO formDO = applyFormDAO.getById(formId);
if (Objects.nonNull(formDO)) { 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; 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); StoreDO storeDO = storeDao.getByStoreId(storeId);
if (Objects.isNull(storeDO)) { if (Objects.isNull(storeDO)) {
return; return;
} }
// 主数据状态修改 // 主数据状态修改
boolean storeUpdate = false; boolean storeUpdate = false;
Integer isCloseUp = storeDao.getCloseUpStatus(storeId);
if (applyType.equals(0)) { 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"); storeDao.closeUp(storeId, "close_up_special_reason");
storeUpdate = true; storeUpdate = true;
} else { Date openTime = Objects.nonNull(formDO.getActualOpenDate()) ? formDO.getActualOpenDate() : formDO.getPlanOpenDate();
log.info("门店不处于在营状态,修改为暂停营业失败"); if (Objects.nonNull(openTime)) {
simpleMessageService.send(String.valueOf(formDO.getId()), RocketMqTagEnum.CLOSE_UP_PLAN_OPEN_STORE, openTime.getTime());
}
} }
} else { } else {
if (StoreStatusEnum.CLOSE_UP.getValue().equals(storeDO.getStoreStatus())) { if (StoreStatusEnum.OPEN.getValue().equals(storeDO.getStoreStatus()) && isCloseUp.equals(1)) {
storeDao.closeUpToOpen(storeId); storeDao.closeUpToOpen(storeId);
storeUpdate = true; storeUpdate = true;
} else {
log.info("门店不处于暂停营业状态,修改为在营失败");
} }
// 删除歇业申请的平台数据 // 删除歇业申请的平台数据
if (Objects.nonNull(sourceApplyId)) { if (Objects.nonNull(sourceApplyId)) {
@@ -560,8 +660,8 @@ public class CloseUpServiceImpl implements CloseUpService {
} }
if (autoPlatform) { if (autoPlatform) {
// 自动开关平台 // 自动开关平台
List<CloseUpPlatformDO> platformList = platformDAO.getList(applyId, 0, applyType); List<CloseUpPlatformDO> platformList = platformDAO.getList(formDO.getId(), 0, 1, null);
autoPlatform(applyType, platformList); autoPlatform(storeId, applyType, platformList);
} }
if (StringUtils.isNotBlank(storeDO.getTelephone())) { if (StringUtils.isNotBlank(storeDO.getTelephone())) {
aliyunSmsService.sendNotice(storeDO.getTelephone(), applyType.equals(0) ? SmsNoticeTypeEnum.CLOSE_UP_CLOSE_NOTICE : SmsNoticeTypeEnum.CLOSE_UP_OPEN_NOTICE); 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) { } catch (Exception e) {
log.error("mq通知主应用下发门店主数据失败"); log.error("mq通知主应用下发门店主数据失败");
} }
} else {
log.info("门店歇业状态修改失败,当前门店状态:{}, 歇业状态:{}", storeDO.getStoreStatus(), isCloseUp);
} }
} }

View File

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
import com.cool.store.annotation.Debounce; import com.cool.store.annotation.Debounce;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import com.cool.store.dao.*; 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.bonus.BonusDistributionRuleDAO;
import com.cool.store.dao.fees.WalletPayInfoDAO; import com.cool.store.dao.fees.WalletPayInfoDAO;
import com.cool.store.dto.*; 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.wallet.*;
import com.cool.store.dto.xgj.XgjPayResultDTO; import com.cool.store.dto.xgj.XgjPayResultDTO;
import com.cool.store.entity.*; 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.bonus.BonusDistributionRuleDO;
import com.cool.store.entity.fees.WalletPayInfoDO; import com.cool.store.entity.fees.WalletPayInfoDO;
import com.cool.store.enums.*; 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.*;
import com.cool.store.service.bonus.BonusService; import com.cool.store.service.bonus.BonusService;
import com.cool.store.service.close.CloseStoreService; 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.fees.WalletPayInfoService;
import com.cool.store.service.impl.CommonService; import com.cool.store.service.impl.CommonService;
import com.cool.store.service.impl.UserAuthMappingServiceImpl; import com.cool.store.service.impl.UserAuthMappingServiceImpl;
@@ -144,7 +150,12 @@ public class PCTestController {
SignFranchiseService signFranchiseService; SignFranchiseService signFranchiseService;
@Resource @Resource
WalletPayInfoService walletPayInfoService; WalletPayInfoService walletPayInfoService;
@Resource
CloseUpServiceImpl closeUpService;
@Resource
CloseUpApplyFormDAO closeUpApplyFormDAO;
@Resource
CloseUpPlatformDAO closeUpPlatformDAO;
@Resource @Resource
ThirdStoreOpenDataService thirdStoreOpenDataService; ThirdStoreOpenDataService thirdStoreOpenDataService;
@Resource @Resource
@@ -152,6 +163,23 @@ public class PCTestController {
@Resource @Resource
BonusDistributionRuleDAO bonusRuleDAO; 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<CloseUpPlatformDO> platformList = closeUpPlatformDAO.getList(applyId, 0, 1, null);
closeUpService.autoPlatform(formDO.getStoreId(), formDO.getType(), platformList);
}
@PostMapping("/normalStoreApplyClose") @PostMapping("/normalStoreApplyClose")
@Debounce(timeMs = 10000, diffUser = false) @Debounce(timeMs = 10000, diffUser = false)
public ResponseResult<Boolean> normalStoreApplyClose() { public ResponseResult<Boolean> normalStoreApplyClose() {

View File

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import com.cool.store.constants.RedisConstant; import com.cool.store.constants.RedisConstant;
import com.cool.store.dao.*; import com.cool.store.dao.*;
import com.cool.store.dao.closeup.CloseUpPlatformDAO;
import com.cool.store.dao.bonus.BonusDistributionRuleDAO; import com.cool.store.dao.bonus.BonusDistributionRuleDAO;
import com.cool.store.dao.tp.TpApplyFormDAO; import com.cool.store.dao.tp.TpApplyFormDAO;
import com.cool.store.dao.wallet.WalletTradeDAO; 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.StoreMasterIssueDTO;
import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.dto.store.StoreOrderTimeDTO;
import com.cool.store.entity.*; import com.cool.store.entity.*;
import com.cool.store.entity.closeup.CloseUpPlatformDO;
import com.cool.store.entity.bonus.BonusDistributionRuleDO; import com.cool.store.entity.bonus.BonusDistributionRuleDO;
import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.entity.tp.TpApplyFormDO;
import com.cool.store.entity.wallet.WalletTradeDO; 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.bonus.BonusService;
import com.cool.store.service.close.CloseStoreRefundService; import com.cool.store.service.close.CloseStoreRefundService;
import com.cool.store.service.close.CloseStoreService; 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.fees.WalletPayInfoService;
import com.cool.store.service.impl.CommonService; import com.cool.store.service.impl.CommonService;
import com.cool.store.service.store.PreAllocationRecordService; import com.cool.store.service.store.PreAllocationRecordService;
@@ -157,12 +160,17 @@ public class XxlJobHandler {
CloseStoreInfoDAO closeStoreInfoDAO; CloseStoreInfoDAO closeStoreInfoDAO;
@Resource @Resource
ThirdStoreOpenDataService thirdStoreOpenDataService; ThirdStoreOpenDataService thirdStoreOpenDataService;
@Resource
CloseUpPlatformDAO closeUpPlatformDAO;
@Resource
CloseUpService closeUpService;
private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM"); private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM");
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
/** /**
* @Auther: wangshuo * @Auther: wangshuo
* @Date: 2024/4/29 * @Date: 2024/4/29
@@ -789,6 +797,32 @@ public class XxlJobHandler {
log.info("------end withdrawUpdate------"); 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<CloseUpPlatformDO> 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日凌晨执行 * 建议每月1日凌晨执行

View File

@@ -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.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB
wallet.org.id=140732221567301 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.url=https://zhengxin.zhidiansoft.com:5943
store.open.appId=289704779317445 store.open.appId=289704779317445
store.open.appKey=IGSAEQoakR2HEaYx store.open.appKey=IGSAEQoakR2HEaYx

View File

@@ -178,6 +178,10 @@ liePin.baseUrl=https://open-xhopen-qa53.qa.xunhou.cn
liePin.tenantId=12833 liePin.tenantId=12833
liePin.mobile=13345565081 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.url=https://zhengxin.zhidiansoft.com:5943
store.open.appId=289704779317445 store.open.appId=289704779317445
store.open.appKey=IGSAEQoakR2HEaYx store.open.appKey=IGSAEQoakR2HEaYx

View File

@@ -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.api.rsa.public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvU5WUX5MaZhS4MRfZ5OeqmSxTgjNi64SEwTiDYS++DRHRFTEguk1g5AbiW3l9eEdATeVk0WX+T6ZIIa2do3bQOKhlMtRwWMWQIucjGa7ySOCuicvnCD2HAQ2EThfqQdSpAW5UpcyodrhcyUkuevBA4fQQ06k9lB4FjqWtao2+aYFIPFPu8Wu28KI/9QIMLI02Q1YY3duJ67QW4EM4I2oS0t3sWJeZtIJPRHFWW1EaLJz2FdbJJq+z6D2p++9pmkHsvdnktUUO+nPL3PCLtxGYxEwr/AqTYR/1yXfkVWe3nHXc+qvRt967X1hDHC+gEPJItr7kUk3pQTGBv9kNu75DwIDAQAB
wallet.org.id=420289242456261 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.url=https://zhengxin.zhidiansoft.com:5943
store.open.appId=289704779317445 store.open.appId=289704779317445
store.open.appKey=IGSAEQoakR2HEaYx store.open.appKey=IGSAEQoakR2HEaYx

View File

@@ -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 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 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.url=https://zhengxin.zhidiansoft.com:5943
store.open.appId=289704779317445 store.open.appId=289704779317445
store.open.appKey=IGSAEQoakR2HEaYx store.open.appKey=IGSAEQoakR2HEaYx