Просмотр исходного кода

Merge branch 'master' into bjcz_his_scrm

# Conflicts:
#	fs-admin/src/main/java/com/fs/his/task/Task.java
#	fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java
#	fs-company/src/main/java/com/fs/company/controller/common/Test.java
#	fs-service/src/main/java/com/fs/course/config/CourseConfig.java
#	fs-service/src/main/java/com/fs/course/param/FsUserCourseOrderDoPayParam.java
#	fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
#	fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java
#	fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
#	fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
#	fs-service/src/main/java/com/fs/hisStore/domain/FsStorePaymentScrm.java
#	fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderPayParam.java
#	fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentPayParam.java
#	fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
#	fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java
#	fs-service/src/main/resources/application-druid-bjczwh.yml
#	fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
#	fs-service/src/main/resources/mapper/hisStore/FsStorePaymentScrmMapper.xml
#	fs-user-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
#	fs-user-app/src/main/java/com/fs/app/controller/PatientController.java
#	fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java
#	fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java
吴树波 1 день назад
Родитель
Сommit
1a74b9054d
100 измененных файлов с 3300 добавлено и 291 удалено
  1. 60 0
      fs-admin/src/main/java/com/fs/course/task/CompanyBalanceTask.java
  2. 5 3
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  3. 38 9
      fs-admin/src/main/java/com/fs/his/task/Task.java
  4. 3 3
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  5. 7 4
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  6. 29 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java
  7. 37 4
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  8. 5 2
      fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactTransferCompanyAuditController.java
  9. 103 0
      fs-admin/src/main/java/com/fs/qw/controller/QwUserComplainRecordController.java
  10. 7 2
      fs-admin/src/main/java/com/fs/qw/controller/QwUserController.java
  11. 27 0
      fs-admin/src/main/java/com/fs/task/SgTestController.java
  12. 27 0
      fs-admin/src/main/java/com/fs/task/SyncTuLinStudentInfoTask.java
  13. 2 2
      fs-common-api/src/main/resources/application.yml
  14. 5 0
      fs-common/src/main/java/com/fs/common/constant/FsConstants.java
  15. 7 0
      fs-common/src/main/java/com/fs/common/enums/ImTypeEnum.java
  16. 8 7
      fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  17. 2 2
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  18. 39 0
      fs-company/src/main/java/com/fs/company/controller/common/CommonController.java
  19. 222 9
      fs-company/src/main/java/com/fs/company/controller/common/Test.java
  20. 9 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyProfileController.java
  21. 15 6
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  22. 5 2
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferCompanyAuditController.java
  23. 71 0
      fs-company/src/main/java/com/fs/company/controller/store/FsPrescribeController.java
  24. 2 2
      fs-company/src/main/resources/application.yml
  25. 4 3
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java
  26. 16 10
      fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java
  27. 40 25
      fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  28. 41 1
      fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java
  29. 18 2
      fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java
  30. 2 2
      fs-doctor-app/src/main/resources/mybatis/mybatis-config.xml
  31. 1 1
      fs-ipad-task/src/main/resources/application.yml
  32. 35 2
      fs-qw-api/src/main/java/com/fs/app/controller/CommonController.java
  33. 46 0
      fs-qw-api/src/main/java/com/fs/app/controller/QwUserComplainRecordController.java
  34. 1 1
      fs-qwhook-sop/src/main/resources/application.yml
  35. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java
  36. 3 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  37. 5 0
      fs-service/src/main/java/com/fs/course/config/CourseConfig.java
  38. 267 0
      fs-service/src/main/java/com/fs/course/domain/BalanceRollbackError.java
  39. 59 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCompanyUserQw.java
  40. 18 0
      fs-service/src/main/java/com/fs/course/mapper/BalanceRollbackErrorMapper.java
  41. 61 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserQwMapper.java
  42. 3 3
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  43. 1 1
      fs-service/src/main/java/com/fs/course/param/FsUserCourseOrderDoPayParam.java
  44. 16 0
      fs-service/src/main/java/com/fs/course/service/BalanceRollbackErrorService.java
  45. 61 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCompanyUserQwService.java
  46. 0 1
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintRecordService.java
  47. 172 0
      fs-service/src/main/java/com/fs/course/service/impl/BalanceRollbackErrorServiceImpl.java
  48. 94 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCompanyUserQwServiceImpl.java
  49. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintRecordServiceImpl.java
  50. 134 7
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  51. 3 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java
  52. 1 0
      fs-service/src/main/java/com/fs/erp/dto/ErpRefundUpdateRequest.java
  53. 10 0
      fs-service/src/main/java/com/fs/erp/dto/OrderItemDTO.java
  54. 110 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushScrmMapper.java
  55. 77 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushScrmMapper.java
  56. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushScrmService.java
  57. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstCodPushScrmService.java
  58. 3 0
      fs-service/src/main/java/com/fs/erp/service/IErpGoodsService.java
  59. 1 1
      fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java
  60. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  61. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java
  62. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java
  63. 176 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushScrmServiceImpl.java
  64. 12 8
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java
  65. 55 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushScrmServiceImpl.java
  66. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpGoodsServiceImpl.java
  67. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java
  68. 93 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java
  69. 144 20
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  70. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java
  71. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9StockScrmServiceImpl.java
  72. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java
  73. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  74. 1 0
      fs-service/src/main/java/com/fs/his/dto/InquiryConfigDTO.java
  75. 4 0
      fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java
  76. 1 0
      fs-service/src/main/java/com/fs/his/enums/FsStoreOrderLogEnum.java
  77. 1 0
      fs-service/src/main/java/com/fs/his/mapper/FsInquiryOrderMapper.java
  78. 21 0
      fs-service/src/main/java/com/fs/his/mapper/FsPrescribeMapper.java
  79. 9 1
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  80. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderComputeParam.java
  81. 2 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderCreateParam.java
  82. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderDoPayParam.java
  83. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderPayParam.java
  84. 27 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListDCompanyParam.java
  85. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListDParam.java
  86. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListUParam.java
  87. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeParam.java
  88. 1 0
      fs-service/src/main/java/com/fs/his/service/IFsInquiryOrderService.java
  89. 18 0
      fs-service/src/main/java/com/fs/his/service/IFsPackageOrderService.java
  90. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsPrescribeService.java
  91. 7 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java
  92. 32 22
      fs-service/src/main/java/com/fs/his/service/impl/FsDoctorServiceImpl.java
  93. 3 0
      fs-service/src/main/java/com/fs/his/service/impl/FsFollowReportServiceImpl.java
  94. 38 34
      fs-service/src/main/java/com/fs/his/service/impl/FsFollowServiceImpl.java
  95. 1 1
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderMsgServiceImpl.java
  96. 72 35
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java
  97. 116 37
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
  98. 14 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java
  99. 304 9
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  100. 4 6
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

+ 60 - 0
fs-admin/src/main/java/com/fs/course/task/CompanyBalanceTask.java

@@ -0,0 +1,60 @@
+package com.fs.course.task;
+
+import com.fs.course.service.BalanceRollbackErrorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 公司余额同步定时任务
+ * @author: Xgb
+ * @createDate: 2025/10/22
+ * @version: 1.0
+ */
+@Component("companyBalanceTask")
+public class CompanyBalanceTask {
+
+
+    @Autowired
+    private BalanceRollbackErrorService balanceRollbackErrorService;
+
+
+    /**
+     * @Description: 每 ? 秒从缓存获取余额同步到公司账户中 todo 待完善
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 10:56
+     */
+    public void syncCompanyBalance() {
+
+    }
+
+    /**
+     * @Description: 定时回滚公司余额数据
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 11:48
+     */
+    public void processBatchRollbackByCompanyId() {
+        balanceRollbackErrorService.processBatchRollbackByCompanyId();
+    }
+
+    /**
+     * @Description: spring启动执行 查询余额报存到缓存中 当缓存没数据时
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 11:52
+     */
+    @EventListener(ApplicationReadyEvent.class)
+    public void initCompanyBalance() {
+        balanceRollbackErrorService.initCompanyBalance();
+
+    }
+
+
+
+}

+ 5 - 3
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -122,6 +122,9 @@ public class FsStoreOrderController extends BaseController
 
     @Autowired
     private IFsStoreOrderLogsService fsStoreOrderLogsService;
+
+    @Autowired
+    private IFsDfAccountService fsDfAccountService;
     /**
      * 查询订单列表
      */
@@ -956,10 +959,9 @@ public class FsStoreOrderController extends BaseController
     {
         List<String> list = new ArrayList<>();
         if (CloudHostUtils.hasCloudHostName("金牛明医","康年堂")){
-            List<DFConfigVo> erpAccounts = fsStoreOrderService.getErpAccount();
-            list = erpAccounts.stream().map(DFConfigVo::getLoginAccount).collect(Collectors.toList());
+                List<FsDfAccount> erpAccounts = fsDfAccountService.selectFsDfAccountList(null);
+                list = erpAccounts.stream().map(FsDfAccount::getLoginAccount).collect(Collectors.toList());
         }
-
         return R.ok().put("data", list);
     }
 }

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

@@ -53,6 +53,7 @@ import com.fs.his.service.*;
 import com.fs.his.service.impl.FsPackageOrderServiceImpl;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsSubOrderResultVO;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
@@ -631,12 +632,8 @@ public class Task {
         } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService || erpOrderService == jSTOrderService) {
             orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOp();
         }
-
-
-        for (FsStoreOrder order : orders) {
-
-            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
-
+        for(FsStoreOrder order:orders){
+            ErpOrderQueryRequert request=new ErpOrderQueryRequert();
             request.setCode(order.getExtendOrderId());
             if (erpOrderService != null) {
                 ErpOrderQueryResponse response = erpOrderService.getOrder(request);
@@ -651,20 +648,52 @@ public class Task {
                                         redisCache.deleteObject("delivery" + ":" + order.getExtendOrderId());
                                     }
                                 }
-
                             }
                         }
                     }
                 }
             }
+        }
+    }
 
