24282 9 tháng trước cách đây
mục cha
commit
3761a3b50b

+ 8 - 3
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/JdApiService.java

@@ -1,9 +1,12 @@
 package com.fjhx.victoriatourist.service.jd;
 
+import com.fjhx.victoriatourist.entity.jd.vo.JdInfoVo;
 import com.fjhx.victoriatourist.entity.jd.vo.TellBackOrderVO;
 
 public interface JdApiService {
 
+    JdInfoVo validJdInfo();
+
     /**
      * 通过code获取AccessToken
      */
@@ -29,7 +32,7 @@ public interface JdApiService {
      * @author hj
      * @date 2023/12/13 22:30
      */
-    void startJdOrder();
+    void startJdOrder(JdInfoVo jdInfoVo);
 
     /**
      * 开始京东退货单采集
@@ -37,14 +40,14 @@ public interface JdApiService {
      * @author hj
      * @date 2023/12/13 22:30
      */
-    void startJdBackOrder();
+    void startJdBackOrder(JdInfoVo jdInfoVo);
 
     /**
      * 刷新京东状态
      *
      * @param
      */
-    void refreshJdState();
+    void refreshJdState(JdInfoVo jdInfoVo);
 
     /**
      * 初始化租户字典表
@@ -52,4 +55,6 @@ public interface JdApiService {
     void initTenantDict();
 
     void compensatingProductNon();
+
+
 }

+ 3 - 10
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/constants/RunParamConstant.java

@@ -13,10 +13,9 @@ public class RunParamConstant {
     public static final String ACCESS_TOKEN = "access_token";
     public static final String REFRESH_TOKEN = "refresh_token";
 
-    public static final Integer SLEEP_TEN_SECOND = 10000;
-    public static final Integer SLEEP_ONE_MINUTE = 60000;
-
-    public static final Integer SLEEP_FIVE_MINUTE = 300000;
+    public static final int SLEEP_TEN_SECOND = 10000;
+    public static final int SLEEP_ONE_MINUTE = 60000;
+    public static final int SLEEP_FIVE_MINUTE = 300000;
 
     /**
      * 刷新token地址
@@ -31,7 +30,6 @@ public class RunParamConstant {
      **/
     public static final String JD_LOGIN_URL = "https://open-oauth.jd.com/oauth2/to_login?app_key=%s&response_type=code&redirect_uri=%s&state=%s&scope=snsapi_base";
 
-
     /**
      * 异常描述-少货
      **/
@@ -50,7 +48,6 @@ public class RunParamConstant {
      **/
     public static final String EXCEPTION = "1";
 
-
     /**
      * 异常处理状态-未处理
      **/
@@ -69,17 +66,14 @@ public class RunParamConstant {
      **/
     public static final int INBOUND = 1;
 
-
     /**
      * 多货-补单扣库存
      **/
     public static final String MULTI_CARGO_REDUCE_STOCK = "101";
-
     /**
      * 仓库已发-报损
      **/
     public static final String SHIPPED_DAMAGE = "201";
-
     /**
      * 仓库已发-补单不扣库存
      **/
@@ -117,5 +111,4 @@ public class RunParamConstant {
      **/
     public static final String BARCODE_ERROR_DAMAGE = "503";
 
-
 }

+ 9 - 11
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/factory/JdClientFactory.java

@@ -1,31 +1,29 @@
 package com.fjhx.victoriatourist.service.jd.factory;
 
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fjhx.victoriatourist.entity.jd.vo.JdInfoVo;
 import com.fjhx.victoriatourist.service.jd.JdInfoService;
 import com.fjhx.victoriatourist.service.jd.constants.JdParamConstant;
 import com.jd.open.api.sdk.DefaultJdClient;
 import com.jd.open.api.sdk.JdClient;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 
 @Component
 public class JdClientFactory {
+
     @Resource
     JdInfoService jdInfoService;
-    private JdClient jdClient = null;
-
 
-    public JdClient getJdClient() {
-        if (ObjectUtil.isNull(jdClient)) {
-            JdInfoVo jdInfoVo = jdInfoService.getOne();
-            if (StrUtil.isBlank(jdInfoVo.getAccessToken())) {
-                throw new RuntimeException("京东accessToken为空");
-            }
-            jdClient = new DefaultJdClient(JdParamConstant.SERVER_URL, jdInfoVo.getAccessToken(), JdParamConstant.appKey, JdParamConstant.appSecret);
+    @Bean
+    public JdClient jdClient() {
+        JdInfoVo jdInfoVo = jdInfoService.getOne();
+        if (StrUtil.isBlank(jdInfoVo.getAccessToken())) {
+            throw new RuntimeException("京东accessToken为空");
         }
-        return jdClient;
+        return new DefaultJdClient(JdParamConstant.SERVER_URL, jdInfoVo.getAccessToken(), JdParamConstant.appKey, JdParamConstant.appSecret);
     }
+
 }

+ 228 - 351
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdApiServiceImpl.java

@@ -4,11 +4,12 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -35,7 +36,6 @@ import com.fjhx.victoriatourist.service.jd.JdOrderService;
 import com.fjhx.victoriatourist.service.jd.constants.InitDictConstant;
 import com.fjhx.victoriatourist.service.jd.constants.JdParamConstant;
 import com.fjhx.victoriatourist.service.jd.constants.RunParamConstant;
-import com.fjhx.victoriatourist.service.jd.factory.JdClientFactory;
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.Table;
 import com.jd.open.api.sdk.JdClient;
@@ -63,6 +63,7 @@ import com.jd.open.api.sdk.response.supplier.VcGetdetailbyorderidResponse;
 import com.jd.open.api.sdk.response.supplier.VcGetpurchaseorderlistResponse;
 import com.jd.open.api.sdk.response.supplier.VcGetwaredeliverdistinctlistResponse;
 import com.jd.open.api.sdk.response.supplier.VcReturnOrderListPageGetResponse;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
@@ -74,7 +75,6 @@ import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpRequestBase;
 import org.apache.http.impl.client.HttpClients;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
@@ -85,8 +85,10 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
@@ -101,12 +103,14 @@ public class JdApiServiceImpl implements JdApiService {
         put("BackExplanationType", "图书回告不满足原因");
         put("OrderState", "订单状态");
     }};
+
     //订单状态:审核不通过/供应商驳回/已完成
     private static final ArrayList<String> notIn = new ArrayList<String>() {{
         add("7");
         add("20");
         add("3");
     }};
+
     private static final Map<String, String> returnStatesMap = new HashMap<String, String>() {{
         put("1", "初始退货单");
         put("2", "等待经理审核");
@@ -123,6 +127,7 @@ public class JdApiServiceImpl implements JdApiService {
         put("21", "等待删除确认");
         put("22", "已删除");
     }};
+
     @Autowired
     private JdOrderService jdOrderService;
     @Autowired
@@ -134,28 +139,46 @@ public class JdApiServiceImpl implements JdApiService {
     @Resource
     private JdInfoService jdInfoService;
     @Resource
-    private JdClientFactory jdClientFactory;
-    @Resource
     private ProductInfoService productInfoService;
     @Resource
     private DictTenantTypeService dictTenantTypeService;
     @Resource
     private DictTenantDataService dictTenantDataService;
+    @Resource
+    private JdClient jdClient;
 
-    /**
-     * 请求API工具方法
-     */
-    private static JSONObject getJSON(HttpRequestBase httpRequestBase) throws IOException {
-        HttpClient client = HttpClients.createDefault();
-        httpRequestBase.setConfig(RequestConfig.custom().setConnectTimeout(3000).build());
-        HttpResponse response = client.execute(httpRequestBase);
-        int statusCode = response.getStatusLine().getStatusCode();
-        HttpEntity entity = response.getEntity();
-        String responseStr = IOUtils.toString(entity.getContent(), StandardCharsets.UTF_8);
-        if (statusCode != 200) {
-            log.error("请求失败 {} {} {}", statusCode, httpRequestBase.getURI(), responseStr);
+    //每小时执行一次
+    @Scheduled(cron = "0 0 0/1 * * ?")
+    public void refreshToken() {
+        JdInfoVo jdInfoVo = jdInfoService.getOne();
+        //如果过期时间减去当前时间小于90分钟,则要刷新token
+        if (ObjectUtil.isNotNull(jdInfoVo.getExpireTime())) {
+            long between = DateUtil.between(DateUtil.date(), jdInfoVo.getExpireTime(), DateUnit.MINUTE, false);
+            if (between <= 0) {
+                if (jdInfoVo.getOnline() > 0) {
+                    jdInfoVo.setOnline(0);
+                    jdInfoService.updateById(jdInfoVo);
+                }
+            } else if (90 >= between) {
+                refreshToken(jdInfoVo);
+            }
         }
-        return JSONObject.parseObject(responseStr);
+    }
+
+    @Override
+    public JdInfoVo validJdInfo() {
+        JdInfoVo jdInfoVo = jdInfoService.getOne();
+        boolean online = jdInfoVo.getOnline() > 0;
+        if (!online) {
+            log.info("京东已经下线");
+            return null;
+        }
+        //开始校验是否符合条件
+        if (ObjectUtil.isNull(jdInfoVo.getInitQueryDate())) {
+            log.error("请线配置京东初始化查询时间");
+            return null;
+        }
+        return jdInfoVo;
     }
 
     /**
@@ -185,11 +208,10 @@ public class JdApiServiceImpl implements JdApiService {
 
     @Override
     public void tellBackOrer(TellBackOrderVO tellBackOrderVO) {
-        JdClient client = jdClientFactory.getJdClient();
         VcConfirmpurchaseorderResponse response;
         try {
             VcConfirmpurchaseorderRequest request = buildConfirmpurchaseorderRequest(tellBackOrderVO);
-            response = client.execute(request);
+            response = jdClient.execute(request);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -227,26 +249,6 @@ public class JdApiServiceImpl implements JdApiService {
         return request;
     }
 
-    //每小时执行一次
-    @Scheduled(cron = "0 0 0/1  * * ? ")
-    //每分钟执行一次
-//    @Scheduled(cron = "0 0/1 *  * * ? ")
-    void refreshToken() {
-        JdInfoVo jdInfoVo = jdInfoService.getOne();
-        //如果过期时间减去当前时间小于90分钟,则要刷新token
-        if (ObjectUtil.isNotNull(jdInfoVo.getExpireTime())) {
-            long between = DateUtil.between(DateUtil.date(), jdInfoVo.getExpireTime(), DateUnit.MINUTE, false);
-            if (between <= 0) {
-                if (jdInfoVo.getOnline() > 0) {
-                    jdInfoVo.setOnline(0);
-                    jdInfoService.updateById(jdInfoVo);
-                }
-            } else if (90 >= between) {
-                refreshToken(jdInfoVo);
-            }
-        }
-    }
-
     /**
      * 刷新Token
      */
@@ -275,73 +277,53 @@ public class JdApiServiceImpl implements JdApiService {
      * @author hj
      * @date 2023/12/13 22:30
      */
-    @Async
-    public void startJdOrder() {
-        ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
-        JdClient jdClient = jdClientFactory.getJdClient();
-        while (true) {
-            JdInfoVo jdInfoVo = validJdInfo();
-            if (ObjectUtil.isNull(jdInfoVo)) {
-                ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
-                continue;
-            }
-            getJdOrderList(jdClient, jdInfoVo);
-            log.info("京东订单采集完成");
-            ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
+    @DSTransactional
+    @Override
+    public void startJdOrder(JdInfoVo jdInfoVo) {
+        if (ObjectUtil.isNull(jdInfoVo)) {
+            return;
         }
+
+        saveJdOrder(jdInfoVo);
+        log.info("京东订单采集完成");
     }
 
     /**
      * 开始京东退货单采集
-     *
-     * @author hj
-     * @date 2023/12/13 22:30
      */
-    @Async
-    public void startJdBackOrder() {
-        ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
-        JdClient jdClient = jdClientFactory.getJdClient();
-        while (true) {
-            JdInfoVo jdInfoVo = validJdInfo();
-            if (ObjectUtil.isNull(jdInfoVo)) {
-                ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
-                continue;
-            }
-            getJdBackOrder(jdClient, jdInfoVo);
-            log.info("京东退货单采集完成");
-            ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
+    @DSTransactional
+    @Override
+    public void startJdBackOrder(JdInfoVo jdInfoVo) {
+        if (ObjectUtil.isNull(jdInfoVo)) {
+            return;
         }
+
+        getJdBackOrder(jdInfoVo);
+        log.info("京东退货单采集完成");
     }
 
     /**
      * 刷新京东状态
-     *
-     * @param
      */
-    @Async
-    public void refreshJdState() {
-        ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
-        JdClient jdClient = jdClientFactory.getJdClient();
-        while (true) {
-            JdInfoVo jdInfoVo = validJdInfo();
-            if (ObjectUtil.isNull(jdInfoVo)) {
-                ThreadUtil.safeSleep(RunParamConstant.SLEEP_FIVE_MINUTE);
-                continue;
-            }
-            handleRefreshDate(jdClient);
-            log.info("刷新京东状态完成");
-            ThreadUtil.safeSleep(RunParamConstant.SLEEP_FIVE_MINUTE);
+    @DSTransactional
+    @Override
+    public void refreshJdState(JdInfoVo jdInfoVo) {
+        if (ObjectUtil.isNull(jdInfoVo)) {
+            return;
         }
+
+        handleRefreshDate();
+        log.info("刷新京东状态完成");
     }
 
     /**
      * 初始化租户字典表
      */
-    @Async
+    @DSTransactional
+    @Override
     public void initTenantDict() {
-        JdClient jdClient = jdClientFactory.getJdClient();
-        handleDeliveryCenter(jdClient);
-        handleComponent(jdClient);
+        handleDeliveryCenter();
+        handleComponent();
         handleReturnStates();
         System.out.println("字典初始化完成");
     }
@@ -349,8 +331,8 @@ public class JdApiServiceImpl implements JdApiService {
     /**
      * 补偿商品id为空
      */
+    @DSTransactional
     @Override
-    @Async
     public void compensatingProductNon() {
         SecurityUtils.setTenantId(RunParamConstant.tenantId);
         DynamicDataSourceContextHolder.push(SourceConstant.ITEM);
@@ -371,13 +353,25 @@ public class JdApiServiceImpl implements JdApiService {
     }
 
     /**
+     * 请求API工具方法
+     */
+    private static JSONObject getJSON(HttpRequestBase httpRequestBase) throws IOException {
+        HttpClient client = HttpClients.createDefault();
+        httpRequestBase.setConfig(RequestConfig.custom().setConnectTimeout(3000).build());
+        HttpResponse response = client.execute(httpRequestBase);
+        int statusCode = response.getStatusLine().getStatusCode();
+        HttpEntity entity = response.getEntity();
+        String responseStr = IOUtils.toString(entity.getContent(), StandardCharsets.UTF_8);
+        if (statusCode != 200) {
+            log.error("请求失败 {} {} {}", statusCode, httpRequestBase.getURI(), responseStr);
+        }
+        return JSONObject.parseObject(responseStr);
+    }
+
+    /**
      * 处理刷新token数据
-     *
-     * @param jdClient
-     * @author hj
-     * @date 2023/12/21 9:01
      */
-    public void handleRefreshDate(JdClient jdClient) {
+    private void handleRefreshDate() {
         DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
         SecurityUtils.setTenantId(RunParamConstant.tenantId);
         try {
@@ -401,7 +395,7 @@ public class JdApiServiceImpl implements JdApiService {
                 List<JdOrder> records = pages.get(pageIndex - 1);
 
                 List<Long> orderIds = records.stream().map(JdOrder::getOrderId).collect(Collectors.toList());
-                JOSOrderResultDto josOrderResultDto = getJdOrderInfo(1, pageSize + 20, records.get(0).getCreatedDate(), DateUtil.offsetDay(records.get(0).getCreatedDate(), 90), jdClient, orderIds);
+                JOSOrderResultDto josOrderResultDto = getJdOrderInfo(1, pageSize + 20, records.get(0).getCreatedDate(), DateUtil.offsetDay(records.get(0).getCreatedDate(), 90), orderIds);
                 List<PurchaseOrderDto> purchaseOrderList = josOrderResultDto.getPurchaseOrderList();
                 List<JdOrder> jdOrderList = BeanUtil.copyToList(purchaseOrderList, JdOrder.class);
                 Map<Long, JdOrder> collect = records.stream().collect(Collectors.toMap(JdOrder::getOrderId, o -> o));
@@ -412,7 +406,7 @@ public class JdApiServiceImpl implements JdApiService {
                     if (JdParamConstant.JD_ORDER_STATE_FINISH.equals(jdOrder.getState())) {
                         List<JdOrderDetails> jdOrderDetailsList = new ArrayList<>();
                         //重新插入明细
-                        boolean hasExFlag = dealOrderDetail(jdClient, jdOrder, jdOrderDetailsList);
+                        boolean hasExFlag = dealOrderDetail(jdOrder, jdOrderDetailsList);
                         DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
                         //获取当前明细记录
                         List<JdOrderDetails> dbJdOrderDetails = jdOrderDetailsService.lambdaQuery().eq(JdOrderDetails::getJdOrderId, id).list();
@@ -451,12 +445,12 @@ public class JdApiServiceImpl implements JdApiService {
         } catch (Exception e) {
             log.error("刷新京东状态失败", e);
         } finally {
-            DynamicDataSourceContextHolder.poll();
+            DynamicDataSourceContextHolder.clear();
             SecurityUtils.clearTenantId();
         }
     }
 
-    private boolean dealOrderDetail(JdClient jdClient, JdOrder jdOrder, List<JdOrderDetails> jdOrderDetailsList) throws Exception {
+    private boolean dealOrderDetail(JdOrder jdOrder, List<JdOrderDetails> jdOrderDetailsList) throws Exception {
         VcGetdetailbyorderidRequest request = new VcGetdetailbyorderidRequest();
         request.setOrderId(jdOrder.getOrderId());
         request.setIsPage(false);
@@ -464,7 +458,9 @@ public class JdApiServiceImpl implements JdApiService {
         JOSDetailResultDto josDetailResultDto = response.getJosDetailResultDto();
         List<PurchaseAllocationDetailDto> purchaseAllocationDetailList = ObjectUtil.isNull(josDetailResultDto) ? new ArrayList<>()
                 : josDetailResultDto.getPurchaseAllocationDetailList();
+
         List<JdOrderDetails> jdOrderDetails = BeanUtil.copyToList(purchaseAllocationDetailList, JdOrderDetails.class);
+
         DynamicDataSourceContextHolder.push(SourceConstant.ITEM);
         AtomicBoolean hasExFlag = new AtomicBoolean(false);
         jdOrderDetails.forEach(item -> {
@@ -510,12 +506,8 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理回告状态、订单属性、删除状态、图书回告不满足原因、订单状态
-     *
-     * @param jdClient
-     * @author hj
-     * @date 2023/12/13 21:56
      */
-    private void handleComponent(JdClient jdClient) {
+    private void handleComponent() {
         componentDictTypeMap.forEach((k, v) -> {
             VcGetcomponentlistRequest request = new VcGetcomponentlistRequest();
             DynamicDataSourceContextHolder.push(SourceConstant.BASE);
@@ -546,12 +538,8 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理配送中心字典转换
-     *
-     * @param jdClient
-     * @author hj
-     * @date 2023/12/13 21:55
      */
-    public void handleDeliveryCenter(JdClient jdClient) {
+    private void handleDeliveryCenter() {
         //获取京东仓库,并存入字典表
         VcGetwaredeliverdistinctlistRequest request = new VcGetwaredeliverdistinctlistRequest();
         DynamicDataSourceContextHolder.push(SourceConstant.BASE);
@@ -576,9 +564,6 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理jd退货状态字典
-     *
-     * @author hj
-     * @date 2023/12/20 22:27
      */
     private void handleReturnStates() {
         DynamicDataSourceContextHolder.push(SourceConstant.BASE);
@@ -599,11 +584,7 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理字典表
-     *
-     * @author hj
-     * @date 2023/12/21 9:01
      */
-
     private void handleDictData(List<CommonDictData> commonDictDataList, DictTenantType dictTenantType) {
         //查出原来的字典
         List<DictTenantData> list = dictTenantDataService.lambdaQuery().eq(DictTenantData::getDictCode, dictTenantType.getCode()).orderByAsc(DictTenantData::getSort).list();
@@ -634,11 +615,6 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理字典类型表
-     *
-     * @param code
-     * @param name
-     * @author hj
-     * @date 2023/12/13 22:03
      */
     private DictTenantType handleDictType(String code, String name) {
         DictTenantType dictTenantType = new DictTenantType();
@@ -661,248 +637,145 @@ public class JdApiServiceImpl implements JdApiService {
     /**
      * 获取京东订单
      */
-    private void getJdOrderList(JdClient client, JdInfoVo jdInfoVo) {
+    private void saveJdOrder(JdInfoVo jdInfoVo) {
         DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
         SecurityUtils.setTenantId(RunParamConstant.tenantId);
+
+        //获取开始同步的时间
+        Date startTime = jdInfoVo.getInitQueryDate();
+        Date endTime = new Date();
+
+        //根据下单时间获取数据库里最后一个订单
+        JdOrder lastJdOrder = jdOrderService.getOne(q -> q.orderByDesc(JdOrder::getCreatedDate));
+        if (ObjectUtil.isNotNull(lastJdOrder)) {
+            startTime = lastJdOrder.getCreatedDate();
+        }
+
         try {
-            int pageIndex = 1;
-            int totalPage = 1;
-            int pageSize = 50;
-            do {
+            List<PurchaseOrderDto> purchaseOrderDtoList = getJdOrderInfo(startTime, endTime, null);
 
-                //获取开始同步的时间
-                Date startTime = jdInfoVo.getInitQueryDate();
-                Date endTime = new Date();
-                //根据下单时间获取数据库里最后一个订单
-                JdOrder lastJdOrder = jdOrderService.lambdaQuery().isNotNull(JdOrder::getCreatedDate).orderByDesc(JdOrder::getCreatedDate).last("limit 1").oneOpt().orElse(null);
-                if (ObjectUtil.isNotNull(lastJdOrder)) {
-                    //将最后一个下单时间减1个小时设置为开始时间
-                    startTime = DateUtil.offsetHour(lastJdOrder.getCreatedDate(), -1);
-                }
-                //计算总页数
-                JOSOrderResultDto josOrderResultDto = getJdOrderInfo(pageIndex, pageSize, startTime, endTime, client, null);
-                totalPage = (josOrderResultDto.getRecordCount() / pageSize) + (josOrderResultDto.getRecordCount() % pageSize > 0 ? 1 : 0);
+            if (CollectionUtil.isEmpty(purchaseOrderDtoList)) {
+                return;
+            }
 
-                //数据返回订单是倒序反过来按正顺保存
-                List<PurchaseOrderDto> purchaseOrderList = josOrderResultDto.getPurchaseOrderList();
-                //京东回来的数据是按时间倒序的,使用reverse方法将list中的数据翻转为正序
-                Collections.reverse(purchaseOrderList);
-
-                //处理数据(过滤已存在的数据)
-                List<Long> jdOrderIds = purchaseOrderList.stream().map(PurchaseOrderDto::getOrderId).collect(Collectors.toList());
-                if (CollectionUtil.isNotEmpty(jdOrderIds)) {
-                    //获取已同步的京东订单id
-                    List<Long> existOrderIds = jdOrderService.lambdaQuery().select(JdOrder::getOrderId).in(JdOrder::getOrderId, jdOrderIds).list().stream().map(JdOrder::getOrderId).collect(Collectors.toList());
-                    //过滤出未同步的数据
-                    List<PurchaseOrderDto> purchaseOrderListFilter = purchaseOrderList.stream().filter(item -> !existOrderIds.contains(item.getOrderId())).collect(Collectors.toList());
-                    //转为系统自己的实体类
-                    List<JdOrder> jdOrderList = BeanUtil.copyToList(purchaseOrderListFilter, JdOrder.class);
-                    //赋值租户id
-                    jdOrderList.forEach(item -> item.setTenantId(RunParamConstant.tenantId));
-
-                    //TransactionUtil.execute(() -> {
-
-                    //将数据存储到库
-                    jdOrderService.saveBatch(jdOrderList);
-
-                    //获取明细
-                    List<JdOrderDetails> jdOrderDetailsList = new ArrayList<>();
-
-                    for (JdOrder jdOrder : jdOrderList) {
-                        boolean hasExFlag;
-                        try {
-                            hasExFlag = dealOrderDetail(client, jdOrder, jdOrderDetailsList);
-                        } catch (Exception e) {
-                            log.error("获取京东订单明细出错:" + e.getMessage(), e);
-                            throw new RuntimeException(e);
-                        }
+            // 订单id集合
+            Set<Long> orderIdSet = purchaseOrderDtoList.stream().map(PurchaseOrderDto::getOrderId).collect(Collectors.toSet());
 
-                        if (hasExFlag) {
-                            jdOrder.setHasEx(RunParamConstant.EXCEPTION);
-                            jdOrder.setHandleStatus(RunParamConstant.EXCEPTION_STATE_UNTREATED);
-                            jdOrderService.updateById(jdOrder);
-                        }
-                    }
+            // 获取已同步的京东订单id
+            Set<Long> existOrderIdSet = jdOrderService.list(q -> q.select(JdOrder::getOrderId).in(JdOrder::getOrderId, orderIdSet))
+                    .stream().map(JdOrder::getOrderId).collect(Collectors.toSet());
+
+            // 过滤已同步的订单
+            purchaseOrderDtoList = purchaseOrderDtoList.stream()
+                    .filter(item -> !existOrderIdSet.contains(item.getOrderId()))
+                    .collect(Collectors.toList());
+
+            //转为系统自己的实体类
+            List<JdOrder> jdOrderList = BeanUtil.copyToList(purchaseOrderDtoList, JdOrder.class);
+
+            //获取明细
+            List<JdOrderDetails> jdOrderDetailsList = new ArrayList<>();
+
+            for (JdOrder jdOrder : jdOrderList) {
+                jdOrder.setId(IdWorker.getId());
+                jdOrder.setTenantId(RunParamConstant.tenantId);
 
-                    DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
-                    jdOrderDetailsService.saveOrUpdateBatch(jdOrderDetailsList);
-                    //});
+                boolean hasExFlag = dealOrderDetail(jdOrder, jdOrderDetailsList);
 
+                if (hasExFlag) {
+                    jdOrder.setHasEx(RunParamConstant.EXCEPTION);
+                    jdOrder.setHandleStatus(RunParamConstant.EXCEPTION_STATE_UNTREATED);
                 }
-                pageIndex++;
-            } while (pageIndex <= totalPage);
+
+            }
+
+            //将数据存储到库
+            jdOrderService.saveBatch(jdOrderList);
+
+            DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
+            jdOrderDetailsService.saveOrUpdateBatch(jdOrderDetailsList);
+
         } catch (Exception e) {
-            log.error("获取京东订单出错:" + e.getMessage(), e);
+            log.error("获取京东订单出错:{}", e.getMessage(), e);
         } finally {
             SecurityUtils.clearTenantId();
             DynamicDataSourceContextHolder.clear();
         }
+
     }
 
     /**
      * 获取京东退货订单
      */
-    private void getJdBackOrder(JdClient client, JdInfoVo jdInfoVo) {
+    private void getJdBackOrder(JdInfoVo jdInfoVo) {
         DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
         SecurityUtils.setTenantId(RunParamConstant.tenantId);
         try {
-            int pageIndex = 1;
-            int totalPage = 1;
-            int pageSize = 50;
-            do {
-                Date startTime = jdInfoVo.getInitQueryDate();
-                Date endTime = new Date();
-                //根据下单时间获取数据库里最后一个订单
-                JdBack lastJdBack = jdBackService.lambdaQuery().isNotNull(JdBack::getCreateDate).orderByDesc(JdBack::getCreateDate).last("limit 1").oneOpt().orElse(null);
-                if (ObjectUtil.isNotNull(lastJdBack)) {
-                    //将最后一个下单时间减1个小时设置为开始时间
-                    startTime = DateUtil.offsetHour(lastJdBack.getCreateDate(), -1);
-                }
-                //计算总页数
-                RoResultDto jdBackOrderInfo = getJdBackInfo(pageIndex, pageSize, startTime, endTime, client);
-                totalPage = (jdBackOrderInfo.getRecordCount() / pageSize) + (jdBackOrderInfo.getRecordCount() % pageSize > 0 ? 1 : 0);
-
-                //京东回来的数据是按时间倒序的,使用reverse方法将list中的数据翻转为正序
-                List<RoDto> roDtoList = jdBackOrderInfo.getRoDtoList();
-                Collections.reverse(roDtoList);
-
-                //过滤出不在数据库里的新数据
-                List<Long> returnIds = roDtoList.stream().map(RoDto::getReturnId).collect(Collectors.toList());
-                if (CollectionUtil.isNotEmpty(returnIds)) {
-                    List<Long> existReturnIds = jdBackService.lambdaQuery().select(JdBack::getReturnId).in(JdBack::getReturnId, returnIds).list().stream().map(JdBack::getReturnId).collect(Collectors.toList());
-                    roDtoList = roDtoList.stream().filter(item -> !existReturnIds.contains(item.getReturnId())).collect(Collectors.toList());
-                    //转成我们自己的实体类
-                    List<JdBack> jdBackList = BeanUtil.copyToList(roDtoList, JdBack.class);
-                    //赋值租户id
-                    //jdBackList.forEach(item -> item.setTenantId(tenantId));
-                    jdBackService.saveBatch(jdBackList);
-                    //获取明细
-                    List<JdBackDetails> JdBackDetailsList = new ArrayList<>();
-                    for (JdBack jdBack : jdBackList) {
-                        VcGetReturnOrderDetailRequest request = new VcGetReturnOrderDetailRequest();
-                        request.setReturnId(jdBack.getReturnId());
-                        VcGetReturnOrderDetailResponse response = client.execute(request);
-                        DetailResultDto detailResultDto = response.getDetailResultDto();
-                        List<JdBackDetails> jdBackDetails = BeanUtil.copyToList(detailResultDto.getDetailDtoList(), JdBackDetails.class);
-                        DynamicDataSourceContextHolder.push(SourceConstant.ITEM);
-                        jdBackDetails.forEach(item -> {
-                            item.setJdBackId(jdBack.getId());
-                            //产品编码
-                            Long wareId = item.getWareId();
-                            List<ProductInfo> list = productInfoService.lambdaQuery().eq(ProductInfo::getCustomCode, wareId).list();
-                            if (CollectionUtil.isEmpty(list)) {
-                                //TODO 没有产品触发异常;
-                            } else {
-                                item.setProductId(list.get(0).getId());
-                            }
-                        });
-                        JdBackDetailsList.addAll(jdBackDetails);
-                    }
-                    DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
-                    jdBackDetailsService.saveBatch(JdBackDetailsList);
-                }
-                pageIndex++;
-            } while (pageIndex <= totalPage);
-        } catch (Exception e) {
-            log.error("获取京东退货订单出错:" + e.getMessage(), e);
-        } finally {
-            SecurityUtils.clearTenantId();
-            DynamicDataSourceContextHolder.clear();
-        }
-
-    }
-
-
-    /**
-     * 获取京东退货订单
-     */
-    /*private void getJdSalesReturns(JdClient client, JdInfoVo jdInfoVo) throws Exception {
-        int pageIndex = 1;
-        int totalPage = 1;
-        int pageSize = 50;
-        do {
             Date startTime = jdInfoVo.getInitQueryDate();
             Date endTime = new Date();
             //根据下单时间获取数据库里最后一个订单
-            JdSalesReturns jdSalesReturns = jdSalesReturnsService.getOne(q -> q.isNotNull(JdSalesReturns::getCreateTime).orderByDesc(JdSalesReturns::getCreateTime));
-            if (ObjectUtil.isNotEmpty(jdSalesReturns)) {
-                //将最后一个下单时间减1个小时设置为开始时间
-                startTime = DateUtil.offsetHour(jdSalesReturns.getCreateTime(), -1);
+            JdBack lastJdBack = jdBackService.getOne(q -> q.orderByDesc(JdBack::getCreateDate));
+            if (ObjectUtil.isNotNull(lastJdBack)) {
+                //将最后一个下单时间设置为开始时间
+                startTime = lastJdBack.getCreateDate();
+            }
+
+            List<RoDto> roDtoList = getJdBackInfo(startTime, endTime);
+            if (CollectionUtil.isEmpty(roDtoList)) {
+                return;
             }
-            //计算总页数
-            RoResultDto jdSalesReturnsInfo = getJdSalesReturnsInfo(pageIndex, pageSize, startTime, endTime, client);
-            totalPage = (jdSalesReturnsInfo.getRecordCount()/pageSize)+(jdSalesReturnsInfo.getRecordCount()%pageSize>0?1:0);
-            Integer recordCount = jdSalesReturnsInfo.getRecordCount();
-            List<RoDto> roDtoList = jdSalesReturnsInfo.getRoDtoList();
-            //京东回来的数据是按时间倒序的,使用reverse方法将list中的数据翻转为正序
-            Collections.reverse(roDtoList);
 
             //过滤出不在数据库里的新数据
             List<Long> returnIds = roDtoList.stream().map(RoDto::getReturnId).collect(Collectors.toList());
-            List<Long> existReturnIds = jdSalesReturnsService.listObject(JdSalesReturns::getRefundId, q -> q.in(JdSalesReturns::getRefundId, returnIds));
+            List<Long> existReturnIds = jdBackService.list(q -> q.select(JdBack::getReturnId).in(JdBack::getReturnId, returnIds))
+                    .stream().map(JdBack::getReturnId).collect(Collectors.toList());
             roDtoList = roDtoList.stream().filter(item -> !existReturnIds.contains(item.getReturnId())).collect(Collectors.toList());
+
             //转成我们自己的实体类
             List<JdBack> jdBackList = BeanUtil.copyToList(roDtoList, JdBack.class);
-            jdBackService.saveBatch(jdBackList);
-//            //获取明细
+
+            //获取明细
             List<JdBackDetails> JdBackDetailsList = new ArrayList<>();
+
+            Set<Long> wareIdSet = new HashSet<>();
+
             for (JdBack jdBack : jdBackList) {
+                jdBack.setId(IdWorker.getId());
+
                 VcGetReturnOrderDetailRequest request = new VcGetReturnOrderDetailRequest();
                 request.setReturnId(jdBack.getReturnId());
-                VcGetReturnOrderDetailResponse response = client.execute(request);
+                VcGetReturnOrderDetailResponse response = jdClient.execute(request);
                 DetailResultDto detailResultDto = response.getDetailResultDto();
-
                 List<JdBackDetails> jdBackDetails = BeanUtil.copyToList(detailResultDto.getDetailDtoList(), JdBackDetails.class);
+
                 jdBackDetails.forEach(item -> {
                     item.setJdBackId(jdBack.getId());
-                    //产品编码
-                    Long wareId = item.getWareId();
-                    List<ProductInfo> list = productInfoService.lambdaQuery().eq(ProductInfo::getCustomCode, wareId).list();
-                    if(CollectionUtil.isEmpty(list)){
-                        //TODO 没有产品触发异常;
-                    }else {
-                        item.setProductId(list.get(0).getId());
-                    }
+                    wareIdSet.add(item.getWareId());
                 });
                 JdBackDetailsList.addAll(jdBackDetails);
             }
+
+            // 赋值产品编码
+            DynamicDataSourceContextHolder.push(SourceConstant.ITEM);
+            Map<String, Long> map = productInfoService.mapKV(ProductInfo::getCustomCode, BaseIdPo::getId,
+                    q -> q.in(ProductInfo::getCustomCode, wareIdSet));
+            JdBackDetailsList.forEach(item -> item.setProductId(map.get(item.getWareId().toString())));
+
+            DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
+            jdBackService.saveBatch(jdBackList);
             jdBackDetailsService.saveBatch(JdBackDetailsList);
-            pageIndex++;
-        } while (pageIndex <= totalPage);
 
-    }*/
-    public void startJdSalesReturns() {
-        JdClient jdClient = jdClientFactory.getJdClient();
-        while (true) {
-            JdInfoVo jdInfoVo = jdInfoService.getOne();
-            boolean online = jdInfoVo.getOnline() > 0 ? true : false;
-            if (!online) {
-                log.info("京东已经下线");
-                ThreadUtil.safeSleep(RunParamConstant.SLEEP_TEN_SECOND);
-                continue;
-            }
-            //开始校验是否符合条件
-            if (ObjectUtil.isNull(jdInfoVo.getInitQueryDate())) {
-                log.error("请线配置京东初始化查询时间");
-                ThreadUtil.safeSleep(RunParamConstant.SLEEP_TEN_SECOND);
-                continue;
-            }
-            try {
-                getJdBackOrder(jdClient, jdInfoVo);
-            } catch (Exception e) {
-                log.error("获取京东订单列表出错:" + e.getMessage(), e);
-            }
-            ThreadUtil.safeSleep(30000);
+        } catch (Exception e) {
+            log.error("获取京东退货订单出错:{}", e.getMessage(), e);
+        } finally {
+            SecurityUtils.clearTenantId();
+            DynamicDataSourceContextHolder.clear();
         }
+
     }
 
     /**
      * 将jd返回的json对象转换成jdInfoVo
-     *
-     * @param responseJson
-     * @param jdInfoVo
-     * @author hj
-     * @date 2023/12/10 22:03
      */
     private void convertJdInfoVO(JSONObject responseJson, JdInfoVo jdInfoVo) {
         jdInfoVo.setAccessToken(responseJson.getString(RunParamConstant.ACCESS_TOKEN));
@@ -919,10 +792,6 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理jd返回对象
-     *
-     * @param responseJson
-     * @author hj
-     * @date 2023/12/10 22:07
      */
     private void dealJdTokenResponse(JSONObject responseJson) {
         if (ObjectUtil.isNotEmpty(responseJson.getString(RunParamConstant.ACCESS_TOKEN)) && ObjectUtil.isNotEmpty(responseJson.getString(RunParamConstant.REFRESH_TOKEN))) {
@@ -936,11 +805,10 @@ public class JdApiServiceImpl implements JdApiService {
         }
     }
 
-
     /**
      * 获取京东订单信息分页
      */
-    private JOSOrderResultDto getJdOrderInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime, JdClient client, List<Long> orderIds) throws Exception {
+    private JOSOrderResultDto getJdOrderInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime, List<Long> orderIds) throws Exception {
         VcGetpurchaseorderlistRequest request = new VcGetpurchaseorderlistRequest();
         request.setCreatedDateStart(startTime);
         request.setCreatedDateEnd(endTime);
@@ -950,41 +818,66 @@ public class JdApiServiceImpl implements JdApiService {
             String orderIdsStr = orderIds.stream().map(Object::toString).collect(Collectors.joining(","));
             request.setOrderIds(orderIdsStr);
         }
-        VcGetpurchaseorderlistResponse response = client.execute(request);
+        VcGetpurchaseorderlistResponse response = jdClient.execute(request);
         validSuccess(response, "获取京东订单信息分页");
         return response.getJosOrderResultDto();
     }
 
     /**
+     * 获取京东订单信息分页
+     */
+    private List<PurchaseOrderDto> getJdOrderInfo(Date startTime, Date endTime, List<Long> orderIds) throws Exception {
+        int pageIndex = 1;
+        int pageSize = 50;
+        int recordCount;
+
+        List<PurchaseOrderDto> purchaseOrderDtoList = new ArrayList<>();
+        do {
+            JOSOrderResultDto jdOrderInfo = getJdOrderInfo(pageIndex, pageSize, startTime, endTime, orderIds);
+            pageIndex++;
+            purchaseOrderDtoList.addAll(jdOrderInfo.getPurchaseOrderList());
+            recordCount = jdOrderInfo.getRecordCount();
+        } while (recordCount > (pageIndex - 1) * pageSize);
+        Collections.reverse(purchaseOrderDtoList);
+
+        return purchaseOrderDtoList;
+    }
+
+    /**
      * 获取京东退货单信息分页
      */
-    private RoResultDto getJdBackInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime, JdClient client) throws Exception {
+    private RoResultDto getJdBackInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime) throws Exception {
         VcReturnOrderListPageGetRequest request = new VcReturnOrderListPageGetRequest();
         request.setCreateDateBegin(startTime);
         request.setCreateDateEnd(endTime);
-        request.setPageSize(pageIndex);
-        request.setPageIndex(pageSize);
-        VcReturnOrderListPageGetResponse response = client.execute(request);
+        request.setPageSize(pageSize);
+        request.setPageIndex(pageIndex);
+        VcReturnOrderListPageGetResponse response = jdClient.execute(request);
         validSuccess(response, "获取京东退货单信息分页");
         return response.getRoResultDto();
     }
 
     /**
-     * 获取京东退货售后单信息分页
+     * 获取京东单信息分页
      */
-/*    private RoResultDto getJdSalesReturnsInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime, JdClient client) throws Exception {
-        EdiwsRoRefundInfoListRequest request=new EdiwsRoRefundInfoListRequest();
-        request.setCreateDateBegin(startTime);
-        request.setCreateDateEnd(endTime);
-        request.setPageSize(pageIndex);
-        request.setPageIndex(pageSize);
-        VcReturnOrderListPageGetResponse response = client.execute(request);
-        validSuccess(response, "获取京东退货单信息分页");
-        return response.getRoResultDto();
-    }*/
+    private List<RoDto> getJdBackInfo(Date startTime, Date endTime) throws Exception {
+        int pageIndex = 1;
+        int pageSize = 50;
+        int recordCount;
 
+        List<RoDto> roDtoList = new ArrayList<>();
+        do {
+            RoResultDto roResultDto = getJdBackInfo(pageIndex, pageSize, startTime, endTime);
+            roDtoList.addAll(roResultDto.getRoDtoList());
+            recordCount = roResultDto.getRecordCount();
+            pageIndex++;
+        } while (recordCount > (pageIndex - 1) * pageSize);
+        Collections.reverse(roDtoList);
+
+        return roDtoList;
+    }
 
-    void validSuccess(AbstractResponse response, String method) {
+    private void validSuccess(AbstractResponse response, String method) {
         String code = response.getCode();
         if (!"0".equals(code)) {
             log.error("获取{}失败:{}", method, response.getZhDesc());
@@ -992,20 +885,4 @@ public class JdApiServiceImpl implements JdApiService {
         }
     }
 
-
-    private JdInfoVo validJdInfo() {
-        JdInfoVo jdInfoVo = jdInfoService.getOne();
-        boolean online = jdInfoVo.getOnline() > 0 ? true : false;
-        if (!online) {
-            log.info("京东已经下线");
-            return null;
-        }
-        //开始校验是否符合条件
-        if (ObjectUtil.isNull(jdInfoVo.getInitQueryDate())) {
-            log.error("请线配置京东初始化查询时间");
-            return null;
-        }
-        return jdInfoVo;
-    }
-
 }

+ 25 - 22
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/initializers/JdInitializer.java

@@ -1,10 +1,13 @@
 package com.fjhx.victoriatourist.service.jd.initializers;
 
-import cn.hutool.extra.spring.SpringUtil;
+import com.fjhx.victoriatourist.entity.jd.vo.JdInfoVo;
 import com.fjhx.victoriatourist.service.jd.JdApiService;
+import com.fjhx.victoriatourist.service.jd.constants.RunParamConstant;
+import org.springframework.context.annotation.Profile;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 
 /**
@@ -13,34 +16,34 @@ import javax.annotation.Resource;
  * @author hj
  * @date 2023/12/21 9:11
  */
+@Profile("prod")
 @Component
+@EnableScheduling
 public class JdInitializer {
+
     @Resource
     private JdApiService jdApiService;
 
+    @Scheduled(initialDelay = 1000, fixedDelay = RunParamConstant.SLEEP_ONE_MINUTE)
+    public void jdTask() {
+
+        JdInfoVo jdInfoVo = jdApiService.validJdInfo();
+
+        // 收集京东采购单
+        jdApiService.startJdOrder(jdInfoVo);
+
+        // 收集京东退货单
+        jdApiService.startJdBackOrder(jdInfoVo);
 
-    /**
-     * 数据初始化
-     *
-     * @author hj
-     * @date 2023/12/19 21:15
-     */
-    @PostConstruct
-    public void dataInitializer() {
-        // 初始化数据的代码
-        if (!"prod".equals(SpringUtil.getActiveProfile())) {
-            return;
-        }
-        //收集京东采购单
-        jdApiService.startJdOrder();
-        //收集京东退货单
-        jdApiService.startJdBackOrder();
-        //刷新京东订单状态与信息
-        jdApiService.refreshJdState();
-        //初始化字典
+        // 刷新京东订单状态与信息
+        jdApiService.refreshJdState(jdInfoVo);
+
+        // 初始化字典
         jdApiService.initTenantDict();
-        //补偿商品id为空
+
+        // 补偿商品id为空
         jdApiService.compensatingProductNon();
 
     }
+
 }