24282 10 місяців тому
батько
коміт
0e5961c461

+ 40 - 0
hx-common/src/main/java/com/fjhx/common/utils/TransactionUtil.java

@@ -0,0 +1,40 @@
+package com.fjhx.common.utils;
+
+import cn.hutool.extra.spring.SpringUtil;
+import lombok.NonNull;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.TransactionCallbackWithoutResult;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import java.util.function.Supplier;
+
+public class TransactionUtil {
+
+    private final static TransactionTemplate transactionTemplate = SpringUtil.getBean(TransactionTemplate.class);
+
+    public static void execute(Runnable runnable) {
+        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
+            @Override
+            protected void doInTransactionWithoutResult(@NonNull TransactionStatus status) {
+                try {
+                    runnable.run();
+                } catch (Exception e) {
+                    status.setRollbackOnly();
+                    throw e;
+                }
+            }
+        });
+    }
+
+    public static <T> T execute(Supplier<T> supplier) {
+        return transactionTemplate.execute(status -> {
+            try {
+                return supplier.get();
+            } catch (Exception e) {
+                status.setRollbackOnly();
+                throw e;
+            }
+        });
+    }
+
+}

+ 158 - 127
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdApiServiceImpl.java

@@ -10,6 +10,7 @@ import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.utils.TransactionUtil;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.tenant.entity.dict.dto.DictTenantDataDto;
@@ -26,7 +27,12 @@ import com.fjhx.victoriatourist.entity.jd.po.JdOrderDetails;
 import com.fjhx.victoriatourist.entity.jd.vo.CommonDictData;
 import com.fjhx.victoriatourist.entity.jd.vo.JdInfoVo;
 import com.fjhx.victoriatourist.entity.jd.vo.TellBackOrderVO;
-import com.fjhx.victoriatourist.service.jd.*;
+import com.fjhx.victoriatourist.service.jd.JdApiService;
+import com.fjhx.victoriatourist.service.jd.JdBackDetailsService;
+import com.fjhx.victoriatourist.service.jd.JdBackService;
+import com.fjhx.victoriatourist.service.jd.JdInfoService;
+import com.fjhx.victoriatourist.service.jd.JdOrderDetailsService;
+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;
@@ -43,9 +49,21 @@ import com.jd.open.api.sdk.domain.supplier.PoQueryForJosWebService.response.getp
 import com.jd.open.api.sdk.domain.supplier.ReturnOrderForJosWebService.response.detail.DetailResultDto;
 import com.jd.open.api.sdk.domain.supplier.ReturnOrderForJosWebService.response.get.RoDto;
 import com.jd.open.api.sdk.domain.supplier.ReturnOrderForJosWebService.response.get.RoResultDto;
-import com.jd.open.api.sdk.request.supplier.*;
+import com.jd.open.api.sdk.request.supplier.VcConfirmpurchaseorderRequest;
+import com.jd.open.api.sdk.request.supplier.VcGetReturnOrderDetailRequest;
+import com.jd.open.api.sdk.request.supplier.VcGetcomponentlistRequest;
+import com.jd.open.api.sdk.request.supplier.VcGetdetailbyorderidRequest;
+import com.jd.open.api.sdk.request.supplier.VcGetpurchaseorderlistRequest;
+import com.jd.open.api.sdk.request.supplier.VcGetwaredeliverdistinctlistRequest;
+import com.jd.open.api.sdk.request.supplier.VcReturnOrderListPageGetRequest;
 import com.jd.open.api.sdk.response.AbstractResponse;
-import com.jd.open.api.sdk.response.supplier.*;
+import com.jd.open.api.sdk.response.supplier.VcConfirmpurchaseorderResponse;
+import com.jd.open.api.sdk.response.supplier.VcGetReturnOrderDetailResponse;
+import com.jd.open.api.sdk.response.supplier.VcGetcomponentlistResponse;
+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.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
@@ -64,7 +82,12 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
@@ -108,8 +131,6 @@ public class JdApiServiceImpl implements JdApiService {
         }
     }
 