+    public void deliveryOpScrm()
+    {
+        IErpOrderService erpOrderService = getErpService();
+        List<FsStoreOrderScrm> orders = null;
+        if (erpOrderService == gyOrderService){
+            orders = fsStoreOrderMapper.selectOmsOrderdeliveryOpScrm();
+        } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService || erpOrderService == jSTOrderService){
+            orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOpScrm();
+        }
+        for(FsStoreOrderScrm order:orders){
+            ErpOrderQueryRequert request=new ErpOrderQueryRequert();
+            request.setCode(order.getExtendOrderId());
+            if (erpOrderService != null){
+                ErpOrderQueryResponse response=erpOrderService.getScrmOrder(request);
+                if (erpOrderService != dfOrderService){
+                    if(response.getOrders()!=null&&response.getOrders().size()>0){
+                        for(ErpOrderQuery orderQuery : response.getOrders()){
+                            if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
+                                for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                                    if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
+                                        //更新商订单状态 删除REDIS
+                                        fsStoreOrderService.deliveryOrderScrm(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                        redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
         }
 
 
     }
 
 
-    public void getOrderDeliveryStatus() {
+    public void getOrderDeliveryStatus()
+    {
         IErpOrderService erpOrderService = getErpService();
         List<FsStoreOrder> orders = null;
         if (erpOrderService != null && erpOrderService == dfOrderService) {
@@ -788,6 +817,7 @@ public class Task {
     }
 
 
+
     @Autowired
     private ICompanyService companyService;
 
@@ -1460,7 +1490,6 @@ public class Task {
 
     }
 
-
     /**
      * 定时任务-im 会员催课,每一分钟执行一次
      */

+ 3 - 3
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java

@@ -78,9 +78,9 @@ public class FsStoreHealthOrderScrmController extends BaseController {
     /**
      * 查询健康商城订单列表
      */
-    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:list')")
-    @PostMapping("/healthList")
-    public TableDataInfo healthStoreList(@RequestBody FsStoreOrderParam param) {
+//    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:list')")
+      @PostMapping("/healthList")
+      public TableDataInfo healthStoreList(@RequestBody FsStoreOrderParam param) {
         startPage();
         if(!StringUtils.isEmpty(param.getCreateTimeRange())){
             param.setCreateTimeList(param.getCreateTimeRange().split("--"));

+ 7 - 4
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -641,7 +641,7 @@ public class FsStoreOrderScrmController extends BaseController {
         IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(order.getExtendOrderId());
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
         if(response.getOrders()!=null&&response.getOrders().size()>0){
             for(ErpOrderQuery orderQuery : response.getOrders()){
                 if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
@@ -732,7 +732,7 @@ public class FsStoreOrderScrmController extends BaseController {
         IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(extendOrderId);
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
         return R.ok().put("data",response);
     }
 
@@ -932,8 +932,11 @@ public class FsStoreOrderScrmController extends BaseController {
     @GetMapping("/getErpAccount")
     public R getErpAccount()
     {
-        List<FsDfAccount> erpAccounts = fsDfAccountService.selectFsDfAccountList(null);
-        List<String> list = erpAccounts.stream().map(FsDfAccount::getLoginAccount).collect(Collectors.toList());
+        List<String> list = new ArrayList<>();
+        if (CloudHostUtils.hasCloudHostName("金牛明医","康年堂")) {
+            List<FsDfAccount> erpAccounts = fsDfAccountService.selectFsDfAccountList(null);
+            list = erpAccounts.stream().map(FsDfAccount::getLoginAccount).collect(Collectors.toList());
+        }
         return R.ok().put("data", list);
     }
 

+ 29 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -1,6 +1,7 @@
 package com.fs.hisStore.controller;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.domain.AlipayTradeRefundModel;
 import com.fs.bean.AliPayBean;
@@ -13,7 +14,12 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.service.ICompanyService;
+import com.fs.config.cloud.CloudHostProper;
+import com.fs.his.domain.FsHfpayConfig;
+import com.fs.his.mapper.FsHfpayConfigMapper;
+import com.fs.hisStore.domain.FsPayConfigScrm;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
@@ -24,6 +30,7 @@ import com.fs.hisStore.param.FsStorePaymentParam;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStorePaymentScrmService;
 import com.fs.hisStore.vo.FsStorePaymentVO;
+import com.fs.system.service.ISysConfigService;
 import com.ijpay.alipay.AliPayApi;
 import com.ijpay.alipay.AliPayApiConfig;
 import com.ijpay.alipay.AliPayApiConfigKit;
@@ -63,6 +70,10 @@ public class FsStorePaymentScrmController extends BaseController
     private IFsStoreOrderScrmService orderService;
     @Autowired
     HuiFuService huiFuService;
+    @Autowired
+    private CloudHostProper cloudHostProper;
+    @Autowired
+    private ISysConfigService configService;
     /**
      * 查询支付明细列表
      */
@@ -185,10 +196,27 @@ public class FsStorePaymentScrmController extends BaseController
         if(payment.getPayMoney().compareTo(fsStorePayment.getRefundMoney())==-1){
             return R.error("退款金额必须小于等于付款金额");
         }
-        if(payment.getPayTypeCode().equals("weixin")){
 
+        if(payment.getPayTypeCode().equals("weixin")){
+            String json = configService.selectConfigByKey("store.pay");
+            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
             if (payment.getPayMode()!=null&&payment.getPayMode().equals("hf")){
+                String huifuId="";
+                FsHfpayConfigMapper fsHfpayConfigMapper = SpringUtils.getBean(FsHfpayConfigMapper.class);
+                if (payment.getAppId() != null) {
+                    FsHfpayConfig fsHfpayConfig = fsHfpayConfigMapper.selectByAppId(payment.getAppId());
+                    huifuId = fsHfpayConfig.getHuifuId();
+                } else {
+                    if (("益善缘".equals(cloudHostProper.getCompanyName()))) {
+
+                        FsHfpayConfig fsPayConfig2 = fsHfpayConfigMapper.selectByAppId("wx0d1a3dd485268521");
+                        huifuId = fsPayConfig2.getHuifuId();
+                    }else {
+                        huifuId=fsPayConfig.getHuifuId();
+                    }
+                }
                 V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+                request.setHuifuId(huifuId);
                 request.setOrdAmt(payment.getPayMoney().toString());
                 request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                 request.setReqSeqId("refund-"+payment.getPayCode());

+ 37 - 4
fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -17,7 +17,9 @@ import com.fs.erp.dto.ErpOrderQueryResponse;
 import com.fs.erp.service.IErpGoodsService;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.dto.ExpressInfoDTO;
+import com.fs.his.mapper.FsStoreProductAttrValueMapper;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
@@ -93,7 +95,7 @@ public class MallStoreTask
     @Autowired
     private ISysConfigService configService;
     @Autowired
-    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueMapper;
+    private FsStoreProductAttrValueMapper fsStoreProductAttrValueMapper;
     @Autowired
     private FsStorePaymentScrmMapper paymentMapper;
     @Autowired
@@ -232,8 +234,8 @@ public class MallStoreTask
         String json=configService.selectConfigByKey("store.config");
         StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
 
-        List<FsStoreProductAttrValueScrm> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValueScrm());
-        for (FsStoreProductAttrValueScrm value : values) {
+        List<FsStoreProductAttrValue> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValue());
+        for (FsStoreProductAttrValue value : values) {
             ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
             query.setCode(value.getBarCode());
             ErpGoodsQueryResponse goods = erpGoodsService.getGoods(query);
@@ -246,7 +248,7 @@ public class MallStoreTask
                     BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
                     System.out.println("代理价格"+divide);
                     System.out.println("成本价"+salesPrice);
-                    FsStoreProductAttrValueScrm va = new FsStoreProductAttrValueScrm();
+                    FsStoreProductAttrValue va = new FsStoreProductAttrValue();
                     va.setCost(salesPrice);
                     va.setAgentPrice(divide);
                     va.setId(value.getId());
@@ -255,9 +257,40 @@ public class MallStoreTask
             }
             System.out.println(goods);
         }
+    }
+
 
+    @Autowired
+    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueScrmMapper;
+
+    public void storeProdUpdateCostPriceScrm()
+    {
+        String json=configService.selectConfigByKey("store.config");
+        StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
 
+        List<FsStoreProductAttrValueScrm> values = fsStoreProductAttrValueScrmMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValueScrm());
+        for (FsStoreProductAttrValueScrm value : values) {
+            ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
+            query.setCode(value.getBarCode());
+            ErpGoodsQueryResponse goods = erpGoodsService.getGoodsScrm(query);
+            List<ErpGoods> items = goods.getItems();
 
+            if (items!=null&&items.size()>0){
+                ErpGoods erpGoods = items.get(0);
+                BigDecimal salesPrice = erpGoods.getSales_price();
+                if (salesPrice!=null&&salesPrice.compareTo(BigDecimal.ZERO) != 0){
+                    BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
+                    System.out.println("代理价格"+divide);
+                    System.out.println("成本价"+salesPrice);
+                    FsStoreProductAttrValueScrm va = new FsStoreProductAttrValueScrm();
+                    va.setCost(salesPrice);
+                    va.setAgentPrice(divide);
+                    va.setId(value.getId());
+                    fsStoreProductAttrValueScrmMapper.updateFsStoreProductAttrValue(va);
+                }
+            }
+            System.out.println(goods);
+        }
     }
     public void couponOp()
     {

+ 5 - 2
fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactTransferCompanyAuditController.java

@@ -6,6 +6,7 @@ import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.qw.domain.QwExternalContactTransferCompanyAudit;
+import com.fs.qw.domain.QwExternalContactTransferCompanyAuditUser;
 import com.fs.qw.dto.CompanyTransferAuditDTO;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditService;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditUserService;
@@ -35,8 +36,10 @@ public class QwExternalContactTransferCompanyAuditController extends BaseControl
 
     @PreAuthorize("@ss.hasPermi('qw:externalContactTransferCompanyAudit:detail')")
     @GetMapping("/detail/{auditId}")
-    public AjaxResult detail(@PathVariable Long auditId) {
-        return AjaxResult.success(auditUserService.getListByAuditId(auditId));
+    public TableDataInfo detail(@PathVariable Long auditId) {
+        startPage();
+        List<QwExternalContactTransferCompanyAuditUser> listByAuditId = auditUserService.getListByAuditId(auditId);
+        return getDataTable(listByAuditId);
     }
 
     @PreAuthorize("@ss.hasPermi('qw:externalContactTransferCompanyAudit:audit')")

+ 103 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwUserComplainRecordController.java

@@ -0,0 +1,103 @@
+package com.fs.qw.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.qw.domain.QwUserComplainRecord;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 企微员工投诉记录Controller
+ *
+ * @author fs
+ * @date 2025-10-22
+ */
+@RestController
+@RequestMapping("/qw/record")
+public class QwUserComplainRecordController extends BaseController
+{
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    /**
+     * 查询企微员工投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwUserComplainRecord qwUserComplainRecord)
+    {
+        startPage();
+        List<QwUserComplainRecord> list = qwUserComplainRecordService.selectQwUserComplainRecordList(qwUserComplainRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出企微员工投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:export')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(QwUserComplainRecord qwUserComplainRecord)
+    {
+        List<QwUserComplainRecord> list = qwUserComplainRecordService.selectQwUserComplainRecordList(qwUserComplainRecord);
+        ExcelUtil<QwUserComplainRecord> util = new ExcelUtil<QwUserComplainRecord>(QwUserComplainRecord.class);
+        return util.exportExcel(list, "企微员工投诉记录数据");
+    }
+
+    /**
+     * 获取企微员工投诉记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:query')")
+    @GetMapping(value = "/{recordId}")
+    public AjaxResult getInfo(@PathVariable("recordId") Long recordId)
+    {
+        return AjaxResult.success(qwUserComplainRecordService.selectQwUserComplainRecordByRecordId(recordId));
+    }
+
+    /**
+     * 新增企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:add')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody QwUserComplainRecord qwUserComplainRecord)
+    {
+        return toAjax(qwUserComplainRecordService.insertQwUserComplainRecord(qwUserComplainRecord));
+    }
+
+    /**
+     * 修改企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:edit')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody QwUserComplainRecord qwUserComplainRecord)
+    {
+        return toAjax(qwUserComplainRecordService.updateQwUserComplainRecord(qwUserComplainRecord));
+    }
+
+    /**
+     * 删除企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:remove')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{recordIds}")
+    public AjaxResult remove(@PathVariable Long[] recordIds)
+    {
+        return toAjax(qwUserComplainRecordService.deleteQwUserComplainRecordByRecordIds(recordIds));
+    }
+}

+ 7 - 2
fs-admin/src/main/java/com/fs/qw/controller/QwUserController.java

@@ -3,12 +3,17 @@ package com.fs.qw.controller;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.utils.ServletUtils;
+import com.fs.qw.domain.QwExternalContactTransferCompanyAudit;
 import com.fs.qw.param.QwFsUserParam;
+import com.fs.qw.service.IQwExternalContactTransferCompanyAuditService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.QwOptionsVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -24,7 +29,8 @@ import java.util.List;
 public class QwUserController extends BaseController {
     @Autowired
     private IQwUserService qwUserService;
-
+    @Autowired
+    private IQwExternalContactTransferCompanyAuditService auditService;
     @GetMapping("/getQwUserAll")
     public AjaxResult getQwUserAll(){
         return AjaxResult.success(qwUserService.getQwUserAll());
@@ -38,7 +44,6 @@ public class QwUserController extends BaseController {
         return R.ok().put("data",qwUserService.getQwUserInfo(param));
     }
 
-
    @GetMapping("/getMyQwCompanyList")
     public R getMyQwCompanyList()
     {

+ 27 - 0
fs-admin/src/main/java/com/fs/task/SgTestController.java

@@ -0,0 +1,27 @@
+package com.fs.task;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/23 下午2:18
+ */
+@RestController
+@RequestMapping("/sg/test")
+public class SgTestController {
+
+    @Resource
+    private SyncTuLinStudentInfoTask syncTuLinStudentInfoTask;
+
+
+    @RequestMapping("/execute")
+    public void execute(){
+        syncTuLinStudentInfoTask.execute();
+    }
+
+
+}

+ 27 - 0
fs-admin/src/main/java/com/fs/task/SyncTuLinStudentInfoTask.java

@@ -0,0 +1,27 @@
+package com.fs.task;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fs.tulin.service.ITulinInfoSyncLogService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * @description: 同步TuLin学生信息定时任务
+ * @author: Guos
+ * @time: 2025/10/23 上午10:26
+ */
+@AllArgsConstructor
+@Component("syncTuLinStudentInfoTask")
+public class SyncTuLinStudentInfoTask {
+
+
+    @Resource
+    private final ITulinInfoSyncLogService tulinInfoSyncLogService;
+
+    public void execute() {
+        tulinInfoSyncLogService.syncInfo();
+    }
+
+}

+ 2 - 2
fs-common-api/src/main/resources/application.yml

@@ -4,5 +4,5 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: dev-yjb
-#    active: druid-jnmy
+#    active: dev
+    active: druid-myhk-test

+ 5 - 0
fs-common/src/main/java/com/fs/common/constant/FsConstants.java

@@ -11,4 +11,9 @@ public interface FsConstants {
 
     String FRIEND_WELCOME_VIDEO_KEY = "friend:welcome:";
     String REDIS_INTEGRAL_ORDER_UNPAY = "integral:order:unpay:";
+
+    // 公司余额redis key "company:money:" + company.getCompanyId()
+    String COMPANY_MONEY_KEY = "company:money:";
+    // 公司余额redis 锁
+    String COMPANY_MONEY_LOCK = "company_money_lock:";
 }

+ 7 - 0
fs-common/src/main/java/com/fs/common/enums/ImTypeEnum.java

@@ -0,0 +1,7 @@
+package com.fs.common.enums;
+
+public enum ImTypeEnum {
+    NONE,
+    TENCENT,
+    OPENIM;
+}

+ 8 - 7
fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -420,6 +420,14 @@ public class CompanyUserController extends AppBaseController {
                 .collect(Collectors.toList());
         return R.ok().put("data",filteredDictVOS);
     }
+
+    @ApiOperation("查询所有项目")
+    @GetMapping("/getDictProject")
+    public R getDictProject(){
+        List<DictVO> dictVOS = dictDataService.selectDictDataListByType("sys_course_project");
+        return R.ok().put("data",dictVOS);
+    }
+
     /**
      * 当只有模板文字text时,生成表中对应条的voice_url和user_voice_url
      * @param id            qw_sop_temp_voice的id
@@ -602,11 +610,4 @@ public class CompanyUserController extends AppBaseController {
         }
         return null;
     }
-
-    @ApiOperation("查询所有项目")
-    @GetMapping("/getDictProject")
-    public R getDictProject(){
-        List<DictVO> dictVOS = dictDataService.selectDictDataListByType("sys_course_project");
-        return R.ok().put("data",dictVOS);
-    }
 }

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

@@ -309,8 +309,8 @@ public class FsUserCourseVideoController extends AppBaseController {
         BeanUtils.copyProperties(fsCourseWatchAppParam, param);
         param.setCompanyUserId(Long.parseLong(getUserId()));
         param.setCompanyId(getCompanyId());
-        param.setSTime(DateUtil.beginOfDay(new Date()));
-        param.setETime(DateUtil.endOfDay(new Date()));
+        param.setSTime(DateUtil.formatDate(DateUtil.beginOfDay(new Date())));
+        param.setETime(DateUtil.formatDate(DateUtil.endOfDay(new Date())));
 //        startPage();
         PageHelper.startPage(fsCourseWatchAppParam.getPageNum (), fsCourseWatchAppParam.getPageSize());
         List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);

+ 39 - 0
fs-company/src/main/java/com/fs/company/controller/common/CommonController.java

@@ -1,22 +1,30 @@
 package com.fs.company.controller.common;
 
+import cn.hutool.json.JSONUtil;
 import com.fs.common.config.FSConfig;
 import com.fs.common.constant.Constants;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.file.OssException;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.file.FileUploadUtils;
 import com.fs.common.utils.file.FileUtils;
 import com.fs.company.utils.AudioUtils;
 import com.fs.company.vo.WangUploadVO;
 import com.fs.framework.config.ServerConfig;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.service.TokenService;
 import com.fs.his.domain.FsExportTask;
+import com.fs.his.dto.InquiryConfigDTO;
 import com.fs.his.service.IFsExportTaskService;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
 import com.fs.qw.service.IQwWorkTaskService;
 import com.fs.qwApi.service.QwApiService;
 import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
+import com.fs.system.service.ISysConfigService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +40,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 通用请求处理
@@ -53,7 +62,14 @@ public class CommonController
     private QwApiService qwApiService;
 
 
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private OpenIMService openIMService;
 
+    @Autowired
+    private TokenService tokenService;
 //    @Autowired
 //    private TestTwoService testService2;
 ////
@@ -276,6 +292,29 @@ public class CommonController
         }
     }
 
+    @GetMapping(value = "/common/getInquiryConfig")
+    public AjaxResult getInquiryConfig()
+    {
+        String json=configService.selectConfigByKey("his.inquiryConfig");
+        InquiryConfigDTO configDTO= JSONUtil.toBean(json, InquiryConfigDTO.class);
+        String inquirySubType = configDTO.getInquirySubType();
+        return AjaxResult.success(inquirySubType);
+    }
+
+    //分享会诊
+    @PostMapping(value = "/common/sendInquiry")
+    public AjaxResult sendInquiry(@RequestBody Map<String,String> map){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyUserId = loginUser.getUser().getUserId();
+        Long companyId = loginUser.getCompany().getCompanyId();
+        String inquiryName = map.get("inquiryName");
+        String type = map.get("type");
+        String sendID = map.get("sendID");
+        String recvID = map.get("recvID");
+        String doctorId = map.get("doctorId");
+        OpenImResponseDTO inquirySelect = openIMService.sendInquiryUtil(sendID, recvID, 110, "inquirySelect", inquiryName, type,companyId,companyUserId,doctorId);
+        return AjaxResult.success(inquirySelect);
+    }
 
 
 }

+ 222 - 9
fs-company/src/main/java/com/fs/company/controller/common/Test.java

@@ -4,19 +4,56 @@ import com.alibaba.fastjson.JSON;
 import com.fs.ad.enums.AdUploadType;
 import com.fs.common.annotation.DataSource;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.DataSourceType;
+import com.fs.common.service.impl.SmsServiceImpl;
+import com.fs.company.mapper.*;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.company.vo.RedPacketMoneyVO;
+import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.course.service.ITencentCloudCosService;
+import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.domain.ErpOrderQuery;
+import com.fs.erp.dto.ErpOrderQueryRequert;
+import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.fastGpt.mapper.FastGptChatSessionMapper;
+import com.fs.fastGpt.service.IFastgptEventLogTotalService;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.mapper.*;
+import com.fs.his.service.*;
+import com.fs.his.service.impl.FsPackageOrderServiceImpl;
+import com.fs.his.utils.ConfigUtil;
 import com.fs.his.utils.qrcode.QRCodeUtils;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
+import com.fs.qw.service.IQwAppContactWayService;
+import com.fs.qw.service.IQwCompanyService;
+import com.fs.qw.service.IQwExternalContactTransferLogService;
+import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.AdUploadVo;
+import com.fs.qwApi.service.QwApiService;
 import com.fs.sop.service.IQwSopTempContentService;
 import com.fs.sop.service.IQwSopTempDayService;
 import com.fs.sop.service.IQwSopTempRulesService;
 import com.fs.sop.service.IQwSopTempService;
+import com.fs.system.mapper.SysConfigMapper;
 import com.google.zxing.WriterException;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
@@ -24,18 +61,194 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 @RestController
-@AllArgsConstructor
 public class Test {
+    @Autowired
+    private ConfigUtil configUtil;
+
+    @Autowired
+    private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+    @Autowired
+    private ICompanyService companyService;
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+    @Autowired
+    private FsUserCouponMapper fsUserCouponMapper;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private IFsPrescribeService fsPrescribeService;
+    @Autowired
+    IFsStoreOrderService fsStoreOrderService;
+    @Autowired
+    FsStoreOrderMapper fsStoreOrderMapper;
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private FsPackageOrderMapper fsPackageOrderMapper;
+    @Autowired
+    private IFsFollowService fsFollowService;
+    @Autowired
+    private IFsStoreAfterSalesService fsStoreAfterSalesService;
+    //    @Autowired
+//    IErpOrderService erpOrderService;
+    @Autowired
+    FsIntegralOrderMapper integralOrderMapper;
+    @Autowired
+    IFsInquiryOrderService iFsInquiryOrderService;
+    @Autowired
+    FsPackageMapper fsPackageMapper;
+    @Autowired
+    FsStoreProductMapper fsStoreProductMapper;
+    @Autowired
+    CompanyMapper companyMapper;
+    @Autowired
+    private CompanyMoneyLogsMapper moneyLogsMapper;
+    @Autowired
+    FsUserMapper fsUserMapper;
+    @Autowired
+    IFsUserIntegralLogsService fsUserIntegralLogsService;
+    @Autowired
+    SmsServiceImpl smsService;
+    @Autowired
+    FsStoreOrderItemMapper fsStoreOrderItemMapper;
+
+    @Autowired
+    FsPatientMapper fsPatientMapper;
+    @Autowired
+    FsPrescribeDrugMapper fsPrescribeDrugMapper;
+    @Autowired
+    FsFollowMapper fsFollowMapper;
+    @Autowired
+    private IImService imService;
+    @Autowired
+    private FsInquiryOrderMapper inquiryOrderMapper;
+    @Autowired
+    private CompanyVoiceCallerMapper companyVoiceCallerMapper;
+    @Autowired
+    private CompanyVoiceLogsMapper companyVoiceLogsMapper;
+    @Autowired
+    FsPackageOrderServiceImpl packageOrderService;
+    @Autowired
+    private IFsStoreOrderLogsService fsStoreOrderLogsService;
+    org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
+    @Autowired
+    IFsDoctorService doctorService;
+    @Autowired
+    CompanyUserMapper companyUserMapper;
+    @Autowired
+    FsInquiryOrderMapper fsInquiryOrderMapper;
+    @Autowired
+    QwApiService qwApiService;
+    //每天执行一次
+    @Autowired
+    IQwAppContactWayService qwAppContactWayService;
+
+    @Autowired
+    FastGptChatSessionMapper fastGptChatSessionMapper;
+
+    @Autowired
+    IQwExternalContactTransferLogService qwExternalContactTransferLogService;
+
+
+
+    @Autowired
+    ITencentCloudCosService tencentCloudCosService;
+
 
-    private final IQwSopTempService qwSopTempService;
-    private final IQwSopTempRulesService qwSopTempRulesService;
-    private final IQwSopTempDayService qwSopTempDayService;
-    private final IQwSopTempContentService qwSopTempContentService;
-    private final RocketMQTemplate rocketMQTemplate;
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSErpOrderService;
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
+    @Autowired
+    IErpOrderService erpOrderService;
     @GetMapping("test")
-    @DataSource(DataSourceType.SOP)
-    public void fileDownload(){
-        rocketMQTemplate.syncSend("ad-upload", JSON.toJSONString(AdUploadVo.builder().state("测试").type(AdUploadType.ADD_WX).build()));
+    public void fileDownload() {
+        deliveryOpScrm();
+    }
+    private IErpOrderService getErpService() {
+
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        Integer erpOpen = sysConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1){
+            //判断erp类型
+            Integer erpType = sysConfig.getErpType();
+            if (erpType != null){
+                IErpOrderService erpOrderService = null;
+                if (erpType == 1){
+                    //管易
+                    erpOrderService =  gyOrderService;
+                } else if (erpType == 2){
+                    //旺店通
+                    erpOrderService =  wdtOrderService;
+                } else if (erpType == 3){
+                    //
+                    erpOrderService =  hzOMSErpOrderService;
+                } else if (erpType == 4){
+                    //代服
+                    erpOrderService =  dfOrderService;
+                }else if(erpType == 5){
+                    erpOrderService=jSTOrderService;
+                }else if(erpType == 6){
+                    erpOrderService=k9OrderService;
+                }
+                return erpOrderService;
+
+
+            }
+        }
+        return null;
+    }
+    public void deliveryOpScrm()
+    {
+        System.out.println("deliveryOpScrm");
+        IErpOrderService erpOrderService = getErpService();
+        List<FsStoreOrderScrm> orders = null;
+        if (erpOrderService == gyOrderService){
+            orders = fsStoreOrderMapper.selectOmsOrderdeliveryOpScrm();
+        } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService || erpOrderService == jSTOrderService){
+            orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOpScrm();
+        }
+        logger.info("查询到的"+orders.size());
+        for(FsStoreOrderScrm order:orders){
+            ErpOrderQueryRequert request=new ErpOrderQueryRequert();
+            request.setCode(order.getExtendOrderId());
+            if (erpOrderService != null){
+                ErpOrderQueryResponse response=erpOrderService.getOrder(request);
+                if (erpOrderService != dfOrderService){
+                    if(response.getOrders()!=null&&response.getOrders().size()>0){
+                        for(ErpOrderQuery orderQuery : response.getOrders()){
+                            if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
+                                for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                                    if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
+                                        //更新商订单状态 删除REDIS
+                                        logger.info("查询到的"+delivery);
+
+                                        fsStoreOrderService.deliveryOrderScrm(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                        redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
 
 }

+ 9 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyProfileController.java

@@ -6,6 +6,7 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.utils.PatternUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.file.FileUploadUtils;
@@ -15,6 +16,8 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
 import com.fs.framework.service.TokenService;
+import com.fs.im.config.ImTypeConfig;
+import com.fs.im.service.OpenIMService;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +42,8 @@ public class CompanyProfileController extends BaseController
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private OpenIMService openIMService;
     /**
      * 个人信息
      */
@@ -67,6 +72,10 @@ public class CompanyProfileController extends BaseController
 
         if (userService.updateUserProfile(user) > 0)
         {
+            //修改im用户信息
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                openIMService.updateUserInfo(user);
+            }
             LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
             // 更新缓存用户信息
             loginUser.getUser().setNickName(user.getNickName());

+ 15 - 6
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -34,6 +34,8 @@ import com.fs.framework.service.TokenService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
 import com.fs.hisStore.vo.FsStoreProductExportVO;
+import com.fs.im.config.IMConfig;
+import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.service.IQwCompanyService;
@@ -621,7 +623,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post("https://web.im.ysya.top/api/user/account_check")
+            String body = HttpRequest.post(IMConfig.URL+"/user/account_check")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString())
@@ -642,13 +644,13 @@ public class CompanyUserController extends BaseController {
                     ArrayList<Object> users = new ArrayList<>();
                     HashMap<String, String> map = new HashMap<>();
                     map.put("userID",userId);
-                    map.put("nickname",companyUser.getImNickName());
+                    map.put("nickname",companyUser.getNickName());
                     map.put("faceURL",companyUser.getAvatar());
                     users.add(map);
                     requestBody = new JSONObject();
-                    userIds.add(userId);
+                    //userIds.add(userId);
                     requestBody.put("users", users);
-                    HttpRequest.post("https://web.im.ysya.top/api/user/user_register")
+                    String registerBody = HttpRequest.post(IMConfig.URL+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
                             .header("token", adminToken).body(requestBody.toString()).execute().body();
                 }
@@ -661,7 +663,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post("https://web.im.ysya.top/api/auth/get_user_token")
+            String body1 = HttpRequest.post(IMConfig.URL+"/auth/get_user_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString()).execute().body();
@@ -673,5 +675,12 @@ public class CompanyUserController extends BaseController {
             return R.error("获取管理员token失败");
         }
     }
-
+    @ApiOperation("添加好友")
+    @PostMapping("/importFriend")
+    public R importFriend(@RequestBody HashMap<String,Object> map){
+        String ownerUserID = (String) map.get("ownerUserID");
+        List<String> friendUserIDs = (List<String>)map.get("friendUserIDs");
+        OpenImResponseDTO openImResponseDTO = openIMService.importFriend(ownerUserID, friendUserIDs);
+        return R.ok().put("data",openImResponseDTO);
+    }
 }

+ 5 - 2
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferCompanyAuditController.java

@@ -10,6 +10,7 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwExternalContactTransferCompanyAudit;
+import com.fs.qw.domain.QwExternalContactTransferCompanyAuditUser;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditService;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditUserService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,7 +51,9 @@ public class QwExternalContactTransferCompanyAuditController extends BaseControl
 
     @PreAuthorize("@ss.hasPermi('qw:externalContactTransferCompanyAudit:detail')")
     @GetMapping("/detail/{auditId}")
-    public AjaxResult detail(@PathVariable Long auditId) {
-        return AjaxResult.success(auditUserService.getListByAuditId(auditId));
+    public TableDataInfo detail(@PathVariable Long auditId) {
+        startPage();
+        List<QwExternalContactTransferCompanyAuditUser> list = auditUserService.getListByAuditId(auditId);
+        return getDataTable(list);
     }
 }

+ 71 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsPrescribeController.java

@@ -1,15 +1,20 @@
 package com.fs.company.controller.store;
 
+import cn.hutool.json.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
 import com.fs.his.domain.FsExportTask;
 import com.fs.his.domain.FsPrescribe;
+import com.fs.his.dto.PayloadDTO;
 import com.fs.his.param.FsPrescribeParam;
 import com.fs.his.service.IFsExportTaskService;
 import com.fs.his.service.IFsPrescribeService;
@@ -17,6 +22,11 @@ import com.fs.his.vo.FsMessageFeedbackExportListVO;
 import com.fs.his.vo.FsPrescribeExcelListVO;
 import com.fs.his.vo.FsPrescribeListVO;
 import com.fs.his.vo.FsPrescribeVO;
+import com.fs.im.config.ImTypeConfig;
+import com.fs.im.dto.OpenImMsgDTO;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,6 +41,7 @@ import java.util.List;
  * @author fs
  * @date 2023-06-13
  */
+@Slf4j
 @RestController
 @RequestMapping("/store/prescribe")
 public class FsPrescribeController extends BaseController
@@ -39,6 +50,8 @@ public class FsPrescribeController extends BaseController
     private IFsPrescribeService fsPrescribeService;
     @Autowired
     private IFsExportTaskService exportTaskService;
+    @Autowired
+    private OpenIMService openIMService;
     /**
      * 查询处方列表
      */
@@ -72,6 +85,64 @@ public class FsPrescribeController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/myImList")
+    public TableDataInfo myImList(FsPrescribeParam fsPrescribe)
+    {
+        startPage();
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        //fsPrescribe.setCompanyUserId(loginUser.getUser().getUserId());
+        List<FsPrescribeListVO> list = fsPrescribeService.selectFsPrescribeListVO(fsPrescribe);
+        for (FsPrescribeListVO vo : list) {
+            if (vo.getPatientTel()!=null){
+                vo.setPatientTel(vo.getPatientTel().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+            }
+        }
+        return getDataTable(list);
+    }
+
+    @PostMapping("/sendPrescribe")
+    public AjaxResult sendPrescribe(@RequestBody FsPrescribeParam fsPrescribe) throws JsonProcessingException {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if(ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            log.info("拼接消息体");
+            //部署到正式环境以后下面这段代码要注释,使用定时任务执行auditPrescribe审核处方以后发送消息
+            ObjectMapper objectMapper = new ObjectMapper();
+            OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+            openImMsgDTO.setSendID("C"+loginUser.getUser().getUserId());
+            openImMsgDTO.setRecvID("U"+fsPrescribe.getUserId());
+            openImMsgDTO.setContentType(110);
+            openImMsgDTO.setSenderPlatformID(5);
+            openImMsgDTO.setSessionType(1);
+            OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+            //content.setContent(ext);
+            PayloadDTO payload = new PayloadDTO();
+            payload.setData("prescribe");
+            PayloadDTO.Extension extension = new PayloadDTO.Extension();
+            extension.setDiagnose(fsPrescribe.getDiagnose());
+            extension.setPrescribeId(fsPrescribe.getPrescribeId().toString());
+            payload.setExtension(extension);
+            extension.setStatus(fsPrescribe.getStatus());
+            OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+            imData.setPayload(payload);
+
+            String imJson = objectMapper.writeValueAsString(imData);
+            content.setData(imJson);
+            openImMsgDTO.setContent(content);
+
+            JSONObject jsonObject = new JSONObject(openImMsgDTO);
+            log.info("开始发送消息");
+//            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+//            offlinePushInfo.setDesc("处方单");
+//            offlinePushInfo.setTitle(doctor.getDoctorName());
+//            offlinePushInfo.setIOSBadgeCount(true);
+//            offlinePushInfo.setIOSPushSound("");
+//            openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+            OpenImResponseDTO openImResponseDTO = openIMService.openIMSendMsg(openImMsgDTO);
+            return AjaxResult.success(openImResponseDTO);
+        }
+        return AjaxResult.success(null);
+    }
 
     /**
      * 导出处方列表

+ 2 - 2
fs-company/src/main/resources/application.yml

@@ -3,7 +3,7 @@ server:
 # Spring配置
 spring:
   profiles:
-#    active: druid-fcky-test
+    active: druid-jnsyj-test
 #    active: druid-jnmy-test
 #    active: druid-jzzx-test
 #    active: druid-hdt
@@ -11,5 +11,5 @@ spring:
 #    active: druid-yzt
 #    active: druid-myhk
 #    active: druid-sft
-    active: dev-jnlzjk
+#    active: dev-jnlzjk
 #    active: dev-yjb

+ 4 - 3
fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java

@@ -121,7 +121,7 @@ public class DoctorController extends  AppBaseController {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post("https://web.im.ysya.top/api/user/account_check")
+            String body = HttpRequest.post(IMConfig.URL+"/user/account_check")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString())
@@ -148,9 +148,10 @@ public class DoctorController extends  AppBaseController {
                     requestBody = new JSONObject();
                     userIds.add(userId);
                     requestBody.put("users", users);
-                    HttpRequest.post("https://web.im.ysya.top/api/user/user_register")
+                    String body1 = HttpRequest.post(IMConfig.URL+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
                             .header("token", adminToken).body(requestBody.toString()).execute().body();
+                    log.info("注册结果:"+body1);
                 }
             } else {
                 return R.error("返回结果为空");
@@ -161,7 +162,7 @@ public class DoctorController extends  AppBaseController {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post("https://web.im.ysya.top/api/auth/get_user_token")
+            String body1 = HttpRequest.post(IMConfig.URL+"/auth/get_user_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString()).execute().body();

+ 16 - 10
fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java

@@ -8,6 +8,7 @@ import com.fs.app.param.DrugReportAddParam;
 import com.fs.app.param.DrugReportFinishParam;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsDrugReport;
 import com.fs.his.domain.FsFollow;
@@ -22,6 +23,7 @@ import com.fs.his.vo.FsDrugReportDVO;
 import com.fs.his.vo.FsDrugReportListDVO;
 import com.fs.his.vo.FsFollowListDVO;
 import com.fs.im.config.IMConfig;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
 import com.fs.im.service.OpenIMService;
@@ -109,11 +111,13 @@ public class DrugReportController extends AppBaseController {
             msg.setMsgContent(new MsgDataFormatDTO("drugReport",ext,report.getReportId().toString()));
             msgs.add(msg);
             msgDTO.setMsgBody(msgs);
-            //imService.sendMsg(msgDTO);
-            ObjectMapper objectMapper = new ObjectMapper();
-            String ex = objectMapper.writeValueAsString(customDTO);
-            openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"drugReport","","","",report.getReportId().toString(),ex);
-
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                ObjectMapper objectMapper = new ObjectMapper();
+                String ex = objectMapper.writeValueAsString(customDTO);
+                openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"drugReport","","","",report.getReportId().toString(),ex);
+            }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                imService.sendMsg(msgDTO);
+            }
             fsDrugReportCountService.addReportCountByUserIdAndDoctorId(follow.getUserId(),follow.getDoctorId());
 
             return R.ok();
@@ -144,11 +148,13 @@ public class DrugReportController extends AppBaseController {
         msg.setMsgContent(new MsgDataFormatDTO("您的用药咨询报告已出具,本次咨询结束"));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        //imService.sendMsg(msgDTO);
-        ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"finishDrugReport","","您的用药咨询报告已出具,本次咨询结束","","",ex);
-
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"finishDrugReport","","您的用药咨询报告已出具,本次咨询结束","","",ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
         redisTemplate.delete("DrugReport:doctorId:" + follow.getDoctorId() + ":userId:" + follow.getUserId());
         return R.ok();
 

+ 40 - 25
fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -10,6 +10,8 @@ import com.fs.common.BeanCopyUtils;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.domain.R;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.enums.ImTypeEnum;
+import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyService;
 import com.fs.core.config.WxPayProperties;
@@ -19,6 +21,7 @@ import com.fs.his.dto.FsInquiryOrderPatientDTO;
 import com.fs.his.param.*;
 import com.fs.his.service.*;
 import com.fs.his.vo.*;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.MsgCustomDTO;
 import com.fs.im.dto.MsgDTO;
 import com.fs.im.dto.MsgDataDTO;
@@ -32,11 +35,13 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import io.reactivex.internal.operators.parallel.ParallelRunOn;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -286,15 +291,15 @@ public class InquiryOrderController extends  AppBaseController {
 
         }
         FsInquiryOrder inquiryOrder=inquiryOrderService.selectFsInquiryOrderByOrderId(report.getOrderId());
-        /*MsgDTO msgDTO=new MsgDTO();
+        MsgDTO msgDTO=new MsgDTO();
         msgDTO.setFrom_Account("D-"+report.getDoctorId().toString());
-        msgDTO.setTo_Account("U-"+report.getUserId().toString());*/
+        msgDTO.setTo_Account("U-"+report.getUserId().toString());
         MsgCustomDTO customDTO=new MsgCustomDTO();
         customDTO.setType("startInquiry");
         customDTO.setImType(1);
         customDTO.setOrderType(inquiryOrder.getOrderType());
         customDTO.setOrderId(report.getOrderId().toString());
-        /*msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
+        msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
         List<MsgDataDTO> msgs=new ArrayList<>();
         MsgDataDTO msg=new MsgDataDTO();
         String ext= JSONUtil.toJsonStr(report);
@@ -302,28 +307,31 @@ public class InquiryOrderController extends  AppBaseController {
         msg.setMsgContent(new MsgDataFormatDTO("report",ext,orderId));
         msg.setMsgType("TIMCustomElem");//TIMCustomElem
         msgs.add(msg);
-        msgDTO.setMsgBody(msgs);*/
-        //imService.sendMsg(msgDTO);
-        ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+report.getDoctorId(),"U"+report.getUserId(),110,"report","","","",report.getOrderId().toString(),ex);
-        /*JSONObject jsonObject = new JSONObject();
-        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
-        openImMsgDTO.setSendID("D"+report.getDoctorId().toString());
-        openImMsgDTO.setRecvID("U"+report.getUserId().toString());
-        openImMsgDTO.setContentType(110);
-        openImMsgDTO.setSenderPlatformID(5);
-        openImMsgDTO.setSessionType(1);
-
-        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
-        PayloadDTO payloadDTO = new PayloadDTO();
-        payloadDTO.setData("startInquiry");
-        PayloadDTO.Extension extension = new PayloadDTO.Extension();
-        extension.setTitle();
-        //content.setContent(ext);
-        openImMsgDTO.setContent(content);
-        openImMsgDTO.setEx(customDTO);
-        openIMService.openIMSendMsg(openImMsgDTO);*/
+        msgDTO.setMsgBody(msgs);
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+report.getDoctorId(),"U"+report.getUserId(),110,"report","","","",report.getOrderId().toString(),ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
+//        JSONObject jsonObject = new JSONObject();
+//        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+//        openImMsgDTO.setSendID("D"+report.getDoctorId().toString());
+//        openImMsgDTO.setRecvID("U"+report.getUserId().toString());
+//        openImMsgDTO.setContentType(110);
+//        openImMsgDTO.setSenderPlatformID(5);
+//        openImMsgDTO.setSessionType(1);
+//
+//        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+//        PayloadDTO payloadDTO = new PayloadDTO();
+//        payloadDTO.setData("startInquiry");
+//        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+//        extension.setTitle();
+//        //content.setContent(ext);
+//        openImMsgDTO.setContent(content);
+//        openImMsgDTO.setEx(customDTO);
+//        openIMService.openIMSendMsg(openImMsgDTO);
         return R.ok("操作成功");
     }
 
@@ -354,4 +362,11 @@ public class InquiryOrderController extends  AppBaseController {
         }
         return R.ok().put("data","");
     }
+
+    @PostMapping("/closeOrder")
+    public R closeOrder(@RequestBody Long orderId){
+        inquiryOrderService.closeOrder(orderId);
+        logger.info("closeOrder: {}", orderId);
+        return R.ok();
+    }
 }

+ 41 - 1
fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java

@@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.core.utils.OrderCodeUtils;
@@ -19,6 +20,7 @@ import com.fs.his.service.*;
 import com.fs.his.vo.FsDoctorPrescribeListDVO;
 import com.fs.his.vo.FsPrescribeListDVO;
 import com.fs.im.config.IMConfig;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.MsgCustomDTO;
 import com.fs.im.dto.OpenImMsgDTO;
 import com.fs.im.dto.OpenImResponseDTO;
@@ -197,7 +199,7 @@ public class PrescribeController extends  AppBaseController {
     @ApiOperation("创建处方")
     @Transactional
     @PostMapping("/createPrescribe")
-    public R createPrescribe(@Validated @RequestBody FsPrescribeCreateParam param, HttpServletRequest request){
+    public R createPrescribe(@Validated @RequestBody FsPrescribeCreateParam param, HttpServletRequest request) throws JsonProcessingException {
 
         //获取问诊单
         FsInquiryOrder inquiryOrder=inquiryOrderService.selectFsInquiryOrderByOrderId(param.getOrderId());
@@ -264,6 +266,44 @@ public class PrescribeController extends  AppBaseController {
                     prescribeDrug.setPrescribeId(prescribe.getPrescribeId());
                     prescribeDrugService.insertFsPrescribeDrug(prescribeDrug);
                 }
+                if(ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                    log.info("拼接消息体");
+                    //部署到正式环境以后下面这段代码要注释,使用定时任务执行auditPrescribe审核处方以后发送消息
+                    ObjectMapper objectMapper = new ObjectMapper();
+                    OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+                    openImMsgDTO.setSendID("D"+inquiryOrder.getDoctorId());
+                    openImMsgDTO.setRecvID("U"+inquiryOrder.getUserId());
+                    openImMsgDTO.setContentType(110);
+                    openImMsgDTO.setSenderPlatformID(5);
+                    openImMsgDTO.setSessionType(1);
+                    OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+                    //content.setContent(ext);
+                    PayloadDTO payload = new PayloadDTO();
+                    payload.setData("prescribe");
+                    PayloadDTO.Extension extension = new PayloadDTO.Extension();
+                    extension.setDiagnose(inquiryOrder.getTitle());
+                    extension.setPrescribeId(prescribe.getPrescribeId().toString());
+                    payload.setExtension(extension);
+                    extension.setStatus(prescribe.getStatus());
+                    OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+                    imData.setPayload(payload);
+
+                    String imJson = objectMapper.writeValueAsString(imData);
+                    content.setData(imJson);
+                    openImMsgDTO.setContent(content);
+
+                    JSONObject jsonObject = new JSONObject(openImMsgDTO);
+                    log.info("开始发送消息");
+                    OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+                    offlinePushInfo.setDesc("处方单");
+                    offlinePushInfo.setTitle(doctor.getDoctorName());
+                    offlinePushInfo.setIOSBadgeCount(true);
+                    offlinePushInfo.setIOSPushSound("");
+                    openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+                    OpenImResponseDTO openImResponseDTO = openIMService.openIMSendMsg(openImMsgDTO);
+                }
+
 
                 return R.ok("操作成功").put("prescribe",prescribe);
             }

+ 18 - 2
fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java

@@ -28,7 +28,7 @@ import java.util.List;
 
 /**
  * Mybatis支持*匹配扫描包
- * 
+ *
 
  */
 @Configuration
@@ -115,6 +115,22 @@ public class MyBatisConfig
         return resources.toArray(new Resource[resources.size()]);
     }
 
+    //    @Bean
+//    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
+//    {
+//        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
+//        String mapperLocations = env.getProperty("mybatis.mapperLocations");
+//        String configLocation = env.getProperty("mybatis.configLocation");
+//        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
+//        VFS.addImplClass(SpringBootVFS.class);
+//
+//        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+//        sessionFactory.setDataSource(dataSource);
+//        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
+//        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
+//        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
+//        return sessionFactory.getObject();
+//    }
     @Bean
     public SqlSessionFactory sqlSessionFactorys(DataSource dataSource) throws Exception
     {
@@ -131,4 +147,4 @@ public class MyBatisConfig
         sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
         return sessionFactory.getObject();
     }
-}
+}

+ 2 - 2
fs-doctor-app/src/main/resources/mybatis/mybatis-config.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
-	
+
 	<settings>
 		<setting name="cacheEnabled"             value="true" />  <!-- 全局映射器启用缓存 -->
 		<setting name="useGeneratedKeys"         value="true" />  <!-- 允许 JDBC 支持自动生成主键 -->
@@ -11,5 +11,5 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 		<setting name="logImpl"                  value="SLF4J" /> <!-- 指定 MyBatis 所用日志的具体实现 -->
 		 <setting name="mapUnderscoreToCamelCase" value="true"/>
 	</settings>
-	
+
 </configuration>

+ 1 - 1
fs-ipad-task/src/main/resources/application.yml

@@ -9,4 +9,4 @@ spring:
 #    active: druid-yzt
 #    active: druid-sxjz
 #    active: druid-sft
-group-no: 1
+group-no: 2

+ 35 - 2
fs-qw-api/src/main/java/com/fs/app/controller/CommonController.java

@@ -1,8 +1,21 @@
 package com.fs.app.controller;
 
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.file.OssException;
+import com.fs.course.param.UserCourseComplaintRecordParam;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 
 @Api("公共接口")
@@ -10,6 +23,26 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(value="/app/common")
 public class CommonController {
 
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+    @PostMapping("uploadOSS")
+    public R uploadOSS(@RequestParam("file") MultipartFile file) throws Exception
+    {
 
+        if (file.isEmpty())
+        {
+            throw new OssException("上传文件不能为空");
+        }
+        // 上传文件
+        String fileName = file.getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf("."));
+        CloudStorageService storage = OSSFactory.build();
+        String url = storage.uploadSuffix(file.getBytes(), suffix);
+        return R.ok().put("url",url);
+    }
 
 }

+ 46 - 0
fs-qw-api/src/main/java/com/fs/app/controller/QwUserComplainRecordController.java

@@ -0,0 +1,46 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("企微员工投诉接口")
+@RestController
+@RequestMapping(value="/app/record")
+public class QwUserComplainRecordController {
+
+
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+
+    @ApiOperation("获取投诉类型")
+    @GetMapping("/getTypeTree")
+    public R getTypeTree() {
+        List<FsUserCourseComplaintTypeListVO> allComplaintTypeTree = fsUserCourseComplaintTypeService.getAllComplaintTypeTree();
+        return R.ok().put("data", allComplaintTypeTree);
+    }
+
+
+    @ApiOperation("提交企微员工反馈记录")
+    @PostMapping("/recordByQwUser")
+    public R submitByQwUser(@RequestBody QwUserComplaintRecordParam param) {
+        int i = qwUserComplainRecordService.submitRecordByQwUser(param);
+        if (i > 0) {
+            return R.ok("提交成功");
+        } else {
+            return R.error("提交失败");
+        }
+    }
+}

+ 1 - 1
fs-qwhook-sop/src/main/resources/application.yml

@@ -10,4 +10,4 @@ spring:
 #    active: druid-yzt
 #    active: druid-hdt
 #    active: druid-sxjz
-    active: druid-myhk-test
+    active: dev

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java

@@ -203,4 +203,6 @@ public interface CompanyMapper
      * 查询企微主体管理公司列表
      */
     List<OptionsVO> getCompanyListByCorpId(@Param("corpId") String corpId);
+
+    List<Company> selectCompanyMoneyAllList();
 }

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

@@ -694,6 +694,9 @@ public class CompanyServiceImpl implements ICompanyService
         }
     }
 
+
+
+
     @Override
     @Transactional
     public void subtractCompanyMoneyScrm(FsStoreOrderScrm order) {

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

@@ -78,6 +78,11 @@ public class CourseConfig implements Serializable {
      */
     private boolean oneCompanyCourse;
 
+    /**
+     * 是否开启IM
+     */
+    private Boolean isOpenIM;
+
 
     @Data
     public static class DisabledTimeVo{

+ 267 - 0
fs-service/src/main/java/com/fs/course/domain/BalanceRollbackError.java

@@ -0,0 +1,267 @@
+package com.fs.course.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Redis余额数据回滚异常登记表
+ * @TableName balance_rollback_error
+ */
+@TableName(value ="balance_rollback_error")
+public class BalanceRollbackError {
+    /**
+     * 自增主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 公司ID
+     */
+    private Long companyId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 看客记录ID
+     */
+    private Long logId;
+
+    /**
+     * 视频ID
+     */
+    private Long videoId;
+
+    /**
+     * 状态:0-回滚异常登记,1-已重新回滚
+     */
+    private Integer status;
+
+    /**
+     * 异常金额
+     */
+    private BigDecimal money;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注信息
+     */
+    private String remark;
+
+    /**
+     * 自增主键ID
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * 自增主键ID
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * 公司ID
+     */
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    /**
+     * 公司ID
+     */
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    /**
+     * 用户ID
+     */
+    public Long getUserId() {
+        return userId;
+    }
+
+    /**
+     * 用户ID
+     */
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 看客记录ID
+     */
+    public Long getLogId() {
+        return logId;
+    }
+
+    /**
+     * 看客记录ID
+     */
+    public void setLogId(Long logId) {
+        this.logId = logId;
+    }
+
+    /**
+     * 视频ID
+     */
+    public Long getVideoId() {
+        return videoId;
+    }
+
+    /**
+     * 视频ID
+     */
+    public void setVideoId(Long videoId) {
+        this.videoId = videoId;
+    }
+
+    /**
+     * 状态:0-回滚异常登记,1-已重新回滚
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * 状态:0-回滚异常登记,1-已重新回滚
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * 异常金额
+     */
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    /**
+     * 异常金额
+     */
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    /**
+     * 创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * 创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 更新时间
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * 更新时间
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * 备注信息
+     */
+    public String getRemark() {
+        return remark;
+    }
+
+    /**
+     * 备注信息
+     */
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        BalanceRollbackError other = (BalanceRollbackError) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getCompanyId() == null ? other.getCompanyId() == null : this.getCompanyId().equals(other.getCompanyId()))
+            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))
+            && (this.getLogId() == null ? other.getLogId() == null : this.getLogId().equals(other.getLogId()))
+            && (this.getVideoId() == null ? other.getVideoId() == null : this.getVideoId().equals(other.getVideoId()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getMoney() == null ? other.getMoney() == null : this.getMoney().equals(other.getMoney()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
+            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()))
+            && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getCompanyId() == null) ? 0 : getCompanyId().hashCode());
+        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
+        result = prime * result + ((getLogId() == null) ? 0 : getLogId().hashCode());
+        result = prime * result + ((getVideoId() == null) ? 0 : getVideoId().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getMoney() == null) ? 0 : getMoney().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
+        result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", companyId=").append(companyId);
+        sb.append(", userId=").append(userId);
+        sb.append(", logId=").append(logId);
+        sb.append(", videoId=").append(videoId);
+        sb.append(", status=").append(status);
+        sb.append(", money=").append(money);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", remark=").append(remark);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 59 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCompanyUserQw.java

@@ -0,0 +1,59 @@
+package com.fs.course.domain;
+
+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_user_company_user_qw
+ *
+ * @author fs
+ * @date 2025-10-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserCompanyUserQw extends BaseEntity{
+
+    /** id */
+    private Long id;
+
+    /** 用户id(关联fs_user表user_id) */
+    @Excel(name = "用户id", readConverterExp = "关=联fs_user表user_id")
+    private Long userId;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+    /** 公司ID */
+    @Excel(name = "公司ID")
+    private Long companyId;
+
+    /** 是否重粉,1-是;0-否 */
+    @Excel(name = "是否重粉,1-是;0-否")
+    private Long isRepeatFans;
+
+    /** 课程项目ID */
+    @Excel(name = "课程项目ID")
+    private Long projectId;
+
+    /** 企微用户ID */
+    @Excel(name = "企微用户ID")
+    private Long qwUserId;
+
+    /** 企微外部联系人ID */
+    @Excel(name = "企微外部联系人ID")
+    private Long qwExternalContactId;
+
+    /** 企微主体ID */
+    @Excel(name = "企微主体ID")
+    private Long qwCompanyId;
+
+    /** 状态 0小黑屋 1正常 2拉黑 */
+    @Excel(name = "状态 0小黑屋 1正常 2拉黑")
+    private Long status;
+
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/course/mapper/BalanceRollbackErrorMapper.java

@@ -0,0 +1,18 @@
+package com.fs.course.mapper;
+
+import com.fs.course.domain.BalanceRollbackError;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【balance_rollback_error(Redis余额数据回滚异常登记表)】的数据库操作Mapper
+* @createDate 2025-10-22 10:29:23
+* @Entity com.fs.course.domain.BalanceRollbackError
+*/
+public interface BalanceRollbackErrorMapper extends BaseMapper<BalanceRollbackError> {
+
+}
+
+
+
+

+ 61 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserQwMapper.java

@@ -0,0 +1,61 @@
+package com.fs.course.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsUserCompanyUserQw;
+
+/**
+ * 微信用户和销售关系-企业微信自动的Mapper接口
+ * 
+ * @author fs
+ * @date 2025-10-23
+ */
+public interface FsUserCompanyUserQwMapper extends BaseMapper<FsUserCompanyUserQw>{
+    /**
+     * 查询微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    FsUserCompanyUserQw selectFsUserCompanyUserQwById(Long id);
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的列表
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 微信用户和销售关系-企业微信自动的集合
+     */
+    List<FsUserCompanyUserQw> selectFsUserCompanyUserQwList(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 新增微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int insertFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 修改微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int updateFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwById(Long id);
+
+    /**
+     * 批量删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwByIds(Long[] ids);
+}

+ 3 - 3
fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java

@@ -34,10 +34,10 @@ public class FsCourseWatchLogListParam implements Serializable {
     private Integer sendType;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date eTime;
+    private String eTime;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date sTime;
+    private String sTime;
 
     @JsonFormat(pattern = "yyyy-MM-dd")
     private String upSTime;
@@ -65,7 +65,7 @@ public class FsCourseWatchLogListParam implements Serializable {
 
 
     private Long taskId;//任务ID
-    private Long project;//任务ID
+    //private Long project;//任务ID
 
     private List<Long> periodIds;//训练营期ID
 

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

@@ -10,5 +10,5 @@ public class FsUserCourseOrderDoPayParam implements Serializable {
     @NotNull(message = "订单号不能为空")
     Long orderId;
     Long userId;
-    String appId;
+    private String appId;
 }

+ 16 - 0
fs-service/src/main/java/com/fs/course/service/BalanceRollbackErrorService.java

@@ -0,0 +1,16 @@
+package com.fs.course.service;
+
+import com.fs.course.domain.BalanceRollbackError;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【balance_rollback_error(Redis余额数据回滚异常登记表)】的数据库操作Service
+* @createDate 2025-10-22 10:29:23
+*/
+public interface BalanceRollbackErrorService extends IService<BalanceRollbackError> {
+
+    public void processBatchRollbackByCompanyId();
+
+    void initCompanyBalance();
+}

+ 61 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCompanyUserQwService.java

@@ -0,0 +1,61 @@
+package com.fs.course.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsUserCompanyUserQw;
+
+/**
+ * 微信用户和销售关系-企业微信自动的Service接口
+ * 
+ * @author fs
+ * @date 2025-10-23
+ */
+public interface IFsUserCompanyUserQwService extends IService<FsUserCompanyUserQw>{
+    /**
+     * 查询微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    FsUserCompanyUserQw selectFsUserCompanyUserQwById(Long id);
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的列表
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 微信用户和销售关系-企业微信自动的集合
+     */
+    List<FsUserCompanyUserQw> selectFsUserCompanyUserQwList(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 新增微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int insertFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 修改微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int updateFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 批量删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param ids 需要删除的微信用户和销售关系-企业微信自动的主键集合
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwByIds(Long[] ids);
+
+    /**
+     * 删除微信用户和销售关系-企业微信自动的信息
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwById(Long id);
+}

+ 0 - 1
fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintRecordService.java

@@ -70,5 +70,4 @@ public interface IFsUserCourseComplaintRecordService extends IService<FsUserCour
      * @return int
      */
     int submitRecord(UserCourseComplaintRecordParam userCourseComplaintRecordParam);
-
 }

+ 172 - 0
fs-service/src/main/java/com/fs/course/service/impl/BalanceRollbackErrorServiceImpl.java

@@ -0,0 +1,172 @@
+package com.fs.course.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.constant.FsConstants;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.course.domain.BalanceRollbackError;
+import com.fs.course.mapper.BalanceRollbackErrorMapper;
+import com.fs.course.service.BalanceRollbackErrorService;
+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.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+* @author Administrator
+* @description 针对表【balance_rollback_error(Redis余额数据回滚异常登记表)】的数据库操作Service实现
+* @createDate 2025-10-22 10:29:23
+*/
+@Service
+public class BalanceRollbackErrorServiceImpl extends ServiceImpl<BalanceRollbackErrorMapper, BalanceRollbackError>
+    implements BalanceRollbackErrorService{
+
+
+    private static final Logger logger = LoggerFactory.getLogger(BalanceRollbackErrorServiceImpl.class);
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    @Override
+    public void processBatchRollbackByCompanyId() {
+        // 按companyId分组查询 余额异常表 中的companyId数据
+        List<Long> companyIds = this.list(
+                        new QueryWrapper<BalanceRollbackError>()
+                                .select("DISTINCT company_id")
+                                .eq("status", 0)
+                ).stream()
+                .map(BalanceRollbackError::getCompanyId) // 假设 getCompanyId 返回 Long 类型
+                .distinct()
+                .collect(Collectors.toList());
+
+
+        for(Long companyId : companyIds){
+            // 按公司查询余额异常表数据 状态为0 缓存回滚 每次查询1000条一次处理
+            int pageSize = 1000;
+            int offset = 0;
+            List<BalanceRollbackError> errorList;
+
+            do {
+                // 分页查询,每次只处理1000条记录
+                errorList = this.list(
+                        new QueryWrapper<BalanceRollbackError>()
+                                .eq("status", 0).eq("company_id", companyId)
+                                .last("LIMIT " + pageSize + " OFFSET " + offset)
+                );
+
+                // 每一千条回滚一次
+                if (!errorList.isEmpty()) {
+                    // 计算 预扣减总金额
+                    BigDecimal totalAmount = errorList.stream()
+                            .map(BalanceRollbackError::getMoney)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    // 执行回滚操作
+                    processBatchRollback(companyId,errorList, totalAmount);
+                }
+
+                offset += pageSize;
+            } while (errorList.size() == pageSize);
+        }
+    }
+
+    @Override
+    public void initCompanyBalance() {
+
+        // 查询公司表 Company
+        List<Company> companyList = companyMapper.selectCompanyMoneyAllList();
+        if (companyList.isEmpty()) {
+            return;
+        }
+        for (Company company : companyList) {
+            String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + company.getCompanyId();
+            // 判断缓存为空初始化
+            String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+            if (StringUtils.isEmpty(moneyStr)) {
+                // 初始化余额
+                redisCache.setCacheObject(companyMoneyKey, company.getMoney().toString());
+            }
+        }
+    }
+
+    /**
+     * @Description: 按公司批量回滚
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 11:39
+     */
+    private void processBatchRollback(Long companyId,List<BalanceRollbackError> errorList, BigDecimal totalAmount) {
+        String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + companyId;
+
+        // 加锁:扣减余额
+        RLock lock1 = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + companyId);
+        boolean lockAcquired=false;
+        try {
+            if (lock1.tryLock(3, 10, TimeUnit.SECONDS)) {
+                lockAcquired=true;
+                BigDecimal originalMoney;
+                // 获取当前余额
+                String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+                if (StringUtils.isNotEmpty(moneyStr)) {
+                    originalMoney = new BigDecimal(moneyStr);
+                }else {
+                    logger.error("获取公司余额缓存异常公司id{},",companyId);
+                    logger.error("获取公司余额缓存异常数据{},",errorList);
+                    throw new RuntimeException("获取公司余额缓存异常");
+                }
+
+                // 扣减金额
+                BigDecimal newMoney = originalMoney.subtract(totalAmount);
+                redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
+
+                // 批量更新余额异常数据 状态改为1
+                for (BalanceRollbackError error : errorList) {
+                    error.setStatus(1);
+                }
+                boolean b = this.updateBatchById(errorList);
+                if (!b) {
+                    logger.error("批量更新余额异常表状态异常公司id{},",companyId);
+                    logger.error("批量更新余额异常表状态异常数据{},",errorList);
+                    throw new RuntimeException("批量更新余额异常表状态异常");
+                }
+
+            } else {
+                logger.error("获取锁异常公司id{},",companyId);
+                logger.error("获取锁异常数据{},",errorList);
+                throw new RuntimeException("获取锁失败");
+            }
+        } catch (InterruptedException e) {
+            logger.error("InterruptedException异常公司id{},",companyId);
+            logger.error("InterruptedException异常数据{},",errorList);
+            throw new RuntimeException(e);
+        }if (lockAcquired && lock1.isHeldByCurrentThread()) {
+            try {
+                lock1.unlock();
+            } catch (IllegalMonitorStateException e) {
+                logger.warn("尝试释放非当前线程持有的锁: balanceRollbackError={}",errorList);
+            }
+        }
+
+    }
+}
+
+
+
+

+ 94 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCompanyUserQwServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.course.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.course.mapper.FsUserCompanyUserQwMapper;
+import com.fs.course.domain.FsUserCompanyUserQw;
+import com.fs.course.service.IFsUserCompanyUserQwService;
+
+/**
+ * 微信用户和销售关系-企业微信自动的Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-10-23
+ */
+@Service
+public class FsUserCompanyUserQwServiceImpl extends ServiceImpl<FsUserCompanyUserQwMapper, FsUserCompanyUserQw> implements IFsUserCompanyUserQwService {
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    @Override
+    public FsUserCompanyUserQw selectFsUserCompanyUserQwById(Long id)
+    {
+        return baseMapper.selectFsUserCompanyUserQwById(id);
+    }
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的列表
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    @Override
+    public List<FsUserCompanyUserQw> selectFsUserCompanyUserQwList(FsUserCompanyUserQw fsUserCompanyUserQw)
+    {
+        return baseMapper.selectFsUserCompanyUserQwList(fsUserCompanyUserQw);
+    }
+
+    /**
+     * 新增微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw)
+    {
+        fsUserCompanyUserQw.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserCompanyUserQw(fsUserCompanyUserQw);
+    }
+
+    /**
+     * 修改微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw)
+    {
+        fsUserCompanyUserQw.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsUserCompanyUserQw(fsUserCompanyUserQw);
+    }
+
+    /**
+     * 批量删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param ids 需要删除的微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCompanyUserQwByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserCompanyUserQwByIds(ids);
+    }
+
+    /**
+     * 删除微信用户和销售关系-企业微信自动的信息
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCompanyUserQwById(Long id)
+    {
+        return baseMapper.deleteFsUserCompanyUserQwById(id);
+    }
+}

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

@@ -135,4 +135,5 @@ public class FsUserCourseComplaintRecordServiceImpl extends ServiceImpl<FsUserCo
         fsUserCourseComplaintRecord.setCreateTime(DateUtils.getNowDate());
         return baseMapper.insertFsUserCourseComplaintRecord(fsUserCourseComplaintRecord);
     }
+
 }

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

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.BeanCopyUtils;
+import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.domain.entity.SysDictData;
@@ -248,6 +249,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private IFsUserCompanyBindService fsUserCompanyBindService;
 
+    @Autowired
+    private BalanceRollbackErrorMapper balanceRollbackErrorMapper;
+
 
 
     /**
@@ -1487,14 +1491,82 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         //2025.6.19 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
 
-            Company company = companyMapper.selectCompanyById(param.getCompanyId());
-            BigDecimal money = company.getMoney();
-            if (money.compareTo(BigDecimal.ZERO)<=0) {
-                return R.error("服务商余额不足,请联系群主服务商充值!");
+            // ===================== 20251022 xgb 修改 本次修改目的为了实时扣减公司余额=====================
+            // 1 使用redis缓存加锁 预扣减余额 红包发送失败 恢复redis缓存余额,如果回滚失败登记异常记录表 定时任务重新回滚余额
+            // 2 另起定时任务 同步缓存余额到redis中
+            // 3 启动系统时查询公司账户余额(这个时候要保证余额正确)保存到redis缓存中
+
+            // 预设值异常对象
+            BalanceRollbackError balanceRollbackError = new BalanceRollbackError();
+            balanceRollbackError.setCompanyId(packetParam.getCompanyId());
+            balanceRollbackError.setUserId(user.getUserId());
+            balanceRollbackError.setLogId(log.getLogId());
+            balanceRollbackError.setVideoId(log.getVideoId());
+            balanceRollbackError.setStatus(0);
+            balanceRollbackError.setMoney(amount);
+
+            if(packetParam.getCompanyId()== null){
+                logger.error("发送红包参数错误,公司不能为空,异常请求参数{}",packetParam);
+                return R.error("发送红包失败,请联系管理员");
             }
+            String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + packetParam.getCompanyId();
+
+            // 第一次加锁:预扣减余额
+            RLock lock1 = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + packetParam.getCompanyId());
+            boolean lockAcquired = false;
+            try {
+                if (lock1.tryLock(3, 10, TimeUnit.SECONDS)) {
+                    lockAcquired = true;
+                    BigDecimal originalMoney;
+                    // 获取当前余额
+                    String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+                    if (StringUtils.isNotEmpty(moneyStr)) {
+                        originalMoney = new BigDecimal(moneyStr);
+                    }else {
+                        // 缓存没有值,重启系统恢复redis数据 保证数据正确性
+                        logger.error("发送红包获取redis余额缓存异常,异常请求参数{}",packetParam);
+                        return R.error("系统异常,请稍后重试");
+                    }
 
-            // 发送红包
-            R sendRedPacket = paymentService.sendRedPacket(packetParam);
+                    if (originalMoney.compareTo(BigDecimal.ZERO) < 0) {
+                        logger.error("服务商余额不足,异常请求参数{}",packetParam);
+                        return R.error("服务商余额不足,请联系群主服务器充值!");
+                    }
+
+                    // 预扣减金额
+                    BigDecimal newMoney = originalMoney.subtract(amount);
+                    redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
+                } else {
+                    logger.error("获取redis锁失败,异常请求参数{}",packetParam);
+                    return R.error("系统繁忙,请稍后重试");
+                }
+            } catch (Exception e) {
+                logger.error("预扣减余额失败: 异常请求参数{},异常信息{}", packetParam, e.getMessage(), e);
+                return R.error("系统异常,请稍后重试");
+            }finally {
+                // 只有在成功获取锁的情况下才释放锁
+                if (lockAcquired && lock1.isHeldByCurrentThread()) {
+                    try {
+                        lock1.unlock();
+                    } catch (IllegalMonitorStateException e) {
+                        logger.warn("尝试释放非当前线程持有的锁: companyId={}", packetParam.getCompanyId());
+                    }
+                }
+            }
+
+            // 调用第三方接口(锁外操作)
+            R sendRedPacket;
+            try {
+                sendRedPacket= paymentService.sendRedPacket(packetParam);
+            } catch (Exception e) {
+                logger.error("红包发送异常: 异常请求参数{}",packetParam, e);
+                // 异常时回滚余额
+
+                rollbackBalance(balanceRollbackError);
+                return R.error("奖励发送失败,请联系客服");
+            }
+
+            // 红包发送成功处理
             if (sendRedPacket.get("code").equals(200)) {
                 FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
                 TransferBillsResult transferBillsResult;
@@ -1526,11 +1598,15 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 // 更新观看记录的奖励类型
                 log.setRewardType(config.getRewardType());
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
-
+                // 发送成功,记录日志等操作
                 return sendRedPacket;
             } else {
+                // 发送失败,回滚余额
+                rollbackBalance(balanceRollbackError);
                 return R.error("奖励发送失败,请联系客服");
             }
+
+            // ===================== 本次修改目的为了实时扣减公司余额=====================
         } else {
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
             // 添加红包记录
@@ -1557,6 +1633,57 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     }
 
+    /**
+     * @Description: 回滚redis缓存中的余额 异常登记回滚异常表,定时重新回滚
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 10:37
+     */
+    private void rollbackBalance(BalanceRollbackError balanceRollbackError) {
+        String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + balanceRollbackError.getCompanyId();
+        RLock lock2 = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + balanceRollbackError.getCompanyId());
+        boolean lockAcquired = false;
+        boolean backError=true;
+        try {
+            if (lock2.tryLock(3, 10, TimeUnit.SECONDS)) {
+                lockAcquired=true;
+                // 获取当前余额
+                String currentMoneyStr = redisCache.getCacheObject(companyMoneyKey);
+                if (StringUtils.isEmpty(currentMoneyStr)) {
+                    throw new RuntimeException("回滚余额异常");
+                }
+
+                // 回滚金额(加回之前扣减的金额)
+                BigDecimal rollbackMoney = new BigDecimal(currentMoneyStr).add(balanceRollbackError.getMoney());
+                redisCache.setCacheObject(companyMoneyKey, rollbackMoney.toString());
+                backError=false;
+                logger.info("余额回滚成功: companyId={}, amount={}", balanceRollbackError.getCompanyId(), balanceRollbackError.getMoney());
+
+            } else {
+                logger.warn("回滚余额时获取锁失败: companyId={}", balanceRollbackError.getCompanyId());
+                // 登记回滚余额异常表
+                balanceRollbackErrorMapper.insert(balanceRollbackError);
+            }
+        } catch (Exception e) {
+            logger.error("回滚余额时发生异常: companyId={}", balanceRollbackError.getCompanyId(), e);
+            // 登记回滚余额异常表
+            if(backError){
+                balanceRollbackErrorMapper.insert(balanceRollbackError);
+            }
+        }finally {
+            // 只有在成功获取锁的情况下才释放锁
+            if (lockAcquired && lock2.isHeldByCurrentThread()) {
+                try {
+                    lock2.unlock();
+                } catch (IllegalMonitorStateException e) {
+                    logger.warn("尝试释放非当前线程持有的锁: balanceRollbackError={}",balanceRollbackError);
+                }
+            }
+        }
+    }
+
+
     /**
      * 直接发送奖励
      *

+ 3 - 0
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java

@@ -63,6 +63,9 @@ public class FsCourseWatchLogListVO extends BaseEntity
     @Excel(name = "记录类型" ,dictType = "sys_course_watch_log_type")
     private Integer logType;
 
+    @Excel(name = "奖励类型 1红包 2积分")
+    private Integer rewardType;
+
 //    @Excel(name = "企微外部联系人id")
     private String qwExternalContactId;
 

+ 1 - 0
fs-service/src/main/java/com/fs/erp/dto/ErpRefundUpdateRequest.java

@@ -10,5 +10,6 @@ public class ErpRefundUpdateRequest implements Serializable {
     String oid;//子订单号
     Integer refund_state;//0:未退款 1:退款完成 2:退款中
     Long storeAfterSalesId;//售后id
+    Integer orderStatus;//售后id
 
 }

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

@@ -65,4 +65,14 @@ public class OrderItemDTO implements Serializable {
      * 款式编码
      * **/
     private String shopIId;
+
+    /**
+     * 商品图片
+     */
+    private String  pic;
+
+    /**
+     * 商品单价
+     */
+    private BigDecimal price;
 }

+ 110 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushScrmMapper.java

@@ -0,0 +1,110 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstAftersalePush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 订阅物流Mapper
+ */
+@Mapper
+public interface FsJstAftersalePushScrmMapper {
+
+    /**
+     * 根据ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE id = #{id}")
+    FsJstAftersalePush selectById(Long id);
+
+    /**
+     * 根据订单ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE order_id = #{orderId}")
+    FsJstAftersalePush selectByOrderId(String orderId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE task_status = #{status} AND retry_count < #{maxRetry} LIMIT #{limit}")
+    List<FsJstAftersalePush> selectByStatusAndRetry(Byte status, Integer maxRetry, Integer limit);
+
+    /**
+     * 插入记录
+     */
+    @Insert("INSERT INTO fs_jst_aftersale_push_scrm(order_id,after_sale_id, type, task_status, retry_count, last_execute_time, params) " +
+            "VALUES(#{orderId},#{afterSaleId}, #{type}, #{taskStatus}, #{retryCount}, #{lastExecuteTime}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstAftersalePush push);
+
+    /**
+     * 更新记录
+     */
+    @Update("UPDATE fs_jst_aftersale_push_scrm SET params=#{params},task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = #{lastExecuteTime}, result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int update(FsJstAftersalePush push);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_aftersale_push_scrm SET task_status = #{taskStatus}, " +
+            "last_execute_time = now() WHERE id = #{id}")
+    int updateStatus(@Param("id") Long id, @Param("taskStatus") Byte taskStatus);
+
+    @Select("WITH OrderWithNextTaskType AS (\n" +
+            "    SELECT \n" +
+            "        id,\n" +
+            "        order_id,\n" +
+            "        after_sale_id,\n" +
+            "        type,\n" +
+            "        task_status,\n" +
+            "        retry_count,\n" +
+            "        ROW_NUMBER() OVER(PARTITION BY order_id ORDER BY CAST(type AS UNSIGNED)) AS task_seq\n" +
+            "    FROM \n" +
+            "        fs_jst_aftersale_push_scrm\n" +
+            "),\n" +
+            "PendingTasks AS (\n" +
+            "    SELECT \n" +
+            "        o.id,\n" +
+            "        o.order_id,\n" +
+            "        o.after_sale_id,\n" +
+            "        o.type,\n" +
+            "        o.task_status,\n" +
+            "        o.retry_count,\n" +
+            "        o.task_seq,\n" +
+            "        (\n" +
+            "            SELECT MAX(p.task_status)  \n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq = o.task_seq - 1\n" +
+            "        ) AS prev_task_status,\n" +
+            "        EXISTS (\n" +
+            "            SELECT 1\n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq < o.task_seq\n" +
+            "              AND p.task_status != 1\n" +
+            "        ) AS has_pending_prev_task\n" +
+            "    FROM \n" +
+            "        OrderWithNextTaskType o\n" +
+            "    WHERE \n" +
+            "        o.task_status = 0 OR (o.task_status = 2 AND o.retry_count < 3)\n" +
+            ")\n" +
+            "SELECT \n" +
+            "    id,\n" +
+            "    order_id,\n" +
+            "    after_sale_id,\n" +
+            "    type,\n" +
+            "    task_status,\n" +
+            "    retry_count\n" +
+            "FROM \n" +
+            "    PendingTasks\n" +
+            "WHERE \n" +
+            "    (task_seq = 1 OR prev_task_status = 1)\n" +
+            "    AND has_pending_prev_task = 0\n" +
+            "ORDER BY\n" +
+            "    order_id,\n" +
+            "    task_seq;\n")
+    List<FsJstAftersalePush> queryPenddingData();
+}

+ 77 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushScrmMapper.java

@@ -0,0 +1,77 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstCodPush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface FsJstCodPushScrmMapper {
+
+    /**
+     * 根据ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE id = #{id}")
+    FsJstCodPush selectById(@Param("id") Long id);
+
+    /**
+     * 根据订单ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE order_id = #{orderId}")
+    List<FsJstCodPush> selectByOrderId(@Param("orderId") String orderId);
+
+    /**
+     * 根据售后ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE after_sale_id = #{afterSaleId}")
+    List<FsJstCodPush> selectByAfterSaleId(@Param("afterSaleId") String afterSaleId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE task_status = 0 ORDER BY id ASC LIMIT #{limit}")
+    List<FsJstCodPush> selectPendingTasks(@Param("limit") int limit);
+
+
+    /**
+     * 查询待处理的数据
+     * @return List<FsJstCodPush>
+     */
+    @Select("SELECT * from fs_jst_cod_push_scrm where task_status = 0 OR (task_status = 2 AND retry_count < 3) ")
+    List<FsJstCodPush> queryPenddingData();
+    /**
+     * 插入新记录
+     */
+    @Insert("INSERT INTO fs_jst_cod_push_scrm(order_id, after_sale_id, type, task_status, params) " +
+            "VALUES(#{orderId}, #{afterSaleId}, #{type}, #{taskStatus}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstCodPush record);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_cod_push_scrm SET task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = NOW(), result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int updateTaskStatus(FsJstCodPush record);
+
+    /**
+     * 根据ID更新记录
+     */
+    @Update("<script>" +
+            "UPDATE fs_jst_cod_push_scrm " +
+            "<set>" +
+            "  <if test='orderId != null'>order_id = #{orderId},</if>" +
+            "  <if test='afterSaleId != null'>after_sale_id = #{afterSaleId},</if>" +
+            "  <if test='type != null'>type = #{type},</if>" +
+            "  <if test='taskStatus != null'>task_status = #{taskStatus},</if>" +
+            "  <if test='retryCount != null'>retry_count = #{retryCount},</if>" +
+            "  <if test='lastExecuteTime != null'>last_execute_time = #{lastExecuteTime},</if>" +
+            "  <if test='params != null'>params = #{params},</if>" +
+            "  <if test='result != null'>result = #{result},</if>" +
+            "  <if test='errorMessage != null'>error_message = #{errorMessage},</if>" +
+            "</set>" +
+            "WHERE id = #{id}" +
+            "</script>")
+    int updateById(FsJstCodPush record);
+}

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushScrmService.java

@@ -0,0 +1,5 @@
+package com.fs.erp.service;
+
+public interface FsJstAftersalePushScrmService {
+    void pushJst();
+}

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/FsJstCodPushScrmService.java

@@ -0,0 +1,5 @@
+package com.fs.erp.service;
+
+public interface FsJstCodPushScrmService {
+    public void jstCodPush();
+}

+ 3 - 0
fs-service/src/main/java/com/fs/erp/service/IErpGoodsService.java

@@ -7,7 +7,10 @@ public interface IErpGoodsService
 {
 
     BaseResponse addGoods(ErpGoods goods);
+    BaseResponse addGoodsScrm(ErpGoods goods);
     ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param);
+    ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param);
     ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param);
+    ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param);
 }
 

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

@@ -16,7 +16,7 @@ public interface IErpOrderService
     ErpOrderResponse refundOrder(ErpRefundOrder order);
     ErpDeliverysResponse getDeliver(ErpDeliverysRequest param);
     ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param);
-
+    ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param);
     BaseResponse refundUpdate(ErpRefundUpdateRequest param);
     BaseResponse refundUpdateScrm(ErpRefundUpdateRequest param);
 

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

@@ -259,6 +259,11 @@ public class DfOrderServiceImpl implements IErpOrderService
         return response;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest request) {
         ErpRefundOrder erpRefundOrder = new ErpRefundOrder();

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java

@@ -43,6 +43,11 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         return response;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert requert) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -60,6 +65,11 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         return response;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert requert) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -76,4 +86,9 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         ErpGoodsStockQueryResponse response=JSONUtil.toBean(result, ErpGoodsStockQueryResponse.class);
         return response;
     }
+
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
 }

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

