Przeglądaj źródła

Merge remote-tracking branch 'origin/openIm' into openIm

15376779826 2 dni temu
rodzic
commit
bc815bd260
100 zmienionych plików z 2178 dodań i 159 usunięć
  1. 4 0
      fs-admin/pom.xml
  2. 2 2
      fs-admin/src/main/java/com/fs/his/controller/FsInquiryOrderController.java
  3. 4 0
      fs-admin/src/main/java/com/fs/his/controller/FsUserAddressController.java
  4. 7 24
      fs-admin/src/main/java/com/fs/his/controller/FsUserController.java
  5. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  6. 2 2
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  7. 29 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java
  8. 37 4
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  9. 79 4
      fs-admin/src/main/java/com/fs/web/controller/common/CommonController.java
  10. 103 0
      fs-admin/src/test/java/com/fs/course/controller/OpenIMServiceTest.java
  11. 2 2
      fs-common-api/src/main/resources/application.yml
  12. 7 0
      fs-common/src/main/java/com/fs/common/enums/ImTypeEnum.java
  13. 8 0
      fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  14. 1 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java
  15. 107 12
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  16. 4 0
      fs-company-app/src/main/java/com/fs/core/config/RedisConfig.java
  17. 2 2
      fs-company-app/src/main/resources/application.yml
  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. 71 0
      fs-company/src/main/java/com/fs/company/controller/store/FsPrescribeController.java
  23. 1 1
      fs-company/src/main/java/com/fs/framework/config/SecurityConfig.java
  24. 26 0
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  25. 19 6
      fs-doctor-app/src/main/java/com/fs/app/controller/CommonController.java
  26. 5 0
      fs-doctor-app/src/main/java/com/fs/app/controller/DiagnosisController.java
  27. 8 3
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java
  28. 24 6
      fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java
  29. 50 11
      fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  30. 108 6
      fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java
  31. 18 2
      fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java
  32. 2 2
      fs-doctor-app/src/main/resources/mybatis/mybatis-config.xml
  33. 1 1
      fs-ipad-task/src/main/resources/application.yml
  34. 1 1
      fs-qwhook-sop/src/main/resources/application.yml
  35. 1 1
      fs-qwhook/src/main/resources/application.yml
  36. 4 2
      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. 2 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseWatchLog.java
  39. 33 0
      fs-service/src/main/java/com/fs/course/dto/BatchSendCourseAllDTO.java
  40. 81 0
      fs-service/src/main/java/com/fs/course/dto/BatchSendCourseDTO.java
  41. 32 0
      fs-service/src/main/java/com/fs/course/dto/BatchUrgeCourseDTO.java
  42. 4 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  43. 2 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java
  44. 9 0
      fs-service/src/main/java/com/fs/course/param/DiagnosisConfirmParam.java
  45. 1 1
      fs-service/src/main/java/com/fs/course/param/FsCourseSendRewardUParam.java
  46. 5 3
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  47. 1 1
      fs-service/src/main/java/com/fs/course/param/FsUserCourseOrderDoPayParam.java
  48. 31 0
      fs-service/src/main/java/com/fs/course/param/newfs/FsCourseWatchAppParam.java
  49. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseProductOrderServiceImpl.java
  50. 4 3
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java
  51. 6 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  52. 3 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserVipOrderServiceImpl.java
  53. 5 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java
  54. 52 0
      fs-service/src/main/java/com/fs/course/vo/newfs/FsImSendLogVO.java
  55. 1 0
      fs-service/src/main/java/com/fs/erp/dto/ErpRefundUpdateRequest.java
  56. 10 0
      fs-service/src/main/java/com/fs/erp/dto/OrderItemDTO.java
  57. 1 1
      fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java
  58. 110 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushScrmMapper.java
  59. 77 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushScrmMapper.java
  60. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushScrmService.java
  61. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstCodPushScrmService.java
  62. 3 0
      fs-service/src/main/java/com/fs/erp/service/IErpGoodsService.java
  63. 1 1
      fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java
  64. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  65. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java
  66. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java
  67. 176 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushScrmServiceImpl.java
  68. 13 9
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java
  69. 55 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushScrmServiceImpl.java
  70. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpGoodsServiceImpl.java
  71. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java
  72. 93 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java
  73. 144 20
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  74. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java
  75. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9StockScrmServiceImpl.java
  76. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java
  77. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  78. 1 0
      fs-service/src/main/java/com/fs/gtPush/service/impl/uniPush2ServiceImpl.java
  79. 7 0
      fs-service/src/main/java/com/fs/his/config/FsSysConfig.java
  80. 1 0
      fs-service/src/main/java/com/fs/his/domain/FsInquiryOrderMsg.java
  81. 1 0
      fs-service/src/main/java/com/fs/his/dto/InquiryConfigDTO.java
  82. 8 2
      fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java
  83. 1 0
      fs-service/src/main/java/com/fs/his/enums/FsStoreOrderLogEnum.java
  84. 1 0
      fs-service/src/main/java/com/fs/his/mapper/FsFirstDiagnosisMapper.java
  85. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsHfpayConfigMapper.java
  86. 1 0
      fs-service/src/main/java/com/fs/his/mapper/FsInquiryOrderMapper.java
  87. 1 1
      fs-service/src/main/java/com/fs/his/mapper/FsInquiryPatientInfoMapper.java
  88. 21 0
      fs-service/src/main/java/com/fs/his/mapper/FsPrescribeMapper.java
  89. 9 1
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  90. 5 0
      fs-service/src/main/java/com/fs/his/param/FsDiagnosisListDParam.java
  91. 1 1
      fs-service/src/main/java/com/fs/his/param/FsInquiryOrderPayParam.java
  92. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderComputeParam.java
  93. 2 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderCreateParam.java
  94. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderDoPayParam.java
  95. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderPayParam.java
  96. 27 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListDCompanyParam.java
  97. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListDParam.java
  98. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListUParam.java
  99. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeParam.java
  100. 2 1
      fs-service/src/main/java/com/fs/his/service/IFsFirstDiagnosisService.java

+ 4 - 0
fs-admin/pom.xml

@@ -94,6 +94,10 @@
             <artifactId>clickhouse-jdbc</artifactId>
             <version>0.4.6</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 2 - 2
fs-admin/src/main/java/com/fs/his/controller/FsInquiryOrderController.java

@@ -1,6 +1,7 @@
 package com.fs.his.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.controller.BaseController;
@@ -155,8 +156,7 @@ public class FsInquiryOrderController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('his:inquiryOrder:sendMsg')")
     @GetMapping(value = "/sendMsg/{orderId}")
