ct vor 2 Tagen
Ursprung
Commit
6087dc2f27
41 geänderte Dateien mit 2556 neuen und 341 gelöschten Zeilen
  1. 69 36
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  2. 19 0
      fs-admin/src/main/java/com/fs/his/controller/HzOMSErpApiController.java
  3. 38 18
      fs-admin/src/main/java/com/fs/his/task/Task.java
  4. 1 3
      fs-company-app/src/main/java/com/fs/app/controller/FsUserOperationLogController.java
  5. 5 5
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java
  6. 2 1
      fs-service/src/main/java/com/fs/erp/domain/ErpDeliverys.java
  7. 16 0
      fs-service/src/main/java/com/fs/erp/dto/df/BspOrderResponse.java
  8. 30 0
      fs-service/src/main/java/com/fs/erp/dto/df/BspOrderResponseWrapper.java
  9. 10 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFApiResponse.java
  10. 11 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFCancelOrderResultResponse.java
  11. 18 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFConfigVo.java
  12. 27 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFDeliveryResponse.java
  13. 71 0
      fs-service/src/main/java/com/fs/erp/dto/df/ExteriorOrderSkuVo.java
  14. 268 0
      fs-service/src/main/java/com/fs/erp/dto/df/ExternalOrderRequestVo.java
  15. 51 0
      fs-service/src/main/java/com/fs/erp/dto/df/OrderResponse.java
  16. 100 0
      fs-service/src/main/java/com/fs/erp/dto/df/RlsDetail.java
  17. 21 0
      fs-service/src/main/java/com/fs/erp/dto/df/RlsInfo.java
  18. 161 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/DfClient.java
  19. 44 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/enums/ExpressProductCodeEnum.java
  20. 40 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/enums/RequestUrlEnum.java
  21. 129 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/utils/StringUtils.java
  22. 555 0
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  23. 18 8
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  24. 7 0
      fs-service/src/main/java/com/fs/his/config/FsSysConfig.java
  25. 54 0
      fs-service/src/main/java/com/fs/his/domain/FsStoreOrderDf.java
  26. 1 0
      fs-service/src/main/java/com/fs/his/domain/FsUserOperationLog.java
  27. 61 0
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderDfMapper.java
  28. 4 2
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  29. 2 10
      fs-service/src/main/java/com/fs/his/mapper/FsUserOperationLogMapper.java
  30. 2 2
      fs-service/src/main/java/com/fs/his/param/FsStoreOrderSetErpPhoneParam.java
  31. 61 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderDfService.java
  32. 14 4
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java
  33. 3 5
      fs-service/src/main/java/com/fs/his/service/IFsUserOperationLogService.java
  34. 91 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderDfServiceImpl.java
  35. 402 184
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  36. 9 25
      fs-service/src/main/java/com/fs/his/service/impl/FsUserOperationLogServiceImpl.java
  37. 2 1
      fs-service/src/main/java/com/fs/hisapi/config/HisApiConfig.java
  38. 22 21
      fs-service/src/main/java/com/fs/tzBankPay/doman/PayType.java
  39. 101 0
      fs-service/src/main/resources/mapper/his/FsStoreOrderDfMapper.xml
  40. 16 5
      fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml
  41. 0 11
      fs-service/src/main/resources/mapper/his/FsUserOperationLogMapper.xml

+ 69 - 36
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -19,14 +19,18 @@ import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.vo.CompanyStoreOrderMoneyLogsVO;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpOrderQuery;
+import com.fs.erp.dto.ErpDeliverysRequest;
+import com.fs.erp.dto.ErpDeliverysResponse;
 import com.fs.erp.dto.ErpOrderQueryRequert;
 import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.dto.df.BspOrderResponse;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.dto.ExpressInfoDTO;
 import com.fs.his.dto.StoreOrderExpressExportDTO;
+import com.fs.his.dto.TracesDTO;
 import com.fs.his.enums.ShipperCodeEnum;
 import com.fs.his.param.FsFollowMsgParam;
 import com.fs.his.param.FsStoreOrderParam;
@@ -90,6 +94,14 @@ public class FsStoreOrderController extends BaseController
     @Qualifier("wdtErpOrderServiceImpl")
     private IErpOrderService wdtOrderService;
 
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSErpOrderService;
+
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
     @Autowired
     SysConfigMapper sysConfigMapper;
     /**
@@ -369,6 +381,12 @@ public class FsStoreOrderController extends BaseController
                 } else if (erpType == 2){
                     //旺店通
                     erpOrderService =  wdtOrderService;
+                }  else if (erpType == 3){
+                    //
+                    erpOrderService =  hzOMSErpOrderService;
+                } else if (erpType == 4){
+                    //代服
+                    erpOrderService =  dfOrderService;
                 }
                 return erpOrderService;
 
@@ -483,19 +501,27 @@ public class FsStoreOrderController extends BaseController
     @ApiOperation("批量创建ERP订单")
     @PreAuthorize("@ss.hasPermi('his:storeOrder:createErpOrder')")
     @PostMapping(value = "/batchCreateErpOrder")
-    public R batchCreateErpOrder(@RequestBody List<Long> orderIds)
+    public R batchCreateErpOrder(@RequestBody FsStoreOrderSetErpPhoneParam param)
     {
-        if (orderIds != null && !orderIds.isEmpty()) {
-            orderIds.forEach(orderId->{
-                try {
-                    fsStoreOrderService.createOmsOrder(orderId);
-                } catch (ParseException e) {
-                    throw new RuntimeException(e);
-                }
-
-            });
+        List<Long> orderIds = param.getOrderIds();
+        if (orderIds  == null || orderIds.isEmpty()) {
+            if (param.getUserPhoneMk() != null && !param.getUserPhoneMk().isEmpty()) {
+                param.setUserPhone(encryptPhone(param.getUserPhoneMk()));
+            }
+            List<FsStoreOrderListVO> list = fsStoreOrderService.selectFsStoreOrderListVO(param);
+            orderIds = list.stream().map(FsStoreOrderListVO::getOrderId).collect(Collectors.toList());
+        }
+        if (orderIds.isEmpty()){
+            return R.ok();
         }
+        orderIds.forEach(orderId->{
+            try {
+                fsStoreOrderService.createOmsOrder(orderId);
+            } catch (ParseException e) {
+                throw new RuntimeException(e);
+            }
 
+        });
         return R.ok();
     }
 
@@ -535,7 +561,12 @@ public class FsStoreOrderController extends BaseController
     @PreAuthorize("@ss.hasPermi('his:storeOrder:syncExpress')")
     @GetMapping(value = "/syncExpress/{id}")
     public R syncExpress(@PathVariable("id") Long id) {
-        return fsStoreOrderService.syncExpress(id);
+        IErpOrderService erpService = getErpService();
+        if (erpService!=null && erpService == dfOrderService){
+            return fsStoreOrderService.syncDfExpress(id);
+        } else {
+            return fsStoreOrderService.syncExpress(id);
+        }
     }
 
     @PreAuthorize("@ss.hasPermi('his:storeOrder:sendMsg')")
@@ -556,34 +587,41 @@ public class FsStoreOrderController extends BaseController
     @GetMapping(value = "/getExpress/{id}")
     public R getExpress(@PathVariable("id") Long id)
     {
-        FsStoreOrder order=fsStoreOrderService.selectFsStoreOrderByOrderId(id);
         ExpressInfoDTO expressInfoDTO=null;
-        if(StringUtils.isNotEmpty(order.getDeliverySn())){
-            String lastFourNumber = "";
-            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
-
-                lastFourNumber = order.getUserPhone();
-                if (lastFourNumber.length() == 11) {
-                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
-                }else if (lastFourNumber.length()>11){
-                    String jm = decryptPhone(lastFourNumber);
-                    lastFourNumber = StrUtil.sub(jm, jm.length(), -4);
-                }
-            }
-            expressInfoDTO=expressService.getExpressInfo(order.getOrderCode(),order.getDeliveryCode(),order.getDeliverySn(),lastFourNumber);
-
-            if((expressInfoDTO.getStateEx()!=null&&expressInfoDTO.getStateEx().equals("0"))&&(expressInfoDTO.getState()!=null&&expressInfoDTO.getState().equals("0"))){
-                lastFourNumber = "19923690275";
+        FsStoreOrder order=fsStoreOrderService.selectFsStoreOrderByOrderId(id);
+        //代服管家 查询自己的物流
+        IErpOrderService erpService = getErpService();
+        if (erpService == dfOrderService){
+            expressInfoDTO = fsStoreOrderService.getDfExpressInfoDTO(order);
+        } else {
+            if(StringUtils.isNotEmpty(order.getDeliverySn())){
+                String lastFourNumber = "";
                 if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+
+                    lastFourNumber = order.getUserPhone();
                     if (lastFourNumber.length() == 11) {
                         lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                    }else if (lastFourNumber.length()>11){
+                        String jm = decryptPhone(lastFourNumber);
+                        lastFourNumber = StrUtil.sub(jm, jm.length(), -4);
                     }
                 }
-
                 expressInfoDTO=expressService.getExpressInfo(order.getOrderCode(),order.getDeliveryCode(),order.getDeliverySn(),lastFourNumber);
 
+                if((expressInfoDTO.getStateEx()!=null&&expressInfoDTO.getStateEx().equals("0"))&&(expressInfoDTO.getState()!=null&&expressInfoDTO.getState().equals("0"))){
+                    lastFourNumber = "19923690275";
+                    if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+                        if (lastFourNumber.length() == 11) {
+                            lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                        }
+                    }
+
+                    expressInfoDTO=expressService.getExpressInfo(order.getOrderCode(),order.getDeliveryCode(),order.getDeliverySn(),lastFourNumber);
+
+                }
             }
         }
+
         return R.ok().put("data",expressInfoDTO);
     }
     @PreAuthorize("@ss.hasPermi('his:storeOrder:msgList')")
@@ -646,15 +684,10 @@ public class FsStoreOrderController extends BaseController
     @PostMapping("/editErpPhone")
     public AjaxResult editErpPhone(@RequestBody FsStoreOrderSetErpPhoneParam param)
     {
-        String erpPhone = param.getErpPhone();
-        if (StringUtils.isBlank(erpPhone)) {
+        List<String> erpPhone = param.getErpPhone();
+        if (erpPhone == null || erpPhone.isEmpty()) {
             return AjaxResult.error("请选择手机号");
         }
-        List<Long> orderIds = param.getOrderIds();
-        if (orderIds  == null || orderIds.isEmpty()){
-            return AjaxResult.success();
-        }
         return toAjax(fsStoreOrderService.batchUpdateErpByOrderIds(param));
     }
-
 }

+ 19 - 0
fs-admin/src/main/java/com/fs/his/controller/HzOMSErpApiController.java

@@ -1,17 +1,23 @@
 package com.fs.his.controller;
 
 
+import com.fs.common.core.domain.R;
 import com.fs.erp.domain.ErpOrder;
 import com.fs.erp.dto.ErpOrderResponse;
+import com.fs.erp.dto.df.BspOrderResponse;
 import com.fs.erp.dto.sdk.HzOMS.utils.HzOMSUtils;
 import com.fs.erp.service.IErpOrderService;
+import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsVessel;
 import com.fs.his.param.HzOMSErpApiParam;
 import com.fs.his.service.ErpApiService;
+import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.service.impl.FsStoreOrderServiceImpl;
 import com.fs.his.vo.HzOMSErpResponseVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -33,6 +39,9 @@ public class HzOMSErpApiController {
     @Qualifier("hzOMSErpOrderServiceImpl")
     IErpOrderService HzOMSErpOrderService;
 
+    @Autowired
+    private IFsStoreOrderService fsStoreOrderService;
+
     /**
      * 用于将瀚智商品库存同步到第三方
      *
@@ -117,4 +126,14 @@ public class HzOMSErpApiController {
 //        hzOMSErpResponseVO.setSuccess(true);
 //        return hzOMSErpResponseVO;
 //    }
+
+
+    /**
+     * 代服管家订单回调
+     */
+    @PostMapping("/dfNotifyUrl")
+    public R dfOrderResult(@RequestBody BspOrderResponse param)
+    {
+        return fsStoreOrderService.dfOrderResult(param);
+    }
 }