@@ -118,6 +118,11 @@ public class ErpOrderServiceImpl implements IErpOrderService
         return response;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest request) {
         FsSysConfig sysConfig = configUtil.getSysConfig();

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

@@ -0,0 +1,176 @@
+package com.fs.erp.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.fs.common.utils.ExceptionUtil;
+import com.fs.common.utils.StringUtils;
+import com.fs.erp.constant.AfterSalesOrderStatusEnum;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.FsJstAftersalePush;
+import com.fs.erp.dto.*;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstAftersalePushScrmMapper;
+import com.fs.erp.service.FsJstAftersalePushScrmService;
+import com.fs.erp.service.FsJstAftersalePushService;
+import com.fs.his.domain.FsStoreAfterSales;
+import com.fs.his.dto.FsStoreCartDTO;
+import com.fs.his.mapper.FsStoreAfterSalesMapper;
+import com.fs.hisStore.domain.FsStoreAfterSalesScrm;
+import com.fs.hisStore.domain.FsStoreOrderItemScrm;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.mapper.FsStoreAfterSalesScrmMapper;
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
+import com.fs.ybPay.dto.RefundOrderDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.Asserts;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstAftersalePushScrmServiceImpl implements FsJstAftersalePushScrmService {
+
+    @Autowired
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Autowired
+    private FsStoreOrderScrmMapper fsStoreOrderMapper;
+
+    @Autowired
+    private IFsStoreOrderItemScrmService storeOrderItemService;
+
+    @Autowired
+    private FsStoreAfterSalesScrmMapper fsStoreAfterSalesMapper;
+
+    @Value("${jst.shop_code:''}")
+    private String shopId;
+    @Override
+    public void pushJst() {
+        List<FsJstAftersalePush> fsJstAftersalePushes = fsJstAftersalePushMapper.queryPenddingData();
+
+        for (FsJstAftersalePush item : fsJstAftersalePushes) {
+            item.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int update = fsJstAftersalePushMapper.update(item);
+            if(update <= 0){
+                log.info("获取记录{} 锁失败!",item.getId());
+                continue;
+            }
+
+            FsStoreOrderScrm fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
+
+            item.setRetryCount(item.getRetryCount()+1);
+
+            if(fsStoreOrder == null){
+                item.setErrorMessage("该订单未找到!");
+                item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                log.info("该订单未找到!");
+                fsJstAftersalePushMapper.update(item);
+                continue;
+            }
+            Asserts.notNull(fsStoreOrder,"该订单未找到!");
+            RefundOrderDTO dto;
+            dto = getAfterSaleDTO(item, fsStoreOrder);
+            // 买家已经申请,等待卖家同意
+            if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex().toString()
+                    ,item.getType())){
+
+            // 买家已经退货,等待卖家确认收货
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_CONFIRM_GOODS.getIndex().toString(),
+                    item.getType())){
+                // 查询售后单 同步快递单号过去
+                FsStoreAfterSalesScrm fsStoreAfterSales = fsStoreAfterSalesMapper.selectFsStoreAfterSalesById(item.getId());
+//                dto.setLogisticsCompany(fsStoreAfterSales.getDeliverySn());
+                dto.setLogisticsCompany(fsStoreAfterSales.getDeliveryName());
+//                dto.setLId(fsStoreAfterSales.getDeliveryId());
+                dto.setLId(fsStoreAfterSales.getDeliverySn());
+
+            // 售后关闭
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.CLOSED.getIndex().toString(),item.getType())) {
+
+            // 退款成功
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.SUCCESS.getIndex().toString(),item.getType())) {
+
+            // 确认
+            }
+
+
+            if(!StringUtils.equals(AfterSalesOrderStatusEnum.CONFIRM.getIndex().toString(),item.getType())) {
+                try{
+                    CommonResponse<AfterSaleResponseDTO> response = jstErpHttpService.aftersaleUpload(dto);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e) {
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+
+            // 如果是确认类型
+            } else{
+                AfterSaleConfirmRequestDTO requestDTO = new AfterSaleConfirmRequestDTO();
+
+                requestDTO.setAsIds(Collections.singletonList(Long.valueOf(item.getAfterSaleId())));
+                requestDTO.setExchangeForce(true);
+                requestDTO.setConfirmRefund(true);
+
+                try{
+                    CommonResponse<AssetProcessResultDTO> response = jstErpHttpService.aftersaleConfirm(requestDTO);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e){
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+            }
+
+            fsJstAftersalePushMapper.update(item);
+        }
+    }
+
+    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrderScrm fsStoreOrder) {
+        RefundOrderDTO dto = new RefundOrderDTO();
+        AfterSalesOrderStatusEnum statusEnum = AfterSalesOrderStatusEnum.getByIndex(Integer.valueOf(item.getType()));
+
+        dto.setShopStatus(statusEnum.getCode());
+        dto.setQuestionType("可更新");
+        dto.setOuterAsId(item.getAfterSaleId());
+        dto.setRemark("用户退款");
+        dto.setType("仅退款");
+
+        dto.setShopId(Long.parseLong(shopId));
+        dto.setTotalAmount(fsStoreOrder.getTotalPrice());
+        dto.setSoId(item.getOrderId());
+        dto.setRefund(fsStoreOrder.getPayMoney());
+
+
+        FsStoreOrderItemScrm itemMap=new FsStoreOrderItemScrm();
+//        itemMap.setOrderId(fsStoreOrder.getId());
+        itemMap.setOrderId(fsStoreOrder.getId());
+        List<FsStoreOrderItemScrm> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
+        List<RefundItemDTO> refundItemDTOS=new ArrayList<>();
+
+        for(FsStoreOrderItemScrm orderItem: orderItems) {
+            FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+
+            RefundItemDTO itemDTO = new RefundItemDTO();
+            itemDTO.setSkuId(cartDTO.getBarCode());
+            itemDTO.setQty(cartDTO.getNum());
+            itemDTO.setAmount(cartDTO.getPrice());
+            itemDTO.setType("退货");
+            refundItemDTOS.add(itemDTO);
+        }
+        dto.setItems(refundItemDTOS);
+        return dto;
+    }
+}