-    public AjaxResult sendMsg(@PathVariable("orderId") Long orderId)
-    {
+    public AjaxResult sendMsg(@PathVariable("orderId") Long orderId) throws JsonProcessingException {
 
         return AjaxResult.success(fsInquiryOrderService.sendStartMsg(orderId));
     }

+ 4 - 0
fs-admin/src/main/java/com/fs/his/controller/FsUserAddressController.java

@@ -99,6 +99,10 @@ public class FsUserAddressController extends BaseController
         String kdnAddress = fsUserAddressService.getKdnAddress(address);
         AddressInfoDTO addressInfoDTO = JSON.parseObject(kdnAddress, AddressInfoDTO.class);
         AddressInfoDTO.AddressData data = addressInfoDTO.getData();
+        logger.info("快递鸟返回:"+kdnAddress);
+        if (data==null){
+            return AjaxResult.error("解析地址失败请输入正确地址");
+        }
         String provinceName = data.getProvinceName();
         if (!provinceName.contains("省") && !provinceName.contains("区")){
             data.setProvinceName(data.getProvinceName()+"市");

+ 7 - 24
fs-admin/src/main/java/com/fs/his/controller/FsUserController.java

@@ -4,7 +4,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.domain.entity.SysRole;
@@ -13,9 +13,10 @@ import com.fs.common.exception.CustomException;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
-import com.fs.course.domain.FsUserWatchStatistics;
-import com.fs.course.mapper.FsUserWatchStatisticsMapper;
+import com.fs.course.dto.BatchSendCourseDTO;
+import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.service.IFsUserCompanyUserService;
+import com.fs.course.service.IFsUserCourseService;
 import com.fs.his.domain.FsUserAddress;
 import com.fs.his.enums.FsUserIntegralLogTypeEnum;
 import com.fs.his.mapper.FsUserMapper;
@@ -27,6 +28,8 @@ import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsUserExportListVO;
 import com.fs.his.vo.FsUserVO;
 import com.fs.his.vo.UserVo;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
 import com.fs.qw.dto.UserProjectDTO;
 import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.vo.h5.FsUserPageListVO;
@@ -39,6 +42,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -384,26 +388,5 @@ public class FsUserController extends BaseController
         return userIntegralLogsService.addIntegralTemplate(integralTemplateParam);
     }
 
-//    @PutMapping("/encryptPhoneTemp")
-//    @ApiOperation("临时接口")
-//    public void encryptPhoneTemp(){
-//        FsUser fsUser = new FsUser();
-//        List<FsUser> list = fsUserService.selectFsUserList(fsUser);
-//        List<FsUser> fsUserList = list.stream().peek(v -> v.setPhone(encryptPhone(v.getPhone()))).collect(Collectors.toList());
-//
-//        // 分批次处理,一次提交500条
-//        List<List<FsUser>> batches = Lists.partition(fsUserList, 500);
-//        batches.forEach(batch -> {
-//            SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
-//            try {
-//                FsUserMapper mapper = sqlSession.getMapper(FsUserMapper.class);
-//                batch.forEach(mapper::updateFsUser);
-//                sqlSession.commit();
-//            } finally {
-//                sqlSession.close();
-//            }
-//        });
-//
-//    }
 
 }

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

@@ -61,7 +61,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
     /**
      * 查询健康商城订单列表
      */
-    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:list')")
+//    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:list')")
     @GetMapping("/healthList")
     public TableDataInfo healthStoreList(FsStoreOrderParam param) {
         startPage();

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

@@ -541,7 +541,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){
@@ -632,7 +632,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);
     }
 

+ 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;
     /**
      * 查询支付明细列表
      */
@@ -179,10 +190,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()
     {

+ 79 - 4
fs-admin/src/main/java/com/fs/web/controller/common/CommonController.java

@@ -3,16 +3,15 @@ package com.fs.web.controller.common;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.file.OssException;
-import com.fs.course.service.IHuaweiObsService;
-import com.fs.course.service.IHuaweiVodService;
+import com.fs.course.dto.BatchSendCourseAllDTO;;
 import com.fs.course.service.ITencentCloudCosService;
-import com.fs.course.service.impl.HuaweiObsServiceImpl;
 import com.fs.framework.config.ServerConfig;
 import com.fs.his.domain.FsExportTask;
 import com.fs.his.service.IFsExportTaskService;
+import com.fs.im.service.OpenIMService;
 import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
 
@@ -22,6 +21,7 @@ import com.huaweicloud.sdk.vod.v1.model.BaseInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -36,6 +36,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 import static com.fs.course.service.impl.HuaweiObsServiceImpl.fileUrlMap;
 import static com.fs.course.service.impl.HuaweiObsServiceImpl.uploadProgress;
@@ -60,6 +61,17 @@ public class CommonController
     private ITencentCloudCosService tencentCloudCosService;
     @Autowired
     private IFsExportTaskService exportTaskService;
+
+    @Autowired
+    private OpenIMService openIMService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
     @GetMapping(value = "common/getTask/{taskId}")
     public R getTask(@PathVariable("taskId") Long taskId)
     {
@@ -227,7 +239,70 @@ public class CommonController
         return tencentCloudCosService.getKeyAndCredentials();
     }
 
+    /**
+     * 测试接口
+     */
+    @PostMapping("/common/im/testTask/course")
+    public void testIMCourseTask(){
+        String redisKey = "openIm:batchSendMsg:sendCourse";
+        Map<String, BatchSendCourseAllDTO> cacheMap = redisCache.getCacheMap(redisKey);
+        if(cacheMap == null || cacheMap.isEmpty()){
+            logger.info("=====================会员IM定时发课,不存在对应的redisKey==================");
+            return;
+        }
+        List<Map.Entry<String, BatchSendCourseAllDTO>> toSendMap = cacheMap.entrySet().parallelStream().filter((v) -> {
+            String[] split = v.getKey().split(":");
+            long timestamp = Long.parseLong(split[2]);
+            return timestamp < System.currentTimeMillis();
+        }).collect(Collectors.toList());
 
+        if(toSendMap.isEmpty()){
+            logger.info("=====================会员IM定时发课,不存在可执行的发课任务==================");
+            return;
+        }
+        for (Map.Entry<String, BatchSendCourseAllDTO> entry : toSendMap) {
+            //执行发送消息任务
+            BatchSendCourseAllDTO batchSendCourseAllDTO = entry.getValue();
+            openIMService.batchSendCourseTask(batchSendCourseAllDTO.getBatchSendCourseDTO(), batchSendCourseAllDTO.getOpenImBatchMsgDTO(), batchSendCourseAllDTO.getProject(), batchSendCourseAllDTO.getImMsgSendDetailList());
+
+            // 执行结束,删除
+            this.redisTemplate.<String, BatchSendCourseAllDTO>opsForHash().delete(redisKey, entry.getKey());
 
+        }
+
+    }
+
+    /**
+     * 测试接口
+     */
+    @PostMapping("/common/im/testTask/urge")
+    public void testIMUrgeTask(){
+        String redisKey = "openIm:batchSendMsg:urgeCourse";
+        Map<String, BatchSendCourseAllDTO> cacheMap = redisCache.getCacheMap(redisKey);
+        if(cacheMap == null || cacheMap.isEmpty()){
+            logger.info("===================== 会员-IM发消息催课,不存在对应的redisKey==================");
+            return;
+        }
+        List<Map.Entry<String, BatchSendCourseAllDTO>> toSendMap = cacheMap.entrySet().parallelStream().filter((v) -> {
+            String[] split = v.getKey().split(":");
+            long timestamp = Long.parseLong(split[2]);
+            return timestamp < System.currentTimeMillis();
+        }).collect(Collectors.toList());
+
+        if(toSendMap.isEmpty()){
+            logger.info("===================== 会员-IM发消息催课,不存在可发送的消息==================");
+            return;
+        }
+        for (Map.Entry<String, BatchSendCourseAllDTO> entry : toSendMap) {
+            //执行发送消息任务
+            BatchSendCourseAllDTO batchSendCourseAllDTO = entry.getValue();
+            openIMService.batchUrgeCourseTask(batchSendCourseAllDTO.getOpenImBatchMsgDTO(), batchSendCourseAllDTO.getImMsgSendDetailList());
+
+            // 执行结束,删除
+            this.redisTemplate.<String, BatchSendCourseAllDTO>opsForHash().delete(redisKey, entry.getKey());
+
+        }
+
+    }
 
 }

