فهرست منبع

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_java

caoliqin 2 هفته پیش
والد
کامیت
ab453352ea
79فایلهای تغییر یافته به همراه5139 افزوده شده و 666 حذف شده
  1. 13 6
      README.md
  2. 179 4
      fs-admin/src/main/java/com/fs/his/controller/FsIntegralOrderController.java
  3. 12 0
      fs-admin/src/main/java/com/fs/his/param/BatchCreateErpOrderParam.java
  4. 13 0
      fs-admin/src/main/java/com/fs/his/param/BatchSetErpOrderParam.java
  5. 63 0
      fs-admin/src/main/java/com/fs/his/task/Task.java
  6. 57 19
      fs-admin/src/main/java/com/fs/hisStore/task/ErpTask.java
  7. 502 0
      fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java
  8. 1 3
      fs-admin/src/main/java/com/fs/live/controller/LiveController.java
  9. 2 9
      fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java
  10. 0 183
      fs-admin/src/main/java/com/fs/task/LiveTask.java
  11. 30 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  12. 3 3
      fs-company/src/main/java/com/fs/company/controller/live/LiveController.java
  13. 4 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  14. 49 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  15. 5 0
      fs-service/src/main/java/com/fs/course/config/CourseConfig.java
  16. 2 1
      fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriod.java
  17. 34 12
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  18. 2 1
      fs-service/src/main/java/com/fs/course/vo/FsUserCoursePeriodVO.java
  19. 1 0
      fs-service/src/main/java/com/fs/erp/domain/ErpOrder.java
  20. 7 0
      fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java
  21. 903 55
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  22. 29 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java
  23. 163 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java
  24. 276 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  25. 176 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java
  26. 206 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  27. 17 3
      fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java
  28. 73 0
      fs-service/src/main/java/com/fs/his/domain/FsIntegralOrderDf.java
  29. 64 0
      fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderDfMapper.java
  30. 7 1
      fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderMapper.java
  31. 4 0
      fs-service/src/main/java/com/fs/his/param/FsIntegralOrderParam.java
  32. 7 0
      fs-service/src/main/java/com/fs/his/param/FsStoreProductAddEditParam.java
  33. 62 0
      fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderDfService.java
  34. 10 4
      fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderService.java
  35. 93 0
      fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderDfServiceImpl.java
  36. 416 14
      fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java
  37. 3 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java
  38. 1 1
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  39. 32 0
      fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderExcelVO.java
  40. 8 0
      fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderListVO.java
  41. 5 0
      fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderPVO.java
  42. 10 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreProductScrm.java
  43. 1 0
      fs-service/src/main/java/com/fs/hisStore/enums/OrderInfoEnum.java
  44. 9 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsUserScrmMapper.java
  45. 9 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java
  46. 7 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsUserScrmService.java
  47. 1 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java
  48. 42 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserScrmServiceImpl.java
  49. 2 1
      fs-service/src/main/java/com/fs/live/domain/LiveOrderPayment.java
  50. 1 1
      fs-service/src/main/java/com/fs/live/mapper/LiveCouponMapper.java
  51. 9 8
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  52. 1 0
      fs-service/src/main/java/com/fs/live/param/LiveOrderPayParam.java
  53. 4 0
      fs-service/src/main/java/com/fs/live/service/ILiveOrderService.java
  54. 2 0
      fs-service/src/main/java/com/fs/live/service/ILiveService.java
  55. 1 1
      fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java
  56. 574 301
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  57. 85 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java
  58. 3 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataListVo.java
  59. 3 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataStatisticsVo.java
  60. 1 1
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  61. 1 1
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  62. 6 1
      fs-service/src/main/resources/application-config-druid-bjzm-test.yml
  63. 6 0
      fs-service/src/main/resources/application-config-druid-bjzm.yml
  64. 1 1
      fs-service/src/main/resources/application-config-druid-qdtst.yml
  65. 108 0
      fs-service/src/main/resources/application-config-druid-sczy.yml
  66. 2 2
      fs-service/src/main/resources/application-druid-bjzm-test.yml
  67. 2 2
      fs-service/src/main/resources/application-druid-bjzm.yml
  68. 180 0
      fs-service/src/main/resources/application-druid-sczy.yml
  69. 1 1
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  70. 5 0
      fs-service/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml
  71. 127 0
      fs-service/src/main/resources/mapper/his/FsIntegralOrderDfMapper.xml
  72. 74 0
      fs-service/src/main/resources/mapper/his/FsIntegralOrderMapper.xml
  73. 16 3
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml
  74. 12 0
      fs-service/src/main/resources/mapper/live/LiveOrderMapper.xml
  75. 3 0
      fs-service/src/main/resources/mapper/live/LiveOrderPaymentMapper.xml
  76. 1 0
      fs-service/src/main/resources/mapper/sop/QwSopMapper.xml
  77. 11 0
      fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java
  78. 273 22
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java
  79. 11 0
      fs-user-app/src/main/java/com/fs/app/controller/store/PayScrmController.java

+ 13 - 6
README.md

@@ -5,14 +5,21 @@
 
 #### 软件模块说明
 
-| 模块名称         | 模块描述         | 对应前端项目                  |
-|--------------|--------------|-------------------------|
-| fs-admin     | 总后台服务        | ylrz_his_scrm_adminUI   |
-| fs-company   | 销售端          | ylrz_his_scrm_companyUI |
-| fs-user-app  | 微信小程序端       | 对应某个微信小程序(前端蒲瑶清楚)       |
-| fs-framework | 主要依赖包,核心包    | /                       |
+| 模块名称         | 模块描述          | 对应前端项目                  |
+|--------------|---------------|-------------------------|
+| fs-admin     | 总后台服务         | ylrz_his_scrm_adminUI   |
+| fs-company   | 销售端           | ylrz_his_scrm_companyUI |
+| fs-store     | 店铺端           | ylrz_his_scrm_storeUI |
+| fs-doctor    | 医生端           | ylrz_his_scrm_doctorUI |
+| fs-user-app  | 微信小程序端        | 对应某个微信小程序(前端蒲瑶清楚)       |
+| fs-framework | 主要依赖包,核心包     | /                       |
 | fs-service   | 所有的链接配置文件都在里面 | /                       |
 
+#### 分支说明
+| 分支名称       | 描述    | 对应前端项目与分支                                                                |
+|------------|-------|--------------------------------------------------------------------------|
+| ScrmStores | 医建宝项目 | ylrz_his_scrm_adminUI(yjb_ScrmStores)、ylrz_his_scrm_companyUI(ScrmStore) |
+
 
 #### 安装教程
 

+ 179 - 4
fs-admin/src/main/java/com/fs/his/controller/FsIntegralOrderController.java

@@ -1,6 +1,8 @@
 package com.fs.his.controller;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
@@ -10,21 +12,29 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.his.domain.FsDfAccount;
 import com.fs.his.domain.FsIntegralOrder;
+import com.fs.his.domain.FsIntegralOrderDf;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.dto.ExpressInfoDTO;
 import com.fs.his.enums.ShipperCodeEnum;
+import com.fs.his.mapper.FsIntegralOrderMapper;
+import com.fs.his.param.BatchCreateErpOrderParam;
+import com.fs.his.param.BatchSetErpOrderParam;
+import com.fs.his.vo.*;
 import com.fs.his.param.FsIntegralOrderParam;
-import com.fs.his.service.IFsExpressService;
-import com.fs.his.service.IFsIntegralOrderService;
-import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.service.*;
 import com.fs.utils.OrderContextHolder;
-import com.fs.his.vo.*;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.text.ParseException;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -48,6 +58,18 @@ public class FsIntegralOrderController extends BaseController
 
     @Autowired
     private IFsStoreOrderService fsStoreOrderService;
+
+
+    @Autowired
+    private IFsIntegralOrderDfService integralOrderDfService;
+
+    @Autowired
+    private IFsDfAccountService fsDfAccountService;
+    @Autowired
+    private FsIntegralOrderMapper integralOrderMapper;
+    @Autowired
+    private FsIntegralOrderMapper fsIntegralOrderMapper;
+
     /**
      * 查询积分商品订单列表
      */