+ 12 - 8
fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java

@@ -18,6 +18,10 @@ import com.fs.his.dto.FsStoreCartDTO;
 import com.fs.his.mapper.FsStoreAfterSalesMapper;
 import com.fs.his.mapper.FsStoreOrderMapper;
 import com.fs.his.service.IFsStoreOrderItemService;
+import com.fs.hisStore.domain.FsStoreOrderItemScrm;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.ybPay.dto.RefundOrderDTO;
 import lombok.extern.slf4j.Slf4j;
 //import org.apache.commons.lang3.StringUtils;
@@ -41,10 +45,10 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
     private JstErpHttpService jstErpHttpService;
 
     @Autowired
-    private FsStoreOrderMapper fsStoreOrderMapper;
+    private FsStoreOrderScrmMapper fsStoreOrderMapper;
 
     @Autowired
-    private IFsStoreOrderItemService storeOrderItemService;
+    private IFsStoreOrderItemScrmService storeOrderItemService;
 
     @Autowired
     private FsStoreAfterSalesMapper fsStoreAfterSalesMapper;
@@ -63,7 +67,7 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
                 continue;
             }
 
-            FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
+            FsStoreOrderScrm fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
 
             item.setRetryCount(item.getRetryCount()+1);
 
@@ -135,7 +139,7 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
         }
     }
 