+ 103 - 0
fs-admin/src/test/java/com/fs/course/controller/OpenIMServiceTest.java

@@ -0,0 +1,103 @@
+package com.fs.course.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fs.FSApplication;
+import com.fs.common.annotation.DataSource;
+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.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.test.context.ActiveProfiles;
+
+import static org.junit.Assert.assertNotNull;
+
+@Slf4j
+@ActiveProfiles("druid-fby-test")
+@RunWith(org.springframework.test.context.junit4.SpringRunner.class)
+@SpringBootTest(classes = FSApplication.class)
+public class OpenIMServiceTest {
+
+    @Autowired
+    private OpenIMService openIMService;
+    @Test
+    public void openIMSendMsg() {
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setSendID("fbyC8584");
+        openImMsgDTO.setRecvID("fbyU1077739");
+//        openImMsgDTO.setGroupID("group789");
+        openImMsgDTO.setSenderNickname("测试用户");
+        openImMsgDTO.setSenderFaceURL("https://example.com/avatar.jpg");
+        openImMsgDTO.setSenderPlatformID(1);
+        openImMsgDTO.setContentType(101);
+        openImMsgDTO.setSessionType(1);
+        openImMsgDTO.setOnlineOnly(false);
+        openImMsgDTO.setNotOfflinePush(false);
+        openImMsgDTO.setSendTime(System.currentTimeMillis());
+        openImMsgDTO.setEx("额外信息");
+
+        // Content
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        content.setContent("Hello World");
+        content.setData("test data");
+        content.setDescription("测试消息");
+        content.setExtension("ext");
+        openImMsgDTO.setContent(content);
+
+        // OfflinePushInfo
+        OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+        offlinePushInfo.setTitle("新消息");
+        offlinePushInfo.setDesc("您收到一条新消息");
+        offlinePushInfo.setEx("push ex");
+        offlinePushInfo.setIOSPushSound("default");
+        offlinePushInfo.setIOSBadgeCount(true);
+        openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+
+        // 调用方法
+        OpenImResponseDTO result = openIMService.openIMSendMsg(openImMsgDTO);
+
+        // 断言
+        assertNotNull(result);
+    }
+
+    @Test
+    public void aiAutoReply() {
+    }
+
+    @Test
+    public void sendUtil() {
+    }
+
+    @Test
+    public void sendUtilUserToDoctor() {
+    }
+
+    @Test
+    public void editConversation() {
+    }
+
+    @Test
+    public void sendCourse() throws JsonProcessingException {
+        Long userId = 1077739L;
+        Long companyUserId = 8584L;
+        String url = "https://example.com/course/123";
+        String title = "Java编程基础课程";
+        String linkImageUrl = "https://example.com/images/course-cover.jpg";
+        String cropId = "crop_123456";
+
+        OpenImResponseDTO actualResponse = openIMService.sendCourse(
+                userId, companyUserId, url, title, linkImageUrl, cropId
+        );
+        log.info("返回结果: {}",actualResponse);
+    }
+
+    @Test
+    public void sendPackageUtil() {
+    }
+}

+ 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

+ 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 - 0
fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -394,4 +394,12 @@ 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);
+    }
+
 }

