浏览代码

Merge remote-tracking branch 'origin/master'

zx 1 天之前
父节点
当前提交
5c708ababd
共有 53 个文件被更改,包括 2769 次插入266 次删除
  1. 112 39
      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. 127 18
      fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsInfoController.java
  6. 6 13
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  7. 2 0
      fs-service/src/main/java/com/fs/course/param/FsCourseSendRewardUParam.java
  8. 1 1
      fs-service/src/main/java/com/fs/course/param/newfs/FsUserCourseAddCompanyUserParam.java
  9. 1 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  10. 2 1
      fs-service/src/main/java/com/fs/erp/domain/ErpDeliverys.java
  11. 16 0
      fs-service/src/main/java/com/fs/erp/dto/df/BspOrderResponse.java
  12. 30 0
      fs-service/src/main/java/com/fs/erp/dto/df/BspOrderResponseWrapper.java
  13. 10 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFApiResponse.java
  14. 11 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFCancelOrderResultResponse.java
  15. 18 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFConfigVo.java
  16. 27 0
      fs-service/src/main/java/com/fs/erp/dto/df/DFDeliveryResponse.java
  17. 71 0
      fs-service/src/main/java/com/fs/erp/dto/df/ExteriorOrderSkuVo.java
  18. 268 0
      fs-service/src/main/java/com/fs/erp/dto/df/ExternalOrderRequestVo.java
  19. 51 0
      fs-service/src/main/java/com/fs/erp/dto/df/OrderResponse.java
  20. 100 0
      fs-service/src/main/java/com/fs/erp/dto/df/RlsDetail.java
  21. 21 0
      fs-service/src/main/java/com/fs/erp/dto/df/RlsInfo.java
  22. 160 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/DfClient.java
  23. 44 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/enums/ExpressProductCodeEnum.java
  24. 40 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/enums/RequestUrlEnum.java
  25. 129 0
      fs-service/src/main/java/com/fs/erp/dto/sdk/df/utils/StringUtils.java
  26. 565 0
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  27. 18 8
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  28. 7 0
      fs-service/src/main/java/com/fs/his/config/FsSysConfig.java
  29. 54 0
      fs-service/src/main/java/com/fs/his/domain/FsStoreOrderDf.java
  30. 1 0
      fs-service/src/main/java/com/fs/his/domain/FsUserOperationLog.java
  31. 61 0
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderDfMapper.java
  32. 4 2
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  33. 3 8
      fs-service/src/main/java/com/fs/his/mapper/FsUserOperationLogMapper.java
  34. 3 2
      fs-service/src/main/java/com/fs/his/param/FsStoreOrderSetErpPhoneParam.java
  35. 61 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderDfService.java
  36. 17 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java
  37. 6 4
      fs-service/src/main/java/com/fs/his/service/IFsUserOperationLogService.java
  38. 19 1
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java
  39. 93 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderDfServiceImpl.java
  40. 345 104
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  41. 9 3
      fs-service/src/main/java/com/fs/his/service/impl/FsUserOperationLogServiceImpl.java
  42. 2 1
      fs-service/src/main/java/com/fs/hisapi/config/HisApiConfig.java
  43. 3 0
      fs-service/src/main/java/com/fs/qw/domain/QwGroupChatUser.java
  44. 2 0
      fs-service/src/main/java/com/fs/qw/param/QwExternalContactVOTime.java
  45. 16 9
      fs-service/src/main/java/com/fs/qw/param/SopExternalContactInfo.java
  46. 16 0
      fs-service/src/main/java/com/fs/sop/domain/SopUserLogsInfo.java
  47. 6 6
      fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  48. 10 15
      fs-service/src/main/resources/application-config-druid-jnmy.yml
  49. 101 0
      fs-service/src/main/resources/mapper/his/FsStoreOrderDfMapper.xml
  50. 16 5
      fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml
  51. 3 0
      fs-service/src/main/resources/mapper/sop/SopUserLogsInfoMapper.xml
  52. 16 0
      fs-user-course/src/main/java/com/fs/course/controller/UserController.java
  53. 7 4
      fs-user-course/src/main/java/com/fs/course/controller/WxCompanyUserController.java

+ 112 - 39
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -19,22 +19,25 @@ 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.dto.df.DFConfigVo;
 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;
 import com.fs.his.param.FsStoreOrderSalesParam;
 import com.fs.his.param.FsStoreOrderSetErpPhoneParam;
-import com.fs.his.service.IFsExportTaskService;
-import com.fs.his.service.IFsExpressService;
-import com.fs.his.service.IFsStoreService;
+import com.fs.his.service.*;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.*;
 import com.fs.system.domain.SysConfig;
@@ -49,7 +52,6 @@ import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.enums.BusinessType;
-import com.fs.his.service.IFsStoreOrderService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
 import org.springframework.web.multipart.MultipartFile;
@@ -90,8 +92,19 @@ 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;
+
+    @Autowired
+    private IFsStoreOrderDfService fsStoreOrderDfService;
     /**
      * 查询订单列表
      */
@@ -369,6 +382,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,22 +502,58 @@ 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);
-                }
-
-            });
+        String loginAccount = param.getLoginAccount();
+        if (StringUtils.isBlank(loginAccount)){
+            return R.error("未选择推送erp账户");
+        }
+        FsStoreOrderDf df = getDFInfo(loginAccount);
+        if (df.getLoginAccount() == null){
+            return R.error("未查询到所选erp账户");
+        }
+        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 {
+                df.setOrderId(orderId);
+                fsStoreOrderDfService.insertFsStoreOrderDf(df);
+                fsStoreOrderService.createOmsOrder(orderId);
+            } catch (ParseException e) {
+                throw new RuntimeException(e);
+            }
 
+        });
         return R.ok();
     }
 
+    private FsStoreOrderDf getDFInfo(String loginAccount) {
+        //查询订单账户 判断是否存在该订单账户
+        List<DFConfigVo> erpAccounts = fsStoreOrderService.getErpAccount();
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        for (DFConfigVo erpAccount : erpAccounts) {
+            if (loginAccount.equals(erpAccount.getLoginAccount())){
+                //添加df记录
+                df.setAppKey(erpAccount.getDfAppKey());
+                df.setAppSecret(erpAccount.getDfAppsecret());
+                df.setLoginAccount(loginAccount);
+                df.setMonthlyCard(erpAccount.getMonthlyCard());
+                df.setStatus(0);
+                break;
+            }
+        }
+        return df;
+    }
+
     @Log(title = "冻结/解冻", businessType = BusinessType.UPDATE)
     @PreAuthorize("@ss.hasPermi('his:storeOrder:editTuiMoney')")
     @GetMapping(value = "/editTuiMoney/{id}")
@@ -535,7 +590,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 +616,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 +713,21 @@ 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));
     }
 
+    /**
+     * 获取erp账户
+     */
+    @GetMapping("/getErpAccount")
+    public R getErpAccount()
+    {
+        List<DFConfigVo> erpAccounts = fsStoreOrderService.getErpAccount();
+        List<String> list = erpAccounts.stream().map(DFConfigVo::getLoginAccount).collect(Collectors.toList());
+        return R.ok().put("data", list);
+    }
 }

+ 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));
     }
 
 

+ 127 - 18
fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsInfoController.java

