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:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user