+ 1 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -90,6 +90,7 @@ public class FsUserController extends AppBaseController {
         log.debug("用户会员分页列表 param: {}", JSON.toJSONString(param));
         param.setUserId(Long.parseLong(getUserId()));
 //        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        param.setIsHidePhoneMiddle(false);
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
 //        PageInfo<FsUserPageListVO> pageInfo = new PageInfo<>(list);
         return ResponseResult.ok(fsUserPageListVOPageInfo);

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

@@ -1,27 +1,36 @@
 package com.fs.app.controller;
 
+import cn.hutool.core.date.DateUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.app.annotation.Login;
 import com.fs.app.config.ImageStorageConfig;
+import com.fs.common.annotation.Log;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
+import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.course.domain.FsUserCoursePeriod;
+import com.fs.course.dto.BatchSendCourseDTO;
+import com.fs.course.dto.BatchUrgeCourseDTO;
 import com.fs.course.param.FsCourseLinkCreateParam;
+import com.fs.course.param.FsCourseWatchLogListParam;
 import com.fs.course.param.FsWatchCourseTimeParam;
 import com.fs.course.param.newfs.FsCourseSortLinkParam;
+import com.fs.course.param.newfs.FsCourseWatchAppParam;
 import com.fs.course.param.newfs.FsUserCourseListParam;
 import com.fs.course.param.newfs.UserCourseVideoPageParam;
-import com.fs.course.service.IFsCourseLinkService;
-import com.fs.course.service.IFsUserCoursePeriodService;
-import com.fs.course.service.IFsUserCourseService;
-import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.course.service.*;
+import com.fs.course.vo.FsCourseWatchLogListVO;
 import com.fs.course.vo.FsUserCourseParticipationRecordVO;
-import com.fs.course.vo.newfs.FsUserCourseListVO;
-import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
-import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
-import com.fs.course.vo.newfs.FsUserVideoListVO;
+import com.fs.course.vo.newfs.*;
+import com.fs.im.domain.FsImMsgSendLog;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.IFsImMsgSendDetailService;
+import com.fs.im.service.IFsImMsgSendLogService;
+import com.fs.im.service.OpenIMService;
+import com.fs.im.vo.FsImMsgSendLogVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -32,10 +41,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -62,6 +68,15 @@ public class FsUserCourseVideoController extends AppBaseController {
     @Autowired
     private ICompanyUserService companyUserService;
 
+    @Autowired
+    private IFsCourseWatchLogService fsCourseWatchLogService;
+
+    @Autowired
+    private OpenIMService openIMService;
+
+    @Autowired
+    private IFsImMsgSendLogService imMsgSendLogService;
+
     @Login
     @GetMapping("/pageList")
     @ApiOperation("课程分页列表")
@@ -253,4 +268,84 @@ public class FsUserCourseVideoController extends AppBaseController {
         return ResponseResult.ok(courseLinkService.getGotoWxAppLink(linkStr,appid));
     }
 
+    @ApiOperation("会员批量发送课程消息")
+    @PostMapping("/batchSendCourse")
+    public OpenImResponseDTO batchSendCourse(@RequestBody BatchSendCourseDTO batchSendCourseDTO) throws JsonProcessingException {
+        // 生成看课短链
+        FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+        BeanUtils.copyProperties(batchSendCourseDTO, fsCourseLinkCreateParam);
+        R courseSortLink = fsUserCourseService.createAppCourseSortLink(fsCourseLinkCreateParam);
+        String url = courseSortLink.get("url").toString();
+        batchSendCourseDTO.setUrl(url);
+
+        return openIMService.batchSendCourse(batchSendCourseDTO);
+    }
+
+    @ApiOperation("会员一键催课")
+    @PostMapping("/batchUrgeCourse")
+    public OpenImResponseDTO batchUrgeCourse(@RequestBody BatchUrgeCourseDTO batchUrgeCourseDTO) throws JsonProcessingException {
+        // 查询生成短链需要的内容
+        Map<String, Object> params = new HashMap<>();
+        params.put("logDetailIds", batchUrgeCourseDTO.getImMsgSendDetailId());
+        List<FsImMsgSendLog> fsImMsgSendLogs = imMsgSendLogService.selectSendLogListByDetailId(params);
+        OpenImResponseDTO openImResponseDTO = null;
+        for (FsImMsgSendLog fsImMsgSendLog : fsImMsgSendLogs) {
+            FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+            BeanUtils.copyProperties(fsImMsgSendLog, fsCourseLinkCreateParam);
+            fsCourseLinkCreateParam.setId(fsImMsgSendLog.getPeriodDaysId());
+            R courseSortLink = fsUserCourseService.createAppCourseSortLink(fsCourseLinkCreateParam);
+            String url = courseSortLink.get("url").toString();
+            openImResponseDTO = openIMService.batchUrgeCourse(batchUrgeCourseDTO, fsImMsgSendLog, url);
+        }
+        return openImResponseDTO;
+    }
+
+    @Login
+    @ApiOperation("app-看课记录(包含今日完课、今日催课)")
+    @GetMapping("/courseWatchLog")
+    public ResponseResult<PageInfo<FsCourseWatchLogListVO>> getCourseWatchLog(FsCourseWatchAppParam fsCourseWatchAppParam)
+    {
+        FsCourseWatchLogListParam param = new FsCourseWatchLogListParam();
+        BeanUtils.copyProperties(fsCourseWatchAppParam, param);
+        param.setCompanyUserId(Long.parseLong(getUserId()));
+        param.setCompanyId(getCompanyId());
+        param.setSTime(DateUtil.beginOfDay(new Date()));
+        param.setETime(DateUtil.endOfDay(new Date()));
+//        startPage();
+        PageHelper.startPage(fsCourseWatchAppParam.getPageNum (), fsCourseWatchAppParam.getPageSize());
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
+        PageInfo<FsCourseWatchLogListVO> pageInfo = new PageInfo<>(list);
+        return ResponseResult.ok(pageInfo);
+    }
+
+    @Login
+    @ApiOperation("任务列表")
+    @GetMapping("/im/sendLog")
+    public ResponseResult<PageInfo<FsImSendLogVO>> imSendLog(@RequestParam(defaultValue = "1") Integer pageNum,
+                                                             @RequestParam(defaultValue = "10") Integer pageSize) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("companyId", getCompanyId());
+        params.put("companyUserId", Long.parseLong(getUserId()));
+
+        PageHelper.startPage(pageNum, pageSize);
+        List<FsImSendLogVO> list = imMsgSendLogService.selectFsImSendLogList(params);
+        PageInfo<FsImSendLogVO> pageInfo = new PageInfo<>(list);
+        return ResponseResult.ok(pageInfo);
+    }
+
+    @ApiOperation("任务详情")
+    @GetMapping("/im/sendLog/detail")
+    public ResponseResult<FsImMsgSendLogVO> imSendLogDetail(@RequestParam Long logId) {
+        FsImMsgSendLogVO fsImMsgSendLogVO = imMsgSendLogService.selectFsImMsgSendLogDetail(logId);
+        return ResponseResult.ok(fsImMsgSendLogVO);
+    }
+
+    @Login
+    @ApiOperation("删除任务")
+    @DeleteMapping("/im/sendLog")
+    @Log(title = "任务-删除任务", businessType = BusinessType.DELETE)
+    public ResponseResult<Boolean> deleteImSendLog(@RequestParam Long logId) {
+        return imMsgSendLogService.deleteFsImMsgSendLogAndDetail(logId);
+    }
+
 }

+ 4 - 0
fs-company-app/src/main/java/com/fs/core/config/RedisConfig.java

@@ -40,6 +40,10 @@ public class RedisConfig extends CachingConfigurerSupport
         template.setValueSerializer(serializer);
         // 使用StringRedisSerializer来序列化和反序列化redis的key值
         template.setKeySerializer(new StringRedisSerializer());
+
+        // Hash的key也采用StringRedisSerializer的序列化方式 这个才是redis的hash值的序列化方式 一直都没有序列化进去
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(serializer);
         template.afterPropertiesSet();
 
         // Hash的key也采用StringRedisSerializer的序列化方式 这个才是redis的hash值的序列化方式 一直都没有序列化进去

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

@@ -5,5 +5,5 @@ server:
 # Spring配置
 spring:
   profiles:
-#    active: druid-fcky-test
-    active: dev
+    active: druid-hyt-test
+#    active: dev

+ 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;
@@ -613,7 +615,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post("https://web.im.cdwjyyh.com/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())
@@ -634,13 +636,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.cdwjyyh.com/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();
                 }
@@ -653,7 +655,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post("https://web.im.cdwjyyh.com/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();
@@ -665,5 +667,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);
+    }
 }

+ 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);
+    }
 
     /**
      * 导出处方列表

+ 1 - 1
fs-company/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -110,7 +110,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                         "/**/*.js",
                         "/profile/**"
                 ).permitAll()
-
+                .antMatchers("/test").anonymous()
                 .antMatchers("**/callerResult").anonymous()
                 .antMatchers("/qw/getJsapiTicket/**").anonymous()
                 .antMatchers("/msg/**").anonymous()

+ 26 - 0
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -1,6 +1,7 @@
 package com.fs.user;
 
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
@@ -10,12 +11,17 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.cache.ICompanyUserCacheService;
+import com.fs.course.dto.BatchSendCourseDTO;
+import com.fs.course.param.FsCourseLinkCreateParam;
+import com.fs.course.service.IFsUserCourseService;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.PhoneUtil;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.CustomerTransferApproval;
 import com.fs.qw.dto.FsUserTransferParamDTO;
 import com.fs.qw.service.ICustomerTransferApprovalService;
@@ -24,6 +30,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -51,6 +58,12 @@ public class FsUserAdminController extends BaseController {
     @Autowired
     private ICustomerTransferApprovalService transferApprovalService;
 
+    @Autowired
+    private IFsUserCourseService fsUserCourseService;
+
+    @Autowired
+    private OpenIMService openIMService;
+
     @PreAuthorize("@ss.hasPermi('user:fsUser:list')")
     @PostMapping("/list")
     @ApiOperation("会员列表(与移动端使用的相同查询)")
@@ -145,4 +158,17 @@ public class FsUserAdminController extends BaseController {
     }
 
 
+    @ApiOperation("后台会员批量发送课程消息")
+    @PostMapping("/batchSendCourse")
+    public OpenImResponseDTO batchSendCourse(@RequestBody BatchSendCourseDTO batchSendCourseDTO) throws JsonProcessingException {
+        // 生成看课短链
+        FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+        BeanUtils.copyProperties(batchSendCourseDTO, fsCourseLinkCreateParam);
+        R courseSortLink = fsUserCourseService.createAppCourseSortLink(fsCourseLinkCreateParam);
+        String url = courseSortLink.get("url").toString();
+        batchSendCourseDTO.setUrl(url);
+
+        return openIMService.batchSendCourse(batchSendCourseDTO);
+    }
+
 }