@@ -33,6 +33,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -87,7 +89,7 @@ public class SopUserLogsInfoController extends BaseController
                 Map<Long, SopExternalContactInfo> externalContactInfoMap = qwExternalContactVOTimes.stream()
                         .collect(Collectors.toMap(
                                 QwExternalContactVOTime::getId,
-                                item -> new SopExternalContactInfo(item.getCreateTime(), item.getTagIds(), item.getRemark())
+                                item -> new SopExternalContactInfo(item.getCreateTime(), item.getTagIds(), item.getRemark(),item.getLevel())
                         ));
                 List<String> tagIds = qwExternalContactVOTimes.stream().map(QwExternalContactVOTime::getTagIds).filter(StringUtils::isNotEmpty).flatMap(e -> JSON.parseArray(e, String.class).stream()).collect(Collectors.toList());
                 if(!tagIds.isEmpty()){
@@ -103,10 +105,12 @@ public class SopUserLogsInfoController extends BaseController
                 list.forEach(item -> {
                     SopExternalContactInfo info = externalContactInfoMap.getOrDefault(
                             item.getExternalId(),
-                            new SopExternalContactInfo("无进线时间", "无标签", "无备注"));
+                            new SopExternalContactInfo("无进线时间", "无标签", "无备注",0));
                     item.setInComTime(info.getCreateTime());
                     item.setTagIds(info.getTagIds());
                     item.setRemark(info.getRemark());
+                    item.setLevel(info.getLevel());
+
                 });
             }
 
@@ -136,9 +140,35 @@ public class SopUserLogsInfoController extends BaseController
                     isRemarkEmpty ||
                             item.getRemark().contains(sopUserLogsInfo.getRemark());
 
-            if (sopUserLogsInfo.getTagIds() != null || !isRemarkEmpty) {
+
+            boolean isLevelEmpty = sopUserLogsInfo.getLevel() == null;
+            Predicate<SopUserLogsInfo> levelFilter = item ->
+                    isLevelEmpty ||
+                            (item.getLevel() != null && Objects.equals(item.getLevel(), sopUserLogsInfo.getLevel()) );
+
+
+            Predicate<SopUserLogsInfo> timeFilter = item -> {
+                if (StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getEntryTime())) {
+                    return true;
+                }
+                try {
+                    LocalDate entryDate = LocalDate.parse(
+                            sopUserLogsInfo.getEntryTime(),
+                            DateTimeFormatter.ofPattern("yyyy-MM-dd")
+                    );
+                    LocalDate createDate = LocalDate.parse(
+                            item.getInComTime().substring(0, 10),
+                            DateTimeFormatter.ofPattern("yyyy-MM-dd")
+                    );
+                    return entryDate.equals(createDate);
+                } catch (Exception e) {
+                    return false;
+                }
+            };
+
+            if (sopUserLogsInfo.getTagIds() != null || !isRemarkEmpty || !StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getEntryTime()) ||!isLevelEmpty) {
                 list = list.stream()
-                        .filter(tagFilter.and(remarkFilter))
+                        .filter(tagFilter.and(remarkFilter).and(timeFilter).and(levelFilter))
                         .collect(Collectors.toList());
             }
 
@@ -150,9 +180,15 @@ public class SopUserLogsInfoController extends BaseController
                     param.setTagIds(tagIds);
                     item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
                 }
+
+                // 处理 level
+                item.setLevelName(getLevel(item.getLevel()));
             });
+
             return getDataTable(list);
-        } else {
+        }
+        else {
+
             List<QwGroupChatUser> list = qwGroupChatUserService.selectByChatId(sopUserLogsInfo);
 
 
@@ -171,15 +207,14 @@ public class SopUserLogsInfoController extends BaseController
                 Map<String, SopExternalContactInfo> externalContactInfoMap = qwExternalContactVOTimes.stream()
                         .collect(Collectors.toMap(
                                 QwExternalContactVOTime::getExternalUserId,
-                                item -> new SopExternalContactInfo(item.getCreateTime(), item.getTagIdsName(), item.getTagIds(), item.getRemark())
+                                item -> new SopExternalContactInfo(item.getCreateTime(), item.getTagIds(), item.getRemark(),item.getLevel())
                         ));
 
                 // 遍历 list,赋值 inComTime 和 tagIds
                 list.forEach(item -> {
-                    SopExternalContactInfo info = externalContactInfoMap.getOrDefault(item.getUserId(), new SopExternalContactInfo("无进线时间", "无标签", "无备注"));
+                    SopExternalContactInfo info = externalContactInfoMap.getOrDefault(item.getUserId(), new SopExternalContactInfo("无进线时间", "无标签", "无备注",0));
                     item.setInComTime(info.getCreateTime());
                     item.setTagIds(info.getTagIds());
-                    item.setTagNames(info.getTagNames());
                     item.setRemark(info.getRemark());
                 });
 
@@ -194,21 +229,95 @@ public class SopUserLogsInfoController extends BaseController
                         )
                         .collect(Collectors.toList());
             }
+
+            // 处理标签名称
+            list.parallelStream().forEach(item -> {
+                if (item.getTagIds() != null && !item.getTagIds().equals("[]") && !item.getTagIds().equals("无标签")) {
+                    List<String> tagIds = GSON.fromJson(item.getTagIds(), new TypeToken<List<String>>() {}.getType());
+                    QwTagSearchParam param = new QwTagSearchParam();
+                    param.setTagIds(tagIds);
+                    item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
+                }
+            });
             return getDataTable(list);
+//            List<QwGroupChatUser> list = qwGroupChatUserService.selectByChatId(sopUserLogsInfo);
+//
+//
+//            if (!list.isEmpty()) {
+//
+//                List<String> externalIdList = list.stream()
+//                        .map(QwGroupChatUser::getUserId) // 提取 externalId
+//                        .filter(StringUtils::isNotEmpty) // 过滤掉 null 值,防止 NullPointerException
+//                        .distinct()
+//                        .collect(Collectors.toList()); // 收集到 List
+//
+//                List<QwExternalContactVOTime> qwExternalContactVOTimes = iQwExternalContactService.selectQwExternalContactListVOByUserIds(externalIdList);
+//
+//
+//                // 先将 qwExternalContactVOTimes 转换为 Map,key 为 id,value 为 ExternalContactInfo(包含 createTime 和 tagIds)
+//                Map<String, SopExternalContactInfo> externalContactInfoMap = qwExternalContactVOTimes.stream()
+//                        .collect(Collectors.toMap(
+//                                QwExternalContactVOTime::getExternalUserId,
+//                                item -> new SopExternalContactInfo(item.getCreateTime(), item.getTagIdsName(), item.getTagIds(), item.getRemark())
+//                        ));
+//
+//                // 遍历 list,赋值 inComTime 和 tagIds
+//                list.forEach(item -> {
+//                    SopExternalContactInfo info = externalContactInfoMap.getOrDefault(item.getUserId(), new SopExternalContactInfo("无进线时间", "无标签", "无备注"));
+//                    item.setInComTime(info.getCreateTime());
+//                    item.setTagIds(info.getTagIds());
+//                    item.setTagNames(info.getTagNames());
+//                    item.setRemark(info.getRemark());
+//                });
+//
+//            }
+//
+//            if ((sopUserLogsInfo.getTagIds() != null && !sopUserLogsInfo.getTagIds().isEmpty())
+//                    || !StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getRemark())) {
+//                list = list.stream()
+//                        .filter(item ->
+//                                (sopUserLogsInfo.getTagIds() == null || sopUserLogsInfo.getTagIds().isEmpty() || item.getTagIds().contains(sopUserLogsInfo.getTagIds()))
+//                                        && (StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getRemark()) || item.getRemark().contains(sopUserLogsInfo.getRemark()))
+//                        )
+//                        .collect(Collectors.toList());
+//            }
+//            return getDataTable(list);
         }
 