-    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrder fsStoreOrder) {
+    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrderScrm fsStoreOrder) {
         RefundOrderDTO dto = new RefundOrderDTO();
         AfterSalesOrderStatusEnum statusEnum = AfterSalesOrderStatusEnum.getByIndex(Integer.valueOf(item.getType()));
 
@@ -151,13 +155,13 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
         dto.setRefund(fsStoreOrder.getPayMoney());
 
 
-        FsStoreOrderItem itemMap=new FsStoreOrderItem();
+        FsStoreOrderItemScrm itemMap=new FsStoreOrderItemScrm();
 //        itemMap.setOrderId(fsStoreOrder.getId());
-        itemMap.setOrderId(fsStoreOrder.getOrderId());
-        List<FsStoreOrderItem> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
+        itemMap.setOrderId(fsStoreOrder.getId());
+        List<FsStoreOrderItemScrm> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
         List<RefundItemDTO> refundItemDTOS=new ArrayList<>();
 
-        for(FsStoreOrderItem orderItem: orderItems) {
+        for(FsStoreOrderItemScrm orderItem: orderItems) {
             FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
 
             RefundItemDTO itemDTO = new RefundItemDTO();

+ 55 - 0
fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushScrmServiceImpl.java

@@ -0,0 +1,55 @@
+package com.fs.erp.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.FsJstCodPush;
+import com.fs.erp.dto.ErpOrderResponseDTO;
+import com.fs.erp.dto.ShopOrderDTO;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.mapper.FsJstCodPushScrmMapper;
+import com.fs.erp.service.FsJstCodPushScrmService;
+import com.fs.erp.service.FsJstCodPushService;
+import com.hc.openapi.tool.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstCodPushScrmServiceImpl implements FsJstCodPushScrmService {
+    @Autowired
+    private FsJstCodPushScrmMapper fsJstCodPushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Override
+    public void jstCodPush() {
+        List<FsJstCodPush> fsJstCodPushes = fsJstCodPushMapper.queryPenddingData();
+        for (FsJstCodPush fsJstCodPush : fsJstCodPushes) {
+            fsJstCodPush.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int lock = fsJstCodPushMapper.updateById(fsJstCodPush);
+            if(lock <= 0) {
+                log.info("获取当前记录锁失败! 已跳过");
+                continue;
+            }
+
+            try{
+                String params = fsJstCodPush.getParams();
+                ShopOrderDTO shopOrderDTO = JSONObject.parseObject(params, ShopOrderDTO.class);
+                ErpOrderResponseDTO upload = jstErpHttpService.upload(shopOrderDTO);
+                fsJstCodPush.setResult(JSON.toJSONString(upload));
+                fsJstCodPush.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+
+            }catch (Exception e) {
+                fsJstCodPush.setErrorMessage(JSON.toJSONString(e));
+                fsJstCodPush.setRetryCount(fsJstCodPush.getRetryCount()+1);
+            }
+
+            fsJstCodPushMapper.updateById(fsJstCodPush);
+        }
+    }
+}

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpGoodsServiceImpl.java

@@ -48,16 +48,31 @@ public class HzOMSErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+
     /**
      * 构建店铺商品上传的参数
      *

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

@@ -87,6 +87,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
 

+ 93 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java

@@ -11,6 +11,10 @@ import com.fs.his.domain.FsStoreProduct;
 import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.service.IFsStoreProductAttrValueService;
 import com.fs.his.service.IFsStoreProductService;
+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.voice.utils.StringUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,9 +33,13 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
 
     @Autowired
     private IFsStoreProductService fsStoreProductService;
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
 
     @Autowired
     private IFsStoreProductAttrValueService fsStoreProductAttrValueService;
+    @Autowired
+    private IFsStoreProductAttrValueScrmService fsStoreProductAttrValueScrmService;
 
     // 每次最大处理数量
     private static final int BATCH_SIZE = 190;
@@ -52,6 +60,21 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        List<Long> storeProductIds = goods.getProductIdList();
+        JSONArray bulidJSONArray = buildGoodsScrm(storeProductIds);
+
+        //调用接口
+        for (int i = 0; i < bulidJSONArray.size(); i += BATCH_SIZE) {
+            JSONObject request=new JSONObject();
+            int end = Math.min(i + BATCH_SIZE, bulidJSONArray.size());
+            request.put("items",bulidJSONArray.subList(i, end));
+            jstErpHttpService.uploadGoods(request);
+        }
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         ProductQueryRequestDTO requestDTO = new ProductQueryRequestDTO();
@@ -77,11 +100,81 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
         return erpGoodsQueryResponse;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        ProductQueryRequestDTO requestDTO = new ProductQueryRequestDTO();
+        requestDTO.setSkuIds(param.getCode());
+        ProductResponseDTO productResponseDTO = jstErpHttpService.queryGoods(requestDTO);
+        List<ProductResponseDTO.ProductInfo> datas = productResponseDTO.getDatas();
+        ErpGoodsQueryResponse erpGoodsQueryResponse = new ErpGoodsQueryResponse();
+        if (CollectionUtils.isNotEmpty(datas)) {
+            List<ErpGoods> erpGoodsList = new ArrayList<>();
+            for (ProductResponseDTO.ProductInfo data : datas) {
+                ErpGoods erpGoods = new ErpGoods();
+                erpGoods.setCode(data.getSkuCode());
+                erpGoods.setName(data.getName());
+                erpGoods.setSimple_name(data.getShortName());
+                erpGoods.setCategory_code(data.getCategory());
+                erpGoods.setCost_price(data.getCostPrice());
+                erpGoods.setSales_price(data.getSalePrice());
+                erpGoods.setPurchase_price(data.getMarketPrice());
+                erpGoodsList.add(erpGoods);
+            }
+            erpGoodsQueryResponse.setItems(erpGoodsList);
+        }
+        return erpGoodsQueryResponse;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+    /**
+     * 构建店铺商品上传的参数
+     *
+     * @param storeProductIds
+     * @return
+     */
+    public JSONArray buildGoodsScrm(List<Long> storeProductIds) {
+        JSONArray res = new JSONArray();
+        //商品
+        List<FsStoreProductScrm> fsStoreProductList = fsStoreProductScrmService.getStoreProductInProductIds(storeProductIds);
+        if (!fsStoreProductList.isEmpty()) {
+
+            Map<Long, FsStoreProductScrm> productMap = fsStoreProductList.stream().collect(Collectors.toMap(FsStoreProductScrm::getProductId, p -> p));
+            //商品规格List
+            List<FsStoreProductAttrValueScrm> fsStoreProductAttrValues = fsStoreProductAttrValueScrmService.getFsStoreProductAttrValueListInProductId(storeProductIds);
+
+            //按规格构建商品数据
+            fsStoreProductAttrValues.forEach(v -> {
+                JSONObject productJson = new JSONObject();
+                FsStoreProductScrm product = productMap.get(v.getProductId());
+                productJson.put("sku_id", v.getBarCode());//商品编码
+                productJson.put("i_id", v.getBarCode());//如果没有款式默认商品编码一致
+                productJson.put("name", v.getSku());//名称
+                productJson.put("short_name", product.getKeyword());//简称
+                if(StringUtils.isNotEmpty(product.getBrand())){
+                    productJson.put("brand", product.getBrand());//品牌
+                }
+                productJson.put("weight", v.getWeight());//重量
+                productJson.put("s_price",v.getPrice());//基本售价
+                productJson.put("c_price", v.getCost());//成本
+                productJson.put("market_price", v.getOtPrice());//市场|吊牌价
+                productJson.put("unit", product.getUnitName());//单位
+                productJson.put("sku_pic", v.getImage());//商品图片
+                productJson.put("pic", v.getImage());//图片地址(款图片)
+                productJson.put("pic_big", v.getImage());//大图地址
+                res.add(productJson);
+            });
+        }
+
+        return res;
+    }
     /**
      * 构建店铺商品上传的参数
      *

+ 144 - 20
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -12,7 +12,9 @@ import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
 import com.fs.erp.http.JstErpHttpService;
 import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstAftersalePushScrmMapper;
 import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.mapper.FsJstCodPushScrmMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStoreOrderItem;
@@ -27,6 +29,7 @@ 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.hisStore.service.impl.FsStoreProductScrmServiceImpl;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.ObjectUtils;
@@ -35,6 +38,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -58,15 +62,20 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     private IFsStoreOrderItemService fsStoreOrderItemService;
     @Autowired
     private IFsStoreOrderItemScrmService fsStoreOrderItemScrmService;
-
     @Autowired
     private IFsStoreProductService fsStoreProductService;
-    @Autowired
-    private IFsStoreProductScrmService fsStoreProductScrmService;
 
     @Autowired
     private FsJstCodPushMapper fsJstCodPushMapper;
 
+    @Autowired
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushScrmMapper;
+    @Autowired
+    private FsJstCodPushScrmMapper fsJstCodPushScrmMapper;
+
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
@@ -129,8 +138,9 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
             FsStoreProduct fsStoreProduct = fsStoreProductService.selectFsStoreProductById(item.getProductId());
 
-            orderItemDTO.setAmount(fsStoreProduct.getPrice());
-
+            orderItemDTO.setAmount(fsStoreProduct.getPrice().multiply(new BigDecimal(item.getNum())));
+            orderItemDTO.setPic(fsStoreProduct.getImgUrl());
+            orderItemDTO.setPrice(fsStoreProduct.getPrice());
             orderItemDTO.setQty(item.getNum().intValue());
             orderItemDTO.setOuterOiId(String.format("%s%s",fsStoreOrder.getOrderCode(),item.getItemId()));
             itemDTOList.add(orderItemDTO);
@@ -253,8 +263,9 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
             FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(item.getProductId());
 
-            orderItemDTO.setAmount(fsStoreProduct.getPrice());
-
+            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",fsStoreOrder.getOrderCode(),item.getItemId()));
             itemDTOList.add(orderItemDTO);
@@ -275,13 +286,15 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         if("2".equals(fsStoreOrder.getPayType()) || "3".equals(fsStoreOrder.getPayType())){
             shopOrderDTO.setIsCod(true);
             // 货到付款金额 = 物流代收金额-优惠金额
-            shopOrderDTO.setBuyerPaidAmount(fsStoreOrder.getPayDelivery());
-            shopOrderDTO.setPayAmount(fsStoreOrder.getPayPrice().doubleValue());
+            //注释掉总买家实付
+            //shopOrderDTO.setBuyerPaidAmount(fsStoreOrder.getPayDelivery());
+            //应付金额(货到付款= 订单总金额 - 已付金额)
+            shopOrderDTO.setPayAmount(fsStoreOrder.getTotalPrice().subtract(fsStoreOrder.getPayPrice()).doubleValue());
 
             // 货到付款要推两次
             PaymentDTO paymentDTO2 = new PaymentDTO();
             // 物流代收金额
-            paymentDTO2.setAmount(fsStoreOrder.getPayDelivery().doubleValue());
+            paymentDTO2.setAmount(fsStoreOrder.getTotalPrice().subtract(fsStoreOrder.getPayPrice()).doubleValue());
             paymentDTO2.setOuterPayId(String.format("%s%d",order.getPlatform_code(),1));
             paymentDTO2.setPayDate(order.getDeal_datetime());
             paymentDTO2.setPayment("货到付款");
@@ -295,7 +308,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             fsJstCodPush.setParams(JSON.toJSONString(shopOrderDTO));
             fsJstCodPush.setRetryCount(0);
             fsJstCodPush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
-            fsJstCodPushMapper.insert(fsJstCodPush);
+            fsJstCodPushScrmMapper.insert(fsJstCodPush);
 
             //shopOrderDTO.setPay(paymentDTO);
         }
@@ -355,6 +368,35 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         return response;
     }
 
+
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(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::convertToErpOrderQueryScrm)
+                    .collect(Collectors.toList());
+
+            response.setOrders(erpOrders);
+        } else {
+            response.setOrders(Collections.emptyList());
+        }
+
+        return response;
+    }
     /**
      * 将OrderQueryResponseDTO.Order转换为ErpOrderQuery
      *
@@ -438,17 +480,99 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     }
 
 
+
+    private ErpOrderQuery convertToErpOrderQueryScrm(OrderQueryResponseDTO.Order order) {
+        ErpOrderQuery erpOrder = new ErpOrderQuery();
+
+        FsStoreOrderScrm fsStoreOrder = fsStoreOrderService.selectFsStoreOrderScrmByOrderCode(order.getSoId());
+        Asserts.notNull(fsStoreOrder,"该订单号没有找到!");
+
+        // 设置基本订单信息
+        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(fsStoreOrder.getRealName());
+        erpOrder.setReceiver_name(fsStoreOrder.getRealName());
+        erpOrder.setReceiver_phone(fsStoreOrder.getUserPhone());
+        erpOrder.setReceiver_mobile(fsStoreOrder.getUserPhone());
+
+        // 构建完整地址
+        erpOrder.setReceiver_address(fsStoreOrder.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) {
 
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(param.getTid());
-        //todo 待合并
-//        FsStoreDelivers byOrderCode = fsStoreDeliversMapper.findByOrderCode(fsStoreOrder.getOrderCode());
-        //todo
         // 发货后退款
-//        if(ObjectUtil.isNotNull(byOrderCode)){
+        if(ObjectUtils.equals(param.getOrderStatus(),2)){
+            FsJstAftersalePush fsJstAftersalePush = new FsJstAftersalePush();
+            fsJstAftersalePush.setOrderId(fsStoreOrder.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()));
+            fsJstAftersalePushMapper.insert(fsJstAftersalePush);
 
-//        } else {
+        } else {
             // 如果是发货前退款,直接走取消订单流程
             // 如果是发货后退款,走售后流程
             OrderCancelRequestDTO requestDTO = new OrderCancelRequestDTO();
@@ -457,7 +581,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             requestDTO.setRemark("用户退款");
 
             jstErpHttpService.cancel(requestDTO);
-//        }
+        }
 
 
         BaseResponse baseResponse = new BaseResponse();
@@ -467,7 +591,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     }
 
     @Autowired
-    private FsJstAftersalePushMapper fsJstAftersalePushMapper;
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
 
     @Override
     public BaseResponse refundUpdateScrm(ErpRefundUpdateRequest param) {
@@ -475,7 +599,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         log.info("订单号: {},发货状态: {},是否发货后: {}",fsStoreOrder.getOrderCode(),fsStoreOrder.getStatus(),ObjectUtils.equals(fsStoreOrder.getStatus(),2));
 
         // 发货后退款
-        if(ObjectUtils.equals(fsStoreOrder.getStatus(),2)){
+        if(ObjectUtils.equals(param.getOrderStatus(),2)){
 
             FsJstAftersalePush fsJstAftersalePush = new FsJstAftersalePush();
             fsJstAftersalePush.setOrderId(fsStoreOrder.getOrderCode());
@@ -483,7 +607,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             fsJstAftersalePush.setType(String.valueOf(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex()));
             fsJstAftersalePush.setRetryCount(0);
             fsJstAftersalePush.setAfterSaleId(String.valueOf(param.getStoreAfterSalesId()));
-            fsJstAftersalePushMapper.insert(fsJstAftersalePush);
+            fsJstAftersalePushScrmMapper.insert(fsJstAftersalePush);
 
         } else {
             // 如果是发货前退款,直接走取消订单流程

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

@@ -128,6 +128,11 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
         return null;

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/K9StockScrmServiceImpl.java

@@ -36,11 +36,21 @@ public class K9StockScrmServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         String barcode = param.getBarcode();
@@ -63,6 +73,11 @@ public class K9StockScrmServiceImpl implements IErpGoodsService {
         return response;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+
     /**
      * 查看库存
      * @param request 参数

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java

@@ -35,6 +35,11 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         Map<String,String> map = new HashMap<>();
@@ -81,6 +86,11 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
 
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         String barcode = param.getBarcode();
@@ -115,5 +125,10 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
             throw new RuntimeException(e);
         }
     }
+
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
 }
 

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

@@ -827,6 +827,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
         FsSysConfig sysConfig = configUtil.getSysConfig();

+ 1 - 0
fs-service/src/main/java/com/fs/his/dto/InquiryConfigDTO.java

@@ -19,4 +19,5 @@ public class InquiryConfigDTO implements Serializable {
     private Integer unReceiveCancelTime;
     private BigDecimal companyPrice;
     private BigDecimal companyPrescribePrice;
+    private String inquirySubType;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java

@@ -29,6 +29,10 @@ public class PayloadDTO implements Serializable {
         private String appRealLink;
         private String writeStatus;
         private String packageId;
+        private String type;
+        private Long companyId;
+        private Long companyUserId;
+        private Long doctorId;
 
     }
 

+ 1 - 0
fs-service/src/main/java/com/fs/his/enums/FsStoreOrderLogEnum.java

@@ -18,6 +18,7 @@ public enum FsStoreOrderLogEnum {
     UPDATE_ORDER_DF("update_order_df","代服取消订单,需要重新发货"),
     TAKE_ORDER_DELIVERY("user_take_delivery","用户已收货"),
     PAY_ORDER_SUCCESS("pay_success","用户付款成功"),
+    UN_PAY_ORDER("un_pay","用户待付款付款"),
     PAY_REMAIN_ORDER_SUCCESS("pay_remain_success","用户付款尾款成功"),
 
     CREATE_ORDER("create_order","订单生成"),

+ 1 - 0
fs-service/src/main/java/com/fs/his/mapper/FsInquiryOrderMapper.java

@@ -385,4 +385,5 @@ public interface FsInquiryOrderMapper
             "</script>"})
     Long selectFsInquiryFeedbackExportListVOCount(@Param("maps") FsInquiryOrderParam fsInquiryOrder);
 
+    void closeOrder(Long orderId);
 }

+ 21 - 0
fs-service/src/main/java/com/fs/his/mapper/FsPrescribeMapper.java

@@ -2,6 +2,7 @@ package com.fs.his.mapper;
 
 import java.util.List;
 import com.fs.his.domain.FsPrescribe;
+import com.fs.his.param.FsPrescribeListDCompanyParam;
 import com.fs.his.param.FsPrescribeListDParam;
 import com.fs.his.param.FsPrescribeListUParam;
 import com.fs.his.param.FsPrescribeParam;
@@ -134,6 +135,26 @@ public interface FsPrescribeMapper
             "</script>"})
     List<FsPrescribeListUVO> selectFsPrescribeListUVO(@Param("maps")FsPrescribeListUParam param);
 
+    @Select({"<script> " +
+            "select p.*  from fs_prescribe p LEFT JOIN company_user_user c ON p.user_id = c.user_id " +
+            "where 1=1  " +
+            "<if test = 'maps.status != null '> " +
+            "and p.status = #{maps.status} " +
+            "</if>" +
+            "<if test = ' maps.patientName!=null and maps.patientName != \"\"  '> " +
+            "and p.patient_name like concat('%', #{maps.patientName}, '%') " +
+            "</if>" +
+            "<if test = ' maps.prescribeType!=null and maps.prescribeType != \"\"  '> " +
+            "and p.prescribe_type = #{maps.prescribeType} " +
+            "</if>" +
+            "<if test = ' maps.companyUserId!=null and maps.companyUserId != \"\"  '> " +
+            "and c.company_user_id = #{maps.companyUserId} " +
+            "</if>" +
+            " order by p.create_time desc "+
+            "</script>"})
+    List<FsPrescribeListDVO> selectFsPrescribeListUVOByCompanyUser(@Param("maps") FsPrescribeListDCompanyParam param);
+
+
 
     @Select("select so.*,ffff.doctor_name prescribeDoctorName, us.nick_name ,dc.doctor_name,dp.doctor_name doctor_drug_name,fso.order_code,fso.`status` order_status,fse.store_name FROM fs_prescribe so  LEFT JOIN fs_user us ON us.user_id=so.user_id LEFT JOIN fs_doctor dc ON dc.doctor_id = so.doctor_id LEFT JOIN fs_doctor dp ON dp.doctor_id =so.drug_doctor_id LEFT JOIN fs_store_order fso ON fso.order_id = so.store_order_id LEFT JOIN fs_store fse ON fse.store_id = so.store_id  LEFT JOIN fs_doctor ffff ON ffff.doctor_id=so.prescribe_doctor_id  where so.prescribe_id=#{prescribeId}")
     FsPrescribeVO selectFsPrescribeByPrescribeIdVO(Long prescribeId);

+ 9 - 1
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java

@@ -17,6 +17,7 @@ import com.fs.his.domain.FsStoreOrderLogs;
 import com.fs.his.dto.FsStoreOrderAmountStatsQueryDto;
 import com.fs.his.param.*;
 import com.fs.his.vo.*;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -355,6 +356,9 @@ public interface FsStoreOrderMapper
     @Select("SELECT * FROM fs_store_order WHERE order_code =#{orderCode}")
     FsStoreOrder selectFsStoreOrderByOrderCode(String orderCode);
 
+    @Select("SELECT * FROM fs_store_order_scrm WHERE order_code =#{orderCode}")
+    FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String orderCode);
+
     @Select("select so.*,st.store_name,us.nick_name,us.phone,p.patient_age,p.patient_gender,p.patient_descs,p.patient_name," +
             "d.doctor_name,fp.prescribe_code,fd.doctor_name follow_doctor_name,c.company_name,cu.user_name company_user_name,pat.relation  " +
             "FROM fs_store_order so LEFT JOIN fs_store st ON so.store_id =st.store_id " +
@@ -1131,7 +1135,8 @@ public interface FsStoreOrderMapper
     @Select("select * from fs_store_order where extend_order_id  like 'SO%' and `status`=2 ")
     List<FsStoreOrder> selectOmsOrderdeliveryOp();
 
-
+    @Select("select * from fs_store_order_scrm where extend_order_id  is not null and `status`=1 ")
+    List<FsStoreOrderScrm> selectOmsOrderdeliveryOpScrm();
     List<FsStoreOrder> selectFsStoreOrderByOrderIdIn(@Param("ids") List<Long> ids);
 
     List<FsStoreOrder> selectFsStoreOrderStatisticsByUserId(@Param("ids") List<Long> ids);
@@ -1151,6 +1156,9 @@ public interface FsStoreOrderMapper
     @Select("select * from fs_store_order where  `status`=2 and extend_order_id is not null and extend_order_id != '' ")
     List<FsStoreOrder> selectWdtOmsOrderdeliveryOp();
 
+    @Select("select * from fs_store_order_scrm where  `status`=1 and extend_order_id is not null and extend_order_id != '' ")
+    List<FsStoreOrderScrm> selectWdtOmsOrderdeliveryOpScrm();
+
     int batchUpdateErpByOrderIds(@Param("maps") List<Map<String, String>> maps);
 
     @Select(" select * from fs_store_order where order_code=#{orderCode} and store_id=#{storeId}")

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderComputeParam.java

@@ -14,6 +14,7 @@ public class FsPackageOrderComputeParam implements Serializable {
     Integer type=1;
     Long companyId;
     Long companyUserId;
+    private String createPackageOrderKey;
 
 
 }

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

@@ -19,6 +19,8 @@ public class FsPackageOrderCreateParam implements Serializable {
     private String formJson;
     private String patientJson;
     private Integer source;//订单来源 1:小程序 2:app  3:H5
+    private String createPackageOrderKey;
+    private Integer payType;
 
 
 

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderDoPayParam.java

@@ -12,4 +12,5 @@ public class FsPackageOrderDoPayParam implements Serializable {
     Long userId;
 
     private String appId;//小程序id
+    private String createPackageOrderKey;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderPayParam.java

@@ -16,4 +16,5 @@ public class FsPackageOrderPayParam implements Serializable {
     Integer payType;
 
     Long userId;
+    private String createPackageOrderKey;
 }

+ 27 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeListDCompanyParam.java

@@ -0,0 +1,27 @@
+package com.fs.his.param;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.io.Serializable;
+@Data
+public class FsPrescribeListDCompanyParam  extends BaseParam implements Serializable {
+
+    Long doctorId;
+    Long doctorDrugId;
+    Integer status;//1待审核 2历史订单
+    Integer type;//1医生 2药师
+    String patientName;
+    String prescribeCode;
+    Integer prescribeType;
+    Long companyUserId;
+
+    /** 开始时间 */
+    @JsonIgnore
+    private String beginTime;
+    /** 结束时间 */
+    @JsonIgnore
+    private String endTime;
+
+
+}

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeListDParam.java

@@ -17,6 +17,7 @@ public class FsPrescribeListDParam extends BaseParam implements Serializable {
     String patientName;
     String prescribeCode;
     Integer prescribeType;
+    Long companyUserId;
 
     /** 开始时间 */
     @JsonIgnore

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeListUParam.java

@@ -8,4 +8,5 @@ import java.io.Serializable;
 public class FsPrescribeListUParam extends BaseParam implements Serializable {
     Long userId;
     Integer status;
+    String patientName;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeParam.java

@@ -134,6 +134,7 @@ public class FsPrescribeParam {
     private Long companyUserId;
 
     private Long taskId;//任务ID
+    private boolean isImOpen;
 
 
 

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

@@ -132,4 +132,5 @@ public interface IFsInquiryOrderService
 
     R getWxaCodeInquiryOrderUnLimitR(Long orderId);
 
+    void closeOrder(Long orderId);
 }

+ 18 - 0
fs-service/src/main/java/com/fs/his/service/IFsPackageOrderService.java

@@ -1,8 +1,10 @@
 package com.fs.his.service;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
+import com.fs.company.domain.CompanyUser;
 import com.fs.his.domain.FsPackage;
 import com.fs.his.domain.FsPackageOrder;
 import com.fs.his.domain.FsStorePayment;
@@ -124,4 +126,20 @@ public interface IFsPackageOrderService
 
     R getWxaCodePackageOrderUnLimit(Long orderId);
 
+    /**
+     * 套餐包制单
+     */
+    R createPackageOrder(CompanyUser companyUser,Long packageId);
+
+    /**
+     * 更新套餐订单金额
+     * @param createOrderKey 键
+     * @param money 订单金额
+     * @param payAmount 支付金额
+     * @param payType 支付类型 1-全款 2-物流代收
+     */
+    R updatePackageOrderMoney(String createOrderKey, BigDecimal money, BigDecimal payAmount, Integer payType);
+
+
+    R getPackageOrder(String createOrderKey);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsPrescribeService.java

@@ -104,4 +104,6 @@ public interface IFsPrescribeService
     List<Long> selectFsPrescribeByPrescribeIdByOrderType();
 
     void PrescribeStoreImg(Long id);
+
+    List<FsPrescribeListDVO> selectFsPrescribeListDVOByCompanyUser(FsPrescribeListDCompanyParam param);
 }

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

@@ -19,6 +19,7 @@ import com.fs.his.dto.*;
 import com.fs.his.param.*;
 import com.fs.his.vo.*;
 import com.fs.huifuPay.domain.HuiFuResult;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -270,4 +271,10 @@ public interface IFsStoreOrderService
      * 查询互联网医院订单金额统计信息
      * */
     FsStoreOrderAmountStatsVo selectFsStoreOrderAmountStats(FsStoreOrderAmountStatsQueryDto queryDto);
+
+    void deliveryOrderScrm(String orderCode, String mailNo, String expressCode, String expressName);
+
+    FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String soId);
+
+    FsStoreOrder confirmOrder(FsPackageOrder packageOrder,Long doctorId);
 }

+ 32 - 22
fs-service/src/main/java/com/fs/his/service/impl/FsDoctorServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.his.service.impl;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
@@ -23,6 +24,7 @@ import com.fs.his.utils.HttpUtil;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.*;
 import com.fs.im.config.IMConfig;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
 import com.fs.im.service.OpenIMService;
@@ -416,10 +418,14 @@ public class FsDoctorServiceImpl implements IFsDoctorService
                         msg.setMsgType("TIMCustomElem");//TIMCustomElem
                         msgs.add(msg);
                         msgDTO.setMsgBody(msgs);
+                        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                            ObjectMapper objectMapper = new ObjectMapper();
+                            String ex = objectMapper.writeValueAsString(customDTO3);
+                            openIMService.sendUtil("D"+fsFollow.getDoctorId(),"U"+fsFollow.getUserId(),110,"follow","","",followId,"",ex);
+                        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                            imService.sendMsg(msgDTO);
+                        }
                         //imService.sendMsg(msgDTO);