+ 19 - 6
fs-doctor-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -1,8 +1,9 @@
 package com.fs.app.controller;
 
 
-
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.app.annotation.Login;
 import com.fs.app.param.SignParam;
 import com.fs.app.utils.CityTreeUtil;
@@ -25,11 +26,10 @@ import com.fs.his.param.ImMsgParam;
 import com.fs.his.service.*;
 
 import com.fs.his.utils.ConfigUtil;
-import com.fs.im.dto.MsgCustomDTO;
-import com.fs.im.dto.MsgDTO;
-import com.fs.im.dto.MsgDataDTO;
-import com.fs.im.dto.MsgDataFormatDTO;
+import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
+import com.fs.im.vo.OpenImMsgCallBackVO;
 import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
@@ -60,7 +60,6 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Logger;
 
-
 @Api("公共接口")
 @RestController
 @RequestMapping(value="/app/common")
@@ -102,6 +101,8 @@ public class CommonController {
 	private IFsFollowService followService;
 	@Autowired
 	private IImService imService;
+	@Autowired
+	private OpenIMService openIMService;
 	@ApiOperation("测试")
 	@GetMapping(value = "/getTest")
 	public AjaxResult getTest()
@@ -239,6 +240,18 @@ public class CommonController {
 		vo.setActionStatus("OK");
 		return vo;
 	}
+	@ApiOperation("openIm聊天数据回调")
+	@PostMapping(value = "/callbackAfterSendSingleMsgCommand")
+	public OpenImMsgCallBackResponse openImMsgCallBack(@RequestBody String body, HttpServletRequest request) throws JsonProcessingException {
+
+		Gson gson = new Gson();
+		OpenImMsgCallBackVO messageInfo = gson.fromJson(body, OpenImMsgCallBackVO.class);
+
+		//openIMService.AiAutoReply(messageInfo);
+
+		//log.info("收到的参数{}", JSON.toJSONString(messageInfo));
+		return inquiryOrderMsgService.openImSaveMsg(messageInfo);
+	}
 	/**
 	 * 生成验证码
 	 */

+ 5 - 0
fs-doctor-app/src/main/java/com/fs/app/controller/DiagnosisController.java

@@ -33,4 +33,9 @@ public class DiagnosisController extends AppBaseController{
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return diagnosisService.fill(param);
     }
+
+    @GetMapping("/{id}")
+    public R detail(@PathVariable("id") Long id){
+        return R.ok().put("data", diagnosisService.selectFsFirstDiagnosisById(id));
+    }
 }

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

@@ -21,6 +21,8 @@ import com.fs.his.param.FsDoctorExtractListSParam;
 import com.fs.his.service.*;
 import com.fs.his.vo.FsDoctorBillListSVO;
 import com.fs.his.vo.FsDoctorExtractListSVO;
+import com.fs.im.config.IMConfig;
+import com.fs.im.service.OpenIMService;
 import com.fs.im.service.OpenIMService;
 import com.fs.sms.service.SmsService;
 import com.fs.system.service.ISysConfigService;
@@ -29,6 +31,7 @@ import com.github.pagehelper.PageInfo;
 import com.github.pagehelper.util.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.json.JSONArray;
 import org.json.JSONObject;
@@ -43,6 +46,7 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
+@Slf4j
 @Api("个人中心")
 @RestController
 @RequestMapping(value="/app/doctor")
