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 198e62f71..c02d966cc 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 @@ -148,7 +148,7 @@ public enum ErrorCodeEnum { LINE_ALREADY_EXISTS(10211163, "该线索已存在,跟进人为{0}", null), LINE_EXISTS_IN_PUBLIC_SEA(10211164, "该线索已存在,请前往公海认领", null), CONTENT_DUPLICATED(10211200, "动态标题重复!", null), - SIGN_FAIL(600000, "验签失败", null), + SIGN_FAIL(600000, "验签失败=>{0}", null), GET_ACCESSTOKEN_ERROR(600001, "获取小程序TOKEN错误!", null), NEW_MOBILE_HAS_EXIST(600002,"加盟商用户信息已存在",null), INSPECTION_USER_OCCUPY(600003,"当前稽核人已经配置其他战区",null), diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ExtendFieldTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExtendFieldTypeEnum.java new file mode 100644 index 000000000..2042c8dd8 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExtendFieldTypeEnum.java @@ -0,0 +1,59 @@ +package com.cool.store.enums; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/5/13 9:57 + * @Version 1.0 + */ +public enum ExtendFieldTypeEnum { + + TEST_STORE_MANAGER_MOBILE("extend_field_1746670633436","店长手机号"), + TEST_SIGNATORY_NAME_1("extend_field_1746670645231","签约人1名称"), + TEST_SIGNATORY_MOBILE_1("extend_field_1746670652805","签约人2手机号"), + TEST_SIGNATORY_NAME_2("extend_field_1746670671614","签约人2名称"), + TEST_SIGNATORY_MOBILE_2("extend_field_1746670686307","签约人2手机号"), + TEST_ORDER_NAME("extend_field_1747103227333","订单小程序名称"), + ONLINE_STORE_MANAGER_MOBILE("extend_field_1746598536903","店长手机号"), + ONLINE_SIGNATORY_NAME_1("extend_field_1746598562255","签约人1名称"), + ONLINE_SIGNATORY_MOBILE_1("extend_field_1746598570479","签约人2手机号"), + ONLINE_SIGNATORY_NAME_2("extend_field_1746598584139","签约人2名称"), + ONLINE_SIGNATORY_MOBILE_2("extend_field_1746598594140","签约人2手机号"), + ONLINE_ORDER_NAME("extend_field_1746599049206","订单小程序名称"),; + + private String key; + + private String msg; + + ExtendFieldTypeEnum(String key,String msg){ + this.key = key; + this.msg = msg; + } + + public static Map configMap(){ + return Arrays.stream(ExtendFieldTypeEnum.values()) + .collect(Collectors.toMap( + ExtendFieldTypeEnum::getKey, + e -> e + )); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} 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 df21e9bd4..a62ab0101 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 @@ -63,5 +63,9 @@ public class StoreDao { return storeMapper.listByMobile(mobile); } + public List list() { + return storeMapper.list(); + } + } 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 e77c86a9a..f2bbfa057 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 @@ -31,4 +31,10 @@ public interface StoreMapper { */ List listByMobile(@Param("mobile") String mobile); + /** + * 分页查询门店数据 + * @return + */ + List list(); + } diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index 49c2818e5..92149ff30 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -83,10 +83,16 @@ select * from store_${enterpriseId} + and is_delete = 'effective' and `extend_field` like concat('%', #{mobile}, '%') + + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreDTO.java new file mode 100644 index 000000000..184933008 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/13 10:56 + * @Version 1.0 + */ +@Data +public class StoreDTO { + + @ApiModelProperty("门店名称") + private String storeName; + @ApiModelProperty("门店CODE") + private String storeCode; + @ApiModelProperty("店长手机号") + private String managerPhone; + @ApiModelProperty("签约人1姓名") + private String signer1Name; + @ApiModelProperty("签约人2手机号") + private String signer1Phone; + @ApiModelProperty("签约人2姓名") + private String signer2Name; + @ApiModelProperty("签约人2手机号") + private String signer2Phone; + @ApiModelProperty("订单小程序名称") + private String orderMiniProgramName; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/OpenApiStoreRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/OpenApiStoreRequest.java new file mode 100644 index 000000000..2d1926a38 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/OpenApiStoreRequest.java @@ -0,0 +1,18 @@ +package com.cool.store.request; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/13 11:08 + * @Version 1.0 + */ +@Data +public class OpenApiStoreRequest { + + private Integer pageSize; + + private Integer pageNum; + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java new file mode 100644 index 000000000..42a09fb6c --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java @@ -0,0 +1,24 @@ +package com.cool.store.service; + +import com.cool.store.dto.StoreDTO; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/5/13 9:56 + * @Version 1.0 + */ +public interface StoreService { + + + /** + * 分页查询门店信息 包括扩展信息 + * @param pageSize + * @param pageNum + * @return + */ + PageInfo getStoreExtendFieldInfo(Integer pageSize,Integer pageNum); + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java new file mode 100644 index 000000000..81ee792d2 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java @@ -0,0 +1,116 @@ +package com.cool.store.service.impl; + +import com.cool.store.dao.StoreDao; +import com.cool.store.dto.StoreDTO; +import com.cool.store.entity.StoreDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.ExtendFieldTypeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.service.StoreService; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/5/13 9:56 + * @Version 1.0 + */ +@Service +@Slf4j +public class StoreServiceImpl implements StoreService { + + @Resource + StoreDao storeDao; + + @Override + public PageInfo getStoreExtendFieldInfo(Integer pageSize, Integer pageNum) { + if (pageSize>200){ + throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE,"单次最多获取200条门店数据"); + } + PageHelper.startPage(pageNum,pageSize); + List list = storeDao.list(); + PageInfo info = new PageInfo<>(list); + if (CollectionUtils.isEmpty(list)){ + return info; + } + List storeDTOS = processStores(list); + info.setList(storeDTOS); + return info; + } + + + public static List processStores(List stores) { + ObjectMapper objectMapper = new ObjectMapper(); + + // 创建配置映射:key -> 枚举项 + Map configMap = ExtendFieldTypeEnum.configMap(); + + // 处理每个门店 + return stores.stream().map(store -> { + StoreDTO dto = new StoreDTO(); + dto.setStoreName(store.getStoreName()); + dto.setStoreCode(store.getStoreNum()); + + try { + // 解析门店的扩展字段 + Map extendFields = objectMapper.readValue( + store.getExtendField(), + new TypeReference>() {} + ); + + // 匹配并设置DTO字段 + for (Map.Entry entry : extendFields.entrySet()) { + ExtendFieldTypeEnum fieldEnum = configMap.get(entry.getKey()); + if (fieldEnum != null) { + switch (fieldEnum) { + case TEST_STORE_MANAGER_MOBILE: + case ONLINE_STORE_MANAGER_MOBILE: + dto.setManagerPhone(entry.getValue()); + break; + case TEST_SIGNATORY_NAME_1: + case ONLINE_SIGNATORY_NAME_1: + dto.setSigner1Name(entry.getValue()); + break; + case TEST_SIGNATORY_MOBILE_1: + case ONLINE_SIGNATORY_MOBILE_1: + dto.setSigner1Phone(entry.getValue()); + break; + case TEST_SIGNATORY_NAME_2: + case ONLINE_SIGNATORY_NAME_2: + dto.setSigner2Name(entry.getValue()); + break; + case TEST_SIGNATORY_MOBILE_2: + case ONLINE_SIGNATORY_MOBILE_2: + dto.setSigner2Phone(entry.getValue()); + break; + case TEST_ORDER_NAME: + case ONLINE_ORDER_NAME: + dto.setOrderMiniProgramName(entry.getValue()); + break; + } + } + } + } catch (Exception e) { + // 处理JSON解析异常 + log.error("解析门店扩展字段失败: {} " + store.getStoreNum()); + e.printStackTrace(); + } + return dto; + }).collect(Collectors.toList()); + } + + +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java index ec781964a..12feafd14 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java @@ -1,7 +1,9 @@ package com.cool.store.config; +import com.alibaba.fastjson.JSON; import com.cool.store.constants.CommonConstants; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; +import com.cool.store.response.ResponseResult; import com.cool.store.utils.OpenSignatureUtil; import com.cool.store.utils.StringUtil; import com.cool.store.utils.UUIDUtils; @@ -11,10 +13,12 @@ import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.util.Map; @@ -48,44 +52,63 @@ public class OpenApiValidateFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; String uri = request.getRequestURI(); - if(!uri.startsWith("/zxjp/open/v1/getYlsToken")){ + if(!uri.startsWith("/zxjp/open/v1")){ filterChain.doFilter(servletRequest, response); return; } MDC.put(CommonConstants.REQUEST_ID, UUIDUtils.get32UUID()); - + //statusRefresh 放开不需要验签 + if(uri.startsWith("/zxjp/open/v1/statusRefresh")){ + filterChain.doFilter(servletRequest, response); + return; + } + HttpServletResponse res = (HttpServletResponse) response; // 1. 验证时间戳 try { String timestampStr = request.getHeader("timestamp"); if (timestampStr == null) { log.info("timestampStr is null {}","缺少timestamp参数"); - throw new ServiceException(ErrorCodeEnum.SIGN_FAIL); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"缺少timestamp参数"))); + return; } long timestamp = Long.parseLong(timestampStr)/1000; long currentTime = System.currentTimeMillis()/1000; long timeDiff = Math.abs(currentTime - timestamp); try { - - if (timeDiff > 600) { log.info("OpenApiValidateFilter==>{}","请求已过期,服务器时间:" + currentTime + " 请求时间:" + timestamp); throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"请求已过期,请保证timestamp时间在10分钟之内"); } } catch (NumberFormatException e) { log.info("OpenApiValidateFilter==>{}","非法timestamp格式"); - throw new ServiceException(ErrorCodeEnum.SIGN_FAIL); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"非法timestamp格式"))); + return; } // 2. 验证签名 String appKey = request.getHeader("appkey"); if (appKey == null || !coolAppKey.equals(appKey)) { log.info("OpenApiValidateFilter==>{}","无效的appKey"); - throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"无效的appKey"); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"无效的appKey"))); + return; } String clientSign = request.getHeader("sign"); if (clientSign == null) { - throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"签名校验失败"); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"签名为空"))); + return; } // 1. 读取请求体 StringBuilder requestBody = new StringBuilder(); @@ -112,7 +135,11 @@ public class OpenApiValidateFilter implements Filter { log.info("{}",serverSign); if (!serverSign.equalsIgnoreCase(clientSign)) { - throw new ServiceException(ErrorCodeEnum.SIGN_FAIL); + res.setStatus(HttpStatus.OK.value()); + res.setCharacterEncoding("UTF-8"); + res.getWriter().write(JSON.toJSONString( + ResponseResult.fail(ErrorCodeEnum.SIGN_FAIL,"签名校验失败"))); + return; } filterChain.doFilter(request, response); } finally { diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java index e782ad263..784d85df0 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java @@ -4,11 +4,15 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.dto.AskBotTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; import com.cool.store.dto.StatusRefreshDTO; +import com.cool.store.dto.StoreDTO; +import com.cool.store.request.OpenApiStoreRequest; import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.OpenApiService; import com.cool.store.service.PushService; import com.cool.store.service.ShopAccountService; +import com.cool.store.service.StoreService; +import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -34,6 +38,8 @@ public class OpenApiController { PushService pushService; @Resource ShopAccountService shopAccountService; + @Resource + StoreService storeService; @PostMapping("/statusRefresh") public ApiResponse statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){ @@ -49,4 +55,11 @@ public class OpenApiController { } + @ApiOperation("获取门店信息") + @PostMapping("/getStoreList") + public ApiResponse> getStoreList(@RequestBody @Validated OpenApiStoreRequest dto) { + return ApiResponse.success(storeService.getStoreExtendFieldInfo(dto.getPageSize(),dto.getPageNum())); + } + + }