From 435b24be48df3072fb0576a2946fdd366a1ff851 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 4 Sep 2025 14:19:08 +0800 Subject: [PATCH 01/21] =?UTF-8?q?fix:=E6=96=B0=E5=A2=9E=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=BA=93=E6=95=B0=E6=8D=AE=E6=BA=90=20feat:=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=B4=A6=E5=AF=86=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/annotation/PlatformDB.java | 14 ++++ .../datasource/DataSourceContextHolder.java | 25 +++++++ .../store/datasource/DynamicDataSource.java | 53 +++++++++++++++ .../com/cool/store/enums/ErrorCodeEnum.java | 5 ++ .../com/cool/store/enums/LoginTypeEnum.java | 25 +++++++ .../java/com/cool/store/utils/BeanUtil.java | 41 +++++++++++ .../cool/store/utils/SpringContextUtil.java | 34 ++++++++++ .../com/cool/store/dao/EnterpriseUserDAO.java | 11 ++- .../store/mapper/EnterpriseUserMapper.java | 10 +++ .../resources/mapper/EnterpriseUserMapper.xml | 6 ++ .../cool/store/dto/login/UserLoginDTO.java | 27 ++++++++ .../cool/store/entity/login/UserLoginDO.java | 33 +++++++++ .../com/cool/store/vo/login/UserLoginVO.java | 35 ++++++++++ .../cool/store/aspect/DataSourceAspect.java | 37 ++++++++++ .../store/service/login/LoginBaseService.java | 68 +++++++++++++++++++ .../store/service/login/LoginStrategy.java | 21 ++++++ .../login/impl/PasswordLoginServiceImpl.java | 54 +++++++++++++++ .../store/utils/poi/constant/Constants.java | 9 ++- .../com/cool/store/PartnerWebApplication.java | 12 ++++ .../cool/store/config/SignValidateFilter.java | 3 +- .../store/config/TokenValidateFilter.java | 3 +- .../controller/webb/LoginController.java | 31 +++++++++ .../resources/application-local.properties | 9 +++ 23 files changed, 562 insertions(+), 4 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java b/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java new file mode 100644 index 000000000..6b1b91fac --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java @@ -0,0 +1,14 @@ +package com.cool.store.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 平台库数据源 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface PlatformDB { +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java new file mode 100644 index 000000000..dd0b32ff0 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java @@ -0,0 +1,25 @@ +package com.cool.store.datasource; + +/** + *

+ * 数据源上下文 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +public class DataSourceContextHolder { + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static void setDataSourceType(String dataSourceType) { + contextHolder.set(dataSourceType); + } + + public static String getDataSourceType() { + return contextHolder.get(); + } + + public static void clearDataSourceType() { + contextHolder.remove(); + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java new file mode 100644 index 000000000..66bf25663 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java @@ -0,0 +1,53 @@ +package com.cool.store.datasource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.AbstractDataSource; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +/** + *

+ * 动态数据源 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Component +@Primary +public class DynamicDataSource extends AbstractDataSource { + + @Autowired + private DataSource defaultDataSource; + + @Autowired + private DataSource platformDataSource; + + @Override + public Connection getConnection() throws SQLException { + DataSource currentDB = getCurrentDB(); + return currentDB.getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + DataSource currentDB = getCurrentDB(); + Connection connection = currentDB.getConnection(username, password); + connection.setCatalog(DataSourceContextHolder.getDataSourceType()); + return connection; + } + + protected DataSource getCurrentDB() { + String dbName = DataSourceContextHolder.getDataSourceType(); + if (StringUtils.isBlank(dbName)) { + return defaultDataSource; + } + return platformDataSource; + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index daa073f85..1e618d8e2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -62,6 +62,11 @@ public enum ErrorCodeEnum { DATA_CONVERT_ERROR(400002, "日期转换异常!", null), PARENT_NODE_NOT_EXIST(400002, "父节点不存在", null), LOGIN_ERROR_MOBILE_ERROR(418, "登录失败 获取手机号失败!!", null), + PASSWORD_ERROR_MAX_COUNT(1021084, "密码错误{0}次,今日账号已锁定",null), + PASSWORD_MISSING(1021085, "密码不能为空!",null), + IMPROVE_USER_INFO(1021086,"请联系管理员,完善用户信息!",null), + PASSWORD_ERROR(1021087, "密码输入错误",null), + PASSWORD_ERROR_MULTI(1021088, "密码错误{0}次,请使用验证码登录",null), //红圈通 HQT_SHOP_DECORATION_ATTRIBUTES(1022000, "获取红圈通装修属性错误", null), HQT_PARAMS_ERROR(1022001, "构建红圈通请求参数错误", null), diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java new file mode 100644 index 000000000..f7b95f109 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java @@ -0,0 +1,25 @@ +package com.cool.store.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 登录类型 枚举类 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Getter +@AllArgsConstructor +public enum LoginTypeEnum { + + PASSWORD("账号密码", "passwordLoginServiceImpl"), + + ; + + private final String message; + + private final String clazzName; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java new file mode 100644 index 000000000..7838c1fd5 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java @@ -0,0 +1,41 @@ +package com.cool.store.utils; + +import com.github.pagehelper.PageInfo; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + *

+ * bean转换工具 + *

+ * + * @author wangff + * @since 2025/3/6 + */ +public class BeanUtil extends cn.hutool.core.bean.BeanUtil { + + public static List toList(List list, Class clazz) { + if (list == null || list.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(list.size()); + for (T t : list) { + R r = toBean(t, clazz); + result.add(r); + } + return result; + } + + public static PageInfo toPage(PageInfo page, Class clazz) { + PageInfo newPage = new PageInfo<>(); + newPage.setPages(page.getPages()); + newPage.setTotal(page.getTotal()); + newPage.setPageNum(page.getPageNum()); + newPage.setPageSize(page.getPageSize()); + List list = toList(page.getList(), clazz); + newPage.setList(list); + return newPage; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java new file mode 100644 index 000000000..183f34d94 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java @@ -0,0 +1,34 @@ +package com.cool.store.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + *

+ * Spring上下文工具 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Component +public class SpringContextUtil implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + /** + * 获取bean + * @param name beanName + * @param clazz bean类型 + * @return bean + */ + public static T getBean(String name, Class clazz) { + return applicationContext.getBean(name, clazz); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java index 08d2edf1a..8c2dc3e41 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java @@ -4,8 +4,8 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.dto.UserDTO; import com.cool.store.dto.openPreparation.UserNameDTO; import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; import com.cool.store.mapper.EnterpriseUserMapper; -import com.cool.store.response.oppty.UserResponse; import com.cool.store.utils.StringUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; @@ -175,4 +175,13 @@ public class EnterpriseUserDAO { } return enterpriseUserMapper.searchUserByUserIdsAndKeyword(userIdList, keyword); } + + /** + * 从平台库根据唯一id获取用户登录信息 + * @param unionid 唯一id + * @return 用户登录信息 + */ + public UserLoginDO getUserLoginByUnionid(String unionid) { + return enterpriseUserMapper.getUserLoginByUnionid(unionid); + } } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java index 9a867adcb..ff36560ee 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java @@ -1,8 +1,10 @@ package com.cool.store.mapper; +import com.cool.store.annotation.PlatformDB; import com.cool.store.dto.UserDTO; import com.cool.store.dto.openPreparation.UserNameDTO; import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -103,4 +105,12 @@ public interface EnterpriseUserMapper { List searchUserByUserIdsAndKeyword( @Param("userIdList") List userIdList, @Param("keyword") String keyword); List getUserIdsByRegionIdList( @Param("regionIdList") List regionIdList); + + /** + * 从平台库根据唯一id获取用户登录信息 + * @param unionid 唯一id + * @return 用户登录信息 + */ + @PlatformDB + UserLoginDO getUserLoginByUnionid(@Param("unionid") String unionid); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml index cacda592c..d57936709 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml @@ -229,4 +229,10 @@ + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java new file mode 100644 index 000000000..e309d2826 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto.login; + +import com.cool.store.enums.LoginTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 登录DTO + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Data +public class UserLoginDTO { + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("密码") + private String password; + + @NotNull(message = "登录类型不能为空") + private LoginTypeEnum loginType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java new file mode 100644 index 000000000..c8965d44b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java @@ -0,0 +1,33 @@ +package com.cool.store.entity.login; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 用户登录信息 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserLoginDO { + /** + * 用户id + */ + private String userId; + + /** + * 手机号 + */ + private String mobile; + + /** + * 密码 + */ + private String password; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java new file mode 100644 index 000000000..2b068a6e1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java @@ -0,0 +1,35 @@ +package com.cool.store.vo.login; + +import com.cool.store.vo.point.UserBaseInfoVO; +import lombok.Data; + +/** + *

+ * 用户登录VO + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Data +public class UserLoginVO { + /** + * 登录token + */ + private String accessToken; + + /** + * 刷新token + */ + private String refreshToken; + + /** + * 是否需要完善用户信息 + */ + private Boolean isNeedImproveUserInfo; + + /** + * 用户信息 + */ + private UserBaseInfoVO userInfo; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java b/coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java new file mode 100644 index 000000000..87e0f0a85 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java @@ -0,0 +1,37 @@ +package com.cool.store.aspect; + +import com.cool.store.annotation.PlatformDB; +import com.cool.store.datasource.DataSourceContextHolder; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +/** + *

+ * 数据源切换 切面 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Aspect +@Component +public class DataSourceAspect { + + @Before("@annotation(platformDB)") + public void before(PlatformDB platformDB) { + DataSourceContextHolder.setDataSourceType("platform"); + } + + @After("@annotation(platformDB)") + public void after(PlatformDB platformDB) { + DataSourceContextHolder.clearDataSourceType(); + } + + @AfterThrowing("@annotation(platformDB)") + public void afterThrowing(PlatformDB platformDB) { + DataSourceContextHolder.clearDataSourceType(); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java new file mode 100644 index 000000000..adc7698d9 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java @@ -0,0 +1,68 @@ +package com.cool.store.service.login; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.RedisConstant; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dto.login.UserLoginDTO; +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.utils.RedisUtilPool; +import com.cool.store.utils.poi.constant.Constants; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.time.LocalDate; + +/** + *

+ * 登录基础服务类 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Slf4j +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) >= Constants.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); + } + + /** + * 获取登录accessToken + * + * @param userLoginDO 用户登录信息 + * @return accessToken + */ + public String getAccessToken(UserLoginDO userLoginDO) { + return enterpriseService.getAccessToken(userLoginDO.getMobile()); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java new file mode 100644 index 000000000..32e475fd7 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java @@ -0,0 +1,21 @@ +package com.cool.store.service.login; + +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.response.ResponseResult; + +/** + *

+ * 登录策略 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +public interface LoginStrategy { + /** + * 登录基础方法 + * @param param + * @return + */ + ResponseResult login(UserLoginDTO param); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java new file mode 100644 index 000000000..fa7ee68d8 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java @@ -0,0 +1,54 @@ +package com.cool.store.service.login.impl; + +import com.aliyun.core.utils.StringUtils; +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; + +/** + *

+ * 密码登录服务实现类 + *

+ * + * @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() + Constants.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(getAccessToken(userLoginDO)); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java index f4262d9e7..951651be2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java @@ -220,6 +220,13 @@ public class Constants public static final String WANG_LEI_JOB_NUMBER = "19060164"; + /** + * 密码最大错误次数 + */ + public static final int MAX_ERROR_PASSWORD_COUNT = 5; - + /** + * 用户密码 + */ + public static final String USER_AUTH_KEY = "user_auth_key"; } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java b/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java index 9f1f66664..05d745b0d 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java @@ -40,4 +40,16 @@ public class PartnerWebApplication { return defaultDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); } + @Bean + @ConfigurationProperties("platform.datasource") + public DataSourceProperties platformDataSourceProperties() { + return new DataSourceProperties(); + } + + @Bean + @ConfigurationProperties("spring.datasource.hikari") + public DataSource platformDataSource() { + return platformDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); + } + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java index d96af4e4a..0f8fda754 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java @@ -59,7 +59,8 @@ public class SignValidateFilter implements Filter { "/zxjp/mini/program/v1/partnerManage/openArea/areaApplyQuery", "/zxjp/**/api/audit/result", "/zxjp/**/api/license", - "/zxjp/mini/line/getRegionPayPic" + "/zxjp/mini/line/getRegionPayPic", + "/zxjp/v3/login/accountLogin" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java index 2115f4f26..4e0abfa8f 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java @@ -52,7 +52,8 @@ public class TokenValidateFilter implements Filter { "/zxjp/pc/sysRole/**", "/zxjp/**/api/audit/result", "/zxjp/pc/video/**", - "/zxjp/**/api/license" + "/zxjp/**/api/license", + "/zxjp/v3/login/accountLogin" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java new file mode 100644 index 000000000..5a1fd1f7f --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java @@ -0,0 +1,31 @@ +package com.cool.store.controller.webb; + +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.login.LoginStrategy; +import com.cool.store.utils.SpringContextUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 登录 前端控制器 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Api(tags = "登录") +@RestController +@RequestMapping("/v3/login") +@RequiredArgsConstructor +public class LoginController { + + @ApiOperation("账号密码登录") + @PostMapping("/accountLogin") + public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { + return SpringContextUtil.getBean(param.getLoginType().getClazzName(), LoginStrategy.class).login(param); + } +} diff --git a/coolstore-partner-web/src/main/resources/application-local.properties b/coolstore-partner-web/src/main/resources/application-local.properties index 12948da5d..5f2552622 100644 --- a/coolstore-partner-web/src/main/resources/application-local.properties +++ b/coolstore-partner-web/src/main/resources/application-local.properties @@ -4,6 +4,10 @@ default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3 default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege-open.redis.rds.aliyuncs.com:6379/0 @@ -133,3 +137,8 @@ special.user.id=wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAA0TC8mkCJeXouw94hYA-D3 ask.bot.url=https://test.auth.wx.askbot.cn +hqt.token.url=https://tc.cloud.hecom.cn +hqt.token.username=18161486722 +hqt.token.grant_type=client_credentials +hqt.token.client.id=WrPffdGpcWkcPsbN +hqt.token.client.secret=rYe9Cwug5LwQNIBJAiW0a7weF9CAhYCD \ No newline at end of file From 5258badf9191bef0fa7e2c22adf97459ba0ef7a4 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 4 Sep 2025 14:26:26 +0800 Subject: [PATCH 02/21] =?UTF-8?q?fix:=E5=8A=A8=E6=80=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=88=87=E9=9D=A2=E6=89=80=E5=9C=A8=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/cool/store/aspect/DataSourceAspect.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {coolstore-partner-service => coolstore-partner-web}/src/main/java/com/cool/store/aspect/DataSourceAspect.java (100%) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java b/coolstore-partner-web/src/main/java/com/cool/store/aspect/DataSourceAspect.java similarity index 100% rename from coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java rename to coolstore-partner-web/src/main/java/com/cool/store/aspect/DataSourceAspect.java From f4cbe548c786400585362532b20b4ed3fc3bb326 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 4 Sep 2025 14:33:00 +0800 Subject: [PATCH 03/21] =?UTF-8?q?fix:=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-ab.properties | 4 ++++ .../src/main/resources/application-online.properties | 4 ++++ .../src/main/resources/application.properties | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/coolstore-partner-web/src/main/resources/application-ab.properties b/coolstore-partner-web/src/main/resources/application-ab.properties index bbeda82e7..32926a6bd 100644 --- a/coolstore-partner-web/src/main/resources/application-ab.properties +++ b/coolstore-partner-web/src/main/resources/application-ab.properties @@ -4,6 +4,10 @@ default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3 default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 diff --git a/coolstore-partner-web/src/main/resources/application-online.properties b/coolstore-partner-web/src/main/resources/application-online.properties index ae1f91591..68a6ddb0e 100644 --- a/coolstore-partner-web/src/main/resources/application-online.properties +++ b/coolstore-partner-web/src/main/resources/application-online.properties @@ -3,6 +3,10 @@ default.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coo default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +default.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 diff --git a/coolstore-partner-web/src/main/resources/application.properties b/coolstore-partner-web/src/main/resources/application.properties index 81fd7fbd4..57c1d3cab 100644 --- a/coolstore-partner-web/src/main/resources/application.properties +++ b/coolstore-partner-web/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.application.name=zxjp-web -spring.profiles.active=@profileActive@ +spring.profiles.active=local server.port=40300 server.servlet.context-path=/zxjp From d7b9f20f1f703145bc71da61b83ca62b57c9fd58 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 4 Sep 2025 14:34:25 +0800 Subject: [PATCH 04/21] =?UTF-8?q?fix:=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coolstore-partner-web/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolstore-partner-web/src/main/resources/application.properties b/coolstore-partner-web/src/main/resources/application.properties index 57c1d3cab..81fd7fbd4 100644 --- a/coolstore-partner-web/src/main/resources/application.properties +++ b/coolstore-partner-web/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.application.name=zxjp-web -spring.profiles.active=local +spring.profiles.active=@profileActive@ server.port=40300 server.servlet.context-path=/zxjp From 514af329ac90931e3a98ea693a46c7d893a1658a Mon Sep 17 00:00:00 2001 From: wangff Date: Fri, 5 Sep 2025 14:53:32 +0800 Subject: [PATCH 05/21] =?UTF-8?q?fix:=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E4=BF=AE=E6=94=B9=20feat:=E6=96=B0?= =?UTF-8?q?=E5=A2=9Erefresh=E7=99=BB=E5=BD=95=EF=BC=9B=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=99=BB=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/enums/ErrorCodeEnum.java | 1 + .../store/dto/login/UserRefreshLoginDTO.java | 18 ++++++++ .../cool/store/userholder/RefreshUser.java | 33 +++++++++++++++ .../cool/store/vo/login/UserBaseInfoVO.java | 35 ++++++++++++++++ .../com/cool/store/vo/login/UserLoginVO.java | 11 +++-- .../cool/store/service/EnterpriseService.java | 10 ++++- .../service/impl/EnterpriseServiceImpl.java | 20 +++++++-- .../store/service/login/LoginBaseService.java | 41 ++++++++++++++++++- .../store/service/login/LoginStrategy.java | 13 +++++- .../login/impl/PasswordLoginServiceImpl.java | 2 +- .../store/utils/poi/constant/Constants.java | 10 +++++ .../cool/store/config/SignValidateFilter.java | 3 +- .../store/config/TokenValidateFilter.java | 3 +- .../controller/webb/LoginController.java | 17 +++++++- .../webc/MiniShopAccountController.java | 3 +- 15 files changed, 200 insertions(+), 20 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserRefreshLoginDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/userholder/RefreshUser.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserBaseInfoVO.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 1e618d8e2..88b098128 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -40,6 +40,7 @@ public enum ErrorCodeEnum { LOGIN_ERROR(400004, "登录失败", null), ENTERPRISE_INIT(400006, "企业正在初始化,请稍后访问!",null), NOT_AUTH(400007, "暂无权限,请联系管理员!", null), + REFRESH_TOKEN_INVALID(400008, "refresh token invalid", null), USER_FREEZE(1021019,"账号被冻结,请联系管理员",null), ENTERPRISE_NOT_EXIST(1021020,"企业不存在",null), USER_NOT_EXIST(1021021,"用户不存在",null), diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserRefreshLoginDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserRefreshLoginDTO.java new file mode 100644 index 000000000..acfa484c3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserRefreshLoginDTO.java @@ -0,0 +1,18 @@ +package com.cool.store.dto.login; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * RefreshToken登录DTO + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Data +public class UserRefreshLoginDTO { + @ApiModelProperty("RefreshToken") + private String refreshToken; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/userholder/RefreshUser.java b/coolstore-partner-model/src/main/java/com/cool/store/userholder/RefreshUser.java new file mode 100644 index 000000000..b8a84fc0f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/userholder/RefreshUser.java @@ -0,0 +1,33 @@ +package com.cool.store.userholder; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * RefreshToken用户信息 + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RefreshUser { + /** + * 用户Id + */ + private String userId; + + /** + * RefreshToken + */ + private String refreshToken; + + /** + * 手机号 + */ + private String mobile; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserBaseInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserBaseInfoVO.java new file mode 100644 index 000000000..cceaadf5c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserBaseInfoVO.java @@ -0,0 +1,35 @@ +package com.cool.store.vo.login; + +import com.cool.store.entity.SysRoleDO; +import lombok.Data; + +/** + *

+ * 登录用户基本信息VO + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Data +public class UserBaseInfoVO { + private String id; + + private String userId; + + private String name; + + private Boolean isAdmin; + + private String mobile; + + private String email; + + private String avatar; + + private String roles; + + private String language; + + private SysRoleDO sysRoleDO; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java index 2b068a6e1..ac6370bdb 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java @@ -1,7 +1,8 @@ package com.cool.store.vo.login; -import com.cool.store.vo.point.UserBaseInfoVO; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; /** *

@@ -12,6 +13,8 @@ import lombok.Data; * @since 2025/9/4 */ @Data +@AllArgsConstructor +@NoArgsConstructor public class UserLoginVO { /** * 登录token @@ -24,12 +27,12 @@ public class UserLoginVO { private String refreshToken; /** - * 是否需要完善用户信息 + * accessToken过期时间 */ - private Boolean isNeedImproveUserInfo; + private Integer expire; /** * 用户信息 */ - private UserBaseInfoVO userInfo; + private UserBaseInfoVO user; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java index f00f75d0b..2fb88f946 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java @@ -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); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java index 7f5c7ac66..0f07a2505 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java @@ -12,8 +12,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 +50,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 +109,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), Constants.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), Constants.REFRESH_TOKEN_EXPIRE); + return refreshUser; } public static void main(String[] args) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java index adc7698d9..1243c733c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java @@ -1,18 +1,27 @@ package com.cool.store.service.login; +import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSONObject; 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; @@ -27,6 +36,7 @@ import java.time.LocalDate; * @since 2025/9/3 */ @Slf4j +@Service public abstract class LoginBaseService implements LoginStrategy { @Resource private RedisUtilPool redisUtilPool; @@ -56,13 +66,40 @@ public abstract class LoginBaseService implements LoginStrategy { 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 String getAccessToken(UserLoginDO userLoginDO) { - return enterpriseService.getAccessToken(userLoginDO.getMobile()); + 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(), Constants.ACTION_TOKEN_EXPIRE, userBAseInfoVO); } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java index 32e475fd7..fefd75d54 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java @@ -1,6 +1,7 @@ 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; /** @@ -14,8 +15,16 @@ import com.cool.store.response.ResponseResult; public interface LoginStrategy { /** * 登录基础方法 - * @param param - * @return */ ResponseResult login(UserLoginDTO param); + + /** + * refreshToken登录 + */ + ResponseResult refreshLogin(UserRefreshLoginDTO param); + + /** + * 登出 + */ + ResponseResult logout(); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java index fa7ee68d8..31aba4bbf 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java @@ -49,6 +49,6 @@ public class PasswordLoginServiceImpl extends LoginBaseService { } return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MULTI, errorNum.toString()); } - return ResponseResult.success(getAccessToken(userLoginDO)); + return ResponseResult.success(getUserLoginInfo(userLoginDO)); } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java index 951651be2..1edc16ef9 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java @@ -229,4 +229,14 @@ public class Constants * 用户密码 */ public static final String USER_AUTH_KEY = "user_auth_key"; + + /** + * accessToken有效期,单位秒 + */ + public static final int ACTION_TOKEN_EXPIRE = 24 * 60 * 60; + + /** + * refreshToken有效期,单位秒 + */ + public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java index 0f8fda754..d96af4e4a 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java @@ -59,8 +59,7 @@ public class SignValidateFilter implements Filter { "/zxjp/mini/program/v1/partnerManage/openArea/areaApplyQuery", "/zxjp/**/api/audit/result", "/zxjp/**/api/license", - "/zxjp/mini/line/getRegionPayPic", - "/zxjp/v3/login/accountLogin" + "/zxjp/mini/line/getRegionPayPic" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java index 4e0abfa8f..801bc0028 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java @@ -53,7 +53,8 @@ public class TokenValidateFilter implements Filter { "/zxjp/**/api/audit/result", "/zxjp/pc/video/**", "/zxjp/**/api/license", - "/zxjp/v3/login/accountLogin" + "/zxjp/pc/v3/login/accountLogin", + "/zxjp/pc/v3/login/refreshLogin" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java index 5a1fd1f7f..630e0ecce 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java @@ -1,7 +1,9 @@ package com.cool.store.controller.webb; import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.dto.login.UserRefreshLoginDTO; import com.cool.store.response.ResponseResult; +import com.cool.store.service.login.LoginBaseService; import com.cool.store.service.login.LoginStrategy; import com.cool.store.utils.SpringContextUtil; import io.swagger.annotations.Api; @@ -19,13 +21,26 @@ import org.springframework.web.bind.annotation.*; */ @Api(tags = "登录") @RestController -@RequestMapping("/v3/login") +@RequestMapping("/pc/v3/login") @RequiredArgsConstructor public class LoginController { + private final LoginBaseService loginBaseService; @ApiOperation("账号密码登录") @PostMapping("/accountLogin") public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { return SpringContextUtil.getBean(param.getLoginType().getClazzName(), LoginStrategy.class).login(param); } + + @ApiOperation("refresh登录") + @PostMapping("/refreshLogin") + public ResponseResult refreshLogin(@RequestBody UserRefreshLoginDTO param) { + return loginBaseService.refreshLogin(param); + } + + @ApiOperation("登出") + @PostMapping("/logout") + public ResponseResult logout() { + return loginBaseService.logout(); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java index 0a8f5341a..e7982e7fa 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java @@ -8,7 +8,6 @@ import com.cool.store.dto.ShopAccount.ShopAccountDTO; import com.cool.store.request.GetPasswordDTO; import com.cool.store.response.ResponseResult; import com.cool.store.service.*; -import com.cool.store.vo.PartnerUserInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; @@ -95,7 +94,7 @@ public class MiniShopAccountController { @ApiOperation("获取标品登录token") @GetMapping("/getAccessToken") public ResponseResult getAccessToken() { - return ResponseResult.success(enterpriseService.getAccessToken(PartnerUserHolder.getUser().getMobile())); + return ResponseResult.success(enterpriseService.getLoginInfo(PartnerUserHolder.getUser().getMobile()).getAccessToken()); } } From d8cbb78c5d50c53934188276c64a56d37e6eb893 Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 8 Sep 2025 14:00:48 +0800 Subject: [PATCH 06/21] =?UTF-8?q?fix:=E5=8D=B3=E6=97=B6=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E9=80=9A=E8=BF=87STOMP=E4=B8=8B=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/constants/CommonConstants.java | 18 ++++ .../store/enums/notice/MatterTypeEnum.java | 1 + .../store/enums/notice/ModuleCodeEnum.java | 2 +- .../cool/store/enums/notice/SceneEnum.java | 1 + .../cool/store/executor/MdcTaskExecutor.java | 96 +++++++++++++++++++ .../store/executor/ThreadPoolTaskConfig.java | 45 +++++++++ .../request/notice/BatchPublishRequest.java | 2 + .../service/impl/EnterpriseServiceImpl.java | 5 +- .../service/impl/MessageIssueService.java | 78 +++++++++++++++ .../impl/MessageTemplateServiceImpl.java | 12 ++- .../store/service/login/LoginBaseService.java | 5 +- .../login/impl/PasswordLoginServiceImpl.java | 3 +- .../store/utils/poi/constant/Constants.java | 19 ---- coolstore-partner-web/pom.xml | 59 ++++++++++++ .../cool/store/config/SignValidateFilter.java | 3 +- .../store/config/TokenValidateFilter.java | 3 +- .../config/websocket/WebSocketConfig.java | 64 +++++++++++++ .../controller/webb/LoginController.java | 5 +- pom.xml | 2 +- 19 files changed, 390 insertions(+), 33 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index c54ae5efa..763b31618 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -201,5 +201,23 @@ public class CommonConstants { public static final String WX_SELF_AUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1#wechat_redirect"; + /** + * 密码最大错误次数 + */ + public static final int MAX_ERROR_PASSWORD_COUNT = 5; + /** + * 用户密码 + */ + public static final String USER_AUTH_KEY = "user_auth_key"; + + /** + * accessToken有效期,单位秒 + */ + public static final int ACTION_TOKEN_EXPIRE = 24 * 60 * 60; + + /** + * refreshToken有效期,单位秒 + */ + public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java index bcc9697d8..20dc79ba2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java @@ -14,6 +14,7 @@ public enum MatterTypeEnum { SERVICE_PACKAGE(4,"服务包"), RESTOCK(5,"补货"), INVENTORY(6,"盘点"), + REALTIME(7, "即时消息"), ; MatterTypeEnum(Integer code, String message) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java index 3bfa89f8a..aefa1d85c 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java @@ -16,7 +16,7 @@ public enum ModuleCodeEnum { DISH(3,"菜品",Arrays.asList(MatterTypeEnum.NOTICE)), FRANCHISE(4,"加盟",Arrays.asList(MatterTypeEnum.NOTICE)), //其他(投诉与客户服务、临时通知) - OTHER(5,"其他",Arrays.asList(MatterTypeEnum.NOTICE)), + OTHER(5,"其他",Arrays.asList(MatterTypeEnum.NOTICE, MatterTypeEnum.REALTIME)), ; ModuleCodeEnum(Integer code, String message,List matterTypeEnums) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java index d5fc87540..abeb053f0 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java @@ -18,6 +18,7 @@ public enum SceneEnum { RESTOCK(35, "补货", "", MatterTypeEnum.LOGISTICS), INVENTORY(40, "盘点", "", MatterTypeEnum.LOGISTICS), + REALTIME(45, "即时消息", "", MatterTypeEnum.REALTIME), ; private Integer sceneCode; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java b/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java new file mode 100644 index 000000000..3e6083657 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java @@ -0,0 +1,96 @@ +package com.cool.store.executor; + + +import com.cool.store.constants.CommonConstants; +import com.cool.store.utils.UUIDUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + + +/** + * @author zhangchenbiao + * @FileName: MdcTaskExecutor + * @Description: + * @date 2021-11-02 21:00 + */ +public class MdcTaskExecutor extends ThreadPoolTaskExecutor { + private Logger log = LoggerFactory.getLogger(MdcTaskExecutor.class); + + @Override + public Future submit(Callable task) { + Map context = MDC.getCopyOfContextMap(); + return super.submit(() -> { + T result; + if (context != null) { + //将父线程的MDC内容传给子线程 + MDC.setContextMap(context); + } + //直接给子线程设置MDC + setTraceIdIfAbsent(); + try { + //执行任务 + result = task.call(); + } finally { + log.info("ThreadMonitor:{}info:ExecutedTasks->{},totalTask->{}, RunningTasks->{}, PendingTasks->{},corePoolSize-{},currentPoolSize->{},LargestPoolSize->{}", + this.getThreadNamePrefix(),this.getThreadPoolExecutor().getCompletedTaskCount(),this.getThreadPoolExecutor().getTaskCount(), + this.getActiveCount(),this.getThreadPoolExecutor().getQueue().size(),this.getCorePoolSize(), + this.getPoolSize(),this.getThreadPoolExecutor().getLargestPoolSize()); + try { + MDC.clear(); + } catch (Exception e) { + log.warn("MDC clear exception", e); + } + } + return result; + }); + } + + @Override + public void execute(Runnable task) { + log.info("mdc thread pool task executor execute"); + Map context = MDC.getCopyOfContextMap(); + super.execute(() -> { + if (context != null) { + //将父线程的MDC内容传给子线程 + MDC.setContextMap(context); + } + //直接给子线程设置MDC + setTraceIdIfAbsent(); + try { + //执行任务 + task.run(); + } finally { + log.info("ThreadMonitor:{}info:ExecutedTasks->{},totalTask->{}, RunningTasks->{}, PendingTasks->{},corePoolSize-{},currentPoolSize->{},LargestPoolSize->{}", + this.getThreadNamePrefix(),this.getThreadPoolExecutor().getCompletedTaskCount(),this.getThreadPoolExecutor().getTaskCount(), + this.getActiveCount(),this.getThreadPoolExecutor().getQueue().size(),this.getCorePoolSize(), + this.getPoolSize(),this.getThreadPoolExecutor().getLargestPoolSize()); + try { + MDC.clear(); + } catch (Exception e) { + log.warn("MDC clear exception", e); + } + } + }); + } + + public static void setTraceIdIfAbsent() { + String key = CommonConstants.REQUEST_ID; + String value = UUIDUtils.get32UUID(); + String k = MDC.get(key); + if (StringUtils.isBlank(value)) { + value = UUID.randomUUID().toString().replace("-", ""); + } + + if (StringUtils.isBlank(k)) { + MDC.put(key, value); + } + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java new file mode 100644 index 000000000..75bc5a1b2 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java @@ -0,0 +1,45 @@ +package com.cool.store.executor; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + *

+ * 线程池配置类 + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Configuration +public class ThreadPoolTaskConfig { + + /** + * 通用线程池 + */ + @Bean + public TaskExecutor generalThreadPool() { + int cores = Runtime.getRuntime().availableProcessors(); + + ThreadPoolTaskExecutor executor = new MdcTaskExecutor(); + // 核心线程数目 + executor.setCorePoolSize(cores*2); + // 指定最大线程数 + executor.setMaxPoolSize(200); + // 队列中最大的数目 + executor.setQueueCapacity(5000); + // 线程名称前缀 + executor.setThreadNamePrefix("generalThreadPool_"); + // 对拒绝task的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 线程空闲后的最大存活时间 + executor.setKeepAliveSeconds(60); + // 加载 + executor.initialize(); + return executor; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java index 2d824e021..832d5c5bd 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java @@ -22,4 +22,6 @@ public class BatchPublishRequest { @ApiModelProperty( "默认处理人信息 type[person position userGroup organization]") List userInfoList; + @ApiModelProperty("事项类型") + private Integer matterType; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java index 0f07a2505..79b08e9d3 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java @@ -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; @@ -109,7 +110,7 @@ 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), Constants.ACTION_TOKEN_EXPIRE); + redisUtilPool.setString(RedisConstant.ACCESS_TOKEN_PREFIX + currentUser.getAccessToken(), JSON.toJSONString(currentUser), CommonConstants.ACTION_TOKEN_EXPIRE); return currentUser; } @@ -121,7 +122,7 @@ public class EnterpriseServiceImpl implements EnterpriseService { } String refreshToken = getToken(); RefreshUser refreshUser = new RefreshUser(userId, refreshToken, mobile); - redisUtilPool.setString(RedisConstant.REFRESH_TOKEN_PREFIX + refreshToken, JSON.toJSONString(refreshUser), Constants.REFRESH_TOKEN_EXPIRE); + redisUtilPool.setString(RedisConstant.REFRESH_TOKEN_PREFIX + refreshToken, JSON.toJSONString(refreshUser), CommonConstants.REFRESH_TOKEN_EXPIRE); return refreshUser; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java new file mode 100644 index 000000000..ba0231f7b --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java @@ -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.*; + +/** + *

+ * 消息下发 服务类 + *

+ * + * @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 list) { + if (CollectionUtils.isEmpty(list)) return; + log.info("下发即时通知, messageList:{}", JSONObject.toJSONString(list)); + try { + Set messageTemplateIds = CollStreamUtil.toSet(list, StoreMessageDO::getMessageTemplateId); + List messageTemplateList = messageTemplateDAO.getByIds(new ArrayList<>(messageTemplateIds)); + Map 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); + 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); + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java index 4f5b1021f..2ef067c5c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java @@ -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; @@ -25,11 +24,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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,6 +62,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { EnterpriseUserDAO enterpriseUserDAO; @Resource MatterConfigDAO matterConfigDAO; + @Resource + MessageIssueService messageIssueService; @@ -153,6 +152,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { log.info("未找到待发布消息模板"); } + List realtimeMessageList = new ArrayList<>(); list.stream().forEach(x -> { List result = new ArrayList<>(); storeAreaDTOS.forEach(y->{ @@ -174,6 +174,9 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { result.add(storeMessageDO); }); storeMessageDAO.batchInsert(result); + if (MatterTypeEnum.REALTIME.getCode().equals(request.getMatterType())) { + realtimeMessageList.addAll(result); + } }); List updateIds = list.stream().map(MessageTemplateDO::getId).collect(Collectors.toList()); @@ -181,6 +184,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { JSONObject.toJSONString(request.getStoreInfoList()), JSONObject.toJSONString(request.getUserInfoList()), userId); + // 即时消息下发 + messageIssueService.issueMessage(realtimeMessageList); return Boolean.TRUE; } @@ -271,6 +276,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) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java index 1243c733c..c7de70b03 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java @@ -2,6 +2,7 @@ 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; @@ -57,7 +58,7 @@ public abstract class LoginBaseService implements LoginStrategy { String errorCount = redisUtilPool.getString(errorPasswordCountKey); //判断密码错误次数 if (StringUtils.isNotBlank(errorCount)) { - if (Integer.parseInt(errorCount) >= Constants.MAX_ERROR_PASSWORD_COUNT) { + if (Integer.parseInt(errorCount) >= CommonConstants.MAX_ERROR_PASSWORD_COUNT) { return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MAX_COUNT, errorCount); } } @@ -100,6 +101,6 @@ public abstract class LoginBaseService implements LoginStrategy { 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(), Constants.ACTION_TOKEN_EXPIRE, userBAseInfoVO); + return new UserLoginVO(currentUser.getAccessToken(), refreshUser.getRefreshToken(), CommonConstants.ACTION_TOKEN_EXPIRE, userBAseInfoVO); } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java index 31aba4bbf..f863e543d 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java @@ -1,6 +1,7 @@ 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; @@ -39,7 +40,7 @@ public class PasswordLoginServiceImpl extends LoginBaseService { if (StringUtils.isBlank(userLoginDO.getPassword())) { return ResponseResult.fail(ErrorCodeEnum.IMPROVE_USER_INFO); } - String password = Md5Utils.md5(param.getPassword() + Constants.USER_AUTH_KEY); + 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); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java index 1edc16ef9..b08d231e6 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java @@ -220,23 +220,4 @@ public class Constants public static final String WANG_LEI_JOB_NUMBER = "19060164"; - /** - * 密码最大错误次数 - */ - public static final int MAX_ERROR_PASSWORD_COUNT = 5; - - /** - * 用户密码 - */ - public static final String USER_AUTH_KEY = "user_auth_key"; - - /** - * accessToken有效期,单位秒 - */ - public static final int ACTION_TOKEN_EXPIRE = 24 * 60 * 60; - - /** - * refreshToken有效期,单位秒 - */ - public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; } diff --git a/coolstore-partner-web/pom.xml b/coolstore-partner-web/pom.xml index 22e75fcb9..fe6d27e01 100644 --- a/coolstore-partner-web/pom.xml +++ b/coolstore-partner-web/pom.xml @@ -35,6 +35,65 @@ + + + dev + + dev + + + + dev2 + + dev2 + + + + local + + true + + + local + + + + test + + test + + + + test3 + + test3 + + + + ab + + ab + + + + online + + online + + + + hd + + hd + + + + zcb + + zcb + + + diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java index d96af4e4a..3442d8cfe 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java @@ -59,7 +59,8 @@ public class SignValidateFilter implements Filter { "/zxjp/mini/program/v1/partnerManage/openArea/areaApplyQuery", "/zxjp/**/api/audit/result", "/zxjp/**/api/license", - "/zxjp/mini/line/getRegionPayPic" + "/zxjp/mini/line/getRegionPayPic", + "/zxjp/ws/**" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java index 801bc0028..93d16ade2 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java @@ -54,7 +54,8 @@ public class TokenValidateFilter implements Filter { "/zxjp/pc/video/**", "/zxjp/**/api/license", "/zxjp/pc/v3/login/accountLogin", - "/zxjp/pc/v3/login/refreshLogin" + "/zxjp/pc/v3/login/refreshLogin", + "/zxjp/ws/**" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java new file mode 100644 index 000000000..77e5f8e56 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java @@ -0,0 +1,64 @@ +package com.cool.store.config.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.config.ChannelRegistration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.messaging.simp.stomp.StompCommand; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +/** + *

+ * WebSocket配置类 + *

+ * + * @author wangff + * @since 2025/9/2 + */ +@Configuration +@EnableWebSocketMessageBroker +@Slf4j +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws/zxzs") + .setAllowedOrigins("*") + .withSockJS(); // 启用SockJS支持 + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 配置消息代理 + registry.enableSimpleBroker("/topic", "/queue"); // 启用简单代理,用于广播和点对点消息 + registry.setApplicationDestinationPrefixes("/app"); // 设置应用程序端点前缀 +// registry.setUserDestinationPrefix("/user"); + } + +// @Override +// public void configureClientInboundChannel(ChannelRegistration registration) { +// registration.interceptors(new ChannelInterceptor() { +// @Override +// public Message preSend(Message message, MessageChannel channel) { +// StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); +// +// if (StompCommand.CONNECT.equals(accessor.getCommand())) { +// // 从STOMP头部获取login字段作为用户标识 +// String login = accessor.getLogin(); +// log.info("用户login:{}", login); +// if (login != null && !login.isEmpty()) { +// // 设置用户身份 +// accessor.setUser(() -> login); +// } +// } +// return message; +// } +// }); +// } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java index 630e0ecce..9eb1b27c7 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java @@ -6,6 +6,7 @@ import com.cool.store.response.ResponseResult; import com.cool.store.service.login.LoginBaseService; import com.cool.store.service.login.LoginStrategy; import com.cool.store.utils.SpringContextUtil; +import com.cool.store.vo.login.UserLoginVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -28,13 +29,13 @@ public class LoginController { @ApiOperation("账号密码登录") @PostMapping("/accountLogin") - public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { + public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { return SpringContextUtil.getBean(param.getLoginType().getClazzName(), LoginStrategy.class).login(param); } @ApiOperation("refresh登录") @PostMapping("/refreshLogin") - public ResponseResult refreshLogin(@RequestBody UserRefreshLoginDTO param) { + public ResponseResult refreshLogin(@RequestBody UserRefreshLoginDTO param) { return loginBaseService.refreshLogin(param); } diff --git a/pom.xml b/pom.xml index 545c8d7fa..b4d687d85 100644 --- a/pom.xml +++ b/pom.xml @@ -135,7 +135,7 @@ cn.hutool hutool-all - 5.0.7 + 5.7.22 com.aliyun From e45b497b3fe88b39147fcd317f0078729550ee9b Mon Sep 17 00:00:00 2001 From: wangff Date: Tue, 9 Sep 2025 10:43:05 +0800 Subject: [PATCH 07/21] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=97=A8=E5=BA=97=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/webb/PCStoreController.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java new file mode 100644 index 000000000..c821855df --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java @@ -0,0 +1,34 @@ +package com.cool.store.controller.webb; + +import com.cool.store.common.PageBasicInfo; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.response.MiniShopsResponse; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.StoreService; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * PC门店 前端控制器 + *

+ * + * @author wangff + * @since 2025/9/9 + */ +@Api(tags = "PC门店") +@RestController +@RequestMapping("/pc/stores") +@RequiredArgsConstructor +public class PCStoreController { + private final StoreService storeService; + + @ApiOperation("当前用户门店列表") + @PostMapping("/userStoreList") + public ResponseResult> getCurrentUserStoreList(@RequestBody PageBasicInfo request) { + return ResponseResult.success(storeService.getStoreListByMobile(CurrentUserHolder.getUser().getMobile(), request.getPageNum(), request.getPageSize(), null, null)); + } +} From 733caec6a0ad8f1e3e29fd98bb7d57bbfe0bb2f9 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 11 Sep 2025 10:37:01 +0800 Subject: [PATCH 08/21] =?UTF-8?q?fix:=E5=8D=B3=E6=97=B6=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=96=B0=E5=A2=9E=E5=90=8E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/StoreMessageMapper.xml | 2 +- .../java/com/cool/store/service/impl/MessageIssueService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml index 05b594ebf..ffb0daaf4 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMessageMapper.xml @@ -25,7 +25,7 @@ - + INSERT INTO zxjp_store_message ( store_id, store_code, diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java index ba0231f7b..b96dc18f7 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java @@ -59,7 +59,7 @@ public class MessageIssueService { throw new ServiceException(ErrorCodeEnum.MESSAGE_NOT_EXIST); } StoreMessageVO storeMessageVO = BeanUtil.toBean(storeMessageDO, StoreMessageVO.class); - BeanUtil.copyProperties(messageTemplateDO, storeMessageVO); + BeanUtil.copyProperties(messageTemplateDO, storeMessageVO, "id"); String message = JSONObject.toJSONString(storeMessageVO); for (String userId : userIds) { try { From 190ee8a5c1011b9a77df772287c649f680ebe058 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 11 Sep 2025 16:06:49 +0800 Subject: [PATCH 09/21] =?UTF-8?q?fix:=E5=B9=B3=E5=8F=B0=E5=BA=93=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-hd.properties | 6 +++++- .../src/main/resources/application-online.properties | 6 +++--- .../src/main/resources/application-test.properties | 4 ++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/coolstore-partner-web/src/main/resources/application-hd.properties b/coolstore-partner-web/src/main/resources/application-hd.properties index c06c32835..335d6cf18 100644 --- a/coolstore-partner-web/src/main/resources/application-hd.properties +++ b/coolstore-partner-web/src/main/resources/application-hd.properties @@ -1,9 +1,13 @@ #mysql config -default.datasource.url=jdbc:mysql://store10-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_10027?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_10027?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 diff --git a/coolstore-partner-web/src/main/resources/application-online.properties b/coolstore-partner-web/src/main/resources/application-online.properties index 68a6ddb0e..396eb8b13 100644 --- a/coolstore-partner-web/src/main/resources/application-online.properties +++ b/coolstore-partner-web/src/main/resources/application-online.properties @@ -3,9 +3,9 @@ default.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coo default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT -default.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true -default.datasource.username=coolstore -default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://zx-coolstore.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT #redis redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 diff --git a/coolstore-partner-web/src/main/resources/application-test.properties b/coolstore-partner-web/src/main/resources/application-test.properties index 40fb95fc6..df3fcb476 100644 --- a/coolstore-partner-web/src/main/resources/application-test.properties +++ b/coolstore-partner-web/src/main/resources/application-test.properties @@ -4,6 +4,10 @@ default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3 default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege-open.redis.rds.aliyuncs.com:6379/0 From 8f7a044d285ac320548fd5d4c5f79e4f1b8ad4b6 Mon Sep 17 00:00:00 2001 From: wangff Date: Fri, 19 Sep 2025 14:41:37 +0800 Subject: [PATCH 10/21] =?UTF-8?q?fix:STOMP=E5=AE=9A=E4=B9=89=E5=BF=83?= =?UTF-8?q?=E8=B7=B30,10000?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/websocket/WebSocketConfig.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java index 77e5f8e56..79118b4b2 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java @@ -1,14 +1,11 @@ package com.cool.store.config.websocket; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.simp.config.ChannelRegistration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; -import org.springframework.messaging.simp.stomp.StompCommand; -import org.springframework.messaging.simp.stomp.StompHeaderAccessor; -import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @@ -36,11 +33,22 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry registry) { // 配置消息代理 - registry.enableSimpleBroker("/topic", "/queue"); // 启用简单代理,用于广播和点对点消息 + registry.enableSimpleBroker("/topic", "/queue") // 启用简单代理,用于广播和点对点消息 + .setHeartbeatValue(new long[]{0, 10000}) + .setTaskScheduler(webSocketTaskScheduler()); registry.setApplicationDestinationPrefixes("/app"); // 设置应用程序端点前缀 // registry.setUserDestinationPrefix("/user"); } + @Bean + public TaskScheduler webSocketTaskScheduler() { + ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); + taskScheduler.setPoolSize(1); + taskScheduler.setThreadNamePrefix("websocket-heartbeat-"); + taskScheduler.initialize(); + return taskScheduler; + } + // @Override // public void configureClientInboundChannel(ChannelRegistration registration) { // registration.interceptors(new ChannelInterceptor() { From 2a8abd0b3e1046f94bd9e889f2bb5e973fbe3848 Mon Sep 17 00:00:00 2001 From: wangff Date: Tue, 14 Oct 2025 11:00:19 +0800 Subject: [PATCH 11/21] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E9=97=A8=E5=BA=97m?= =?UTF-8?q?q=E6=B6=88=E6=81=AF=E6=96=B0=E5=A2=9E=E7=9C=81=E5=B8=82?= =?UTF-8?q?=E5=8C=BA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/cool/store/request/StoreMasterDTO.java | 6 ++++++ .../com/cool/store/service/impl/SyncMainSysServerImpl.java | 3 +++ 2 files changed, 9 insertions(+) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java index 0a771beac..642bc5d6d 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/StoreMasterDTO.java @@ -49,6 +49,12 @@ public class StoreMasterDTO { @ApiModelProperty("省市区") private String area; + @ApiModelProperty("省") + private String province; + @ApiModelProperty("市") + private String city; + @ApiModelProperty("区/县") + private String district; @ApiModelProperty("乡镇") private String town; @ApiModelProperty("门店地址") diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java index dac429721..e90791f27 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncMainSysServerImpl.java @@ -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()); From 7c44ec246eae2f94dbd05a55e2a0a276e92f53d7 Mon Sep 17 00:00:00 2001 From: wangff Date: Wed, 22 Oct 2025 16:50:31 +0800 Subject: [PATCH 12/21] =?UTF-8?q?fix:=E8=A1=A5=E5=85=85=E9=81=97=E5=A4=B1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/service/MessageTemplateService.java | 6 ++-- .../impl/MessageTemplateServiceImpl.java | 14 ++++---- .../webb/MessageTemplateController.java | 33 +++++++++++++++++-- .../webc/MiniMessageTemplateController.java | 8 +++-- 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java index 567103c82..941a8a741 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/MessageTemplateService.java @@ -91,15 +91,15 @@ public interface MessageTemplateService { */ Boolean revokeById(Long id, LoginUserInfo user); - List getModuleList(String storeId,PartnerUserInfoVO userInfoVO); + List getModuleList(String storeId,String mobile); PageInfo getStorePendingList(StoreMessagePendingRequest request); MessageDetailVO getMessageDetail(Long id); - Boolean readMessage(Long id, PartnerUserInfoVO userInfoVO); + Boolean readMessage(Long id, String mobile); - Boolean handleMessage(Long id, PartnerUserInfoVO userInfoVO); + Boolean handleMessage(Long id, String userName,String mobile); ApiResponse thirdHandleMessage(ThirdHandleMessageRequest request); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java index 8904afa7f..1827cee9c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java @@ -377,9 +377,9 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { } @Override - public List getModuleList(String storeId,PartnerUserInfoVO userInfoVO) { + public List getModuleList(String storeId,String mobile) { List moduleAndMatterList = ModuleAndMatterVO.getModuleAndMatterList(); - EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(userInfoVO.getMobile()); + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(mobile); if (enterpriseUserDO == null){ enterpriseUserDO = new EnterpriseUserDO(); } @@ -422,7 +422,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { } @Override - public Boolean readMessage(Long id, PartnerUserInfoVO userInfoVO) { + public Boolean readMessage(Long id, String mobile) { StoreMessageDO message = storeMessageDAO.getById(id); if (ProcessStatusEnum.PROCESSED.getCode().equals(message.getProcessStatus())){ log.info("当前消息已读已处理:{}",JSONObject.toJSONString( message)); @@ -434,7 +434,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { if (ProcessTypeEnum.READ.getCode().equals(template.getProcessType())){ message.setProcessStatus(ProcessStatusEnum.PROCESSED.getCode()); message.setProcessTime(new Date()); - EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(userInfoVO.getMobile()); + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(mobile); if (enterpriseUserDO != null){ message.setActualOperatorId(enterpriseUserDO.getId()); message.setActualOperatorName(enterpriseUserDO.getName()); @@ -445,15 +445,15 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { } @Override - public Boolean handleMessage(Long id, PartnerUserInfoVO userInfoVO) { - log.info("handleMessage request:{},处理人:{}", JSONObject.toJSONString(id), userInfoVO.getUsername()); + public Boolean handleMessage(Long id, String userName,String mobile) { + log.info("handleMessage request:{},处理人:{}", JSONObject.toJSONString(id), userName); StoreMessageDO message = storeMessageDAO.getById(id); if (message==null){ throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); } message.setProcessStatus(ProcessStatusEnum.PROCESSED.getCode()); message.setProcessTime(new Date()); - EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(userInfoVO.getMobile()); + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(mobile); if (enterpriseUserDO != null){ message.setActualOperatorId(enterpriseUserDO.getId()); message.setActualOperatorName(enterpriseUserDO.getName()); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java index b9952bc74..4481a6643 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/MessageTemplateController.java @@ -1,12 +1,12 @@ package com.cool.store.controller.webb; import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; import com.cool.store.dto.notice.NoticeDTO; import com.cool.store.request.notice.*; import com.cool.store.response.ResponseResult; import com.cool.store.service.MessageTemplateService; -import com.cool.store.vo.notice.MessageTemplateDetailVO; -import com.cool.store.vo.notice.StoreMessageDetailVO; +import com.cool.store.vo.notice.*; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -86,5 +86,34 @@ public class MessageTemplateController { return ResponseResult.success(messageTemplateService.revokeById(id,CurrentUserHolder.getUser())); } + @ApiOperation("获取每个门店需要展示的模块") + @GetMapping("/getModuleListByStoreId") + public ResponseResult> getModuleListByStoreId(@RequestParam("id")String storeId) { + return ResponseResult.success(messageTemplateService.getModuleList(storeId, CurrentUserHolder.getUser().getMobile())); + } + @ApiOperation("获取消息详情") + @GetMapping("/getMessageDetail") + public ResponseResult getMessageDetail(@RequestParam("id")Long id) { + return ResponseResult.success(messageTemplateService.getMessageDetail(id)); + } + + @ApiOperation("待办列表/模块列表") + @PostMapping("/getStorePendingList") + public ResponseResult> getStorePendingList(@RequestBody StoreMessagePendingRequest request) { + return ResponseResult.success(messageTemplateService.getStorePendingList(request)); + } + + @ApiOperation("确认已读") + @GetMapping("/readMessage") + public ResponseResult readMessage(@RequestParam("id")Long id) { + return ResponseResult.success(messageTemplateService.readMessage(id, CurrentUserHolder.getUser().getMobile())); + } + + @ApiOperation("确认已处理") + @GetMapping("/handleMessage") + public ResponseResult handleMessage(@RequestParam("id")Long id) { + LoginUserInfo user = CurrentUserHolder.getUser(); + return ResponseResult.success(messageTemplateService.handleMessage(id, user.getName(), user.getMobile())); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java index 9d46ede11..b21257317 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniMessageTemplateController.java @@ -5,6 +5,7 @@ import com.cool.store.context.PartnerUserHolder; import com.cool.store.request.notice.StoreMessagePendingRequest; import com.cool.store.response.ResponseResult; import com.cool.store.service.MessageTemplateService; +import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.notice.MessageDetailVO; import com.cool.store.vo.notice.ModuleAndMatterVO; import com.cool.store.vo.notice.StoreMessageVO; @@ -34,7 +35,7 @@ public class MiniMessageTemplateController { @ApiOperation("获取每个门店需要展示的模块") @GetMapping("/getModuleListByStoreId") public ResponseResult> getModuleListByStoreId(@RequestParam("id")String storeId) { - return ResponseResult.success(messageTemplateService.getModuleList(storeId, PartnerUserHolder.getUser())); + return ResponseResult.success(messageTemplateService.getModuleList(storeId, PartnerUserHolder.getUser().getMobile())); } @ApiOperation("获取消息详情") @@ -52,13 +53,14 @@ public class MiniMessageTemplateController { @ApiOperation("确认已读") @GetMapping("/readMessage") public ResponseResult readMessage(@RequestParam("id")Long id) { - return ResponseResult.success(messageTemplateService.readMessage(id, PartnerUserHolder.getUser())); + return ResponseResult.success(messageTemplateService.readMessage(id, PartnerUserHolder.getUser().getMobile())); } @ApiOperation("确认已处理") @GetMapping("/handleMessage") public ResponseResult handleMessage(@RequestParam("id")Long id) { - return ResponseResult.success(messageTemplateService.handleMessage(id, PartnerUserHolder.getUser())); + PartnerUserInfoVO user = PartnerUserHolder.getUser(); + return ResponseResult.success(messageTemplateService.handleMessage(id, user.getUsername(), user.getMobile())); } } From e8d0006dcbcb2fc1892dc098d30d92ebe936602b Mon Sep 17 00:00:00 2001 From: wangff Date: Fri, 24 Oct 2025 14:08:57 +0800 Subject: [PATCH 13/21] =?UTF-8?q?fix:POS=E5=8F=8A=E8=90=A5=E5=B8=90?= =?UTF-8?q?=E9=80=9A=E5=BC=80=E9=80=9A=E6=B5=81=E7=A8=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/service/PreparationService.java | 6 ++++++ .../service/impl/ApplyLicenseServiceImpl.java | 1 + .../service/impl/OrderSysInfoServiceImpl.java | 1 + .../service/impl/PreparationServiceImpl.java | 18 +++++++++++++++++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java index 508c602f9..0ed4e8cdb 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java @@ -48,6 +48,12 @@ public interface PreparationService { * @param shopId */ void sysStoreCompleted(Long shopId); + + /** + * 营业执照和建店资料收集阶段完成后推进POS和营帐通开通 + * @param shopId 店铺id + */ + void businessLicenseAndBuildStoreCompleted(Long shopId); /** * 证照办理+建店资料 都完成 初始化平台建店数据 * @param shopId diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java index 773f13871..e3d006f49 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java @@ -138,6 +138,7 @@ public class ApplyLicenseServiceImpl implements ApplyLicenseService { ShopStageInfoDO shopSubStageInfo = shopStageInfoDAO.getShopSubStageInfo(request.getShopId(), ShopSubStageEnum.SHOP_STAGE_3); if (Constants.ONE_INTEGER.equals(request.getSubmitStatus()) && shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_30.getShopSubStageStatus())) { shopStageInfoDAO.updateShopStageAndAuditInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_33, null); + preparationService.businessLicenseAndBuildStoreCompleted(request.getShopId()); preparationService.licenseCompleted(request.getShopId()); preparationService.updateShopStatus(request.getShopId()); preparationService.buildStoreAndDecorationComplete(request.getShopId()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java index c658e1f14..20778e775 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java @@ -293,6 +293,7 @@ public class OrderSysInfoServiceImpl implements OrderSysInfoService { //初始化数据 preparationService.licenseCompleted(shopId); preparationService.sysStoreCompleted(shopId); + preparationService.businessLicenseAndBuildStoreCompleted(shopId); preparationService.buildStoreAndDecorationComplete(shopId); preparationService.selectSiteAndBuildStoreComplete(shopId); preparationService.buildStoreComplete(shopId); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java index b1c786bae..5739aa6d2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java @@ -220,9 +220,25 @@ public class PreparationServiceImpl implements PreparationService { equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()).getShopSubStageStatus()); if (flag3) { List list = new ArrayList<>(); - list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_160); list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_170); list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_230); + shopStageInfoDAO.batchUpdateShopStageStatus(shopId, list); + } + } + } + + @Override + public void businessLicenseAndBuildStoreCompleted(Long shopId) { + List shopStageInfo = shopStageInfoDAO.getShopStageInfo(shopId, null); + if (CollectionUtils.isNotEmpty(shopStageInfo)) { + Map shopStageInfoDOMap = shopStageInfo.stream().collect(Collectors.toMap(ShopStageInfoDO::getShopSubStage, data -> data)); + boolean flag1 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_156.getShopSubStageStatus(). + equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()).getShopSubStageStatus()); + boolean flag2 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_33.getShopSubStageStatus(). + equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_3.getShopSubStage()).getShopSubStageStatus()); + if (flag1 && flag2) { + List list = new ArrayList<>(); + list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_160); list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_240); shopStageInfoDAO.batchUpdateShopStageStatus(shopId, list); } From e1a1cb5616503bf7e0e8f474bcafe3626c132986 Mon Sep 17 00:00:00 2001 From: wangff Date: Fri, 24 Oct 2025 14:53:24 +0800 Subject: [PATCH 14/21] =?UTF-8?q?fix:POS=E5=BC=80=E9=80=9A=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=94=B6=E9=9B=86=E4=B8=AD=E8=BD=AC=E8=B5=84=E6=96=99?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E4=B8=AD=E6=9D=A1=E4=BB=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cool/store/service/PreparationService.java | 1 + .../cool/store/service/impl/ApplyLicenseServiceImpl.java | 1 + .../com/cool/store/service/impl/PreparationServiceImpl.java | 6 ++++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java index 0ed4e8cdb..5cc920f53 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java @@ -95,6 +95,7 @@ public interface PreparationService { /** * POS 建店昨天完成 * 选址与建店资料完成(加盟合同完成) + * v20251024 选址与建店资料完成与营业执照完成 * @param shopId * @return */ diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java index e3d006f49..885c089d6 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ApplyLicenseServiceImpl.java @@ -142,6 +142,7 @@ public class ApplyLicenseServiceImpl implements ApplyLicenseService { preparationService.licenseCompleted(request.getShopId()); preparationService.updateShopStatus(request.getShopId()); preparationService.buildStoreAndDecorationComplete(request.getShopId()); + preparationService.selectSiteAndBuildStoreComplete(request.getShopId()); } return Boolean.TRUE; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java index 5739aa6d2..91f0e1398 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java @@ -361,10 +361,12 @@ public class PreparationServiceImpl implements PreparationService { equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_1.getShopSubStage()).getShopSubStageStatus()); Boolean flag3 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_156.getShopSubStageStatus(). equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()).getShopSubStageStatus()); + Boolean flag4 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_33.getShopSubStageStatus(). + equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_3.getShopSubStage()).getShopSubStageStatus()); - log.info("selectSiteAndBuildStoreComplete flag2->{} flag3->{}",flag2,flag3); + log.info("selectSiteAndBuildStoreComplete flag2->{} flag3->{} flag4->{}",flag2,flag3, flag4); //都完成了 状态修改 - if (flag2 && flag3) { + if (flag2 && flag3 && flag4) { shopAccountDAO.updateStatusByShopIdAndSystemName(shopId, Arrays.asList(ShopAccountEnum.HUOMA.getSystemName()), OpenStatusEnum.OPENSTATUSENUM_2.getCode(),null,null); } } From 0741e41c69a186b1fbb2b73bf4c0b0f37fd7a35f Mon Sep 17 00:00:00 2001 From: wangff Date: Fri, 24 Oct 2025 16:10:10 +0800 Subject: [PATCH 15/21] =?UTF-8?q?fix:=E4=BF=A1=E7=AE=A1=E5=AE=B6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8E=A8=E9=80=81=E9=97=A8=E5=BA=97=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SyncDataServiceImpl.java | 36 +++++-------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java index e6c61a1a1..bf79e356f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java @@ -289,43 +289,31 @@ public class SyncDataServiceImpl implements SyncDataService { if (String.valueOf(FranchiseBrandEnum.ZXJP.getCode()).equals(shopInfoDO.getFranchiseBrand())) { //M10001 if (shopCode.matches("M\\d*")) { - return partnershipSignatorySecondIsNull - ? "MX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "MX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "MX" + shopInfoDO.getShopName(); } //FS10001 if (shopCode.matches("FS\\d*")) { - return partnershipSignatorySecondIsNull - ? "FS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "FS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "FS" + shopInfoDO.getShopName(); } // MS10001 if (shopCode.matches("MS\\d*")) { - return partnershipSignatorySecondIsNull - ? "MS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "MS" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "MS" + shopInfoDO.getShopName(); } // S10001 if (shopCode.matches("S\\d*")) { - return partnershipSignatorySecondIsNull - ? "S" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "S" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "S" + shopInfoDO.getShopName(); } // ZX0001 if (shopCode.matches("ZX\\d*")) { return "ZX" + shopInfoDO.getShopName(); } if(shopCode.matches("HL\\d*")){ - return partnershipSignatorySecondIsNull - ? "HL" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "HL" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "HL" + shopInfoDO.getShopName(); } } if (String.valueOf(FranchiseBrandEnum.MZG.getCode()).equals(shopInfoDO.getFranchiseBrand())) { if (shopCode.matches("MZGM\\d*")) { - return partnershipSignatorySecondIsNull - ? "MZGM" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "MZGM" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "MZGM" + shopInfoDO.getShopName(); } if (shopCode.matches("MZGS\\d*")) { return FranchiseBrandEnum.MZG.getDesc() + shopInfoDO.getShopName(); @@ -333,19 +321,13 @@ public class SyncDataServiceImpl implements SyncDataService { } if (String.valueOf(FranchiseBrandEnum.ZJS.getCode()).equals(shopInfoDO.getFranchiseBrand())) { if (shopCode.matches("LX\\d*")) { - return partnershipSignatorySecondIsNull - ? "LX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "LX" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "LX" + shopInfoDO.getShopName(); } if (shopCode.matches("X\\d*")) { - return partnershipSignatorySecondIsNull - ? "X" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "X" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "X" + shopInfoDO.getShopName(); } if (shopCode.matches("Q\\d*")) { - return partnershipSignatorySecondIsNull - ? "Q" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + ")" - : "Q" + shopInfoDO.getShopName() + "(" + signFranchiseDO.getPartnershipSignatoryFirst() + "/"+signFranchiseDO.getPartnershipSignatorySecond()+")"; + return "Q" + shopInfoDO.getShopName(); } if (shopCode.matches("Z\\d*")) { return FranchiseBrandEnum.ZJS.getDesc() + shopInfoDO.getShopName(); From b2076cc6c5ea41621e59bdb08c1da87ac9b7e57a Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 27 Oct 2025 13:32:23 +0800 Subject: [PATCH 16/21] =?UTF-8?q?feat:=E9=97=A8=E5=BA=97=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E8=AE=A2=E8=B4=A7=E6=97=B6=E9=97=B4=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/constants/CommonConstants.java | 2 + .../java/com/cool/store/dao/StoreDao.java | 19 +++++++ .../com/cool/store/mapper/StoreMapper.java | 12 ++++ .../src/main/resources/mapper/StoreMapper.xml | 27 +++++++++ .../store/dto/store/StoreOrderTimeDTO.java | 27 +++++++++ .../bigdata/LatestOrderDateRequest.java | 33 +++++++++++ .../response/bigdata/ApiPageResponse.java | 21 +++++++ .../bigdata/LatestOrderDateResponse.java | 24 ++++++++ .../store/service/ThirdBigDataService.java | 8 +++ .../service/impl/ThirdBigDataServiceImpl.java | 53 ++++++++++++++++-- .../com/cool/store/job/XxlJobHandler.java | 55 +++++++++++++++++++ 11 files changed, 277 insertions(+), 4 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreOrderTimeDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/bigdata/LatestOrderDateRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiPageResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/LatestOrderDateResponse.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index abae182db..03237cc04 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -230,4 +230,6 @@ public class CommonConstants { * refreshToken有效期,单位秒 */ public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; + + public static final int BATCH_SIZE = 200; } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java index 2111657f4..f1c3a4167 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java @@ -1,5 +1,6 @@ package com.cool.store.dao; +import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.StoreDO; import com.cool.store.mapper.StoreMapper; import com.cool.store.response.MiniShopsResponse; @@ -83,4 +84,22 @@ public class StoreDao { return storeMapper.getStoreNumByStoreCodes(storeCodeIds); } + /** + * 新增或编辑最新订货时间 + * @param dtoList 门店最新订货时间DTO列表 + * @return int + */ + public void batchInsertOrUpdateOrderTime(List dtoList) { + if (CollectionUtils.isEmpty(dtoList)) { + return ; + } + storeMapper.batchInsertOrUpdateOrderTime(dtoList); + } + + /** + * 查询所有门店id和门店编码 + */ + public List getAllStoreIdAndNum() { + return storeMapper.getAllStoreIdAndNum(); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java index b4401bdf4..dd1713201 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java @@ -1,6 +1,7 @@ package com.cool.store.mapper; import com.cool.store.dto.store.StoreAreaDTO; +import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.StoreDO; import com.cool.store.response.MiniShopsResponse; import org.apache.ibatis.annotations.Mapper; @@ -47,4 +48,15 @@ public interface StoreMapper { List listStoreByRegionPathList(@Param("regionPathList") List regionPathList); + /** + * 批量新增或编辑最新订货时间 + * @param dtoList 门店最新订货时间DTO列表 + * @return int + */ + int batchInsertOrUpdateOrderTime(@Param("dtoList") List dtoList); + + /** + * 查询所有门店id和门店编码 + */ + List getAllStoreIdAndNum(); } diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index da640615e..afb5a6ccd 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -222,4 +222,31 @@ + + + INSERT INTO store_extend_info_${enterpriseId} + + store_id, + latest_order_time + + VALUES + + + #{dto.storeId}, + #{dto.latestOrderTime} + + + ON DUPLICATE KEY UPDATE + + store_id = VALUES(store_id), + latest_order_time = VALUES(latest_order_time), + update_time = now(), + + + + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreOrderTimeDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreOrderTimeDTO.java new file mode 100644 index 000000000..ed3f0aa40 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreOrderTimeDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + *

+ * 门店最新订货时间DTO + *

+ * + * @author wangff + * @since 2025/10/23 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StoreOrderTimeDTO { + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("最新订货时间") + private Date latestOrderTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/bigdata/LatestOrderDateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/bigdata/LatestOrderDateRequest.java new file mode 100644 index 000000000..d29ccb1ed --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/bigdata/LatestOrderDateRequest.java @@ -0,0 +1,33 @@ +package com.cool.store.request.bigdata; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 最新订货日期Request + *

+ * + * @author wangff + * @since 2025/10/23 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class LatestOrderDateRequest { + /** + * 页码 + */ + private Integer pageNum; + + /** + * 页数量 + */ + private Integer pageSize; + + /** + * 门店编码列表 + */ + private String store_code; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiPageResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiPageResponse.java new file mode 100644 index 000000000..f1bd4d03c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiPageResponse.java @@ -0,0 +1,21 @@ +package com.cool.store.response.bigdata; + +import lombok.Data; + +import java.util.List; + +/** + *

+ * 分页对象 + *

+ * + * @author wangff + * @since 2025/10/27 + */ +@Data +public class ApiPageResponse { + private Integer total; + private List list; + private Integer pageNum; + private Integer pageSize; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/LatestOrderDateResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/LatestOrderDateResponse.java new file mode 100644 index 000000000..0b6cfa944 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/LatestOrderDateResponse.java @@ -0,0 +1,24 @@ +package com.cool.store.response.bigdata; + +import lombok.Data; + +/** + *

+ * 最新订货日期Response + *

+ * + * @author wangff + * @since 2025/10/23 + */ +@Data +public class LatestOrderDateResponse { + /** + * 门店编码 + */ + private String store_code; + + /** + * 最新订货日期,yyyy-MM-dd + */ + private String latest_buy_date; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java index 4e690ee3c..2349eea5a 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdBigDataService.java @@ -1,8 +1,10 @@ package com.cool.store.service; +import com.cool.store.request.bigdata.LatestOrderDateRequest; import com.cool.store.request.bigdata.ProfitDataRequest; import com.cool.store.request.oppty.CityRequest; import com.cool.store.response.bigdata.ActDataResponse; +import com.cool.store.response.bigdata.LatestOrderDateResponse; import com.cool.store.response.bigdata.ProfitDataResponse; import com.cool.store.response.bigdata.ProfitRateResponse; import com.cool.store.response.oppty.CityResponse; @@ -53,5 +55,11 @@ public interface ThirdBigDataService { */ ActDataResponse getActData(ProfitDataRequest requestBody); + /** + * 获取门店最新订货日期 + * @param requestBody 最新订货日期Request + * @return 最新订货日期Response列表 + */ + List getLatestOrderDate(LatestOrderDateRequest requestBody); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java index ee6331d45..6ac1a03a0 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdBigDataServiceImpl.java @@ -3,12 +3,10 @@ package com.cool.store.service.impl; import com.alibaba.fastjson.JSONObject; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; +import com.cool.store.request.bigdata.LatestOrderDateRequest; import com.cool.store.request.bigdata.ProfitDataRequest; import com.cool.store.request.oppty.CityRequest; -import com.cool.store.response.bigdata.ActDataResponse; -import com.cool.store.response.bigdata.ApiResponse; -import com.cool.store.response.bigdata.ProfitDataResponse; -import com.cool.store.response.bigdata.ProfitRateResponse; +import com.cool.store.response.bigdata.*; import com.cool.store.response.oppty.CityResponse; import com.cool.store.response.oppty.OpportunityApiResponse; import com.cool.store.response.oppty.OpportunityDetailResponse; @@ -96,6 +94,15 @@ public class ThirdBigDataServiceImpl implements ThirdBigDataService { return executeApiCall(url, requestBody, ActDataResponse.class); } + @Override + public List getLatestOrderDate(LatestOrderDateRequest requestBody) { + String url = apiUrl + "api/web/v1/buy/latest_buy_date"; + JavaType javaType = objectMapper.getTypeFactory() + .constructParametricType(ApiPageResponse.class, LatestOrderDateResponse.class); + ApiPageResponse response = executeApiCallWithGenericType(url, requestBody, javaType); + return response.getList(); + } + private T executeApiCall(String url, Object requestBody, Class responseType) { // 1. 打印请求前日志 @@ -136,6 +143,44 @@ public class ThirdBigDataServiceImpl implements ThirdBigDataService { } } + private T executeApiCallWithGenericType(String url, Object requestBody, JavaType responseType) { + // 1. 打印请求前日志 + logRequest(url, requestBody); + + try { + Request request = buildRequest(requestBody, url); + + try (Response response = okHttpClient.newCall(request).execute()) { + // 2. 获取原始响应内容 + String responseBody = response.body().string(); + + // 3. 打印响应日志 + logResponse(url, response.code(), responseBody); + + if (!response.isSuccessful()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, + "HTTP请求失败,状态码: " + response.code()); + } + + // 4. 解析响应 + JavaType javaType = objectMapper.getTypeFactory() + .constructParametricType(OpportunityApiResponse.class, responseType); + + OpportunityApiResponse apiResponse = objectMapper.readValue(responseBody, javaType); + + if (apiResponse.getCode() != 0) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, apiResponse.getMsg()); + } + + return apiResponse.getData(); + } + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("API调用异常 - URL: {}, 错误: {}", url, e.getMessage(), e); + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage()); + } + } private Request buildRequest(Object requestBody, String url) { Map params = JsonUtils.parseJsonToMap(JSONObject.toJSONString(requestBody)); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java index 26375991a..a2b4c3ee5 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java @@ -1,5 +1,6 @@ package com.cool.store.job; +import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; @@ -7,6 +8,7 @@ import com.cool.store.dao.*; import com.cool.store.dto.*; import com.cool.store.dto.decoration.ConstructionScheduleDTO; import com.cool.store.dto.openPreparation.OpenPlanShopInfoDTO; +import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.*; import com.cool.store.enums.*; import com.cool.store.enums.point.ShopStatusEnum; @@ -19,7 +21,9 @@ import com.cool.store.mapper.TrainingExperienceMapper; import com.cool.store.mq.producer.SimpleMessageService; import com.cool.store.mq.util.HttpRestTemplateService; import com.cool.store.request.ZxjpApiRequest; +import com.cool.store.request.bigdata.LatestOrderDateRequest; import com.cool.store.request.xfsgFirstOrderListRequest; +import com.cool.store.response.bigdata.LatestOrderDateResponse; import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; import com.cool.store.service.impl.CommonService; @@ -40,6 +44,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; @@ -111,6 +116,10 @@ public class XxlJobHandler { @Resource PushService pushService; + @Resource + StoreDao storeDao; + @Resource + ThirdBigDataService thirdBigDataService; /** @@ -395,4 +404,50 @@ public class XxlJobHandler { } } + @XxlJob("latestOrderDate") + public void latestOrderDate() { + log.info("------start latestOrderDate------"); + boolean hasNext = true; + int pageNum = 1; + int pageSize = CommonConstants.BATCH_SIZE; + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + while (hasNext) { + PageHelper.startPage(pageNum, pageSize); + List storeList = storeDao.getAllStoreIdAndNum(); + if (CollectionUtils.isEmpty(storeList)) { + break; + } + hasNext = storeList.size() >= pageSize; + List storeNums = CollStreamUtil.toList(storeList, StoreDO::getStoreNum); + Map storeIdMap = CollStreamUtil.toMap(storeList, StoreDO::getStoreNum, StoreDO::getStoreId); + LatestOrderDateRequest request = new LatestOrderDateRequest(1, pageSize, String.join(",", storeNums)); + List resList = thirdBigDataService.getLatestOrderDate(request); + log.info("接口请求门店数量:{},返回门店数:{}", storeList.size(), resList.size()); + if (CollectionUtils.isNotEmpty(resList)) { + try { + List updateList = resList.stream() + .map(v -> { + Date date = parseDate(v, dateFormat); + return Objects.nonNull(date) ? new StoreOrderTimeDTO(storeIdMap.get(v.getStore_code()), date) : null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + storeDao.batchInsertOrUpdateOrderTime(updateList); + } catch (Exception e) { + log.error("获取最新订货时间失败", e); + } + } + pageNum++; + } + log.info("------end latestOrderDate------"); + } + + public Date parseDate(LatestOrderDateResponse v, DateFormat format) { + try { + return format.parse(v.getLatest_buy_date()); + } catch (ParseException e) { + log.error("日期转化失败,storeCode:{},latestBuyDate:{}", v.getStore_code(), v.getLatest_buy_date()); + } + return null; + } } From 1830e2240ec196ccd1a8df05a7043cf9f497a4fe Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 27 Oct 2025 13:46:48 +0800 Subject: [PATCH 17/21] =?UTF-8?q?fix:=E6=9C=80=E6=96=B0=E8=AE=A2=E8=B4=A7?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E9=97=A8=E5=BA=97=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/cool/store/dao/StoreDao.java | 4 ++-- .../src/main/java/com/cool/store/mapper/StoreMapper.java | 2 +- .../src/main/resources/mapper/StoreMapper.xml | 6 ++++++ .../src/main/java/com/cool/store/job/XxlJobHandler.java | 7 ++++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java index f1c3a4167..65c3575c0 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java @@ -99,7 +99,7 @@ public class StoreDao { /** * 查询所有门店id和门店编码 */ - public List getAllStoreIdAndNum() { - return storeMapper.getAllStoreIdAndNum(); + public List getAllStoreIdAndNum(List storeStatus) { + return storeMapper.getAllStoreIdAndNum(storeStatus); } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java index dd1713201..25adad05a 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java @@ -58,5 +58,5 @@ public interface StoreMapper { /** * 查询所有门店id和门店编码 */ - List getAllStoreIdAndNum(); + List getAllStoreIdAndNum(@Param("storeStatus") List storeStatus); } diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index afb5a6ccd..df9ccf488 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -248,5 +248,11 @@ SELECT store_id, store_num FROM store_${enterpriseId} WHERE is_delete = 'effective' + + AND store_status IN + + #{item} + + diff --git a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java index a2b4c3ee5..018120ad5 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java @@ -407,13 +407,18 @@ public class XxlJobHandler { @XxlJob("latestOrderDate") public void latestOrderDate() { log.info("------start latestOrderDate------"); + String param = XxlJobHelper.getJobParam(); + List storeStatus = null; + if (StringUtils.isNotBlank(param)) { + storeStatus = Arrays.asList(param.split(",")); + } boolean hasNext = true; int pageNum = 1; int pageSize = CommonConstants.BATCH_SIZE; DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); while (hasNext) { PageHelper.startPage(pageNum, pageSize); - List storeList = storeDao.getAllStoreIdAndNum(); + List storeList = storeDao.getAllStoreIdAndNum(storeStatus); if (CollectionUtils.isEmpty(storeList)) { break; } From e74e12fe7c7b349f37120cc5aae985aa35fc9db4 Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 27 Oct 2025 14:05:50 +0800 Subject: [PATCH 18/21] fix:requestId --- .../src/main/java/com/cool/store/job/XxlJobHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java index 018120ad5..cce519796 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java @@ -28,6 +28,7 @@ import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; import com.cool.store.service.impl.CommonService; import com.cool.store.utils.CoolDateUtils; +import com.cool.store.utils.MDCUtils; import com.cool.store.utils.NumberConverter; import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.StringUtils; @@ -407,6 +408,7 @@ public class XxlJobHandler { @XxlJob("latestOrderDate") public void latestOrderDate() { log.info("------start latestOrderDate------"); + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); String param = XxlJobHelper.getJobParam(); List storeStatus = null; if (StringUtils.isNotBlank(param)) { From 80d3f6efd04aeb076ab269c98a905f39c60ca262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=B9=E7=BA=A2?= Date: Mon, 27 Oct 2025 15:43:21 +0800 Subject: [PATCH 19/21] =?UTF-8?q?feat:=E5=8A=A0=E7=9B=9F=E9=83=A8=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E6=96=B0=E5=BB=BA=E5=8A=A0=E7=9B=9F=E5=BA=97=E6=88=96?= =?UTF-8?q?=E8=80=85=E8=81=94=E8=90=A5=E5=BA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/enums/ErrorCodeEnum.java | 1 + .../java/com/cool/store/enums/JoinModeEnum.java | 6 ++++++ .../cool/store/service/EnterpriseService.java | 7 +++++++ .../service/impl/EnterpriseServiceImpl.java | 17 +++++++++++++++++ .../store/service/impl/LineServiceImpl.java | 3 +++ .../store/service/impl/ShopServiceImpl.java | 3 +++ 6 files changed, 37 insertions(+) diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index d88e4dfca..cbbb7cdd3 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -312,6 +312,7 @@ public enum ErrorCodeEnum { NOT_FLAGSHIP_STORE(16100005,"非直营店,无法跳过缴费阶段!",null), NOT_FLAGSHIP_STORE_NOT_EXIST(16100006,"当前阶段加盟类型不能变更!",null), + JOIN_MODE_NOT_ALLOW_OPERATE(16100007,"加盟部人员只能新建加盟店或联营店,请确认!",null), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java index 4fca7bf91..0c4b24555 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java @@ -38,4 +38,10 @@ public enum JoinModeEnum { } return null; } + /** + * 是否是加盟部加盟店或者联营店 如果不是 返回false + */ + public static boolean isFranchise(Integer code) { + return code == FRANCHISE_DEPARTMENT.code || code == AFFILIATES.code; + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java index 2fb88f946..33ddacccc 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseService.java @@ -22,4 +22,11 @@ public interface EnterpriseService { * 获取并缓存refreshToken */ RefreshUser getRefreshUser(String userId, String mobile); + + /** + * 校验用户新建分店/新建线索 可以选择加盟类型类型 + * @param userId + * @param joinMode + */ + void checkUser(String userId,Integer joinMode); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java index 79b08e9d3..036c02713 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java @@ -7,6 +7,7 @@ import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.entity.EnterpriseUserDO; import com.cool.store.entity.SysRoleDO; import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.JoinModeEnum; import com.cool.store.enums.Role; import com.cool.store.enums.UserStatusEnum; import com.cool.store.exception.ServiceException; @@ -126,6 +127,22 @@ public class EnterpriseServiceImpl implements EnterpriseService { return refreshUser; } + @Override + public void checkUser(String userId,Integer joinMode) { + EnterpriseUserDO userInfo = enterpriseUserDAO.getUserInfoById(userId); + if (userInfo !=null){ + //校验当前人员是否是加盟部 581 + String departments = userInfo.getDepartments(); + //如果departments包含/581/ 加盟部 + if (com.cool.store.utils.poi.StringUtils.isNotBlank(departments) && departments.contains("/581/")) { + //加盟部 FRANCHISE_COMPANIES + if (!JoinModeEnum.isFranchise(joinMode)){ + throw new ServiceException(ErrorCodeEnum.JOIN_MODE_NOT_ALLOW_OPERATE); + } + } + } + } + public static void main(String[] args) { try { System.out.println(DateUtils.parseDate("2024-05-09 18:54:28",DateUtils.YYYY_MM_DD_HH_MM_SS)); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java index 2db3f5441..cc40863fd 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineServiceImpl.java @@ -88,6 +88,8 @@ public class LineServiceImpl implements LineService { private RegionQrcodeConfigDao regionQrcodeConfigDao; @Resource QualificationsInfoDAO qualificationsInfoDAO; + @Resource + EnterpriseService enterpriseService; @Override @@ -514,6 +516,7 @@ public class LineServiceImpl implements LineService { public Boolean addLine(AddLineRequest addLineRequest, LoginUserInfo userInfo) { //必填参数 log.info("addLine:{}", JSONObject.toJSONString(addLineRequest)); + enterpriseService.checkUser(userInfo.getUserId(), addLineRequest.getJoinMode()); if (!StringUtil.isNoneBlank(addLineRequest.getMobile(), addLineRequest.getUserName())) { throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java index ef44ca211..9f4a09703 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java @@ -110,6 +110,8 @@ public class ShopServiceImpl implements ShopService { DecorationDesignInfoDAO decorationDesignInfoDAO; @Resource StoreService storeService; + @Resource + EnterpriseService enterpriseService; @Override @@ -330,6 +332,7 @@ public class ShopServiceImpl implements ShopService { if (StringUtils.isBlank(request.getInvestmentManagerUserId())) { request.setInvestmentManagerUserId(userId); } + enterpriseService.checkUser(userId, request.getJoinMode()); LineInfoDO lineInfo = lineInfoDAO.getLineInfo(request.getLineId()); if (lineInfo.getWorkflowSubStageStatus() < WorkflowSubStageStatusEnum.PAY_DEPOSIT_45.getCode()) { throw new ServiceException(ErrorCodeEnum.LINE_STATUS_NOT_ALLOW_OPERATE); From f784b895cfeb599c6e870be3491f3537e5002505 Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 27 Oct 2025 16:46:18 +0800 Subject: [PATCH 20/21] =?UTF-8?q?fix:=E8=A3=85=E4=BF=AE=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=97=B6=E8=A6=86=E7=9B=96=E5=BB=BA=E5=BA=97?= =?UTF-8?q?=E8=B5=84=E6=96=99=E9=87=8C=E7=9A=84=E9=97=A8=E5=A4=B4=E7=85=A7?= =?UTF-8?q?=E5=92=8C=E5=86=85=E6=99=AF=E7=85=A7;=E5=BB=BA=E5=BA=97?= =?UTF-8?q?=E8=B5=84=E6=96=99=E9=97=A8=E5=A4=B4=E7=85=A7=E6=88=96=E5=86=85?= =?UTF-8?q?=E6=99=AF=E7=85=A7=E4=B8=BA=E7=A9=BA=E6=97=B6=E5=8F=96=E8=A3=85?= =?UTF-8?q?=E4=BF=AE=E9=AA=8C=E6=94=B6=E7=9A=84=E5=9B=BE;=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E8=B4=A6=E5=8F=B7=E9=97=A8=E5=A4=B4=E7=85=A7=E5=86=85?= =?UTF-8?q?=E6=99=AF=E7=85=A7=E5=85=BC=E5=AE=B9=E9=80=97=E5=8F=B7=E9=9A=94?= =?UTF-8?q?=E5=BC=80=E5=92=8Cjson=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/entity/BuildInformationDO.java | 6 ++++ .../impl/BuildInformationServiceImpl.java | 11 ++++++- .../impl/DecorationDesignInfoServiceImpl.java | 30 ++++++++++++++++--- .../service/impl/SyncDataServiceImpl.java | 12 ++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java index cf19521de..45fc4eb20 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/BuildInformationDO.java @@ -5,7 +5,10 @@ import java.io.Serializable; import java.util.Date; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import javax.persistence.*; @@ -18,6 +21,9 @@ import javax.validation.constraints.NotBlank; */ @Table(name = "xfsg_build_information") @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class BuildInformationDO { @Id diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java index 1daeb4fb5..acd630ce4 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java @@ -73,6 +73,8 @@ public class BuildInformationServiceImpl implements BuildInformationService { private OrderSysInfoDAO orderSysInfoDAO; @Autowired private BigRegionDAO bigRegionDAO; + @Resource + private AcceptanceInfoDAO acceptanceInfoDAO; @Override @@ -252,7 +254,14 @@ public class BuildInformationServiceImpl implements BuildInformationService { if (StringUtils.isBlank(response.getAddresseeAddress())) { response.setAddresseeAddress(shopInfo.getDetailAddress()); } - + // 不存在的情况下从装修验收中获取 + if (StringUtils.isBlank(response.getDoorPhoto()) || StringUtils.isBlank(response.getInStorePhoto())) { + AcceptanceInfoDO acceptanceInfoDO = acceptanceInfoDAO.selectByShopId(shopId); + if (Objects.nonNull(acceptanceInfoDO)) { + response.setDoorPhoto(StringUtils.isNotBlank(response.getDoorPhoto()) ? response.getDoorPhoto() : acceptanceInfoDO.getShopDoorwayPhoto()); + response.setInStorePhoto(StringUtils.isNotBlank(response.getInStorePhoto()) ? response.getInStorePhoto() : acceptanceInfoDO.getShopInteriorPhoto()); + } + } return response; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java index 03b389bef..6bd8c39f0 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DecorationDesignInfoServiceImpl.java @@ -1,5 +1,7 @@ package com.cool.store.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.cool.store.dao.*; import com.cool.store.entity.*; import com.cool.store.enums.ErrorCodeEnum; @@ -10,14 +12,12 @@ import com.cool.store.exception.ServiceException; import com.cool.store.request.*; import com.cool.store.service.DecorationDesignInfoService; import com.cool.store.utils.poi.StringUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -40,6 +40,8 @@ public class DecorationDesignInfoServiceImpl implements DecorationDesignInfoServ private ShopStageInfoDAO shopStageInfoDAO; @Resource private LineInfoDAO lineInfoDAO; + @Resource + private BuildInformationDAO buildInformationDAO; @Override @Transactional(rollbackFor = Exception.class) @@ -277,8 +279,28 @@ public class DecorationDesignInfoServiceImpl implements DecorationDesignInfoServ if (shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_122.getShopSubStageStatus())) { shopStageInfoDAO.updateShopStageInfo(shopInfoDO.getId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_123); } + // 覆盖建店资料中的门头照和内景照 + BuildInformationDO buildInformation = BuildInformationDO.builder().shopId(request.getShopId()).doorPhoto(buildJson(request.getShopDoorwayPhotoUrl())) + .inStorePhoto(buildJson(request.getShopInteriorPhotoUrl())).build(); + buildInformationDAO.updateByShopIdSelective(buildInformation); return true; } + public String buildJson(List urls) { + if (CollectionUtils.isEmpty(urls)) { + return null; + } + JSONArray jsonArray = new JSONArray(); + for (String url : urls) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("url", url); + jsonObject.put("type", extractImageSuffix(url)); + jsonArray.add(jsonObject); + } + return jsonArray.toJSONString(); + } + public String extractImageSuffix(String url) { + return url.substring(url.lastIndexOf(".") + 1); + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java index bf79e356f..ac7bb60cd 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java @@ -273,6 +273,18 @@ public class SyncDataServiceImpl implements SyncDataService { } catch (Exception e) { log.info("getUrl error:{},JSON:{}", e.getMessage(), json); } + return getUrlListByComma(json); + } + + private static List getUrlListByComma(String str) { + if (StringUtils.isBlank(str)) { + return null; + } + try { + return Arrays.asList(str.split(",")); + } catch (Exception e) { + log.info("getUrlListByComma error:{},str:{}", e.getMessage(), str); + } return null; } From f301234f26f447e566130f3b64d016ff555dc03b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=B9=E7=BA=A2?= Date: Mon, 27 Oct 2025 17:01:35 +0800 Subject: [PATCH 21/21] =?UTF-8?q?feat:=E5=8A=A0=E7=9B=9F=E9=83=A8=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E6=96=B0=E5=BB=BA=E5=8A=A0=E7=9B=9F=E5=BA=97=E6=88=96?= =?UTF-8?q?=E8=80=85=E8=81=94=E8=90=A5=E5=BA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/EnterpriseUserMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml index 4b3246910..5a019939f 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml @@ -30,7 +30,7 @@ - id, user_id, name, remark, mobile, email, main_admin, is_admin, unionid, + id, user_id, name, remark, mobile, email, main_admin, is_admin, unionid,departments, avatar, jobnumber, is_leader, is_leader_in_depts, face_url, user_status, create_time, third_oa_unique_flag