@@ -117,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.cdwjyyh.com/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())
@@ -144,9 +148,10 @@ public class DoctorController extends  AppBaseController {
                     requestBody = new JSONObject();
                     userIds.add(userId);
                     requestBody.put("users", users);
-                    HttpRequest.post("https://web.im.cdwjyyh.com/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("返回结果为空");
@@ -157,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.cdwjyyh.com/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();

+ 24 - 6
fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java

@@ -2,10 +2,13 @@ package com.fs.app.controller;
 
 
 import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 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;
@@ -19,8 +22,11 @@ import com.fs.his.service.IFsFollowService;
 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;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -53,7 +59,8 @@ public class DrugReportController extends AppBaseController {
     private IImService imService;
     @Autowired
     private IFsDrugReportCountService fsDrugReportCountService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @ApiOperation("获取报告列表")
     @GetMapping("/getDrugReportList")
     public R getDrugReportList(FsDrugReportListDParam param)
@@ -74,7 +81,7 @@ public class DrugReportController extends AppBaseController {
 
     @ApiOperation("提交报告")
     @PostMapping("/addReport")
-    public R addReport(@Validated @RequestBody DrugReportAddParam param, HttpServletRequest request){
+    public R addReport(@Validated @RequestBody DrugReportAddParam param, HttpServletRequest request) throws JsonProcessingException {
         FsFollow follow=followService.selectFsFollowByFollowId(param.getFollowId());
 
         FsDrugReport report=new FsDrugReport();
@@ -104,8 +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);
-
+            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();
@@ -118,7 +130,7 @@ public class DrugReportController extends AppBaseController {
     @ApiOperation("完成咨询")
     @PostMapping("/finishDrugReport")
     @RepeatSubmit
-    public R finishDrugReport(@Validated @RequestBody DrugReportFinishParam param, HttpServletRequest request){
+    public R finishDrugReport(@Validated @RequestBody DrugReportFinishParam param, HttpServletRequest request) throws JsonProcessingException {
         FsFollow follow=followService.selectFsFollowByFollowId(param.getFollowId());
         //发送给用户
         MsgDTO msgDTO=new MsgDTO();
@@ -136,7 +148,13 @@ public class DrugReportController extends AppBaseController {
         msg.setMsgContent(new MsgDataFormatDTO("您的用药咨询报告已出具,本次咨询结束"));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        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();
 

+ 50 - 11
fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -3,11 +3,15 @@ package com.fs.app.controller;
 
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 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;
@@ -17,19 +21,27 @@ 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;
 import com.fs.im.dto.MsgDataFormatDTO;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+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.*;
@@ -71,7 +83,8 @@ public class InquiryOrderController extends  AppBaseController {
     private IFsInquiryOrderReportService orderReportService;
     @Autowired
     private IImService imService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @Login
     @GetMapping("/getInquiryOrderList")
     public R getInquiryOrderList(FsInquiryOrderListPDParam param)
@@ -79,11 +92,7 @@ public class InquiryOrderController extends  AppBaseController {
         FsDoctor doctor=doctorService.selectFsDoctorByDoctorId(Long.parseLong(getDoctorId()));
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
 
-        if (Objects.nonNull(param.getUserId())) {
-            param.setDoctorId(null);
-        } else if (Objects.nonNull(param.getDoctorId())) {
-            param.setDoctorId(Long.parseLong(getDoctorId()));
-        }
+        param.setDoctorId(Long.parseLong(getDoctorId()));
 
         param.setIsAccept(doctor.getIsAccept());
         param.setIsSelf(doctor.getIsSelf());
@@ -164,7 +173,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("抢单")
     @PostMapping("/acceptOrder")
-    public R acceptOrder(@Validated @RequestBody FsInquiryOrderAcceptParam param, HttpServletRequest request){
+    public R acceptOrder(@Validated @RequestBody FsInquiryOrderAcceptParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.acceptOrder(param);
     }
@@ -172,7 +181,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("接单")
     @PostMapping("/receiveOrder")
-    public R receiveOrder(@Validated @RequestBody FsInquiryOrderReceiveParam param, HttpServletRequest request){
+    public R receiveOrder(@Validated @RequestBody FsInquiryOrderReceiveParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.receiveOrder(param);
     }
@@ -188,7 +197,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("完成订单")
     @PostMapping("/finishOrder")
-    public R finishOrder(@Validated @RequestBody FsInquiryOrderFinishParam param, HttpServletRequest request){
+    public R finishOrder(@Validated @RequestBody FsInquiryOrderFinishParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.finishOrder(param);
     }
@@ -241,7 +250,7 @@ public class InquiryOrderController extends  AppBaseController {
     @ApiOperation("提交诊断报告")
     @PostMapping("/submitInquiryOrderReport")
     @Transactional
-    public R submitInquiryOrderReport(@Validated @RequestBody FsInquiryOrderReportSubmitDParam param, HttpServletRequest request){
+    public R submitInquiryOrderReport(@Validated @RequestBody FsInquiryOrderReportSubmitDParam param, HttpServletRequest request) throws JsonProcessingException {
         FsInquiryOrderReport report=null;
         if(param.getReportId()!=null&&param.getReportId()>0){
             report=orderReportService.selectFsInquiryOrderReportByReportId(param.getReportId());
@@ -299,7 +308,30 @@ public class InquiryOrderController extends  AppBaseController {
         msg.setMsgType("TIMCustomElem");//TIMCustomElem
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        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("操作成功");
     }
 
@@ -330,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();
+    }
 }

+ 108 - 6
fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java

@@ -2,23 +2,37 @@ package com.fs.app.controller;
 
 
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+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;
 import com.fs.his.domain.*;
 import com.fs.his.dto.FsInquiryOrderPatientDTO;
+import com.fs.his.dto.PayloadDTO;
 import com.fs.his.param.*;
 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;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
+import com.fs.qw.domain.QwExternalContact;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -26,12 +40,10 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
+@Slf4j
 @Api("处方接口")
 @RestController
 @RequestMapping(value="/app/prescribe")
@@ -55,7 +67,8 @@ public class PrescribeController extends  AppBaseController {
     private IFsStoreOrderService storeOrderService;
     @Autowired
     private IImService imService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @Login
     @GetMapping("/getDoctorPrescribeList")
     public R getDoctorPrescribeList(FsDoctorPrescribeListDParam param)
@@ -186,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());
@@ -253,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);
             }
@@ -275,4 +326,55 @@ public class PrescribeController extends  AppBaseController {
         String url=prescribeService.getPrescribeCodeUrl(prescribeId);
         return R.ok().put("url",url);
     }
+    @PostMapping("/test")
+    public R test(@RequestBody HashMap<String,String> map) throws JsonProcessingException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setSendID("D"+79);
+        openImMsgDTO.setRecvID("U"+map.get("userId"));
+        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("感冒发烧,胸闷");
+        payload.setExtension(extension);
+        //log.info("payload:{}",payload);
+        OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+        imData.setPayload(payload);
+
+        String imJson = objectMapper.writeValueAsString(imData);
+        content.setData(imJson);
+        openImMsgDTO.setContent(content);
+        //log.info("openImMsgDTO:{}",openImMsgDTO);
+        JSONObject jsonObject = new JSONObject(openImMsgDTO);
+        //log.info("jsonObject:{}",jsonObject);
+        MsgCustomDTO customDTO=new MsgCustomDTO();
+        //customDTO.setType("startInquiry");
+        customDTO.setType(map.get("payloadDAata").toString());
+        customDTO.setOrderType(2);
+        customDTO.setOrderId(map.get("orderId"));
+        String imtype = map.get("imtype").toString();
+
+        customDTO.setImType(Integer.parseInt(imtype));
+        //openImMsgDTO.setEx(payload);
+        String ex = objectMapper.writeValueAsString(customDTO);
+        QwExternalContact qwExternalContact = new QwExternalContact();
+        qwExternalContact.setId(1l);
+        qwExternalContact.setFsUserId(1l);
+        //WatchSleepData last = watchSleepDataMapper.getLast("861389060165680");
+        //watchAudioMsgLogMapper.insert(watchAudioMsgLog);
+        //qwExternalContactMapper.selectRemarkByCompanyUserAndFsUser(map.get("sendId"), map.get("userId"),"wwwwww");
+        //fsUserCouponService.updateFsUserCouponStatusByLimtType2();
+//        openIMService.checkAndImportFriendByDianBo(Long.parseLong(map.get("sendId")),map.get("userId"),qwExternalContact.getCorpId());
+        //OpenImResponseDTO openImResponseDTO = openIMService.sendCourse(Long.parseLong(map.get("userId")), Long.parseLong(map.get("sendId")), "/pages/courseAnswer/index?link=1932017457275338752", "《五仙传医2.0》","https://cos.his.cdwjyyh.com/fs/20241108/a8ed49ae9a264c7483cec5bdcbcf6060.png");
+        log.info("请求地址{}",IMConfig.URL);
+//        log.info("前缀{}",IMConfig.PREFIX);
+        //OpenImResponseDTO openImResponseDTO = openIMService.sendUtil("D" +map.get("sendId"), "U"+map.get("userId").toString(), 110, map.get("payloadDAata").toString(), "", map.get("title").toString(), "", "3135749",ex);
+        return R.ok().put("data",null);
+    }
 }

+ 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

+ 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

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

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

+ 4 - 2
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -37,9 +37,8 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.google.gson.Gson;
-import com.hc.openapi.tool.util.ObjectUtils;
 import org.apache.commons.collections4.CollectionUtils;
-;
+import org.apache.commons.lang3.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -693,6 +692,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

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

+ 2 - 0
fs-service/src/main/java/com/fs/course/domain/FsCourseWatchLog.java

@@ -88,5 +88,7 @@ public class FsCourseWatchLog extends BaseEntity
     /** 营期id */
     private Long periodId;
 
+    /** im发送消息详情id */
+    private Long imMsgSendDetailId;
 
 }

+ 33 - 0
fs-service/src/main/java/com/fs/course/dto/BatchSendCourseAllDTO.java

@@ -0,0 +1,33 @@
+package com.fs.course.dto;
+
+import com.fs.im.domain.FsImMsgSendDetail;
+import com.fs.im.dto.OpenImBatchMsgDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 批量发课-定时任务入参(存入redis)
+ */
+@Data
+@Accessors(chain = true)
+public class BatchSendCourseAllDTO implements Serializable {
+
+    @ApiModelProperty(value = "前端点击发送时的入参")
+    private BatchSendCourseDTO batchSendCourseDTO;
+
+    @ApiModelProperty(value = "发IM消息时的参数")
+    private OpenImBatchMsgDTO openImBatchMsgDTO;
+
+    @ApiModelProperty(value = "课程所属项目")
+    private Long project;
+
+    @ApiModelProperty(value = "消息发送记录详情")
+    private List<FsImMsgSendDetail> imMsgSendDetailList;
+
+
+}

+ 81 - 0
fs-service/src/main/java/com/fs/course/dto/BatchSendCourseDTO.java

@@ -0,0 +1,81 @@
+package com.fs.course.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 批量发课-入参
+ */
+@Data
+public class BatchSendCourseDTO implements Serializable {
+
+    @ApiModelProperty(value = "用户ids")
+    private List<Long> userIds;
+
+    @ApiModelProperty(value = "销售id,生成短链需要", required = true)
+    private Long companyUserId;
+
+    @ApiModelProperty(value = "公司id,生成短链需要", required = true)
+    private Long companyId;
+
+    @ApiModelProperty(value = "营期id,生成短链需要", required = true)
+    private Long periodId;
+
+    @ApiModelProperty(value = "课程id,生成短链需要", required = true)
+    private Long courseId;
+
+    @ApiModelProperty(value = "课程名称", required = true)
+    private String courseName;
+
+    @ApiModelProperty(value = "视频id,生成短链需要", required = true)
+    private Long videoId;
+
+    @ApiModelProperty(value = "视频名称", required = true)
+    private String videoName;
+
+    @ApiModelProperty(value = "标签ids,如果没有companyUserId或者userIds则必传")
+    private List<Long> tagIds;
+
+    @ApiModelProperty(value = "标签名称")
+    private List<String> tagNames;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "发送消息时间,定时发送需要传")
+    private Date sendTime;
+
+    @ApiModelProperty(value = "发送类型,1-定时;2-实时", required = true)
+    private Integer sendType;
+
+    @ApiModelProperty(value = "发送方式,1-app;2-销售后台", required = true)
+    private Integer sendMode;
+
+    @ApiModelProperty(value = "发课内容", required = true)
+    private String title;
+
+    @ApiModelProperty(value = "链接有效时长(分钟)")
+    private Integer effectiveDuration;
+
+    @ApiModelProperty(value = "营期课程id,生成短链需要", required = true)
+    private Long id;
+
+    /* 看课短链 */
+    private String url;
+
+    @ApiModelProperty(value = "项目id,生成短链需要", required = true)
+    private Long projectId;
+
+    @ApiModelProperty(value = "是否催课", required = true)
+    private Boolean isUrgeCourse;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "催课时间")
+    private Date urgeTime;
+
+    @ApiModelProperty(value = "催课内容")
+    private String urgeContent;
+}

+ 32 - 0
fs-service/src/main/java/com/fs/course/dto/BatchUrgeCourseDTO.java

@@ -0,0 +1,32 @@
+package com.fs.course.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 批量催课-入参
+ */
+@Data
+public class BatchUrgeCourseDTO implements Serializable {
+
+    @NotBlank
+    @ApiModelProperty(value = "任务详情id", required = true)
+    private List<Long> imMsgSendDetailId;
+
+    @NotNull
+    @ApiModelProperty(value = "是否需要发课", required = true)
+    private Boolean isSendCourse;
+
+    @NotNull
+    @ApiModelProperty(value = "发课内容", required = true)
+    private String title;
+
+    @NotBlank
+    @ApiModelProperty(value = "催课内容")
+    private String urgeContent;
+}

+ 4 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -5,6 +5,7 @@ import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.dto.WatchLogDTO;
 import com.fs.course.param.*;
 import com.fs.course.vo.*;
+import com.fs.im.dto.OpenImBatchResponseDataDTO;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.sop.vo.QwRatingVO;
 import org.apache.ibatis.annotations.Param;
@@ -524,6 +525,9 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
 
     List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOexport(@Param("maps") FsCourseWatchLogListParam param);
 
+    List<FsCourseWatchLog> getWatchCourseByVideoId(@Param("videoId") Long videoId, @Param("userIds") List<Long> userIds);
+
+
     /**
      * 查询训练营看课人数
      */

+ 2 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java

@@ -93,4 +93,6 @@ public interface FsUserCompanyUserMapper extends BaseMapper<FsUserCompanyUser>{
     int batchUpdateStatus(@Param("ids") List<Long> ids, @Param("status") int status);
 
     List<Long> selectFsUserCompanyUserListByMap(@Param("param") Map<String, Object> param);
+
+    List<FsUserCompanyUser> selectFsUserCompanyUserByIds(@Param("param") Map<String, Object> param);
 }

+ 9 - 0
fs-service/src/main/java/com/fs/course/param/DiagnosisConfirmParam.java

@@ -0,0 +1,9 @@
+package com.fs.course.param;
+
+import lombok.Data;
+
+@Data
+public class DiagnosisConfirmParam {
+
+    private Long id;
+}

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

@@ -30,7 +30,7 @@ public class FsCourseSendRewardUParam implements Serializable
     private Integer linkType;
     @NotNull(message = "课程参数不能为空")
     private Long qwExternalId;
-    private Integer source=1;//来源 1:h5  2:小程序
+    private Integer source=1;//来源 1:h5  2:小程序 3:app
     private Integer isRoom;
     private Integer sendType;
     private Long periodId;

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

@@ -1,9 +1,6 @@
 package com.fs.course.param;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fs.common.annotation.Excel;
-import com.fs.common.core.domain.BaseEntity;
-import io.swagger.models.auth.In;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -89,6 +86,11 @@ public class FsCourseWatchLogListParam implements Serializable {
     //是否是会员
     private Integer isVip;
 
+    /**
+     * 所属项目
+     */
+    private Integer project;
+
     /**
      * sop主键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;
 }

+ 31 - 0
fs-service/src/main/java/com/fs/course/param/newfs/FsCourseWatchAppParam.java

@@ -0,0 +1,31 @@
+package com.fs.course.param.newfs;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(description = "app-看课记录入参")
+public class FsCourseWatchAppParam implements Serializable {
+
+    @ApiModelProperty(value = "页码,默认为1", required = true)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "页大小,默认为10", required = true)
+    private Integer pageSize = 10;
+
+    /**
+     * 类型,1-看课中,2-完课,3-待看课,4-看课中断
+     */
+    @ApiModelProperty(value = "类型,1-看课中,2-完课,3-待看课,4-看课中断", required = true)
+    private Integer logType;
+
+    @ApiModelProperty(value = "发送方式:1-个微,2-企微", required = true)
+    private Integer sendType;
+
+    @ApiModelProperty(value = "所属项目")
+    private Integer project;
+
+}

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

@@ -493,6 +493,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                         o.setAppId(appId);
                         o.setReqSeqId("product-"+storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
+                        o.setAppId(param.getAppId());
                         o.setGoodsDesc("拍商品订单支付");
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         logger.info("创建汇付支付:"+result);

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

@@ -513,6 +513,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                         o.setReqSeqId("course-" + 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());
@@ -523,10 +524,10 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
 
                     }
 
-                } else {
-                    return R.error("用户OPENID不存在");
                 }
             }
+        } else {
+            return R.error("用户OPENID不存在");
         }
         return R.error();
     }
@@ -795,7 +796,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
             param.setUserCouponId(order.getUserCouponId());
         }
         FsUser user=fsUserMapper.selectFsUserByUserId(order.getUserId());
-        if(user!=null&& StringUtils.isNotEmpty(user.getMaOpenId())){
+        if(user!=null){
             Map<String,Object> moneys=computeOrderMoney(order.getPayPrice(),param);
             return R.ok().put("moneys",moneys);
         }

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

@@ -1213,6 +1213,12 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
 
+        // 判断来源是否是app,如是app,则发放积分奖励
+        int sourceApp = 3;
+        if(sourceApp == param.getSource()){
+            return sendIntegralReward(param, user, log, config);
+        }
+
         // 根据奖励类型发放不同奖励
         switch (config.getRewardType()) {
             // 红包奖励
@@ -1880,7 +1886,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 return ResponseResult.fail(504, "超过项目看课数量限制");
             }
         }
-
         //添加判断:该用户是否已经存在此课程的看课记录,并且看课记录的销售id不是传入的销售id
         if(watchCourseVideo != null){
             if(!watchCourseVideo.getCompanyUserId().equals(param.getCompanyUserId())) {

+ 3 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserVipOrderServiceImpl.java

@@ -371,6 +371,7 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                         o.setReqSeqId("appvip-" + 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());
@@ -379,10 +380,10 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                         storePaymentService.updateFsStorePayment(mt);
                         return R.ok().put("isPay", 0).put("data", result).put("type", "hf");
                     }
-                } else {
-                    return R.error("用户OPENID不存在");
                 }
             }
+        }  else {
+            return R.error("用户OPENID不存在");
         }
         return R.error();
     }

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

@@ -129,5 +129,10 @@ public class FsCourseWatchLogListVO extends BaseEntity
     private Long videoId;
     private Integer isVip;
 
+    /**
+     * im发送消息详情id
+     */
+    private Long imMsgSendDetailId;
+
 
 }

