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

@@ -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<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;
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);
}

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.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<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)
|| 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<CloseUpPlatformDO> 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<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);
}
@@ -486,29 +493,61 @@ public class CloseUpServiceImpl implements CloseUpService {
/**
* 自动开启关闭各平台
*/
private void autoPlatform(Integer applyType, List<CloseUpPlatformDO> list) {
List<Long> 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<CloseUpPlatformDO> list) {
try {
StoreDO storeDO = storeDao.getByStoreId(storeId);
if (Objects.isNull(storeDO)) {
return;
}
int platformCode = 0;
List<CloseUpPlatformDO> 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<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) {
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<CloseUpPlatformDO> platformList = platformDAO.getList(applyId, 0, applyType);
autoPlatform(applyType, platformList);
List<CloseUpPlatformDO> 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);
}
}