+ 38 - 18
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -16,9 +16,13 @@ import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.course.service.ITencentCloudCosService;
 import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.domain.ErpOrder;
 import com.fs.erp.domain.ErpOrderQuery;
+import com.fs.erp.domain.FsErpFinishPush;
 import com.fs.erp.dto.ErpOrderQueryRequert;
 import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.dto.ErpOrderResponse;
+import com.fs.erp.mapper.FsErpFinishPushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.fastGpt.mapper.FastGptChatSessionMapper;
 import com.fs.his.config.FsSysConfig;
@@ -262,10 +266,11 @@ public class Task {
         List<FsStoreOrder> orders = null;
         if (erpOrderService == gyOrderService){
             orders = fsStoreOrderMapper.selectOmsOrderdeliveryOp();
-        } else if (erpOrderService == wdtOrderService){
+        } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService){
             orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOp();
         }
 
+
         for(FsStoreOrder order:orders){
 
             ErpOrderQueryRequert request=new ErpOrderQueryRequert();
@@ -273,17 +278,19 @@ public class Task {
             request.setCode(order.getExtendOrderId());
             if (erpOrderService != null){
                 ErpOrderQueryResponse response=erpOrderService.getOrder(request);
-                if(response.getOrders()!=null&&response.getOrders().size()>0){
-                    for(ErpOrderQuery orderQuery : response.getOrders()){
-                        if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
-                            for(ErpDeliverys delivery:orderQuery.getDeliverys()){
-                                if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
-                                    //更新商订单状态 删除REDIS
-                                    fsStoreOrderService.deliveryOrder(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
-                                    redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+                if (erpOrderService != dfOrderService){
+                    if(response.getOrders()!=null&&response.getOrders().size()>0){
+                        for(ErpOrderQuery orderQuery : response.getOrders()){
+                            if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
+                                for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                                    if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
+                                        //更新商订单状态 删除REDIS
+                                        fsStoreOrderService.deliveryOrder(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                        redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+                                    }
                                 }
-                            }
 
+                            }
                         }
                     }
                 }
@@ -304,14 +311,14 @@ public class Task {
             } catch (Exception e) {
             }
         }
-        List<Long> tuiOrderList = fsStoreOrderMapper.selectFsStoreOrderNoTuiOrder();
-        for (Long l : tuiOrderList) {
-            try {
-                fsStoreOrderService.tuiOrder(l);
-            } catch (Exception e) {
-            }
-
-        }
+//        List<Long> tuiOrderList = fsStoreOrderMapper.selectFsStoreOrderNoTuiOrder();
+//        for (Long l : tuiOrderList) {
+//            try {
+//                fsStoreOrderService.tuiOrder(l);
+//            } catch (Exception e) {
+//            }
+//
+//        }
     }
 
     public void createFollow()
@@ -1001,6 +1008,13 @@ public class Task {
     @Autowired
     @Qualifier("wdtErpOrderServiceImpl")
     private IErpOrderService wdtOrderService;
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSErpOrderService;
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
     private IErpOrderService getErpService() {
         FsSysConfig sysConfig = configUtil.getSysConfig();
         Integer erpOpen = sysConfig.getErpOpen();
@@ -1015,6 +1029,12 @@ public class Task {
                 } else if (erpType == 2){
                     //旺店通
                     erpOrderService =  wdtOrderService;
+                } else if (erpType == 3){
+                    //
+                    erpOrderService =  hzOMSErpOrderService;
+                } else if (erpType == 4){
+                    //代服
+                    erpOrderService =  dfOrderService;
                 }
                 return erpOrderService;
 

+ 1 - 3
fs-company-app/src/main/java/com/fs/app/controller/FsUserOperationLogController.java

@@ -53,9 +53,7 @@ public class FsUserOperationLogController extends AppBaseController
             return ResponseResult.fail(500,"未选择会员");
         }
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
-        List<FsUserOperationLogPageVo> list = fsUserOperationLogService.selectFsUserOperationLogList(param);
-        PageInfo<FsUserOperationLogPageVo> pageInfo = new PageInfo<>(list);
-        return ResponseResult.ok(pageInfo);
+        return ResponseResult.ok(fsUserOperationLogService.selectFsUserOperationLogList(param));
     }
 
 

+ 5 - 5
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java

@@ -542,7 +542,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
 //                        o.setOpenId(user.getMpOpenId());
                         o.setOrderType(4);
                         o.setOrderId(order.getOrderId().toString());
-                        o.setPayType(Arrays.asList(PayType.ALIPAY_BARCODE_PAYMENT.getCode()));
+                        o.setPayType(Arrays.asList(PayType.支付宝条码支付.getCode()));
                         TzBankResult<PayCreateOrderResult> result = tzBankService.createOrder(o);
                         FsStorePayment mt=new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
@@ -591,11 +591,11 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                         paymentMap.setStatus(1);
                         paymentMap.setPayTime(new Date());
                         paymentMap.setTradeNo(tradeNo);
-                        if(payType.equals(PayType.WECHAT_MINI_PROGRAM_PAYMENT.getCode())){
-                            paymentMap.setPayTypeCode(PayType.WECHAT_MINI_PROGRAM_PAYMENT.name());
+                        if(payType.equals(PayType.微信小程序支付.getCode())){
+                            paymentMap.setPayTypeCode(PayType.微信小程序支付.name());
                         }
-                        else if(payType.equals(PayType.ALIPAY_BARCODE_PAYMENT.getCode())){
-                            paymentMap.setPayTypeCode(PayType.ALIPAY_BARCODE_PAYMENT.name());
+                        else if(payType.equals(PayType.支付宝条码支付.getCode())){
+                            paymentMap.setPayTypeCode(PayType.支付宝条码支付.name());
                         }
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                         order=fsUserCourseOrderMapper.selectFsUserCourseOrderByOrderId(Long.parseLong(storePayment.getBusinessId()));

+ 2 - 1
fs-service/src/main/java/com/fs/erp/domain/ErpDeliverys.java

@@ -1,9 +1,10 @@
 package com.fs.erp.domain;
 
+import com.fs.erp.dto.df.DFDeliveryResponse;
 import lombok.Data;
 
 @Data
-public class ErpDeliverys {
+public class ErpDeliverys extends DFDeliveryResponse {
 
     String mail_no;
     String express_code;

+ 16 - 0
fs-service/src/main/java/com/fs/erp/dto/df/BspOrderResponse.java

@@ -0,0 +1,16 @@
+package com.fs.erp.dto.df;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BspOrderResponse {
+    @JsonProperty("head")
+    private String head;
+    @JsonProperty("service")
+    private String service; // 上游系统下单返回数据
+    @JsonProperty("body")
+    private List<OrderResponse> body; // 上游系统下单返回数据
+}

+ 30 - 0
fs-service/src/main/java/com/fs/erp/dto/df/BspOrderResponseWrapper.java

@@ -0,0 +1,30 @@
+package com.fs.erp.dto.df;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import java.util.List;
+
+/**
+ * 顺丰下单响应包装类
+ */
+@Data
+public class BspOrderResponseWrapper {
+    @JsonProperty("failMsg")
+    private String failMsg; // 失败原因
+
+    @JsonProperty("loginAccount")
+    private String loginAccount; // 代服系统登录账号
+
+    @JsonProperty("orderNumber")
+    private String orderNumber; // 订单号(不能重复)
+
+    @JsonProperty("mailNumber")
+    private String mailNumber; // 运单号
+
+    @JsonProperty("attach")
+    private String attach; // 附加数据
+
+    @JsonProperty("bspResponse")
+    private BspOrderResponse bspResponse; // 上游系统下单返回数据
+}
+

+ 10 - 0
fs-service/src/main/java/com/fs/erp/dto/df/DFApiResponse.java

@@ -0,0 +1,10 @@
+package com.fs.erp.dto.df;
+
+import lombok.Data;
+
+@Data
+public class DFApiResponse {
+    private String code;
+    private String msg;
+    private Object result;
+}

+ 11 - 0
fs-service/src/main/java/com/fs/erp/dto/df/DFCancelOrderResultResponse.java

@@ -0,0 +1,11 @@
+package com.fs.erp.dto.df;
+
+import lombok.Data;
+
+@Data
+public class DFCancelOrderResultResponse {
+    private String orderNumber;
+    private String mailNumber;
+    private BspOrderResponseWrapper bspResponse;
+    private Integer isCancelSuss;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/erp/dto/df/DFConfigVo.java

@@ -0,0 +1,18 @@
+package com.fs.erp.dto.df;
+
+import lombok.Data;
+
+@Data
+public class DFConfigVo {
+    String dfAppKey;
+    String dfAppsecret;
+    String loginAccount; //登录账号
+    String callBackUrl; //回调地址
+    String monthlyCard; //月结账号
+    String senderName; //寄件人姓名
+    String senderPhone;  //寄件人手机
+    String senderProvince;  //寄件人省
+    String senderCity;  //寄件人市
+    String senderDistrict;  //寄件人区
+    String senderAddress;  //寄件人地址
+}

+ 27 - 0
fs-service/src/main/java/com/fs/erp/dto/df/DFDeliveryResponse.java

@@ -0,0 +1,27 @@
+package com.fs.erp.dto.df;
+
+import lombok.Data;
+
+@Data
+public class DFDeliveryResponse {
+    //运单号
+    private String mailNo;
+
+    //路由节点时间: yyyy-MM-dd HH:mm:ss
+    private String acceptTime;
+
+    //路由节点描述
+    private String remark;
+
+    //路由节点地点
+    private String acceptAddress;
+
+    //操作码
+    private String opCode;
+
+    //问题件代码
+    private String reasonCode;
+
+    //拓展字段4
+    private String extendAttach4;
+}

+ 71 - 0
fs-service/src/main/java/com/fs/erp/dto/df/ExteriorOrderSkuVo.java

@@ -0,0 +1,71 @@
+package com.fs.erp.dto.df;
+
+import lombok.Data;
+
+/**
+ * 外部订单SKU实体类
+ */
+@Data
+public class ExteriorOrderSkuVo {
+    /**
+     * 商品编号(必填)
+     */
+    private String productCode;
+
+    /**
+     * 商品名称(必填)
+     */
+    private String productName;
+
+    /**
+     * SKU编码(必填)
+     */
+    private String skuCode;
+
+    /**
+     * 商品规格(必填)
+     * 格式:颜色:红色,尺寸:L码....以此类推
+     */
+    private String attributeNames;
+
+    /**
+     * 商品预定数量(必填)
+     */
+    private Integer productNumber;
+
+    /**
+     * 商品单位(非必填)
+     */
+    private String unit;
+
+    /**
+     * 商品单价(必填)
+     */
+    private Double price;
+
+    /**
+     * 调整金额(非必填)
+     */
+    private Double adjustAmount;
+
+    /**
+     * 小计金额(必填)
+     */
+    private Double subAmount;
+
+    /**
+     * 备注(非必填)
+     */
+    private String remark;
+
+    /**
+     * 商品简称(非必填)
+     */
+    private String shortName;
+
+    /**
+     * 商家编码(非必填)
+     */
+    private String merchantCode;
+
+}

+ 268 - 0
fs-service/src/main/java/com/fs/erp/dto/df/ExternalOrderRequestVo.java

@@ -0,0 +1,268 @@
+package com.fs.erp.dto.df;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 外部订单请求实体类
+ */
+@Data
+public class ExternalOrderRequestVo {
+    /**
+     * 代服系统登录账号
+     */
+    private String loginAccount;
+
+    /**
+     * 订单下单后异步通知地址(非必填)
+     */
+    private String callBackUrl;
+
+    /**
+     * 订单号(必填,不能重复)
+     */
+    private String orderNumber;
+
+    /**
+     * 客户姓名(商户专业版有,入门版没有)
+     */
+    private String customerName;
+
+    /**
+     * 合计金额,保留两位小数(商户专业版有,入门版没有)
+     */
+    private Double amount;
+
+    /**
+     * 订单付款方式(必填)
+     * 1: 在线支付
+     * 2: 货到付款
+     */
+    private Integer orderPayMethod;
+
+    /**
+     * 代收金额,只保留两位小数(如果订单付款方式为货到付款,代收金额必须大于0)
+     */
+    private Double collectingMoney;
+
+    /**
+     * 保价,只保留两位小数
+     */
+    private Double insuredPrice;
+
+    /**
+     * 包装服务费,只保留两位小数
+     */
+    private Double individuationPacking;
+
+    /**
+     * 是否通知上门揽收(1是 0否)
+     */
+    private Integer isDoCall;
+
+    /**
+     * 物流产品编码(必填,参照3.1.5产品编码映射表)
+     */
+    private String expressProductCode;
+
+    /**
+     * 月结卡号
+     */
+    private String monthlyCard;
+
+    /**
+     * 托寄物(入门版有,专业版没有)
+     */
+    private String consignment;
+
+    /**
+     * 托寄物数量(入门版有且必填,专业版没有)
+     */
+    private Integer consignmentNumber;
+
+    /**
+     * 包裹重量,默认0.5,保留2位
+     */
+    private Double parcelWeight;
+
+    /**
+     * 包裹数量,默认1
+     */
+    private Integer parcelQuantity;
+
+    /**
+     * 代收卡号(如果订单付款方式为货到付款,代收卡号必填)
+     */
+    private String collectionCardNumber;
+
+    /**
+     * 签回单类型
+     * 1: 签名
+     * 2: 盖章
+     * 3: 登记身份证
+     * 4: 身份证复印件
+     */
+    private Integer signBackType;
+
+    /**
+     * 超长超重服务费,只保留两位小数
+     */
+    private Double overweightServiceFee;
+
+    /**
+     * 订单备注
+     */
+    private String remark;
+
+    /**
+     * 买家留言
+     */
+    private String buyerMessage;
+
+    /**
+     * 卖家留言
+     */
+    private String sellerMessage;
+
+    /**
+     * 自定义字段一
+     */
+    private String customField1;
+
+    /**
+     * 自定义字段二
+     */
+    private String customField2;
+
+    /**
+     * 仓库名称(商户专业版有,入门版没有)
+     */
+    private String warehouseName;
+
+    /**
+     * 流向
+     */
+    private String flowDirection;
+
+    /**
+     * 邮费,只保留两位小数
+     */
+    private Double postAge;
+
+    /**
+     * 是否自取(1是 0否)
+     */
+    private Integer selfPickup;
+
+    /**
+     * 是否保鲜服务(1是 0否)
+     */
+    private Integer freshServices;
+
+    /**
+     * 商品规格(商户专业版没有,入门版有)
+     */
+    private String attributeNames;
+
+    /**
+     * 寄件人
+     */
+    private String senderName;
+
+    /**
+     * 寄件人手机
+     */
+    private String senderPhone;
+
+    /**
+     * 寄件人电话
+     */
+    private String senderTelephone;
+
+    /**
+     * 寄件人公司
+     */
+    private String senderCompany;
+
+    /**
+     * 寄件人省(必填,参照3.1.9行政区规范标准)
+     */
+    private String senderProvince;
+
+    /**
+     * 寄件人市(必填,参照3.1.9行政区规范标准)
+     */
+    private String senderCity;
+
+    /**
+     * 寄件人区(必填,参照3.1.9行政区规范标准)
+     */
+    private String senderDistrict;
+
+    /**
+     * 寄件人地址
+     */
+    private String senderAddress;
+
+    /**
+     * 收件人
+     */
+    private String receiverName;
+
+    /**
+     * 收件人手机
+     */
+    private String receiverPhone;
+
+    /**
+     * 收件人电话
+     */
+    private String receiverTelephone;
+
+    /**
+     * 收件人公司
+     */
+    private String receiverCompany;
+
+    /**
+     * 收件人省(必填,参照3.1.9行政区规范标准)
+     */
+    private String receiverProvince;
+
+    /**
+     * 收件人市(必填,参照3.1.9行政区规范标准)
+     */
+    private String receiverCity;
+
+    /**
+     * 收件人区(必填,参照3.1.9行政区规范标准)
+     */
+    private String receiverDistrict;
+
+    /**
+     * 收件人地址
+     */
+    private String receiverAddress;
+
+    /**
+     * 物流付款方式(必填)
+     * 1: 寄付月结
+     * 2: 寄付现结
+     * 3: 收方付
+     * 4: 第三方付
+     */
+    private Integer expressPayMethod;
+
+    /**
+     * 附加数据
+     */
+    private String attach;
+
+    /**
+     * 订单SKU集合
+     */
+    private List<ExteriorOrderSkuVo> orderSkus;
+
+
+}

+ 51 - 0
fs-service/src/main/java/com/fs/erp/dto/df/OrderResponse.java

@@ -0,0 +1,51 @@
+package com.fs.erp.dto.df;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OrderResponse {
+    @JsonProperty("orderNumber")
+    private String orderNumber; // 客户订单号
+
+    @JsonProperty("mailNumber")
+    private String mailNumber; // 顺丰运单号(可包含子母单)
+
+    @JsonProperty("returnTrackingNumber")
+    private String returnTrackingNumber; // 顺丰签回单服务运单号
+
+    @JsonProperty("originCode")
+    private String originCode; // 原寄地区域代码
+
+    @JsonProperty("destCode")
+    private String destCode; // 目的地区域代码
+
+    @JsonProperty("filterResult")
+    private Integer filterResult; // 筛单结果:1-人工确认 2-可收派 3-不可以收派
+
+    @JsonProperty("remark")
+    private String remark; // 不可收派原因代码(filter_result=3时必填)
+
+    @JsonProperty("agentMailNumber")
+    private String agentMailNumber; // 代理单号
+
+    @JsonProperty("mappingMark")
+    private String mappingMark; // 地址映射码
+
+    @JsonProperty("url")
+    private String url; // 二维码URL(用于CX退货操作)
+
+    @JsonProperty("paymentLink")
+    private String paymentLink; // 第三方支付运费URL
+
+    @JsonProperty("isUpstairs")
+    private String isUpstairs; // 是否送货上楼:1-是
+
+    @JsonProperty("isSpecialWarehouseService")
+    private String isSpecialWarehouseService; // 是否包含特殊仓库:True-包含
+
+    @JsonProperty("rlsInfo")
+    private List<RlsInfo> rlsInfo; // 路由标签信息
+}

+ 100 - 0
fs-service/src/main/java/com/fs/erp/dto/df/RlsDetail.java

@@ -0,0 +1,100 @@
+package com.fs.erp.dto.df;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class RlsDetail {
+    @JsonProperty("waybillNumber")
+    private String waybillNumber; // 电子运单号
+
+    @JsonProperty("sourceTransferCode")
+    private String sourceTransferCode; // 原寄地中转场
+
+    @JsonProperty("sourceCityCode")
+    private String sourceCityCode; // 原寄地城市代码
+
+    @JsonProperty("sourceDeptCode")
+    private String sourceDeptCode; // 原寄地网点代码
+
+    @JsonProperty("sourceTeamCode")
+    private String sourceTeamCode; // 原寄地单元区域
+
+    @JsonProperty("destCityCode")
+    private String destCityCode; // 目的地城市代码
+
+    @JsonProperty("destDeptCode")
+    private String destDeptCode; // 目的地网点代码
+
+    @JsonProperty("destDeptCodeMapping")
+    private String destDeptCodeMapping; // 目的地网点代码映射码
+
+    @JsonProperty("destTeamCode")
+    private String destTeamCode; // 目的地单元区域
+
+    @JsonProperty("destTeamCodeMapping")
+    private String destTeamCodeMapping; // 目的地单元区域映射码
+
+    @JsonProperty("destTransferCode")
+    private String destTransferCode; // 目的地中转场
+
+    @JsonProperty("destRouteLabel")
+    private String destRouteLabel; // 路由标签信息
+
+    @JsonProperty("proName")
+    private String proName; // 产品名称
+
+    @JsonProperty("cargoTypeCode")
+    private String cargoTypeCode; // 快件内容代码(如C816)
+
+    @JsonProperty("limitTypeCode")
+    private String limitTypeCode; // 时效代码(如T4)
+
+    @JsonProperty("expressTypeCode")
+    private String expressTypeCode; // 付款方式(如B1)
+
+    @JsonProperty("codingMapping")
+    private String codingMapping; // 入港映射码
+
+    @JsonProperty("codingMappingOut")
+    private String codingMappingOut; // 出港映射码
+
+    @JsonProperty("xbFlag")
+    private String xbFlag; // XB标志:0-不打印/1-打印
+
+    @JsonProperty("printFlag")
+    private String printFlag; // 打印标志(9位01字符串)
+
+    @JsonProperty("twoDimensionCode")
+    private String twoDimensionCode; // 二维码信息
+
+    @JsonProperty("proCode")
+    private String proCode; // 时效类型(对应二维码K4)
+
+    @JsonProperty("printIcon")
+    private String printIcon; // 打印图标(8位01字符串)
+
+    @JsonProperty("abFlag")
+    private String abFlag; // AB标
+
+    @JsonProperty("errMsg")
+    private String errMsg; // 异常信息
+
+    @JsonProperty("destPortCode")
+    private String destPortCode; // 目的地口岸代码
+
+    @JsonProperty("destCountry")
+    private String destCountry; // 目的国别代码(如JP)
+
+    @JsonProperty("destPostCode")
+    private String destPostCode; // 目的地邮编
+
+    @JsonProperty("goodsValueTotal")
+    private String goodsValueTotal; // 总价值(保留两位小数)
+
+    @JsonProperty("currencySymbol")
+    private String currencySymbol; // 币种符号
+
+    @JsonProperty("goodsNumber")
+    private String goodsNumber; // 件数
+}

+ 21 - 0
fs-service/src/main/java/com/fs/erp/dto/df/RlsInfo.java

@@ -0,0 +1,21 @@
+package com.fs.erp.dto.df;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class RlsInfo {
+    @JsonProperty("invokeResult")
+    private String invokeResult; // 调用结果:OK-成功/ERR-失败
+
+    @JsonProperty("rlsCode")
+    private String rlsCode; // 返回代码(0000-参数异常,1000-成功等)
+
+    @JsonProperty("errorDesc")
+    private String errorDesc; // 错误描述
+
+    @JsonProperty("rlsDetail")
+    private List<RlsDetail> rlsDetail; // 路由详情列表
+}

+ 161 - 0
fs-service/src/main/java/com/fs/erp/dto/sdk/df/DfClient.java

@@ -0,0 +1,161 @@
+package com.fs.erp.dto.sdk.df;
+
+
+import com.alibaba.fastjson.JSON;
+import com.fs.erp.dto.df.DFConfigVo;
+import com.fs.erp.dto.sdk.df.enums.RequestUrlEnum;
+import com.fs.erp.dto.sdk.df.utils.WebUtils;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.utils.ConfigUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.security.GeneralSecurityException;
+import java.security.MessageDigest;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Wdt客户端
+ */
+@Component
+@Slf4j
+public class DfClient {
+	@Autowired
+	ConfigUtil configUtil;
+	private final String baseUrl = "https://ds-api.sf-express.com/externalapi/";
+	public static final String CHARSET = "UTF-8";
+	public static final String CONTENT_TYPE = "application/json";
+
+
+	private String getAppKey(int i) {
+		FsSysConfig sysConfig = configUtil.getSysConfig();
+		String dfConfigVo = sysConfig.getDfAccounts();
+		List<DFConfigVo> dfConfigVos = JSON.parseArray(dfConfigVo, DFConfigVo.class);
+		return dfConfigVos.get(i).getDfAppKey();
+	}
+
+	private String getAppsecret(int i) {
+		FsSysConfig sysConfig = configUtil.getSysConfig();
+		String dfConfigVo = sysConfig.getDfAccounts();
+		List<DFConfigVo> dfConfigVos = JSON.parseArray(dfConfigVo, DFConfigVo.class);
+		return dfConfigVos.get(i).getDfAppsecret();
+	}
+
+
+
+
+	private DfClient(){}
+
+	/***
+	 * description 生成签名
+	 * @methodName getSign
+	 * @param appSecret
+	 * @param timestamp
+	 * @param parameterString
+	 * @param body
+	 * @return java.lang.String
+	 * @author 01398643
+	 * @date 2020.12.29 下午 03:55
+	 */
+	private String getSign(String appSecret, String timestamp, String parameterString, String body) {
+		if (StringUtils.isEmpty(parameterString)) {
+			parameterString = "";
+		}
+		if (StringUtils.isEmpty(body)) {
+			body = "";
+		}
+		StringBuilder stringBuilder = new StringBuilder();
+		stringBuilder.append(parameterString);
+		stringBuilder.append(body);
+		stringBuilder.append("&appSecret=").append(appSecret);
+		stringBuilder.append("&timestamp=").append(timestamp);
+		byte[] bytes = DigestUtils.sha512(stringBuilder.toString());
+		return Hex.encodeHexString(bytes);
+	}
+
+	public String execute(RequestUrlEnum request, Map<String, Object> params,int i) throws IOException {
+		String appkey = getAppKey(i);
+		String appsecret = getAppsecret(i);
+		String timestamp = String.valueOf(System.currentTimeMillis());
+		String relativeUrl = request.getUrl();
+		String type = request.getType();
+		String url = baseUrl + relativeUrl;
+		String sign = null;
+		StringEntity stringEntity = null;
+		log.info("开始执行请求,相对路径:{},请求参数:{}", relativeUrl, params);
+		if ("GET".equalsIgnoreCase(type)) {
+			StringBuilder parameterString = new StringBuilder();
+			for (String s : params.keySet()) {
+				parameterString.append(s).append("=").append(params.get(s)).append("&");
+			}
+			if (parameterString.length() > 0) {
+				parameterString.deleteCharAt(parameterString.length() - 1);
+			}
+			String parameter = parameterString.toString();
+			url = url + "?" + parameter;
+			sign = getSign(appsecret, timestamp, parameter, null);
+		} else if ("POST".equals(type)) {
+			String bodyJsonString = JSON.toJSONString(params);
+			stringEntity = new StringEntity(bodyJsonString, ContentType.APPLICATION_JSON);
+			sign = getSign(appsecret, timestamp, null, bodyJsonString);
+		}
+		log.info("计算签名完成, 签名为:{}",sign);
+		//获取请求头
+		Header[] headers = {new BasicHeader("Content-Type", CONTENT_TYPE),
+				new BasicHeader("charset", CHARSET),
+				new BasicHeader("appKey", appkey),
+				new BasicHeader("sign", sign),
+				new BasicHeader("timestamp", timestamp)};
+		String jsonString = null;
+		long startTime = System.currentTimeMillis();
+		if ("GET".equalsIgnoreCase(type)) {
+			HttpGet httpGet = new HttpGet(url.toString());
+			httpGet.setHeaders(headers);
+			HttpClient client = HttpClientBuilder.create().build();
+			HttpResponse response = client.execute(httpGet);
+			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+				HttpEntity entity = response.getEntity();
+				jsonString = EntityUtils.toString(entity, CHARSET);
+				return jsonString;
+			}
+		} else if ("POST".equals(type)) {
+			HttpPost httpPost = new HttpPost(url);
+			httpPost.setHeaders(headers);
+			httpPost.setEntity(stringEntity);
+			HttpClient client = HttpClientBuilder.create().build();
+			HttpResponse response = client.execute(httpPost);
+			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+				HttpEntity entity = response.getEntity();
+				jsonString = EntityUtils.toString(entity, CHARSET);
+				return jsonString;
+			}
+		}
+		long endTime = System.currentTimeMillis();
+		long costTime = endTime - startTime;
+		// 打印 HTTP 请求的详细信息
+		log.info("请求URL: {}, 请求体: {}, 请求头: {}, 响应体: {}, 耗时: {} ms", url, params, headers, jsonString, costTime);
+		return null;
+	}
+}

+ 44 - 0
fs-service/src/main/java/com/fs/erp/dto/sdk/df/enums/ExpressProductCodeEnum.java

@@ -0,0 +1,44 @@
+package com.fs.erp.dto.sdk.df.enums;
+
+import java.util.Objects;
+
+public enum ExpressProductCodeEnum {
+
+    STANDARD("1", "顺丰标快"),
+    LAND_STANDARD("2", "顺丰标快(陆运)"),
+    PAID_WAITING_FOR_SHIPMENT("204", "陆运微小件"),
+    LAND("231", "陆运包裹"),
+    PARTIALLY_SHIPPED("208", "特惠专配");
+
+    private final String value;
+    private final String description;
+
+    ExpressProductCodeEnum(String value, String description) {
+        this.value = value;
+        this.description = description;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+
+     /**
+     * 根据状态值获取枚举实例
+     *
+     * @param value 状态值
+     * @return 对应的枚举实例,如果找不到则返回 null
+     */
+    public static ExpressProductCodeEnum fromValue(String value) {
+        for (ExpressProductCodeEnum status : ExpressProductCodeEnum.values()) {
+            if (Objects.equals(status.value, value)) {
+                return status;
+            }
+        }
+        return null;
+    }
+}

+ 40 - 0
fs-service/src/main/java/com/fs/erp/dto/sdk/df/enums/RequestUrlEnum.java

@@ -0,0 +1,40 @@
+package com.fs.erp.dto.sdk.df.enums;
+
+import java.util.Objects;
+
+public enum RequestUrlEnum {
+    CREAT_ORDER("order/create", "POST"),
+    ORDER_RESULT("query/order", "POST"),
+    ORDER_DELIVERY("query/route", "GET"),
+    ORDER_CANCEL("order/cancel", "POST");
+
+    private final String url;
+    private final String type;
+
+    RequestUrlEnum(String url, String type) {
+        this.url = url;
+        this.type = type;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * 根据类型值获取枚举实例
+     * @param url 类型值
+     * @return 对应的枚举实例, 如果找不到则返回 null
+     */
+     public static RequestUrlEnum fromValue(String url){
+         for(RequestUrlEnum requestUrl : RequestUrlEnum.values()){
+             if(Objects.equals(requestUrl.url, url)){
+                 return  requestUrl;
+             }
+         }
+         return null;
+     }
+}

+ 129 - 0
fs-service/src/main/java/com/fs/erp/dto/sdk/df/utils/StringUtils.java

@@ -0,0 +1,129 @@
+package com.fs.erp.dto.sdk.df.utils;
+
+
+/**
+ * 字符串工具类。
+ *
+ */
+public abstract class StringUtils {
+
+	private StringUtils() {}
+
+	/**
+	 * 检查指定的字符串是否为空。
+	 * <ul>
+	 * <li>SysUtils.isEmpty(null) = true</li>
+	 * <li>SysUtils.isEmpty("") = true</li>
+	 * <li>SysUtils.isEmpty("   ") = true</li>
+	 * <li>SysUtils.isEmpty("abc") = false</li>
+	 * </ul>
+	 *
+	 * @param value 待检查的字符串
+	 * @return true/false
+	 */
+	public static boolean isEmpty(String value) {
+		int strLen;
+		if (value == null || (strLen = value.length()) == 0) {
+			return true;
+		}
+		for (int i = 0; i < strLen; i++) {
+			if ((Character.isWhitespace(value.charAt(i)) == false)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 检查对象是否为数字型字符串,包含负数开头的。
+	 */
+	public static boolean isNumeric(Object obj) {
+		if (obj == null) {
+			return false;
+		}
+		char[] chars = obj.toString().toCharArray();
+		int length = chars.length;
+		if(length < 1)
+			return false;
+
+		int i = 0;
+		if(length > 1 && chars[0] == '-')
+			i = 1;
+
+		for (; i < length; i++) {
+			if (!Character.isDigit(chars[i])) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 检查指定的字符串列表是否不为空。
+	 */
+	public static boolean areNotEmpty(String... values) {
+		boolean result = true;
+		if (values == null || values.length == 0) {
+			result = false;
+		} else {
+			for (String value : values) {
+				result &= !isEmpty(value);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 把通用字符编码的字符串转化为汉字编码。
+	 */
+	public static String unicodeToChinese(String unicode) {
+		StringBuilder out = new StringBuilder();
+		if (!isEmpty(unicode)) {
+			for (int i = 0; i < unicode.length(); i++) {
+				out.append(unicode.charAt(i));
+			}
+		}
+		return out.toString();
+	}
+
+	public static String toUnderlineStyle(String name) {
+		StringBuilder newName = new StringBuilder();
+		for (int i = 0; i < name.length(); i++) {
+			char c = name.charAt(i);
+			if (Character.isUpperCase(c)) {
+				if (i > 0) {
+					newName.append("_");
+				}
+				newName.append(Character.toLowerCase(c));
+			} else {
+				newName.append(c);
+			}
+		}
+		return newName.toString();
+	}
+
+	public static String convertString(byte[] data, int offset, int length) {
+		if (data == null) {
+			return null;
+		} else {
+			try {
+				return new String(data, offset, length, "UTF-8");
+			} catch (Exception e) {
+				throw new RuntimeException(e);
+			}
+		}
+	}
+
+	public static byte[] convertBytes(String data) {
+		if (data == null) {
+			return null;
+		} else {
+			try {
+				return data.getBytes("UTF-8");
+			} catch (Exception e) {
+				throw new RuntimeException(e);
+			}
+		}
+	}
+
+}

+ 555 - 0
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -0,0 +1,555 @@
+package com.fs.erp.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fs.common.utils.DateUtils;
+import com.fs.company.service.ICompanyService;
+import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.domain.ErpOrder;
+import com.fs.erp.domain.ErpRefundOrder;
+import com.fs.erp.dto.*;
+import com.fs.erp.dto.df.*;
+import com.fs.erp.dto.sdk.df.DfClient;
+import com.fs.erp.dto.sdk.df.enums.ExpressProductCodeEnum;
+import com.fs.erp.dto.sdk.df.enums.RequestUrlEnum;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.erp.utils.CommonUtils;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.*;
+import com.fs.his.enums.FsStoreOrderLogEnum;
+import com.fs.his.mapper.*;
+import com.fs.his.service.IFsExpressService;
+import com.fs.his.service.IFsStoreOrderLogsService;
+import com.fs.his.utils.ConfigUtil;
+import com.hc.openapi.tool.util.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.Asserts;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+@Service
+@Slf4j
+public class DfOrderServiceImpl implements IErpOrderService
+{
+    @Autowired
+    ConfigUtil configUtil;
+
+    @Autowired
+    private FsStoreOrderMapper fsStoreOrderMapper;
+
+    @Autowired
+    private FsStoreOrderItemMapper fsStoreOrderItemMapper;
+
+    @Autowired
+    private FsStoreProductMapper fsStoreProductMapper;
+
+    @Autowired
+    private FsStoreOrderDfMapper fsStoreOrderDfMapper;
+
+    @Autowired
+    private FsExpressMapper fsExpressMapper;
+
+    @Autowired
+    private DfClient client;
+
+    @Autowired
+    private IFsStoreOrderLogsService fsStoreOrderLogsService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private FsStoreMapper fsStoreMapper;
+
+    @Autowired
+    private IFsExpressService expressService;
+
+
+    @Override
+    public ErpOrderResponse addOrder(ErpOrder order) {
+        return getErpOrderResponse(order);
+    }
+
+    /**
+     * 退款 取消订单
+     * @param order
+     * @return
+     */
+    @Override
+    public ErpOrderResponse refundOrder(ErpRefundOrder order) {
+        //获取代服账户
+        String orderCode = order.getOrderCode();
+        FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
+        FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(fsStoreOrder.getOrderId());
+        Integer sfAccountIndex = getIndex(fsStoreOrder);
+        if (sfAccountIndex > -1) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("loginAccount", df.getLoginAccount());
+            DFConfigVo config = getconfig(sfAccountIndex);
+            if ( config != null && StringUtils.isNotBlank(config.getCallBackUrl())){
+                map.put("callBackUrl", config.getCallBackUrl());
+            }
+            map.put("orderNumber", orderCode);
+            map.put("mailNumber", fsStoreOrder.getDeliverySn());
+            try {
+                //2.请求
+                log.info("开始取消订单,参数: {}", JSON.toJSONString(map));
+                String response = client.execute(RequestUrlEnum.ORDER_CANCEL,map ,sfAccountIndex);
+                DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+                //3.处理请求结果
+                if(dfApiResponse != null && "ok".equals(dfApiResponse.getCode())){
+                    //存储订单推送用的哪个账户
+                    log.info("订单取消成功: {}", response);
+                    //修改df表
+                    df.setStatus(2);
+                    df.setUpdateTime(DateUtils.getNowDate());
+                    fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                    //可以回调 也可以查询订单
+                    Map<String,Object> orderResultQueryParam = new HashMap<>();
+                    orderResultQueryParam.put("orderNumber",orderCode);
+                    orderResultQueryParam.put("exInterfaceType",2); //2为查询取消订单结果
+                    getOrderResult(orderResultQueryParam,sfAccountIndex);
+                    ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                    erpOrderResponse.setCode(orderCode);
+                    erpOrderResponse.setSuccess(true);
+                    return erpOrderResponse;
+                } else {
+                    throw new RuntimeException(String.format("订单取消失败,原因: %s",dfApiResponse.getMsg()));
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return new ErpOrderResponse();
+    }
+
+    @Override
+    public ErpDeliverysResponse getDeliver(ErpDeliverysRequest request) {
+        ErpDeliverysResponse erpDeliverysResponse = new ErpDeliverysResponse();
+        String orderCode = request.getCode();
+        if (StrUtil.isNotBlank(orderCode)) {
+            FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
+            if (order != null) {
+                String mailNumber = order.getDeliverySn();
+                Integer sfAccountIndex = getIndex(order);
+                if (StringUtils.isNotBlank(mailNumber) && sfAccountIndex > -1){
+                    try {
+                        Map<String,Object> map = new HashMap<>();
+                        map.put("mailNumber",mailNumber);
+                        log.info("开始查询路由结果,参数为: {}", JSON.toJSONString(map));
+                        String response = client.execute(RequestUrlEnum.ORDER_DELIVERY, map, sfAccountIndex);
+                        DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+                        if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                            dfApiResponse.setCode(mailNumber);
+                            Object result = dfApiResponse.getResult();
+                            String jsonStr = JSONUtil.toJsonStr(result);
+                            List<ErpDeliverys> dfDeliveryResponse = null;
+                            try {
+                                dfDeliveryResponse = JSON.parseArray(jsonStr, ErpDeliverys.class);
+                            } catch (Exception e) {
+                                log.info("查询路由结果异常: {},结果为:{}", e.getMessage(), jsonStr);
+                                erpDeliverysResponse.setSuccess(false);
+                                erpDeliverysResponse.setErrorDesc("未更新物流");
+                                return erpDeliverysResponse;
+                            }
+                            if (dfDeliveryResponse != null && !dfDeliveryResponse.isEmpty()) {
+                                for (ErpDeliverys deliveryResponse : dfDeliveryResponse) {
+                                    deliveryResponse.setMail_no(deliveryResponse.getMailNo());
+                                    deliveryResponse.setExpress_code(deliveryResponse.getMailNo());
+                                    deliveryResponse.setExpress_name("顺丰");
+                                }
+                                erpDeliverysResponse.setDeliverys(dfDeliveryResponse);
+                            }
+                        } else{
+                            erpDeliverysResponse.setErrorDesc(dfApiResponse.getMsg());
+                        }
+                    } catch (IOException e) {
+                        log.info("代服路由查询错误{}", e.getMessage());
+                    }
+                } else {
+                    erpDeliverysResponse.setErrorDesc("该订单不存在/顺丰账户不存在");
+                }
+            }
+
+
+        } else {
+            erpDeliverysResponse.setErrorDesc("未获取到原始订单号");
+        }
+        return erpDeliverysResponse;
+    }
+
+    private @NotNull Integer getIndex(FsStoreOrder order) {
+        //获取下单账户
+        FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
+        Integer sfAccountIndex = -1;
+        if (df != null) {
+            List<DFConfigVo> dfConfigVos = getDfConfigVos();
+            if (dfConfigVos != null && !dfConfigVos.isEmpty()) {
+                for (int i = 0; i < dfConfigVos.size(); i++) {
+                    if (df.getLoginAccount().equals(dfConfigVos.get(i).getLoginAccount())) {
+                        return sfAccountIndex = i;
+                    }
+                }
+            }
+        }
+        return sfAccountIndex;
+    }
+
+
+    /**
+     * 目前仅查询下单用户
+     * @param requset
+     * @return
+     */
+    @Override
+    public ErpOrderQueryResponse getOrder(ErpOrderQueryRequert requset) {
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+        String orderNumber = requset.getCode();
+        if (StrUtil.isNotBlank(orderNumber)) {
+            FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+            if (order != null) {
+                //获取下单账户
+                FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
+                Integer sfAccountIndex = getIndex(order);
+                if (sfAccountIndex > -1){
+                    Map<String,Object> orderResultQueryParam = new HashMap<>();
+                    orderResultQueryParam.put("orderNumber",orderNumber);
+                    orderResultQueryParam.put("exInterfaceType",df.getStatus());
+                    getOrderResult(orderResultQueryParam,sfAccountIndex);
+                    return response;
+                }
+            }
+            response.setErrorDesc("该订单不存在/顺丰账户不存在");
+        } else {
+            response.setErrorDesc("未获取到原始订单号");
+        }
+        return response;
+    }
+
+    @Override
+    public BaseResponse refundUpdate(ErpRefundUpdateRequest request) {
+        ErpRefundOrder erpRefundOrder = new ErpRefundOrder();
+        erpRefundOrder.setOrderCode(request.getTid());
+        return refundOrder(erpRefundOrder);
+    }
+
+    @Override
+    public ErpOrderResponse finishOrder(ErpOrder order) {
+        return null;
+    }
+
+    /**
+     * 获取erp推送参数
+     * @param order 订单参数
+     * @return
+     */
+    private ErpOrderResponse getErpOrderResponse(ErpOrder order) {
+        int sfAccountIndex = getSFAccountIndex();
+        FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(order.getPlatform_code());
+        if (fsStoreOrder == null) {
+            return null;
+        }
+        //1.获取请求参数
+        ExternalOrderRequestVo vo= getCreateOrderRequestParam(order,fsStoreOrder,sfAccountIndex);
+        if (vo == null){
+            return null;
+        }
+        try {
+            Map<String,Object> map = JSON.parseObject(JSON.toJSONString(vo), Map.class);
+            //2.请求
+            log.info("开始推送订单,参数: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.CREAT_ORDER,map ,sfAccountIndex);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            //3.处理请求结果
+            if(dfApiResponse != null && "ok".equals(dfApiResponse.getCode())){
+                //存储订单推送用的哪个账户
+                FsStoreOrderDf df = addDfOrder(fsStoreOrder, sfAccountIndex);
+                log.info("订单推送成功: {}", response);
+                //可以回调 也可以查询订单
+                Map<String,Object> orderResultQueryParam = new HashMap<>();
+                orderResultQueryParam.put("orderNumber",order.getPlatform_code());
+                orderResultQueryParam.put("exInterfaceType",df.getStatus());
+                getOrderResult(orderResultQueryParam,sfAccountIndex);
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(order.getPlatform_code());
+                erpOrderResponse.setSuccess(true);
+                return erpOrderResponse;
+            } else {
+                throw new RuntimeException(String.format("订单推送失败,原因: %s",dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
+    }
+
+    private @NotNull FsStoreOrderDf addDfOrder(FsStoreOrder fsStoreOrder, int sfAccountIndex) {
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(fsStoreOrder.getOrderId());
+        df.setOrderCode(fsStoreOrder.getOrderCode());
+        DFConfigVo config = getconfig(sfAccountIndex);
+        df.setAppKey(config.getDfAppKey());
+        df.setAppSecret(config.getDfAppsecret());
+        df.setLoginAccount(config.getLoginAccount());
+        df.setMonthlyCard(config.getMonthlyCard());
+        df.setTotalPrice(fsStoreOrder.getPayMoney());
+        df.setPlatformPrice(fsStoreOrder.getPayPrice());
+        df.setStatus(1);
+        //查询是否存在
+        FsStoreOrderDf temp = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(df.getOrderId());
+        if(temp != null){
+            //修改
+            df.setUpdateTime(DateUtils.getNowDate());
+            fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+        } else {
+            df.setCreateTime(DateUtils.getNowDate());
+            fsStoreOrderDfMapper.insertFsStoreOrderDf(df);
+        }
+        return df;
+    }
+
+    /**
+     * 通用erpOrder获取创建订单参数
+     * @param order
+     * @return
+     */
+    private ExternalOrderRequestVo getCreateOrderRequestParam(ErpOrder order,FsStoreOrder fsStoreOrder,int index) {
+        ExternalOrderRequestVo vo = new ExternalOrderRequestVo();
+        DFConfigVo config = getconfig(index);
+        if (config == null) {
+            return null;
+        }
+        String loginAccount = config.getLoginAccount();
+        vo.setMonthlyCard(config.getMonthlyCard()); //月结卡号
+
+
+        vo.setLoginAccount(loginAccount); //代服系统登录账号
+        String callBackUrl = config.getCallBackUrl();
+        if (StringUtils.isNotBlank(callBackUrl)){
+            vo.setCallBackUrl(callBackUrl); //订单下单后异步通知地址
+        }
+        vo.setOrderNumber(order.getPlatform_code()); //订单号(不能重复)
+
+        int orderPayMethod = 0;
+        BigDecimal couponPrice = fsStoreOrder.getCouponPrice();
+        if (couponPrice == null) {
+            couponPrice = BigDecimal.ZERO;
+        }
+
+        if (ObjectUtil.equal(1,fsStoreOrder.getPayType())) {
+            //在线支付
+            orderPayMethod = 1;
+        } else { // 如果是线上付款
+            orderPayMethod = 2;
+            // 货到付款金额 = 物流代收金额-优惠金额
+            vo.setCollectingMoney(fsStoreOrder.getPayDelivery().subtract(couponPrice).doubleValue());
+        }
+        //订单付款方式 1:在线支付 2:货到付款
+        //如果填了2,代收金额必须大于0,代收卡号必填
+        vo.setOrderPayMethod(orderPayMethod);
+        vo.setExpressProductCode(ExpressProductCodeEnum.LAND.getValue()); //物流产品编码 默认陆运包裹
+
+        vo.setConsignmentNumber(Integer.valueOf(Math.toIntExact(fsStoreOrder.getTotalNum()))); //托寄物数量 必填
+
+        vo.setBuyerMessage(fsStoreOrder.getRemark()); //买家留言
+
+        vo.setSenderName(config.getSenderName()); //寄件人
+        vo.setSenderPhone(config.getSenderPhone()); //寄件人手机
+        vo.setSenderProvince(config.getSenderProvince());//寄件人省
+        vo.setSenderCity(config.getSenderCity());//寄件人市
+        vo.setSenderDistrict(config.getSenderDistrict());//寄件人区
+        vo.setSenderAddress(config.getSenderAddress());//寄件人地址
+        vo.setReceiverName(order.getReceiver_name());//收件人
+        vo.setReceiverPhone(order.getReceiver_mobile()); //收件人手机
+        vo.setReceiverTelephone(order.getReceiver_phone());//收件人电话 否
+        vo.setReceiverProvince(order.getReceiver_province()); //收件人省
+        vo.setReceiverCity(order.getReceiver_city()); //收件人市
+        vo.setReceiverDistrict(order.getReceiver_district()); //收件人区
+        vo.setReceiverAddress(order.getReceiver_address()); // 收件人地址
+        vo.setExpressPayMethod(1); //物流付款方式 1:寄付月结 2:寄付现结 3:收方付 4:第三方付
+        //订单sku集合
+        StringBuilder consignmentStr = new StringBuilder();
+        List<FsStoreOrderItem> items = fsStoreOrderItemMapper.selectFsStoreOrderItemListByOrderId(fsStoreOrder.getOrderId());
+        if (items != null && items.size() > 0) {
+            ArrayList<ExteriorOrderSkuVo> orderSkus = new ArrayList<>();
+            items.forEach(item->{
+                ExteriorOrderSkuVo skuVo = new ExteriorOrderSkuVo();
+                FsStoreProduct product = fsStoreProductMapper.selectFsStoreProductById(item.getProductId());
+                Asserts.check(ObjectUtils.isNotNull(product),"该产品不存在! 产品id: {} ",item.getProductId());
+                skuVo.setProductName(product.getProductName()); //商品名称
+                com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
+                skuVo.setSkuCode(jsonObject.getString("sku")); //sku编码
+                skuVo.setProductCode(jsonObject.getString("barCode")); //商品编号
+                skuVo.setAttributeNames(jsonObject.getString("sku")); //商品规格,格式:颜色:红色,尺寸:L码....以此类推
+                skuVo.setProductNumber(Math.toIntExact(item.getNum())); //商品预定数量
+                skuVo.setPrice(product.getPrice().doubleValue()); //商品单价
+
+//                skuVo.setAdjustAmount(0d); //调整金额
+                // 优惠
+                skuVo.setSubAmount(product.getPrice().doubleValue() * item.getNum());
+
+                //组装寄托物
+                consignmentStr.append(product.getProductName()).append("*").append(item.getNum()).append(",");
+                orderSkus.add(skuVo);
+            });
+            if (consignmentStr.length() > 0) {
+                consignmentStr.deleteCharAt(consignmentStr.length() - 1);
+            }
+            if (consignmentStr.length() > 100) {
+                consignmentStr.delete(consignmentStr.length() - 4, consignmentStr.length());
+                consignmentStr.append("...");
+            }
+            vo.setOrderSkus(orderSkus);
+            vo.setConsignment(consignmentStr.toString()); //寄托物 必填
+        }
+        return vo;
+    }
+
+    private @Nullable DFConfigVo getconfig(int index) {
+        List<DFConfigVo> dfConfigVos = getDfConfigVos();
+        DFConfigVo config = null;
+        if (dfConfigVos != null && !dfConfigVos.isEmpty()) {
+            config = dfConfigVos.get(index);
+        }
+        return config;
+    }
+
+    private @Nullable List<DFConfigVo> getDfConfigVos() {
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        String dfConfigVo = sysConfig.getDfAccounts();
+        List<DFConfigVo> dfConfigVos = JSON.parseArray(dfConfigVo, DFConfigVo.class);
+        return dfConfigVos;
+    }
+
+
+    /**
+     * 获取账户索引 后续添加规则
+     * @return
+     */
+    private int getSFAccountIndex(){
+        return 0;
+        //目前用第一个
+    }
+
+    private void getOrderResult(Map<String,Object> map, Integer sfAccountIndex){
+        try {
+            String status = map.get("exInterfaceType").toString();
+            log.info("开始查询订单结果,参数为: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_RESULT,map ,sfAccountIndex);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            if(dfApiResponse != null && "ok".equals(dfApiResponse.getCode())){
+                log.info("查询订单结果,结果: {}", JSON.toJSONString(dfApiResponse));
+                Object result = dfApiResponse.getResult();
+                if (result != null) {
+                    String jsonString = JSON.toJSONString(result);
+                    //下单
+                    if ("1".equals(status)) {
+                        //下单结果
+                        BspOrderResponseWrapper bspOrderResponse = JSONUtil.toBean(jsonString,BspOrderResponseWrapper.class);
+                        if (bspOrderResponse != null) {
+                            setExpress(bspOrderResponse);
+                        }
+                    } else if ("2".equals(status)){
+                        //取消订单
+                        DFCancelOrderResultResponse cancelResponse = JSONUtil.toBean(jsonString,DFCancelOrderResultResponse.class);
+                        if (cancelResponse != null) {
+                            if (cancelResponse.getIsCancelSuss() == 1) {
+                                log.info("查询订单取消成功,返回结果{}", JSON.toJSONString(cancelResponse));
+                            } else {
+                                log.info("查询订单取消失败,返回结果{}", JSON.toJSONString(cancelResponse));
+                            }
+                        }
+                    }
+                }
+
+            } else {
+                throw new RuntimeException(String.format("查询订单失败,原因: %s",dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 顺丰会有自己的轨迹推送 不使用快递鸟(代服务管家设置推送地址)
+     * @param bspResponse
+     */
+    private void setExpress(BspOrderResponseWrapper bspResponse) {
+        String orderNumber = bspResponse.getOrderNumber();
+        //快递单号
+        String mailNumber = bspResponse.getMailNumber();
+        //快递名字
+        BspOrderResponse bspOrderResponse = bspResponse.getBspResponse();
+        if (bspOrderResponse != null) {
+            AtomicBoolean flag = new AtomicBoolean(false);
+            List<OrderResponse> list = bspOrderResponse.getBody();
+            if (list != null && !list.isEmpty()) {
+                for (OrderResponse orderResponse : list) {
+                    List<RlsInfo> rlsInfo = orderResponse.getRlsInfo();
+                    if (rlsInfo != null && !rlsInfo.isEmpty()) {
+                        for (RlsInfo info : rlsInfo) {
+                            List<RlsDetail> rlsDetails = info.getRlsDetail();
+                            if (rlsDetails != null && !rlsDetails.isEmpty()) {
+                                for (RlsDetail rlsDetail : rlsDetails) {
+                                    String proCode = rlsDetail.getProCode();
+                                    if (StringUtils.isNotBlank(proCode)) {
+                                        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+                                        if (order != null && order.getStatus() == 2) {
+                                            order.setDeliverySn(mailNumber);
+                                            order.setDeliveryName(proCode);
+                                            order.setDeliveryCode("SF");
+                                            order.setStatus(3);
+                                            order.setDeliverySendTime(DateUtils.getNowDate());
+                                            fsStoreOrderMapper.updateFsStoreOrder(order);
+                                            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+                                            if (order.getCompanyId() != null && order.getCompanyId() > 0) {
+                                                companyService.subtractCompanyMoney(order);
+                                            }
+
+//                                            FsStore store = fsStoreMapper.selectFsStoreByStoreId(order.getStoreId());
+//                                            //订阅物流回调
+//                                            String lastFourNumber = "";
+//                                            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+//                                                if (store != null && store.getSendPhone() != null) {
+//                                                    lastFourNumber = store.getSendPhone();
+//                                                } else {
+//                                                    lastFourNumber = order.getUserPhone();
+//                                                }
+//                                                if (lastFourNumber.length() == 11) {
+//                                                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+//                                                }
+//                                            }
+//                                            expressService.subscribeEspress(order.getOrderCode(), order.getDeliveryCode(), order.getDeliverySn(), lastFourNumber);
+                                            flag.set(true);
+                                        }
+                                        break;
+                                    }
+                                }
+
+                            }
+                            if (flag.get()){
+                                break;
+                            }
+                        }
+
+                    }
+                    if (flag.get()){
+                        break;
+                    }
+                }
+            }
+        }
+    }
+}

+ 18 - 8
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -20,11 +20,13 @@ import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStoreOrderItem;
 import com.fs.his.domain.FsStoreProduct;
+import com.fs.his.mapper.FsStoreOrderMapper;
 import com.fs.his.service.IFsStoreOrderItemService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.his.service.IFsStoreProductService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsStoreOrderItemVO;
+import com.hc.openapi.tool.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.http.client.utils.DateUtils;
@@ -70,6 +72,9 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
      * 退款推送
      */
     private static final Integer REFUND_TYPE = 2;
+    @Autowired
+    private FsStoreOrderMapper fsStoreOrderMapper;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
 //        if(order.getIsPackage()!=null && order.getIsPackage() == 1){
@@ -108,7 +113,7 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 
 
         // 如果是货到付款
-        if("2".equals(fsStoreOrder.getPayType())){
+        if(fsStoreOrder.getPayType() == 2){
             // 支付状态
             erpWdtTrade.setPayStatus(PaymentStatus.PARTIALLY_PAID.getValue());
             // 发货条件
@@ -116,7 +121,7 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
             // 货到付款金额 = 物流代收金额-优惠金额
             erpWdtTrade.setCodAmount(fsStoreOrder.getPayDelivery().subtract(couponPrice));
 
-        } else if("3".equals(fsStoreOrder.getPayType())){
+        } else if(fsStoreOrder.getPayType() == 3){
             // 支付状态
             erpWdtTrade.setPayStatus(PaymentStatus.UNPAID.getValue());
             // 发货条件
@@ -502,7 +507,7 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 
         // 优惠券金额
         BigDecimal couponPrice = fsStoreOrder.getCouponPrice();
-        if (fsStoreOrder.getCouponPrice().compareTo(BigDecimal.ZERO) == 0
+        if (couponPrice != null && fsStoreOrder.getCouponPrice().compareTo(BigDecimal.ZERO) == 0
                 && fsStoreOrder.getTotalPrice().compareTo(fsStoreOrder.getPayMoney()) > 0) {
             couponPrice = fsStoreOrder.getTotalPrice().subtract(fsStoreOrder.getPayMoney());
         }
@@ -540,7 +545,9 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
             // 分摊比例
             BigDecimal price = fsStoreProduct.getPrice().multiply(BigDecimal.valueOf(fsStoreOrderItem.getNum()));
             BigDecimal divide = price.divide(totalPrice, RoundingMode.HALF_UP);
-            erpWdtOrder.setShareDiscount(divide.multiply(couponPrice));
+            if (couponPrice != null && divide != null) {
+                erpWdtOrder.setShareDiscount(divide.multiply(couponPrice));
+            }
 
             erpWdtOrderList.add(erpWdtOrder);
         }
@@ -550,10 +557,13 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         long size = erpWdtOrderList.size();
         if(size > 1) {
             ErpWdtOrder erpWdtOrder = erpWdtOrderList.get(erpWdtOrderList.size() - 1);
-            erpWdtOrder.setShareDiscount(couponPrice.subtract(erpWdtOrderList.stream()
-                    .limit(size - 1L)
-                    .map(item -> Optional.ofNullable(item.getShareDiscount()).orElse(BigDecimal.ZERO))
-                    .reduce(BigDecimal.ZERO, BigDecimal::add)));
+            if (couponPrice != null) {
+                erpWdtOrder.setShareDiscount(couponPrice.subtract(erpWdtOrderList.stream()
+                        .limit(size - 1L)
+                        .map(item -> Optional.ofNullable(item.getShareDiscount()).orElse(BigDecimal.ZERO))
+                        .reduce(BigDecimal.ZERO, BigDecimal::add)));
+            }
+
         }
 
         erpWdtTrade.setOrderList(erpWdtOrderList);

+ 7 - 0
fs-service/src/main/java/com/fs/his/config/FsSysConfig.java

@@ -1,6 +1,10 @@
 package com.fs.his.config;
 
+import com.fs.erp.dto.df.DFConfigVo;
 import lombok.Data;
+
+import java.util.List;
+
 @Data
 public class FsSysConfig {
     //快递鸟
@@ -34,6 +38,9 @@ public class FsSysConfig {
     String erpHzOMSItenantid;
     String erpHzOMTokenUrl;
     String erpHzOMBaseUrl;
+    //非erp 代服管家(多个账号) List<DFConfigVo>
+    String dfAccounts;
+
     //支付接口
     Integer payOpen;//是否开启
     String payPartnerId;

+ 54 - 0
fs-service/src/main/java/com/fs/his/domain/FsStoreOrderDf.java

@@ -0,0 +1,54 @@
+package com.fs.his.domain;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 订单代服管家对象 fs_store_order_df
+ *
+ * @author fs
+ * @date 2025-07-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsStoreOrderDf extends BaseEntity{
+
+    /** 订单id */
+    @TableId
+    private Long orderId;
+
+    /** 订单编号 */
+    @Excel(name = "订单编号")
+    private String orderCode;
+
+    @Excel(name = "订单编号")
+    private String appKey;
+
+    @Excel(name = "订单编号")
+    private String appSecret;
+
+    @Excel(name = "订单编号")
+    private String loginAccount;
+
+    /** 顺丰月结账户 */
+    @Excel(name = "顺丰月结账户")
+    private String monthlyCard;
+
+    /** 订单总价 */
+    @Excel(name = "订单总价")
+    private BigDecimal totalPrice;
+
+    /** 平台收款 */
+    @Excel(name = "平台收款")
+    private BigDecimal platformPrice;
+
+    /** 平台收款 */
+    @Excel(name = "2:取消订单 1:下单")
+    private Integer status;
+
+
+}

+ 1 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserOperationLog.java

@@ -16,6 +16,7 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class FsUserOperationLog extends BaseEntity{
 
+    @TableId
     private Long logId;
 
     /** 用户id */

+ 61 - 0
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderDfMapper.java

@@ -0,0 +1,61 @@
+package com.fs.his.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsStoreOrderDf;
+
+/**
+ * 订单代服管家Mapper接口
+ * 
+ * @author fs
+ * @date 2025-07-08
+ */
+public interface FsStoreOrderDfMapper extends BaseMapper<FsStoreOrderDf>{
+    /**
+     * 查询订单代服管家
+     * 
+     * @param orderId 订单代服管家主键
+     * @return 订单代服管家
+     */
+    FsStoreOrderDf selectFsStoreOrderDfByOrderId(Long orderId);
+
+    /**
+     * 查询订单代服管家列表
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 订单代服管家集合
+     */
+    List<FsStoreOrderDf> selectFsStoreOrderDfList(FsStoreOrderDf fsStoreOrderDf);
+
+    /**
+     * 新增订单代服管家
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 结果
+     */
+    int insertFsStoreOrderDf(FsStoreOrderDf fsStoreOrderDf);
+
+    /**
+     * 修改订单代服管家
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 结果
+     */
+    int updateFsStoreOrderDf(FsStoreOrderDf fsStoreOrderDf);
+
+    /**
+     * 删除订单代服管家
+     * 
+     * @param orderId 订单代服管家主键
+     * @return 结果
+     */
+    int deleteFsStoreOrderDfByOrderId(Long orderId);
+
+    /**
+     * 批量删除订单代服管家
+     * 
+     * @param orderIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsStoreOrderDfByOrderIds(Long[] orderIds);
+}

+ 4 - 2
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java

@@ -1082,14 +1082,16 @@ public interface FsStoreOrderMapper
             "</script>"})
     Integer selectFsStoreOrderCountByType(@Param("companyId") Long companyId,@Param("userId") long userId, @Param("type")int type);
 
-    @Select("select * from fs_store_order where  `status`=2 ")
+    @Select("select * from fs_store_order where  `status`=2 and extend_order_id is not null ")
     List<FsStoreOrder> selectWdtOmsOrderdeliveryOp();
 
-    int batchUpdateErpByOrderIds(@Param("maps") FsStoreOrderSetErpPhoneParam param);
+    int batchUpdateErpByOrderIds(@Param("maps") List<Map<String, String>> maps);
 
     @Select(" select * from fs_store_order where order_code=#{orderCode} and store_id=#{storeId}")
     FsStoreOrder getOrderByOrderCodeAndStoreId(@Param("orderCode")String orderCode,@Param("storeId") Long storeId);
 
     @Update("UPDATE fs_store_order SET delivery_code = #{order.deliveryCode} , delivery_name = #{order.deliveryName} , delivery_sn = #{order.deliverySn}   WHERE follow_doctor_id = #{order.orderId}")
     int updateStoreOrderDeliveryInfo(@Param("order") FsStoreOrder order);
+    @Update("UPDATE fs_store_order SET delivery_code = #{deliveryCode} WHERE extend_order_id = #{extendOrderId}")
+    int updateFsStoreOrderByExtendOrderId(@Param("extendOrderId")String extendOrderId,@Param("deliveryCode")String deliveryCode);
 }

+ 2 - 10
fs-service/src/main/java/com/fs/his/mapper/FsUserOperationLogMapper.java

@@ -4,7 +4,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsUserOperationLog;
 import com.fs.his.param.FsUserOperationLogQueryParam;
-import com.fs.his.vo.FsUserOperationLogVo;
+import com.fs.his.vo.FsUserOperationLogPageVo;
 
 /**
  * 用户操作日志Mapper接口
@@ -19,7 +19,7 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
      * @param logId 用户操作日志主键
      * @return 用户操作日志
      */
-    FsUserOperationLogVo selectFsUserOperationLogByLogId(Long logId);
+    FsUserOperationLog selectFsUserOperationLogByLogId(Long logId);
 
     /**
      * 查询用户操作日志列表
@@ -29,14 +29,6 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
      */
     List<FsUserOperationLog> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
 
-    /**
-     * 查询用户操作日志列表
-     *
-     * @param fsUserOperationLog 用户操作日志
-     * @return 用户操作日志集合
-     */
-    List<FsUserOperationLogVo> selectFsUserOperationLogByList(FsUserOperationLog fsUserOperationLog);
-
     /**
      * 新增用户操作日志
      *

+ 2 - 2
fs-service/src/main/java/com/fs/his/param/FsStoreOrderSetErpPhoneParam.java

@@ -5,7 +5,7 @@ import lombok.Data;
 import java.util.List;
 
 @Data
-public class FsStoreOrderSetErpPhoneParam {
-    private String erpPhone;
+public class FsStoreOrderSetErpPhoneParam extends FsStoreOrderParam{
+    private List<String> erpPhone;
     private List<Long> orderIds;
 }

+ 61 - 0
fs-service/src/main/java/com/fs/his/service/IFsStoreOrderDfService.java

@@ -0,0 +1,61 @@
+package com.fs.his.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsStoreOrderDf;
+
+/**
+ * 订单代服管家Service接口
+ * 
+ * @author fs
+ * @date 2025-07-08
+ */
+public interface IFsStoreOrderDfService extends IService<FsStoreOrderDf>{
+    /**
+     * 查询订单代服管家
+     * 
+     * @param orderId 订单代服管家主键
+     * @return 订单代服管家
+     */
+    FsStoreOrderDf selectFsStoreOrderDfByOrderId(Long orderId);
+
+    /**
+     * 查询订单代服管家列表
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 订单代服管家集合
+     */
+    List<FsStoreOrderDf> selectFsStoreOrderDfList(FsStoreOrderDf fsStoreOrderDf);
+
+    /**
+     * 新增订单代服管家
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 结果
+     */
+    int insertFsStoreOrderDf(FsStoreOrderDf fsStoreOrderDf);
+
+    /**
+     * 修改订单代服管家
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 结果
+     */
+    int updateFsStoreOrderDf(FsStoreOrderDf fsStoreOrderDf);
+
+    /**
+     * 批量删除订单代服管家
+     * 
+     * @param orderIds 需要删除的订单代服管家主键集合
+     * @return 结果
+     */
+    int deleteFsStoreOrderDfByOrderIds(Long[] orderIds);
+
+    /**
+     * 删除订单代服管家信息
+     * 
+     * @param orderId 订单代服管家主键
+     * @return 结果
+     */
+    int deleteFsStoreOrderDfByOrderId(Long orderId);
+}

+ 14 - 4
fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java

@@ -10,13 +10,15 @@ import com.fs.company.param.FsStoreStatisticsParam;
 import com.fs.company.vo.FsStoreOrderStatisticsVO;
 import com.fs.company.vo.FsStoreProductStatisticsVO;
 import com.fs.erp.domain.ErpOrder;
+import com.fs.erp.dto.df.BspOrderResponse;
+import com.fs.erp.service.IErpOrderService;
 import com.fs.his.domain.*;
+import com.fs.his.dto.ExpressInfoDTO;
 import com.fs.his.dto.ExpressNotifyDTO;
 import com.fs.his.dto.ExpressResultDTO;
 import com.fs.his.dto.StoreOrderExpressExportDTO;
 import com.fs.his.param.*;
 import com.fs.his.vo.*;
-import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 订单Service接口
@@ -151,9 +153,6 @@ public interface IFsStoreOrderService
 
     void addFsFollowByStoreOrder(FsStoreOrder order);
 
-    @Transactional
-    R finishStoreOrder(Long orderId);
-
     List<FsStoreOrderExportVO> selectFsStoreOrderListVOByExport(FsStoreOrderParam param);
 
     List<FsInquiryOrderMsg> selectFsInquiryOrderMsgByStoreOrderId(FsFollowMsgParam fsFollowMsgParam);
@@ -221,4 +220,15 @@ public interface IFsStoreOrderService
     FsStoreOrder getOrderByOrderCodeAndStoreId(String orderCode, Long storeId);
 
     int updateStoreOrderDeliveryInfo(FsStoreOrder order);
+
+    R dfOrderResult(BspOrderResponse param);
+
+    R syncDfExpress(Long id);
+
+    /**
+     * 代服管家同步物流
+     * @param order
+     * @return
+     */
+    ExpressInfoDTO getDfExpressInfoDTO(FsStoreOrder order);
 }

+ 3 - 5
fs-service/src/main/java/com/fs/his/service/IFsUserOperationLogService.java

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.his.domain.FsUserOperationLog;
 import com.fs.his.param.FsUserOperationLogQueryParam;
 import com.fs.his.vo.FsUserOperationLogPageVo;
-import com.fs.his.vo.FsUserOperationLogVo;
+import com.github.pagehelper.PageInfo;
 
 /**
  * 用户操作日志Service接口
@@ -20,7 +20,7 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
      * @param logId 用户操作日志主键
      * @return 用户操作日志
      */
-    FsUserOperationLogVo selectFsUserOperationLogByLogId(Long logId);
+    FsUserOperationLog selectFsUserOperationLogByLogId(Long logId);
 
     /**
      * 查询用户操作日志列表
@@ -28,7 +28,7 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
      * @param fsUserOperationLog 用户操作日志
      * @return 用户操作日志集合
      */
-    List<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
+    PageInfo<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
 
     /**
      * 新增用户操作日志
@@ -61,6 +61,4 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
      * @return 结果
      */
     int deleteFsUserOperationLogByLogId(Long logId);
-
-    List<FsUserOperationLogVo> selectFsUserOperationLogByList(FsUserOperationLog fsUserOperationLog);
 }

+ 91 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderDfServiceImpl.java

@@ -0,0 +1,91 @@
+package com.fs.his.service.impl;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.his.mapper.FsStoreOrderDfMapper;
+import com.fs.his.domain.FsStoreOrderDf;
+import com.fs.his.service.IFsStoreOrderDfService;
+
+/**
+ * 订单代服管家Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-07-08
+ */
+@Service
+public class FsStoreOrderDfServiceImpl extends ServiceImpl<FsStoreOrderDfMapper, FsStoreOrderDf> implements IFsStoreOrderDfService {
+
+    /**
+     * 查询订单代服管家
+     * 
+     * @param orderId 订单代服管家主键
+     * @return 订单代服管家
+     */
+    @Override
+    public FsStoreOrderDf selectFsStoreOrderDfByOrderId(Long orderId)
+    {
+        return baseMapper.selectFsStoreOrderDfByOrderId(orderId);
+    }
+
+    /**
+     * 查询订单代服管家列表
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 订单代服管家
+     */
+    @Override
+    public List<FsStoreOrderDf> selectFsStoreOrderDfList(FsStoreOrderDf fsStoreOrderDf)
+    {
+        return baseMapper.selectFsStoreOrderDfList(fsStoreOrderDf);
+    }
+
+    /**
+     * 新增订单代服管家
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 结果
+     */
+    @Override
+    public int insertFsStoreOrderDf(FsStoreOrderDf fsStoreOrderDf)
+    {
+        return baseMapper.insertFsStoreOrderDf(fsStoreOrderDf);
+    }
+
+    /**
+     * 修改订单代服管家
+     * 
+     * @param fsStoreOrderDf 订单代服管家
+     * @return 结果
+     */
+    @Override
+    public int updateFsStoreOrderDf(FsStoreOrderDf fsStoreOrderDf)
+    {
+        return baseMapper.updateFsStoreOrderDf(fsStoreOrderDf);
+    }
+
+    /**
+     * 批量删除订单代服管家
+     * 
+     * @param orderIds 需要删除的订单代服管家主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderDfByOrderIds(Long[] orderIds)
+    {
+        return baseMapper.deleteFsStoreOrderDfByOrderIds(orderIds);
+    }
+
+    /**
+     * 删除订单代服管家信息
+     * 
+     * @param orderId 订单代服管家主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderDfByOrderId(Long orderId)
+    {
+        return baseMapper.deleteFsStoreOrderDfByOrderId(orderId);
+    }
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 402 - 184
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java


+ 9 - 25
fs-service/src/main/java/com/fs/his/service/impl/FsUserOperationLogServiceImpl.java

@@ -3,18 +3,14 @@ package com.fs.his.service.impl;
 import java.util.ArrayList;
 import java.util.List;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.utils.StringUtils;
-import com.fs.course.domain.FsCourseRedPacketLog;
-import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.vo.FsUserCourseVO;
 import com.fs.his.param.FsUserOperationLogQueryParam;
 import com.fs.his.vo.FsUserOperationLogPageVo;
-import com.fs.his.vo.FsUserOperationLogParamVo;
-import com.fs.his.vo.FsUserOperationLogVo;
+import com.github.pagehelper.PageInfo;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -30,8 +26,7 @@ import com.fs.his.service.IFsUserOperationLogService;
  */
 @Service
 public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLogMapper, FsUserOperationLog> implements IFsUserOperationLogService {
-    @Autowired
-    private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+
     /**
      * 查询用户操作日志
      *
@@ -39,7 +34,7 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
      * @return 用户操作日志
      */
     @Override
-    public FsUserOperationLogVo selectFsUserOperationLogByLogId(Long logId)
+    public FsUserOperationLog selectFsUserOperationLogByLogId(Long logId)
     {
         return baseMapper.selectFsUserOperationLogByLogId(logId);
     }
@@ -51,7 +46,7 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
      * @return 用户操作日志
      */
     @Override
-    public List<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog)
+    public PageInfo<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog)
     {
         List<FsUserOperationLog> logs = baseMapper.selectFsUserOperationLogList(fsUserOperationLog);
         ArrayList<FsUserOperationLogPageVo> vos = new ArrayList<>();
@@ -87,7 +82,11 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
                 vos.add(vo);
             }
         }
-        return vos;
+        PageInfo<FsUserOperationLogPageVo> pageInfo = new PageInfo<>();
+        PageInfo<FsUserOperationLog> logPageInfo = new PageInfo<>(logs);
+        BeanUtils.copyProperties(logPageInfo, pageInfo);
+        pageInfo.setList(vos);
+        return pageInfo;
     }
 
     /**
@@ -138,19 +137,4 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
     {
         return baseMapper.deleteFsUserOperationLogByLogId(logId);
     }
-
-    @Override
-    public List<FsUserOperationLogVo> selectFsUserOperationLogByList(FsUserOperationLog fsUserOperationLog) {
-        List<FsUserOperationLogVo> list = baseMapper.selectFsUserOperationLogByList(fsUserOperationLog);
-        list.forEach(e->{
-            FsUserOperationLogParamVo fsUserOperationLogParamVo = JSON.parseObject(e.getParam(), FsUserOperationLogParamVo.class);
-            e.setParamVo(fsUserOperationLogParamVo);
-            if (ObjectUtil.isEmpty(fsUserOperationLogParamVo)){
-                return;
-            }
-            FsCourseRedPacketLog fsCourseRedPacketLog = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogByTemporary(fsUserOperationLogParamVo.getVideoId(),e.getUserId());
-            e.setFsCourseRedPacketLog(fsCourseRedPacketLog);
-        });
-        return list;
-    }
 }

+ 2 - 1
fs-service/src/main/java/com/fs/hisapi/config/HisApiConfig.java

@@ -6,7 +6,8 @@ import org.springframework.stereotype.Component;
 @Component
 public interface HisApiConfig {
      String hospital_code="40032215";
-     String token="A7AA011E6EC0690E5B621FD07D9F6653";
+//     String token="A7AA011E6EC0690E5B621FD07D9F6653";
+     String token="123";
 //     String hospital_code="40032216";
 //     String token="F068A5C0DF8B0C789796BB9CC694EFBF";
      String url="https://zhyf.jingpai.com/";

+ 22 - 21
fs-service/src/main/java/com/fs/tzBankPay/doman/PayType.java

@@ -1,27 +1,27 @@
 package com.fs.tzBankPay.doman;
 
 public enum PayType {
-    ACCOUNT_PAYMENT("01"),
-    B2C_GATEWAY("02"),
-    B2B_GATEWAY("03"),
-    QUICK_PAYMENT("04"),
-    ENTERPRISE_CREDIT_PAYMENT("06"),
-    E_PURCHASE_LOAN_PAYMENT("08"),
-    DIGITAL_RMB_PAYMENT("09"),
-    WECHAT_MINI_PROGRAM_PAYMENT("14"),
-    WECHAT_PUBLIC_ACCOUNT("15"),
-    WECHAT_QR_CODE_PAYMENT("16"),
-    ALIPAY_BARCODE_PAYMENT("27"),
-    CLOUD_QUICK_PASS("44"),
-    TAIWAN_AND_VILLAGE_BANK_CARD_PAYMENT("45"),
-    B2B_ONLINE_BANKING("46"),
-    B2C_ONLINE_BANKING("47"),
-    WALLET_PAYMENT("48"),
-    TAIWAN_AND_VILLAGE_ENTERPRISE_ACCOUNT_PAYMENT("49"),
-    SUPPLY_CHAIN_CREDIT_PAYMENT("51"),
-    UNIONPAY_PAYMENT("53"),
-    UNIONPAY_CONTRACT_PAYMENT("55"),
-    PAYMENT_ON_BEHALF("99");
+    账户支付("01"),
+    B2C网关("02"),
+    B2B网关("03"),
+    快捷支付("04"),
+    企业白条支付("06"),
+    e购贷支付("08"),
+    数字人民币支付("09"),
+    微信小程序支付("14"),
+    微信公众号("15"),
+    微信二维码支付("16"),
+    支付宝条码支付("27"),
+    云闪付("44"),
+    台行及村镇卡支付("45"),
+    B2B网银("46"),
+    B2C网银("47"),
+    钱包支付("48"),
+    台行及村镇企业账户支付("49"),
+    供应链白条支付("51"),
+    银联支付("53"),
+    银联签约支付("55"),
+    代付("99");
 
     private final String code;
 
@@ -33,3 +33,4 @@ public enum PayType {
         return code;
     }
 }
+

+ 101 - 0
fs-service/src/main/resources/mapper/his/FsStoreOrderDfMapper.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.his.mapper.FsStoreOrderDfMapper">
+
+    <resultMap type="FsStoreOrderDf" id="FsStoreOrderDfResult">
+        <result property="orderId"    column="order_id"    />
+        <result property="orderCode"    column="order_code"    />
+        <result property="appKey"    column="app_key"    />
+        <result property="appSecret"    column="app_secret"    />
+        <result property="loginAccount"    column="login_account"    />
+        <result property="monthlyCard"    column="monthly_card"    />
+        <result property="totalPrice"    column="total_price"    />
+        <result property="platformPrice"    column="platform_price"    />
+        <result property="status"    column="status"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectFsStoreOrderDfVo">
+        select order_id, order_code, app_key, app_secret, login_account, monthly_card, total_price, platform_price, status, create_time, update_time from fs_store_order_df
+    </sql>
+
+    <select id="selectFsStoreOrderDfList" parameterType="FsStoreOrderDf" resultMap="FsStoreOrderDfResult">
+        <include refid="selectFsStoreOrderDfVo"/>
+        <where>
+            <if test="orderCode != null  and orderCode != ''"> and order_code = #{orderCode}</if>
+            <if test="appKey != null  and appKey != ''"> and app_key = #{appKey}</if>
+            <if test="appSecret != null  and appSecret != ''"> and app_secret = #{appSecret}</if>
+            <if test="loginAccount != null  and loginAccount != ''"> and login_account = #{loginAccount}</if>
+            <if test="monthlyCard != null  and monthlyCard != ''"> and monthly_card = #{monthlyCard}</if>
+            <if test="totalPrice != null "> and total_price = #{totalPrice}</if>
+            <if test="platformPrice != null "> and platform_price = #{platformPrice}</if>
+            <if test="status != null "> and status = #{status}</if>
+        </where>
+    </select>
+
+    <select id="selectFsStoreOrderDfByOrderId" parameterType="Long" resultMap="FsStoreOrderDfResult">
+        <include refid="selectFsStoreOrderDfVo"/>
+        where order_id = #{orderId}
+    </select>
+
+    <insert id="insertFsStoreOrderDf" parameterType="FsStoreOrderDf">
+        insert into fs_store_order_df
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="orderCode != null and orderCode != ''">order_code,</if>
+            <if test="appKey != null and appKey != ''">app_key,</if>
+            <if test="appSecret != null and appSecret != ''">app_secret,</if>
+            <if test="loginAccount != null and loginAccount != ''">login_account,</if>
+            <if test="monthlyCard != null and monthlyCard != ''">monthly_card,</if>
+            <if test="totalPrice != null">total_price,</if>
+            <if test="platformPrice != null">platform_price,</if>
+            <if test="status != null">status,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="orderCode != null and orderCode != ''">#{orderCode},</if>
+            <if test="appKey != null and appKey != ''">#{appKey},</if>
+            <if test="appSecret != null and appSecret != ''">#{appSecret},</if>
+            <if test="loginAccount != null and loginAccount != ''">#{loginAccount},</if>
+            <if test="monthlyCard != null and monthlyCard != ''">#{monthlyCard},</if>
+            <if test="totalPrice != null">#{totalPrice},</if>
+            <if test="platformPrice != null">#{platformPrice},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsStoreOrderDf" parameterType="FsStoreOrderDf">
+        update fs_store_order_df
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderCode != null and orderCode != ''">order_code = #{orderCode},</if>
+            <if test="appKey != null and appKey != ''">app_key = #{appKey},</if>
+            <if test="appSecret != null and appSecret != ''">app_secret = #{appSecret},</if>
+            <if test="loginAccount != null and loginAccount != ''">login_account = #{loginAccount},</if>
+            <if test="monthlyCard != null and monthlyCard != ''">monthly_card = #{monthlyCard},</if>
+            <if test="totalPrice != null">total_price = #{totalPrice},</if>
+            <if test="platformPrice != null">platform_price = #{platformPrice},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where order_id = #{orderId}
+    </update>
+
+    <delete id="deleteFsStoreOrderDfByOrderId" parameterType="Long">
+        delete from fs_store_order_df where order_id = #{orderId}
+    </delete>
+
+    <delete id="deleteFsStoreOrderDfByOrderIds" parameterType="String">
+        delete from fs_store_order_df where order_id in
+        <foreach item="orderId" collection="array" open="(" separator="," close=")">
+            #{orderId}
+        </foreach>
+    </delete>
+</mapper>

+ 16 - 5
fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml

@@ -410,11 +410,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </trim>
         where order_id = #{orderId}
     </update>
-    <update id="batchUpdateErpByOrderIds">
-        update fs_store_order set erp_phone = #{maps.erpPhone} where
-        order_id in
-        <foreach collection="maps.orderIds" separator="," open="(" close=")" index="index" item="item">
-            #{item}
+    <update id="batchUpdateErpByOrderIds" parameterType="list">
+<!--        update fs_store_order set erp_phone = #{maps.erpPhone} where-->
+<!--        order_id in-->
+<!--        <foreach collection="maps.orderIds" separator="," open="(" close=")" index="index" item="item">-->
+<!--            #{item}-->
+<!--        </foreach>-->
+        UPDATE fs_store_order
+        SET erp_phone =
+        <trim prefix="CASE order_id" suffix="END">
+            <foreach collection="maps" item="map">
+                WHEN #{map.orderId} THEN #{map.erpPhone}
+            </foreach>
+        </trim>
+        WHERE order_id IN
+        <foreach collection="maps" item="map" open="(" separator="," close=")">
+            #{map.orderId}
         </foreach>
     </update>
 

+ 0 - 11
fs-service/src/main/resources/mapper/his/FsUserOperationLogMapper.xml

@@ -27,17 +27,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by create_time desc
     </select>
 
-    <select id="selectFsUserOperationLogByList" parameterType="FsUserOperationLog" resultType="com.fs.his.vo.FsUserOperationLogVo">
-        <include refid="selectFsUserOperationLogVo"/>
-        <where>
-            <if test="userId != null "> and user_id = #{userId}</if>
-            <if test="operationType != null  and operationType != ''"> and operation_type = #{operationType}</if>
-            <if test="details != null  and details != ''"> and details = #{details}</if>
-        </where>
-        order by create_time desc
-    </select>
-
-
     <select id="selectFsUserOperationLogByLogId" parameterType="Long" resultMap="FsUserOperationLogResult">
         <include refid="selectFsUserOperationLogVo"/>
         where log_id = #{logId}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.