+ 52 - 0
fs-service/src/main/java/com/fs/course/vo/newfs/FsImSendLogVO.java

@@ -0,0 +1,52 @@
+package com.fs.course.vo.newfs;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author caolq
+ * im任务发送记录 VO
+ */
+@Data
+public class FsImSendLogVO implements Serializable {
+
+    @ApiModelProperty(value = "发送记录id")
+    private Long logId;
+
+    @ApiModelProperty(value = "视频id")
+    private Long videoId;
+
+    @ApiModelProperty(value = "视频标题")
+    private String videoName;
+
+    @ApiModelProperty(value = "计划发课时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date planSendTime;
+
+    @ApiModelProperty(value = "标签ids")
+    private String tagIds;
+
+    @ApiModelProperty(value = "标签名称")
+    private String tagNames;
+
+    @ApiModelProperty(value = "用户id,多个用逗号隔开")
+    private String userIds;
+
+    @ApiModelProperty(value = "用户昵称,多个用逗号隔开")
+    private String nickNames;
+
+    @ApiModelProperty(value = "是否催课,1-是;0-否")
+    private Integer isUrgeCourse;
+
+    @ApiModelProperty(value = "催课文案")
+    private String urgeSendTitle;
+
+    @ApiModelProperty(value = "发送状态,1-已发送;2-待发送")
+    private Integer sendStatus;
+
+
+}

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

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

@@ -15,7 +15,7 @@ import com.fs.erp.utils.SignUtil;
 import com.fs.ybPay.dto.RefundOrderDTO;
 import com.hc.openapi.tool.util.ObjectUtils;
 import lombok.extern.slf4j.Slf4j;
-
+//import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;

+ 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

@@ -240,6 +240,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;
+    }
+}