-                        ObjectMapper objectMapper = new ObjectMapper();
-                        String ex = objectMapper.writeValueAsString(customDTO3);
-                        openIMService.sendUtil("D"+fsFollow.getDoctorId(),"U"+fsFollow.getUserId(),110,"follow","","",followId,"",ex);
                         /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
                         openImMsgDTO.setSendID("D"+fsFollow.getDoctorId().toString());
                         openImMsgDTO.setRecvID("U"+fsFollow.getUserId().toString());
@@ -449,25 +455,29 @@ public class FsDoctorServiceImpl implements IFsDoctorService
                         msg2.setMsgType("TIMTextElem");//TIMCustomElem
                         msgs2.add(msg2);
                         msgDTO2.setMsgBody(msgs2);
-                        //imService.sendMsg(msgDTO2);
-                        OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
-                        openImMsgDTO1.setSendID("D"+fsFollow.getDoctorId().toString());
-                        openImMsgDTO1.setRecvID("U"+fsFollow.getUserId().toString());
-                        openImMsgDTO1.setContentType(101);
-                        openImMsgDTO1.setSenderPlatformID(5);
-                        openImMsgDTO1.setSessionType(1);
-                        OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
-                        content1.setContent("尊敬的用户,为了您的健康,请认真填写随访单,以便医生随时了解您的用药情况,评估治疗效果。如果在用药中出现任何不适,可直接在对话框中描述您目前的情况,我将及时为您解答!");
-                        openImMsgDTO1.setContent(content1);
-                        //openImMsgDTO.setEx(customDTO);
-                        OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
-                        offlinePushInfo.setDesc(content1.getContent());
-                        String doctorNameByIds = fsDoctorMapper.selectDoctorNameByIds(fsFollow.getDoctorId().toString());
-                        offlinePushInfo.setTitle(doctorNameByIds);
-                        offlinePushInfo.setIOSBadgeCount(true);
-                        offlinePushInfo.setIOSPushSound("");
-                        openImMsgDTO1.setOfflinePushInfo(offlinePushInfo);
-                        openIMService.openIMSendMsg(openImMsgDTO1);
+                        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                            OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+                            openImMsgDTO1.setSendID("D"+fsFollow.getDoctorId().toString());
+                            openImMsgDTO1.setRecvID("U"+fsFollow.getUserId().toString());
+                            openImMsgDTO1.setContentType(101);
+                            openImMsgDTO1.setSenderPlatformID(5);
+                            openImMsgDTO1.setSessionType(1);
+                            OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
+                            content1.setContent("尊敬的用户,为了您的健康,请认真填写随访单,以便医生随时了解您的用药情况,评估治疗效果。如果在用药中出现任何不适,可直接在对话框中描述您目前的情况,我将及时为您解答!");
+                            openImMsgDTO1.setContent(content1);
+                            //openImMsgDTO.setEx(customDTO);
+                            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+                            offlinePushInfo.setDesc(content1.getContent());
+                            String doctorNameByIds = fsDoctorMapper.selectDoctorNameByIds(fsFollow.getDoctorId().toString());
+                            offlinePushInfo.setTitle(doctorNameByIds);
+                            offlinePushInfo.setIOSBadgeCount(true);
+                            offlinePushInfo.setIOSPushSound("");
+                            openImMsgDTO1.setOfflinePushInfo(offlinePushInfo);
+                            openIMService.openIMSendMsg(openImMsgDTO1);
+                        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                            imService.sendMsg(msgDTO2);
+                        }
+
                     }
                 }catch (Exception e){
                     log.error("随访失败!订单编号: {}",order.getOrderId(),e);

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

@@ -54,6 +54,9 @@ public class FsFollowReportServiceImpl implements IFsFollowReportService
     private FsPrescribeMapper fsPrescribeMapper;
 
     @Autowired
+    private IImService imService;
+//    @Autowired
+//    SmsServiceImpl smsService;
     @Lazy
     SmsServiceImpl smsService;
     Logger logger= LoggerFactory.getLogger(getClass());

+ 38 - 34
fs-service/src/main/java/com/fs/his/service/impl/FsFollowServiceImpl.java

@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSON;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.annotation.Log;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.utils.DateUtils;
 import com.fs.his.domain.FsFollowTemp;
 import com.fs.his.domain.FsPackageOrder;
@@ -20,6 +21,7 @@ import com.fs.his.param.FsFollowParam;
 import com.fs.his.param.FsStoreOrderParam;
 import com.fs.his.vo.*;
 import com.fs.im.config.IMConfig;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
 import com.fs.im.service.OpenIMService;
@@ -169,17 +171,17 @@ public class FsFollowServiceImpl implements IFsFollowService
             fsFollow.setFormJson(fsFollowTemp.getFormJson());
             fsFollow.setCreateTime(DateUtils.getNowDate());
             int i = fsFollowMapper.insertFsFollow(fsFollow);
-            //MsgDTO msgDTO=new MsgDTO();
+            MsgDTO msgDTO=new MsgDTO();
             MsgCustomDTO customDTO=new MsgCustomDTO();
             customDTO.setType("follow");
             customDTO.setOrderType(2);
             customDTO.setFollowId(fsFollow.getFollowId().toString());
             customDTO.setOrderId(fsFollow.getPackageOrderId().toString());
             customDTO.setImType(2);
-            //msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
+            msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
 
-            //msgDTO.setFrom_Account("D-"+fsFollow.getDoctorId());
-            //msgDTO.setTo_Account("U-"+fsFollow.getUserId());
+            msgDTO.setFrom_Account("D-"+fsFollow.getDoctorId());
+            msgDTO.setTo_Account("U-"+fsFollow.getUserId());
             List<MsgDataDTO> msgs=new ArrayList<>();
             MsgDataDTO msg=new MsgDataDTO();
             String ext= JSONUtil.toJsonStr(fsFollow);
@@ -187,11 +189,15 @@ public class FsFollowServiceImpl implements IFsFollowService
             msg.setMsgContent(new MsgDataFormatDTO("follow",ext,followId));
             msg.setMsgType("TIMCustomElem");//TIMCustomElem
             msgs.add(msg);
-            //msgDTO.setMsgBody(msgs);
-            //MsgResponseDTO msgResponseDTO = imService.sendMsg(msgDTO);
-            ObjectMapper objectMapper = new ObjectMapper();
-            String ex = objectMapper.writeValueAsString(customDTO);
-            OpenImResponseDTO follow = openIMService.sendUtil("D"+fsFollow.getDoctorId(), "U"+fsFollow.getUserId(), 110, "follow", "", "", followId, "",ex);
+            msgDTO.setMsgBody(msgs);
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                ObjectMapper objectMapper = new ObjectMapper();
+                String ex = objectMapper.writeValueAsString(customDTO);
+                OpenImResponseDTO follow = openIMService.sendUtil("D"+fsFollow.getDoctorId(), "U"+fsFollow.getUserId(), 110, "follow", "", "", followId, "",ex);
+                logger.info("发送随访"+follow);
+            }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                MsgResponseDTO msgResponseDTO = imService.sendMsg(msgDTO);
+            }
             /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
             openImMsgDTO.setSendID("D"+fsFollow.getDoctorId().toString());
             openImMsgDTO.setRecvID("U"+fsFollow.getUserId().toString());
