From b2076cc6c5ea41621e59bdb08c1da87ac9b7e57a Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 27 Oct 2025 13:32:23 +0800 Subject: [PATCH] =?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; + } }