+ 13 - 9
fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java

@@ -18,9 +18,13 @@ 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;
 import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -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/gtPush/service/impl/uniPush2ServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;

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

@@ -3,6 +3,7 @@ package com.fs.his.config;
 import com.fs.erp.dto.df.DFConfigVo;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
@@ -74,4 +75,10 @@ public class FsSysConfig {
 
     //不推送erp的公司id
     List<Long> noErpCompany;
+
+    //最低定金金额
+    private BigDecimal retainer;
+
+    //物流代收定金比例
+    private BigDecimal rate;
 }

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

@@ -42,4 +42,5 @@ public class FsInquiryOrderMsg extends BaseEntity
 
     private String msgKey;
     private Integer msgContentType;
+    private String companyUserAccount;
 }

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

+ 8 - 2
fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java

@@ -2,16 +2,17 @@ package com.fs.his.dto;
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.Date;
 
 @Data
-public class PayloadDTO {
+public class PayloadDTO implements Serializable {
     private String data;
     private Extension extension;
     private String description;
 
     @Data
-    public static class Extension{
+    public static class Extension implements Serializable{
         private String title;
         private String patientName;
         private String sex;
@@ -27,6 +28,11 @@ public class PayloadDTO {
         private String courseUrl;
         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/FsFirstDiagnosisMapper.java

@@ -79,6 +79,7 @@ public interface FsFirstDiagnosisMapper extends BaseMapper<FsFirstDiagnosis>{
             "WHERE 1 = 1" +
             "<if test='maps.type == 0' > and  doctor_status = 0 and doctor_id is null</if>" +
             "<if test='maps.type == 1' > and  doctor_id = #{maps.doctorId}</if>" +
+            "<if test='maps.patientName != null'> and patient_name like concat('%',#{maps.patientName},'%')</if>" +
             "ORDER BY create_time desc" +
             "</script>"})
     List<FsDiagnosisListDVO> selectFsDiagnosisListDVO(@Param("maps") FsDiagnosisListDParam param);

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsHfpayConfigMapper.java

@@ -3,6 +3,7 @@ package com.fs.his.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsHfpayConfig;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 汇付多支付配置Mapper接口
@@ -58,4 +59,7 @@ public interface FsHfpayConfigMapper extends BaseMapper<FsHfpayConfig>{
      * @return 结果
      */
     int deleteFsHfpayConfigByIds(Long[] ids);
+
+    @Select("select * from fs_hfpay_config where app_id = #{appId} limit 1")
+    FsHfpayConfig selectByAppId(String appId);
 }

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

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

@@ -24,7 +24,7 @@ public interface FsInquiryPatientInfoMapper {
             "LEFT JOIN fs_patient p ON p.patient_id  = pi.patient_id " +
             "LEFT JOIN company_user u ON u.user_id = pi.company_user_id " +
             " left join fs_doctor d on d.doctor_id = pi.sub_doctor_id  " +
-            " 1=1 " +
+            " where 1 = 1 " +
             "<if test='param.userId != null'> AND pi.user_id = #{param.userId} </if> " +
             "ORDER BY pi.create_time desc " +
             "</script>"})

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

+ 5 - 0
fs-service/src/main/java/com/fs/his/param/FsDiagnosisListDParam.java

@@ -10,4 +10,9 @@ public class FsDiagnosisListDParam extends BaseParam{
      * 0-全部 1-我的
      */
     private Integer type;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
 }

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

@@ -8,5 +8,5 @@ import java.io.Serializable;
 public class FsInquiryOrderPayParam implements Serializable {
     Long orderId;
     Long userCouponId;
-
+    String appId;
 }

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

+ 2 - 1
fs-service/src/main/java/com/fs/his/service/IFsFirstDiagnosisService.java

@@ -3,6 +3,7 @@ package com.fs.his.service;
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
+import com.fs.course.param.DiagnosisConfirmParam;
 import com.fs.course.param.FsFirstDiagnosisListUParam;
 import com.fs.course.vo.FsFirstDiagnosisListUVO;
 import com.fs.his.domain.FsFirstDiagnosis;
@@ -85,5 +86,5 @@ public interface IFsFirstDiagnosisService extends IService<FsFirstDiagnosis>{
 
     FsFirstDiagnosisListUVO getInfo(Long id);
 
-    R confirm(Long id);
+    R confirm(DiagnosisConfirmParam param);
 }

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików