Merge branch 'master' into cc_20251016_async
# Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java # coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
package com.cool.store.service;
|
||||
|
||||
import com.cool.store.userholder.CurrentUser;
|
||||
import com.cool.store.userholder.RefreshUser;
|
||||
|
||||
/**
|
||||
* @Author suzhuhong
|
||||
* @Date 2025/5/29 16:34
|
||||
@@ -13,7 +16,10 @@ public interface EnterpriseService {
|
||||
* @param mobile
|
||||
* @return
|
||||
*/
|
||||
String getAccessToken(String mobile);
|
||||
|
||||
CurrentUser getLoginInfo(String mobile);
|
||||
|
||||
/**
|
||||
* 获取并缓存refreshToken
|
||||
*/
|
||||
RefreshUser getRefreshUser(String userId, String mobile);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.cool.store.constants.CommonConstants;
|
||||
import com.cool.store.constants.RedisConstant;
|
||||
import com.cool.store.dao.EnterpriseUserDAO;
|
||||
import com.cool.store.entity.EnterpriseUserDO;
|
||||
@@ -12,8 +13,10 @@ import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.mapper.SysRoleMapper;
|
||||
import com.cool.store.service.EnterpriseService;
|
||||
import com.cool.store.userholder.CurrentUser;
|
||||
import com.cool.store.userholder.RefreshUser;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.utils.poi.DateUtils;
|
||||
import com.cool.store.utils.poi.constant.Constants;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.crypto.RandomNumberGenerator;
|
||||
@@ -48,7 +51,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
|
||||
private String eid;
|
||||
|
||||
@Override
|
||||
public String getAccessToken(String mobile) {
|
||||
public CurrentUser getLoginInfo(String mobile) {
|
||||
CurrentUser currentUser = new CurrentUser();
|
||||
EnterpriseUserDO enterpriseUser = enterpriseUserDAO.selectByMobile(mobile);
|
||||
if (Objects.isNull(enterpriseUser)){
|
||||
@@ -107,8 +110,20 @@ public class EnterpriseServiceImpl implements EnterpriseService {
|
||||
currentUser.setAppType("qw_self_dkf");
|
||||
currentUser.setUnionid(enterpriseUser.getUnionid());
|
||||
currentUser.setUserType(enterpriseUser.getUserType());
|
||||
redisUtilPool.setString(RedisConstant.ACCESS_TOKEN_PREFIX + currentUser.getAccessToken(), JSON.toJSONString(currentUser), 24 * 60 * 60);
|
||||
return currentUser.getAccessToken();
|
||||
redisUtilPool.setString(RedisConstant.ACCESS_TOKEN_PREFIX + currentUser.getAccessToken(), JSON.toJSONString(currentUser), CommonConstants.ACTION_TOKEN_EXPIRE);
|
||||
return currentUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RefreshUser getRefreshUser(String userId, String mobile) {
|
||||
if (StringUtils.isBlank(mobile)) {
|
||||
EnterpriseUserDO userInfo = enterpriseUserDAO.getUserInfoById(userId);
|
||||
mobile = userInfo.getMobile();
|
||||
}
|
||||
String refreshToken = getToken();
|
||||
RefreshUser refreshUser = new RefreshUser(userId, refreshToken, mobile);
|
||||
redisUtilPool.setString(RedisConstant.REFRESH_TOKEN_PREFIX + refreshToken, JSON.toJSONString(refreshUser), CommonConstants.REFRESH_TOKEN_EXPIRE);
|
||||
return refreshUser;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollStreamUtil;
|
||||
import cn.hutool.core.util.ArrayUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.dao.MessageTemplateDAO;
|
||||
import com.cool.store.entity.MessageTemplateDO;
|
||||
import com.cool.store.entity.StoreMessageDO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.vo.notice.StoreMessageVO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.messaging.MessagingException;
|
||||
import org.springframework.messaging.simp.SimpMessagingTemplate;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 消息下发 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author wangff
|
||||
* @since 2025/9/5
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class MessageIssueService {
|
||||
private final MessageTemplateDAO messageTemplateDAO;
|
||||
private final SimpMessagingTemplate simpMessagingTemplate;
|
||||
|
||||
/**
|
||||
* 下发即时通知消息
|
||||
*
|
||||
* @param list 门店消息列表
|
||||
*/
|
||||
@Async("generalThreadPool")
|
||||
public void issueMessage(List<StoreMessageDO> list) {
|
||||
if (CollectionUtils.isEmpty(list)) return;
|
||||
log.info("下发即时通知, messageList:{}", JSONObject.toJSONString(list));
|
||||
try {
|
||||
Set<Long> messageTemplateIds = CollStreamUtil.toSet(list, StoreMessageDO::getMessageTemplateId);
|
||||
List<MessageTemplateDO> messageTemplateList = messageTemplateDAO.getByIds(new ArrayList<>(messageTemplateIds));
|
||||
Map<Long, MessageTemplateDO> messageTemplateMap = CollStreamUtil.toMap(messageTemplateList, MessageTemplateDO::getId, v -> v);
|
||||
|
||||
for (StoreMessageDO storeMessageDO : list) {
|
||||
if (StringUtils.isNotBlank(storeMessageDO.getOperatorList())) {
|
||||
String[] userIds = storeMessageDO.getOperatorList().split(",");
|
||||
if (ArrayUtil.isNotEmpty(userIds)) {
|
||||
MessageTemplateDO messageTemplateDO = messageTemplateMap.get(storeMessageDO.getMessageTemplateId());
|
||||
if (Objects.isNull(messageTemplateDO)) {
|
||||
throw new ServiceException(ErrorCodeEnum.MESSAGE_NOT_EXIST);
|
||||
}
|
||||
StoreMessageVO storeMessageVO = BeanUtil.toBean(storeMessageDO, StoreMessageVO.class);
|
||||
BeanUtil.copyProperties(messageTemplateDO, storeMessageVO, "id");
|
||||
String message = JSONObject.toJSONString(storeMessageVO);
|
||||
for (String userId : userIds) {
|
||||
try {
|
||||
simpMessagingTemplate.convertAndSend("/queue/message/" + userId, message);
|
||||
} catch (MessagingException e) {
|
||||
log.info("即时通知下发异常, userId:{}, error:{}", userId, e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.info("即时通知下发异常", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package com.cool.store.service.impl;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.context.PartnerUserHolder;
|
||||
import com.cool.store.dao.*;
|
||||
import com.cool.store.dto.notice.CommonDTO;
|
||||
import com.cool.store.dto.notice.MessageTemplateCountDTO;
|
||||
@@ -26,11 +25,9 @@ import com.cool.store.vo.PartnerUserInfoVO;
|
||||
import com.cool.store.vo.notice.*;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.core.task.TaskExecutor;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
@@ -73,6 +70,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
|
||||
RedisUtilPool redisUtilPool;
|
||||
@Resource
|
||||
TaskExecutor noticeThreadPool;
|
||||
@Resource
|
||||
MessageIssueService messageIssueService;
|
||||
|
||||
|
||||
|
||||
@@ -178,6 +177,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
|
||||
List<StoreAreaDTO> storeAreaDTOS = getStoreRange(request.getStoreInfoList());
|
||||
List<String> storeIds = storeAreaDTOS.stream().map(StoreAreaDTO::getStoreId).collect(Collectors.toList());
|
||||
Map<String, List<String>> authUser = getAuthUser(request.getUserInfoList(), storeIds);
|
||||
List<StoreMessageDO> realtimeMessageList = new ArrayList<>();
|
||||
list.stream().forEach(x -> {
|
||||
List<StoreMessageDO> result = new ArrayList<>();
|
||||
storeAreaDTOS.forEach(y->{
|
||||
@@ -199,6 +199,9 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
|
||||
result.add(storeMessageDO);
|
||||
});
|
||||
storeMessageDAO.batchInsert(result);
|
||||
if (MatterTypeEnum.REALTIME.getCode().equals(request.getMatterType())) {
|
||||
realtimeMessageList.addAll(result);
|
||||
}
|
||||
});
|
||||
|
||||
//存在第一个成功 第二个失败 会有问题 todo
|
||||
@@ -207,6 +210,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
|
||||
JSONObject.toJSONString(request.getStoreInfoList()),
|
||||
JSONObject.toJSONString(request.getUserInfoList()),
|
||||
userId);
|
||||
// 即时消息下发
|
||||
messageIssueService.issueMessage(realtimeMessageList);
|
||||
} catch (Exception e) {
|
||||
log.info("发布流程异常,已取消发布");
|
||||
} finally {
|
||||
@@ -357,6 +362,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService {
|
||||
batchPublishRequest.setIds(Arrays.asList(messageTemplateDO.getId()));
|
||||
batchPublishRequest.setStoreInfoList(JSONObject.parseArray(storeInfo, CommonDTO.class));
|
||||
batchPublishRequest.setUserInfoList(JSONObject.parseArray(userInfo, CommonDTO.class));
|
||||
batchPublishRequest.setMatterType(matterConfig.getMatterType());
|
||||
try {
|
||||
batchPublishMessageTemplate(batchPublishRequest,"");
|
||||
} catch (ServiceException e) {
|
||||
|
||||
@@ -160,6 +160,9 @@ public class SyncMainSysServerImpl implements SyncMainSysServer {
|
||||
PointDetailInfoDO pointDetail = pointDetailDAO.getPointDetailInfoByPointId(shopInfo.getPointId());
|
||||
if (info != null){
|
||||
storeMasterDTO.setArea(info.getProvince()+info.getCity()+info.getDistrict());
|
||||
storeMasterDTO.setProvince(info.getProvince());
|
||||
storeMasterDTO.setCity(info.getCity());
|
||||
storeMasterDTO.setDistrict(info.getDistrict());
|
||||
storeMasterDTO.setTown(info.getTownship());
|
||||
storeMasterDTO.setStoreAddress(info.getAddress());
|
||||
storeMasterDTO.setLocationAddress(info.getAddress());
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
package com.cool.store.service.login;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.constants.CommonConstants;
|
||||
import com.cool.store.constants.RedisConstant;
|
||||
import com.cool.store.context.CurrentUserHolder;
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.dao.EnterpriseUserDAO;
|
||||
import com.cool.store.dto.login.UserLoginDTO;
|
||||
import com.cool.store.dto.login.UserRefreshLoginDTO;
|
||||
import com.cool.store.entity.EnterpriseUserDO;
|
||||
import com.cool.store.entity.login.UserLoginDO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.response.ResponseResult;
|
||||
import com.cool.store.service.EnterpriseService;
|
||||
import com.cool.store.userholder.CurrentUser;
|
||||
import com.cool.store.userholder.RefreshUser;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.utils.poi.constant.Constants;
|
||||
import com.cool.store.vo.login.UserBaseInfoVO;
|
||||
import com.cool.store.vo.login.UserLoginVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.MessageFormat;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 登录基础服务类
|
||||
* </p>
|
||||
*
|
||||
* @author wangff
|
||||
* @since 2025/9/3
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public abstract class LoginBaseService implements LoginStrategy {
|
||||
@Resource
|
||||
private RedisUtilPool redisUtilPool;
|
||||
@Resource
|
||||
private EnterpriseUserDAO enterpriseUserDAO;
|
||||
@Resource
|
||||
private EnterpriseService enterpriseService;
|
||||
|
||||
/**
|
||||
* 策略登录实现方法
|
||||
*/
|
||||
public abstract ResponseResult userLogin(UserLoginDTO param, UserLoginDO userLoginDO);
|
||||
|
||||
@Override
|
||||
public ResponseResult login(UserLoginDTO param) {
|
||||
log.info("login:{}", JSONObject.toJSONString(param));
|
||||
String errorPasswordCountKey = MessageFormat.format(RedisConstant.ERROR_PASSWORD_COUNT_KEY, LocalDate.now(), param.getMobile());
|
||||
String errorCount = redisUtilPool.getString(errorPasswordCountKey);
|
||||
//判断密码错误次数
|
||||
if (StringUtils.isNotBlank(errorCount)) {
|
||||
if (Integer.parseInt(errorCount) >= CommonConstants.MAX_ERROR_PASSWORD_COUNT) {
|
||||
return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MAX_COUNT, errorCount);
|
||||
}
|
||||
}
|
||||
EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(param.getMobile());
|
||||
UserLoginDO userLoginDO = enterpriseUserDAO.getUserLoginByUnionid(enterpriseUserDO.getUnionid());
|
||||
return userLogin(param, userLoginDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResponseResult refreshLogin(UserRefreshLoginDTO param) {
|
||||
String refreshTokenKey = RedisConstant.REFRESH_TOKEN_PREFIX + param.getRefreshToken();
|
||||
String refreshUserStr = redisUtilPool.getString(refreshTokenKey);
|
||||
if (StringUtils.isBlank(refreshUserStr)) {
|
||||
return ResponseResult.fail(ErrorCodeEnum.REFRESH_TOKEN_INVALID);
|
||||
}
|
||||
RefreshUser refreshUser = JSONObject.parseObject(refreshUserStr, RefreshUser.class);
|
||||
if (StringUtils.isBlank(refreshUser.getMobile())) {
|
||||
return ResponseResult.fail(ErrorCodeEnum.REFRESH_TOKEN_INVALID);
|
||||
}
|
||||
UserLoginDO userLoginDO = new UserLoginDO(refreshUser.getUserId(), refreshUser.getMobile(), null);
|
||||
return ResponseResult.success(getUserLoginInfo(userLoginDO));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResponseResult logout() {
|
||||
LoginUserInfo currentUser = CurrentUserHolder.getUser();
|
||||
String accessToken = currentUser.getAccessToken();
|
||||
String key = RedisConstant.ACCESS_TOKEN_PREFIX + accessToken;
|
||||
redisUtilPool.delKey(key);
|
||||
return ResponseResult.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取登录accessToken
|
||||
*
|
||||
* @param userLoginDO 用户登录信息
|
||||
* @return accessToken
|
||||
*/
|
||||
public UserLoginVO getUserLoginInfo(UserLoginDO userLoginDO) {
|
||||
CurrentUser currentUser = enterpriseService.getLoginInfo(userLoginDO.getMobile());
|
||||
UserBaseInfoVO userBAseInfoVO = BeanUtil.toBean(currentUser, UserBaseInfoVO.class);
|
||||
RefreshUser refreshUser = enterpriseService.getRefreshUser(userLoginDO.getUserId(), userLoginDO.getMobile());
|
||||
return new UserLoginVO(currentUser.getAccessToken(), refreshUser.getRefreshToken(), CommonConstants.ACTION_TOKEN_EXPIRE, userBAseInfoVO);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.cool.store.service.login;
|
||||
|
||||
import com.cool.store.dto.login.UserLoginDTO;
|
||||
import com.cool.store.dto.login.UserRefreshLoginDTO;
|
||||
import com.cool.store.response.ResponseResult;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 登录策略
|
||||
* </p>
|
||||
*
|
||||
* @author wangff
|
||||
* @since 2025/9/3
|
||||
*/
|
||||
public interface LoginStrategy {
|
||||
/**
|
||||
* 登录基础方法
|
||||
*/
|
||||
ResponseResult login(UserLoginDTO param);
|
||||
|
||||
/**
|
||||
* refreshToken登录
|
||||
*/
|
||||
ResponseResult refreshLogin(UserRefreshLoginDTO param);
|
||||
|
||||
/**
|
||||
* 登出
|
||||
*/
|
||||
ResponseResult logout();
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.cool.store.service.login.impl;
|
||||
|
||||
import com.aliyun.core.utils.StringUtils;
|
||||
import com.cool.store.constants.CommonConstants;
|
||||
import com.cool.store.constants.RedisConstant;
|
||||
import com.cool.store.dto.login.UserLoginDTO;
|
||||
import com.cool.store.entity.login.UserLoginDO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.response.ResponseResult;
|
||||
import com.cool.store.service.login.LoginBaseService;
|
||||
import com.cool.store.utils.Md5Utils;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.utils.poi.constant.Constants;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 密码登录服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author wangff
|
||||
* @since 2025/9/4
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class PasswordLoginServiceImpl extends LoginBaseService {
|
||||
private final RedisUtilPool redisUtilPool;
|
||||
|
||||
@Override
|
||||
public ResponseResult userLogin(UserLoginDTO param, UserLoginDO userLoginDO) {
|
||||
if (StringUtils.isBlank(param.getPassword())) {
|
||||
return ResponseResult.fail(ErrorCodeEnum.PASSWORD_MISSING);
|
||||
}
|
||||
if (StringUtils.isBlank(userLoginDO.getPassword())) {
|
||||
return ResponseResult.fail(ErrorCodeEnum.IMPROVE_USER_INFO);
|
||||
}
|
||||
String password = Md5Utils.md5(param.getPassword() + CommonConstants.USER_AUTH_KEY);
|
||||
if (!password.equals(userLoginDO.getPassword())) {
|
||||
String errorPasswordCountKey = MessageFormat.format(RedisConstant.ERROR_PASSWORD_COUNT_KEY, LocalDate.now(), param.getMobile());
|
||||
Long errorNum = redisUtilPool.incrby(errorPasswordCountKey, 1);
|
||||
redisUtilPool.expire(errorPasswordCountKey, 24 * 60 * 60);
|
||||
if(errorNum == 1){
|
||||
return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR);
|
||||
}
|
||||
return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MULTI, errorNum.toString());
|
||||
}
|
||||
return ResponseResult.success(getUserLoginInfo(userLoginDO));
|
||||
}
|
||||
}
|
||||
@@ -220,6 +220,4 @@ public class Constants
|
||||
|
||||
public static final String WANG_LEI_JOB_NUMBER = "19060164";
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user