From 6d54e4de9cc092a005095ab940460c2c7368d2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=B9=E7=BA=A2?= Date: Thu, 25 Sep 2025 16:57:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=97=A8=E5=BA=97=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/enums/RocketMqGroupEnum.java | 3 + .../com/cool/store/enums/RocketMqTagEnum.java | 1 + .../store/dto/store/StoreUserPositionDTO.java | 2 + .../store/dto/store/StoreUserUpdateDTO.java | 31 +++++++++ .../response/caipin/StoreUserResponse.java | 17 +++++ .../store/mq/consumer/ConsumerClient.java | 16 +++++ .../listener/StoreUserUpdateListener.java | 68 +++++++++++++++++++ .../cool/store/service/ThirdFoodService.java | 12 ++++ .../store/service/impl/StoreServiceImpl.java | 1 + .../service/impl/ThirdFoodServiceImpl.java | 29 ++++++-- .../store/controller/webc/TestController.java | 15 ++++ .../main/resources/application-ab.properties | 2 +- .../resources/application-local.properties | 2 +- .../resources/application-online.properties | 2 +- .../resources/application-test.properties | 2 +- 15 files changed, 192 insertions(+), 11 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserUpdateDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/caipin/StoreUserResponse.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/StoreUserUpdateListener.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java index ca1849ed2..c71810033 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java @@ -32,6 +32,9 @@ public enum RocketMqGroupEnum { */ FEI_SHU_EVENT_LISTENER("fei_shu_event_listener", new ArrayList<>(Arrays.asList(RocketMqTagEnum.USER_EVENT, RocketMqTagEnum.AUTH_SCOPE_CHANGE, RocketMqTagEnum.DEPT_EVENT))), + + STORE_USER_UPDATE("STORE_USER_UPDATE", new ArrayList<>(Arrays.asList(RocketMqTagEnum.STORE_USER_UPDATE))) + ; private final String group; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java index 6d01d8557..4635dd69d 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java @@ -18,6 +18,7 @@ public enum RocketMqTagEnum { ZXJP_CREATE_STORE("zxjp_create_store", "正新鸡排招商创建门店"), PARTNER_LICENSE_SYNC_QUEUE("partner_license_sync_queue", "招商证照信息同步"), BUSINESS_SYNC("business_sync", "工商食安信息同步"), + STORE_USER_UPDATE("store_user_update", "门店信息人员变更同步菜品"); ; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java index 69ed9ed5d..bcbd776bb 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserPositionDTO.java @@ -18,6 +18,8 @@ public class StoreUserPositionDTO { private String shopCode; + private String storeCode; + List userList; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserUpdateDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserUpdateDTO.java new file mode 100644 index 000000000..f9cdf6e0c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreUserUpdateDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.dto.store; + +import lombok.Data; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/9/25 15:37 + * @Version 1.0 + */ +@Data +public class StoreUserUpdateDTO { + + private String storeCode; + + List userList; + + @Data + class UserDTO { + + private String userName; + + private String mobile; + + private String positionName; + + } + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/caipin/StoreUserResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/caipin/StoreUserResponse.java new file mode 100644 index 000000000..4233acea8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/caipin/StoreUserResponse.java @@ -0,0 +1,17 @@ +package com.cool.store.response.caipin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/9/25 15:05 + * @Version 1.0 + */ +@Data +public class StoreUserResponse { + + private String msgDetail; + + private String msgFront; + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java index e420dac8a..34a6ba0e1 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java @@ -8,6 +8,7 @@ import com.aliyun.openservices.ons.api.bean.Subscription; import com.cool.store.constants.CommonConstants; import com.cool.store.enums.RocketMqGroupEnum; import com.cool.store.mq.RocketMqConfig; +import com.cool.store.mq.consumer.listener.StoreUserUpdateListener; import com.cool.store.mq.consumer.listener.XfsgTrainingPersonSyncListener; import com.google.common.collect.Maps; import org.springframework.context.annotation.Bean; @@ -32,6 +33,8 @@ public class ConsumerClient { // private FeiShuEventListener feiShuEventListener; @Resource private XfsgTrainingPersonSyncListener xfsgTrainingPersonSyncListener; + @Resource + private StoreUserUpdateListener storeUserUpdateListener; /** * 获取通用配置 @@ -85,4 +88,17 @@ public class ConsumerClient { // } + @Bean(initMethod = "start", destroyMethod = "shutdown") + public ConsumerBean test() { + RocketMqGroupEnum groupEnum = RocketMqGroupEnum.STORE_USER_UPDATE; + ConsumerBean consumerBean = new ConsumerBean(); + //配置文件 + Properties properties = getCommonProperties(groupEnum); + consumerBean.setProperties(properties); + Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, storeUserUpdateListener); + //订阅多个topic如上面设置 + consumerBean.setSubscriptionTable(commonSubscriptionTable); + return consumerBean; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/StoreUserUpdateListener.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/StoreUserUpdateListener.java new file mode 100644 index 000000000..7509fbe66 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/StoreUserUpdateListener.java @@ -0,0 +1,68 @@ +package com.cool.store.mq.consumer.listener; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.cool.store.constants.CommonConstants; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.store.StoreUserUpdateDTO; +import com.cool.store.service.PushService; +import com.cool.store.service.StoreService; +import com.cool.store.service.ThirdFoodService; +import com.cool.store.utils.RedisUtilPool; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/9/25 14:49 + * @Version 1.0 + */ +@Slf4j +@Service +public class StoreUserUpdateListener implements MessageListener { + + @Autowired + public RedisUtilPool redisUtilPool; + @Autowired + StoreService storeService; + @Autowired + ThirdFoodService thirdFoodService; + + @Override + public Action consume(Message message, ConsumeContext context) { + String text = new String(message.getBody()); + if(StringUtils.isBlank(text)){ + log.info("消息体为空,tag:{},messageId:{}",message.getTag(),message.getMsgID()); + return Action.CommitMessage; + } + String lockKey = "StoreUserUpdateListener:" + message.getMsgID(); + boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES); + if(lock){ + try { + List storeUser = storeService.getStoreUser(Arrays.asList(text)); + if (CollectionUtils.isNotEmpty(storeUser)){ + //转换 否则验签不通过 + List storeUserUpdateDTOS = JSONObject.parseArray(JSONObject.toJSONString(storeUser), StoreUserUpdateDTO.class); + thirdFoodService.pushStoreUser(storeUserUpdateDTOS); + } + }catch (Exception e){ + log.error("StoreUserUpdateListener consume error",e); + return Action.ReconsumeLater; + }finally { + redisUtilPool.delKey(lockKey); + } + log.info("消费成功,tag:{},messageId:{},reqBody={}",message.getTag(),message.getMsgID(),text); + return Action.CommitMessage; + } + return Action.ReconsumeLater; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java index c16a436e1..919cd6d69 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java @@ -2,6 +2,11 @@ package com.cool.store.service; import com.cool.store.dto.FoodTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.store.StoreUserUpdateDTO; +import com.cool.store.response.caipin.StoreUserResponse; + +import java.util.List; /** * 正新菜品市场api对接-埃林哲-对接人徐哲 @@ -19,4 +24,11 @@ public interface ThirdFoodService { */ String getFoodToken(FoodTokenDTO dto); + /** + * 推送门店人员信息 + * @param storeUserUpdateDTOList + * @return + */ + StoreUserResponse pushStoreUser(List storeUserUpdateDTOList); + } 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 index a63e844f2..4310fb685 100644 --- 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 @@ -153,6 +153,7 @@ public class StoreServiceImpl implements StoreService { storeUserPositionDTO.setStoreId(x.getStoreId()); storeUserPositionDTO.setStoreName(x.getStoreName()); storeUserPositionDTO.setShopCode(x.getStoreNum()); + storeUserPositionDTO.setStoreCode(x.getStoreNum()); List userList = Lists.newArrayList(); for (String userId : storeUserDTOMap.keySet()) { List singleUserDTOList = storeUserDTOMap.get(userId); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java index e812a1ea6..c19bcf2c5 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java @@ -4,11 +4,15 @@ import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSONObject; import com.cool.store.dto.FoodTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.store.StoreUserUpdateDTO; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; +import com.cool.store.response.caipin.StoreUserResponse; import com.cool.store.response.oppty.OpportunityApiResponse; import com.cool.store.service.ThirdFoodService; import com.cool.store.utils.SignatureUtils; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; @@ -21,6 +25,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.net.URI; +import java.util.List; import java.util.Map; /** @@ -45,10 +50,16 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { @Override public String getFoodToken(FoodTokenDTO dto) { // 1. 发送POST请求 - String url = apiUrl + "/interface/v1/user/getToken"; + String url = "/v1/user/getToken"; return executeApiCall(url, dto, String.class); } + @Override + public StoreUserResponse pushStoreUser(List dto) { + String url = "/v1/store/updateStoreUser"; + return executeApiCall(url, dto, StoreUserResponse.class); + } + private T executeApiCall(String url, Object requestBody, Class responseType) { // 1. 打印请求前日志 @@ -62,7 +73,7 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { String responseBody = response.body().string(); // 3. 打印响应日志 - logResponse(url, response.code(), responseBody); + logResponse(apiUrl+ url, response.code(), responseBody); if (!response.isSuccessful()) { throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, @@ -94,20 +105,24 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { String random = RandomUtil.randomString(20); String signString = null; + String reqBody = null; try { - signString = SignatureUtils.sign("POST","/v1/user/getToken", objectMapper.writeValueAsString(requestBody),timestamp,random); + reqBody = objectMapper.writeValueAsString(requestBody); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + try { + signString = SignatureUtils.sign("POST",url, reqBody,timestamp,random); } catch (Exception e) { throw new ServiceException(ErrorCodeEnum.THIRD_API_SIGN_ERROR,"加密失败"); } log.info("签名生成 - 签名结果: {}", signString); - RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json"), - JSONObject.toJSONString(requestBody) - ); + RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json"), reqBody); return new Request.Builder() - .url(url) + .url(apiUrl + url) .post(body) .addHeader("X-ZhengXin-Sign", signString) .addHeader("X-ZhengXin-SignTime", timestamp) diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java index 76a71ac39..3234f4f7e 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java @@ -5,6 +5,8 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.dao.*; import com.cool.store.dto.OpenCityDTO; import com.cool.store.dto.ocr.InvoiceDTO; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.store.StoreUserUpdateDTO; import com.cool.store.entity.*; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.IDCardSideEnum; @@ -20,6 +22,7 @@ import com.cool.store.request.ShopListSuccessOpenRequest; import com.cool.store.request.xfsgFirstOrderListRequest; import com.cool.store.response.MiniShopsResponse; import com.cool.store.response.ResponseResult; +import com.cool.store.response.caipin.StoreUserResponse; import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; import com.cool.store.utils.poi.ExcelUtil; @@ -29,6 +32,7 @@ import com.github.pagehelper.PageInfo; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -77,6 +81,10 @@ public class TestController { @Resource ShopStageInfoDAO shopStageInfoDAO; + @Resource + ThirdFoodService thirdFoodService; + @Autowired + StoreService storeService; @PostMapping("/getFirstOrders") public ResponseResult getFirstOrders(@RequestBody xfsgFirstOrderListRequest storeCodeList) { @@ -354,4 +362,11 @@ public class TestController { public void initTallyBook() { xxlJobHandler.initTallyBook(); } + + @GetMapping("/pushStoreUser") + public void pushStoreUser(String storeCode){ + List storeUser = storeService.getStoreUser(Arrays.asList(storeCode)); + List storeUserUpdateDTOS = JSONObject.parseArray(JSONObject.toJSONString(storeUser), StoreUserUpdateDTO.class); + StoreUserResponse storeUserResponse = thirdFoodService.pushStoreUser(storeUserUpdateDTOS); + } } diff --git a/coolstore-partner-web/src/main/resources/application-ab.properties b/coolstore-partner-web/src/main/resources/application-ab.properties index ee3e65210..76aff14c4 100644 --- a/coolstore-partner-web/src/main/resources/application-ab.properties +++ b/coolstore-partner-web/src/main/resources/application-ab.properties @@ -116,7 +116,7 @@ yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinfood.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c diff --git a/coolstore-partner-web/src/main/resources/application-local.properties b/coolstore-partner-web/src/main/resources/application-local.properties index 12948da5d..78aa1eacb 100644 --- a/coolstore-partner-web/src/main/resources/application-local.properties +++ b/coolstore-partner-web/src/main/resources/application-local.properties @@ -123,7 +123,7 @@ yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinfood.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c diff --git a/coolstore-partner-web/src/main/resources/application-online.properties b/coolstore-partner-web/src/main/resources/application-online.properties index ae1f91591..af4c35790 100644 --- a/coolstore-partner-web/src/main/resources/application-online.properties +++ b/coolstore-partner-web/src/main/resources/application-online.properties @@ -121,7 +121,7 @@ zx.big.data.appSecret=35b8b9a400b4430fa022190be0913cd6 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinshipin.com +zx.food.url=https://datacenter.zhengxinshipin.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c diff --git a/coolstore-partner-web/src/main/resources/application-test.properties b/coolstore-partner-web/src/main/resources/application-test.properties index 40fb95fc6..cb59a966b 100644 --- a/coolstore-partner-web/src/main/resources/application-test.properties +++ b/coolstore-partner-web/src/main/resources/application-test.properties @@ -124,7 +124,7 @@ yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com -zx.food.url=https://datacenter.zhengxinfood.com +zx.food.url=https://datacenter.zhengxinfood.com/interface cool.api.appKey=k8J7fG2qR5tY9vX3 cool.api.secret=wP4sN6dL8zK2xM9c