@@ -56,6 +78,18 @@ public class FsIntegralOrderController extends BaseController
     public TableDataInfo list(FsIntegralOrderParam fsIntegralOrder)
     {
         startPage();
+        if (CloudHostUtils.hasCloudHostName("金牛明医")){
+            /*目前只有金牛有状态为6的查询,其他项目避免使用6状态码*/
+            if (fsIntegralOrder.getStatus() != null && fsIntegralOrder.getStatus().equals("6")) {
+                fsIntegralOrder.setStatus("1");
+                fsIntegralOrder.setIsPush(0);
+            }
+            List<FsIntegralOrderListVO> list = fsIntegralOrderService.selectFsIntegralOrderListByJn(fsIntegralOrder);
+            for (FsIntegralOrderListVO vo : list) {
+                vo.setUserPhone(decryptAutoPhoneMk(vo.getUserPhone()));
+            }
+            return getDataTable(list);
+        }
         List<FsIntegralOrderListVO> list = fsIntegralOrderService.selectFsIntegralOrderListVO(fsIntegralOrder);
         for (FsIntegralOrderListVO vo : list) {
             vo.setUserPhone(decryptAutoPhoneMk(vo.getUserPhone()));
@@ -71,6 +105,16 @@ public class FsIntegralOrderController extends BaseController
     @GetMapping("/export")
     public AjaxResult export(FsIntegralOrder fsIntegralOrder)
     {
+        if (CloudHostUtils.hasCloudHostName("金牛明医")&&fsIntegralOrder.getStatus() != null && fsIntegralOrder.getStatus().equals(6)) {
+            /*目前只有金牛有状态为6的查询,其他项目避免使用6状态码*/
+            FsIntegralOrderParam param = new FsIntegralOrderParam();
+            BeanUtil.copyProperties(fsIntegralOrder, param);
+            param.setStatus("1");
+            param.setIsPush(0);
+            List<FsIntegralOrderListVO> fsIntegralOrderListVOS = fsIntegralOrderService.selectFsIntegralOrderListByJn(param);
+            ExcelUtil<FsIntegralOrderListVO> util = new ExcelUtil<>(FsIntegralOrderListVO.class);
+            return util.exportExcel(new ArrayList<>(fsIntegralOrderListVOS), "积分商品订单数据");
+        }
         return fsIntegralOrderService.export(fsIntegralOrder);
     }
     /**
@@ -218,4 +262,135 @@ public class FsIntegralOrderController extends BaseController
     public AjaxResult finishOrder(@PathVariable("orderCode") String orderCode) {
         return toAjax(fsIntegralOrderService.finishOrder(orderCode));
     }
+
+    @ApiOperation("批量设置订单账户")
+    @Log(title = "积分商品订单", businessType = BusinessType.UPDATE)
+//    @PreAuthorize("@ss.hasPermi('his:storeOrder:createErpOrder')")
+    @PostMapping(value = "/batchSetErpOrder")
+    @Transactional(rollbackFor = Exception.class)
+    public R batchSetErpOrder(@RequestBody BatchSetErpOrderParam param)
+    {
+        String nickName = getLoginUser().getUser().getNickName();
+        String loginAccount = param.getLoginAccount();
+        if (StringUtils.isBlank(loginAccount)){
+            return R.error("未选择erp账户");
+        }
+        FsIntegralOrderDf df = getDFInfo(loginAccount);
+        if (df.getLoginAccount() == null){
+            return R.error("未查询到所选erp账户");
+        }
+        List<Long> orderIds = param.getOrderIds();
+        List<FsIntegralOrder> list = null;
+        if (!orderIds.isEmpty()) {
+            list = fsIntegralOrderService.selectFsIntegralOrderByOrderIds(orderIds);
+//            orderIds = list.stream().map(FsIntegralOrder::getOrderId).collect(Collectors.toList());
+        }else{
+            return R.ok();
+        }
+        if (list.isEmpty())
+            return R.ok();
+        List<String> erpPhones = param.getErpPhones();
+        int[] index = {0}; // 使用数组模拟可变引用
+        list.forEach(item->{
+            df.setOrderId(item.getOrderId());
+            df.setOrderCode(item.getOrderCode());
+            if (!erpPhones.isEmpty()) {
+                int currentIndex = index[0] % erpPhones.size(); // 循环使用
+                df.setErpPhone(erpPhones.get(currentIndex));
+                index[0]++; // 顺序递增
+            }
+            FsIntegralOrder order = new FsIntegralOrder();
+            //更新一下积分订单的loginaccount这个字段
+            order.setOrderId(item.getOrderId());
+            order.setLoginAccount(df.getLoginAccount());
+//            fsIntegralOrderService.updateFsIntegralOrder(order);
+            fsIntegralOrderMapper.updateById(order);
+            FsIntegralOrderDf temp = integralOrderDfService.getOne(Wrappers.<FsIntegralOrderDf>lambdaQuery().eq(FsIntegralOrderDf::getOrderId,item.getOrderId()));
+            df.setParcelQuantity(param.getParcelQuantity());
+//            df.setErpPhone(param.getErpPhone().trim());
+            if (temp != null){
+                df.setUpdateTime(LocalDateTime.now());
+                integralOrderDfService.updateById(df);
+            } else {
+                integralOrderDfService.insertFsIntegralOrderDf(df);
+            }
+            //积分订单操作日志暂定
+        });
+        return R.ok();
+    }
+
+//    @Log(title = "手动推管易", businessType = BusinessType.INSERT)
+    @ApiOperation("批量创建ERP订单")
+//    @PreAuthorize("@ss.hasPermi('his:storeOrder:createErpOrder')")
+    @Log(title = "积分商品订单", businessType = BusinessType.UPDATE)
+    @PostMapping(value = "/batchCreateErpOrder")
+    public R batchCreateErpOrder(@RequestBody BatchCreateErpOrderParam param) throws ParseException {
+//        String nickName = getLoginUser().getUser().getNickName();
+        String loginAccount = param.getLoginAccount();
+        if (StringUtils.isBlank(loginAccount)){
+            return R.error("未选择推送erp账户");
+        }
+        FsIntegralOrderDf df = getDFInfo(loginAccount);
+        if (df.getLoginAccount() == null){
+            return R.error("未查询到所选erp账户");
+        }
+        List<Long> orderIds = param.getOrderIds();
+        List<String> erpPhones = param.getErpPhones();
+        int[] index = {0}; // 使用数组模拟可变引用
+        if (!orderIds.isEmpty()) {
+            List<FsIntegralOrder> orders = integralOrderMapper.selectList(Wrappers.<FsIntegralOrder>lambdaQuery().in(FsIntegralOrder::getOrderId, orderIds));
+            for (FsIntegralOrder order : orders) {
+                df.setOrderId(order.getOrderId());
+                df.setOrderCode(order.getOrderCode());
+                FsIntegralOrderDf temp = integralOrderDfService.getBaseMapper().selectById(order.getOrderId());
+                //如果是没有代服表数据,就用传过来的df账号,如果有就不更新df数据直接拿之前的数据创建erp
+                if (temp == null){
+                    if (!erpPhones.isEmpty()) {
+                        int currentIndex = index[0] % erpPhones.size(); // 循环使用
+                        df.setErpPhone(erpPhones.get(currentIndex));
+                        index[0]++; // 顺序递增
+                    }
+                    df.setParcelQuantity(param.getParcelQuantity()); //设置包裹数量
+                    integralOrderDfService.getBaseMapper().insert(df);
+                    order.setLoginAccount(df.getLoginAccount());
+                    integralOrderMapper.updateById(order);
+                    //日志表,待定
+                }
+                fsIntegralOrderService.createErpOrder(order.getOrderId());
+            }
+        }
+        return R.ok("推送成功");
+    }
+
+    @Log(title = "导入修改订单", businessType = BusinessType.IMPORT)
+    @PostMapping("/importOrderStatusData")
+    public AjaxResult importOrderStatusData(MultipartFile file) throws Exception
+    {
+        ExcelUtil<FsIntegralOrderExcelVO> util = new ExcelUtil<>(FsIntegralOrderExcelVO.class);
+        List<FsIntegralOrderExcelVO> list = util.importExcel(file.getInputStream());
+        String message = fsIntegralOrderService.importOrderStatusData(list);
+        return AjaxResult.success(message);
+    }
+
+    @GetMapping("/importUpdateOrderTemplate")
+    public AjaxResult importUpdateOrderTemplate()
+    {
+        ExcelUtil<FsIntegralOrderExcelVO> util = new ExcelUtil<>(FsIntegralOrderExcelVO.class);
+        return util.importTemplateExcel("修改订单");
+    }
+    private FsIntegralOrderDf getDFInfo(String loginAccount) {
+        //查询订单账户 判断是否存在该订单账户
+        FsDfAccount erpAccount = fsDfAccountService.selectFsDfAccountByAccount(loginAccount);
+        FsIntegralOrderDf df = new FsIntegralOrderDf();
+        if (erpAccount != null){
+            //添加df记录
+            df.setAppKey(erpAccount.getDfAppKey());
+            df.setAppSecret(erpAccount.getDfAppsecret());
+            df.setLoginAccount(loginAccount);
+            df.setMonthlyCard(erpAccount.getMonthlyCard());
+            df.setExpressProductCode(erpAccount.getExpressProductCode());
+            df.setStatus(0);
+        }
+        return df;
+    }
 }

+ 12 - 0
fs-admin/src/main/java/com/fs/his/param/BatchCreateErpOrderParam.java

@@ -0,0 +1,12 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class BatchCreateErpOrderParam {
+    private List<Long> orderIds;
+    private String loginAccount;
+    private Integer parcelQuantity; //包裹数量
+    private List<String> erpPhones;
+}

+ 13 - 0
fs-admin/src/main/java/com/fs/his/param/BatchSetErpOrderParam.java

@@ -0,0 +1,13 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BatchSetErpOrderParam {
+    private List<Long> orderIds;
+    private String loginAccount;
+    private Integer parcelQuantity; //包裹数量
+    private List<String> erpPhones;
+}

+ 63 - 0
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.service.impl.SmsServiceImpl;
 import com.fs.common.utils.DateUtils;
@@ -68,6 +69,7 @@ import com.fs.sop.service.IQwSopTempVoiceService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
+import com.fs.utils.OrderContextHolder;
 import com.google.gson.Gson;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -212,6 +214,8 @@ public class Task {
 
     @Autowired
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Autowired
+    private FsIntegralOrderMapper fsIntegralOrderMapper;
 
     /**
      * sop任务token消耗统计
@@ -684,6 +688,65 @@ public class Task {
         }
     }
 
+    @Autowired
+    private FsIntegralOrderDfMapper integralOrderDfMapper;
+
+
+    /**
+     * 创建了erp的订单,但是等待回调修改物流状态的定时任务
+     * */
+    public void deliveryIntegralOp() {
+        IErpOrderService erpOrderService = getErpService();
+        //查询没有物流字段但是创建过的,如果有则把待发货状态改成待收货
+        List<FsIntegralOrderDf> integralDf = integralOrderDfMapper.selectByIsPush();
+        if (integralDf.isEmpty()) {
+            log.info("⏹️ 没有需要推送的订单明细,流程结束");
+            return;
+        }
+        log.info("📊 查询到 {} 条未查询的订单明细", integralDf.size());
+        //只判断类型,给个对象
+        OrderContextHolder.setIntegralOrder(new FsIntegralOrder());
+        for (FsIntegralOrderDf df : integralDf) {
+            log.info("🔄 开始处理订单明细,订单号: {}, orderId: {}", df.getOrderCode(), df.getOrderId());
+            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+            request.setCode(df.getOrderCode());
+            erpOrderService.getOrder(request);
+        }
+        OrderContextHolder.clear();
+    }
+    /**
+     * 对待收货的订单,定时去更新物流状态
+     * */
+    public void getIntegralOrderDeliveryStatus() {
+        /*erp物流流程:
+        1.请求顺丰接口添加物流订单
+        2.修改df推送标识为1
+        3.查询订单结果更新order,或者回滚df表*/
+        //目的是查询创建成功erp的订单,应该在第三部之后改动的数据来作为查询条件;即为待收货订单and拥有deliverySn的数据;
+        List<FsIntegralOrder> orders = fsIntegralOrderMapper.selectList(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getStatus, 2).isNotNull(FsIntegralOrder::getDeliverySn));
+        IErpOrderService erpOrderService = getErpService();
+        List<CompletableFuture<Void>> futures = new ArrayList<>();
+        for (FsIntegralOrder order : orders) {
+            // 创建局部final变量副本
+            final FsIntegralOrder currentOrder = order;
+            FsStoreOrder order1 = new FsStoreOrder();
+            order1.setDeliverySn(currentOrder.getDeliverySn());
+            order1.setOrderCode(currentOrder.getOrderCode());
+
+            // 异步执行,使用局部变量副本
+            CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                OrderContextHolder.setIntegralOrder(currentOrder);
+                try {
+                    erpOrderService.getOrderDeliveryStatus(order1);
+                } finally {
+                    OrderContextHolder.clear();
+                }
+            });
+            futures.add(future);
+        }
+        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+    }
+
     public void deliveryOpScrm()
     {
         IErpOrderService erpOrderService = getErpService();

+ 57 - 19
fs-admin/src/main/java/com/fs/hisStore/task/ErpTask.java

@@ -7,6 +7,8 @@ import com.fs.erp.mapper.FsErpFinishPushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.service.ILiveOrderService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +29,9 @@ public class ErpTask {
     @Autowired
     private IFsStoreOrderScrmService fsStoreOrderService;
 
+    @Autowired
+    private ILiveOrderService liveOrderService;
+
 
     /**
      * 推送完成订单到ERP
@@ -35,34 +40,67 @@ public class ErpTask {
         List<FsErpFinishPush> fsErpFinishPushes = fsErpFinishPushMapper.queryPenddingOrder();
         for (FsErpFinishPush fsErpFinishPush : fsErpFinishPushes) {
             FsStoreOrderScrm fsStoreOrder = fsStoreOrderService.selectFsStoreOrderById(fsErpFinishPush.getOrderId());
+            if (fsStoreOrder != null) {
+                try {
 
-            try {
-
-                ErpOrder erpOrder = fsStoreOrderService.getErpOrder(fsStoreOrder);
+                    ErpOrder erpOrder = fsStoreOrderService.getErpOrder(fsStoreOrder);
 
-                ErpOrderResponse erpOrderResponse = erpOrderService.finishOrder(erpOrder);
+                    ErpOrderResponse erpOrderResponse = erpOrderService.finishOrder(erpOrder);
 
-                fsErpFinishPush.setParams(erpOrderResponse.getRequestRawData());
-                fsErpFinishPush.setResult(erpOrderResponse.getResponseRawData());
-                fsErpFinishPush.setUpdateTime(new Date());
+                    fsErpFinishPush.setParams(erpOrderResponse.getRequestRawData());
+                    fsErpFinishPush.setResult(erpOrderResponse.getResponseRawData());
+                    fsErpFinishPush.setUpdateTime(new Date());
 
-                if(erpOrderResponse.getSuccess()!= null && erpOrderResponse.getSuccess()){
-                    fsErpFinishPush.setTaskStatus(1);
+                    if(erpOrderResponse.getSuccess()!= null && erpOrderResponse.getSuccess()){
+                        fsErpFinishPush.setTaskStatus(1);
 
-                    log.error("推送完成订单到ERP成功! 订单号: {}",fsErpFinishPush.getOrderId());
-                } else {
-                    fsErpFinishPush.setTaskStatus(2);
+                        log.error("推送完成订单到ERP成功! 订单号: {}",fsErpFinishPush.getOrderId());
+                    } else {
+                        fsErpFinishPush.setTaskStatus(2);
+                        fsErpFinishPush.setRetryCount(fsErpFinishPush.getRetryCount()+1);
+                        log.error("推送完成订单到ERP失败! 订单号: {}",fsErpFinishPush.getOrderId());
+                    }
+                } catch (Throwable e) {
                     fsErpFinishPush.setRetryCount(fsErpFinishPush.getRetryCount()+1);
-                    log.error("推送完成订单到ERP失败! 订单号: {}",fsErpFinishPush.getOrderId());
+                    fsErpFinishPush.setErrorMessage(ExceptionUtils.getStackTrace(e));
+                    fsErpFinishPush.setTaskStatus(2);
+                    log.error("订单推送失败!原因: {}", ExceptionUtils.getStackTrace(e),e);
+                    continue;
+                }
+            } else {
+                LiveOrder liveOrder = liveOrderService.selectLiveOrderByOrderId(String.valueOf(fsErpFinishPush.getOrderId()));
+                if (liveOrder != null) {
+                    try {
+                        ErpOrder erpOrder = liveOrderService.getErpOrder(liveOrder);
+
+                        ErpOrderResponse erpOrderResponse = erpOrderService.finishOrder(erpOrder);
+
+                        fsErpFinishPush.setParams(erpOrderResponse.getRequestRawData());
+                        fsErpFinishPush.setResult(erpOrderResponse.getResponseRawData());
+                        fsErpFinishPush.setUpdateTime(new Date());
+
+                        if (erpOrderResponse.getSuccess() != null && erpOrderResponse.getSuccess()) {
+                            fsErpFinishPush.setTaskStatus(1);
+
+                            log.error("推送完成订单到ERP成功! 订单号: {}", fsErpFinishPush.getOrderId());
+                        } else {
+                            fsErpFinishPush.setTaskStatus(2);
+                            fsErpFinishPush.setRetryCount(fsErpFinishPush.getRetryCount() + 1);
+                            log.error("推送完成订单到ERP失败! 订单号: {}", fsErpFinishPush.getOrderId());
+                        }
+                    } catch (Throwable e) {
+                        fsErpFinishPush.setRetryCount(fsErpFinishPush.getRetryCount() + 1);
+                        fsErpFinishPush.setErrorMessage(ExceptionUtils.getStackTrace(e));
+                        fsErpFinishPush.setTaskStatus(2);
+                        log.error("订单推送失败!原因: {}", ExceptionUtils.getStackTrace(e), e);
+                        continue;
+                    }
+                } else {
+                    log.error("订单不存在! 订单号: {}",fsErpFinishPush.getOrderId());
+                    continue;
                 }
-            } catch (Throwable e) {
-                fsErpFinishPush.setRetryCount(fsErpFinishPush.getRetryCount()+1);
-                fsErpFinishPush.setErrorMessage(ExceptionUtils.getStackTrace(e));
-                fsErpFinishPush.setTaskStatus(2);
-                log.error("订单推送失败!原因: {}", ExceptionUtils.getStackTrace(e),e);
             }
 
-
             fsErpFinishPushMapper.updateById(fsErpFinishPush);
         }
 

+ 502 - 0
fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java

@@ -0,0 +1,502 @@
+package com.fs.hisStore.task;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.vo.RedPacketMoneyVO;
+import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.domain.ErpOrderQuery;
+import com.fs.erp.dto.ErpOrderQueryRequert;
+import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.dto.ExpressInfoDTO;
+import com.fs.his.service.IFsExpressService;
+import com.fs.his.service.IFsUserService;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.dto.DateComparisonConfigDTO;
+import com.fs.hisStore.enums.ShipperCodeEnum;
+import com.fs.hisStore.mapper.FsStoreProductAttrValueScrmMapper;
+import com.fs.hisStore.param.FsStoreOrderAddTuiMoneyParam;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.live.domain.LiveAfterSales;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.domain.LiveOrderPayment;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
+import com.fs.live.mapper.LiveOrderPaymentMapper;
+import com.fs.live.param.LiveAfterSalesAudit1Param;
+import com.fs.live.param.LiveAfterSalesParam;
+import com.fs.live.param.LiveAfterSalesProductParam;
+import com.fs.live.service.*;
+import com.fs.pay.pay.dto.OrderQueryDTO;
+import com.fs.pay.service.IPayService;
+import com.fs.store.config.StoreConfig;
+import com.fs.system.service.ISysConfigService;
+import com.fs.ybPay.domain.OrderResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author fs
+ */
+@Slf4j
+@Component("liveTask")
+public class LiveTask {
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private ILiveOrderService liveOrderService;
+
+    @Autowired
+    private ILiveCouponService liveCouponService;
+
+    @Autowired
+    private ILiveCouponIssueService liveCouponIssueService;
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
+    @Autowired
+    private ILiveAfterSalesService liveAfterSalesService;
+
+    @Autowired
+    private ILiveOrderItemService liveOrderItemService;
+
+    @Autowired
+    private ILiveOrderPaymentService liveOrderPaymentService;
+
+    @Autowired
+    private IFsUserService userService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSOrderService;
+
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
+
+    @Autowired
+    private ConfigUtil configUtil;
+
+    @Autowired
+    IErpOrderService erpOrderService;
+
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
+    @Autowired
+    private LiveOrderPaymentMapper liveOrderPaymentMapper;
+
+    @Autowired
+    private IPayService ybPayService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private IFsExpressService expressService;
+
+    @Autowired
+    private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public void PushErp() throws ParseException {
+        List<Long> ids = liveOrderMapper.selectOrderIdByNoErp();
+        for (Long id : ids) {
+            liveOrderService.createOmsOrder(id);
+        }
+    }
+
+    public void redPacketSubMoney() throws Exception {
+        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogByCompany();
+        for (RedPacketMoneyVO redPacketMoneyVO : redPacketMoneyVOS) {
+            companyService.subtractCompanyMoney(redPacketMoneyVO.getMoney(), redPacketMoneyVO.getCompanyId());
+        }
+    }
+
+    public void redPacketAddMoney() throws Exception {
+        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseAddRedPacketLogByCompany();
+        for (RedPacketMoneyVO redPacketMoneyVO : redPacketMoneyVOS) {
+            companyService.addRedPacketCompanyMoney(redPacketMoneyVO.getMoney(), redPacketMoneyVO.getCompanyId());
+        }
+    }
+
+    //每5分钟执行一次
+    public void deliveryOp() {
+        List<LiveOrder> list = liveOrderService.selectUpdateExpress();
+        for (LiveOrder order : list) {
+            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+            request.setCode(order.getExtendOrderId());
+            IErpOrderService erpOrderService = getErpOrderService();
+            ErpOrderQueryResponse response = erpOrderService.getLiveOrder(request);
+            if (erpOrderService != dfOrderService) {
+                if (response.getOrders() != null && !response.getOrders().isEmpty()) {
+                    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
+                                    liveOrderService.deliveryOrder(order.getOrderCode(), delivery.getMail_no(), delivery.getExpress_code(), delivery.getExpress_name());
+                                    redisCache.deleteObject(DELIVERY + ":" + order.getExtendOrderId());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void couponOp() {
+        // 直播优惠券过期处理,如果有对应方法则调用
+        // liveCouponService.updateFsCouponByExpire();
+    }
+
+    //退款自动处理 24小时未审核自动审核通过 每小时执行一次
+    public void refundOp() {
+        //获取所有退款申请
+        List<LiveAfterSales> list = liveAfterSalesService.selectLiveAfterSalesByDoAudit();
+        if (list != null) {
+            for (LiveAfterSales afterSales : list) {
+                //仅退款
+                if (afterSales.getRefundType().equals(0)) {
+                    LiveAfterSalesAudit1Param audit1Param = new LiveAfterSalesAudit1Param();
+                    audit1Param.setSalesId(afterSales.getId());
+                    audit1Param.setOperator("平台");
+                    liveAfterSalesService.audit1(audit1Param);
+                }
+            }
+        }
+    }
+
+    //每天执行一次
+    public void userMoneyOp() {
+        // 直播订单完成7天后给用户返现,如果有对应方法则调用
+        // List<LiveOrder> list = liveOrderService.selectLiveOrderListByFinish7Day();
+        // if (list != null) {
+        //     for (LiveOrder order : list) {
+        //         userService.addMoney(order);
+        //     }
+        // }
+    }
+
+    //每30秒执行一次
+    public void orderItemSyncOp() {
+//         同步订单项JSON,如果有对应方法则调用
+         List<LiveOrder> list = liveOrderService.selectLiveOrderItemJson();
+         for (LiveOrder storeOrder : list) {
+             LiveOrderItem parmOrderItem = new LiveOrderItem();
+             parmOrderItem.setOrderId(storeOrder.getOrderId());
+             List<LiveOrderItem> listOrderItem = liveOrderItemService.selectLiveOrderItemList(parmOrderItem);
+             if (listOrderItem.size() > 0) {
+                 String itemJson = JSONUtil.toJsonStr(listOrderItem);
+                 storeOrder.setItemJson(itemJson);
+                 liveOrderMapper.updateLiveOrderItemJson(storeOrder);
+             }
+         }
+    }
+
+    public void returnDeliveryId() {
+        IErpOrderService erpOrderService = getErpOrderService();
+        // 获取ERP订单号列表,如果有对应方法则调用
+        // List<String> list = liveOrderMapper.selectErpCode();
+        // for (String s : list) {
+        //     ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+        //     request.setCode(s);
+        //     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())) {
+        //                         LiveOrder order = new LiveOrder();
+        //                         order.setExtendOrderId(s);
+        //                         order.setDeliverySn(delivery.getMail_no());
+        //                         order.setStatus(2);
+        //                         liveOrderMapper.updateDelivery(order);
+        //                     }
+        //                 }
+        //             }
+        //         }
+        //     }
+        // }
+    }
+
+    public void changeStatus() {
+//         获取需要更新物流状态的订单ID列表,如果有对应方法则调用
+//         List<Long> list = liveOrderMapper.selectOrderId();
+//         for (Long orderId : list) {
+//             LiveOrder order = liveOrderMapper.selectLiveOrderByOrderId(String.valueOf(orderId));
+//             String lastFourNumber = "";
+//             if (order.getDeliverySn() != null && order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+//                 lastFourNumber = order.getUserPhone();
+//                 if (lastFourNumber != null && lastFourNumber.length() == 11) {
+//                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+//                 }
+//             }
+//             ExpressInfoDTO dto = expressService.getExpressInfo(order.getOrderCode(), order.getDeliverySn(), order.getDeliverySn(), lastFourNumber);
+//             LiveOrder map = new LiveOrder();
+//             map.setDeliveryStatus(Integer.parseInt(dto.getState()));
+//             map.setOrderId(orderId);
+//             map.setDeliveryType(dto.getStateEx());
+//             liveOrderMapper.updateLiveOrder(map);
+//         }
+    }
+
+    public void subCompanyMoney() {
+        // 获取需要扣减公司金额的支付ID列表,如果有对应方法则调用
+        // List<Long> list = liveOrderPaymentMapper.selectPaymentIds();
+        // for (Long paymentId : list) {
+        //     LiveOrderPayment payment = liveOrderPaymentService.selectLiveOrderPaymentByPaymentId(paymentId);
+        //     if (payment.getCompanyId() != null && payment.getCompanyId() > 0) {
+        //         companyService.subCompanyPaymentMoney(payment);
+        //     }
+        // }
+    }
+
+    public void updateOrderItem() throws ParseException {
+        List<Long> ids = liveOrderService.selectOrderIdByNoErp();
+        for (Long id : ids) {
+            liveOrderService.createOmsOrder(id);
+        }
+    }
+
+    //每天执行一次
+    public void syncExpress() {
+        List<Long> ids = liveOrderService.selectSyncExpressIds();
+        for (Long id : ids) {
+            liveOrderService.syncExpress(id);
+        }
+    }
+
+    public void returnPayStatus() {
+        // 获取需要查询支付状态的支付ID列表,如果有对应方法则调用
+        // List<String> ids = liveOrderPaymentMapper.selectPayStatusIds();
+        // for (String id : ids) {
+        //     OrderQueryDTO o = new OrderQueryDTO();
+        //     o.setUpOrderId(id);
+        //     OrderResult orderResult = ybPayService.getOrder(o);
+        //     if ("0".equals(orderResult.getState())) {
+        //         String[] order = orderResult.getLowOrderId().split("-");
+        //         if (orderResult.getStatus().equals("100")) {
+        //             switch (order[0]) {
+        //                 case "live":
+        //                     liveOrderService.payConfirm(1, null, order[1], o.getUpOrderId(), orderResult.getBankTrxId(), orderResult.getBankOrderId());
+        //                 case "live_remain":
+        //                     liveOrderService.payConfirm(1, null, order[1], o.getUpOrderId(), orderResult.getBankTrxId(), orderResult.getBankOrderId());
+        //                 case "payment":
+        //                     liveOrderPaymentService.payConfirm(order[1], o.getUpOrderId(), orderResult.getBankTrxId(), orderResult.getBankOrderId());
+        //             }
+        //         }
+        //     }
+        // }
+    }
+
+    public void AddTuiMoney() {
+        // 获取需要添加推荐金额的订单ID列表,如果有对应方法则调用
+        // List<Long> ids = liveOrderMapper.selectAddTuiMoney();
+        // for (Long id : ids) {
+        //     FsStoreOrderAddTuiMoneyParam param = new FsStoreOrderAddTuiMoneyParam();
+        //     param.setOrderId(id);
+        //     liveOrderService.addTuiMoney(param);
+        // }
+    }
+
+    public void selectPayMoneyLessOne() {
+        // 获取支付金额小于1的订单列表,如果有对应方法则调用
+        // List<LiveOrder> list = liveOrderMapper.selectPayMoneyLessOne();
+        // for (LiveOrder order : list) {
+        //     LiveAfterSalesParam param = new LiveAfterSalesParam();
+        //     param.setOrderCode(order.getOrderCode());
+        //     param.setServiceType(0);
+        //     param.setRefundAmount(order.getPayMoney());
+        //     param.setReasons("超时未处理,自动申请退款");
+        //     List<LiveAfterSalesProductParam> productParams = new ArrayList<>();
+        //     List<LiveOrderItem> items = liveOrderItemMapper.selectLiveOrderItemByOrderId(order.getOrderId());
+        //     for (LiveOrderItem item : items) {
+        //         LiveAfterSalesProductParam param1 = new LiveAfterSalesProductParam();
+        //         param1.setProductId(item.getProductId());
+        //         param1.setNum(item.getNum());
+        //         productParams.add(param1);
+        //     }
+        //     param.setProductList(productParams);
+        //     liveAfterSalesService.applyForAfterSales(order.getUserId(), param);
+        // }
+    }
+
+    public void deleteCustomer() {
+        // 删除客户逻辑
+    }
+
+    private IErpOrderService getErpOrderService() {
+        //判断是否开启erp
+        IErpOrderService erpOrderService = null;
+        FsSysConfig erpConfig = configUtil.getSysConfig();
+        Integer erpOpen = erpConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1) {
+            //判断erp类型
+            Integer erpType = erpConfig.getErpType();
+            if (erpType != null) {
+                if (erpType == 1) {
+                    //管易
+                    erpOrderService = gyOrderService;
+                } else if (erpType == 2) {
+                    //旺店通
+                    erpOrderService = wdtOrderService;
+                } else if (erpType == 3) {
+                    //代服
+                    erpOrderService = hzOMSOrderService;
+                } else if (erpType == 4) {
+                    //瀚智
+                    erpOrderService = dfOrderService;
+                } else if (erpType == 5) {
+                    erpOrderService = jSTOrderService;
+                } else if (erpType == 6) {
+                    erpOrderService = k9OrderService;
+                }
+            }
+        }
+        return erpOrderService;
+    }
+
+    /**
+     * 提醒证件到期任务
+     */
+    public void remindCertValidation() {
+        log.info("提醒店铺证件到期任务执行... 当前时间: {}", LocalTime.now());
+
+        // 从配置表获取需要比较的表和字段
+        List<DateComparisonConfigDTO> tablesToCheck = jdbcTemplate.query(
+                "SELECT table_name, date_column,in_advance,user_column,phone_column,remind_words,platform,cert_type" +
+                        " FROM date_comparison_config", (rs, rowNum) -> {
+                    return DateComparisonConfigDTO.builder()
+                            .tableName(rs.getString("table_name"))//表名
+                            .certType(rs.getString("cert_type"))//证件类型
+                            .dateColumn(rs.getString("date_column"))//日期字段
+                            .userColumn(rs.getString("user_column"))//用户字段
+                            .remindWords(rs.getString("remindWords"))//提醒内容
+                            .phoneColumn(rs.getString("phone_column"))//提醒手机
+                            .inAdvance(rs.getInt("inAdvance"))//提前天数
+                            .platform(rs.getString("platform")).build();//平台
+                });
+
+        tablesToCheck.forEach(dto -> {
+            //获取证件失效日期字段小于当前时间加提前天数的用户和电话号码
+            String sql = String.format("SELECT %s , %s " +
+                            "FROM %s " +
+                            "WHERE %s >= DATE_SUB(CURDATE(), INTERVAL %d DAY)",
+                    dto.getUserColumn(),
+                    dto.getPhoneColumn(),
+                    dto.getTableName(),
+                    dto.getDateColumn(),
+                    dto.getInAdvance()
+            );
+            List<Map<String, Object>> users = jdbcTemplate.queryForList(sql);
+            users.forEach(user -> {
+                String userName = (String) user.get(dto.getUserColumn());
+                String phone = (String) user.get(dto.getPhoneColumn());
+                String remindWords = String.format("【%s平台提示】尊敬的%s用户,店铺%s证件即将到期,请及时处理!",
+                        dto.getPlatform(),
+                        userName,
+                        dto.getCertType());
+                // 使用phone发送remindWords短信
+                // TODO 发送通知
+            });
+        });
+    }
+
+    /**
+     * 禁用店铺
+     */
+    public void disable() {
+        log.info("禁用店铺任务执行... 当前时间: {}", LocalTime.now());
+        // 从配置表获取需要禁用的表和字段
+        List<DateComparisonConfigDTO> toDisable = jdbcTemplate.query(
+                "SELECT table_name, date_column,invalid_expression,status_column" +
+                        " FROM date_comparison_config " +
+                        " WHERE is_do_invalid = '1'", (rs, rowNum) -> DateComparisonConfigDTO.builder()
+                        .tableName(rs.getString("table_name"))//表名
+                        .dateColumn(rs.getString("date_column"))//日期字段
+                        .invalidExpression(rs.getString("invalid_expression"))//失效表达式
+                        .statusColumn(rs.getString("status_column"))//状态字段
+                        .build());
+
+        toDisable.forEach(dto -> {
+            //更新证件失效日期字段小于当前时间的数据
+            String sql = String.format("UPDATE %s " +
+                            "SET %s = %s " +
+                            "WHERE %s < CURDATE()",
+                    dto.getTableName(),
+                    dto.getStatusColumn(),
+                    dto.getInvalidExpression(),
+                    dto.getDateColumn());
+            jdbcTemplate.update(sql);
+        });
+    }
+
+    public void getOrderDeliveryStatus() {
+        IErpOrderService erpOrderService = getErpOrderService();
+        List<LiveOrder> orders = null;
+        if (erpOrderService != null && erpOrderService == dfOrderService) {
+            // 获取已发货订单列表,如果有对应方法则调用
+             orders = liveOrderMapper.selectShippedOrder();
+             if (orders != null && !orders.isEmpty()) {
+                 List<CompletableFuture<Void>> futures = new ArrayList<>();
+                 for (LiveOrder order : orders) {
+                     CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                         erpOrderService.getOrderLiveDeliveryStatus(order);
+                     });
+                     futures.add(future);
+                 }
+                 CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+             }
+        }
+    }
+}

+ 1 - 3
fs-admin/src/main/java/com/fs/live/controller/LiveController.java

@@ -10,7 +10,6 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.live.domain.Live;
 import com.fs.live.service.ILiveService;
 import com.fs.live.vo.LiveListVo;
-import com.fs.task.LiveTask;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -29,8 +28,7 @@ import java.util.Map;
 public class LiveController extends BaseController {
     @Autowired
     private ILiveService liveService;
-    @Autowired
-    private LiveTask liveTask;
+
 
     /**
      * 查询直播列表

+ 2 - 9
fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java

@@ -43,7 +43,6 @@ import com.fs.live.vo.*;
 import com.fs.store.domain.FsStoreDelivers;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
-import com.fs.task.LiveTask;
 import io.swagger.annotations.ApiOperation;
 import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -93,8 +92,7 @@ public class LiveOrderController extends BaseController
 //    private FsWarehousesMapper fsWarehousesMapper;
     @Autowired
     IErpOrderService erpOrderService;
-    @Autowired
-    private LiveTask liveTask;
+
 
 
     @Autowired
@@ -253,12 +251,7 @@ public class LiveOrderController extends BaseController
         return getDataTable(list);
     }
 
-    @GetMapping("/test")
-    public R test()
-    {
-        liveTask.updateExpress();
-        return R.ok();
-    }
+
     @PreAuthorize("@ss.hasPermi('live:liveOrder:refundOrderMoney')")
     @Log(title = "退款", businessType = BusinessType.UPDATE)
 //    @PreAuthorize("@ss.hasPermi('live:liveOrder:refundOrderMoney')")

+ 0 - 183
fs-admin/src/main/java/com/fs/task/LiveTask.java

@@ -1,183 +0,0 @@
-package com.fs.task;
-
-
-import com.fs.erp.domain.ErpDeliverys;
-import com.fs.erp.domain.ErpOrderQuery;
-import com.fs.erp.dto.ErpOrderQueryRequert;
-import com.fs.erp.dto.ErpOrderQueryResponse;
-import com.fs.erp.service.FsJstAftersalePushService;
-import com.fs.erp.service.IErpOrderService;
-import com.fs.his.service.IFsExpressService;
-import com.fs.live.domain.LiveAfterSales;
-import com.fs.live.domain.LiveOrder;
-import com.fs.live.param.LiveAfterSalesAudit1Param;
-import com.fs.live.service.ILiveAfterSalesService;
-import com.fs.live.service.ILiveOrderLogsService;
-import com.fs.live.service.ILiveOrderService;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.ObjectUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-import java.util.List;
-
-/**
- * 定时任务调度
- * @author fs
- */
-@Component("liveTask")
-public class LiveTask {
-    Logger logger = LoggerFactory.getLogger(LiveTask.class);
-
-
-    @Autowired
-    private ILiveOrderService liveOrderService;
-
-    @Autowired
-    private ILiveAfterSalesService afterSalesService;
-
-
-    @Autowired
-    private IErpOrderService erpOrderService;
-
-
-    @Autowired
-    private IFsExpressService expressService;
-
-
-    @Autowired
-    private ILiveOrderLogsService orderLogsService;
-
-
-//    @Autowired
-//    private FsWarehousesMapper fsWarehousesMapper;
-
-    @Autowired
-    public FsJstAftersalePushService fsJstAftersalePushService;
-
-    /**
-     * 超时订单自动取消
-     */
-    public void orderCancel(){
-        liveOrderService.orderCancel();
-    }
-
-
-    /**
-     * 发货任务
-     */
-    public void deliveryOp() {
-//        List<LiveOrder> list = liveOrderService.selectDeliverPenddingData();
-//
-//        for (LiveOrder order : list) {
-//            String orderCode = order.getOrderCode();
-//            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
-//            request.setCode(order.getExtendOrderId());
-//
-//            try {
-//                // 根据仓库code找erp
-//                if (com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())) {
-//                    String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
-//                    ErpContextHolder.setErpType(erp);
-//                }
-//                ErpOrderQueryResponse response = erpOrderService.getOrderLive(request);
-//                if (CollectionUtils.isNotEmpty(response.getOrders())) {
-//                    for (ErpOrderQuery orderQuery : response.getOrders()) {
-//                        if (CollectionUtils.isNotEmpty(orderQuery.getDeliverys())) {
-//                            // 部分发货或者全部发货
-//                            if (ObjectUtils.equals(orderQuery.getDelivery_state(), 1) || ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
-//
-//                                orderLogsService.create(order.getOrderId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
-//                                        OrderLogEnum.DELIVERY_GOODS.getDesc());
-//
-//                                for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
-//
-//                                    FsExpress express = expressService.selectFsExpressByOmsCode(delivery.getExpress_code());
-//                                    if (express == null) {
-//                                        logger.warn("当前express_code: {} 不存在!", delivery.getExpress_code());
-//                                        continue;
-//                                    }
-//
-//                                    if (delivery.getDelivery()) {
-//                                        liveOrderService.deliveryOrder(orderCode, delivery.getMail_no(),
-//                                                delivery.getExpress_code(), delivery.getExpress_name());
-//                                    }
-//                                }
-//
-//                                logger.info("订单 {} 发货信息同步成功", order.getOrderCode());
-//                            }
-//                        }
-//                    }
-//                }
-//            } catch (Exception e) {
-//                logger.error(String.format("[发货任务]调用erp查询接口失败!原因: %s", e));
-//            }
-//
-//        }
-    }
-
-
-        /**
-         * 退款自动处理 24小时未审核自动审核通过 每小时执行一次
-         */
-    public void refundOp() {
-        //获取所有退款申请
-        List<LiveAfterSales> list = afterSalesService.selectLiveAfterSalesByDoAudit();
-        if (list != null) {
-            for (LiveAfterSales afterSales : list) {
-                //仅退款
-//                if (afterSales.getServiceType().equals(0)) {
-                LiveAfterSalesAudit1Param audit1Param = new LiveAfterSalesAudit1Param();
-                audit1Param.setSalesId(afterSales.getId());
-                audit1Param.setOperator("平台");
-                afterSalesService.audit1(audit1Param);
-//                }
-            }
-        }
-    }
-
-    /**
-     * 批量推管易
-     * @throws ParseException 解析异常
-     */
-    public void updateOrderItem() throws ParseException {
-        List<Long> ids = liveOrderService.selectOrderIdByNoErp();
-        for (Long id : ids) {
-            try{
-                liveOrderService.createOmsOrder(id);
-            }catch (Exception e){
-                logger.error("推送管易失败 {}",id,e);
-            }
-        }
-    }
-
-
-    /**
-     * 同步物流状态
-     */
-    public void syncExpress() {
-        List<Long> ids = liveOrderService.selectSyncExpressIds();
-        for (Long id : ids) {
-            liveOrderService.syncExpress(id);
-        }
-    }
-
-    /**
-     * 更新发货状态
-     */
-    public void updateExpress() {
-        List<LiveOrder> list = liveOrderService.selectUpdateExpress();
-
-        for (LiveOrder order : list) {
-            try{
-                liveOrderService.syncDeliveryOrder(order);
-            }catch (Exception e) {
-                logger.error("获取订单是否发货失败!原因: ",e);
-            }
-        }
-
-    }
-}

+ 30 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -9,7 +9,9 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyMiniappService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.dto.BatchSendCourseDTO;
@@ -31,6 +33,7 @@ import com.fs.im.service.IFsImMsgSendDetailService;
 import com.fs.im.service.IFsImMsgSendLogService;
 import com.fs.im.service.OpenIMService;
 import com.fs.im.vo.FsImMsgSendLogVO;
+import com.fs.live.service.ILiveService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -76,6 +79,11 @@ public class FsUserCourseVideoController extends AppBaseController {
 
     @Autowired
     private IFsImMsgSendLogService imMsgSendLogService;
+    @Autowired
+    private ILiveService liveService;
+
+    @Autowired
+    private ICompanyMiniappService companyMiniappService;
 
     @Login
     @GetMapping("/pageList")
@@ -88,7 +96,19 @@ public class FsUserCourseVideoController extends AppBaseController {
         PageInfo<FsUserCourseVideoPageListVO> pageInfo = new PageInfo<>(list);
         return ResponseResult.ok(pageInfo);
     }
+    @Login
+    @ApiOperation("获取看课使用小程序")
+    @GetMapping("/getLoginMiniAppId/{appId}")
+    public R getLoginMiniAppId(@PathVariable String appId) {
+        CompanyMiniapp params =  new CompanyMiniapp();
+        params.setCompanyId(getCompanyId());
+        List<CompanyMiniapp> miniApps = companyMiniappService.selectCompanyMiniappList(params);
+        if (miniApps != null) {
+            appId = miniApps.stream().min(Comparator.comparing(CompanyMiniapp::getSortNum)).map(CompanyMiniapp::getAppId).orElse(appId);
+        }
 
+        return R.ok().put("data", appId);
+    }
     @Login
     @ApiOperation("课程视频详情")
     @GetMapping(value = "/videoDetails")
@@ -270,6 +290,16 @@ public class FsUserCourseVideoController extends AppBaseController {
         return ResponseResult.ok(courseLinkService.getGotoWxAppLink(linkStr,appid));
     }
 
+    /**
+     * 获取跳转微信小程序的链接地址
+     */
+    @Login
+    @GetMapping("/getGotoWxAppLiveLink")
+    @ApiOperation("获取跳转微信小程序直播的链接地址")
+    public ResponseResult<String> getGotoWxAppLiveLink(String linkStr,String appid) {
+        return ResponseResult.ok(liveService.getGotoWxAppLiveLink(linkStr,appid));
+    }
+
     @ApiOperation("会员批量发送课程消息")
     @PostMapping("/batchSendCourse")
     public OpenImResponseDTO batchSendCourse(@RequestBody BatchSendCourseDTO batchSendCourseDTO) throws JsonProcessingException {

+ 3 - 3
fs-company/src/main/java/com/fs/company/controller/live/LiveController.java

@@ -314,9 +314,9 @@ public class LiveController extends BaseController
         String url="https://api.weixin.qq.com/cgi-bin/stable_token";
         HashMap<String, String> map = new HashMap<>();
         map.put("grant_type","client_credential");
-        // 芳华惠选
-        map.put("appid","wx503cf8ab31f83dd4");
-        map.put("secret","1ba1972363889dcb4a37ecb685744435");
+        // 百域承品
+        map.put("appid","wx44beed5640bcb1ba");
+        map.put("secret","1bfcfa420f741801575a74d94752d014");
         String accessToken = HttpUtils.endApi(url, null, map);
         // 创建Gson对象
         Gson gson = new Gson();

+ 4 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyService.java

@@ -193,4 +193,8 @@ public interface ICompanyService
     List<CompanyVO> liveShowList(CompanyParam param);
 
     void batchUpdateLiveShow(CompanyLiveShowParam param);
+
+    void addCompanyTuiLiveMoney(LiveOrder order);
+
+    void subLiveCompanyMoney(LiveOrder order);
 }

+ 49 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -35,6 +35,7 @@ import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.domain.FsStorePaymentScrm;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.live.domain.LiveOrder;
+import com.fs.live.mapper.LiveOrderMapper;
 import com.fs.live.service.ILiveService;
 import com.fs.store.config.CompanyMenuConfig;
 import com.fs.system.domain.SysConfig;
@@ -52,6 +53,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.fs.company.service.ICompanyService;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionTemplate;
 
@@ -119,6 +121,8 @@ public class CompanyServiceImpl implements ICompanyService
 
     @Autowired
     private ILiveService liveService;
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
 
 
     @Override
@@ -132,6 +136,51 @@ public class CompanyServiceImpl implements ICompanyService
         liveService.asyncToCache();
     }
 
+    @Override
+    @Transactional
+    public void addCompanyTuiLiveMoney(LiveOrder order) {
+        if(order.getCompanyId()!=null&&order.getCompanyId()>0){
+            Company company=companyMapper.selectCompanyByIdForUpdate(order.getCompanyId());
+            if(company!=null){
+                String json =configService.selectConfigByKey("store.config");
+                com.fs.store.config.StoreConfig config= JSONUtil.toBean(json, com.fs.store.config.StoreConfig.class);
+                //支付金额-(订单金额*rate%)
+                Double rate=config.getTuiMoneyRate()/100d;
+                BigDecimal tuiMoney=order.getPayPrice().subtract(order.getTotalPrice().multiply(new BigDecimal(rate)));
+                logger.info("写入公司推广佣金:"+tuiMoney);
+                company.setTuiMoney(company.getTuiMoney().add(tuiMoney));
+                companyMapper.updateCompany(company);
+                LiveOrder storeOrderMap=new LiveOrder();
+                storeOrderMap.setOrderId(order.getOrderId());
+                storeOrderMap.setTuiMoney(tuiMoney);
+                liveOrderMapper.updateLiveOrder(storeOrderMap);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public void subLiveCompanyMoney(LiveOrder order) {
+        if(order.getCompanyId()>0){
+            Company company=companyMapper.selectCompanyByIdForUpdate(order.getCompanyId());
+            if(company!=null){
+                company.setMoney(company.getMoney().subtract(order.getTuiMoney()));
+                company.setTuiMoney(company.getTuiMoney().subtract(order.getTuiMoney()));
+                companyMapper.updateCompany(company);
+                //写入日志
+                CompanyMoneyLogs log=new CompanyMoneyLogs();
+                log.setCompanyId(order.getCompanyId());
+                log.setRemark("订单佣金退款");
+                log.setMoney(order.getTuiMoney().multiply(new BigDecimal(-1)));
+                log.setLogsType(5);
+                log.setBalance(company.getMoney());
+                log.setCreateTime(new Date());
+                log.setBusinessId(order.getOrderId().toString());
+                moneyLogsMapper.insertCompanyMoneyLogs(log);
+            }
+        }
+    }
+
     @Override
     public List<OptionsVO> selectAllCompanyList(Long deptId) {
         return companyMapper.selectAllCompanyList(deptId);

+ 5 - 0
fs-service/src/main/java/com/fs/course/config/CourseConfig.java

@@ -42,6 +42,8 @@ public class CourseConfig implements Serializable {
     private Integer delayEnd;
     private Integer isNegative;//是否为负数 0、不允许,1、允许
 
+    private Integer isOpen;
+
     /**
      * 侧边栏是否仅展示当天课程
      */
@@ -92,6 +94,9 @@ public class CourseConfig implements Serializable {
      */
     private String isRedPackageBalanceDeduction;
 
+    // 控制休息提示是否打开 默认打开 0-关闭 1-打开
+    private Integer isOpenRestReminder;
+
 
     @Data
     public static class DisabledTimeVo{

+ 2 - 1
fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriod.java

@@ -117,5 +117,6 @@ public class FsUserCoursePeriod
      * 营期线,即营期首次播放课程的日期
      */
     private Date periodLine;
-
+    /** 是否需要单独注册会员,1-是,0-否(用于个微销售分享看课) */
+    private Integer isNeedRegisterMember;
 }

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

@@ -604,17 +604,31 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         if(qwGroupChatUsers == null || qwGroupChatUsers.isEmpty()){
             return R.error("群参数异常");
         }
-        //修改成通过昵称匹配
         QwExternalContact qwExternalContact =
                 qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
                         .eq("user_id", qwGroupChat.getOwner())
-                        .eq("name", user.getNickName())
+                        .eq("fs_user_id", param.getUserId())
                         .eq("corp_id", param.getCorpId())
                         .eq("status",0));
+        if(null == qwExternalContact){
+            try{
+                //修改成通过昵称匹配
+                qwExternalContact =
+                        qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+                                .eq("user_id", qwGroupChat.getOwner())
+                                .eq("name", user.getNickName())
+                                .eq("corp_id", param.getCorpId())
+                                .eq("status",0));
+            } catch(Exception e){
+                log.error("群聊用户昵称匹配异常,参数user_id:{},name:{},corp_id:{}",qwGroupChat.getOwner(),user.getNickName(),param.getCorpId(),e);
+            }
+
+        }
         if(qwExternalContact==null){
             return addCustomerService(param.getQwUserId(),msg);
         }
-        if(qwGroupChatUsers.stream().noneMatch(e -> e.getUserId().equals(qwExternalContact.getExternalUserId()))){
+        QwExternalContact finalQwExternalContact = qwExternalContact;
+        if(qwGroupChatUsers.stream().noneMatch(e -> e.getUserId().equals(finalQwExternalContact.getExternalUserId()))){
             log.error("客户不在群:{},里面:{}", qwGroupChat.getChatId(), qwExternalContact.getExternalUserId());
             return addCustomerService(param.getQwUserId(),msg);
         }
@@ -2143,7 +2157,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         if(Objects.isNull(courseProject)){
             return ResponseResult.fail(504, "课程配置错误,项目归属为空,课程ID: " + param.getCourseId());
         }
-
+        FsUserCoursePeriod fsUserCoursePeriod = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(param.getPeriodId());
         FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(fsUser.getUserId(), courseProject);
 
         // 添加逻辑:如果存在fs_user表数据,但是又不存在fs_user_company_user表,则表示是以前企微看课的,需要手动绑定
@@ -2152,10 +2166,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 userCompanyUser = userCompanyUserService.bindRelationship(fsUser.getUserId(), courseProject, param.getCompanyId(), param.getCompanyUserId(), 1);
             }else {
                 Company company = companyService.selectCompanyById(param.getCompanyId());
+
                 if((companyUser.getIsAllowedAllRegister() !=null && companyUser.getIsAllowedAllRegister() != 1)){
                     return ResponseResult.fail(504,"当前销售禁止绑定会员,请联系销售!");
                 }
-                if (companyUser.getIsNeedRegisterMember() == null || companyUser.getIsNeedRegisterMember() == 1){
+                if (companyUser.getIsNeedRegisterMember() == null || companyUser.getIsNeedRegisterMember() == 1
+                        ||(ObjectUtils.isNotEmpty(fsUserCoursePeriod)
+                        &&ObjectUtils.isNotEmpty(fsUserCoursePeriod.getIsNeedRegisterMember())
+                        &&fsUserCoursePeriod.getIsNeedRegisterMember().equals(1))){
                     return ResponseResult.fail(504,"请联系销售发送邀请链接成为会员!");
                 }
                 int defaultStatus = (company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1;
@@ -2387,15 +2405,19 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         } else {
             duration = Objects.isNull(watchLog) ? 0 : watchLog.getDuration();
         }
-//
-        if (courseVideoDetails != null && courseVideoDetails.getDuration() != null){
-            // 查询视频是否设置了红包,没有就不提示
-            Integer fsUserCourseVideoRedPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyCount(param.getVideoId(), null, param.getPeriodId());
-            if(fsUserCourseVideoRedPackage>0){
-                tipsTime = courseVideoDetails.getDuration() / 3;
-                tipsTime2 = (courseVideoDetails.getDuration() * 2) / 3;
+
+        // 2025-11-16 鹤颜堂 xgb 添加配置控制休息提示是否打开要暂停 默认打开 0-关闭 1-打开
+        if(config.getIsOpenRestReminder()==null || config.getIsOpenRestReminder()==1 ){
+            if (courseVideoDetails != null && courseVideoDetails.getDuration() != null){
+                // 查询视频是否设置了红包,没有就不提示
+                Integer fsUserCourseVideoRedPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyCount(param.getVideoId(), null, param.getPeriodId());
+                if(fsUserCourseVideoRedPackage>0){
+                    tipsTime = courseVideoDetails.getDuration() / 3;
+                    tipsTime2 = (courseVideoDetails.getDuration() * 2) / 3;
+                }
             }
         }
+
         vo.setTipsTime(tipsTime);
         vo.setTipsTime2(tipsTime2);
         //判断是否完课

+ 2 - 1
fs-service/src/main/java/com/fs/course/vo/FsUserCoursePeriodVO.java

@@ -88,5 +88,6 @@ public class FsUserCoursePeriodVO implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "营期线", width = 31, dateFormat = "yyyy-MM-dd")
     private Date periodLine;
-
+    /** 是否需要单独注册会员,1-是,0-否(用于个微销售分享看课) */
+    private Integer isNeedRegisterMember;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/erp/domain/ErpOrder.java

@@ -34,4 +34,5 @@ public class ErpOrder {
     List<ErpOrderPayment> payments;
 
     String buyer_account;
+    Boolean isIntegralOrder;
 }

+ 7 - 0
fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java

@@ -5,6 +5,7 @@ import com.fs.erp.domain.ErpRefundOrder;
 import com.fs.erp.dto.*;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.live.domain.LiveOrder;
 
 public interface IErpOrderService
 {
@@ -13,19 +14,25 @@ public interface IErpOrderService
 
     ErpOrderResponse addOrderScrm(ErpOrder order);
 
+    ErpOrderResponse addLiveOrder(ErpOrder order);
+
     //用户发起退款,然后后台审核通过后,提交退款单
     ErpOrderResponse refundOrder(ErpRefundOrder order);
     ErpOrderResponse refundOrderScrm(ErpRefundOrder order);
+    ErpOrderResponse refundLiveOrder(ErpRefundOrder order);
     ErpDeliverysResponse getDeliver(ErpDeliverysRequest param);
     ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param);
     ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param);
+    ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param);
     BaseResponse refundUpdate(ErpRefundUpdateRequest param);
     BaseResponse refundUpdateScrm(ErpRefundUpdateRequest param);
+    BaseResponse refundUpdateLive(ErpRefundUpdateRequest param);
 
     ErpOrderResponse finishOrder(ErpOrder order);
     //代服管家查物流状态
     void getOrderDeliveryStatus(FsStoreOrder order);
 
     void getOrderScrmDeliveryStatus(FsStoreOrderScrm order);
+    void getOrderLiveDeliveryStatus(LiveOrder order);
 }
 

+ 903 - 55
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.erp.service.impl;
 
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
@@ -7,6 +8,7 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.event.TemplateBean;
 import com.fs.common.event.TemplateEvent;
@@ -15,6 +17,7 @@ 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.ErpOrderItem;
 import com.fs.erp.domain.ErpRefundOrder;
 import com.fs.erp.dto.*;
 import com.fs.erp.dto.df.*;
@@ -30,6 +33,7 @@ import com.fs.his.enums.FsStoreOrderStatusEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.FsStoreOrderSalesParam;
 import com.fs.his.service.IFsExpressService;
+import com.fs.his.service.IFsIntegralOrderService;
 import com.fs.his.service.IFsStoreOrderLogsService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.his.utils.ConfigUtil;
@@ -47,6 +51,10 @@ import com.fs.hisStore.param.FsStoreAfterSalesParam;
 import com.fs.hisStore.service.IFsExpressScrmService;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwUserMapper;
@@ -69,6 +77,7 @@ import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -147,10 +156,19 @@ public class DfOrderServiceImpl implements IErpOrderService {
     private IFastGptRoleService fastGptRoleService;
     @Autowired
     private WxWorkService wxWorkService;
+    @Autowired
+    private FsIntegralOrderMapper fsIntegralOrderMapper;
+
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
 
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
 
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
+        if (!Objects.isNull(order.getIsIntegralOrder()) && order.getIsIntegralOrder())
+            return getErpIntegralOrderResponse(order);
         return getErpOrderResponse(order);
     }
 
@@ -159,6 +177,55 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return getScrmErpOrderResponse(order);
     }
 
+    @Override
+    public ErpOrderResponse addLiveOrder(ErpOrder order) {
+        return getLiveErpOrderResponse(order);
+    }
+
+    private ErpOrderResponse getLiveErpOrderResponse(ErpOrder order) {
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(order.getPlatform_code());
+        if (liveOrder == null) {
+            return null;
+        }
+        Long dfAccountId = getSFAccountIndex(liveOrder.getOrderId());
+        //1.获取请求参数
+        ExternalOrderRequestVo vo = getCreateLiveOrderRequestParam(order, liveOrder, dfAccountId);
+        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, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                //存储订单推送用的哪个账户
+                FsStoreOrderDf df = addDfOrderLive(liveOrder, dfAccountId);
+                log.info("订单推送成功: {}", response);
+                //可以回调 也可以查询订单
+                Map<String, Object> orderResultQueryParam = new HashMap<>();
+                orderResultQueryParam.put("orderNumber", order.getPlatform_code());
+                orderResultQueryParam.put("exInterfaceType", df.getStatus());
+                try {
+                    getOrderLiveResult(orderResultQueryParam, dfAccountId);
+                } catch (Exception e) {
+                    log.info("推送订单完成,查询订单问题{}", e.getMessage());
+                }
+                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();
+    }
+
     /**
      * 退款 取消订单
      *
@@ -269,6 +336,54 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return new ErpOrderResponse();
     }
 
+    @Override
+    public ErpOrderResponse refundLiveOrder(ErpRefundOrder order) {
+        //获取代服账户
+        String orderCode = order.getOrderCode();
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(orderCode);
+        FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(liveOrder.getOrderId());
+        if (df == null) {
+            return null;
+        }
+        Long dfAccountId = getSFAccountIndex(liveOrder.getOrderId());
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("loginAccount", df.getLoginAccount());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        if (dfAccount != null && StringUtils.isNotBlank(dfAccount.getCallBackUrl())) {
+            map.put("callBackUrl", dfAccount.getCallBackUrl());
+        }
+        map.put("orderNumber", orderCode);
+        map.put("mailNumber", liveOrder.getDeliverySn());
+        try {
+            //2.请求
+            log.info("开始取消订单,参数: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_CANCEL, map, dfAccountId);
+            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为查询取消订单结果
+                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();
@@ -335,7 +450,8 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return erpDeliverysResponse;
     }
 
-
+    @Autowired
+    private FsIntegralOrderDfMapper integralOrderDfMapper;
     /**
      * 目前仅查询下单用户
      *
@@ -347,19 +463,67 @@ public class DfOrderServiceImpl implements IErpOrderService {
         ErpOrderQueryResponse response = new ErpOrderQueryResponse();
         String orderNumber = requset.getCode();
         if (StrUtil.isNotBlank(orderNumber)) {
-            FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+            //金牛积分商品的逻辑
+            if (OrderContextHolder.hasIntegralOrder()) {
+                FsIntegralOrder order = fsIntegralOrderMapper.selectOne(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getOrderCode, orderNumber));
+                if (order != null) {
+                    //获取下单账户
+                    FsIntegralOrderDf df = integralOrderDfMapper.selectOne(Wrappers.<FsIntegralOrderDf>lambdaQuery().eq(FsIntegralOrderDf::getOrderId,order.getOrderId()));
+                    if (df == null) {
+                        return null;
+                    }
+                    Long dfAccountId = getSFAccountIndex(order.getOrderId());
+                    if (dfAccountId != null) {
+                        Map<String, Object> orderResultQueryParam = new HashMap<>();
+                        orderResultQueryParam.put("orderNumber", orderNumber);
+                        orderResultQueryParam.put("exInterfaceType", df.getStatus());
+                        getIntegralOrderResult(orderResultQueryParam, dfAccountId);
+                        return response;
+                    }
+                }
+            }else {
+                FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+                if (order != null) {
+                    //获取下单账户
+                    FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
+                    if (df == null) {
+                        return null;
+                    }
+                    Long dfAccountId = getSFAccountIndex(order.getOrderId());
+                    if (dfAccountId != null) {
+                        Map<String, Object> orderResultQueryParam = new HashMap<>();
+                        orderResultQueryParam.put("orderNumber", orderNumber);
+                        orderResultQueryParam.put("exInterfaceType", df.getStatus());
+                        getOrderResult(orderResultQueryParam, dfAccountId);
+                        return response;
+                    }
+                }
+            }
+            response.setErrorDesc("该订单不存在/顺丰账户不存在");
+        } else {
+            response.setErrorDesc("未获取到原始订单号");
+        }
+        return response;
+    }
+
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+        String orderNumber = param.getCode();
+        if (StrUtil.isNotBlank(orderNumber)) {
+            FsStoreOrderScrm order = fsStoreOrderScrmMapper.selectFsStoreOrderByOrderCode(orderNumber);
             if (order != null) {
                 //获取下单账户
-                FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
+                FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getId());
                 if (df == null) {
                     return null;
                 }
-                Long dfAccountId = getSFAccountIndex(order.getOrderId());
+                Long dfAccountId = getSFAccountIndex(order.getId());
                 if (dfAccountId != null) {
                     Map<String, Object> orderResultQueryParam = new HashMap<>();
                     orderResultQueryParam.put("orderNumber", orderNumber);
                     orderResultQueryParam.put("exInterfaceType", df.getStatus());
-                    getOrderResult(orderResultQueryParam, dfAccountId);
+                    getOrderScrmResult(orderResultQueryParam, dfAccountId);
                     return response;
                 }
             }
@@ -371,23 +535,23 @@ public class DfOrderServiceImpl implements IErpOrderService {
     }
 
     @Override
-    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+    public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
         ErpOrderQueryResponse response = new ErpOrderQueryResponse();
         String orderNumber = param.getCode();
         if (StrUtil.isNotBlank(orderNumber)) {
-            FsStoreOrderScrm order = fsStoreOrderScrmMapper.selectFsStoreOrderByOrderCode(orderNumber);
+            LiveOrder order = liveOrderMapper.selectLiveOrderByOrderCode(orderNumber);
             if (order != null) {
                 //获取下单账户
-                FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getId());
+                FsStoreOrderDf df = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(order.getOrderId());
                 if (df == null) {
                     return null;
                 }
-                Long dfAccountId = getSFAccountIndex(order.getId());
+                Long dfAccountId = getSFAccountIndex(order.getOrderId());
                 if (dfAccountId != null) {
                     Map<String, Object> orderResultQueryParam = new HashMap<>();
                     orderResultQueryParam.put("orderNumber", orderNumber);
                     orderResultQueryParam.put("exInterfaceType", df.getStatus());
-                    getOrderScrmResult(orderResultQueryParam, dfAccountId);
+                    getOrderLiveResult(orderResultQueryParam, dfAccountId);
                     return response;
                 }
             }
@@ -412,6 +576,13 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return refundOrderScrm(erpRefundOrder);
     }
 
+    @Override
+    public BaseResponse refundUpdateLive(ErpRefundUpdateRequest param) {
+        ErpRefundOrder erpRefundOrder = new ErpRefundOrder();
+        erpRefundOrder.setOrderCode(param.getTid());
+        return refundLiveOrder(erpRefundOrder);
+    }
+
     @Override
     public ErpOrderResponse finishOrder(ErpOrder order) {
         return null;
@@ -430,7 +601,11 @@ public class DfOrderServiceImpl implements IErpOrderService {
             if ("运单不存在".equals(dfApiResponse.getMsg())) {
 
                 //查看原来物流状态
-                cancelOrder(order);
+                if (OrderContextHolder.hasIntegralOrder()) {
+                    cancelOrder(OrderContextHolder.getIntegralOrder());
+                }else {
+                    cancelOrder(order);
+                }
                 log.info("代服管家 getOrderDeliveryStatus: {}", response);
                 return;
             }
@@ -489,18 +664,39 @@ public class DfOrderServiceImpl implements IErpOrderService {
                         Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
                         Object isUpdateOrder = config.get("isUpdateOrder");
                         if (isUpdateOrder == null || "1".equals(isUpdateOrder.toString())) {
+                            if (OrderContextHolder.hasIntegralOrder()) {
+                                FsIntegralOrder integralOrder = OrderContextHolder.getIntegralOrder();
+                                //积分订单修改状态已完成
+                                integralOrder.setStatus(3);//设置已完成状态
+                                int i = fsIntegralOrderMapper.updateById(integralOrder);
+                                log.info("积分订单编号{}完成订单,更新条数{}",integralOrder.getOrderCode(),i);
+                            }else {
+//                                fsStoreOrderService.getGoods(order.getOrderId(), "物流自动");
                             fsStoreOrderService.getGoods(orderId, "物流自动");
+                            }
                         }
                         break;
                     case 10:
                         //取消订单
                         String mailNumber = temp.getMailNumber();
-                        List<FsStoreOrder> fsStoreOrders = fsStoreOrderMapper.selectFsStoreOrderListByDeliverySn(mailNumber);
-                        if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
-                            fsStoreOrders.forEach(tempOrder -> {
-                                cancelOrder(order);
-                                log.info("代服管家 订单取消成功: {}", response);
-                            });
+                        if (OrderContextHolder.hasIntegralOrder()) {
+                            List<FsIntegralOrder> orders = fsIntegralOrderMapper.selectList(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getDeliverySn, mailNumber));
+                            if (orders != null && !orders.isEmpty()) {
+                                orders.forEach(tempOrder->{
+                                    log.info("订单状态查询取消订单{}",tempOrder.getOrderCode());
+                                    cancelOrder(tempOrder);
+                                    log.info("代服管家 订单取消成功: {}", response);
+                                });
+
+                            }
+                        }else {
+                            List<FsStoreOrder> fsStoreOrders = fsStoreOrderMapper.selectFsStoreOrderListByDeliverySn(mailNumber);
+                            if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
+                                fsStoreOrders.forEach(tempOrder -> {
+                                    cancelOrder(order);
+                                    log.info("代服管家 订单取消成功: {}", response);
+                                });
+                            }
                         }
                         break;
                 }
@@ -514,9 +710,18 @@ public class DfOrderServiceImpl implements IErpOrderService {
                 }
 
 
-                fsStoreOrderMap.setDeliveryStatus(deliveryStatus); //物流状态:0-暂无轨迹信息 1-已揽收 2-在途中,3-签收,4-问题件
-                fsStoreOrderMap.setDeliveryType(stateEx);
-                fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrderMap);
+                if (OrderContextHolder.hasIntegralOrder()){
+                    //加积分订单的字段,然后在这里更新它
+                    FsIntegralOrder integralOrder = OrderContextHolder.getIntegralOrder();
+                    integralOrder.setDeliveryStatus(deliveryStatus);
+                    integralOrder.setDeliveryType(stateEx);
+                    int i = fsIntegralOrderMapper.updateById(integralOrder);
+                    log.info("更新订单{}物流状态为{}and{}更新条数{}",integralOrder.getOrderCode(),deliveryStatus,stateEx,i);
+                }else {
+                    fsStoreOrderMap.setDeliveryStatus(deliveryStatus); //物流状态:0-暂无轨迹信息 1-已揽收 2-在途中,3-签收,4-问题件
+                    fsStoreOrderMap.setDeliveryType(stateEx);
+                    fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrderMap);
+                }
             }
         } catch (IOException e) {
             e.printStackTrace();
@@ -703,8 +908,102 @@ public class DfOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    @Override
+    public void getOrderLiveDeliveryStatus(LiveOrder order) {
+        Map<String, Object> map = new HashMap<>();
+        Long dfAccountId = getSFAccountIndex(order.getOrderId());
+        map.put("orderNumber", order.getOrderCode());
+        map.put("mailNumber", order.getDeliverySn());
+        try {
+            String response = client.execute(RequestUrlEnum.ORDER_DELIVERY_STATUS, map, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            if ("运单不存在".equals(dfApiResponse.getMsg())) {
+                //查看原来物流状态
+                cancelOrderLive(order);
+                log.info("代服管家 getOrderDeliveryStatus: {}", response);
+                return;
+            }
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                String jsonString = JSON.toJSONString(dfApiResponse.getResult());
+                DFOrderStatusResultRequest temp = JSON.parseObject(jsonString, DFOrderStatusResultRequest.class);
+                //0待揽收 1已揽收 2运输中 3派送中 4异常件 5退回件 6退回签收 7转寄件 8作废件 9已签收 10 已取消
+                Integer deliveryStatus = 0;
+                String stateEx = "0";
+                LiveOrder liveOrderMap = new LiveOrder();
+                liveOrderMap.setOrderId(order.getOrderId());
+                Integer status = temp.getStatus();
+                switch (status) {
+                    case 0:
+                    case 1:
+                    case 2:
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 3:
+                        deliveryStatus = 2;
+                        stateEx = "202";
+                        break;
+                    case 4:
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 5:
+                        deliveryStatus = 4;
+                        stateEx = "407";
+                        break;
+                    case 6:
+                        deliveryStatus = status;
+                        stateEx = "406";
+                        break;
+                    case 9:
+                        deliveryStatus = 3;
+                        stateEx = "301";
+                        break;
+                    case 10:
+                        String mailNumber = temp.getMailNumber();
+                        List<LiveOrder> liveOrders = liveOrderMapper.selectLiveOrderList(new LiveOrder() {{
+                            setDeliverySn(mailNumber);
+                        }});
+                        if (liveOrders != null && !liveOrders.isEmpty()) {
+                            liveOrders.forEach(tempOrder -> {
+                                cancelOrderLive(tempOrder);
+                                log.info("代服管家 订单取消成功: {}", response);
+                            });
+                        }
+                        break;
+                }
+                liveOrderMap.setDeliveryStatus(deliveryStatus);
+                liveOrderMap.setDeliveryType(stateEx);
+                liveOrderMapper.updateLiveOrder(liveOrderMap);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void cancelOrderLive(LiveOrder order) {
+        Integer deliveryStatus = order.getDeliveryStatus();
+        if (deliveryStatus == null || deliveryStatus == 0) {
+            //没有物流信息
+            //修改订单状态 方便后续重新发货
+            order.setStatus(1);
+            order.setExtendOrderId("");
+            order.setDeliverySn("");
+            liveOrderMapper.updateLiveOrder(order);
+        } else {
+            //有物流信息->售后处理
+            //取消订单
+            // TODO: 实现直播订单退款逻辑
+        }
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(order.getOrderId());
+        df.setStatus(2);
+        df.setUpdateTime(new Date());
+        fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+    }
+
     private void cancelOrder(FsStoreOrder order) {
-        Long orderId = order.getOrderId();
         Integer deliveryStatus = order.getDeliveryStatus();
         if (deliveryStatus == null || deliveryStatus == 0) {
             //没有物流信息
@@ -713,26 +1012,55 @@ public class DfOrderServiceImpl implements IErpOrderService {
             order.setExtendOrderId("");
             order.setDeliverySn("");
             fsStoreOrderMapper.updateFsStoreOrder(order);
-            fsStoreOrderLogsService.create(orderId, FsStoreOrderLogEnum.UPDATE_ORDER_DF.getValue(),
+            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.UPDATE_ORDER_DF.getValue(),
                     "运单不存在," + FsStoreOrderLogEnum.UPDATE_ORDER_DF.getDesc());
         } else {
             //有物流信息->售后处理
             //取消订单
             FsStoreOrderSalesParam afterSalesParam = new FsStoreOrderSalesParam();
-            afterSalesParam.setOrderId(orderId);
+            afterSalesParam.setOrderId(order.getOrderId());
             afterSalesParam.setReasons("代服管家取消订单");
             afterSalesParam.setOperator("代服管家");
             fsStoreOrderService.afterSales(afterSalesParam);
-            fsStoreOrderLogsService.create(orderId, FsStoreOrderLogEnum.REFUND_ORDER_DF.getValue(),
+            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.REFUND_ORDER_DF.getValue(),
                     "运单不存在," + FsStoreOrderLogEnum.REFUND_ORDER_DF.getDesc());
         }
         FsStoreOrderDf df = new FsStoreOrderDf();
-        df.setOrderId(orderId);
+        df.setOrderId(order.getOrderId());
         df.setStatus(2);
         df.setUpdateTime(new Date());
         fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
     }
 
+    @Autowired
+    private IFsIntegralOrderService integralOrderService;
+    /**
+     * 积分订单商品取消订单逻辑
+     * */
+    private void cancelOrder(FsIntegralOrder order) {
+        //进入这个方法代表查询不到物流信息
+        Integer deliveryStatus = order.getDeliveryStatus();
+        //这个if进入代表调用代服创建运单失败,修改推送标识,由定时任务重新推送erp
+        if (deliveryStatus == null || deliveryStatus == 0) {
+            log.info("推送失败积分订单id:{}",order.getOrderId());
+            //没有物流信息
+            //修改订单状态 方便后续重新发货,让机器重新去
+            order.setStatus(1);//设置待发货状态
+            order.setDeliverySn("");
+            integralOrderMapper.updateById(order);
+        } else {
+            log.info("积分订单物流被取消,退款积分订单{}",order.getOrderCode());
+            //以前查询到过物流信息,现在查不到,物流被人为取消
+            integralOrderService.mandatoryRefunds(order.getOrderCode());
+        }
+        log.info("取消订单代服记录更新id{}",order.getOrderCode());
+        FsIntegralOrderDf df = new FsIntegralOrderDf();
+        df.setOrderId(order.getOrderId());
+        df.setStatus(2);
+        df.setIsPush(0);
+        integralOrderDfMapper.updateById(df);
+    }
+
     private void cancelOrderScrm(FsStoreOrderScrm order) {
         Integer deliveryStatus = order.getDeliveryStatus();
         if (deliveryStatus == null || deliveryStatus == 0) {
@@ -866,37 +1194,84 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return new ErpOrderResponse();
     }
 
-    private @NotNull FsStoreOrderDf addDfOrderScrm(FsStoreOrderScrm fsStoreOrder, Long dfAccountId) {
-        FsStoreOrderDf df = new FsStoreOrderDf();
-        df.setOrderId(fsStoreOrder.getId());
-        df.setOrderCode(fsStoreOrder.getOrderCode());
-        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
-        df.setAppKey(dfAccount.getDfAppKey());
-        df.setAppSecret(dfAccount.getDfAppsecret());
-        df.setLoginAccount(dfAccount.getLoginAccount());
-        df.setMonthlyCard(dfAccount.getMonthlyCard());
-        df.setExpressProductCode(dfAccount.getExpressProductCode());
-        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;
-    }
+    @Autowired
+    private FsIntegralOrderMapper integralOrderMapper;
 
-    private @NotNull FsStoreOrderDf addDfOrder(FsStoreOrder fsStoreOrder, Long dfAccountId) {
-        FsStoreOrderDf df = new FsStoreOrderDf();
-        df.setOrderId(fsStoreOrder.getOrderId());
-        df.setOrderCode(fsStoreOrder.getOrderCode());
-        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+    private ErpOrderResponse getErpIntegralOrderResponse(ErpOrder order){
+        FsIntegralOrder fsIntegralOrder = integralOrderMapper.selectOne(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getOrderCode, order.getPlatform_code()));
+        if (fsIntegralOrder == null) {
+            return null;
+        }
+        Long dfAccountId = getSFAccountIndex(fsIntegralOrder.getOrderId());
+        //1.获取请求参数
+        ExternalOrderRequestVo vo = getCreateOrderRequestParam(order, fsIntegralOrder, dfAccountId);
+        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, dfAccountId);
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                //存储订单推送用的哪个账户
+                FsIntegralOrderDf df = addDfOrder(fsIntegralOrder, dfAccountId);
+                log.info("订单推送成功: {}", response);
+                //可以回调 也可以查询订单
+                Map<String, Object> orderResultQueryParam = new HashMap<>();
+                orderResultQueryParam.put("orderNumber", order.getPlatform_code());
+                orderResultQueryParam.put("exInterfaceType", df.getStatus());
+                try {
+                    getIntegralOrderResult(orderResultQueryParam, dfAccountId);
+                } catch (Exception e) {
+                    log.info("推送订单完成,查询订单问题{}", e.getMessage());
+                }
+                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 addDfOrderScrm(FsStoreOrderScrm fsStoreOrder, Long dfAccountId) {
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(fsStoreOrder.getId());
+        df.setOrderCode(fsStoreOrder.getOrderCode());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        df.setAppKey(dfAccount.getDfAppKey());
+        df.setAppSecret(dfAccount.getDfAppsecret());
+        df.setLoginAccount(dfAccount.getLoginAccount());
+        df.setMonthlyCard(dfAccount.getMonthlyCard());
+        df.setExpressProductCode(dfAccount.getExpressProductCode());
+        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;
+    }
+
+    private @NotNull FsStoreOrderDf addDfOrder(FsStoreOrder fsStoreOrder, Long dfAccountId) {
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(fsStoreOrder.getOrderId());
+        df.setOrderCode(fsStoreOrder.getOrderCode());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
         df.setAppKey(dfAccount.getDfAppKey());
         df.setAppSecret(dfAccount.getDfAppsecret());
         df.setLoginAccount(dfAccount.getLoginAccount());
@@ -918,6 +1293,38 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return df;
     }
 
+    private @NotNull FsIntegralOrderDf addDfOrder(FsIntegralOrder fsIntegralOrder, Long dfAccountId){
+//        FsStoreOrderDf df = new FsStoreOrderDf();
+        FsIntegralOrderDf df = new FsIntegralOrderDf();
+        df.setOrderId(fsIntegralOrder.getOrderId());
+        df.setOrderCode(fsIntegralOrder.getOrderCode());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        df.setAppKey(dfAccount.getDfAppKey());
+        df.setAppSecret(dfAccount.getDfAppsecret());
+        df.setLoginAccount(dfAccount.getLoginAccount());
+        df.setMonthlyCard(dfAccount.getMonthlyCard());
+        df.setExpressProductCode(dfAccount.getExpressProductCode());
+        df.setTotalPrice(fsIntegralOrder.getPayMoney());
+//        df.setPlatformPrice(fsStoreOrder.getPayPrice());
+        df.setPlatformPrice(BigDecimal.ZERO);
+        df.setStatus(1);
+        df.setIsPush(1);//已经创建过erp订单标识
+        //查询是否存在
+//        FsStoreOrderDf temp = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(df.getOrderId());
+        FsIntegralOrderDf temp = integralOrderDfMapper.selectById(df.getOrderId());
+        if (temp != null) {
+            //修改
+//            df.setUpdateTime(DateUtils.getNowDate());
+//            fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+            df.setUpdateTime(LocalDateTime.now());
+            integralOrderDfMapper.updateById(df);
+        } else {
+            df.setUpdateTime(LocalDateTime.now());
+            integralOrderDfMapper.insert(df);
+        }
+        return df;
+    }
+
     /**
      * 通用erpOrderScrm获取创建订单参数
      *
@@ -1131,6 +1538,109 @@ public class DfOrderServiceImpl implements IErpOrderService {
         return vo;
     }
 
+    @Autowired
+    private FsIntegralGoodsMapper fsIntegralGoodsMapper;
+
+    private ExternalOrderRequestVo getCreateOrderRequestParam(ErpOrder order, FsIntegralOrder fsIntegralOrder, Long dfAccountId) {
+        ExternalOrderRequestVo vo = new ExternalOrderRequestVo();
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        if (dfAccount == null) {
+            return null;
+        }
+        String loginAccount = dfAccount.getLoginAccount();
+        vo.setMonthlyCard(dfAccount.getMonthlyCard()); //月结卡号
+        vo.setExpressProductCode(dfAccount.getExpressProductCode()); //物流产品编码
+
+
+        vo.setLoginAccount(loginAccount); //代服系统登录账号
+        String callBackUrl = dfAccount.getCallBackUrl();
+//        if (StringUtils.isNotBlank(callBackUrl)) {//TODO:到时候写完了回调接口这里写死或者放配置里面
+//            vo.setCallBackUrl(callBackUrl); //订单下单后异步通知地址
+//        }
+//        FsStoreOrderDf temp = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(fsStoreOrder.getOrderId());
+        FsIntegralOrderDf temp = integralOrderDfMapper.selectById(fsIntegralOrder.getOrderId());
+        if (temp != null) {
+            vo.setParcelQuantity(temp.getParcelQuantity());//包裹数量
+        }
+
+        vo.setOrderNumber(order.getPlatform_code()); //订单号(不能重复)
+
+        int orderPayMethod = 1;//默认在线支付,这个只有积分支付
+//        BigDecimal couponPrice = fsIntegralOrder.getCouponPrice();
+//        if (couponPrice == null) {
+        BigDecimal couponPrice = BigDecimal.ZERO;
+//        }
+
+//        if (ObjectUtil.equal(1, fsIntegralOrder.getPayType())) {
+//            //在线支付
+//            orderPayMethod = 1;
+//        } else { // 如果是线上付款
+//            orderPayMethod = 2;
+//            // 货到付款金额 = 订单剩余支付金额
+//            vo.setCollectingMoney(fsIntegralOrder.getPayRemain().doubleValue());
+//            vo.setCollectionCardNumber(dfAccount.getMonthlyCard()); // 就是月结账号
+//        }
+        //订单付款方式 1:在线支付 2:货到付款
+        //如果填了2,代收金额必须大于0,代收卡号必填
+        vo.setOrderPayMethod(orderPayMethod);
+
+//        vo.setConsignmentNumber(Integer.valueOf(Math.toIntExact(fsIntegralOrder.getTotalNum()))); //托寄物数量 必填
+        vo.setConsignmentNumber(1);
+        vo.setBuyerMessage(fsIntegralOrder.getRemark()); //买家留言
+
+        vo.setSenderName(dfAccount.getSenderName()); //寄件人
+        vo.setSenderPhone(dfAccount.getSenderPhone()); //寄件人手机
+        vo.setSenderProvince(dfAccount.getSenderProvince());//寄件人省
+        vo.setSenderCity(dfAccount.getSenderCity());//寄件人市
+        vo.setSenderDistrict(dfAccount.getSenderDistrict());//寄件人区
+        vo.setSenderAddress(dfAccount.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());
+        List<ErpOrderItem> items = order.getDetails();
+        if (items != null && items.size() > 0) {
+            ArrayList<ExteriorOrderSkuVo> orderSkus = new ArrayList<>();
+            items.forEach(item -> {
+                ExteriorOrderSkuVo skuVo = new ExteriorOrderSkuVo();
+//                FsStoreProduct product = fsStoreProductMapper.selectFsStoreProductById(item.getProductId());
+                FsIntegralGoods goods = fsIntegralGoodsMapper.selectFsIntegralGoodsByGoodsId(Convert.toLong(item.getOid()));
+                Asserts.check(ObjectUtils.isNotNull(goods), "该产品不存在! 产品id: {} ", item.getOid());
+                skuVo.setProductName(goods.getGoodsName()); //商品名称
+//                com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
+                skuVo.setSkuCode("默认"); //sku编码
+                skuVo.setProductCode(goods.getBarCode()); //商品编号
+                skuVo.setAttributeNames("默认"); //商品规格,格式:颜色:红色,尺寸:L码....以此类推
+                skuVo.setProductNumber(Math.toIntExact(item.getQty())); //商品预定数量
+                skuVo.setPrice(Convert.toDouble(item.getPrice())); //商品单价
+
+//                skuVo.setAdjustAmount(0d); //调整金额
+                // 优惠
+                skuVo.setSubAmount(Convert.toDouble(item.getPrice()) * item.getQty());
+
+                //组装寄托物
+                consignmentStr.append(goods.getGoodsName()).append("*").append(item.getQty()).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;
+    }
 
     /**
      * 获取账户索引 后续添加规则
@@ -1213,6 +1723,59 @@ public class DfOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    private void getIntegralOrderResult(Map<String, Object> map, Long dfAccountId){
+        try {
+            String status = map.get("exInterfaceType").toString();
+            log.info("开始查询订单结果,参数为: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_RESULT, map, dfAccountId);
+            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) {
+                            String failMsg = bspOrderResponse.getFailMsg();
+                            if (StringUtils.isNotBlank(failMsg)) {
+                                if (failMsg.equals("暂未结果, 请稍后再查")) {
+                                    return;
+                                }
+                                //下单失败 返回未推送状态
+                                String orderNumber = bspOrderResponse.getOrderNumber();
+                                try {
+                                    rollBackIntegralOrder(orderNumber, failMsg);
+                                } catch (Exception e) {
+                                    log.info("{}订单获取运单失败,订单状态回滚失败,失败原因:{},失败信息为:{}", orderNumber,e.getMessage(),failMsg);
+                                }
+                            } else {
+                                setIntegralExpress(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 {
+                log.info(String.format("查询订单失败,原因: %s", dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
     private void getOrderScrmResult(Map<String, Object> map, Long dfAccountId) {
         try {
             String status = map.get("exInterfaceType").toString();
@@ -1282,6 +1845,17 @@ public class DfOrderServiceImpl implements IErpOrderService {
         //推送失败消息
     }
 
+    private void rollBackIntegralOrder(String orderNumber, String failMsg){
+        //积分的回退不用修改扩展id,定时任务准备使用df表的ispush字段来查询
+        FsIntegralOrderDf df = integralOrderDfMapper.selectOne(Wrappers.<FsIntegralOrderDf>lambdaQuery().eq(FsIntegralOrderDf::getOrderCode, orderNumber));
+        df.setStatus(0); //回到默认
+        df.setFailMsg(failMsg); //失败消息
+        df.setUpdateTime(LocalDateTime.now());
+        df.setIsPush(0);
+        integralOrderDfMapper.updateById(df);
+        log.info("{}订单获取运单失败,失败信息为:{}", orderNumber,failMsg);
+    }
+
     private void rollBackOrderScrm(String orderNumber, String failMsg) {
         FsStoreOrderScrm fsStoreOrder = fsStoreOrderScrmMapper.selectFsStoreOrderByOrderCode(orderNumber);
         FsStoreOrderScrm tempOrder = new FsStoreOrderScrm();
@@ -1372,6 +1946,60 @@ public class DfOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    private void setIntegralExpress(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);
+                                        FsIntegralOrder order = fsIntegralOrderMapper.selectOne(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getOrderCode, orderNumber));
+                                        if (order != null && order.getStatus() == 1) {//等于待发货
+                                            order.setDeliverySn(mailNumber);
+                                            order.setDeliveryName(proCode);
+                                            order.setDeliveryCode("SF");
+                                            order.setStatus(2);//修改积分订单为待收货状态
+                                            order.setDeliveryTime(DateUtils.getNowDate()); //更新发货时间
+                                            fsIntegralOrderMapper.updateById(order);
+//                                            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+//                                            redisCache.deleteObject(DELIVERY+":"+order.getOrderCode());
+//                                            if (order.getCompanyId() != null && order.getCompanyId() > 0) {
+//                                                companyService.subtractCompanyMoney(order);
+//                                            }积分商品没有这个
+                                            flag.set(true);
+                                        }
+                                        break;
+                                    }
+                                }
+
+                            }
+                            if (flag.get()) {
+                                break;
+                            }
+                        }
+
+                    }
+                    if (flag.get()) {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * 顺丰会有自己的轨迹推送 不使用快递鸟(代服务管家设置推送地址)
      *
@@ -1447,4 +2075,224 @@ public class DfOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    private ExternalOrderRequestVo getCreateLiveOrderRequestParam(ErpOrder order, LiveOrder liveOrder, Long dfAccountId) {
+        ExternalOrderRequestVo vo = new ExternalOrderRequestVo();
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        if (dfAccount == null) {
+            return null;
+        }
+        String loginAccount = dfAccount.getLoginAccount();
+        vo.setMonthlyCard(dfAccount.getMonthlyCard());
+        vo.setExpressProductCode(dfAccount.getExpressProductCode());
+        vo.setLoginAccount(loginAccount);
+        String callBackUrl = dfAccount.getCallBackUrl();
+        if (StringUtils.isNotBlank(callBackUrl)) {
+            vo.setCallBackUrl(callBackUrl);
+        }
+        FsStoreOrderDf temp = fsStoreOrderDfMapper.selectFsStoreOrderDfByOrderId(liveOrder.getOrderId());
+        if (temp != null) {
+            vo.setParcelQuantity(temp.getParcelQuantity());
+        }
+        vo.setOrderNumber(order.getPlatform_code());
+        int orderPayMethod = 0;
+        BigDecimal couponPrice = liveOrder.getCouponPrice();
+        if (couponPrice == null) {
+            couponPrice = BigDecimal.ZERO;
+        }
+        if ("1".equals(liveOrder.getPayType())) {
+            orderPayMethod = 1;
+        } else {
+            orderPayMethod = 2;
+            vo.setCollectingMoney(liveOrder.getDeliveryPayMoney().doubleValue());
+            vo.setCollectionCardNumber(dfAccount.getMonthlyCard());
+        }
+        vo.setOrderPayMethod(orderPayMethod);
+        vo.setConsignmentNumber(Integer.valueOf(liveOrder.getTotalNum()));
+        vo.setBuyerMessage(liveOrder.getRemark());
+        vo.setSenderName(dfAccount.getSenderName());
+        vo.setSenderPhone(dfAccount.getSenderPhone());
+        vo.setSenderProvince(dfAccount.getSenderProvince());
+        vo.setSenderCity(dfAccount.getSenderCity());
+        vo.setSenderDistrict(dfAccount.getSenderDistrict());
+        vo.setSenderAddress(dfAccount.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);
+        StringBuilder consignmentStr = new StringBuilder();
+        List<LiveOrderItem> items = liveOrderItemMapper.selectLiveOrderItemByOrderId(liveOrder.getOrderId());
+        if (items != null && !items.isEmpty()) {
+            ArrayList<ExteriorOrderSkuVo> orderSkus = new ArrayList<>();
+            items.forEach(item -> {
+                ExteriorOrderSkuVo skuVo = new ExteriorOrderSkuVo();
+                FsStoreProductScrm product = fsStoreProductScrmMapper.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"));
+                String barCode = jsonObject.getString("barCode");
+                if (StringUtils.isNotBlank(barCode)) {
+                    skuVo.setProductCode(barCode);
+                } else {
+                    skuVo.setProductCode(item.getProductId().toString());
+                }
+                skuVo.setAttributeNames(jsonObject.getString("sku"));
+                skuVo.setProductNumber(Math.toIntExact(item.getNum()));
+                skuVo.setPrice(product.getPrice().doubleValue());
+                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 FsStoreOrderDf addDfOrderLive(LiveOrder liveOrder, Long dfAccountId) {
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(liveOrder.getOrderId());
+        df.setOrderCode(liveOrder.getOrderCode());
+        FsDfAccount dfAccount = fsDfAccountMapper.selectFsDfAccountById(dfAccountId);
+        df.setAppKey(dfAccount.getDfAppKey());
+        df.setAppSecret(dfAccount.getDfAppsecret());
+        df.setLoginAccount(dfAccount.getLoginAccount());
+        df.setMonthlyCard(dfAccount.getMonthlyCard());
+        df.setExpressProductCode(dfAccount.getExpressProductCode());
+        df.setTotalPrice(liveOrder.getPayMoney());
+        df.setPlatformPrice(liveOrder.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;
+    }
+
+    private void getOrderLiveResult(Map<String, Object> map, Long dfAccountId) {
+        try {
+            String status = map.get("exInterfaceType").toString();
+            log.info("开始查询订单结果,参数为: {}", JSON.toJSONString(map));
+            String response = client.execute(RequestUrlEnum.ORDER_RESULT, map, dfAccountId);
+            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) {
+                            String failMsg = bspOrderResponse.getFailMsg();
+                            if (StringUtils.isNotBlank(failMsg)) {
+                                if (failMsg.equals("暂未结果, 请稍后再查")) {
+                                    return;
+                                }
+                                String orderNumber = bspOrderResponse.getOrderNumber();
+                                try {
+                                    rollBackOrderLive(orderNumber, failMsg);
+                                } catch (Exception e) {
+                                    log.info("{}订单获取运单失败,订单状态回滚失败,失败原因:{},失败信息为:{}", orderNumber,e.getMessage(),failMsg);
+                                }
+                            } else {
+                                setExpressLive(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 {
+                log.info(String.format("查询订单失败,原因: %s", dfApiResponse.getMsg()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void rollBackOrderLive(String orderNumber, String failMsg) {
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(orderNumber);
+        LiveOrder tempOrder = new LiveOrder();
+        tempOrder.setOrderId(liveOrder.getOrderId());
+        tempOrder.setExtendOrderId("");
+        liveOrderMapper.updateLiveOrder(tempOrder);
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(liveOrder.getOrderId());
+        df.setStatus(0);
+        df.setFailMsg(failMsg);
+        df.setUpdateTime(new Date());
+        fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+        log.info("{}订单获取运单失败,失败信息为:{}", orderNumber,failMsg);
+    }
+
+    private void setExpressLive(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)) {
+                                        LiveOrder order = liveOrderMapper.selectLiveOrderByOrderCode(orderNumber);
+                                        if (order != null && order.getStatus() == 1) {
+                                            FsExpressScrm express = expressScrmService.selectFsExpressByOmsCode(order.getDeliveryCode());
+                                            if (express != null) {
+                                                order.setDeliveryName(proCode);
+                                                order.setDeliverySn(express.getOmsCode());
+                                            }
+                                            order.setStatus(2);
+                                            order.setDeliverySn(mailNumber);
+                                            order.setDeliverySendTime(new Date());
+                                            liveOrderMapper.updateLiveOrder(order);
+                                            redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
+                                            flag.set(true);
+                                        }
+                                        break;
+                                    }
+                                }
+                            }
+                            if (flag.get()) {
+                                break;
+                            }
+                        }
+                    }
+                    if (flag.get()) {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
 }

+ 29 - 0
fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java

@@ -12,6 +12,8 @@ import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.mapper.LiveOrderMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,6 +25,8 @@ public class ErpOrderServiceImpl implements IErpOrderService
     public final static Logger LOGGER = LoggerFactory.getLogger(ErpOrderServiceImpl.class);
     @Autowired
     ConfigUtil configUtil;
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -65,6 +69,11 @@ public class ErpOrderServiceImpl implements IErpOrderService
         return addOrder( order);
     }
 
+    @Override
+    public ErpOrderResponse addLiveOrder(ErpOrder order) {
+        return addOrder(order);
+    }
+
     @Override
     public ErpOrderResponse refundOrder(ErpRefundOrder order) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -89,6 +98,11 @@ public class ErpOrderServiceImpl implements IErpOrderService
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundLiveOrder(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest request) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -129,6 +143,11 @@ public class ErpOrderServiceImpl implements IErpOrderService
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest request) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -150,6 +169,11 @@ public class ErpOrderServiceImpl implements IErpOrderService
         return null;
     }
 
+    @Override
+    public BaseResponse refundUpdateLive(ErpRefundUpdateRequest param) {
+        return null;
+    }
+
     @Override
     public ErpOrderResponse finishOrder(ErpOrder order) {
         return null;
@@ -164,4 +188,9 @@ public class ErpOrderServiceImpl implements IErpOrderService
     public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
 
     }
+
+    @Override
+    public void getOrderLiveDeliveryStatus(LiveOrder order) {
+
+    }
 }

+ 163 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java

@@ -14,6 +14,14 @@ import com.fs.his.domain.*;
 import com.fs.his.service.*;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -49,6 +57,18 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
     @Autowired
     HzOMSClient hzOMSClient;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
+    @Autowired
+    private IFsStoreProductAttrValueScrmService fsStoreProductAttrValueScrmService;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         try {
@@ -69,6 +89,129 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
         return addOrder( order);
     }
 
+    @Override
+    public ErpOrderResponse addLiveOrder(ErpOrder order) {
+        try {
+            JSONObject hzOrder = buildHzOMSOrderLive(order.getPlatform_code());
+
+            JSONObject omsOpenPtorderCreate = hzOMSClient.send("oms_open_ptorder_create", hzOrder);
+            ErpOrderResponse res = new ErpOrderResponse();
+            res.setCode("hzomssuccess");
+            return res;
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        return null;
+    }
+
+    private JSONObject buildHzOMSOrderLive(String orderCode) {
+        //通过订单号查询更多订单信息
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(orderCode);
+        FsStore fsStore = fsStoreService.selectFsStoreByStoreId(liveOrder.getStoreId());
+
+        JSONObject obj = new JSONObject();
+        String iordertype = "2"; // 直播订单默认B2C快递配送
+        //订单类型 0 O2O配送订单; 1 O2O 自提订单; 2 B2C 快递配送
+        obj.put("iordertype", iordertype);
+        //订单单号
+        obj.put("cptordercode", liveOrder.getOrderCode());
+        //平台店铺编码 todo 测试环境只能写死 110111 用于联调测试 liveOrder.getStoreId()
+        obj.put("cptshopcode", 110111);
+        //平台店铺名称
+        obj.put("cptshopname", fsStore.getStoreName());
+        Integer iorderstatus = null;
+        //自提且已经支付
+        if ("1".equals(iordertype) && Integer.valueOf(1).equals(liveOrder.getIsPay())) {
+            iorderstatus = 30;
+        } else {
+            if (Integer.valueOf(1).equals(liveOrder.getStatus())) {
+                iorderstatus = 0;
+            } else if (Integer.valueOf(2).equals(liveOrder.getStatus())) {
+                iorderstatus = 5;
+            }
+        }
+        //订单状态 0待接单 5待拣货 10待配送 15配送中 20已完成 25已取消 30待自提
+        obj.put("iorderstatus", iorderstatus);
+
+        String userAddress = liveOrder.getUserAddress();
+        String[] s = null;
+        if (StringUtils.isNotBlank(userAddress)) {
+            s = userAddress.split(" ");
+        } else {
+            throw new RuntimeException("用户收货地址有问题");
+        }
+
+        //收货省
+        obj.put("cprovince", s[0]);
+        //收货市
+        obj.put("ccity", s[1]);
+        //收货区
+        obj.put("carea", s[2]);
+        //收货人密文 无密文填写明文
+        obj.put("creceivers", liveOrder.getRealName());
+        //收货人联系电话密文 无密文填写明文
+        obj.put("creceiversphone", liveOrder.getUserPhone());
+        //收货人详细地址密文 无密文填写明文
+        obj.put("creceiversaddress", userAddress);
+        //收货人脱敏信息
+        obj.put("cdesenreceivers", liveOrder.getRealName());
+        //收货联系电话脱敏信息
+        obj.put("cdesenreceiversphone", PhoneUtil.decryptPhone(liveOrder.getUserPhone()));
+        //收货联系地址脱敏信息
+        obj.put("cdesenreceiversaddress", userAddress);
+        //订单总金额 单位元
+        obj.put("forderamount", liveOrder.getTotalPrice());
+        //支付金额 单位元
+        obj.put("fpayamount", liveOrder.getPayPrice());
+        //订单总优惠 单位元
+        obj.put("fdiscamount", liveOrder.getDiscountMoney());
+        //运费
+        obj.put("ffreight", liveOrder.getPayDelivery());
+        //下单时间 格式 yyyy-MM-dd hh:mm:ss 如:2025-01-01 00:11:22
+        obj.put("dorderstarttime", liveOrder.getCreateTime());
+        //是否处方 0 否 1 是 可选
+        obj.put("iisprescription", 0);
+        //买家备注
+        obj.put("corderremark", liveOrder.getRemark());
+        //支付时间  格式 yyyy-MM-dd hh:mm:ss 如:2025-01-01 00:11:22
+        obj.put("dpurchasetime", liveOrder.getPayTime());
+        List<LiveOrderItem> liveOrderItems = liveOrderItemMapper.selectLiveOrderItemByOrderId(liveOrder.getOrderId());
+        int totalOrderItemCount = liveOrderItems.size();
+        BigDecimal divide = liveOrder.getDiscountMoney().divide(BigDecimal.valueOf(totalOrderItemCount), 2, BigDecimal.ROUND_HALF_UP);
+        JSONArray goodArr = new JSONArray();
+
+        liveOrderItems.forEach(liveOrderItem -> {
+            JSONObject goodItem = new JSONObject();
+            //商品编码
+            goodItem.put("cptgoodsid", liveOrderItem.getProductId());
+            //商品规格编码
+            goodItem.put("cptspeccode", liveOrderItem.getProductAttrValueId());
+
+            FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(liveOrderItem.getProductId());
+            FsStoreProductAttrValueScrm fsStoreProductAttrValue = new FsStoreProductAttrValueScrm();
+            //判断是否含有商品规格信息 有则查询商品规格信息 没有取商品的价格
+            if(null != liveOrderItem.getProductAttrValueId()){
+                fsStoreProductAttrValue = fsStoreProductAttrValueScrmService.selectFsStoreProductAttrValueById(liveOrderItem.getProductAttrValueId());
+            }else{
+                fsStoreProductAttrValue.setPrice(fsStoreProduct.getPrice());
+            }
+            //商品名称
+            goodItem.put("cgoodsname", fsStoreProduct.getProductName());
+            //购买数量
+            goodItem.put("fqty", liveOrderItem.getNum());
+            //原单价
+            goodItem.put("fnormprice", fsStoreProductAttrValue.getPrice());
+
+            //实售单价 优惠后的单价 单位元
+            goodItem.put("fprice", fsStoreProductAttrValue.getPrice().subtract(divide));
+            goodArr.add(goodItem);
+        });
+        //订单商品信息
+        obj.put("ptorder_goods_list", goodArr);
+
+        return obj;
+    }
+
     @Override
     public ErpOrderResponse refundOrder(ErpRefundOrder order) {
         String orderCode = order.getOrderCode();
@@ -83,6 +226,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundLiveOrder(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
         return null;
@@ -98,6 +246,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
 
@@ -167,6 +320,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public BaseResponse refundUpdateLive(ErpRefundUpdateRequest param) {
+        return null;
+    }
+
     @Override
     public ErpOrderResponse finishOrder(ErpOrder order) {
         return null;
@@ -182,6 +340,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
 
     }
 
+    @Override
+    public void getOrderLiveDeliveryStatus(LiveOrder order) {
+
+    }
+
     /**
      * 构建瀚智创建订单参数
      *

+ 276 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -31,6 +31,10 @@ import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.hisStore.service.impl.FsStoreProductScrmServiceImpl;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.http.util.Asserts;
@@ -76,6 +80,12 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     @Autowired
     private IFsStoreProductScrmService fsStoreProductScrmService;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
@@ -327,7 +337,127 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         return erpOrderResponse;
     }
 
+    @Override
+    public ErpOrderResponse addLiveOrder(ErpOrder order) {
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(order.getPlatform_code());
+        log.info("ERP订单号: {}, 订单信息: {}",order.getPlatform_code(), JSON.toJSONString(liveOrder));
+
+        ErpOrderPayment erpOrderPayment = order.getPayments().get(0);
+
+        ShopOrderDTO shopOrderDTO = new ShopOrderDTO();
+
+        shopOrderDTO.setShopId(Long.valueOf(order.getShop_code()));
+        shopOrderDTO.setSoId(order.getPlatform_code());
+        shopOrderDTO.setOrderDate(order.getDeal_datetime());
+        // 待发货
+        shopOrderDTO.setShopStatus(OrderStatusEnum.WAIT_SELLER_SEND_GOODS.name());
+        // 买家账号
+        shopOrderDTO.setShopBuyerId(order.getBuyer_account());
+        // 收货人省份
+        shopOrderDTO.setReceiverState(order.getReceiver_province());
+        // 收货人城市
+        shopOrderDTO.setReceiverCity(order.getReceiver_city());
+        // 收货人区域
+        shopOrderDTO.setReceiverDistrict(order.getReceiver_district());
+        // 收货人详细地址
+        shopOrderDTO.setReceiverAddress(order.getReceiver_address());
+        // 收货人详细地址
+        shopOrderDTO.setReceiverName(order.getReceiver_name());
+        // 收货人电话
+        shopOrderDTO.setReceiverPhone(order.getReceiver_mobile());
+        // 支付金额
+        shopOrderDTO.setPayAmount(erpOrderPayment.getPayment());
+        // 运费 改
+        if (ObjectUtil.isNull(liveOrder.getPayDelivery())) {
+            shopOrderDTO.setFreight(Double.valueOf("0.00"));
+        } else {
+            shopOrderDTO.setFreight(liveOrder.getPayDelivery().doubleValue());
+        }
+        // 备注
+        shopOrderDTO.setRemark(DateUtil.format(new Date(), "dd"));
+        // 买家留言
+        shopOrderDTO.setBuyerMessage(order.getBuyer_memo());
+
+        // 订单商品项列表
+        List<OrderItemDTO> itemDTOList = new ArrayList<>();
+
+        List<LiveOrderItem> liveOrderItems = liveOrderItemMapper.selectLiveOrderItemByOrderId(liveOrder.getOrderId());
+        log.info("liveOrderItems==========>{}",liveOrderItems);
+        for (LiveOrderItem item : liveOrderItems) {
+            OrderItemDTO orderItemDTO = new OrderItemDTO();
+            JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
+
+            String barCode = jsonObject.getString("barCode");
+            String productName = jsonObject.getString("productName");
+            String sku=jsonObject.getString("sku");
+
+            orderItemDTO.setSkuId(barCode);
+            orderItemDTO.setShopSkuId(barCode);
+            orderItemDTO.setName(productName);
+            orderItemDTO.setShopIId(orderItemDTO.getSkuId());//款式编码ID,当前没有这个目前就与SKU ID一致
+            orderItemDTO.setPropertiesValue(sku);//商品属性
+
+            FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(item.getProductId());
+
+            orderItemDTO.setAmount(fsStoreProduct.getPrice().multiply(new BigDecimal(item.getNum())));
+            orderItemDTO.setPic(fsStoreProduct.getImage());
+            orderItemDTO.setPrice(fsStoreProduct.getPrice());
+            orderItemDTO.setQty(item.getNum().intValue());
+            orderItemDTO.setOuterOiId(String.format("%s%s",liveOrder.getOrderCode(),item.getItemId()));
+            itemDTOList.add(orderItemDTO);
+        }
+        shopOrderDTO.setItems(itemDTOList);
+
+        // 实际支付金额
+        PaymentDTO paymentDTO = new PaymentDTO();
+        paymentDTO.setAmount(liveOrder.getPayMoney().doubleValue());
+        paymentDTO.setOuterPayId(order.getPlatform_code());
+        paymentDTO.setPayDate(order.getDeal_datetime());
+        paymentDTO.setPayment("微信支付");
+        paymentDTO.setBuyerAccount(order.getBuyer_account());
+        paymentDTO.setSellerAccount("平台销售");
+        shopOrderDTO.setPay(paymentDTO);
+
+        // 如果是货到付款
+        if("2".equals(liveOrder.getPayType()) || "3".equals(liveOrder.getPayType())){
+            shopOrderDTO.setIsCod(true);
+            // 货到付款金额 = 物流代收金额-优惠金额
+            //应付金额(货到付款= 订单总金额 - 已付金额)
+            shopOrderDTO.setPayAmount(liveOrder.getTotalPrice().subtract(liveOrder.getPayPrice()).doubleValue());
+
+            // 货到付款要推两次
+            PaymentDTO paymentDTO2 = new PaymentDTO();
+            // 物流代收金额
+            paymentDTO2.setAmount(liveOrder.getTotalPrice().subtract(liveOrder.getPayPrice()).doubleValue());
+            paymentDTO2.setOuterPayId(String.format("%s%d",order.getPlatform_code(),1));
+            paymentDTO2.setPayDate(order.getDeal_datetime());
+            paymentDTO2.setPayment("货到付款");
+            paymentDTO2.setBuyerAccount(order.getBuyer_account());
+            paymentDTO2.setSellerAccount("平台销售");
+            shopOrderDTO.setPay(paymentDTO2);
+
+            FsJstCodPush fsJstCodPush = new FsJstCodPush();
+            fsJstCodPush.setOrderId(liveOrder.getOrderCode());
+            fsJstCodPush.setType("0");
+            fsJstCodPush.setParams(JSON.toJSONString(shopOrderDTO));
+            fsJstCodPush.setRetryCount(0);
+            fsJstCodPush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
+            fsJstCodPushScrmMapper.insert(fsJstCodPush);
+        }
+
+        ErpOrderResponseDTO upload = jstErpHttpService.upload(shopOrderDTO);
+
+        if(CollectionUtils.isEmpty(upload.getDatas())) {
+            log.info("推送ERP返回结果: {}",upload);
+            throw new IllegalArgumentException("推送ERP返回数不应该为0");
+        }
+        ErpOrderResponseDTO.OrderData orderData = upload.getDatas().get(0);
 
+        ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+        erpOrderResponse.setSuccess(true);
+        erpOrderResponse.setCode(String.valueOf(orderData.getOId()));
+        return erpOrderResponse;
+    }
 
     @Override
     public ErpOrderResponse refundOrder(ErpRefundOrder order) {
@@ -339,6 +469,11 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundLiveOrder(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
         return null;
@@ -402,6 +537,35 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
         return response;
     }
+
+    @Override
+    public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
+        // 1. 构建查询请求DTO
+        OrderQueryRequestDTO requestDTO = new OrderQueryRequestDTO();
+        requestDTO.setOIds(Collections.singletonList(Long.valueOf(param.getCode())));
+
+        // 2. 调用ERP服务查询订单
+        OrderQueryResponseDTO query = jstErpHttpService.query(requestDTO);
+
+        // 3. 构建响应对象
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+
+        // 4. 设置基本响应信息
+
+        // 5. 转换订单数据
+        if (query.getOrders() != null && !query.getOrders().isEmpty()) {
+            List<ErpOrderQuery> erpOrders = query.getOrders().stream()
+                    .map(this::convertToErpOrderQueryLive)
+                    .collect(Collectors.toList());
+
+            response.setOrders(erpOrders);
+        } else {
+            response.setOrders(Collections.emptyList());
+        }
+
+        return response;
+    }
+
     /**
      * 将OrderQueryResponseDTO.Order转换为ErpOrderQuery
      *
@@ -562,6 +726,80 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         return erpOrder;
     }
 
+    private ErpOrderQuery convertToErpOrderQueryLive(OrderQueryResponseDTO.Order order) {
+        ErpOrderQuery erpOrder = new ErpOrderQuery();
+
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(order.getSoId());
+        Asserts.notNull(liveOrder,"该订单号没有找到!");
+
+        // 设置基本订单信息
+        erpOrder.setCode(order.getSoId());
+
+        // 计算订单总数量
+        if (order.getItems() != null && !order.getItems().isEmpty()) {
+            int totalQty = order.getItems().stream()
+                    .mapToInt(OrderQueryResponseDTO.OrderItem::getQty)
+                    .sum();
+            erpOrder.setQty(totalQty);
+        }
+
+        // 设置金额相关信息
+        erpOrder.setAmount(order.getAmount() != null ? order.getAmount().doubleValue() : null);
+        erpOrder.setPayment(order.getPaidAmount() != null ? order.getPaidAmount().doubleValue() : null);
+
+        // 设置其他订单属性
+        erpOrder.setCod(order.getIsCod());
+        erpOrder.setPlatform_code(order.getOrderFrom());
+
+        // 尝试解析创建时间
+        try {
+            if (order.getCreated() != null) {
+                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                erpOrder.setCreatetime(formatter.parse(order.getCreated()));
+            }
+        } catch (Exception e) {
+            // 日期解析异常处理
+            // 可以记录日志或保持为null
+        }
+
+        // 设置店铺信息
+        erpOrder.setShop_name(order.getShopName());
+        erpOrder.setShop_code(String.valueOf(order.getShopId()));
+
+        // 设置物流信息
+        erpOrder.setExpress_name(order.getLogisticsCompany());
+        erpOrder.setExpress_code(order.getLId());
+
+        // 设置收件人信息
+        erpOrder.setReceiver_name(liveOrder.getUserName());
+        erpOrder.setReceiver_phone(liveOrder.getUserPhone());
+        erpOrder.setReceiver_mobile(liveOrder.getUserPhone());
+
+        // 构建完整地址
+        erpOrder.setReceiver_address(liveOrder.getUserAddress());
+
+        // 如果是已发货
+        if(ObjectUtil.equal(order.getStatus(), ErpQueryOrderStatusEnum.SENT.getCode())){
+            List<ErpDeliverys> deliverysList = new ArrayList<>();
+
+            ErpDeliverys delivery = new ErpDeliverys();
+            delivery.setMail_no(order.getLId());
+            delivery.setExpress_code(order.getLcId());
+            delivery.setExpress_name(order.getLogisticsCompany());
+            delivery.setDelivery(true);
+            delivery.setCode(order.getSoId());
+
+            deliverysList.add(delivery);
+            erpOrder.setDeliverys(deliverysList);
+
+            // 设置发货状态,假设有物流单号就是已发货状态
+            erpOrder.setDelivery_state(1);
+        } else {
+            erpOrder.setDelivery_state(0);
+        }
+
+        return erpOrder;
+    }
 
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
@@ -632,6 +870,39 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         return baseResponse;
     }
 
+    @Override
+    public BaseResponse refundUpdateLive(ErpRefundUpdateRequest param) {
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(param.getTid());
+        log.info("订单号: {},发货状态: {},是否发货后: {}",liveOrder.getOrderCode(),liveOrder.getStatus(),ObjectUtils.equals(liveOrder.getStatus(),2));
+
+        // 发货后退款
+        if(ObjectUtils.equals(param.getOrderStatus(),2)){
+
+            FsJstAftersalePush fsJstAftersalePush = new FsJstAftersalePush();
+            fsJstAftersalePush.setOrderId(liveOrder.getOrderCode());
+            fsJstAftersalePush.setTaskStatus(com.fs.hisStore.enums.TaskStatusEnum.PENDING.getCode());
+            fsJstAftersalePush.setType(String.valueOf(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex()));
+            fsJstAftersalePush.setRetryCount(0);
+            fsJstAftersalePush.setAfterSaleId(String.valueOf(param.getStoreAfterSalesId()));
+            fsJstAftersalePushScrmMapper.insert(fsJstAftersalePush);
+
+        } else {
+            // 如果是发货前退款,直接走取消订单流程
+            // 如果是发货后退款,走售后流程
+            OrderCancelRequestDTO requestDTO = new OrderCancelRequestDTO();
+            requestDTO.setOIds(Collections.singletonList(Integer.valueOf(liveOrder.getExtendOrderId())));
+            requestDTO.setCancelType("用户退款");
+            requestDTO.setRemark("用户退款");
+
+            jstErpHttpService.cancel(requestDTO);
+        }
+
+        BaseResponse baseResponse = new BaseResponse();
+        baseResponse.setSuccess(true);
+
+        return baseResponse;
+    }
+
     @Override
     public ErpOrderResponse finishOrder(ErpOrder order) {
         return null;
@@ -646,5 +917,10 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
 
     }
+
+    @Override
+    public void getOrderLiveDeliveryStatus(LiveOrder order) {
+
+    }
 }
 

+ 176 - 0
fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java

@@ -22,6 +22,10 @@ import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,6 +55,13 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
     private IFsStoreOrderItemScrmService storeOrderItemService;
     @Autowired
     private FsStoreProductScrmMapper productMapper;
+
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
     @Override
     /**
      * 推送erp订单
@@ -64,6 +75,151 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
         return addOmsOrder(order.getPlatform_code());
     }
 
+    @Override
+    public ErpOrderResponse addLiveOrder(ErpOrder order) {
+        return addOmsOrderLive(order.getPlatform_code());
+    }
+
+    private ErpOrderResponse addOmsOrderLive(String orderCode) {
+        try {
+            KingbosOrderResponse response = this.createOmsOrderLive(orderCode, NO_DELIVERED.getCode());
+            if (response.getIsSuccess()){
+                log.info("订单推送成功: {}", response);
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(response.getCbilid());
+                return erpOrderResponse;
+            }else {
+                throw new RuntimeException(String.format("订单推送失败,原因: %s",response.getErrmsg()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
+    }
+
+    private KingbosOrderResponse createOmsOrderLive(String orderCode, String orderStatus){
+        logger.info("【金博网络订单】开始创建订单,订单Code: {}", orderCode);
+        try {
+            LiveOrder order = liveOrderMapper.selectLiveOrderByOrderCode(orderCode);
+            logger.info("【金博网络订单】订单信息获取成功,订单id: {}", order.getOrderId());
+            logger.info("【金博网络订单】订单信息获取成功,订单号: {}", order.getOrderCode());
+
+            KingbosOrderData data = buildKingbosOrderDataLive(order, orderStatus);
+            logger.info("【金博网络订单】订单数据构建完成,金博订单号: {}", data.getCo_id());
+
+            List<KingbosOrderD1Data> d1Datas = buildOrderDetailDataLive(order, data.getCdo_id());
+            logger.info("【金博网络订单】订单明细数据构建完成,明细数量: {}", d1Datas.size());
+
+            KingbosOrderResponse response = sendOrderRequest(data, d1Datas);
+            if (response.getCbilid()==null){
+                response.setCbilid(order.getExtendOrderId());
+            }
+            return response;
+        } catch (Exception e) {
+            logger.error("【金博网络订单】创建订单失败,订单Code: {}, 错误信息: {}", orderCode, e.getMessage(), e);
+            throw e;
+        }
+    }
+
+    private KingbosOrderData buildKingbosOrderDataLive(LiveOrder order, String orderStatus) {
+        FsErpConfig erpConfig = configUtil.getErpConfig();
+        logger.debug("【金博网络订单】开始构建订单数据,订单号: {}", order.getOrderCode());
+        KingbosOrderData data = new KingbosOrderData();
+        data.setCordersource("MALL");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        data.setDorder_date(sdf.format(order.getCreateTime()));
+        data.setCplatformtype("99");
+        data.setCshop_id("zk2025");
+        data.setCshop_name("自建商城");
+        String orderSn = "";
+        if (orderStatus.equals(NO_DELIVERED.getCode())){
+            orderSn= IdUtil.getSnowflake(0, 0).nextIdStr();
+        }else if (orderStatus.equals(CANCELLED.getCode())){
+            orderSn = order.getExtendOrderId();
+        }
+
+        data.setCso_id(order.getOrderCode());
+        data.setCo_id(orderSn);
+        data.setCdo_id(orderSn);
+        order.setExtendOrderId(orderSn);
+
+        data.setFpay_amount(order.getPayPrice());
+        data.setFpaid_amount(order.getPayMoney());
+        data.setFfreight(order.getTotalPostage());
+        data.setFfree_amount(order.getCouponPrice());
+        data.setFpostcost(BigDecimal.ZERO);
+
+        data.setCstatus(orderStatus);
+        data.setDmodified(sdf.format(order.getUpdateTime()));
+
+        setReceiverInfoLive(data, order);
+
+        data.setCwarehouse_code(erpConfig.getCwarehouseCode());
+        data.setCwarehouse_name(erpConfig.getCwarehouseName());
+
+        if (!order.getPayType().equals("1")) {
+            data.setBis_cod(1);
+            data.setFshouldpaymoney(order.getDeliveryPayMoney());
+        }
+
+        return data;
+    }
+
+    private void setReceiverInfoLive(KingbosOrderData data, LiveOrder order) {
+        logger.debug("【金博网络订单】开始处理收货信息,订单号: {}", order.getOrderCode());
+        String[] address = order.getUserAddress().split(" ");
+        if (address.length < 3) {
+            logger.error("【金博网络订单】收货地址格式不正确,订单号: {}, 地址: {}", order.getOrderCode(), order.getUserAddress());
+            throw new ServiceException("收货地址格式不正确");
+        }
+
+        data.setCreceiver_state(address[0]);
+        data.setCreceiver_city(address[1]);
+        data.setCreceiver_district(address[2]);
+
+        String detailAddress = address.length > 3 ?
+            String.join("", Arrays.copyOfRange(address, 3, address.length)) :
+            address[2];
+
+        detailAddress = detailAddress.replace("+", "加")
+                                   .replace("\n", "");
+
+        data.setCreceiver_address(detailAddress);
+        data.setCreceiver_name(order.getRealName());
+        data.setCreceiver_mobile(order.getUserPhone());
+    }
+
+    private List<KingbosOrderD1Data> buildOrderDetailDataLive(LiveOrder order, String orderId) {
+        logger.debug("【金博网络订单】开始构建订单明细,订单号: {}", order.getOrderCode());
+        List<LiveOrderItem> orderItems = liveOrderItemMapper.selectLiveOrderItemByOrderId(order.getOrderId());
+        List<KingbosOrderD1Data> d1Datas = orderItems.stream()
+                .map(item -> buildOrderDetailItemLive(item, orderId))
+                .collect(Collectors.toList());
+
+        logger.debug("【金博网络订单】订单明细构建完成,订单号: {}, 明细数量: {}", order.getOrderCode(), d1Datas.size());
+        return d1Datas;
+    }
+
+    private KingbosOrderD1Data buildOrderDetailItemLive(LiveOrderItem orderItem, String orderId) {
+        FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+        BigDecimal quantity = new BigDecimal(orderItem.getNum());
+
+        KingbosOrderD1Data item = new KingbosOrderD1Data();
+        item.setCdo_id(orderId);
+        item.setCo_id(orderId);
+        item.setCsku_id(cartDTO.getBarCode());
+        item.setCgoodsid(cartDTO.getBarCode());
+        item.setCname(cartDTO.getProductName());
+        item.setCshop_sku_id(cartDTO.getSku());
+        item.setIqty(quantity);
+        item.setFprice(cartDTO.getPrice());
+        item.setFamount(quantity.multiply(cartDTO.getPrice()));
+        item.setCordersource("MALL");
+        item.setFpromoamount(BigDecimal.ZERO);
+
+        return item;
+    }
+
 
     /**
      * 退款
@@ -93,6 +249,11 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundLiveOrder(ErpRefundOrder order) {
+        return null;
+    }
+
     private KingbosRefundOrderRequest getKingbosRefundOrderRequest(String orderCode) {
         FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
         if (order != null){
@@ -138,6 +299,11 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
         return null;
@@ -148,6 +314,11 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public BaseResponse refundUpdateLive(ErpRefundUpdateRequest param) {
+        return null;
+    }
+
 
     /**
      * 退款 运单号已获取到
@@ -460,4 +631,9 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
     public void getOrderScrmDeliveryStatus(FsStoreOrderScrm order) {
 
     }
+
+    @Override
+    public void getOrderLiveDeliveryStatus(LiveOrder order) {
+
+    }
 }

+ 206 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -32,6 +32,10 @@ import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.domain.LiveOrderItem;
+import com.fs.live.mapper.LiveOrderItemMapper;
+import com.fs.live.mapper.LiveOrderMapper;
 import com.hc.openapi.tool.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -70,6 +74,12 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
     @Autowired
     private IFsStoreProductScrmService fsStoreProductScrmService;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
+
+    @Autowired
+    private LiveOrderItemMapper liveOrderItemMapper;
+
 //    @Value("${fsConfig.erpWdShopCode}")
 //    private String shopCode;
 
@@ -103,6 +113,182 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         return getErpOrderResponseScrm(order);
     }
 
+    @Override
+    public ErpOrderResponse addLiveOrder(ErpOrder order) {
+        return getErpOrderResponseLive(order);
+    }
+
+    private ErpOrderResponse getErpOrderResponseLive(ErpOrder order) {
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        String shopCode = sysConfig.getErpWdShopCode();
+
+        ErpWdtBusinessRequestParams erpWdtBusinessRequestParams = new ErpWdtBusinessRequestParams();
+        erpWdtBusinessRequestParams.setShopNo(shopCode);
+        erpWdtBusinessRequestParams.setSwitchMode(0);
+        ErpWdtTrade erpWdtTrade = new ErpWdtTrade();
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderCode(order.getPlatform_code());
+        BigDecimal couponPrice = liveOrder.getCouponPrice();
+        if (couponPrice == null) {
+            couponPrice = BigDecimal.ZERO;
+        }
+
+        // 平台状态
+        erpWdtTrade.setTradeStatus(TradeStatus.PAID_WAITING_FOR_SHIPMENT.getValue());
+
+        // 订单id
+        erpWdtTrade.setTid(order.getPlatform_code());
+
+        // 如果是货到付款
+        if("2".equals(liveOrder.getPayType())){
+            // 支付状态
+            erpWdtTrade.setPayStatus(PaymentStatus.PARTIALLY_PAID.getValue());
+            // 发货条件
+            erpWdtTrade.setDeliveryTerm(DeliveryTerm.CASH_ON_DELIVERY.getValue());
+            // 货到付款金额 = 物流代收金额-优惠金额
+            erpWdtTrade.setCodAmount(liveOrder.getPayDelivery().subtract(couponPrice));
+
+        } else if("3".equals(liveOrder.getPayType())){
+            // 支付状态
+            erpWdtTrade.setPayStatus(PaymentStatus.UNPAID.getValue());
+            // 发货条件
+            erpWdtTrade.setDeliveryTerm(DeliveryTerm.CASH_ON_DELIVERY.getValue());
+            // 货到付款金额 = 物流代收金额-优惠金额
+            erpWdtTrade.setCodAmount(liveOrder.getPayDelivery().subtract(couponPrice));
+        } else { // 如果是线上付款
+            // 支付状态
+            erpWdtTrade.setPayStatus(PaymentStatus.FULLY_PAID.getValue());
+            // 发货条件
+            erpWdtTrade.setDeliveryTerm(DeliveryTerm.PAYMENT_BEFORE_DELIVERY.getValue());
+        }
+
+        // 下单时间
+        erpWdtTrade.setTradeTime(order.getDeal_datetime());
+        // 支付时间
+        erpWdtTrade.setPayTime(order.getDeal_datetime());
+        // 分销类别
+        erpWdtTrade.setFenxiaoType(FenxiaoType.JINGXIAO.getValue());
+        // 客户网名
+        erpWdtTrade.setBuyerNick(order.getReceiver_name());
+        // 收件人姓名
+        erpWdtTrade.setReceiverName(order.getReceiver_name());
+        // 省份
+        erpWdtTrade.setReceiverProvince(order.getReceiver_province());
+        // 市
+        erpWdtTrade.setReceiverCity(order.getReceiver_city());
+        // 区
+        erpWdtTrade.setReceiverDistrict(order.getReceiver_district());
+        // 详细地址
+        erpWdtTrade.setReceiverAddress(order.getReceiver_address());
+        // 手机
+        erpWdtTrade.setReceiverMobile(order.getReceiver_mobile());
+        // 固定电话
+        erpWdtTrade.setReceiverTelno(order.getReceiver_mobile());
+        // 买家备注
+        erpWdtTrade.setBuyerMessage(order.getBuyer_memo());
+        // 卖家备注
+        erpWdtTrade.setSellerMemo(order.getSeller_memo());
+        erpWdtTrade.setWarehouseNo(order.getWarehouse_code());
+
+        // 运费金额
+        erpWdtTrade.setPostAmount(liveOrder.getPayDelivery());
+        // 已付金额
+        if(ObjectUtils.isNotNull(liveOrder)){
+            erpWdtTrade.setPaid(liveOrder.getPayMoney());
+        }
+
+        List<LiveOrderItem> liveOrderItems = liveOrderItemMapper.selectLiveOrderItemByOrderId(liveOrder.getOrderId());
+        List<ErpWdtOrder> erpWdtOrderList = new ArrayList<>();
+        // 商品总价
+        BigDecimal totalPrice = liveOrder.getTotalPrice();
+
+        // 总折扣金额 = 优惠券金额 + 折扣金额
+        BigDecimal totalDiscountPrice = BigDecimal.ZERO;
+        // 折扣金额
+        BigDecimal discountPrice = totalPrice.subtract(liveOrder.getPayPrice());
+        totalDiscountPrice = couponPrice.add(discountPrice);
+
+        // 防止除零错误
+        if (totalPrice.compareTo(BigDecimal.ZERO) == 0) {
+            totalPrice = BigDecimal.ONE;
+        }
+
+        for (LiveOrderItem liveOrderItem : liveOrderItems) {
+            ErpWdtOrder erpWdtOrder = new ErpWdtOrder();
+            //平台订单货品表主键
+            erpWdtOrder.setOid(String.format("%s%s",liveOrder.getOrderCode(),liveOrderItem.getItemId()));
+            erpWdtOrder.setNum(BigDecimal.valueOf(liveOrderItem.getNum()));
+            FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(liveOrderItem.getProductId());
+            Asserts.check(ObjectUtils.isNotNull(fsStoreProduct),"该产品不存在! 产品id: {} ",liveOrderItem.getProductId());
+            // 单价
+            erpWdtOrder.setPrice(fsStoreProduct.getPrice());
+            // 状态
+            erpWdtOrder.setStatus(TradeStatus.PAID_WAITING_FOR_SHIPMENT.getValue());
+            // 退款状态
+            erpWdtOrder.setRefundStatus(RefundStatus.NO_REFUND.getValue());
+
+            // 平台货品ID
+            erpWdtOrder.setGoodsId(String.valueOf(fsStoreProduct.getProductId()));
+            JSONObject jsonObject = JSON.parseObject(liveOrderItem.getJsonInfo());
+            erpWdtOrder.setSpecId(jsonObject.getString("sku"));
+            erpWdtOrder.setGoodsNo(jsonObject.getString("barCode"));
+            erpWdtOrder.setSpecNo(jsonObject.getString("sku"));
+            // 货品名称
+            erpWdtOrder.setGoodsName(fsStoreProduct.getProductName());
+            // 调整
+            erpWdtOrder.setAdjustAmount(BigDecimal.ZERO);
+            // 优惠
+            erpWdtOrder.setDiscount(BigDecimal.ZERO);
+            // 分摊优惠
+            // 分摊比例
+            BigDecimal price = fsStoreProduct.getPrice().multiply(BigDecimal.valueOf(liveOrderItem.getNum()));
+            BigDecimal divide = price.divide(totalPrice, RoundingMode.HALF_UP);
+            erpWdtOrder.setShareDiscount(divide.multiply(totalDiscountPrice));
+
+            erpWdtOrderList.add(erpWdtOrder);
+        }
+
+        // 最后一个商品的分摊优惠等于总优惠减去前面分摊优惠之和
+        Asserts.check(CollectionUtils.isNotEmpty(erpWdtOrderList),"订单 {} 商品不能为空!", order.getPlatform_code());
+        long size = erpWdtOrderList.size();
+        if(size > 1) {
+            ErpWdtOrder erpWdtOrder = erpWdtOrderList.get(erpWdtOrderList.size() - 1);
+            erpWdtOrder.setShareDiscount(totalDiscountPrice.subtract(erpWdtOrderList.stream()
+                    .limit(size - 1L)
+                    .map(item -> Optional.ofNullable(item.getShareDiscount()).orElse(BigDecimal.ZERO))
+                    .reduce(BigDecimal.ZERO, BigDecimal::add)));
+        }
+
+        erpWdtTrade.setOrderList(erpWdtOrderList);
+        erpWdtBusinessRequestParams.setTradeList(new ArrayList<>(Arrays.asList(erpWdtTrade)));
+
+        Map<String,String> map = new HashMap<>();
+        map.put("shop_no",erpWdtBusinessRequestParams.getShopNo());
+        map.put("switch_mode", String.valueOf(erpWdtBusinessRequestParams.getSwitchMode()));
+        map.put("trade_list", convertToSnakeCase(erpWdtBusinessRequestParams.getTradeList()));
+
+
+        try {
+            String response = client.execute("trade_push.php", map);
+            ParserConfig config = new ParserConfig();
+            config.propertyNamingStrategy = PropertyNamingStrategy.CamelCase;
+            ErpWdtApiResponse erpWdtApiResponse = JSON.parseObject(response, ErpWdtApiResponse.class,config);
+            if(ObjectUtil.equal(0,erpWdtApiResponse.getCode())){
+                log.info("订单推送成功: {}", response);
+                ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+                erpOrderResponse.setCode(order.getPlatform_code());
+                erpOrderResponse.setSuccess(true);
+                erpOrderResponse.setRequestRawData(JSON.toJSONString(map));
+                erpOrderResponse.setResponseRawData(response);
+                return erpOrderResponse;
+            } else {
+                throw new RuntimeException(String.format("订单推送失败,原因: %s",erpWdtApiResponse.getMessage()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return new ErpOrderResponse();
+    }
+
     /**
      * 获取erp推送参数
      * @param order 订单参数
@@ -800,6 +986,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderResponse refundLiveOrder(ErpRefundOrder order) {
+        return null;
+    }
+
     @Override
     public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
         return null;
@@ -837,6 +1028,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -921,6 +1117,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public BaseResponse refundUpdateLive(ErpRefundUpdateRequest param) {
+        return null;
+    }
+
     @Override
     public ErpOrderResponse finishOrder(ErpOrder order) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -1103,6 +1304,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 
     }
 
+    @Override
+    public void getOrderLiveDeliveryStatus(LiveOrder order) {
+
+    }
+
     public static String convertToSnakeCase(Object obj) {
         SerializeConfig config = new SerializeConfig();
         config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;

+ 17 - 3
fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java

@@ -1,5 +1,8 @@
 package com.fs.his.domain;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
@@ -16,11 +19,12 @@ import java.util.Date;
  * @date 2023-11-02
  */
 @Data
-public class FsIntegralOrder extends BaseEntity
+public class FsIntegralOrder
 {
     private static final long serialVersionUID = 1L;
 
     /** id */
+    @TableId
     private Long orderId;
 
     /** 订单编号 */
@@ -47,9 +51,10 @@ public class FsIntegralOrder extends BaseEntity
     @Excel(name = "商品信息")
     private String itemJson;
 
+    @TableField(exist = false)
     @Excel(name = "商品名称")
     private String goodsName;
-
+    @TableField(exist = false)
     @Excel(name = "原价")
     private BigDecimal otPrice;
 
@@ -73,7 +78,7 @@ public class FsIntegralOrder extends BaseEntity
     @Excel(name = "支付类型 1积分 2现金 3积分+现金")
     private Integer payType;
 
-    /** 1:待发货;2:待收货;3:已完成 4待支付 5取消 */
+    /** 1:待发货;2:待收货;3:已完成 4待支付 -1取消 */
     @Excel(name = "状态",dictType="sys_integral_order_status")
     private Integer status;
     @Excel(name = "商品编号")
@@ -116,4 +121,13 @@ public class FsIntegralOrder extends BaseEntity
 
     private String loginAccount;
 
+    private String remark;
+
+    private Date createTime;
+    @TableField(exist = false)
+    private Date updateTime;
+
+    private Integer deliveryStatus;
+
+    private String deliveryType;
 }

+ 73 - 0
fs-service/src/main/java/com/fs/his/domain/FsIntegralOrderDf.java

@@ -0,0 +1,73 @@
+package com.fs.his.domain;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+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_integral_order_df
+ *
+ * @author fs
+ * @date 2025-11-11
+ */
+@Data
+public class FsIntegralOrderDf{
+
+    @TableId
+    /** 订单id */
+    private Long orderId;
+
+    /** 订单编号 */
+    @Excel(name = "订单编号")
+    private String orderCode;
+
+    /** $column.columnComment */
+    @Excel(name = "订单编号")
+    private String appKey;
+
+    /** $column.columnComment */
+    @Excel(name = "订单编号")
+    private String appSecret;
+
+    /** $column.columnComment */
+    @Excel(name = "订单编号")
+    private String loginAccount;
+
+    /** 顺丰月结账户 */
+    @Excel(name = "顺丰月结账户")
+    private String monthlyCard;
+
+    /** 物流产品编码:1-顺丰标快,2-顺丰标快(陆运),204-陆运微小件,231-陆运包裹,208-特惠专配 */
+    @Excel(name = "物流产品编码:1-顺丰标快,2-顺丰标快", readConverterExp = "陆=运")
+    private String expressProductCode;
+
+    /** 订单总价 */
+    @Excel(name = "订单总价")
+    private BigDecimal totalPrice;
+
+    /** 平台收款 */
+    @Excel(name = "平台收款")
+    private BigDecimal platformPrice;
+
+    /** 0:默认 1下单 2取消订单 */
+    @Excel(name = "0:默认 1下单 2取消订单")
+    private Integer status;
+
+    /** 失败原因 */
+    @Excel(name = "失败原因")
+    private String failMsg;
+
+    /** 包裹数量 */
+    @Excel(name = "包裹数量")
+    private Integer parcelQuantity;
+
+    private LocalDateTime updateTime;
+    private LocalDateTime createTime;
+    private String erpPhone;
+    private Integer isPush;
+}

+ 64 - 0
fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderDfMapper.java

@@ -0,0 +1,64 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsIntegralOrderDf;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author fs
+ * @date 2025-11-11
+ */
+public interface FsIntegralOrderDfMapper extends BaseMapper<FsIntegralOrderDf> {
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param orderId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    FsIntegralOrderDf selectFsIntegralOrderDfByOrderId(Long orderId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    List<FsIntegralOrderDf> selectFsIntegralOrderDfList(FsIntegralOrderDf fsIntegralOrderDf);
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 结果
+     */
+    int insertFsIntegralOrderDf(FsIntegralOrderDf fsIntegralOrderDf);
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 结果
+     */
+    int updateFsIntegralOrderDf(FsIntegralOrderDf fsIntegralOrderDf);
+
+    /**
+     * 删除【请填写功能名称】
+     *
+     * @param orderId 【请填写功能名称】主键
+     * @return 结果
+     */
+    int deleteFsIntegralOrderDfByOrderId(Long orderId);
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param orderIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsIntegralOrderDfByOrderIds(Long[] orderIds);
+
+    List<FsIntegralOrderDf> selectByIsPush();
+}

+ 7 - 1
fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderMapper.java

@@ -1,6 +1,8 @@
 package com.fs.his.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsIntegralOrder;
+import com.fs.his.domain.FsIntegralOrderDf;
 import com.fs.his.param.FsIntegralOrderListUParam;
 import com.fs.his.param.FsIntegralOrderParam;
 import com.fs.his.vo.FsIntegralOrderListUVO;
@@ -17,7 +19,7 @@ import java.util.List;
  * @author fs
  * @date 2023-11-02
  */
-public interface FsIntegralOrderMapper
+public interface FsIntegralOrderMapper extends BaseMapper<FsIntegralOrder>
 {
     /**
      * 查询积分商品订单
@@ -110,4 +112,8 @@ public interface FsIntegralOrderMapper
     int cancelOrder(@Param("orderId") Long orderId);
 
     int finishOrder(@Param("orderId") Long orderId,@Param("oldStatus") Integer status);
+
+    List<FsIntegralOrder> findOrderByIds(@Param("orderIds") List<Long> orderIds);
+
+    List<FsIntegralOrderListVO> selectFsIntegralOrderListJn(FsIntegralOrderParam fsIntegralOrder);
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/param/FsIntegralOrderParam.java

@@ -100,4 +100,8 @@ public class FsIntegralOrderParam {
      * 销售公司ID
      * **/
     private Long companyId;
+
+    private String loginAccount;
+
+    private Integer isPush;
 }

+ 7 - 0
fs-service/src/main/java/com/fs/his/param/FsStoreProductAddEditParam.java

@@ -159,6 +159,13 @@ public class FsStoreProductAddEditParam implements Serializable {
     /** 品牌 */
     @Excel(name = "品牌")
     private String brand;
+    /** 品牌 */
+    @Excel(name = "食品生产许可证编码")
+    private String foodProductionLicenseCode;
+
+    /** 退货地址 */
+    @Excel(name = "退货地址")
+    private String returnAddress;
 
     //属性项目
     private List<ProductArrtDTO> items;

+ 62 - 0
fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderDfService.java

@@ -0,0 +1,62 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsIntegralOrderDf;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author fs
+ * @date 2025-11-11
+ */
+public interface IFsIntegralOrderDfService extends IService<FsIntegralOrderDf> {
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param orderId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    FsIntegralOrderDf selectFsIntegralOrderDfByOrderId(Long orderId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    List<FsIntegralOrderDf> selectFsIntegralOrderDfList(FsIntegralOrderDf fsIntegralOrderDf);
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 结果
+     */
+    int insertFsIntegralOrderDf(FsIntegralOrderDf fsIntegralOrderDf);
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 结果
+     */
+    int updateFsIntegralOrderDf(FsIntegralOrderDf fsIntegralOrderDf);
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param orderIds 需要删除的【请填写功能名称】主键集合
+     * @return 结果
+     */
+    int deleteFsIntegralOrderDfByOrderIds(Long[] orderIds);
+
+    /**
+     * 删除【请填写功能名称】信息
+     *
+     * @param orderId 【请填写功能名称】主键
+     * @return 结果
+     */
+    int deleteFsIntegralOrderDfByOrderId(Long orderId);
+}

+ 10 - 4
fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderService.java

@@ -5,11 +5,9 @@ import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsIntegralOrder;
 import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.param.*;
-import com.fs.his.vo.FsIntegralOrderListUVO;
-import com.fs.his.vo.FsIntegralOrderListVO;
-import com.fs.his.vo.FsIntegralOrderPVO;
-import com.fs.his.vo.FsStoreProductDeliverExcelVO;
+import com.fs.his.vo.*;
 
+import java.text.ParseException;
 import java.util.List;
 
 /**
@@ -70,6 +68,8 @@ public interface IFsIntegralOrderService
 
     List<FsIntegralOrderListVO> selectFsIntegralOrderListVO(FsIntegralOrderParam fsIntegralOrder);
 
+    List<FsIntegralOrderListVO> selectFsIntegralOrderListByJn(FsIntegralOrderParam fsIntegralOrder);
+
     int sendGoods(FsIntegralOrder fsIntegralOrder);
 
     List<FsIntegralOrderListUVO> selectFsIntegralOrderListUVO(FsIntegralOrderListUParam param);
@@ -109,4 +109,10 @@ public interface IFsIntegralOrderService
     int mandatoryRefunds(String orderCode);
 
     int finishOrder(String orderCode);
+
+    List<FsIntegralOrder> selectFsIntegralOrderByOrderIds(List<Long> orderIds);
+
+    void createErpOrder(Long orderId) throws ParseException;
+
+    String importOrderStatusData(List<FsIntegralOrderExcelVO> list);
 }

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

@@ -0,0 +1,93 @@
+package com.fs.his.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsIntegralOrderDf;
+import com.fs.his.mapper.FsIntegralOrderDfMapper;
+import com.fs.his.service.IFsIntegralOrderDfService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author fs
+ * @date 2025-11-11
+ */
+@Service
+public class FsIntegralOrderDfServiceImpl extends ServiceImpl<FsIntegralOrderDfMapper, FsIntegralOrderDf> implements IFsIntegralOrderDfService {
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param orderId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public FsIntegralOrderDf selectFsIntegralOrderDfByOrderId(Long orderId)
+    {
+        return baseMapper.selectFsIntegralOrderDfByOrderId(orderId);
+    }
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public List<FsIntegralOrderDf> selectFsIntegralOrderDfList(FsIntegralOrderDf fsIntegralOrderDf)
+    {
+        return baseMapper.selectFsIntegralOrderDfList(fsIntegralOrderDf);
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int insertFsIntegralOrderDf(FsIntegralOrderDf fsIntegralOrderDf)
+    {
+        return baseMapper.insertFsIntegralOrderDf(fsIntegralOrderDf);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param fsIntegralOrderDf 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int updateFsIntegralOrderDf(FsIntegralOrderDf fsIntegralOrderDf)
+    {
+        return baseMapper.updateFsIntegralOrderDf(fsIntegralOrderDf);
+    }
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param orderIds 需要删除的【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsIntegralOrderDfByOrderIds(Long[] orderIds)
+    {
+        return baseMapper.deleteFsIntegralOrderDfByOrderIds(orderIds);
+    }
+
+    /**
+     * 删除【请填写功能名称】信息
+     *
+     * @param orderId 【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsIntegralOrderDfByOrderId(Long orderId)
+    {
+        return baseMapper.deleteFsIntegralOrderDfByOrderId(orderId);
+    }
+}

+ 416 - 14
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java

@@ -6,6 +6,9 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -15,27 +18,32 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
-import com.fs.common.utils.DateUtils;
-import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.*;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyDept;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.company.service.ICompanyDeptService;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.utils.OrderCodeUtils;
+import com.fs.erp.domain.ErpOrder;
+import com.fs.erp.domain.ErpOrderItem;
+import com.fs.erp.domain.ErpOrderPayment;
+import com.fs.erp.dto.ErpOrderResponse;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
-import com.fs.his.enums.BusinessTypeEnum;
-import com.fs.his.enums.FsUserIntegralLogTypeEnum;
-import com.fs.his.enums.PaymentMethodEnum;
+import com.fs.his.dto.ErpRemarkDTO;
+import com.fs.his.enums.*;
 import com.fs.his.mapper.*;
 import com.fs.his.param.*;
-import com.fs.his.service.IFsIntegralCartService;
-import com.fs.his.service.IFsIntegralOrderService;
-import com.fs.his.service.IFsStorePaymentService;
-import com.fs.his.service.IFsUserIntegralLogsService;
+import com.fs.his.service.*;
+import com.fs.his.utils.ConfigUtil;
 import com.fs.his.utils.PhoneUtil;
-import com.fs.his.vo.FsIntegralOrderListUVO;
-import com.fs.his.vo.FsIntegralOrderListVO;
-import com.fs.his.vo.FsIntegralOrderPVO;
-import com.fs.his.vo.FsStoreProductDeliverExcelVO;
+import com.fs.his.vo.*;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.tzBankPay.doman.PayType;
@@ -47,14 +55,23 @@ import org.apache.commons.collections.CollectionUtils;
 import org.redisson.api.RObjectAsync;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import static com.fs.his.utils.PhoneUtil.*;
 
 /**
  * 积分商品订单Service业务层处理
@@ -96,6 +113,54 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
     @Autowired
     private IFsIntegralCartService cartService;
 
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSOrderService;
+
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
+    @Autowired
+    private FsIntegralOrderDfMapper fsIntegralOrderDfMapper;
+
+    @Autowired
+    private ConfigUtil configUtil;
+
+    @Autowired
+    private CloudHostProper cloudHostProper;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private ICompanyUserService companyUserService;
+
+    @Autowired
+    private ICompanyDeptService companyDeptService;
+
+    @Autowired
+    private IFsExpressService expressService;
+
+    @Autowired
+    private IFsIntegralOrderDfService integralOrderDfService;
+
+    @Autowired
+    private IFsUserAddressService fsUserAddressService;
     /**
      * 查询积分商品订单
      *
@@ -142,6 +207,16 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
     @Override
     public int updateFsIntegralOrder(FsIntegralOrder fsIntegralOrder)
     {
+        FsIntegralOrder order = fsIntegralOrderMapper.selectById(fsIntegralOrder.getOrderId());
+        //当前状态
+        Integer status = order.getStatus();
+        if (status.equals(2)){
+            throw new CustomException("积分订单无法修改为待支付状态");
+        }
+        if (status.equals(2)&&StrUtil.isBlank(fsIntegralOrder.getDeliverySn())) {
+            throw new CustomException("修改为待发货时,请填写物流单号");
+        }
+        //其他逻辑,目前暂定这个
         return fsIntegralOrderMapper.updateFsIntegralOrder(fsIntegralOrder);
     }
 
@@ -174,6 +249,11 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         return fsIntegralOrderMapper.selectFsIntegralOrderListVO(fsIntegralOrder);
     }
 
+    @Override
+    public List<FsIntegralOrderListVO> selectFsIntegralOrderListByJn(FsIntegralOrderParam fsIntegralOrder) {
+        return fsIntegralOrderMapper.selectFsIntegralOrderListJn(fsIntegralOrder);
+    }
+
     @Override
     public int sendGoods(FsIntegralOrder fsIntegralOrder) {
 
@@ -408,6 +488,9 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                 if (o==null){
                 throw new CustomException("没有此订单");
                 }
+//                if (StrUtil.isBlank(o.getLoginAccount())&&CloudHostUtils.hasCloudHostName("金牛明医")) {
+//                    throw new CustomException("订单未分拣");
+//                }
                 if (o.getStatus()!=1){
                     throw new CustomException("订单状态不为待发货");
                 }
@@ -434,6 +517,11 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                 order.setStatus(2);
 
                 int i = fsIntegralOrderMapper.updateFsIntegralOrder(order);
+                FsIntegralOrderDf df = new FsIntegralOrderDf();//和创建erp的按钮接口数据操作保持一致,修改df记录,订单状态修改为待收货。
+                df.setOrderId(order.getOrderId());
+                df.setIsPush(1);
+                df.setStatus(1);
+                fsIntegralOrderDfMapper.updateById(df);//有就更新,没有也不影响。目前金牛在使用代服表。
                 successNum++;
                 successMsg.append("<br/>" + successNum + "、订单编号 " + vo.getOrderCode() + " 导入成功");
 
@@ -662,6 +750,8 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         if (null==fsIntegralOrder){
             throw new ServiceException("订单不存在");
         }
+        log.info("用户:{}退款订单编号:{},退还积分{}", SecurityUtils.getLoginUser().getUser().getNickName(),fsIntegralOrder.getOrderCode(),fsIntegralOrder.getIntegral());
+        //物流退单操作
         //用户说自己去对接物流,不必校验是否发货。
 //        if (fsIntegralOrder.getStatus()!=1){
 //            throw new ServiceException("订单已发货或已完成");
@@ -684,7 +774,6 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
             fsUserIntegralLogs.setBusinessType(2);
             fsUserIntegralLogs.setStatus(0);
             i = fsUserIntegralLogsMapper.insertFsUserIntegralLogs(fsUserIntegralLogs);
-            //todo:库存是否需要退还,待定
         }
         return i;
     }
@@ -703,6 +792,319 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         return fsIntegralOrderMapper.finishOrder(fsIntegralOrder.getOrderId(), fsIntegralOrder.getStatus());
     }
 
+    @Override
+    public List<FsIntegralOrder> selectFsIntegralOrderByOrderIds(List<Long> orderIds) {
+        if (CollectionUtils.isEmpty(orderIds)) {
+            return Collections.emptyList();
+        }
+        return fsIntegralOrderMapper.findOrderByIds(orderIds);
+    }
+
+
+    @Override
+//    @Transactional(rollbackFor = Exception.class)
+    public void createErpOrder(Long orderId) throws ParseException {
+        //判断是否开启erp
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        Integer erpOpen = sysConfig.getErpOpen();
+        if (erpOpen == null || erpOpen == 0) {
+            return;
+        }
+        //判断erp类型
+        Integer erpType = sysConfig.getErpType();
+        if (erpType == null) {
+            return;
+        }
+        IErpOrderService erpOrderService = null;
+        ErpOrder erpOrder = new ErpOrder();
+        erpOrder.setShop_code(sysConfig.getErpShopCode());
+        if (erpType == 1) {
+            //管易
+            erpOrderService = gyOrderService;
+        } else if (erpType == 2) {
+            //旺店通
+            erpOrderService = wdtOrderService;
+        } else if (erpType == 3) {
+            //瀚智OMS
+            erpOrderService = hzOMSOrderService;
+        } else if (erpType == 4) {
+            //代服
+            erpOrderService = dfOrderService;
+        } else if (erpType == 5) {
+            //聚水潭
+            erpOrderService = jSTOrderService;
+            erpOrder.setShop_code(sysConfig.getErpJstShopCode());
+        }else if (erpType == 6) {
+            erpOrderService = k9OrderService;
+        } else {
+            return;
+        }
+        FsIntegralOrder order = fsIntegralOrderMapper.selectOne(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getOrderId, orderId));
+        if (order == null || !order.getStatus().equals(1)) {//1.待发货状态,只有待发货的订单可以创建erp订单
+            return;
+        }
+        if (order.getCompanyId() != null) {
+            erpOrder.setVip_code(order.getUserId().toString() + order.getCompanyId().toString());
+        } else {
+            erpOrder.setVip_code(order.getUserId().toString());
+        }
+        erpOrder.setPlatform_code(order.getOrderCode());
+
+        erpOrder.setBuyer_account(order.getUserName());
+        erpOrder.setSeller_memo(order.getRemark());
+        List<ErpOrderPayment> payments = new ArrayList<>();
+        ErpOrderPayment payment = new ErpOrderPayment();
+        payment.setPay_type_code("weixin");
+        payment.setPayment(order.getPayMoney().doubleValue());
+        if (order.getPayTime() != null) {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String timeString = sdf.format(Date.from((order.getPayTime().atZone(ZoneId.systemDefault()).toInstant())));
+            Date date = sdf.parse(timeString); // 时间格式转为时间戳
+            long timeLong = date.getTime();
+            payment.setPaytime(new Timestamp(timeLong));
+        }
+        payments.add(payment);
+
+        //物流代收都发 互联网医院顺丰
+        if (!("金牛明医".equals(cloudHostProper.getCompanyName()))) {
+            //由于积分商品的字段缺失,没有剩余金额,默认为0,固定走下面逻辑,注释掉if判断,删除else代码。
+//            if (order.getPayRemain().compareTo(new BigDecimal(0)) == 0) {
+                //没有物流代收
+                //大于100发发顺丰云配
+                if (order.getPayMoney().compareTo(new BigDecimal(100)) > 0) {
+                    //发互联网医院SF.0235488558_241101
+                    FsExpress express = expressService.selectFsExpressByOmsCode("SF.0235488558_241101");
+                    erpOrder.setExpress_code(express.getOmsCode());
+                    order.setDeliveryName(express.getName());
+                    order.setDeliveryCode(express.getCode());
+                } else {
+                    //发ztpdd
+                    FsExpress express = expressService.selectFsExpressByOmsCode("CDYJFYD.400011111705_241230");
+                    erpOrder.setExpress_code(express.getOmsCode());
+                    order.setDeliveryName(express.getName());
+                    order.setDeliveryCode(express.getCode());
+                }
+//            }
+        }
+
+        erpOrder.setPayments(payments);
+        if (order.getCompanyId() != null) {
+            Company company = companyService.selectCompanyById(order.getCompanyId());
+            if (company != null) {
+                erpOrder.setSeller_memo(company.getCompanyName());
+            }
+        }
+        if (order.getCompanyUserId() != null) {
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(order.getCompanyUserId());
+            if (companyUser != null) {
+                CompanyDept dept = companyDeptService.selectCompanyDeptById(companyUser.getDeptId());
+                if (dept != null) {
+                    List<String> names = companyDeptService.selectCompanyDeptNamesByIds(dept.getAncestors());
+                    if (names != null && names.size() > 0) {
+                        //写备注
+                        erpOrder.setSeller_memo(erpOrder.getSeller_memo() + "-" + StringUtils.join(names, ",") + "," + dept.getDeptName());
+                    }
+                }
+                erpOrder.setSeller_memo(erpOrder.getSeller_memo() + "-" + companyUser.getNickName());
+            }
+        }
+        ErpRemarkDTO remarkDTO = new ErpRemarkDTO();
+        remarkDTO.setTotalPrice(BigDecimal.ZERO);//order.getTotalPrice()积分订单没有这个字段,写0
+        remarkDTO.setPayPrice(BigDecimal.ZERO);//order.getPayPrice()积分订单没有这个字段,写0
+        remarkDTO.setDeliveryMoney(BigDecimal.ZERO);//order.getPayDelivery()积分订单没有这个字段,写0
+        remarkDTO.setPayMoney(order.getPayMoney());
+        remarkDTO.setCouponMoney(BigDecimal.ZERO);//order.getDiscountMoney()积分订单没有这个字段,写0
+        remarkDTO.setOrderId(order.getOrderCode());
+        remarkDTO.setYdMoney(BigDecimal.ZERO);//order.getPayPrice().subtract(order.getPayMoney().subtract(order.getPayDelivery()))积分订单没有这个字段,写0
+        if (order.getPayTime() != null) {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String format = sdf.format(Date.from((order.getPayTime().atZone(ZoneId.systemDefault()).toInstant())));
+            remarkDTO.setPayTime(format);
+        }
+        erpOrder.setSeller_memo(erpOrder.getSeller_memo() + JSONUtil.toJsonStr(remarkDTO));
+        erpOrder.setOrder_type_code("order");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        erpOrder.setDeal_datetime(sdf.format(new Date()));
+
+        FsStoreOrderItem itemMap = new FsStoreOrderItem();
+        itemMap.setOrderId(order.getOrderId());
+        String itemJson = order.getItemJson();
+        JSONArray jsonArray = JSON.parseArray(itemJson);
+        List<ErpOrderItem> details = new ArrayList<>();
+        jsonArray.forEach(obj -> {
+            JSONObject jsonObject = (JSONObject) obj;
+            ErpOrderItem item = new ErpOrderItem();
+            item.setOid(jsonObject.getString("goodsId"));
+            item.setItem_code(jsonObject.getString("barCode").trim());//商品编码
+            item.setPrice(jsonObject.getString("otPrice"));//市场价
+            item.setQty(jsonObject.getInteger("num"));//数量
+            item.setRefund(0);
+            details.add(item);
+        });
+        erpOrder.setDetails(details);
+        erpOrder.setReceiver_name(order.getUserName().replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9]", ""));
+
+        //推送人电话查询,默认使用df表的erpphone
+
+        FsIntegralOrderDf integralDfAccount = integralOrderDfService.getBaseMapper().selectById(order.getOrderId());
+        String phone = null;
+        if (StringUtils.isNotBlank(integralDfAccount.getErpPhone())) {
+            phone = integralDfAccount.getErpPhone();
+        } else {
+            if (order.getUserPhone().length() > 11) {
+                phone = decryptPhone(order.getUserPhone());
+            } else {
+                phone = order.getUserPhone();
+            }
+        }
+        if (phone.length() > 11) {
+            erpOrder.setReceiver_phone(phone);
+        } else {
+            erpOrder.setReceiver_mobile(phone);
+        }
+        String[] address = order.getUserAddress().split(" ");
+        try{
+            if (address.length < 3) {
+                String kdnAddress = fsUserAddressService.getKdnAddress(order.getUserAddress());
+                Map<String, Object> addDAta = (Map<String, Object>) com.alibaba.fastjson.JSON.parse(kdnAddress);
+                Map<String, String> add = (Map<String, String>) addDAta.get("Data");
+                erpOrder.setReceiver_province(add.get("ProvinceName"));
+                erpOrder.setReceiver_city(add.get("CityName"));
+                erpOrder.setReceiver_district(add.get("ExpAreaName"));
+                erpOrder.setReceiver_address(add.get("StreetName") + add.get("Address"));
+            } else {
+                erpOrder.setReceiver_province(address[0]);
+                erpOrder.setReceiver_city(address[1]);
+                erpOrder.setReceiver_district(address[2]);
+                //处理地址多空隔问题
+                if (address.length > 3) {
+                    StringBuffer addrs = new StringBuffer();
+                    for (int i = 3; i < address.length; i++) {
+                        addrs.append(address[i]);
+                    }
+                    erpOrder.setReceiver_address(addrs.toString());
+                } else if (address.length == 3) {
+                    erpOrder.setReceiver_address(address[2]);
+                }
+            }
+        }catch (Exception e){
+            log.error("地址错误:{}",e);
+            throw new CustomException("地址格式不对请正确写入详细地址!!");
+        }
+        erpOrder.setReceiver_address(erpOrder.getReceiver_address().replace("+", "加"));
+        erpOrder.setReceiver_address(erpOrder.getReceiver_address().replace("\n", ""));
+        erpOrder.setIsIntegralOrder(true);
+
+        ErpOrderResponse response = erpOrderService.addOrder(erpOrder);
+        log.info("ErpCreate:" + order.getOrderCode() + ":" + JSONUtil.toJsonStr(response));
+//        if (Boolean.TRUE.equals(response.getSuccess())) {
+//            //支付成功后 将订单号写入待发货的REDIS中
+////            redisCache.setCacheObject("delivery" + ":" + response.getCode(), order.getOrderCode());
+//            //更新推送标识
+//            integralDfAccount.setIsPush(1);
+//            integralOrderDfService.getBaseMapper().updateById(integralDfAccount);
+//        }
+    }
+
+    @Override
+    public String importOrderStatusData(List<FsIntegralOrderExcelVO> list) {
+        if (StringUtils.isNull(list) || list.isEmpty()) {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (FsIntegralOrderExcelVO vo : list) {
+            try {
+                //1.必填参数
+                ExcelUtils.validateRequiredFields(vo, list.indexOf(vo) + 1); // 传入行号
+
+                FsIntegralOrder order = fsIntegralOrderMapper.selectOne(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getOrderCode, vo.getOrderCode()));
+                if (order ==null){
+                    failureNum++;
+                    String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
+                    failureMsg.append(msg).append("订单不存在");
+                    continue;
+                }
+                FsIntegralOrder param = new FsIntegralOrder(); //修改订单的参数
+                param.setOrderCode(vo.getOrderCode());
+                param.setOrderId(order.getOrderId());
+                if ("6".equals(vo.getStatus())) {
+                    failureNum++;
+                    String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
+                    failureMsg.append(msg).append("该状态不支持修改为待推送");
+                    continue;
+                }
+                if ("-1".equals(vo.getStatus())) {
+                    failureNum++;
+                    String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
+                    failureMsg.append(msg).append("该状态不支持修改为退款中,需要手动申请退款");
+                    continue;
+                }
+                if ("-2".equals(vo.getStatus())) {
+                    failureNum++;
+                    String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
+                    failureMsg.append(msg).append("该状态不支持修改为退款中,需要审核完成退款");
+                    continue;
+                }
+
+                Integer status = order.getStatus();
+
+                if (StringUtils.isNotBlank(vo.getStatus())){
+                    param.setStatus(Integer.valueOf(vo.getStatus()));
+                    status = Integer.valueOf(vo.getStatus());
+                }
+                /**
+                 * 地址和电话仅待推送可以修改,积分没有代付款的订单
+                 */
+                String userAddress = vo.getUserAddress();
+                String userPhone = vo.getUserPhone();
+                if (StringUtils.isNotBlank(userAddress) || StringUtils.isNotBlank(userPhone)){
+                    if (Objects.equals(FsStoreOrderStatusEnum.STATUS_6.getValue(), status)) {
+                        param.setUserAddress(userAddress.isEmpty()?null:userAddress);
+                        param.setUserPhone(userPhone.isEmpty()?null:userPhone);
+                    } else {
+                        failureNum++;
+                        String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 修改失败:";
+                        failureMsg.append(msg).append("该状态不支持修改收货人地址或电话");
+                        continue;
+                    }
+                }
+                param.setDeliveryStatus((vo.getDeliveryStatus()==null|| vo.getDeliveryStatus().isEmpty())?null:Integer.valueOf(vo.getDeliveryStatus()));
+                param.setDeliveryType(vo.getDeliveryType().isEmpty()?null:vo.getDeliveryType());
+                param.setUpdateTime(DateUtils.getNowDate());
+
+                //修改订单金额
+//                BigDecimal payRemain = vo.getPayRemain();
+//                if (payRemain != null){
+//                    if (!payRemain.equals(order.getPayRemain())){
+//                        BigDecimal payMoney = order.getPayMoney(); //实收金额
+//                        param.setPayPrice(payMoney.add(payRemain)); //应收金额
+//                        param.setPayRemain(vo.getPayRemain());
+//                    }
+//                }
+                fsIntegralOrderMapper.updateById(param);
+
+                successNum++;
+                successMsg.append("<br/>").append(successNum).append("、订单编号 ").append(vo.getOrderCode()).append(" 修改成功");
+
+            } catch (Exception e) {
+
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 修改失败:";
+                failureMsg.append(msg).append(e.getMessage());
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
     /**
      * 处理手机号脱敏
      */

+ 3 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java

@@ -513,6 +513,9 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
         fsPrescribe.setUserId(packageOrder.getUserId());
         fsPrescribe.setPrescribeCode(IdUtil.getSnowflake(0, 0).nextIdStr());
         FsPackagePatientDTO patJson = JSON.parseObject(packageOrder.getPatientJson(),FsPackagePatientDTO.class);
+        if(patJson == null || patJson.getPatientId() == null){
+            return null;
+        }
         long currentTimeMillis = System.currentTimeMillis();
         long ageInMillis = currentTimeMillis - patJson.getBirthday();
         long ageInSeconds = ageInMillis / 1000;

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

@@ -4215,7 +4215,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                 Long doctorID = iFsDoctorService.selectFsDoctorDoctorByPackage();
                 packageOrder.setDoctorId(doctorID);
             }
-            if (packageSubType == 3 ) {
+            if (packageSubType == 3 && !CloudHostUtils.hasCloudHostName("金牛明医")) {
                 inquiryOrderService.createOrderByPackageOrderStatus4(packageOrder);
             }
             prescribeId = fsPrescribeService.insertFsPrescribeByPackageOrder(packageOrder);

+ 32 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderExcelVO.java

@@ -0,0 +1,32 @@
+package com.fs.his.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class FsIntegralOrderExcelVO {
+    @Excel(name = "药品订单号",required = true)
+    private String orderCode;
+
+    @Excel(name = "订单状态",dictType = "sys_integral_order_status")
+    private String status;
+
+//    @Excel(name = "物流代收金额")
+//    private BigDecimal payRemain;
+
+    /** 物流状态 */
+    @Excel(name = "物流状态",dictType = "sys_store_order_delivery_status")
+    private String deliveryStatus;
+
+    /** 物流跟踪状态 */
+    @Excel(name = "物流跟踪状态",dictType = "sys_delivery_type")
+    private String deliveryType;
+
+    /** shou */
+    @Excel(name = "收货人电话")
+    private String userPhone;
+    /** 详情地址 */
+    @Excel(name = "详情地址(例:广东省 韶关市 仁化县 亨特中心22楼)使用空格分割")
+    private String userAddress;
+
+}

+ 8 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderListVO.java

@@ -2,8 +2,10 @@ package com.fs.his.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
+import com.fs.common.utils.BigDecimalUtil;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -76,4 +78,10 @@ public class FsIntegralOrderListVO {
      * 销售公司ID
      * **/
     private Long companyId;
+
+    private BigDecimal payMoney;
+
+    private String erpPhone;
+
+    private String loginAccount;
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderPVO.java

@@ -3,6 +3,7 @@ package com.fs.his.vo;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import com.fs.his.config.IntegralConfig;
 import lombok.Data;
 
 import java.util.Date;
@@ -76,4 +77,8 @@ public class FsIntegralOrderPVO extends BaseEntity
     private String phone;
 
     private String loginAccount;
+
+    private String deliveryType;
+
+    private Integer deliveryStatus;
 }

+ 10 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreProductScrm.java

@@ -306,8 +306,18 @@ public class FsStoreProductScrm extends BaseEntity
     @Excel(name = "品牌")
     private String brand;
 
+    /** 食品生产许可证编码 */
+    @Excel(name = "食品生产许可证编码")
+    private String foodProductionLicenseCode;
 
     @Excel(name = "是否药品")
     private String isDrug;
 
+    /**
+     * 退货地址
+     */
+    @Excel(name = "退货地址")
+    private String returnAddress;
+
+
 }

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/enums/OrderInfoEnum.java

@@ -15,6 +15,7 @@ public enum OrderInfoEnum {
     STATUS_1(1,"待发货"),
     STATUS_2(2,"待收货"),
     STATUS_3(3,"已完成"),
+    STATUS_4(4,"待评价"),
 
     PAY_STATUS_0(0,"未支付"),
     PAY_STATUS_1(1,"已支付"),

+ 9 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsUserScrmMapper.java

@@ -21,6 +21,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -319,4 +320,12 @@ public interface FsUserScrmMapper
     Map<String, Long> countCourseDetailsNew(UserStatisticsCommonParam param);
     @Select("select * from fs_user where mp_open_id=#{openId}")
     FsUserScrm selectFsUserByOpenId(String openId);
+
+    /**
+     * 更新用户下单次数和累计成交总额
+     * @param userId 用户ID
+     * @param amount 成交金额
+     */
+    @Update("update fs_user set order_count = order_count + 1, total_amount = IFNULL(total_amount, 0) + #{amount} where user_id = #{userId}")
+    void updateUserOrderCountAndAmount(@Param("userId") Long userId, @Param("amount") BigDecimal amount);
 }

+ 9 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java

@@ -258,6 +258,15 @@ public class FsStoreProductAddEditParam implements Serializable
     @Excel(name = "品牌")
     private String brand;
 
+    /** 品牌 */
+    @Excel(name = "食品生产许可证编码")
+    private String foodProductionLicenseCode;
+
+    /** 退货地址 */
+    @Excel(name = "退货地址")
+    private String returnAddress;
+
+
     private Integer isDrug;
 
     //属性项目

+ 7 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsUserScrmService.java

@@ -5,7 +5,10 @@ import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
+import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.vo.OptionsVO;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.live.domain.LiveOrder;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
@@ -272,4 +275,8 @@ public interface IFsUserScrmService
     List<FSUserVO> selectFsUserVOListByProject(FsUserScrm fsUser);
 
     FsUserScrm selectFsUserByOpenId(String openid);
+
+    void addTuiLiveMoney(LiveOrder order, List<FsStoreProductAttrValueScrm> productAttrValues);
+
+    void subLiveTuiMoney(LiveOrder liveOrder);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -886,7 +886,7 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         storePayment.setCreateTime(new Date());
         storePayment.setPayTypeCode("weixin");
         storePayment.setBusinessType(1);//微信收款
-        storePayment.setRemark("商城收款订单支付");
+        storePayment.setRemark(StringUtils.isNotBlank(param.getRemark()) ? param.getRemark() : "商城收款订单支付");
         storePayment.setOpenId(user.getMaOpenId());
         storePayment.setUserId(user.getUserId());
         storePayment.setPayMode("hf");//目前微信收款仅支持汇付

+ 42 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserScrmServiceImpl.java

@@ -30,7 +30,9 @@ import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
+import com.fs.his.domain.FsUserBill;
 import com.fs.his.vo.OptionsVO;
+import com.fs.live.domain.LiveOrder;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
 import com.fs.hisStore.domain.*;
@@ -1073,6 +1075,46 @@ public class FsUserScrmServiceImpl implements IFsUserScrmService
         return fsUserMapper.selectFsUserByOpenId(openid);
     }
 
+    @Override
+    @Transactional
+    public void addTuiLiveMoney(LiveOrder order, List<FsStoreProductAttrValueScrm> productAttrValues) {
+        BigDecimal brokerage=BigDecimal.ZERO;
+        //返佣金
+        FsUserScrm user= fsUserMapper.selectFsUserById(order.getCompanyUserId());
+        for (FsStoreProductAttrValueScrm productAttrValue : productAttrValues) {
+            brokerage=brokerage.add(productAttrValue.getBrokerage().multiply(new BigDecimal(order.getTotalNum())));
+        }
+        if(brokerage.compareTo(BigDecimal.ZERO)==1){
+            FsUserScrm tuiUserMap=new FsUserScrm();
+            tuiUserMap.setUserId(user.getUserId());
+            tuiUserMap.setBrokeragePrice(user.getBrokeragePrice().add(brokerage));
+            fsUserMapper.updateFsUser(tuiUserMap);
+            billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),brokerage,tuiUserMap.getBrokeragePrice(),"订单返佣金",order.getOrderId().toString(),order.getCompanyUserId());
+        }
+    }
+
+    @Override
+    @Transactional
+    public void subLiveTuiMoney(LiveOrder liveOrder) {
+        FsUserBillScrm map=new FsUserBillScrm();
+        map.setCategory(CATEGORY_3.getValue());
+        map.setBusinessId(liveOrder.getOrderId().toString());
+        map.setBillType(1);
+        List<FsUserBillScrm> list=billService.selectFsUserBillList(map);
+        if(list!=null&&list.size()>0){
+            for(FsUserBillScrm bill:list){
+                FsUserScrm tuiUser= fsUserMapper.selectFsUserByIdForUpdate(bill.getUserId());
+                if(tuiUser!=null){
+                    FsUserScrm tuiUserMap=new FsUserScrm();
+                    tuiUserMap.setUserId(tuiUser.getUserId());
+                    tuiUserMap.setBrokeragePrice(tuiUser.getBrokeragePrice().subtract(bill.getNumber()));
+                    fsUserMapper.updateFsUser(tuiUserMap);
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(),0,BillDetailEnum.TYPE_6.getDesc(),bill.getNumber(),tuiUserMap.getBrokeragePrice(),"订单退佣金",liveOrder.getOrderId().toString(),bill.getTuiUserId());
+                }
+            }
+        }
+    }
+
     /**
      * 查询会员选项列表
      * @param params    参数

+ 2 - 1
fs-service/src/main/java/com/fs/live/domain/LiveOrderPayment.java

@@ -116,5 +116,6 @@ public class LiveOrderPayment extends BaseEntity{
     @Excel(name = "是否分账")
     private Integer isShare;
 
-
+    //小程序appId(用于多汇付支付/退款)
+    private String appId;
 }

+ 1 - 1
fs-service/src/main/java/com/fs/live/mapper/LiveCouponMapper.java

@@ -112,7 +112,7 @@ public interface LiveCouponMapper
             "from live_coupon_issue_relation lcir left join live_coupon_issue lci " +
             "left join live_coupon lc on lc.coupon_id=lci.coupon_id on lci.id = lcir.coupon_issue_id  " +
             "left join live_goods lg on lg.goods_id = lcir.goods_id " +
-            "left join fs_store_product fsp on lg.product_id = fsp.product_id " +
+            "left join fs_store_product_scrm fsp on lg.product_id = fsp.product_id " +
             "where lcir.live_id = #{liveId} and lcir.goods_id is not null")
     List<LiveCoupon> listOn(@Param("liveId") Long liveId);
 

+ 9 - 8
fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java

@@ -29,14 +29,6 @@ public interface LiveOrderMapper {
      */
     LiveOrder selectLiveOrderByOrderId(String orderId);
 
-    /**
-     * 查询订单
-     *
-     * @param orderId 订单主键
-     * @return 订单
-     */
-    @Select("select * from live_order where order_id=#{orderId}")
-    LiveOrder selectLiveOrderByOrderId(Long orderId);
 
     @Select("select order_code from live_order where order_id=#{orderId}")
     String selectLiveOrderCodeByOrderId(@Param("orderId") String orderId);
@@ -424,4 +416,13 @@ public interface LiveOrderMapper {
 
 
     List<LiveOrderVoZm> selectLiveOrderListZm(LiveOrder liveOrder);
+
+    @Select(" SELECT * from live_order WHERE item_json is NULL ORDER BY id DESC  LIMIT 30")
+    List<LiveOrder> selectLiveOrderItemJson();
+
+    @Update(" UPDATE live_order SET item_json=#{itemJson} WHERE order_id=#{orderId}")
+    void updateLiveOrderItemJson(LiveOrder storeOrder);
+
+    @Select("select * from live_order where  `status`=2 and (extend_order_id is not null and extend_order_id != '') and (delivery_id is not null and delivery_id != '')")
+    List<LiveOrder> selectShippedOrder();
 }

+ 1 - 0
fs-service/src/main/java/com/fs/live/param/LiveOrderPayParam.java

@@ -21,4 +21,5 @@ public class LiveOrderPayParam implements Serializable
      * 小程序多商城
      * **/
     private String appId;
+    private Integer payPirce;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/live/service/ILiveOrderService.java

@@ -234,4 +234,8 @@ public interface ILiveOrderService {
 
 
     List<LiveOrderVoZm> selectLiveOrderListZm(LiveOrder liveOrder);
+
+    R handleLiveOrderPay(LiveOrderPayParam param);
+
+    List<LiveOrder> selectLiveOrderItemJson();
 }

+ 2 - 0
fs-service/src/main/java/com/fs/live/service/ILiveService.java

@@ -187,4 +187,6 @@ public interface ILiveService
     int updateLiveEntity(Live live);
 
     void updateGlobalVisible(long liveId, Integer status);
+
+    String getGotoWxAppLiveLink(String linkStr, String appid);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java

@@ -406,7 +406,7 @@ public class LiveAfterSalesServiceImpl implements ILiveAfterSalesService {
         request.setRefund_state(1);
         request.setStoreAfterSalesId(storeAfterSales.getId());
         if (StringUtils.isNotBlank(order.getExtendOrderId())){
-            BaseResponse response=erpOrderService.refundUpdateScrm(request);
+            BaseResponse response=erpOrderService.refundUpdateLive(request);
             if(response.getSuccess()){
                 return R.ok();
             }

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 574 - 301
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java


+ 85 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.live.service.impl;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
@@ -7,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
 
 import com.fs.common.exception.base.BaseException;
 import com.fs.company.mapper.CompanyMapper;
+import com.fs.core.config.WxMaConfiguration;
 import com.fs.his.domain.FsStoreProduct;
 import com.fs.his.domain.FsUser;
 import com.fs.his.mapper.FsUserMapper;
@@ -31,16 +33,26 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
 import okhttp3.FormBody;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.Response;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.fs.common.utils.sign.Md5Utils;
 
 import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
@@ -101,6 +113,10 @@ public class LiveServiceImpl implements ILiveService
     @Autowired
     private LiveCouponMapper liveCouponMapper;
 
+    private static String TOKEN_VALID_CODE = "40001";
+
+    private static volatile Integer version = 0;
+
 
 
     /**
@@ -363,6 +379,75 @@ public class LiveServiceImpl implements ILiveService
         baseMapper.updateGlobalVisible(liveId, status);
     }
 
+    @Override
+    public String getGotoWxAppLiveLink(String linkStr, String appId) {
+        CloseableHttpClient client = null;
+        try {
+            client = HttpClients.createDefault();
+            String[] split = linkStr.split("\\?");
+            if (split.length == 2 && split[0].length() > 0 && split[1].length() > 0) {
+                //处理页面路径
+                String pageUrl = split[0];
+                if (pageUrl.startsWith("/")) {
+                    pageUrl = pageUrl.substring(1);
+                }
+                //处理参数
+                String query = split[1];
+                query = URLEncoder.encode(query, StandardCharsets.UTF_8.toString());
+//                String json = configService.selectConfigByKey("course.config");
+//                CourseConfig config = JSON.parseObject(json, CourseConfig.class);
+//                String miniprogramAppid = config.getMiniprogramAppid();
+//                if (StringUtils.isBlank(miniprogramAppid)) {
+//                    return "未配置点播小程序id";
+//                }
+                //获取微信token
+                final WxMaService wxService = WxMaConfiguration.getMaService(appId);
+                String token = wxService.getAccessToken();
+                log.info("小程序TOKEN值-------->刷新前TOKEN:{}", token);
+                HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + token);
+                JSONObject bodyObj = new JSONObject();
+                bodyObj.put("path", pageUrl);
+                bodyObj.put("query", query);
+                log.info("微信小程序请求参数打印:{}", bodyObj.toJSONString());
+                StringEntity entity = new StringEntity(bodyObj.toJSONString(),"UTF-8");
+                httpPost.setEntity(entity);
+                httpPost.setHeader("Content-type", "application/json");
+                httpPost.setHeader("cache-control","max-age=0");
+                HttpEntity response = client.execute(httpPost).getEntity();
+                String responseString = EntityUtils.toString(response);
+                log.info("微信小程序接口响应数据:{}", responseString);
+                JSONObject jsonObject = JSONObject.parseObject(responseString);
+
+                if(TOKEN_VALID_CODE.equals(jsonObject.getString("errcode"))){
+                    Integer curVersion =  Integer.valueOf(version);
+                    synchronized (TOKEN_VALID_CODE){
+                        if(curVersion.equals(version)){
+                            log.info("小程序TOKEN:40001进入强制刷新-------->刷新前TOKEN:{}", token);
+                            wxService.getAccessToken(true);
+                            version = version.equals(Integer.MAX_VALUE) ? 0 : curVersion + 1;
+                            log.info("小程序TOKEN:40001进入强制刷新-------->刷新后TOKEN:{}", wxService.getAccessToken());
+                        }
+                        return getGotoWxAppLiveLink(linkStr,appId);
+                    }
+                }
+
+                if(null != jsonObject && !jsonObject.isEmpty() && jsonObject.containsKey("url_link")){
+                    return jsonObject.getString("url_link");
+                }
+            } else {
+                return "页面链接错误,获取失败";
+            }
+
+        } catch (WxErrorException e) {
+            throw new RuntimeException(e);
+        } catch (ClientProtocolException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return "";
+    }
+
     /**
      * 修改直播
      *

+ 3 - 0
fs-service/src/main/java/com/fs/live/vo/LiveDataListVo.java

@@ -74,3 +74,6 @@ public class LiveDataListVo {
 
 
 
+
+
+

+ 3 - 0
fs-service/src/main/java/com/fs/live/vo/LiveDataStatisticsVo.java

@@ -55,3 +55,6 @@ public class LiveDataStatisticsVo {
 
 
 
+
+
+

+ 1 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -405,7 +405,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             " WHERE user_id = #{map.userId}   " +
             "AND corp_id =#{map.corpId} " +
             "AND external_user_id = #{map.externalUserId}" +
-            "AND `status` != 4 " +
+            "AND `status` != 4 AND `status` != 5" +
             "ORDER BY id desc " +
             "limit 1 ")
     QwExternalContact getQwExternalContactDetails(@Param("map")QwExternalContactHParam param);

+ 1 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java

@@ -152,7 +152,7 @@ public interface QwUserMapper extends BaseMapper<QwUser>
             "left join fastgpt_role fr on fr.role_id=qu.fastGpt_role_id " +
             "where qu.company_user_id is not null "+
             "            <if test=\"qwUserId != null  and qwUserId != ''\"> and qu.qw_user_id = #{qwUserId}</if>\n" +
-            "            <if test=\"loginStatus != null  and loginStatus != ''\"> and qu.ipad_status = #{loginStatus}</if>\n" +
+            "            <if test=\"loginStatus != null \"> and qu.ipad_status = #{loginStatus}</if>\n" +
             "            <if test=\"appKey != null  and appKey != ''\"> and qu.app_key = #{appKey}</if>\n" +
             "            <if test=\"nickName != null  and nickName != ''\"> and cu.nick_name like concat( #{nickName}, '%') </if>\n" +
             "            <if test=\"qwUserName != null  and qwUserName != ''\"> and qu.qw_user_name like concat('%', #{qwUserName}, '%') </if> " +

+ 6 - 1
fs-service/src/main/resources/application-config-druid-bjzm-test.yml

@@ -97,4 +97,9 @@ wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:
 
-
+# 聚水潭API配置
+jst:
+  app_key: 86b28953506749a1b6845332c1497308 #聚水潭2025-08-15
+  app_secret: 808ea0f49de04e13886b1aca6e504fc3 #聚水潭2025-08-15
+  authorization_code: 777777
+  shop_code: "19544649"

+ 6 - 0
fs-service/src/main/resources/application-config-druid-bjzm.yml

@@ -98,3 +98,9 @@ wx_miniapp_temp:
   inquiry_temp_id:
 
 
+# 聚水潭API配置
+jst:
+  app_key: 86b28953506749a1b6845332c1497308 #聚水潭2025-08-15
+  app_secret: 808ea0f49de04e13886b1aca6e504fc3 #聚水潭2025-08-15
+  authorization_code: 777777
+  shop_code: "19544649"

+ 1 - 1
fs-service/src/main/resources/application-config-druid-qdtst.yml

@@ -64,7 +64,7 @@ fs :
   h5CommonApi: http://10.206.0.16:8010
   jwt:
     # 加密秘钥
-    secret: f4q2d52034348t86b67ste581c0f9eb5
+    secret: f4q2d52034348t86b678s1581c0f9eb5
     # token有效时长,7天,单位秒
     expire: 31536000
     header: AppToken

+ 108 - 0
fs-service/src/main/resources/application-config-druid-sczy.yml

@@ -0,0 +1,108 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: wx4115995705bb0ea0   #中康智慧
+        secret: 58910ae743005c396012b029c7def579
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+      - appid: wxedde588767b358b1   #中康未来智慧药房
+        secret: 928d2961c81610d8f64b019597212fcd
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwb2a1055fb6c9a7c2
+    appConfigs:
+      - agentId: 1000005
+        secret: ec7okROXJqkNafq66-L6aKNv0asTzQIG0CYrj3vyBbo
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId: wx73f85f8d62769119 #微信公众号或者小程序等的appid
+    mchId: 1611402045 #微信支付商户号
+    mchKey: 8cab128997a3547c1363b0898b877f38 #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wx75c1870516078d81 # 第一个公众号的appid  //公众号名称:吉林港森
+        secret: 40b40e50e0439fb77d438ea31b053ab0 # 公众号的appsecret
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+  # 开放平台app微信授权配置
+  open:
+    app-id: wxe4d352ea8ddbcf3c
+    secret: be6c179d79fcf97cbfb0b36c08877220
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://8.130.78.34:8010
+  h5CommonApi: http://8.130.78.34:8010
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9e14
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: sczy-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: sczy
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 四川致医
+  projectCode: SCZY
+headerImg:
+  imgUrl: https://jiuzhouzaixian.obs.cn-southwest-2.myhuaweicloud.com/fs/20250623/1750665141214.png
+ipad:
+  ipadUrl: http://ipad.beijingzhuomei.com
+  aiApi:
+  voiceApi:
+  commonApi:
+wx_miniapp_temp:
+  pay_order_temp_id: VXEvKaGNPFuJmhWK9O_QPrTZxe9umDCukq-maI8Vdek
+  inquiry_temp_id: 9POPYeqhI48LOPvq-Rfoklze7H-9SlunJKh10Qt4_2I
+# 0 代表关闭 1代表开启(润天老商户号的扣款限制)
+enableRedPackAccount: 1

+ 2 - 2
fs-service/src/main/resources/application-druid-bjzm-test.yml

@@ -39,7 +39,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                   username: root
                   password: Ylrz_1q2w3e4r5t6y
                 # 从库数据源
@@ -94,7 +94,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
                     password: Ylrz_1q2w3e4r5t6y
                 # 初始连接数

+ 2 - 2
fs-service/src/main/resources/application-druid-bjzm.yml

@@ -39,7 +39,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                  url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                   username: root
                   password: Ylrz_1q2w3e4r5t6y
                 # 从库数据源
@@ -94,7 +94,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://gz-cdb-ofgnuz1n.sql.tencentcdb.com:26872/fs_his_sop?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
                     password: Ylrz_1q2w3e4r5t6y
                 # 初始连接数

+ 180 - 0
fs-service/src/main/resources/application-druid-sczy.yml

@@ -0,0 +1,180 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-sczy,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 8.130.165.154
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: Ylrztek250218!3@.
+        # 连接超时时间
+        timeout: 20s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 100
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+        #        clickhouse:
+        #            type: com.alibaba.druid.pool.DruidDataSource
+        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+        #            url: jdbc:clickhouse://cc-2vc8zzo26w0l7m2l6.public.clickhouse.ads.aliyuncs.com/sop?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+        #            username: rt_2024
+        #            password: Yzx_19860213
+        #            initialSize: 10
+        #            maxActive: 100
+        #            minIdle: 10
+        #            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://rm-0jl66x1uoytye36x8.mysql.rds.aliyuncs.com:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 200
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: false
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://rm-0jl66x1uoytye36x8.mysql.rds.aliyuncs.com:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                read:
+                    url: jdbc:mysql://rm-0jl66x1uoytye36x8.mysql.rds.aliyuncs.com:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 200
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: false
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+custom:
+    token: "1o62d3YxvdHd4LEUiltnu7sK"
+    encoding-aes-key: "UJfTQ5qKTKlegjkXtp1YuzJzxeHlUKvq5GyFbERN1iU"
+    corp-id: "ww51717e2b71d5e2d3"
+    secret: "6ODAmw-8W4t6h9mdzHh2Z4Apwj8mnsyRnjEDZOHdA7k"
+    private-key-path: "privatekey.pem"
+    webhook-url: "https://your-server.com/wecom/archive"
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 180
+openIM:
+    secret: openIM123
+    userID: imAdmin
+    url: https://web.im.fbylive.com/api
+#是否使用新im
+im:
+    type: NONE
+#是否为新商户,新商户不走mpOpenId
+isNewWxMerchant: false
+
+enableRedPackAccount: 1

+ 1 - 1
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -464,7 +464,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         from company_user cu
         <where>
             <if test="params.nickName != null and params.nickName != ''">
-                and cu.nick_name like concat(#{params.nickName}, '%')
+                and cu.nick_name like concat( '%',#{params.nickName}, '%')
             </if>
             <if test="params.companyId != null">
                 and cu.company_id = #{params.companyId}

+ 5 - 0
fs-service/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml

@@ -21,6 +21,7 @@
         <result property="courseLogo"    column="course_logo"    />
         <result property="openCommentStatus"    column="open_comment_status"    />
         <result property="periodLine"    column="period_line"    />
+        <result property="isNeedRegisterMember"    column="is_need_register_member"    />
     </resultMap>
 
     <sql id="selectFsUserCoursePeriodVo">
@@ -48,6 +49,7 @@
         SELECT
         fs_user_course_period.period_id,
         fs_user_course_period.period_name,
+        fs_user_course_period.is_need_register_member,
         fs_user_course_period.company_id,
         fs_user_course_period.training_camp_id,
         fs_user_course_period.create_time,
@@ -95,6 +97,7 @@
         insert into fs_user_course_period
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="periodId != null">period_id,</if>
+            <if test="isNeedRegisterMember != null">is_need_register_member,</if>
             <if test="periodName != null">period_name,</if>
             <if test="companyId != null">company_id,</if>
             <if test="trainingCampId != null">training_camp_id,</if>
@@ -117,6 +120,7 @@
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="periodId != null">#{periodId},</if>
+            <if test="isNeedRegisterMember != null">#{isNeedRegisterMember},</if>
             <if test="periodName != null">#{periodName},</if>
             <if test="companyId != null">#{companyId},</if>
             <if test="trainingCampId != null">#{trainingCampId},</if>
@@ -143,6 +147,7 @@
         update fs_user_course_period
         <trim prefix="SET" suffixOverrides=",">
             <if test="periodName != null">period_name = #{periodName},</if>
+            <if test="isNeedRegisterMember != null">is_need_register_member = #{isNeedRegisterMember},</if>
             <if test="companyId != null">company_id = #{companyId},</if>
             <if test="trainingCampId != null">training_camp_id = #{trainingCampId},</if>
             <if test="createTime != null">create_time = #{createTime},</if>

+ 127 - 0
fs-service/src/main/resources/mapper/his/FsIntegralOrderDfMapper.xml

@@ -0,0 +1,127 @@
+<?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.FsIntegralOrderDfMapper">
+
+    <resultMap type="FsIntegralOrderDf" id="FsIntegralOrderDfResult">
+        <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="expressProductCode"    column="express_product_code"    />
+        <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"    />
+        <result property="failMsg"    column="fail_msg"    />
+        <result property="parcelQuantity"    column="parcel_quantity"    />
+        <result property="erpPhone"    column="erp_phone"    />
+        <result property="isPush"    column="is_push"    />
+    </resultMap>
+
+    <sql id="selectFsIntegralOrderDfVo">
+        select order_id, order_code, app_key, app_secret, login_account, monthly_card, express_product_code, total_price, platform_price, status, create_time, update_time, fail_msg, parcel_quantity, is_push from fs_integral_order_df
+    </sql>
+
+    <select id="selectFsIntegralOrderDfList" parameterType="FsIntegralOrderDf" resultMap="FsIntegralOrderDfResult">
+        <include refid="selectFsIntegralOrderDfVo"/>
+        <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="expressProductCode != null  and expressProductCode != ''"> and express_product_code = #{expressProductCode}</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>
+            <if test="failMsg != null  and failMsg != ''"> and fail_msg = #{failMsg}</if>
+            <if test="parcelQuantity != null "> and parcel_quantity = #{parcelQuantity}</if>
+        </where>
+    </select>
+
+    <select id="selectFsIntegralOrderDfByOrderId" parameterType="Long" resultMap="FsIntegralOrderDfResult">
+        <include refid="selectFsIntegralOrderDfVo"/>
+        where order_id = #{orderId}
+    </select>
+    <select id="selectByIsPush" resultType="com.fs.his.domain.FsIntegralOrderDf">
+        SELECT fiod.*
+        FROM fs_integral_order_df fiod
+                 INNER JOIN fs_integral_order fio ON fio.order_id = fiod.order_id
+        WHERE fiod.is_push = 1
+          AND fio.delivery_sn IS NULL
+    </select>
+
+    <insert id="insertFsIntegralOrderDf" parameterType="FsIntegralOrderDf">
+        insert into fs_integral_order_df
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">order_id,</if>
+            <if test="orderCode != null">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="expressProductCode != null">express_product_code,</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>
+            <if test="failMsg != null">fail_msg,</if>
+            <if test="parcelQuantity != null">parcel_quantity,</if>
+            <if test="erpPhone != null">erp_phone,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderId != null">#{orderId},</if>
+            <if test="orderCode != null">#{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="expressProductCode != null">#{expressProductCode},</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>
+            <if test="failMsg != null">#{failMsg},</if>
+            <if test="parcelQuantity != null">#{parcelQuantity},</if>
+            <if test="erpPhone != null">#{erpPhone},</if>
+        </trim>
+    </insert>
+
+    <update id="updateFsIntegralOrderDf" parameterType="FsIntegralOrderDf">
+        update fs_integral_order_df
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="orderCode != null">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="expressProductCode != null">express_product_code = #{expressProductCode},</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>
+            <if test="failMsg != null">fail_msg = #{failMsg},</if>
+            <if test="parcelQuantity != null">parcel_quantity = #{parcelQuantity},</if>
+        </trim>
+        where order_id = #{orderId}
+    </update>
+
+    <delete id="deleteFsIntegralOrderDfByOrderId" parameterType="Long">
+        delete from fs_integral_order_df where order_id = #{orderId}
+    </delete>
+
+    <delete id="deleteFsIntegralOrderDfByOrderIds" parameterType="String">
+        delete from fs_integral_order_df where order_id in
+        <foreach item="orderId" collection="array" open="(" separator="," close=")">
+            #{orderId}
+        </foreach>
+    </delete>
+</mapper>

+ 74 - 0
fs-service/src/main/resources/mapper/his/FsIntegralOrderMapper.xml

@@ -56,6 +56,80 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsIntegralOrderVo"/>
         where order_id = #{orderId}
     </select>
+    <select id="findOrderByIds" resultType="com.fs.his.domain.FsIntegralOrder">
+        SELECT * FROM fs_integral_order
+        WHERE order_id IN
+        <foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
+            #{orderId}
+        </foreach>
+    </select>
+    <select id="selectFsIntegralOrderListJn" resultType="com.fs.his.vo.FsIntegralOrderListVO">
+        SELECT
+        fio.order_id,
+        fio.order_code,
+        fio.user_id,
+        fio.user_name,
+        fio.user_phone,
+        fio.user_address,
+        fio.item_json,
+        fio.integral,
+        fio.pay_money,
+        fio.is_pay,
+        fio.pay_time,
+        fio.pay_type,
+        fio.`STATUS`,
+        fio.delivery_code,
+        fio.delivery_name,
+        fio.delivery_sn,
+        fio.delivery_time,
+        fio.create_time,
+        fio.qw_user_id,
+        fio.company_user_id,
+        fio.company_id,
+        fio.remark,
+        fio.login_account,
+        fiod.erp_phone
+        FROM
+        fs_integral_order fio
+        LEFT JOIN fs_integral_order_df fiod
+        ON fiod.order_id = fio.order_id
+        WHERE
+        1 = 1
+        <!-- 订单编码精确查询 -->
+        <if test="orderCode != null and orderCode != ''"> AND fio.order_code = #{orderCode} </if>
+        <!-- 用户名模糊查询 -->
+        <if test="userName != null and userName != ''"> AND fio.user_name LIKE CONCAT('%', #{userName}, '%') </if>
+        <!-- 用户手机号精确查询 -->
+        <if test="userPhone != null and userPhone != ''"> AND fio.user_phone = #{userPhone} </if>
+        <!-- 积分精确查询 -->
+        <if test="integral != null and integral != ''"> AND fio.integral = #{integral} </if>
+        <!-- 支付金额精确查询 -->
+        <if test="payMoney != null and payMoney != ''"> AND fio.pay_money = #{payMoney} </if>
+        <!-- 支付状态精确查询 -->
+        <if test="isPay != null and isPay != ''"> AND fio.is_pay = #{isPay} </if>
+        <!-- 支付时间精确查询 -->
+        <if test="payTime != null and payTime != ''"> AND fio.pay_time = #{payTime} </if>
+        <!-- 支付类型精确查询 -->
+        <if test="payType != null and payType != ''"> AND fio.pay_type = #{payType} </if>
+        <!-- 订单状态精确查询 -->
+        <if test="status != null and status != ''"> AND fio.status = #{status} </if>
+        <!-- 快递单号模糊查询 -->
+        <if test="deliverySn != null and deliverySn != ''"> AND fio.delivery_sn LIKE CONCAT('%', #{deliverySn}, '%') </if>
+        <!-- 企微用户ID精确查询 -->
+        <if test="qwUserId != null and qwUserId != ''"> AND fio.qw_user_id = #{qwUserId} </if>
+        <!-- 公司用户ID精确查询 -->
+        <if test="companyUserId != null and companyUserId != ''"> AND fio.company_user_id = #{companyUserId} </if>
+        <!-- 公司ID精确查询 -->
+        <if test="companyId != null and companyId != ''"> AND fio.company_id = #{companyId} </if>
+        <!-- 创建时间范围查询(开始时间) -->
+        <if test="sTime != null"> AND DATE(fio.create_time) &gt;= DATE(#{sTime}) </if>
+        <!-- 创建时间范围查询(结束时间) -->
+        <if test="eTime != null"> AND DATE(fio.create_time) &lt;= DATE(#{eTime}) </if>
+        <if test="loginAccount != null and loginAccount !=''"> AND fio.login_account = #{loginAccount} </if>
+        <if test="isPush != null"> AND COALESCE(fiod.is_push, 0) = 0 </if>
+        ORDER BY
+        fio.order_id DESC
+    </select>
 
     <insert id="insertFsIntegralOrder" parameterType="FsIntegralOrder" useGeneratedKeys="true" keyProperty="orderId">
         insert into fs_integral_order

+ 16 - 3
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -68,6 +68,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="precautions" column="precautions"/>
         <result property="isAudit" column="is_audit"/>
         <result property="storeId" column="store_id"/>
+        <result property="returnAddress"    column="return_address"    />
+        <result property="brand"    column="brand"    />
+        <result property="foodProductionLicenseCode"    column="food_production_license_code"    />
     </resultMap>
 
     <sql id="selectFsStoreProductVo">
@@ -78,7 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                integral, product_type, prescribe_code, prescribe_spec, prescribe_factory, prescribe_name,
                is_display,tui_cate_id,company_ids,is_drug,drug_image,drug_reg_cert_no,common_name,dosage_form,
                unit_price,batch_number,mah,mah_address,manufacturer,manufacturer_address,indications,dosage,
-               adverse_reactions,contraindications,precautions,is_audit,store_id
+               adverse_reactions,contraindications,precautions,is_audit,store_id,return_address,brand,food_production_license_code
                from fs_store_product_scrm
     </sql>
 
@@ -90,7 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                p.integral, p.product_type, p.prescribe_code, p.prescribe_spec, p.prescribe_factory, p.prescribe_name,
                p.is_display,p.tui_cate_id,p.company_ids,p.is_drug,p.drug_image,p.drug_reg_cert_no,p.common_name,p.dosage_form,
                p.unit_price,p.batch_number,p.mah,p.mah_address,p.manufacturer,p.manufacturer_address,p.indications,p.dosage,
-               p.adverse_reactions,p.contraindications,p.precautions,p.is_audit,p.store_id
+               p.adverse_reactions,p.contraindications,p.precautions,p.is_audit,p.store_id,p.return_address,p.brand,p.food_production_license_code
         from fs_store_product_scrm p
     </sql>
 
@@ -159,6 +162,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="precautions != null and precautions != ''">and precautions = #{precautions} </if>
             <if test="isAudit != null and isAudit != ''">and is_audit = #{isAudit} </if>
             <if test="storeId != null and storeId != ''">and store_id = #{storeId} </if>
+            <if test="brand != null and brand != ''">and brand = #{brand} </if>
+            <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">and food_production_license_code = #{foodProductionLicenseCode} </if>
         </where>
     </select>
 
@@ -254,6 +259,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="precautions != null and precautions != ''">precautions ,</if>
             <if test="isAudit != null and isAudit != ''">is_audit ,</if>
             <if test="storeId != null and storeId != ''">store_id ,</if>
+            <if test="returnAddress != null">return_address,</if>
+            <if test="brand != null and brand != ''">brand,</if>
+            <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">food_production_license_code,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="image != null and image != ''">#{image},</if>
@@ -318,6 +326,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="precautions != null and precautions != ''">#{precautions} ,</if>
             <if test="isAudit != null and isAudit != ''">#{isAudit} ,</if>
             <if test="storeId != null and storeId != ''">#{storeId} ,</if>
+            <if test="returnAddress != null">#{returnAddress},</if>
+            <if test="brand != null and brand != ''">#{brand},</if>
+            <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">#{foodProductionLicenseCode},</if>
          </trim>
     </insert>
 
@@ -386,7 +397,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="precautions != null and precautions != ''">precautions = #{precautions} ,</if>
             <if test="isAudit != null and isAudit != ''">is_audit = #{isAudit} ,</if>
             <if test="storeId != null and storeId != ''">store_id = #{storeId} ,</if>
-
+            <if test="returnAddress != null">return_address = #{returnAddress},</if>
+            <if test="brand != null and brand != ''">brand = #{brand},</if>
+            <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">food_production_license_code = #{foodProductionLicenseCode},</if>
         </trim>
         where product_id = #{productId}
     </update>

+ 12 - 0
fs-service/src/main/resources/mapper/live/LiveOrderMapper.xml

@@ -214,6 +214,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderCode != null and orderCode != ''">order_code,</if>
             <if test="userId != null and userId != ''">user_id,</if>
             <if test="realName != null">real_name,</if>
+            <if test="userName != null">user_name,</if>
             <if test="userPhone != null">user_phone,</if>
             <if test="userAddress != null">user_address,</if>
             <if test="cartId != null">cart_id,</if>
@@ -285,6 +286,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderCode != null and orderCode != ''">#{orderCode},</if>
             <if test="userId != null and userId != ''">#{userId},</if>
             <if test="realName != null">#{realName},</if>
+            <if test="userName != null">#{userName},</if>
             <if test="userPhone != null">#{userPhone},</if>
             <if test="userAddress != null">#{userAddress},</if>
             <if test="cartId != null">#{cartId},</if>
@@ -360,6 +362,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderCode != null and orderCode != ''">order_code = #{orderCode},</if>
             <if test="userId != null and userId != ''">user_id = #{userId},</if>
             <if test="realName != null">real_name = #{realName},</if>
+            <if test="userName != null">user_name = #{userName},</if>
             <if test="userPhone != null">user_phone = #{userPhone},</if>
             <if test="userAddress != null">user_address = #{userAddress},</if>
             <if test="cartId != null">cart_id = #{cartId},</if>
@@ -528,6 +531,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="maps.realName != null and  maps.realName !=''">
             and o.user_name like CONCAT('%',#{maps.realName},'%')
         </if>
+        <if test="maps.userName != null and  maps.userName !=''">
+            and o.user_name like CONCAT('%',#{maps.userName},'%')
+        </if>
         <if test="maps.phone != null and  maps.phone !=''">
             and u.phone like CONCAT('%',#{maps.phone},'%')
         </if>
@@ -687,6 +693,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.realName != null and  maps.realName !=''">
                 and o.user_name like CONCAT('%',#{maps.realName},'%')
             </if>
+            <if test="maps.userName != null and  maps.userName !=''">
+                and o.user_name like CONCAT('%',#{maps.userName},'%')
+            </if>
             <if test="maps.phone != null and  maps.phone !=''">
                 and u.phone like CONCAT('%',#{maps.phone},'%')
             </if>
@@ -828,6 +837,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.realName != null and  maps.realName !=''">
                 and o.user_name like CONCAT('%',#{maps.realName},'%')
             </if>
+            <if test="maps.userName != null and  maps.userName !=''">
+                and o.user_name like CONCAT('%',#{maps.userName},'%')
+            </if>
             <if test="maps.phone != null and  maps.phone !=''">
                 and u.phone like CONCAT('%',#{maps.phone},'%')
             </if>

+ 3 - 0
fs-service/src/main/resources/mapper/live/LiveOrderPaymentMapper.xml

@@ -146,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="shareCode != null">share_code,</if>
             <if test="shareMoney != null">share_money,</if>
             <if test="isShare != null">is_share,</if>
+            <if test="appId != null">app_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="payCode != null">#{payCode},</if>
@@ -173,6 +174,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="shareCode != null">#{shareCode},</if>
             <if test="shareMoney != null">#{shareMoney},</if>
             <if test="isShare != null">#{isShare},</if>
+            <if test="appId != null">#{appId},</if>
          </trim>
     </insert>
 
@@ -204,6 +206,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="shareCode != null">share_code = #{shareCode},</if>
             <if test="shareMoney != null">share_money = #{shareMoney},</if>
             <if test="isShare != null">is_share = #{isShare},</if>
+            <if test="appId != null">app_id = #{appId},</if>
         </trim>
         where payment_id = #{paymentId}
     </update>

+ 1 - 0
fs-service/src/main/resources/mapper/sop/QwSopMapper.xml

@@ -580,6 +580,7 @@
     <select id="selectAllQwSopInfo" parameterType="QwSop" resultMap="QwSopResult">
         <include refid="selectQwSopVo"/>
         <where>
+            status != 6
             <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
             <if test="status != null "> and status = #{status}</if>
             <if test="type != null "> and type = #{type}</if>

+ 11 - 0
fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java

@@ -11,6 +11,7 @@ import com.fs.huifuPay.domain.HuiFuOnlinePay;
 import com.fs.huifuPay.domain.HuiFuOnlineRefund;
 import com.fs.huifuPay.domain.HuiFuResult;
 import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
+import com.fs.live.service.ILiveOrderService;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -36,6 +37,8 @@ public class HuifuPayController {
     private IFsCourseProductOrderService courseProductOrderService;
     @Autowired
     private IFsStorePaymentService storePaymentService;
+    @Autowired
+    private ILiveOrderService liveOrderService;
 
     org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
     @Autowired
@@ -112,6 +115,14 @@ public class HuifuPayController {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
                     break;
+                case "live":
+                    liveOrderService.payConfirm(1,null,orderId[1], huiFuResult.getHf_seq_id(),huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
+//                    try {
+//                        HuiFuUtils.updateDivItem(orderId[1]);
+//                    } catch (Exception e) {
+//                        logger.error("-------分账明细回调错误{}", e.getMessage());
+//                    }
+                    break;
             }
         }
 

+ 273 - 22
fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java

@@ -67,6 +67,10 @@ import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.transaction.annotation.Transactional;
@@ -79,6 +83,8 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
+import static com.fs.hisStore.constants.UserAppsLockConstant.LOCK_KEY_PAY;
+
 /**
  * 订单Controller
  *
@@ -90,6 +96,9 @@ import java.util.concurrent.TimeUnit;
 @RequestMapping("/app/live/liveOrder")
 public class LiveOrderController extends AppBaseController
 {
+    Logger logger= LoggerFactory.getLogger(getClass());
+    @Autowired
+    private RedissonClient redissonClient;
     @Autowired
     private ILiveOrderService orderService;
 
@@ -118,26 +127,6 @@ public class LiveOrderController extends AppBaseController
     @Autowired
     private HuiFuService huiFuService;
 
-    @Autowired
-    @Qualifier("erpOrderServiceImpl")
-    private IErpOrderService gyOrderService;
-
-    @Autowired
-    @Qualifier("wdtErpOrderServiceImpl")
-    private IErpOrderService wdtOrderService;
-
-    @Autowired
-    @Qualifier("k9OrderScrmServiceImpl")
-    private IErpOrderService k9OrderService;
-
-    @Autowired
-    private ConfigUtil configUtil;
-
-
-    @Autowired
-    private IFsExpressService expressService;
-    @Autowired
-    private JwtUtils jwtUtils;
 
     /**
      * 查询订单列表
@@ -316,6 +305,151 @@ public class LiveOrderController extends AppBaseController
         return orderService.createLiveOrder(param);
     }
 
+//    @Login
+//    @ApiOperation("支付")
+//    @PostMapping("/pay")
+//    @Transactional
+//    //@Synchronized
+//    public R pay(HttpServletRequest request, @Validated @RequestBody LiveOrderPayParam param)
+//    {
+//        LiveOrder order=orderService.selectLiveOrderByOrderId(String.valueOf(param.getOrderId()));
+//        if(order==null){
+//            return R.error("订单不存在");
+//        }
+//        if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
+//            return R.error("订单状态不正确");
+//        }
+//        String orderId=redisCache.getCacheObject("isPaying:"+order.getOrderId());
+//        if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getOrderId().toString())){
+//            return R.error("正在支付中...");
+//        }
+//
+//        FsUserScrm user=userService.selectFsUserById(Long.valueOf(order.getUserId()));
+//        if(user!=null&& StringUtils.isNotEmpty(user.getMaOpenId())){
+//            //已改价处理
+//            if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
+//                //改过价不做处理
+//
+//            }
+//            else{
+//                String config=configService.selectConfigByKey("his.store");
+//                StoreConfig storeConfig= JSONUtil.toBean(config,StoreConfig.class);
+//                if(param.getPayType().equals(1)){
+//                    order.setPayType("1");
+//                    order.setPayMoney(order.getPayPrice());
+//                    order.setPayDelivery(BigDecimal.ZERO);
+//                }
+//                else if(param.getPayType().equals(2)){
+//                    order.setPayType("2");
+//                    BigDecimal payMoney=order.getPayPrice().multiply(new BigDecimal(storeConfig.getPayRate())).divide(new BigDecimal(100));
+//                    payMoney=new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+//                    order.setPayDelivery(order.getPayPrice().subtract(payMoney));
+//                    order.setPayMoney(payMoney);
+//                }
+//                else if(param.getPayType().equals(3)){
+//                    //货到付款
+//                    order.setPayType("3");
+//                    BigDecimal amount=redisCache.getCacheObject("orderAmount:"+order.getOrderId());
+//                    BigDecimal payMoney = BigDecimal.ZERO;
+//                    if (amount != null){
+//                        payMoney=amount;
+//                    }
+//                    order.setPayMoney(payMoney);
+//                    order.setPayDelivery(order.getPayPrice().subtract(payMoney) );
+////                    order.setPayMoney(BigDecimal.ZERO);
+//                }
+//                orderService.updateLiveOrder(order);
+//            }
+//            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+////            order.setOrderCode(orderCode);
+////            if(order.getPayType().equals("1")||order.getPayType().equals("2")){
+//            if((order.getPayType().equals("1")||order.getPayType().equals("2")||order.getPayType().equals("3")) && order.getPayMoney().compareTo(new BigDecimal(0))>0){
+//                String json = configService.selectConfigByKey("his.pay");
+//                FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
+//                LiveOrderPayment storePayment=new LiveOrderPayment();
+//                storePayment.setCompanyId(order.getCompanyId());
+//                storePayment.setCompanyUserId(order.getCompanyUserId());
+//                storePayment.setPayMode(fsPayConfig.getType());
+//                storePayment.setStatus(0);
+//                storePayment.setPayCode(payCode);
+//                storePayment.setPayMoney(order.getPayMoney());
+//                storePayment.setCreateTime(new Date());
+//                storePayment.setPayTypeCode("weixin");
+//                storePayment.setBusinessType(2);
+//                storePayment.setRemark("直播订单支付");
+//                storePayment.setOpenId(user.getRealName());
+//                storePayment.setUserId(user.getUserId());
+//                storePayment.setBusinessId(String.valueOf(order.getOrderId()));
+//                liveOrderPaymentMapper.insertLiveOrderPayment(storePayment);
+//
+//                if (fsPayConfig.getType().equals("hf")){
+//                    HuiFuCreateOrder o = new HuiFuCreateOrder();
+//                    o.setTradeType("T_MINIAPP");
+//                    o.setOpenid(user.getMaOpenId());
+//                    o.setReqSeqId("live-"+storePayment.getPayCode());
+//                    o.setTransAmt(storePayment.getPayMoney().toString());
+//                    o.setGoodsDesc("直播订单支付");
+//                    if (param != null && StringUtils.isNotBlank(param.getAppId())) {
+//                        o.setAppId(param.getAppId());
+//                    }
+//                    HuifuCreateOrderResult result = huiFuService.createOrder(o);
+//                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+//                        LiveOrderPayment mt=new LiveOrderPayment();
+//                        mt.setPaymentId(storePayment.getPaymentId());
+//                        mt.setTradeNo(result.getHf_seq_id());
+//                        liveOrderPaymentMapper.updateLiveOrderPayment(mt);
+//                        redisCache.setCacheObject("isPaying:"+order.getOrderId(),order.getOrderId().toString(),1, TimeUnit.MINUTES);
+//                        Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+//                        String s = (String) resultMap.get("package");
+//                        resultMap.put("packageValue",s);
+//                        return R.ok().put("payType",param.getPayType()).put("result",resultMap);
+//                    }
+//                    else{
+//                        return R.error(result.getResp_desc());
+//                    }
+//                }else  if (fsPayConfig.getType().equals("wx")){
+//                    WxPayConfig payConfig = new WxPayConfig();
+//                    payConfig.setAppId(fsPayConfig.getAppId());
+//                    payConfig.setMchId(fsPayConfig.getWxMchId());
+//                    payConfig.setMchKey(fsPayConfig.getWxMchKey());
+//                    payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+//                    payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+//                    payConfig.setKeyPath(fsPayConfig.getKeyPath());
+//                    payConfig.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
+//                    wxPayService.setConfig(payConfig);
+//                    WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+//                    orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
+//                    orderRequest.setBody("直播订单支付");
+//                    orderRequest.setOutTradeNo("live-" + storePayment.getPayCode());
+//                    orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
+//                    //orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(money));//测试
+//                    orderRequest.setTradeType("JSAPI");
+//                    orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+//                    //调用统一下单接口,获取"预支付交易会话标识"
+//                    try {
+//                        WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
+//                        return R.ok().put("result", orderResult).put("type", "wx").put("isPay", 0).put("payType",param.getPayType());
+//                    } catch (WxPayException e) {
+//                        e.printStackTrace();
+//                        throw new CustomException("支付失败" + e.getMessage());
+//                    }
+//                }
+//            }
+////            else if(order.getPayType().equals("3")){
+//            else if(order.getPayType().equals("3") && order.getPayMoney().compareTo(new BigDecimal(0))<=0){
+//                //货到付款
+//                orderService.payConfirm(2,order.getOrderId(),null,null,null,null);
+//                return R.ok().put("payType",param.getPayType());
+//            }
+//            return R.error();
+//        }
+//        else{
+//            return R.error("用户OPENID不存在");
+//        }
+//
+//    }
+
+    /*
     @Login
     @ApiOperation("支付")
     @PostMapping("/pay")
@@ -323,6 +457,37 @@ public class LiveOrderController extends AppBaseController
     //@Synchronized
     public R pay(HttpServletRequest request, @Validated @RequestBody LiveOrderPayParam param)
     {
+        Long orderId = param.getOrderId();
+        logger.info("开始处理支付请求, 订单号: {}, 支付类型: {}", orderId, param.getPayType());
+
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_PAY,orderId));
+        R result = null;
+
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
+            }
+
+            result = orderService.pay(param);
+
+        } catch (InterruptedException e) {
+            logger.error("获取支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("支付锁已释放, 订单号: {}", orderId);
+            }
+        }
+
+        return result;
         LiveOrder order=orderService.selectLiveOrderByOrderId(String.valueOf(param.getOrderId()));
         if(order==null){
             return R.error("订单不存在");
@@ -459,7 +624,95 @@ public class LiveOrderController extends AppBaseController
         }
 
     }
+        /**
+     * 获取订单详细信息
+     */
+    @Login
+    @GetMapping(value = "/info/{orderId}")
+    public AjaxResult getInfo(@PathVariable("orderId") String orderId)
+    {
+        log.info("获取订单详细信息 参数: {}",orderId);
 
+        return AjaxResult.success(orderService.selectLiveOrderByOrderId(orderId));
+    }
+
+    @Login
+    @ApiOperation("支付")
+    @PostMapping("/pay")
+    @Transactional
+    public R pay(HttpServletRequest request, @Validated @RequestBody LiveOrderPayParam param)
+    {
+        Long orderId = param.getOrderId();
+        logger.info("开始处理支付请求, 订单号: {}, 支付类型: {}", orderId, param.getPayType());
+
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_PAY,orderId));
+        R result = null;
+
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
+            }
+
+            result = orderService.handleLiveOrderPay(param);
+
+        } catch (InterruptedException e) {
+            logger.error("获取支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("支付锁已释放, 订单号: {}", orderId);
+            }
+        }
+
+        return result;
+    }
+
+    @Login
+    @ApiOperation("取消支付")
+    @PostMapping("/cancelPay")
+    public R cancelPay(@Validated @RequestBody LiveOrderPayParam param) {
+        Long orderId = param.getOrderId();
+        logger.info("用户取消支付 订单号: {}, 支付类型: {}", orderId, param.getPayType());
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_PAY,orderId));
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请稍后再试");
+            }
+            handleCancelLiveOrderPay(param);
+            return R.ok();
+        } catch (InterruptedException e) {
+            logger.error("获取取消支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("取消支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("取消支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("取消支付锁已释放, 订单号: {}", orderId);
+            }
+        }
+    }
+
+
+
+    private void handleCancelLiveOrderPay(LiveOrderPayParam param) {
+        LiveOrder liveOrder = new LiveOrder();
+        liveOrder.setOrderId(param.getOrderId());
+        orderService.cancelOrder(liveOrder);
+        redisCache.deleteObject("isPaying:"+param.getOrderId());
+    }
 
 
 
@@ -519,8 +772,6 @@ public class LiveOrderController extends AppBaseController
                 else if(param.getPayType().equals(3)){
                     //货到付款
                     order.setPayType("3");
-//                    order.setPayDelivery(order.getPayPrice() );
-//                    order.setPayMoney(BigDecimal.ZERO);
                     BigDecimal amount=redisCache.getCacheObject("orderAmount:"+order.getOrderId());
                     BigDecimal payMoney = BigDecimal.ZERO;
                     if (amount != null){

+ 11 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/PayScrmController.java

@@ -11,6 +11,7 @@ import com.fs.erp.service.IErpOrderService;
 import com.fs.hisStore.service.*;
 import com.fs.huifuPay.domain.HuiFuResult;
 import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
+import com.fs.live.service.ILiveOrderService;
 import com.fs.ybPay.domain.OrderCallback;
 import com.fs.ybPay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
@@ -58,6 +59,8 @@ public class PayScrmController {
     private IFsStorePaymentScrmService storePaymentService;
     @Autowired
     private IFsExpressScrmService expressService;
+    @Autowired
+    private ILiveOrderService liveOrderService;
 
     @Autowired
     private ICompanyService companyService;
@@ -98,6 +101,14 @@ public class PayScrmController {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
                     return storePaymentService.payConfirm(order[1],o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+                case "live":
+                    liveOrderService.payConfirm(1,null,order[1], o.getHf_seq_id(),o.getOut_trans_id(),o.getParty_order_id());
+//                    try {
+//                        HuiFuUtils.updateDivItem(orderId[1]);
+//                    } catch (Exception e) {
+//                        logger.error("-------分账明细回调错误{}", e.getMessage());
+//                    }
+                    break;
             }
 
         }

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است