@@ -203,9 +209,6 @@ public class FsFollowServiceImpl implements IFsFollowService
             openImMsgDTO.setContent(content);
             //openImMsgDTO.setEx(customDTO);
             OpenImResponseDTO openImResponseDTO = openIMService.openIMSendMsg(openImMsgDTO);*/
-
-            logger.info("发送随访"+follow);
-
             MsgDTO msgDTO2=new MsgDTO();
             msgDTO2.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
 
@@ -218,28 +221,29 @@ public class FsFollowServiceImpl implements IFsFollowService
             msg2.setMsgType("TIMTextElem");//TIMCustomElem
             msgs2.add(msg2);
             msgDTO2.setMsgBody(msgs2);
-
-            //MsgResponseDTO msgResponseDTO2 = imService.sendMsg(msgDTO2);
-            OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
-            openImMsgDTO1.setSendID("D"+fsFollow.getDoctorId().toString());
-            openImMsgDTO1.setRecvID("U"+fsFollow.getUserId().toString());
-            openImMsgDTO1.setContentType(101);
-            openImMsgDTO1.setSenderPlatformID(5);
-            openImMsgDTO1.setSessionType(1);
-            OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
-            content1.setContent("尊敬的用户,为了您的健康,请认真填写随访单,以便医生随时了解您的用药情况,评估治疗效果。如果在用药中出现任何不适,可直接在对话框中描述您目前的情况,我将及时为您解答!");
-            openImMsgDTO1.setContent(content1);
-            //openImMsgDTO.setEx(customDTO);
-            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
-            offlinePushInfo.setDesc(content1.getContent());
-            String doctorNameByIds = fsDoctorMapper.selectDoctorNameByIds(fsFollow.getDoctorId().toString());
-            offlinePushInfo.setTitle(doctorNameByIds);
-            offlinePushInfo.setIOSBadgeCount(true);
-            offlinePushInfo.setIOSPushSound("");
-            openImMsgDTO1.setOfflinePushInfo(offlinePushInfo);
-            OpenImResponseDTO openImResponseDTO1 = openIMService.openIMSendMsg(openImMsgDTO1);
-
-            logger.info("发送随访"+openImResponseDTO1);
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+                openImMsgDTO1.setSendID("D"+fsFollow.getDoctorId().toString());
+                openImMsgDTO1.setRecvID("U"+fsFollow.getUserId().toString());
+                openImMsgDTO1.setContentType(101);
+                openImMsgDTO1.setSenderPlatformID(5);
+                openImMsgDTO1.setSessionType(1);
+                OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
+                content1.setContent("尊敬的用户,为了您的健康,请认真填写随访单,以便医生随时了解您的用药情况,评估治疗效果。如果在用药中出现任何不适,可直接在对话框中描述您目前的情况,我将及时为您解答!");
+                openImMsgDTO1.setContent(content1);
+                //openImMsgDTO.setEx(customDTO);
+                OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+                offlinePushInfo.setDesc(content1.getContent());
+                String doctorNameByIds = fsDoctorMapper.selectDoctorNameByIds(fsFollow.getDoctorId().toString());
+                offlinePushInfo.setTitle(doctorNameByIds);
+                offlinePushInfo.setIOSBadgeCount(true);
+                offlinePushInfo.setIOSPushSound("");
+                openImMsgDTO1.setOfflinePushInfo(offlinePushInfo);
+                OpenImResponseDTO openImResponseDTO1 = openIMService.openIMSendMsg(openImMsgDTO1);
+                logger.info("发送随访"+openImResponseDTO1);
+            }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                MsgResponseDTO msgResponseDTO2 = imService.sendMsg(msgDTO2);
+            }
             if (i>0){
                 FsPackageOrder fsPackageOrder = new FsPackageOrder();
                 fsPackageOrder.setOrderId(order.getOrderId());

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

@@ -67,8 +67,8 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService
     private FsFollowReportMapper fsFollowReportMapper;
     @Autowired
     private FsDoctorMapper  doctorMapper;
+    @Lazy
     @Autowired
-            @Lazy
     SmsServiceImpl smsService;
     @Autowired
     FsUserMapper fsUserMapper;

+ 72 - 35
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java

@@ -14,6 +14,7 @@ import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.exception.CustomException;
 import com.fs.common.service.impl.SmsServiceImpl;
 import com.fs.common.utils.CloudHostUtils;
@@ -48,6 +49,7 @@ import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.im.config.IMConfig;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
 import com.fs.im.service.OpenIMService;
@@ -660,6 +662,9 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
                     }
                 }
             }
+            if(param.getDoctorId()!=null){
+                order.setDoctorId(param.getDoctorId());
+            }
             List<FsPriceDTO> price = configDTO.getPrices().stream().filter(x -> x.getType().equals(param.getOrderType())).collect(Collectors.toList());
             if(price!=null&&price.size()==1){
                 order.setMoney(price.get(0).getPrice());
@@ -815,9 +820,16 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
             map.setStatus(FsInquiryOrderStatusEnum.STATUS_2.getValue());
             map.setPayTime(new Date());
             map.setTradeNo(tradeNo);
+            if(CloudHostUtils.hasCloudHostName("木易华康")&&order.getDoctorId()!=null){
+                map.setIsAudit(1);
+            }
             fsInquiryOrderMapper.updateFsInquiryOrder(map);
             // 木易华康特殊处理(支付成功医生自动接单)
             if (CloudHostUtils.hasCloudHostName("木易华康")&&order.getDoctorId()!=null) {
+                Integer orderCount=fsInquiryOrderMapper.checkAcceptOrder(order.getDoctorId(),order.getUserId());
+                if(orderCount>0){
+                    return R.error("此医生正在为您服务,不能下单");
+                }
                 FsInquiryOrderReceiveParam fsInquiryOrderReceiveParam = new FsInquiryOrderReceiveParam();
                 fsInquiryOrderReceiveParam.setOrderId(order.getOrderId());
                 fsInquiryOrderReceiveParam.setDoctorId(order.getDoctorId());
@@ -945,34 +957,37 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
 
             }
         }
-        //MsgDTO msgDTO=new MsgDTO();
+        MsgDTO msgDTO=new MsgDTO();
         MsgCustomDTO customDTO=new MsgCustomDTO();
         customDTO.setType("startInquiry");
         customDTO.setOrderType(order.getOrderType());
         customDTO.setOrderId(order.getOrderId().toString());
         customDTO.setImType(1);
-        /*msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
+        msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
         msgDTO.setFrom_Account("D-"+param.getDoctorId());
-        msgDTO.setTo_Account("U-"+order.getUserId());*/
-        /*List<MsgDataDTO> msgs=new ArrayList<>();
+        msgDTO.setTo_Account("U-"+order.getUserId());
+        List<MsgDataDTO> msgs=new ArrayList<>();
         MsgDataDTO msg=new MsgDataDTO();
-        msg.setMsgType("TIMCustomElem");*/
+        msg.setMsgType("TIMCustomElem");
         FsDoctor doctor=doctorMapper.selectFsDoctorByDoctorId(param.getDoctorId());
         String doc="医生";
         if (doctor.getDeptId()!=null&&doctor.getDeptId().compareTo(39L)==0){
             doc="药师";
         }
-        /*InquiryOrderMsgDTO inquiryOrderMsgDTO=new InquiryOrderMsgDTO();
+        InquiryOrderMsgDTO inquiryOrderMsgDTO=new InquiryOrderMsgDTO();
         inquiryOrderMsgDTO.setTitle(doctor.getDoctorName()+doc+"为您服务");
         String ext= JSONUtil.toJsonStr(inquiryOrderMsgDTO);
         msg.setMsgContent(new MsgDataFormatDTO("startInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
-        msgDTO.setMsgBody(msgs);*/
-        //imService.sendMsg(msgDTO);
+        msgDTO.setMsgBody(msgs);
         ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+param.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","",doctor.getDoctorName()+doc+"为您服务","","","");
-        /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+param.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","",doctor.getDoctorName()+doc+"为您服务","","","");
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
+                /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
         openImMsgDTO.setSendID("D"+param.getDoctorId().toString());
         openImMsgDTO.setRecvID("U"+order.getUserId().toString());
         openImMsgDTO.setContentType(110);
@@ -1000,11 +1015,13 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
             msg1.setMsgContent(dto1);
             msgs1.add(msg1);
             msgDTO1.setMsgBody(msgs1);
-            //imService.sendMsg(msgDTO1);
 
-            ObjectMapper objectMapper1 = new ObjectMapper();
-            String ex1 = objectMapper.writeValueAsString(customDTO1);
-            openIMService.sendUtil("D"+param.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","","您好,我是芸医汇互联网医院执业药师,请问您有什么问题想咨询?","","",ex1);
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                String ex1 = objectMapper.writeValueAsString(customDTO1);
+                openIMService.sendUtil("D"+param.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","","您好,我是芸医汇互联网医院执业药师,请问您有什么问题想咨询?","","",ex1);
+            }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                imService.sendMsg(msgDTO1);
+            }
             /*OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
             openImMsgDTO1.setSendID("D"+param.getDoctorId().toString());
             openImMsgDTO1.setRecvID("U"+order.getUserId().toString());
@@ -1132,10 +1149,15 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msg.setMsgContent(new MsgDataFormatDTO("startInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        //imService.sendMsg(msgDTO);
         ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","",doctor.getDoctorName()+doc+"为您服务","","",ex);
+
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","",doctor.getDoctorName()+doc+"为您服务","","",ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
+        //imService.sendMsg(msgDTO);
         /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
         openImMsgDTO.setSendID("D"+order.getDoctorId().toString());
         openImMsgDTO.setRecvID("U"+order.getUserId().toString());
@@ -1165,11 +1187,13 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
             msgs1.add(msg1);
             msgDTO1.setMsgBody(msgs1);
             //imService.sendMsg(msgDTO1);
-
-            ObjectMapper objectMapper1 = new ObjectMapper();
-            String ex1 = objectMapper.writeValueAsString(customDTO1);
-            openIMService.sendUtil("D"+param.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","","您好,我是芸医汇互联网医院执业药师,请问您有什么问题想咨询?","","",ex1);
-           /* OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                String ex1 = objectMapper.writeValueAsString(customDTO1);
+                openIMService.sendUtil("D"+param.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","","您好,我是芸医汇互联网医院执业药师,请问您有什么问题想咨询?","","",ex1);
+            }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                imService.sendMsg(msgDTO1);
+            }
+            /* OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
             openImMsgDTO1.setSendID("D"+order.getDoctorId().toString());
             openImMsgDTO1.setRecvID("U"+order.getUserId().toString());
             openImMsgDTO1.setContentType(110);
@@ -1318,9 +1342,12 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msgDTO.setMsgBody(msgs);
         //imService.sendMsg(msgDTO);
         ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"finishInquiry","","医生完成订单","","",ex);
-
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"finishInquiry","","医生完成订单","","",ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
         //发送给医生
 //        MsgDTO msgDTO1=new MsgDTO();
 //        MsgCustomDTO customDTO1=new MsgCustomDTO();
@@ -1389,11 +1416,13 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msg.setMsgContent(new MsgDataFormatDTO("finishInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        //imService.sendMsg(msgDTO);
-        ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"finishInquiry","","医生完成订单","","",ex);
-
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"finishInquiry","","医生完成订单","","",ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
         redisTemplate.delete("DrugReport:doctorId:" + order.getDoctorId() + ":userId:" + order.getUserId());
         return R.ok();
     }
@@ -1698,10 +1727,13 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
         //imService.sendMsg(msgDTO);
-
-        ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","1","为您服务","","",ex);
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","1","为您服务","","",ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
 
         return "OK";
     }
@@ -1954,5 +1986,10 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
 
     }
 
+    @Override
+    public void closeOrder(Long orderId) {
+        fsInquiryOrderMapper.closeOrder(orderId);
+    }
+
 
 }

+ 116 - 37
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -28,6 +28,7 @@ import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
@@ -164,6 +165,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
     @Autowired
     private IFsUserWxService userWxService;
 
+    @Autowired
+    private CloudHostProper cloudHostProper;
+
     /**
      * 查询套餐订单
      *
@@ -319,9 +323,6 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         }
 
         if (param.getType()==1) {
-            if (StringUtils.isBlank(user.getMaOpenId()) && !CloudHostUtils.hasCloudHostName("弘德堂", "金牛明医", "木易华康", "北京存在文化")) {
-                return R.error("用户OPENID不存在");
-            }
 //            if (StringUtils.isBlank(user.getMaOpenId()) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
 //                return R.error("用户OPENID不存在");
 //            }
@@ -424,15 +425,16 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
                 payDelivery = new BigDecimal(0);
 
             } else if (param.getPayType().equals(2)) {
-                //代收
-//                payMoney = payPrice.multiply(new BigDecimal((100 - configDTO.getPayRate()))).divide(new BigDecimal(100));
-//                payMoney = new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
-//                payRemain = payPrice.subtract(payMoney);
-//                payDelivery = new BigDecimal(0);
-//                if (payRemain.compareTo(new BigDecimal(0)) == 0) {
-//                    throw new CustomException("代收金额应大于0");
-//                }
-                if (sysConfig.getRetainer() != null && sysConfig.getRate() != null && sysConfig.getRate().compareTo(new BigDecimal(0)) > 0) {
+                if (("益善缘".equals(cloudHostProper.getCompanyName()))){
+                    String key = redisCache.getCacheObject("createPackageOrderKey:" + param.getCreatePackageOrderKey());
+                    if (StringUtils.isEmpty(key)) {
+                        throw new CustomException("订单已过期", 501);
+                    }
+                    payMoney = redisCache.getCacheObject("createPackageOrderAmount:" + param.getCreatePackageOrderKey());
+                    if (payMoney == null) {
+                        payMoney = new BigDecimal(100);
+                    }
+                }else if (sysConfig.getRetainer() != null && sysConfig.getRate() != null && sysConfig.getRate().compareTo(new BigDecimal(0)) > 0) {
                     if (payPrice.compareTo(new BigDecimal(100)) < 0) {
                         throw new CustomException("订单金额应大于等于100");
                     }
@@ -484,34 +486,38 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             return R.error("非法用户操作");
         }
         FsPatient patient=null;
-        if(param.getPatientId()!=null){
-            patient=fsPatientMapper.selectFsPatientByPatientId(param.getPatientId());
-        }else {
-            return R.error("请提交患者信息");
-        }
-        logger.info("用户{}创建套餐订单,套餐id{},患者id{}",param.getUserId(),param.getPackageId(),param.getPatientId());
-
+        FsDoctor doctor=null;
         FsPackage fsPackage=fsPackageMapper.selectFsPackageByPackageId(param.getPackageId());
-        logger.info("是否是中药或者西药{},{}",fsPackage.getProductType(),fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2);
-        if (fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2) {
-            if (StringUtils.isEmpty(patient.getIdCard())) {
-                return R.error("请完善患者身份证信息");
+        if(fsPackage.getProductType()==1 || fsPackage.getProductType()==2){
+            if(param.getPatientId()!=null){
+                patient=fsPatientMapper.selectFsPatientByPatientId(param.getPatientId());
+                if (patient==null){
+                    return R.error("请提交患者信息");
+                }
+            }else {
+                return R.error("请提交患者信息");
+            }
+            logger.info("是否是中药或者西药{},{}",fsPackage.getProductType(),fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2);
+            if (fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2) {
+                if (StringUtils.isEmpty(patient.getIdCard())) {
+                    return R.error("请完善患者身份证信息");
+                }
+            }
+
+            if(param.getDoctorId()!=null){
+                doctor=doctorMapper.selectFsDoctorByDoctorId(param.getDoctorId());
+                if(doctor==null||doctor.getStatus().equals(0)){
+                    return R.error("此医生已停用");
+                }
+                Integer orderCount=inquiryOrderMapper.checkAcceptOrder(param.getDoctorId(),param.getUserId());
+                if(orderCount>0){
+                    return R.error("您正在咨询此医生,请先结束当前订单");
+                }
             }
         }
         if(fsPackage.getStatus().equals(0)){
             return R.error("套餐名已下架");
         }
-        FsDoctor doctor=null;
-        if(param.getDoctorId()!=null){
-            doctor=doctorMapper.selectFsDoctorByDoctorId(param.getDoctorId());
-            if(doctor==null||doctor.getStatus().equals(0)){
-                return R.error("此医生已停用");
-            }
-            Integer orderCount=inquiryOrderMapper.checkAcceptOrder(param.getDoctorId(),param.getUserId());
-            if(orderCount>0){
-                return R.error("您正在咨询此医生,请先结束当前订单");
-            }
-        }
         //私域下套餐包(可覆盖医生信息 使用销售绑定的医生信息)
         if (fsPackage.getIsShow()==0){
             if (param.getCompanyId()==null||param.getCompanyUserId()==null){
@@ -536,14 +542,13 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
                 return R.error("超过限购次数");
             }
         }
-        if (patient==null){
-            return R.error("请提交患者信息");
-        }
+
         FsPackageOrder  order=new FsPackageOrder();
         String orderSn =  OrderCodeUtils.getOrderSn();
         if(StringUtils.isEmpty(orderSn)){
             return R.error("订单生成失败,请重试");
         }
+        order.setPayType(param.getPayType());
         order.setOrderSn(orderSn);
         order.setStoreId(fsPackage.getStoreId());
         order.setUserId(param.getUserId());
@@ -680,6 +685,12 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             userCoupon.setStatus(1);
             userCouponService.updateFsUserCoupon(userCoupon);
         }
+        if (StringUtils.isNotEmpty(param.getCreatePackageOrderKey())) {
+            redisCache.deleteObject("createPackageOrderKey:" + param.getCreatePackageOrderKey());
+            redisCache.deleteObject("createPackageOrderPayType:" + param.getCreatePackageOrderKey());
+            redisCache.deleteObject("createPackageOrderAmount:" + param.getCreatePackageOrderKey());
+            redisCache.deleteObject("createPackageOrderMoney:" + param.getCreatePackageOrderKey());
+        }
 
         return R.ok();
 
@@ -1739,4 +1750,72 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             return R.error("微信接口调用失败: " + e.getMessage());
         }
     }
+
+    @Override
+    public R createPackageOrder(CompanyUser companyUser, Long packageId) {
+        FsPackage fsPackage=fsPackageMapper.selectFsPackageByPackageId(packageId);
+        if(fsPackage==null){
+            return R.error("套餐不存在");
+        }
+        if(fsPackage.getStatus()!=1){
+            return R.error("套餐不可用");
+        }
+
+        String uuid = IdUtil.randomUUID();
+        redisCache.setCacheObject("createPackageOrderKey:" + uuid, companyUser.getCompanyId() + "-" + companyUser.getUserId(), 24, TimeUnit.HOURS);
+        redisCache.setCacheObject("package:" + uuid, fsPackage, 24, TimeUnit.HOURS);
+        BigDecimal price = fsPackage.getTotalPrice();
+        if (price == null){
+            price = BigDecimal.ZERO;
+        }
+        redisCache.setCacheObject("createPackageOrderMoney:" + uuid,price,24,TimeUnit.HOURS);
+        return R.ok().put("packageOrderKey", uuid).put("price", price);
+    }
+
+    @Override
+    public R updatePackageOrderMoney(String createPackageOrderKey, BigDecimal money, BigDecimal payAmount, Integer payType) {
+        if (money == null) {
+            return R.error("请输入应付价格");
+        }
+        if (payType != null && payType != 1) {
+            if (payAmount == null) {
+                return R.error("请输入代收金额");
+            }
+            if (payAmount.compareTo(new BigDecimal(100)) < 0) {
+                throw new CustomException("物流代收金额应大于等于100");
+            }
+        }
+        String key = redisCache.getCacheObject("createPackageOrderKey:" + createPackageOrderKey);
+        if (StringUtils.isEmpty(key)) {
+            throw new CustomException("订单已过期", 501);
+        }
+        FsPackage fsPackage = redisCache.getCacheObject("package:"+createPackageOrderKey);
+        BigDecimal totalMoney = BigDecimal.ZERO;
+        if (fsPackage != null && fsPackage.getTotalPrice() != null) {
+            totalMoney = fsPackage.getTotalPrice();
+        }
+        logger.info("商品总价===========>{}",totalMoney);
+        if (money.compareTo(totalMoney) == 1) {
+            throw new CustomException("价格不能大于套餐包总价", 501);
+        }
+        redisCache.setCacheObject("createPackageOrderMoney:" + createPackageOrderKey, money, 24, TimeUnit.HOURS);
+        redisCache.setCacheObject("createPackageOrderAmount:" + createPackageOrderKey, payAmount, 24, TimeUnit.HOURS);//物流代收自定义金额
+        redisCache.setCacheObject("createPackageOrderPayType:" + createPackageOrderKey, payType, 24, TimeUnit.HOURS);//支付类型 1-全付款 2-物流代收(货到付款)
+        return R.ok();
+    }
+
+    @Override
+    public R getPackageOrder(String createPackageOrderKey) {
+        String key = redisCache.getCacheObject("createPackageOrderKey:" + createPackageOrderKey);
+        if (StringUtils.isEmpty(key)) {
+            throw new CustomException("套餐包订单已过期", 501);
+        }
+        FsPackage fsPackage = redisCache.getCacheObject("package:" + createPackageOrderKey);
+        BigDecimal money = redisCache.getCacheObject("createPackageOrderMoney:" + createPackageOrderKey);
+        Integer payType = redisCache.getCacheObject("createPackageOrderPayType:" + createPackageOrderKey);
+        if (payType != null && payType == 2) {
+            money = redisCache.getCacheObject("createPackageOrderAmount:" + createPackageOrderKey);
+        }
+        return R.ok().put("package", fsPackage).put("money", money).put("payType", payType);
+    }
 }

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

@@ -952,4 +952,18 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
             pen.drawString(value,x,y);
         }
     }
+
+    @Override
+    public List<FsPrescribeListDVO> selectFsPrescribeListDVOByCompanyUser(FsPrescribeListDCompanyParam param) {
+        List<FsPrescribeListDVO> list=fsPrescribeMapper.selectFsPrescribeListUVOByCompanyUser(param);
+        for(FsPrescribeListDVO vo:list){
+            FsPrescribeDrug map=new FsPrescribeDrug();
+            map.setPrescribeId(vo.getPrescribeId());
+            vo.setDrugs(fsPrescribeDrugMapper.selectFsPrescribeDrugList(map));
+        }
+        return list;
+
+
+    }
+
 }

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

@@ -50,6 +50,7 @@ import com.fs.hisStore.domain.FsStorePaymentScrm;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
 import com.fs.hisStore.param.FsStoreOrderRefundByProductParam;
+import com.fs.hisStore.service.IFsStoreOrderLogsScrmService;
 import com.fs.hisapi.domain.ApiResponse;
 import com.fs.hisapi.param.CreateOrderParam;
 import com.fs.hisapi.param.RecipeDetailParam;
@@ -824,25 +825,21 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
 
     @Override
     public R createOrderByPackageOrder(FsPackageOrder packageOrder) {
-        logger.info("111111111111111");
         if (packageOrder.getDoctorId() == null) {
             Long doctorID = iFsDoctorService.selectFsDoctorDoctorByPackage();
             packageOrder.setDoctorId(doctorID);
         }
-        logger.info("2222222222222");
         FsPackage fsPackage = fsPackageMapper.selectFsPackageByPackageId(packageOrder.getPackageId());
         JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
         List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
-        logger.info("3333333333333333333");
+
         Map<String, Object> packageJson = (Map) JSON.parse(packageOrder.getPackageJson());
-        logger.info("55555555555555555555");
         Integer packageSubType = (Integer) packageJson.get("packageSubType");
         if (packageSubType == 3) {
             inquiryOrderService.createOrderByPackageOrderStatus4(packageOrder);
         }
-        logger.info("4444444444444444444");
         Long prescribeId = fsPrescribeService.insertFsPrescribeByPackageOrder(packageOrder);
-        logger.info("66666666666666666");
+
         FsStoreOrder order = new FsStoreOrder();
         List<FsStoreOrderItem> items = new ArrayList<>();
         log.info("套餐包生成药品订单:{}", packageOrder.getOrderSn());
@@ -1374,7 +1371,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
 
         FsUser user = userService.selectFsUserByUserId(order.getUserId());
         Map<String, BigDecimal> data = new HashMap<>();
-        if (user != null ) {
+        if (user != null && StringUtils.isNotEmpty(user.getMaOpenId())) {
             if (param.getUserCouponId() != null && param.getUserCouponId() > 0l) {
                 FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(param.getUserCouponId());
                 if (userCoupon == null) {
@@ -3009,7 +3006,6 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                         o.setReqSeqId("store-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("药品订单支付");
-                        o.setAppId(param.getAppId());
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         FsStorePayment mt = new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
@@ -3129,7 +3125,6 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                         o.setReqSeqId("store-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("药品订单支付");
-                        o.setAppId(param.getAppId());
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         FsStorePayment mt = new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
@@ -3904,6 +3899,18 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                     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 = o.getStatus();
 
@@ -4108,5 +4115,293 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
     public FsStoreOrderAmountStatsVo selectFsStoreOrderAmountStats(FsStoreOrderAmountStatsQueryDto queryDto) {
         return fsStoreOrderMapper.selectFsStoreOrderAmountStats(queryDto);
     }
+    @Autowired
+    FsStoreOrderScrmMapper storeOrderScrmMapper;
+
+
+    @Autowired
+    IFsStoreOrderLogsScrmService iFsStoreOrderLogsScrmService;
+    @Override
+    public void deliveryOrderScrm(String orderCode, String deliveryId, String deliverCode, String deliverName) {
+        FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderScrmByOrderCode(orderCode);
+        if (order != null && order.getStatus() == 1) {
+            FsExpress express = expressService.selectFsExpressByOmsCode(deliverCode);
+            if (express != null) {
+                order.setDeliveryName(deliverName);
+                order.setDeliveryCode(express.getCode());
+            }
+            order.setStatus(2);
+            order.setDeliverySn(deliveryId);
+            order.setDeliverySendTime(DateUtils.getNowDate());
+            storeOrderScrmMapper.updateFsStoreOrder(order);
+            iFsStoreOrderLogsScrmService.create(order.getId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+            if (order.getCompanyId() != null && order.getCompanyId() > 0) {
+                companyService.subtractCompanyMoneyScrm(order);
+            }
+
+            FsStore store = fsStoreMapper.selectFsStoreByStoreId(order.getStoreId());
+            //订阅物流回调
+            String lastFourNumber = "";
+            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+                if (store != null && store.getSendPhone() != null) {
+                    lastFourNumber = store.getSendPhone();
+                } else {
+                    lastFourNumber = order.getUserPhone();
+                }
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+            expressService.subscribeEspress(order.getOrderCode(), order.getDeliveryCode(), order.getDeliverySn(), lastFourNumber);
+
+
+        }
+
+    }
+
+    @Override
+    public FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String soId) {
+        return fsStoreOrderMapper.selectFsStoreOrderScrmByOrderCode(soId);
+    }
+    @Override
+    public FsStoreOrder confirmOrder(FsPackageOrder packageOrder, Long doctorId) {
+
+        FsPackage fsPackage = fsPackageMapper.selectFsPackageByPackageId(packageOrder.getPackageId());
+        JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
+        List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
+        Map<String, Object> packageJson = (Map) JSON.parse(packageOrder.getPackageJson());
+        Integer packageSubType = (Integer) packageJson.get("packageSubType");
+        Integer productType = (Integer) packageJson.get("productType");
+        FsStoreOrder order = new FsStoreOrder();
+        Long prescribeId =null;
+        if (productType==1 || packageSubType==2){
+            if (packageOrder.getDoctorId() == null) {
+                Long doctorID = iFsDoctorService.selectFsDoctorDoctorByPackage();
+                packageOrder.setDoctorId(doctorID);
+            }
+            if (packageSubType == 3 ) {
+                inquiryOrderService.createOrderByPackageOrderStatus4(packageOrder);
+            }
+            prescribeId = fsPrescribeService.insertFsPrescribeByPackageOrder(packageOrder);
+            order.setPrescribeId(prescribeId);
+        }
+
+
+        List<FsStoreOrderItem> items = new ArrayList<>();
+        log.info("套餐包生成药品订单:{}", packageOrder.getOrderSn());
+        order.setOrderCode(packageOrder.getOrderSn());
+        order.setUserId(packageOrder.getUserId());
+        order.setStoreId(fsPackage.getStoreId());
+
+        order.setStatus(1);
+        order.setPayDelivery(packageOrder.getPayDelivery());
+        order.setPayRemain(packageOrder.getPayRemain());
+        order.setPayType(packageOrder.getPayType());
+        order.setPackageSecondName(packageOrder.getPackageSecondName());
+        order.setDoctorId(packageOrder.getDoctorId());
+
+        order.setPackageId(packageOrder.getPackageId());
+        order.setPackageName(packageOrder.getPackageName());
+        order.setPrescribePrice(packageOrder.getTotalPrice());
+        order.setDiscountMoney(packageOrder.getDiscountMoney());
+        order.setDeptId(packageOrder.getDeptId());
+        order.setCompanyId(packageOrder.getCompanyId());
+        order.setCompanyUserId(packageOrder.getCompanyUserId());
+        order.setPackageOrderId(packageOrder.getOrderId());
+        order.setCreateTime(new Date());
+        if (packageOrder.getSource() != null) {
+            order.setSource(packageOrder.getSource());
+        }
+        String addressJson = packageOrder.getAddressJson();
+        if (addressJson != null && addressJson != "") {
+            Map<String, String> parse = (Map) JSON.parse(addressJson);
+            order.setUserName(parse.get("userName"));
+            order.setUserPhone(parse.get("userPhone"));
+            order.setUserAddress(parse.get("userAddress"));
+        }
+
+
+        Long totalNum = 0L;
+        BigDecimal totalPrice = new BigDecimal(0);
+        boolean noTui = false;
+        for (FsPackagePruductDTO product : products) {
+            if (product.getBarCode().equals("106013")) {
+                noTui = true;
+            }
+            totalPrice = totalPrice.add(product.getPrice().multiply(BigDecimal.valueOf(product.getCount())));
+            totalNum = totalNum + product.getCount();
+            FsStoreOrderItem item = new FsStoreOrderItem();
+            item.setProductId(product.getProductId());
+            item.setStoreId(fsPackage.getStoreId());
+            item.setProductAttrValueId(product.getId());
+            item.setNum(Long.parseLong(product.getCount().toString()));
+            item.setIsDrug(product.getIsDrug());
+            FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
+            dto.setImage(product.getImage());
+            dto.setNum(Long.parseLong(product.getCount().toString()));
+            dto.setProductName(product.getProductName());
+            dto.setProductId(product.getProductId());
+            dto.setSku(product.getSku());
+            dto.setBarCode(product.getBarCode());
+            dto.setPrice(product.getPrice());
+            dto.setNum(Long.parseLong(product.getCount().toString()));
+            dto.setImage(product.getImage());
+            item.setIsPrescribe(0);
+            item.setJsonInfo(JSON.toJSONString(dto));
+            item.setIsGift(0);
+            items.add(item);
+        }
+        String json = configService.selectConfigByKey("his.package");
+        PackageConfigDTO configDTO = JSONUtil.toBean(json, PackageConfigDTO.class);
+        FsPackageOrder fsPackageOrder = new FsPackageOrder();
+        //赠品处理
+        if (configDTO.getGiftStoreId() != null && configDTO.getGiftStoreId() == packageOrder.getStoreId() && packageOrder.getCompanyId() != null && packageOrder.getCompanyId() > 0 && packageOrder.getPayType().equals(1) && packageOrder.getPayMoney().compareTo(configDTO.getGiftPrice()) >= 0) {
+            if (configDTO.getGift() != null && !configDTO.getGift().isEmpty()) {
+                for (StoreOrderProductDTO product : configDTO.getGift()) {
+                    totalNum = totalNum + product.getCount();
+                    FsStoreOrderItem item = new FsStoreOrderItem();
+                    item.setProductId(product.getProductId());
+                    item.setStoreId(fsPackage.getStoreId());
+                    item.setProductAttrValueId(product.getId());
+                    item.setNum(Long.parseLong(product.getCount().toString()));
+                    FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
+                    dto.setImage(product.getImage());
+                    dto.setNum(Long.parseLong(product.getCount().toString()));
+                    dto.setProductName(product.getProductName());
+                    dto.setProductId(product.getProductId());
+                    dto.setSku(product.getSku());
+                    dto.setBarCode(product.getBarCode());
+                    dto.setPrice(product.getPrice());
+                    if (product.getCount() != null) {
+                        dto.setNum(Long.parseLong(product.getCount().toString()));
+                    }
+                    dto.setImage(product.getImage());
+                    item.setIsPrescribe(0);
+                    item.setJsonInfo(JSON.toJSONString(dto));
+                    item.setIsGift(1);
+                    items.add(item);
+                    fsPackageOrder.setProductCostPrice(packageOrder.getProductCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setTotalCostPrice(packageOrder.getTotalCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setCostDiscountMoney(packageOrder.getCostDiscountMoney().subtract(product.getCostPrice()));
+                }
+            }
+        }
+        //物流代收赠品
+        if (configDTO.getGiftStoreId() != null && configDTO.getGiftStoreId() == packageOrder.getStoreId() && packageOrder.getCompanyId() != null && packageOrder.getCompanyId() > 0 && packageOrder.getPayType().equals(2) && packageOrder.getPayPrice().compareTo(configDTO.getGiftPrice()) >= 0) {
+            if (configDTO.getDeliveryGift() != null && !configDTO.getDeliveryGift().isEmpty()) {
+                for (StoreOrderProductDTO product : configDTO.getDeliveryGift()) {
+                    totalNum = totalNum + product.getCount();
+                    FsStoreOrderItem item = new FsStoreOrderItem();
+                    item.setProductId(product.getProductId());
+                    item.setStoreId(fsPackage.getStoreId());
+                    item.setProductAttrValueId(product.getId());
+                    item.setNum(Long.parseLong(product.getCount().toString()));
+                    FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
+                    dto.setImage(product.getImage());
+                    dto.setNum(Long.parseLong(product.getCount().toString()));
+                    dto.setProductName(product.getProductName());
+                    dto.setProductId(product.getProductId());
+                    dto.setSku(product.getSku());
+                    dto.setBarCode(product.getBarCode());
+                    dto.setPrice(product.getPrice());
+                    if (product.getCount() != null) {
+                        dto.setNum(Long.parseLong(product.getCount().toString()));
+                    }
+                    dto.setImage(product.getImage());
+                    item.setIsPrescribe(0);
+                    item.setJsonInfo(JSON.toJSONString(dto));
+                    item.setIsGift(1);
+                    items.add(item);
+                    fsPackageOrder.setProductCostPrice(packageOrder.getProductCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setTotalCostPrice(packageOrder.getTotalCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setCostDiscountMoney(packageOrder.getCostDiscountMoney().subtract(product.getCostPrice()));
+                }
+            }
+        }
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.store");
+        Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
+        Integer followRate = (Integer) config.get("followRate");
+        Long followDoctorId = fsPackageOrderMapper.selectFsPackageOrderByUserId(order.getUserId());
+        if (followDoctorId != null && followDoctorId > 0) {
+            order.setFollowDoctorId(followDoctorId);
+        } else {
+            if (packageOrder.getCompanyId() != null) {
+                Company company = companyService.selectCompanyById(packageOrder.getCompanyId());
+                if (company != null) {
+                    String followDoctorIdsJson = company.getFollowDoctorIds();
+                    if (followDoctorIdsJson != null && followDoctorIdsJson != "") {
+                        long[] ids = JSON.parseObject(followDoctorIdsJson, long[].class);
+                        if (ids.length > 0) {
+                            Random random = new Random();
+                            // 从数组中随机选择一个数字
+                            int randomIndex = random.nextInt(ids.length);
+                            long randomId = ids[randomIndex];
+                            order.setFollowDoctorId(randomId);
+                        }
+                    }
+                }
+            }
+            if (order.getFollowDoctorId() == null) {
+                order.setFollowDoctorId(iFsDoctorService.selectFollowDoctorDoctorByPackage());
+            }
+        }
+
+        order.setOrderType(fsPackage.getProductType());
+        order.setTotalNum(totalNum);
+        order.setTotalPrice(totalPrice);
+        order.setPayPrice(packageOrder.getPayPrice());
+        order.setPayMoney(packageOrder.getPayMoney());
+        order.setIsPay(0);
+        order.setItemJson(JSONUtil.toJsonStr(items));
+
+        if (packageOrder.getCycle() >= followRate) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.add(Calendar.DAY_OF_MONTH, followRate);
+            order.setFollowTime(calendar.getTime());
+            order.setCycle(packageOrder.getCycle());
+            Calendar calendar2 = Calendar.getInstance();
+            calendar2.setTime(new Date());
+            calendar2.add(Calendar.DAY_OF_MONTH, 30 + packageOrder.getCycle());
+            order.setFollowEndTime(calendar2.getTime());
+            order.setFollowStatus(0);
+        }
+        if (fsStoreOrderMapper.insertFsStoreOrder(order) > 0) {
+
+            if (order.getOrderId() == null) {
+                throw new CustomException("订单id为空" + order);
+            }
+            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.CREATE_ORDER.getValue(),
+                    FsStoreOrderLogEnum.CREATE_ORDER.getDesc());
+            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.UN_PAY_ORDER.getValue(),
+                    FsStoreOrderLogEnum.UN_PAY_ORDER.getDesc());
+
+            if (prescribeId != null) {
+                FsPrescribe fsPrescribe = new FsPrescribe();
+                fsPrescribe.setPrescribeId(prescribeId);
+                fsPrescribe.setStoreOrderId(order.getOrderId());
+                fsPrescribeService.updateFsPrescribe(fsPrescribe);
+            }
+
+            for (FsStoreOrderItem item : items) {
+                item.setOrderId(order.getOrderId());
+                fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
+            }
+            if (noTui) {
+                FsStoreOrder fsStoreOrder = new FsStoreOrder();
+                fsStoreOrder.setOrderId(order.getOrderId());
+                fsStoreOrder.setExtendOrderId("XN");
+                fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
+            }
+            FsUser fsUser = fsUserService.selectFsUserByUserId(order.getUserId());
+            if (fsUser.getIsBuy() == null || fsUser.getIsBuy() == 0) {
+                FsUser u = new FsUser();
+                u.setUserId(order.getUserId());
+                u.setIsBuy(1);
+                fsUserService.updateFsUser(u);
+            }
+        }
+        return order;
+    }
 
 }

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

@@ -1454,15 +1454,13 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         }
         byte[] file;
         try {
-            file = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes(
-                    scene,
-                    "pages_user/user/pay",
-                    true,
+            file = wxMaService.getQrcodeService().createWxaCodeBytes(
+                    "pages_user/user/pay?companyId="+param.getCompanyId(),
                     "release",
                     430,
                     true,
                     null,
-                    false);
+                    true);
 
             // 上传图片到存储桶
             String suffix = ".png";
@@ -1654,7 +1652,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         storePayment.setPayMoney(param.getPayMoney());
         storePayment.setCreateTime(new Date());
         storePayment.setPayTypeCode("weixin");
-        storePayment.setBusinessType(1);
+        storePayment.setBusinessType(7);//微信收款
         storePayment.setRemark("商城收款订单支付");
         storePayment.setOpenId(openId);
         storePayment.setUserId(user.getUserId());

Некоторые файлы не были показаны из-за большого количества измененных файлов