-
-
     @Override
     public String build2LoginUrl() {
         String url = RunParamConstant.JD_LOGIN_URL;
@@ -118,7 +139,6 @@ public class JdApiServiceImpl implements JdApiService {
         return url;
     }
 
-
     @Override
     public void tellBackOrer(TellBackOrderVO tellBackOrderVO) {
         JdClient client = jdClientFactory.getJdClient();
@@ -130,22 +150,22 @@ public class JdApiServiceImpl implements JdApiService {
             throw new RuntimeException(e);
         }
         String code = response.getCode();
-        if(!"0".equals(code)){
+        if (!"0".equals(code)) {
             //失败
-            log.error("回告失败:{},{}",response.getZhDesc(), response.getMsg());
+            log.error("回告失败:{},{}", response.getZhDesc(), response.getMsg());
             throw new RuntimeException("回告失败");
-        }else {
+        } else {
             Boolean successFlag = false;
             String msg = "回告失败";
-            try{
+            try {
                 successFlag = JSONObject.parse(response.getMsg()).getJSONObject("jingdong_vc_confirmpurchaseorder_responce").getJSONObject("base_result").getBoolean("success");
                 msg = msg + ":" + JSONObject.parse(response.getMsg()).getJSONObject("jingdong_vc_confirmpurchaseorder_responce").getJSONObject("base_result").getString("result_message");
-            }catch (Exception e){
-                log.error("回告返回解析异常:{}",response.getMsg());
+            } catch (Exception e) {
+                log.error("回告返回解析异常:{}", response.getMsg());
             }
-            if(!successFlag){
+            if (!successFlag) {
                 //失败
-                log.error("回告失败:{},{}",response.getZhDesc(), response.getMsg());
+                log.error("回告失败:{},{}", response.getZhDesc(), response.getMsg());
                 throw new RuntimeException(msg);
             }
         }
@@ -155,11 +175,11 @@ public class JdApiServiceImpl implements JdApiService {
         VcConfirmpurchaseorderRequest request = new VcConfirmpurchaseorderRequest();
         request.setOrderId(tellBackOrderVO.getOrderId());
         request.setDeliveryTime(tellBackOrderVO.getDeliveryTime());
-        request.setWareId(tellBackOrderVO.getBackInfo().stream().map(o->StrUtil.toString(o.getWareId())).collect(Collectors.joining(",")));
-        request.setConfirmNum(tellBackOrderVO.getBackInfo().stream().map(o->StrUtil.toString(o.getConfirmNum())).collect(Collectors.joining(",")));
-        request.setBackExplanation(tellBackOrderVO.getBackInfo().stream().map(o->StrUtil.toString(o.getNonDeliveryReason())).collect(Collectors.joining(",")));
+        request.setWareId(tellBackOrderVO.getBackInfo().stream().map(o -> StrUtil.toString(o.getWareId())).collect(Collectors.joining(",")));
+        request.setConfirmNum(tellBackOrderVO.getBackInfo().stream().map(o -> StrUtil.toString(o.getConfirmNum())).collect(Collectors.joining(",")));
+        request.setBackExplanation(tellBackOrderVO.getBackInfo().stream().map(o -> StrUtil.toString(o.getNonDeliveryReason())).collect(Collectors.joining(",")));
 //        request.setBackExplanationType(tellBackOrderVO.getBackInfo().stream().map(o->StrUtil.toString(o.getBackExplanationType())).collect(Collectors.joining(",")));
-        request.setDeliverCenterId(tellBackOrderVO.getBackInfo().stream().map(o->StrUtil.toString(o.getDeliverCenterId())).collect(Collectors.joining(",")));
+        request.setDeliverCenterId(tellBackOrderVO.getBackInfo().stream().map(o -> StrUtil.toString(o.getDeliverCenterId())).collect(Collectors.joining(",")));
         return request;
     }
 
@@ -167,23 +187,22 @@ public class JdApiServiceImpl implements JdApiService {
     @Scheduled(cron = "0 0 0/1  * * ? ")
     //每分钟执行一次
 //    @Scheduled(cron = "0 0/1 *  * * ? ")
-    void refreshToken(){
+    void refreshToken() {
         JdInfoVo jdInfoVo = jdInfoService.getOne();
         //如果过期时间减去当前时间小于90分钟,则要刷新token
-        if(ObjectUtil.isNotNull(jdInfoVo.getExpireTime())){
+        if (ObjectUtil.isNotNull(jdInfoVo.getExpireTime())) {
             long between = DateUtil.between(DateUtil.date(), jdInfoVo.getExpireTime(), DateUnit.MINUTE, false);
-            if(between <= 0){
-                if(jdInfoVo.getOnline()>0){
+            if (between <= 0) {
+                if (jdInfoVo.getOnline() > 0) {
                     jdInfoVo.setOnline(0);
                     jdInfoService.updateById(jdInfoVo);
                 }
-            }else if(90 >= between){
+            } else if (90 >= between) {
                 refreshToken(jdInfoVo);
             }
         }
     }
 
-
     /**
      * 刷新Token
      */
@@ -197,7 +216,7 @@ public class JdApiServiceImpl implements JdApiService {
             return;
         }
         String path = RunParamConstant.JD_REFRESH_URL;
-        path = String.format(path, JdParamConstant.appKey,JdParamConstant.appSecret, jdInfoVo.getRefreshToken());
+        path = String.format(path, JdParamConstant.appKey, JdParamConstant.appSecret, jdInfoVo.getRefreshToken());
         try {
             JSONObject responseJson = getJSON(new HttpGet(path));
             dealJdTokenResponse(responseJson);
@@ -208,16 +227,17 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 开始京东订单采集
+     *
      * @author hj
      * @date 2023/12/13 22:30
      */
     @Async
-    public void startJdOrder(){
+    public void startJdOrder() {
         ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
         JdClient jdClient = jdClientFactory.getJdClient();
-        while (true){
+        while (true) {
             JdInfoVo jdInfoVo = validJdInfo();
-            if(ObjectUtil.isNull(jdInfoVo)){
+            if (ObjectUtil.isNull(jdInfoVo)) {
                 ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
                 continue;
             }
@@ -227,20 +247,19 @@ public class JdApiServiceImpl implements JdApiService {
         }
     }
 
-
-
     /**
      * 开始京东退货单采集
+     *
      * @author hj
      * @date 2023/12/13 22:30
      */
     @Async
-    public void startJdBackOrder(){
+    public void startJdBackOrder() {
         ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
         JdClient jdClient = jdClientFactory.getJdClient();
-        while (true){
+        while (true) {
             JdInfoVo jdInfoVo = validJdInfo();
-            if(ObjectUtil.isNull(jdInfoVo)){
+            if (ObjectUtil.isNull(jdInfoVo)) {
                 ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
                 continue;
             }
@@ -250,19 +269,18 @@ public class JdApiServiceImpl implements JdApiService {
         }
     }
 
-
-
     /**
      * 刷新京东状态
+     *
      * @param
      */
     @Async
-    public void refreshJdState(){
+    public void refreshJdState() {
         ThreadUtil.safeSleep(RunParamConstant.SLEEP_ONE_MINUTE);
         JdClient jdClient = jdClientFactory.getJdClient();
-        while (true){
+        while (true) {
             JdInfoVo jdInfoVo = validJdInfo();
-            if(ObjectUtil.isNull(jdInfoVo)){
+            if (ObjectUtil.isNull(jdInfoVo)) {
                 ThreadUtil.safeSleep(RunParamConstant.SLEEP_FIVE_MINUTE);
                 continue;
             }
@@ -272,7 +290,7 @@ public class JdApiServiceImpl implements JdApiService {
         }
     }
 
-    private static final Map<String, String> componentDictTypeMap = new HashMap<String, String>(){{
+    private static final Map<String, String> componentDictTypeMap = new HashMap<String, String>() {{
         put("confirmState", "回告状态");
         put("orderAttribute", "订单属性");
         put("Status", "删除状态");
@@ -280,12 +298,11 @@ public class JdApiServiceImpl implements JdApiService {
         put("OrderState", "订单状态");
     }};
 
-
     /**
      * 初始化租户字典表
      */
     @Async
-    public void initTenantDict(){
+    public void initTenantDict() {
         JdClient jdClient = jdClientFactory.getJdClient();
         handleDeliveryCenter(jdClient);
         handleComponent(jdClient);
@@ -308,7 +325,7 @@ public class JdApiServiceImpl implements JdApiService {
         jdOrderDetailsService.lambdaQuery().isNull(JdOrderDetails::getProductId).list().forEach(jdOrderDetails -> {
             Long wareId = jdOrderDetails.getWareId();
             ProductInfo productInfo = productInfoMap.get(StrUtil.toString(wareId));
-            if(ObjectUtil.isNotNull(productInfo)){
+            if (ObjectUtil.isNotNull(productInfo)) {
                 jdOrderDetails.setProductId(productInfo.getId());
                 jdOrderDetailsService.updateById(jdOrderDetails);
             }
@@ -318,18 +335,18 @@ public class JdApiServiceImpl implements JdApiService {
     }
 
     //订单状态:审核不通过/供应商驳回/已完成
-    private static final ArrayList<String> notIn = new ArrayList<String>(){{
+    private static final ArrayList<String> notIn = new ArrayList<String>() {{
         add("7");
         add("20");
         add("3");
     }};
 
-
     /**
      * 处理刷新token数据
+     *
+     * @param jdClient
      * @author hj
      * @date 2023/12/21 9:01
-     * @param jdClient 
      */
     public void handleRefreshDate(JdClient jdClient) {
         DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
@@ -363,7 +380,7 @@ public class JdApiServiceImpl implements JdApiService {
                 for (JdOrder jdOrder : jdOrderList) {
                     Long id = collect.get(jdOrder.getOrderId()).getId();
                     jdOrder.setId(id);
-                    if(JdParamConstant.JD_ORDER_STATE_FINISH.equals(jdOrder.getState())) {
+                    if (JdParamConstant.JD_ORDER_STATE_FINISH.equals(jdOrder.getState())) {
                         List<JdOrderDetails> jdOrderDetailsList = new ArrayList<>();
                         //重新插入明细
                         boolean hasExFlag = dealOrderDetail(jdClient, jdOrder, jdOrderDetailsList);
@@ -392,7 +409,7 @@ public class JdApiServiceImpl implements JdApiService {
                         if (hasExFlag) {
                             jdOrder.setHasEx(RunParamConstant.EXCEPTION);
                             jdOrder.setHandleStatus(RunParamConstant.EXCEPTION_STATE_UNTREATED);
-                        }else{
+                        } else {
                             jdOrder.setHasEx(RunParamConstant.NO_EXCEPTION);
                             jdOrder.setHandleStatus(null);
                         }
@@ -402,9 +419,9 @@ public class JdApiServiceImpl implements JdApiService {
                 }
                 pageIndex++;
             } while (pageIndex <= totalPage);
-        }catch (Exception e){
+        } catch (Exception e) {
             log.error("刷新京东状态失败", e);
-        }finally {
+        } finally {
             DynamicDataSourceContextHolder.poll();
             SecurityUtils.clearTenantId();
         }
@@ -430,27 +447,27 @@ public class JdApiServiceImpl implements JdApiService {
             } else {
                 item.setProductId(list.get(0).getId());
             }
-            if(JdParamConstant.JD_ORDER_STATE_FINISH.equals(jdOrder.getState())){
+            if (JdParamConstant.JD_ORDER_STATE_FINISH.equals(jdOrder.getState())) {
                 //如果京东采购单状态 = 已完成  &  明细数据中存在 实收 != 回告 & 分流类型 == 仓库发货(10),则给京东采购单打上【异常】标记
                 //如果实收>回告,则:给对应的明细打上【多货】标记;如果实收<回告,则:给对应的明细打上【少货】标记
-                if(
+                if (
                         ObjectUtil.isNotNull(item.getActualNum())
-                        && ObjectUtil.isNotNull(item.getConfirmNum())
-                        && ObjectUtil.isNotEmpty(jdOrder.getDiversionType())
-                        && item.getActualNum().compareTo(item.getConfirmNum()) != 0
-                        && jdOrder.getDiversionType()==10
-                ){
+                                && ObjectUtil.isNotNull(item.getConfirmNum())
+                                && ObjectUtil.isNotEmpty(jdOrder.getDiversionType())
+                                && item.getActualNum().compareTo(item.getConfirmNum()) != 0
+                                && jdOrder.getDiversionType() == 10
+                ) {
                     String exDesc;
-                    if (item.getActualNum().compareTo(item.getConfirmNum()) > 0){
+                    if (item.getActualNum().compareTo(item.getConfirmNum()) > 0) {
                         exDesc = RunParamConstant.EXCESS;
-                    }else {
+                    } else {
                         exDesc = RunParamConstant.SHORTAGE;
                     }
                     item.setHasEx(RunParamConstant.EXCEPTION);
                     item.setExDesc(exDesc);
                     item.setHandleStatus(RunParamConstant.EXCEPTION_STATE_UNTREATED);
                     hasExFlag.set(true);
-                }else {
+                } else {
                     item.setHasEx(null);
                     item.setExDesc(null);
                     item.setHandleStatus(null);
@@ -463,18 +480,19 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理回告状态、订单属性、删除状态、图书回告不满足原因、订单状态
+     *
+     * @param jdClient
      * @author hj
      * @date 2023/12/13 21:56
-     * @param jdClient 
      */
     private void handleComponent(JdClient jdClient) {
-        componentDictTypeMap.forEach((k,v)->{
-            VcGetcomponentlistRequest request=new VcGetcomponentlistRequest();
+        componentDictTypeMap.forEach((k, v) -> {
+            VcGetcomponentlistRequest request = new VcGetcomponentlistRequest();
             DynamicDataSourceContextHolder.push(SourceConstant.BASE);
             SecurityUtils.setTenantId(RunParamConstant.tenantId);
             try {
                 request.setType(k);
-                VcGetcomponentlistResponse response=jdClient.execute(request);
+                VcGetcomponentlistResponse response = jdClient.execute(request);
 
                 DictTenantType dictTenantType = handleDictType(k, v);
 
@@ -483,7 +501,7 @@ public class JdApiServiceImpl implements JdApiService {
                 for (Component component : arg89) {
                     commonDictDataList.add(new CommonDictData(component.getKey(), component.getName()));
                 }
-                if ("orderAttribute".equals(k)){
+                if ("orderAttribute".equals(k)) {
                     System.out.println(123);
                 }
                 handleDictData(commonDictDataList, dictTenantType);
@@ -499,13 +517,14 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理配送中心字典转换
+     *
+     * @param jdClient
      * @author hj
      * @date 2023/12/13 21:55
-     * @param jdClient 
      */
-    public void handleDeliveryCenter(JdClient jdClient){
+    public void handleDeliveryCenter(JdClient jdClient) {
         //获取京东仓库,并存入字典表
-        VcGetwaredeliverdistinctlistRequest request=new VcGetwaredeliverdistinctlistRequest();
+        VcGetwaredeliverdistinctlistRequest request = new VcGetwaredeliverdistinctlistRequest();
         DynamicDataSourceContextHolder.push(SourceConstant.BASE);
         SecurityUtils.setTenantId(RunParamConstant.tenantId);
         try {
@@ -520,14 +539,14 @@ public class JdApiServiceImpl implements JdApiService {
             }
             handleDictData(commonDictDataList, dictTenantType);
         } catch (Exception e) {
-            log.error("转换配送中心到字典出现异常",e);
+            log.error("转换配送中心到字典出现异常", e);
         }
         SecurityUtils.clearTenantId();
         DynamicDataSourceContextHolder.poll();
     }
 
 
-    private static final Map<String, String> returnStatesMap = new HashMap<String, String>(){{
+    private static final Map<String, String> returnStatesMap = new HashMap<String, String>() {{
         put("1", "初始退货单");
         put("2", "等待经理审核");
         put("3", "等待总监审核");
@@ -546,6 +565,7 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理jd退货状态字典
+     *
      * @author hj
      * @date 2023/12/20 22:27
      */
@@ -555,19 +575,20 @@ public class JdApiServiceImpl implements JdApiService {
         try {
             DictTenantType dictTenantType = handleDictType(InitDictConstant.RETURN_STATES, InitDictConstant.RETURN_STATES_LABEL);
             List<CommonDictData> commonDictDataList = new ArrayList<>();
-            returnStatesMap.forEach((k,v)->{
+            returnStatesMap.forEach((k, v) -> {
                 commonDictDataList.add(new CommonDictData(k, v));
             });
             handleDictData(commonDictDataList, dictTenantType);
         } catch (Exception e) {
-            log.error("处理jd退货状态字典出现异常",e);
+            log.error("处理jd退货状态字典出现异常", e);
         }
         SecurityUtils.clearTenantId();
         DynamicDataSourceContextHolder.poll();
     }
-    
+
     /**
      * 处理字典表
+     *
      * @author hj
      * @date 2023/12/21 9:01
      */
@@ -577,17 +598,17 @@ public class JdApiServiceImpl implements JdApiService {
         List<DictTenantData> list = dictTenantDataService.lambdaQuery().eq(DictTenantData::getDictCode, dictTenantType.getCode()).orderByAsc(DictTenantData::getSort).list();
         Map<String, DictTenantData> dictDataMap = new HashMap<>();
         int sort = 10;
-        if(CollectionUtil.isNotEmpty(list)) {
-            dictDataMap = list.stream().collect(Collectors.toMap(DictTenantData::getDictKey, o -> o, (v1, v2) ->v2));
-            sort = list.get(list.size()-1).getSort() + 10;
+        if (CollectionUtil.isNotEmpty(list)) {
+            dictDataMap = list.stream().collect(Collectors.toMap(DictTenantData::getDictKey, o -> o, (v1, v2) -> v2));
+            sort = list.get(list.size() - 1).getSort() + 10;
         }
         List<DictTenantData> dataList = new ArrayList<>();
         for (CommonDictData commonDictData : commonDictDataList) {
             DictTenantDataDto dictTenantDataDto = new DictTenantDataDto();
             DictTenantData dictTenantData = dictDataMap.get(commonDictData.getKey());
-            if(ObjectUtil.isNotNull(dictTenantData)){
+            if (ObjectUtil.isNotNull(dictTenantData)) {
                 BeanUtil.copyProperties(dictTenantData, dictTenantDataDto);
-            }else{
+            } else {
                 dictTenantDataDto.setDictCode(dictTenantType.getCode());
                 dictTenantDataDto.setDictKey(StrUtil.toString(commonDictData.getKey()));
                 dictTenantDataDto.setTenantId(RunParamConstant.tenantId);
@@ -602,18 +623,19 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理字典类型表
-     * @author hj
-     * @date 2023/12/13 22:03
+     *
      * @param code
      * @param name
+     * @author hj
+     * @date 2023/12/13 22:03
      */
-    private DictTenantType handleDictType(String code, String name){
+    private DictTenantType handleDictType(String code, String name) {
         DictTenantType dictTenantType = new DictTenantType();
         List<DictTenantType> deliveryCenters = dictTenantTypeService.list(q -> q.eq(DictTenantType::getTenantId, RunParamConstant.tenantId).eq(DictTenantType::getCode, code));
         //处理字典类型表
-        if(CollectionUtil.isNotEmpty(deliveryCenters)){
+        if (CollectionUtil.isNotEmpty(deliveryCenters)) {
             dictTenantType = deliveryCenters.get(0);
-        }else {
+        } else {
             dictTenantType.setCode(code);
             dictTenantType.setName(name);
             dictTenantType.setTenantId(RunParamConstant.tenantId);
@@ -628,7 +650,7 @@ public class JdApiServiceImpl implements JdApiService {
     /**
      * 获取京东订单
      */
-    private void getJdOrderList(JdClient client, JdInfoVo jdInfoVo){
+    private void getJdOrderList(JdClient client, JdInfoVo jdInfoVo) {
         DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
         SecurityUtils.setTenantId(RunParamConstant.tenantId);
         try {
@@ -636,6 +658,7 @@ public class JdApiServiceImpl implements JdApiService {
             int totalPage = 1;
             int pageSize = 50;
             do {
+
                 //获取开始同步的时间
                 Date startTime = jdInfoVo.getInitQueryDate();
                 Date endTime = new Date();
@@ -656,7 +679,7 @@ public class JdApiServiceImpl implements JdApiService {
 
                 //处理数据(过滤已存在的数据)
                 List<Long> jdOrderIds = purchaseOrderList.stream().map(PurchaseOrderDto::getOrderId).collect(Collectors.toList());
-                if(CollectionUtil.isNotEmpty(jdOrderIds)){
+                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());
                     //过滤出未同步的数据
@@ -665,35 +688,46 @@ public class JdApiServiceImpl implements JdApiService {
                     List<JdOrder> jdOrderList = BeanUtil.copyToList(purchaseOrderListFilter, JdOrder.class);
                     //赋值租户id
                     jdOrderList.forEach(item -> item.setTenantId(RunParamConstant.tenantId));
-                    //将数据存储到库
-                    jdOrderService.saveBatch(jdOrderList);
-                    //获取明细
-                    List<JdOrderDetails> jdOrderDetailsList = new ArrayList<>();
-                    for (JdOrder jdOrder : jdOrderList) {
-                        boolean hasExFlag = dealOrderDetail(client, jdOrder, jdOrderDetailsList);
-                        if (hasExFlag){
-                            jdOrder.setHasEx(RunParamConstant.EXCEPTION);
-                            jdOrder.setHandleStatus(RunParamConstant.EXCEPTION_STATE_UNTREATED);
-                            jdOrderService.updateById(jdOrder);
+
+                    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) {
+                                throw new RuntimeException(e);
+                            }
+
+                            if (hasExFlag) {
+                                jdOrder.setHasEx(RunParamConstant.EXCEPTION);
+                                jdOrder.setHandleStatus(RunParamConstant.EXCEPTION_STATE_UNTREATED);
+                                jdOrderService.updateById(jdOrder);
+                            }
                         }
-                    }
-                    //            //赋值租户id
-                    //            jdOrderList.forEach(item -> item.setTenantId(tenantId));
-                    DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
-                    jdOrderDetailsService.saveOrUpdateBatch(jdOrderDetailsList);
+
+                        DynamicDataSourceContextHolder.push(SourceConstant.VICTORIATOURIST);
+                        jdOrderDetailsService.saveOrUpdateBatch(jdOrderDetailsList);
+                    });
+
                 }
                 pageIndex++;
             } while (pageIndex <= totalPage);
-        } catch (Exception e){
+        } catch (Exception e) {
             log.error("获取京东订单出错:" + e.getMessage(), e);
-        }finally {
+        } finally {
             SecurityUtils.clearTenantId();
             DynamicDataSourceContextHolder.poll();
         }
     }
 
 
-
     /**
      * 获取京东退货订单
      */
@@ -723,7 +757,7 @@ public class JdApiServiceImpl implements JdApiService {
 
                 //过滤出不在数据库里的新数据
                 List<Long> returnIds = roDtoList.stream().map(RoDto::getReturnId).collect(Collectors.toList());
-                if(CollectionUtil.isNotEmpty(returnIds)){
+                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());
                     //转成我们自己的实体类
@@ -758,9 +792,9 @@ public class JdApiServiceImpl implements JdApiService {
                 }
                 pageIndex++;
             } while (pageIndex <= totalPage);
-        }catch (Exception e){
+        } catch (Exception e) {
             log.error("获取京东退货订单出错:" + e.getMessage(), e);
-        }finally {
+        } finally {
             SecurityUtils.clearTenantId();
             DynamicDataSourceContextHolder.poll();
         }
@@ -768,13 +802,12 @@ public class JdApiServiceImpl implements JdApiService {
     }
 
 
-
-    public void startJdSalesReturns(){
+    public void startJdSalesReturns() {
         JdClient jdClient = jdClientFactory.getJdClient();
-        while (true){
+        while (true) {
             JdInfoVo jdInfoVo = jdInfoService.getOne();
             boolean online = jdInfoVo.getOnline() > 0 ? true : false;
-            if(!online){
+            if (!online) {
                 log.info("京东已经下线");
                 ThreadUtil.safeSleep(RunParamConstant.SLEEP_TEN_SECOND);
                 continue;
@@ -787,7 +820,7 @@ public class JdApiServiceImpl implements JdApiService {
             }
             try {
                 getJdBackOrder(jdClient, jdInfoVo);
-            }catch (Exception e){
+            } catch (Exception e) {
                 log.error("获取京东订单列表出错:" + e.getMessage(), e);
             }
             ThreadUtil.safeSleep(30000);
@@ -874,18 +907,19 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 将jd返回的json对象转换成jdInfoVo
-     * @author hj
-     * @date 2023/12/10 22:03
+     *
      * @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));
         jdInfoVo.setRefreshToken(responseJson.getString(RunParamConstant.REFRESH_TOKEN));
         int expires_in = responseJson.getIntValue("expires_in", 0);
         int offsetHour = 24;
-        if(expires_in>0){
-            offsetHour = expires_in/60/60;
+        if (expires_in > 0) {
+            offsetHour = expires_in / 60 / 60;
         }
         jdInfoVo.setExpireTime(DateUtil.offsetHour(new Date(), offsetHour));
         jdInfoVo.setLastRefreshTime(DateUtil.date());
@@ -894,9 +928,10 @@ public class JdApiServiceImpl implements JdApiService {
 
     /**
      * 处理jd返回对象
+     *
+     * @param responseJson
      * @author hj
      * @date 2023/12/10 22:07
-     * @param responseJson
      */
     private void dealJdTokenResponse(JSONObject responseJson) {
         if (ObjectUtil.isNotEmpty(responseJson.getString(RunParamConstant.ACCESS_TOKEN)) && ObjectUtil.isNotEmpty(responseJson.getString(RunParamConstant.REFRESH_TOKEN))) {
@@ -911,10 +946,6 @@ public class JdApiServiceImpl implements JdApiService {
     }
 
 
-
-
-
-
     /**
      * 获取京东订单信息分页
      */
@@ -924,7 +955,7 @@ public class JdApiServiceImpl implements JdApiService {
         request.setCreatedDateEnd(endTime);
         request.setPageIndex(pageIndex);
         request.setPageSize(pageSize);
-        if(CollectionUtil.isNotEmpty(orderIds)){
+        if (CollectionUtil.isNotEmpty(orderIds)) {
             String orderIdsStr = orderIds.stream().map(Object::toString).collect(Collectors.joining(","));
             request.setOrderIds(orderIdsStr);
         }
@@ -962,19 +993,19 @@ public class JdApiServiceImpl implements JdApiService {
     }*/
 
 
-    void validSuccess(AbstractResponse response, String method){
+    void validSuccess(AbstractResponse response, String method) {
         String code = response.getCode();
-        if(!"0".equals(code)){
-            log.error("获取{}失败:{}", method ,response.getZhDesc());
-            throw new RuntimeException("获取"+ method +"失败:" + response.getZhDesc());
+        if (!"0".equals(code)) {
+            log.error("获取{}失败:{}", method, response.getZhDesc());
+            throw new RuntimeException("获取" + method + "失败:" + response.getZhDesc());
         }
     }
 
 
-    private JdInfoVo validJdInfo(){
+    private JdInfoVo validJdInfo() {
         JdInfoVo jdInfoVo = jdInfoService.getOne();
         boolean online = jdInfoVo.getOnline() > 0 ? true : false;
-        if(!online){
+        if (!online) {
             log.info("京东已经下线");
             return null;
         }

+ 6 - 1
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdOrderServiceImpl.java

@@ -213,7 +213,12 @@ public class JdOrderServiceImpl extends ServiceImpl<JdOrderMapper, JdOrder> impl
         JdOrder JdOrder = this.getById(id);
         JdOrderVo result = BeanUtil.toBean(JdOrder, JdOrderVo.class);
 
-        List<JdOrderDetails> jdOrderDetailsList = jdOrderDetailsService.lambdaQuery().eq(JdOrderDetails::getJdOrderId, id).orderByDesc(JdOrderDetails::getHasEx).orderByDesc(JdOrderDetails::getId).list();
+        List<JdOrderDetails> jdOrderDetailsList = jdOrderDetailsService.lambdaQuery()
+                .eq(JdOrderDetails::getJdOrderId, id)
+                .orderByDesc(JdOrderDetails::getHasEx)
+                .orderByDesc(JdOrderDetails::getId)
+                .list();
+
         List<JdOrderDetailsVo> jdOrderDetailsVoList = BeanUtil.copyToList(jdOrderDetailsList, JdOrderDetailsVo.class);
         productInfoService.attributeAssign(jdOrderDetailsVoList, JdOrderDetails::getProductId, (item, product) -> {
             item.setProductCode(product.getCode());