-//        if (sopUserLogsInfo.getTagIds() != null && !sopUserLogsInfo.getTagIds().isEmpty()) {
-//            list = list.stream()
-//                    .filter(item -> item.getTagIds().contains(sopUserLogsInfo.getTagIds()))
-//                    .collect(Collectors.toList());
-//        }
-//        if (!StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getRemark())) {
-//            list = list.stream()
-//                    .filter(item -> item.getRemark().contains(sopUserLogsInfo.getRemark()))
-//                    .collect(Collectors.toList());
-//        }
     }
 
+
+    private String getLevel(Integer level){
+
+        String levelName = "无";
+
+        if (level != null) {
+
+            switch (level) {
+                case 0:
+                    levelName = "无";
+                    break;
+                case 1:
+                    levelName = "A";
+                    break;
+                case 2:
+                    levelName = "B";
+                    break;
+                case 3:
+                    levelName = "C";
+                    break;
+                case 4:
+                    levelName = "D";
+                    break;
+                case 5:
+                    levelName = "E";
+                    break;
+                default:
+                    levelName = "无";
+            }
+        }
+        return  levelName;
+    }
     private List<String> parseTagIds(String jsonTagIds) {
         if (jsonTagIds == null || jsonTagIds.trim().isEmpty() || jsonTagIds.equals("[]")) {
             return Collections.emptyList();

+ 6 - 13
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -777,14 +777,6 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         sopLogs.setCorpId(logVo.getCorpId());
         sopLogs.setLogType(ruleTimeVO.getType());
         sopLogs.setTakeRecords(0);
-        try {
-            if(StringUtils.isNotEmpty(logVo.getUserId())){
-                String[] split = logVo.getUserId().split("\\|");
-                sopLogs.setQwUserKey(Long.parseLong(split[0]));
-            }
-        }catch (Exception e){
-            log.error("设置qwUserId异常", e);
-        }
 
         if (isOfficial == 1) {
 
@@ -820,6 +812,9 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
 
         String[] userKey = logVo.getUserId().split("\\|");
         sopLogs.setCompanyId(Long.valueOf(userKey[2].trim()));
+        if (StringUtils.isNotEmpty(userKey[0].trim())){
+            sopLogs.setQwUserKey(Long.valueOf(userKey[0].trim()));
+        }
         sopLogs.setSopId(logVo.getSopId());
         sopLogs.setSort(Integer.valueOf(logVo.getStartTime().replaceAll("-","")));
         sopLogs.setExternalUserId(externalContactId);
@@ -1854,11 +1849,9 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         sopLogs.setExternalUserName(externalContact.getName());
         sopLogs.setFsUserId(finishLog.getUserId() != null ? finishLog.getUserId() : null );
         sopLogs.setUserLogsId("-");
-        try {
-            sopLogs.setQwUserKey(finishLog.getQwUserId());
-        }catch (Exception e){
-            log.error("设置qwUserId异常", e);
-        }
+
+        sopLogs.setQwUserKey(finishLog.getQwUserId() != null ? finishLog.getQwUserId() : null);
+
         // 解析模板设置
         List<QwSopCourseFinishTempSetting.Setting> settings = parseSettings(finishTemp.getSetting());
         if (settings == null) {

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseSendRewardUParam.java

@@ -27,4 +27,6 @@ public class FsCourseSendRewardUParam implements Serializable
     private Integer sendType;
     private Long periodId;
 
+    private String appId;
+
 }

+ 1 - 1
fs-service/src/main/java/com/fs/course/param/newfs/FsUserCourseAddCompanyUserParam.java

@@ -33,7 +33,7 @@ public class FsUserCourseAddCompanyUserParam implements Serializable {
     @ApiModelProperty(value = "营期id")
     private Long periodId;
 
-    @NotNull(message = "项目id不能为空")
+//    @NotNull(message = "项目id不能为空")
     @ApiModelProperty(value = "项目ID")
     private Long projectId;
 

+ 1 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1421,7 +1421,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }
 
         // 逻辑调整:如果会员已经绑定了销售,直接提示,不添加重粉数据了-2025年6月16日14点53分
-        if (fsUser.getCompanyUserId() != null && !param.getCompanyUserId().equals(fsUser.getCompanyUserId())){
+        if (!param.getCompanyUserId().equals(fsUser.getCompanyUserId())){
             return ResponseResult.fail(406,"该用户已成为其他销售会员");
         }
 

+ 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; // 路由详情列表
+}

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

@@ -0,0 +1,160 @@
+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.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);
+			}
+		}
+	}
+
+}

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

@@ -0,0 +1,565 @@
+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 = getSFAccountIndex(fsStoreOrder.getOrderId());
+        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 = getSFAccountIndex(order.getOrderId());
+                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;
+    }
+
+
+    /**
+     * 目前仅查询下单用户
+     *
+     * @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 = getSFAccountIndex(order.getOrderId());
+                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) {
+
+        FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(order.getPlatform_code());
+        if (fsStoreOrder == null) {
+            return null;
+        }
+        int sfAccountIndex = getSFAccountIndex(fsStoreOrder.getOrderId());
+        //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());
+//                try {
+//                    getOrderResult(orderResultQueryParam,sfAccountIndex);
+//                } catch (Exception e) {
+//
+//                }
+                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(Long orderId) {
+        if (orderId != null) {
+            //查询是否选择erp账户
+            FsStoreOrderDf temp = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(orderId);
+            if (temp != null) {
+                FsSysConfig sysConfig = configUtil.getSysConfig();
+                String dfConfigVo = sysConfig.getDfAccounts();
+                List<DFConfigVo> dfConfigVos = JSON.parseArray(dfConfigVo, DFConfigVo.class);
+                if (dfConfigVos != null && !dfConfigVos.isEmpty()) {
+                    for (int i = 0; i < dfConfigVos.size(); i++) {
+                        if (temp.getLoginAccount().equals(dfConfigVos.get(i).getLoginAccount())) {
+                            return i;
+                        }
+                    }
+                }
+                return dfConfigVos.indexOf(temp);
+            }
+        }
+        //默认用第一个
+        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 = "key")
+    private String appKey;
+
+    @Excel(name = "secret")
+    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 = "0:默认 1下单 2取消订单")
+    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);
 }

+ 3 - 8
fs-service/src/main/java/com/fs/his/mapper/FsUserOperationLogMapper.java

@@ -4,6 +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.FsUserOperationLogPageVo;
 import com.fs.his.vo.FsUserOperationLogVo;
 
 /**
@@ -29,14 +30,6 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
      */
     List<FsUserOperationLog> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
 
-    /**
-     * 查询用户操作日志列表
-     *
-     * @param fsUserOperationLog 用户操作日志
-     * @return 用户操作日志集合
-     */
-    List<FsUserOperationLogVo> selectFsUserOperationLogByList(FsUserOperationLog fsUserOperationLog);
-
     /**
      * 新增用户操作日志
      *
@@ -68,4 +61,6 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
      * @return 结果
      */
     int deleteFsUserOperationLogByLogIds(Long[] logIds);
+
+    List<FsUserOperationLogVo> selectFsUserOperationLogByList(FsUserOperationLog fsUserOperationLog);
 }

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

@@ -5,7 +5,8 @@ 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;
+    private String loginAccount;
 }

+ 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);
+}

+ 17 - 0
fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java

@@ -10,7 +10,11 @@ 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.dto.df.DFConfigVo;
+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;
@@ -221,4 +225,17 @@ 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);
+
+    List<DFConfigVo> getErpAccount();
 }

+ 6 - 4
fs-service/src/main/java/com/fs/his/service/IFsUserOperationLogService.java

@@ -6,6 +6,7 @@ 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 +21,10 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
      * @param logId 用户操作日志主键
      * @return 用户操作日志
      */
-    FsUserOperationLogVo selectFsUserOperationLogByLogId(Long logId);
+    FsUserOperationLog selectFsUserOperationLogByLogId(Long logId);
+
+
+    List<FsUserOperationLogVo> selectFsUserOperationLogByList(FsUserOperationLog fsUserOperationLog);
 
     /**
      * 查询用户操作日志列表
@@ -28,7 +32,7 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
      * @param fsUserOperationLog 用户操作日志
      * @return 用户操作日志集合
      */
-    List<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
+    PageInfo<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
 
     /**
      * 新增用户操作日志
@@ -61,6 +65,4 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
      * @return 结果
      */
     int deleteFsUserOperationLogByLogId(Long logId);
-
-    List<FsUserOperationLogVo> selectFsUserOperationLogByList(FsUserOperationLog fsUserOperationLog);
 }

+ 19 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -100,6 +100,14 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
     @Qualifier("hzOMSErpOrderServiceImpl")
     private IErpOrderService hzOMSerpOrderService;
 
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtErpOrderService;
+
     @Autowired
     private FsStorePaymentMapper fsStorePaymentMapper;
     @Autowired
@@ -537,9 +545,14 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                     Integer erpType = sysConfig.getErpType();
                     if (erpType == 1) {
                         erpOrderService.refundUpdate(request);
+                    }else if (erpType == 2) {
+                        //旺店通
+                        wdtErpOrderService.refundUpdate(request);
                     } else if (erpType == 3) {
                         //瀚智
                         hzOMSerpOrderService.refundUpdate(request);
+                    }  else if (erpType == 4) {
+                        dfOrderService.refundUpdate(request);
                     }
                 }
             }
@@ -694,9 +707,14 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
             BaseResponse response = null;
             if (erpType == 1) {
                 response =  erpOrderService.refundUpdate(request);
-            } else if (erpType == 3) {
+            }else if (erpType == 2) {
+                //旺店通
+                response = wdtErpOrderService.refundUpdate(request);
+            }  else if (erpType == 3) {
                 //瀚智
                 response =  hzOMSerpOrderService.refundUpdate(request);
+            } else if (erpType == 4) {
+                response =  dfOrderService.refundUpdate(request);
             }
             if (response.getSuccess()) {
                 return R.ok();

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

@@ -0,0 +1,93 @@
+package com.fs.his.service.impl;
+
+import java.util.Date;
+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)
+    {
+        fsStoreOrderDf.setCreateTime(new Date());
+        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);
+    }
+}

+ 345 - 104
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -1,6 +1,5 @@
 package com.fs.his.service.impl;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.net.URLDecoder;
 import cn.hutool.core.util.StrUtil;
@@ -32,10 +31,9 @@ import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.erp.domain.*;
-import com.fs.erp.dto.ErpOrderQueryRequert;
-import com.fs.erp.dto.ErpOrderQueryResponse;
-import com.fs.erp.dto.ErpOrderResponse;
-import com.fs.erp.dto.ErpRefundUpdateRequest;
+import com.fs.erp.dto.*;
+import com.fs.erp.dto.df.*;
+import com.fs.erp.mapper.FsErpFinishPushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.event.*;
 import com.fs.his.config.FsSysConfig;
@@ -63,6 +61,7 @@ import com.fs.im.service.IImService;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.sop.mapper.QwSopLogsMapper;
 import com.fs.qw.service.impl.QwUserServiceImpl;
 import com.fs.system.domain.SysConfig;
 import com.fs.tzBankPay.doman.*;
@@ -104,8 +103,10 @@ import java.sql.Timestamp;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.fs.his.utils.PhoneUtil.decryptPhone;
+import static com.fs.his.utils.PhoneUtil.encryptPhone;
 
 /**
  * 订单Service业务层处理
@@ -196,6 +197,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     @Qualifier("hzOMSErpOrderServiceImpl")
     private IErpOrderService hzOMSOrderService;
 
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
     @Autowired
     private IFsStoreAfterSalesService fsStoreAfterSalesService;
     @Autowired
@@ -1626,6 +1631,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         }  else if (erpType == 3){
             //瀚智OMS
             erpOrderService =  hzOMSOrderService;
+        }  else if (erpType == 4){
+            //代服
+            erpOrderService =  dfOrderService;
         }else {
             return;
         }
@@ -1953,6 +1961,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                 } else if (erpType == 2){
                     //旺店通
                     erpOrderService =  wdtOrderService;
+                } else if (erpType == 3){
+                    erpOrderService =  hzOMSOrderService;
+                } else if (erpType == 4){
+                    erpOrderService = dfOrderService;
                 }
                 ErpOrderQueryResponse response = erpOrderService.getOrder(request);
                 if(response.getOrders()!=null&&response.getOrders().size()>0){
@@ -2854,104 +2866,16 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             payment.setPaytime(new Timestamp(timeLong));
         }
         payments.add(payment);
-        //1.新疆、西藏、内蒙古、海南的订单(代收+非代收)全部发EMS
-        //2.全款订单选择中通,快递ID 452  ZTO 中通商城标快 ZTBK.17782167502
-        //3.新疆  西藏 内蒙古 海南  全款订单走顺丰丰云配  【非全款】的就根据公司配置那来 配的哪个走哪个快递
-        //4.把现在发中通的规则改成发顺丰风云配 SF.0235402855
-        //5.全款支付且应付金额小于等于100元,快递方式默认中通小件455 ZTO 中通小件 ZTPDD
-        if(order.getCompanyId()!=null&& order.getStoreHouseCode()!=null&& order.getStoreHouseCode().equals("WHSP001")){
-            //杭州家有仙妻实业有限公司 全部订单快递方式设置为商城德邦快递
-            FsExpress express=expressService.selectFsExpressByOmsCode("SF-WHC");
-            erpOrder.setExpress_code(express.getOmsCode());
-            order.setDeliveryName(express.getName());
-            order.setDeliverySn(express.getCode());
-            if(order.getPayDelivery().compareTo(new BigDecimal(0))==0){
 
-            }
-            else{
-                //物流代收金额
-                ErpOrderPayment codPayment=new ErpOrderPayment();
-                codPayment.setPay_type_code("cod");
-                codPayment.setPayment(order.getPayDelivery().doubleValue());
-                payments.add(codPayment);
-                erpOrder.setCod(true);
-            }
-        }
-        else if(order.getCompanyId()!=null){
-            Company company = companyService.selectCompanyById(order.getCompanyId());
-            if (order.getPayDelivery().compareTo(new BigDecimal(0)) == 0) {  //没有物流代收(全款订单)
-                FsExpress express = new FsExpress();
-                if(order.getPayPrice().compareTo(new BigDecimal(100))<=0){
-                    express=expressService.selectFsExpressByOmsCode("ZTPDD");
-                }
-                else{
-                    boolean found = containsAddress(order.getUserAddress());
-                    express=expressService.selectFsExpressByOmsCode(expressOmsCode);
-                }
-                erpOrder.setExpress_code(express.getOmsCode());
-                order.setDeliveryName(express.getName());
-                order.setDeliverySn(express.getCode());
-            }
-            else {
-                FsExpress express = new FsExpress();
-                boolean found = containsAddress(order.getUserAddress());
-                if(found){
-                    if(StringUtils.isNotEmpty(company.getOmsCode())){
-                        express = expressService.selectFsExpressByOmsCode(company.getOmsCode());
-                    }else{
-                        express=expressService.selectFsExpressByOmsCode("EMS.1");
-                    }
-                }
-                else{
-                    if(StringUtils.isNotEmpty(company.getOmsCode())){
-                        express = expressService.selectFsExpressByOmsCode(company.getOmsCode());
-                    }else{
-                        express = expressService.selectFsExpressByOmsCode(expressOmsCode);
-                    }
-                }
-                erpOrder.setExpress_code(express.getOmsCode());
-                order.setDeliveryName(express.getName());
-                order.setDeliverySn(express.getCode());
-                //物流代收金额
-                ErpOrderPayment codPayment = new ErpOrderPayment();
-                codPayment.setPay_type_code("cod");
-                codPayment.setPayment(order.getPayDelivery().doubleValue());
-                payments.add(codPayment);
-                erpOrder.setCod(true);
-            }
-        }
-        else{
-            if(order.getPayDelivery().compareTo(new BigDecimal(0))==0){  //没有物流代收(全款订单)
-                FsExpress express=new FsExpress();
-                if(order.getPayPrice().compareTo(new BigDecimal(100))<=0){
-                    express=expressService.selectFsExpressByOmsCode("ZTPDD");
-                }else{
-                    boolean found = containsAddress(order.getUserAddress());
-                    express=expressService.selectFsExpressByOmsCode(expressOmsCode);
-                }
-                erpOrder.setExpress_code(express.getOmsCode());
-                order.setDeliveryName(express.getName());
-                order.setDeliverySn(express.getCode());
-            }
-            else{
-                ErpOrderPayment codPayment=new ErpOrderPayment();
-                codPayment.setPay_type_code("cod");
-                codPayment.setPayment(order.getPayDelivery().doubleValue());
-                payments.add(codPayment);
-                erpOrder.setCod(true);
-                FsExpress express=new FsExpress();
-                boolean found = containsAddress(order.getUserAddress());
-                if(found){
-                    express=expressService.selectFsExpressByOmsCode("EMS.1");
-                }
-                else {
-                    express=expressService.selectFsExpressByOmsCode(expressOmsCode);
-                }
-                erpOrder.setExpress_code(express.getOmsCode());
-                order.setDeliveryName(express.getName());
-                order.setDeliverySn(express.getCode());
-            }
+        if (("金牛明医".equals(cloudHostProper.getCompanyName()))){
+            //金牛
+            setJNDeLiver(order, erpOrder, payments);
+        } else {
+            //物流相关
+            setDeliver(order, erpOrder, payments);
         }
+
+
         erpOrder.setPayments(payments);
         if(order.getCompanyId()!=null){
             Company company=companyService.selectCompanyById(order.getCompanyId());
@@ -2965,9 +2889,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                 CompanyDept dept=companyDeptService.selectCompanyDeptById(companyUser.getDeptId());
                 if(dept!=null){
                     List<String> names=companyDeptService.selectCompanyDeptNamesByIds(dept.getAncestors());
-                    if(CollectionUtil.isNotEmpty(names)){
+                    if(names!=null&&names.size()>0){
                         //写备注
-                        erpOrder.setSeller_memo(erpOrder.getSeller_memo()+"-"+ StringUtils.join(names, ",")+","+dept.getDeptName() );
+                        erpOrder.setSeller_memo(erpOrder.getSeller_memo()+"-"+StringUtils.join(names, ",")+","+dept.getDeptName() );
                     }
                 }
                 erpOrder.setSeller_memo(erpOrder.getSeller_memo()+"-"+companyUser.getNickName());
@@ -3068,14 +2992,183 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         return erpOrder;
     }
 
+    /**
+     *  1.新疆、西藏、内蒙古、海南的订单(代收+非代收)全部发EMS
+     *  2.全款订单选择中通,快递ID 452  ZTO 中通商城标快 ZTBK.17782167502
+     *  3.新疆  西藏 内蒙古 海南  全款订单走顺丰丰云配  【非全款】的就根据公司配置那来 配的哪个走哪个快递
+     *  4.把现在发中通的规则改成发顺丰风云配 SF.0235402855
+     *  5.全款支付且应付金额小于等于100元,快递方式默认中通小件455 ZTO 中通小件 ZTPDD
+     * @param order
+     * @param erpOrder
+     * @param payments
+     */
+    private void setDeliver(FsStoreOrder order, ErpOrder erpOrder, List<ErpOrderPayment> payments) {
+        if(order.getCompanyId()!=null&& order.getStoreHouseCode()!=null&& order.getStoreHouseCode().equals("WHSP001")){
+            //杭州家有仙妻实业有限公司 全部订单快递方式设置为商城德邦快递
+            FsExpress express=expressService.selectFsExpressByOmsCode("SF-WHC");
+            erpOrder.setExpress_code(express.getOmsCode());
+            order.setDeliveryName(express.getName());
+            order.setDeliverySn(express.getCode());
+            if(order.getPayDelivery().compareTo(new BigDecimal(0))==0){
+
+            }
+            else{
+                //物流代收金额
+                ErpOrderPayment codPayment=new ErpOrderPayment();
+                codPayment.setPay_type_code("cod");
+                codPayment.setPayment(order.getPayDelivery().doubleValue());
+                payments.add(codPayment);
+                erpOrder.setCod(true);
+            }
+        } else if(order.getCompanyId()!=null){
+            Company company = companyService.selectCompanyById(order.getCompanyId());
+            if (order.getPayDelivery().compareTo(new BigDecimal(0)) == 0) {  //没有物流代收(全款订单)
+                FsExpress express = new FsExpress();
+                //express=expressService.selectFsExpressByOmsCode("SF.0235402855");
+                if(order.getPayPrice().compareTo(new BigDecimal(100))<=0){
+                    express=expressService.selectFsExpressByOmsCode("ZTPDD");
+                }
+                else{
+                    boolean found = containsAddress(order.getUserAddress());
+                    if(found){
+                        express=expressService.selectFsExpressByOmsCode("SF.0235402855");
+                    }
+                    else{
+                        express=expressService.selectFsExpressByOmsCode("SF.0235402855");
+                    }
+                }
+                erpOrder.setExpress_code(express.getOmsCode());
+                order.setDeliveryName(express.getName());
+                order.setDeliverySn(express.getCode());
+            } else {
+                FsExpress express = new FsExpress();
+                boolean found = containsAddress(order.getUserAddress());
+                if(found){
+                    if(StringUtils.isNotEmpty(company.getOmsCode())){
+                        express = expressService.selectFsExpressByOmsCode(company.getOmsCode());
+                    }else{
+                        express=expressService.selectFsExpressByOmsCode("EMS.1");
+                    }
+                } else{
+                    if(StringUtils.isNotEmpty(company.getOmsCode())){
+                        express = expressService.selectFsExpressByOmsCode(company.getOmsCode());
+                    }else{
+                        express = expressService.selectFsExpressByOmsCode("SF.0235402855");
+                    }
+                }
+                erpOrder.setExpress_code(express.getOmsCode());
+                order.setDeliveryName(express.getName());
+                order.setDeliverySn(express.getCode());
+                //物流代收金额
+                ErpOrderPayment codPayment = new ErpOrderPayment();
+                codPayment.setPay_type_code("cod");
+                codPayment.setPayment(order.getPayDelivery().doubleValue());
+                payments.add(codPayment);
+                erpOrder.setCod(true);
+            }
+        } else{
+            if(order.getPayDelivery().compareTo(new BigDecimal(0))==0){  //没有物流代收(全款订单)
+                FsExpress express=new FsExpress();
+                if(order.getPayPrice().compareTo(new BigDecimal(100))<=0){
+                    express=expressService.selectFsExpressByOmsCode("ZTPDD");
+                }else{
+                    boolean found = containsAddress(order.getUserAddress());
+                    if(found){
+                        express=expressService.selectFsExpressByOmsCode("SF.0235402855");
+                    }
+                    else{
+                        express=expressService.selectFsExpressByOmsCode("SF.0235402855");
+                    }
+                }
+                erpOrder.setExpress_code(express.getOmsCode());
+                order.setDeliveryName(express.getName());
+                order.setDeliverySn(express.getCode());
+            } else{
+                ErpOrderPayment codPayment=new ErpOrderPayment();
+                codPayment.setPay_type_code("cod");
+                codPayment.setPayment(order.getPayDelivery().doubleValue());
+                payments.add(codPayment);
+                erpOrder.setCod(true);
+                FsExpress express=new FsExpress();
+                boolean found = containsAddress(order.getUserAddress());
+                if(found){
+                    express=expressService.selectFsExpressByOmsCode("EMS.1");
+                }  else {
+                    express=expressService.selectFsExpressByOmsCode("SF.0235402855");
+                }
+                erpOrder.setExpress_code(express.getOmsCode());
+                order.setDeliveryName(express.getName());
+                order.setDeliverySn(express.getCode());
+            }
+        }
+    }
+
+    private void setJNDeLiver(FsStoreOrder order, ErpOrder erpOrder, List<ErpOrderPayment> payments) {
+            if(order.getPayDelivery().compareTo(new BigDecimal(0))!=0){  //物流代收金额
+                ErpOrderPayment codPayment=new ErpOrderPayment();
+                codPayment.setPay_type_code("cod");
+                codPayment.setPayment(order.getPayDelivery().doubleValue());
+                payments.add(codPayment);
+                erpOrder.setCod(true);
+            }
+    }
+
     @Override
     public Integer selectFsStoreOrderCountByType(Long companyId, long userId, int type) {
         return fsStoreOrderMapper.selectFsStoreOrderCountByType(companyId,userId,type);
     }
 
     @Override
+    @Transactional
     public int batchUpdateErpByOrderIds(FsStoreOrderSetErpPhoneParam param) {
-        return fsStoreOrderMapper.batchUpdateErpByOrderIds(param);
+        //判断是根据orderId还是查询设置
+        List<Long> orderIds = param.getOrderIds();
+        if (orderIds  == null || orderIds.isEmpty()) {
+            if (param.getUserPhoneMk() != null && param.getUserPhoneMk() != "") {
+                param.setUserPhone(encryptPhone(param.getUserPhoneMk()));
+            }
+            List<FsStoreOrderListVO> list = fsStoreOrderService.selectFsStoreOrderListVO(param);
+            orderIds = list.stream().map(FsStoreOrderListVO::getOrderId).collect(Collectors.toList());
+            param.setOrderIds(orderIds);
+        }
+        if (orderIds.isEmpty()){
+            return 0;
+        }
+        //分配手机号
+        //1.手机号大于/等于orderIds长度
+        List<String> erpPhones = param.getErpPhone();
+        int phoneSize = erpPhones.size();
+        int orderSize = orderIds.size();
+        ArrayList<Map<String,String>> maps = new ArrayList<>();
+        if (phoneSize >= orderSize){
+            for (int i = 0; i < orderSize; i++) {
+                HashMap<String, String> map = new HashMap<>();
+                map.put("orderId",orderIds.get(i).toString());
+                map.put("erpPhone",erpPhones.get(i));
+                maps.add(map);
+            }
+        } else {
+            //2.手机号小于orderIds长度
+            int size = orderSize / phoneSize;
+            int num = orderSize % phoneSize;
+            if (num > 0){
+                size = size + 1;
+            }
+            int orderIndex = 0;
+            for (String erpPhone : erpPhones) {
+                for (int i = 0; i < size; i++) {
+                    if (orderIndex > (orderSize-1)){
+                        break;
+                    }
+                    HashMap<String, String> map = new HashMap<>();
+                    map.put("orderId",orderIds.get(orderIndex).toString());
+                    map.put("erpPhone",erpPhone);
+                    maps.add(map);
+                    orderIndex++;
+                }
+            }
+        }
+        return fsStoreOrderMapper.batchUpdateErpByOrderIds(maps);
     }
 
     public  boolean containsAddress(String companyName) {
@@ -3100,4 +3193,152 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         return fsStoreOrderMapper.updateStoreOrderDeliveryInfo(order);
     }
 
+    @Override
+    public R dfOrderResult(BspOrderResponse param) {
+        if (param != null){
+            log.info("代服管家订单回调,{}", JSON.toJSONString(param));
+            List<OrderResponse> list = param.getBody();
+            if (list != null && !list.isEmpty()) {
+//                for (OrderResponse orderResponse : list) {
+//                    RlsInfo rlsInfo = orderResponse.getRlsInfo();
+//                    String orderNumber = orderResponse.getOrderNumber();
+//                    String mailNumber = orderResponse.getMailNumber();
+//                    if (rlsInfo != null) {
+//                        List<RlsDetail> rlsDetails = rlsInfo.getRlsDetail();
+//                        if (rlsDetails != null && !rlsDetails.isEmpty()) {
+//                            for (RlsDetail rlsDetail : rlsDetails) {
+//                               String proName = rlsDetail.getProName();
+//                                if (com.hc.openapi.tool.util.StringUtils.isNotBlank(proName)) {
+//                                    FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+//                                    if(order!=null&&order.getStatus()==2){
+//                                        order.setDeliverySn(mailNumber);
+//                                        order.setDeliveryName(proName);
+//                                        order.setDeliveryCode("SF");
+////                                                    FsExpress express=fsExpressMapper.selectFsExpressByOmsCode("SF.0"); //默认
+////                                                    if(express!=null){
+////                                                        order.setDeliveryName(deliverName);
+////                                                        order.setDeliveryCode(express.getCode());
+////                                                    }
+//                                        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);
+//                                    }
+//                                    break;
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+
+            }
+        }
+        return R.ok("接收成功").put("code","ok");
+    }
+
+    @Override
+    @Transactional
+    public R syncDfExpress(Long id) {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderId(id);
+        ExpressInfoDTO dto = getDfExpressInfoDTO(order);
+        log.info("快递鸟查询dto:{}", JSONUtil.toJsonStr(dto));
+        if (!dto.isSuccess()){
+            return R.error(dto.getReason());
+        }
+        FsStoreOrder map=new FsStoreOrder();
+        map.setDeliveryStatus(Integer.parseInt(dto.getState()));
+        map.setOrderId(order.getOrderId());
+        map.setDeliveryType(dto.getStateEx());
+        fsStoreOrderMapper.updateFsStoreOrder(map);
+        //如果是正常签收,更新订单状态
+        if(dto.getState().equals("3")&&(dto.getStateEx().equals("301")||dto.getStateEx().equals("302")||dto.getStateEx().equals("304")||dto.getStateEx().equals("311"))){
+            this.getGoods(order.getOrderId());
+        }
+        return R.ok();
+    }
+
+    @Override
+    public ExpressInfoDTO getDfExpressInfoDTO(FsStoreOrder order) {
+        ExpressInfoDTO expressInfoDTO = new ExpressInfoDTO();
+        ErpDeliverysRequest erpDeliverysRequest = new ErpDeliverysRequest();
+        erpDeliverysRequest.setCode(order.getOrderCode());
+        ErpDeliverysResponse deliver = null;
+        deliver = dfOrderService.getDeliver(erpDeliverysRequest);
+        if (deliver != null) {
+            if (StringUtils.isNotBlank(deliver.getErrorDesc())){
+                throw new CustomException(deliver.getErrorDesc());
+            }
+            List<ErpDeliverys> deliverys = deliver.getDeliverys();
+            if (deliverys != null && !deliverys.isEmpty()) {
+                expressInfoDTO.setLogisticCode(deliver.getCode());
+                expressInfoDTO.setShipperCode(""); //快递公司编码
+                List<TracesDTO> tracesDTOS = new ArrayList<>();
+                for (ErpDeliverys item : deliverys) {
+                    TracesDTO dto = new TracesDTO();
+//                        dto.setAction();
+                    dto.setLocation(item.getAcceptAddress());
+                    dto.setAcceptStation(item.getRemark());
+                    dto.setAcceptTime(item.getAcceptTime());
+                }
+                expressInfoDTO.setTraces(tracesDTOS);
+                expressInfoDTO.setOrderCode(order.getOrderCode());
+            }
+        }
+        return expressInfoDTO;
+    }
+
+    @Override
+    public List<DFConfigVo> getErpAccount() {
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        String dfConfigVo = sysConfig.getDfAccounts();
+        return JSON.parseArray(dfConfigVo, DFConfigVo.class);
+    }
+
+    private IErpOrderService getErpService() {
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        Integer erpOpen = sysConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1){
+            //判断erp类型
+            Integer erpType = sysConfig.getErpType();
+            if (erpType != null){
+                IErpOrderService erpOrderService = null;
+                if (erpType == 1){
+                    //管易
+                    erpOrderService =  gyOrderService;
+                } else if (erpType == 2){
+                    //旺店通
+                    erpOrderService =  wdtOrderService;
+                }  else if (erpType == 3){
+                    //
+                    erpOrderService =  hzOMSOrderService;
+                } else if (erpType == 4){
+                    //代服
+                    erpOrderService =  dfOrderService;
+                }
+                return erpOrderService;
+
+            }
+        }
+        return null;
+    }
+
+
 }

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

@@ -15,6 +15,7 @@ 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;
@@ -32,6 +33,7 @@ import com.fs.his.service.IFsUserOperationLogService;
 public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLogMapper, FsUserOperationLog> implements IFsUserOperationLogService {
     @Autowired
     private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+
     /**
      * 查询用户操作日志
      *
@@ -39,7 +41,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 +53,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 +89,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;
     }
 
     /**

+ 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/";

+ 3 - 0
fs-service/src/main/java/com/fs/qw/domain/QwGroupChatUser.java

@@ -99,4 +99,7 @@ public class QwGroupChatUser extends BaseEntity
     private String fsUserId;
     @TableField(exist = false)
     private List<GroupUserExternalVo> userList;
+
+    @TableField(exist = false)
+    private List<String> tagIdsName;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/qw/param/QwExternalContactVOTime.java

@@ -25,4 +25,6 @@ public class QwExternalContactVOTime {
     private String createTime;
 
     private String name;
+
+    private Integer level;
 }

+ 16 - 9
fs-service/src/main/java/com/fs/qw/param/SopExternalContactInfo.java

@@ -7,24 +7,31 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-@Data
+
 public class SopExternalContactInfo {
     private String createTime;
     private String tagIds;
-    private List<String> tagNames;
     private String remark;
+    private Integer level;
 
-    public SopExternalContactInfo(String createTime, List<String> tagNames, String tagIds,String remark) {
+    public SopExternalContactInfo(String createTime, String tagIds,String remark,Integer level) {
         this.createTime = createTime != null ? createTime : "无进线时间";
-        this.tagNames = (tagNames != null && !tagNames.isEmpty()) ? tagNames : Collections.singletonList("无标签");
         this.tagIds = (tagIds != null && !tagIds.equals("[]")) ? tagIds : "无标签";
         this.remark = remark != null ? remark : "无备注";
+        this.level = level != null ? level : 0;
     }
-    public SopExternalContactInfo(String createTime, String tagIds,String remark) {
-        this.createTime = createTime != null ? createTime : "无进线时间";
-        this.tagNames = Collections.singletonList("无标签");
-        this.tagIds = (tagIds != null && !tagIds.equals("[]")) ? tagIds : "无标签";
-        this.remark = remark != null ? remark : "无备注";
+
+    public String getCreateTime() {
+        return createTime;
     }
 
+    public String getTagIds() {
+        return tagIds;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+    public Integer getLevel() {return level;
+    }
 }

+ 16 - 0
fs-service/src/main/java/com/fs/sop/domain/SopUserLogsInfo.java

@@ -52,4 +52,20 @@ public class SopUserLogsInfo implements Serializable {
     @TableField(exist = false)
     private List<String> tagNames;
 
+
+    @TableField(exist = false)
+    private Integer fsUserIdStatus;
+
+    private Integer isDaysNotStudy;
+
+    //进线时间
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private String entryTime;
+
+    @TableField(exist = false)
+    private Integer level;
+
+    @TableField(exist = false)
+    private String levelName;
 }

+ 6 - 6
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -198,8 +198,8 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
     @Override
     public List<SopUserLogsInfo> selectSopUserLogsInfoList(SopUserLogsInfo info) {
-        List<SopUserLogsInfo> list = sopUserLogsInfoMapper.selectSopUserLogsInfoList(info);
-        return list;
+
+        return sopUserLogsInfoMapper.selectSopUserLogsInfoList(info);
     }
     @Override
     public List<SopUserLogsInfoVOE> selectSopUserLogsInfoListVO(SopUserLogsInfo info) {
@@ -543,7 +543,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                     createParam.setCompanyUserId(Long.parseLong(companyUserId));
                                     createParam.setCompanyId(Long.parseLong(companyId));
                                     createParam.setChatId(groupUser.getChatId());
-                                    createParam.setQwUserId(Long.parseLong(qwUser.getQwUserId()));
+                                    createParam.setQwUserId(qwUser.getId());
                                     createParam.setDays(st.getExpiresDays());
                                     R createLink = courseLinkService.createRoomLinkUrl(createParam);
                                     if (createLink.get("code").equals(500)) {
@@ -570,7 +570,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             //小程序单独
                             case "4":
                                 String linkByMiniApp = createLinkByMiniApp(st, param.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
-                                        qwUser.getQwUserId(), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), null, config);
+                                        String.valueOf(qwUser.getId()), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), null, config);
 
                                 if (StringUtil.strIsNullOrEmpty(config.getMiniprogramAppid())) {
                                     log.error("配置中无小程序id,采用默认的");
@@ -639,7 +639,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                     createParam.setCompanyUserId(qwUser.getCompanyUserId());
                                     createParam.setCompanyId(qwUser.getCompanyId());
                                     createParam.setChatId(groupChat.getChatId());
-                                    createParam.setQwUserId(Long.parseLong(qwUser.getQwUserId()));
+                                    createParam.setQwUserId(qwUser.getId());
                                     createParam.setDays(st.getExpiresDays());
                                     R createLink = courseLinkService.createRoomLinkUrl(createParam);
                                     if (createLink.get("code").equals(500)) {
@@ -668,7 +668,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             //小程序单独
                             case "4":
                                 String linkByMiniApp = createLinkByMiniApp(st, param.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
-                                        qwUser.getQwUserId(), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), null, config);
+                                        String.valueOf(qwUser.getId()), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), null, config);
 
                                 if (StringUtil.strIsNullOrEmpty(config.getMiniprogramAppid())) {
                                     log.error("配置中无小程序id,采用默认的");

+ 10 - 15
fs-service/src/main/resources/application-config-druid-jnmy.yml

@@ -10,14 +10,9 @@ logging:
 wx:
   miniapp:
     configs:
-      - appid: wx4115995705bb0ea0   #中康智慧
-        secret: 58910ae743005c396012b029c7def579
-        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
-        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
-        msgDataFormat: JSON
-      - appid: wxedde588767b358b1   #中康未来智慧药房
-        secret: 928d2961c81610d8f64b019597212fcd
-        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+      - appid:
+        secret:
+        token:
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
   cp:
@@ -42,10 +37,10 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId: wx5d3096e20e4bd8ba # 第一个公众号的appid  //公众号名称:成都九州在线互联网医院
-        secret: 1afa05f0c71beff0d52fb849c62e479a # 公众号的appsecret
-        token: PPKOdAlCoMO # 接口配置里的Token值
-        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+      - appId:  # 第一个公众号的appid
+        secret:  # 公众号的appsecret
+        token:  # 接口配置里的Token值
+        aesKey:  # 接口配置里的EncodingAESKey值
 aifabu:  #爱链接
   appKey: 7b471be905ab17e00f3b858c6710dd117601d008
 watch:
@@ -75,9 +70,9 @@ tencent_cloud_config:
   region: ap-chongqing
   proxy: jnmy
 tmp_secret_config:
-  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
-  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
-  bucket: fs-1319721001
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIx
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgB
+  bucket: fs-131972100
   app_id: 1319721001
   region: ap-chongqing
   proxy: fs

+ 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>
 

+ 3 - 0
fs-service/src/main/resources/mapper/sop/SopUserLogsInfoMapper.xml

@@ -19,6 +19,7 @@
         <result property="crtTime" column="crt_Time"  />
         <result property="updateTime" column="update_time" jdbcType="VARCHAR" />
         <result property="tagIds" column="tag_ids" jdbcType="VARCHAR" />
+        <result property="isDaysNotStudy" column="is_days_not_study"/>
     </resultMap>
 
     <sql id="selectSopUserLogsInfoVo">
@@ -200,6 +201,8 @@
             <if test="corpId != null">and corp_id = #{corpId}</if>
             <if test="externalId != null">and external_id = #{externalId}</if>
             <if test="fsUserId != null">and fs_user_id = #{fsUserId}</if>
+            <if test="fsUserIdStatus != null and fsUserIdStatus==1 ">and fs_user_id is not null and fs_user_id !=0 </if>
+            <if test="fsUserIdStatus != null and fsUserIdStatus==2 ">and (fs_user_id is null or fs_user_id =0)</if>
             <if test="externalUserName != null">and external_user_name like CONCAT('%', #{externalUserName}, '%')</if>
             <if test="createTime != null">and create_time = #{createTime}</if>
             <if test="crtTime != null">and crt_Time = #{crtTime}</if>

+ 16 - 0
fs-user-course/src/main/java/com/fs/course/controller/UserController.java

@@ -40,6 +40,7 @@ import java.net.URL;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import static com.fs.common.utils.SecurityUtils.getUserId;
 import static com.fs.his.utils.PhoneUtil.decryptPhoneMk;
@@ -62,6 +63,21 @@ public class UserController extends  AppBaseController {
     @Autowired
     private IQwAppContactWayService qwAppContactWayService;
 
+
+    @PostMapping("/loginTest")
+    public R loginTest(@RequestBody String userId) {
+        FsUser user = userService.selectFsUserByUserId(Long.parseLong(userId));
+        if (user!=null){
+            String token = jwtUtils.generateToken(user.getUserId());
+            redisCache.setCacheObject("userToken:" + user.getUserId(), token, 604800, TimeUnit.SECONDS);
+            Map<String, Object> map = new HashMap<>();
+            map.put("token", token);
+            map.put("user", user);
+            return R.ok(map);
+        }
+        return R.error("用户不存在!");
+    }
+
     /**
      * 获取用户信息
      * @param request

+ 7 - 4
fs-user-course/src/main/java/com/fs/course/controller/WxCompanyUserController.java

@@ -125,6 +125,10 @@ public class WxCompanyUserController extends AppBaseController {
             // 2. 获取销售信息
             CompanyUser companyUser = getCompanyUser(param);
 
+            if (user!=null && user.getCompanyUserId() != null && !param.getCompanyUserId().equals(user.getCompanyUserId())) {
+                return R.error("该用户已成为其他销售会员");
+            }
+
             // 3. 处理用户注册或更新
             String ip = IpUtil.getRequestIp();
             user = handleUserRegisterOrUpdate(user, param, session, phoneNoInfo, company, companyUser, ip);
@@ -182,6 +186,8 @@ public class WxCompanyUserController extends AppBaseController {
             return createUser(param, session, phoneNoInfo, company, companyUser);
 //            }
         } else {
+            // 逻辑调整:如果会员已经绑定了销售,直接提示,不让注册-2025年6月16日14点53分
+
             // 已存在用户,更新信息
             return updateUser(user, param, session, phoneNoInfo, company, companyUser);
 //            return user;
@@ -224,10 +230,7 @@ public class WxCompanyUserController extends AppBaseController {
         if (param.getAuthType() == 1 && phoneNoInfo != null) {
             userMap.setPhone(phoneNoInfo.getPhoneNumber());
         }
-        // 逻辑调整:如果会员已经绑定了销售,直接提示,不让注册-2025年6月16日14点53分
-        if (user.getCompanyUserId() != null && !param.getCompanyUserId().equals(user.getCompanyUserId())) {
-            throw new RuntimeException("该用户已成为其他销售会员");
-        }
+
         if (companyUser != null && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1) {
             userMap.setCompanyId(param.getCompanyId());
             userMap.setCompanyUserId(param.getCompanyUserId());