Browse Source

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

# Conflicts:
#	fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
15376779826 1 day ago
parent
commit
c59a38942b
36 changed files with 982 additions and 102 deletions
  1. 13 0
      fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java
  2. 2 2
      fs-admin/src/main/resources/application.yml
  3. 27 19
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  4. 7 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferLogController.java
  5. 4 0
      fs-service/src/main/java/com/fs/company/param/CompanyUserQwParam.java
  6. 5 5
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  7. 2 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  8. 3 1
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  9. 2 4
      fs-service/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java
  10. 5 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  11. 42 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogStatisticsListByCompanyVO.java
  12. 1 0
      fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java
  13. 1 1
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
  14. 48 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  15. 1 4
      fs-service/src/main/java/com/fs/hisStore/enums/SysConfigEnum.java
  16. 2 6
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  17. 9 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java
  18. 3 3
      fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/utils/HuiFuUtils.java
  19. 10 1
      fs-service/src/main/java/com/fs/qw/domain/QwExternalContactTransferLog.java
  20. 3 1
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactTransferLogMapper.java
  21. 1 1
      fs-service/src/main/java/com/fs/qw/mapper/QwUserVideoMapper.java
  22. 3 0
      fs-service/src/main/java/com/fs/qw/param/QwAutoTagsRulesTags.java
  23. 3 1
      fs-service/src/main/java/com/fs/qw/service/IQwExternalContactTransferLogService.java
  24. 174 0
      fs-service/src/main/java/com/fs/qw/service/impl/AsyncQwExternalContactTransferService.java
  25. 53 15
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  26. 130 19
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactTransferLogServiceImpl.java
  27. 2 0
      fs-service/src/main/java/com/fs/qw/vo/QwUserVO.java
  28. 22 0
      fs-service/src/main/java/com/fs/tulin/JsonSortUtils.java
  29. 49 0
      fs-service/src/main/java/com/fs/tulin/PharmacyEnum.java
  30. 83 0
      fs-service/src/main/java/com/fs/tulin/StudentInfo.java
  31. 182 0
      fs-service/src/main/java/com/fs/tulin/SyncStudentInfoService.java
  32. 1 0
      fs-service/src/main/resources/mapper/company/CompanyDivItemMapper.xml
  33. 15 10
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  34. 54 2
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  35. 7 0
      fs-service/src/main/resources/mapper/sop/QwSopTempMapper.xml
  36. 13 6
      fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java

+ 13 - 0
fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java

@@ -3,6 +3,7 @@ package com.fs.course.controller.qw;
 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.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
@@ -16,6 +17,7 @@ import com.fs.course.param.PeriodStatisticCountParam;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.course.vo.FsCourseOverVO;
 import com.fs.course.vo.FsCourseWatchLogListVO;
+import com.fs.course.vo.FsCourseWatchLogStatisticsListByCompanyVO;
 import com.fs.course.vo.FsCourseWatchLogStatisticsListVO;
 import com.fs.qw.param.QwWatchLogStatisticsListParam;
 import com.fs.qw.service.IQwWatchLogService;
@@ -78,6 +80,17 @@ public class QwFsCourseWatchLogController extends BaseController
         List<FsCourseWatchLogStatisticsListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogStatisticsListVO(param);
         return getDataTable(list);
     }
+
+    @GetMapping("/statisticsListByCompany")
+    public R statisticsListByCompany(FsCourseWatchLogStatisticsListParam param)
+    {
+        if (param.getSTime()==null||param.getETime()==null){
+            return R.ok().put("rows", new ArrayList<>());
+        }
+        param.setSendType(2); //企微
+        List<FsCourseWatchLogStatisticsListByCompanyVO> list = fsCourseWatchLogService.selectFsCourseWatchLogStatisticsListByCompanyVO(param);
+        return R.ok().put("rows", list);
+    }
     @GetMapping("/qwWatchLogStatisticsList")
     public TableDataInfo qwWatchLogStatisticsList(QwWatchLogStatisticsListParam param)
     {

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

@@ -4,10 +4,10 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: dev
+#    active: dev
 #    active: druid-hdt
 #    active: druid-yzt
-#    active: druid-sxjz
+    active: druid-sxjz-test
 #    active: druid-sft
 #    active: druid-fby
 #    active: dev

+ 27 - 19
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -57,6 +57,7 @@ import org.springframework.web.multipart.MultipartFile;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 
@@ -136,27 +137,34 @@ public class CompanyUserController extends BaseController {
     public TableDataInfo qwList(CompanyUserQwParam user) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         user.setCompanyId(loginUser.getCompany().getCompanyId());
-        startPage();
         List<CompanyUserQwListVO> list = companyUserService.selectCompanyUserQwListVO(user);
-        for (CompanyUserQwListVO companyUserQwListVO : list) {
-            CompanyUserDelayTime companyUserDelayTime = companyUserDelayTimeService.selectCompanyUserDelayTimeByCompanyUser(companyUserQwListVO.getCompanyId(), companyUserQwListVO.getUserId());
-            if (ObjectUtil.isEmpty(companyUserDelayTime)) {
-                String json = configService.selectConfigByKey("course.config");
-                CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-                companyUserQwListVO.setSendDelayTime(config.getSendDelayTime());
-            } else {
-                companyUserQwListVO.setSendDelayTime(companyUserDelayTime.getSendDelayTime());
-            }
-            //是否绑定
-            if(QwStatusEnum.BOUND.getCode() == companyUserQwListVO.getQwStatus()){
-                if(!companyUserQwListVO.getQwUserId().isEmpty()){
-                    Long[] ids = Arrays.stream(companyUserQwListVO.getQwUserId().split(","))
-                            .map(Long::parseLong)
-                            .toArray(Long[]::new);
-                    List<QwUserVO> qwUserVOS = qwUserService.selectQwUserVOByIds(ids);
-                    companyUserQwListVO.setQwUsers(qwUserVOS);
-                }
+        if (!list.isEmpty()){
+            String json = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+            Long sendDelayTime = config.getSendDelayTime();
+            List<CompletableFuture<Void>> futures = new ArrayList<>();
+            for (CompanyUserQwListVO companyUserQwListVO : list) {
+                CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                    CompanyUserDelayTime companyUserDelayTime = companyUserDelayTimeService.selectCompanyUserDelayTimeByCompanyUser(companyUserQwListVO.getCompanyId(), companyUserQwListVO.getUserId());
+                    if (ObjectUtil.isEmpty(companyUserDelayTime)) {
+                        companyUserQwListVO.setSendDelayTime(sendDelayTime);
+                    } else {
+                        companyUserQwListVO.setSendDelayTime(companyUserDelayTime.getSendDelayTime());
+                    }
+                    //是否绑定
+                    if(QwStatusEnum.BOUND.getCode() == companyUserQwListVO.getQwStatus()){
+                        if(!companyUserQwListVO.getQwUserId().isEmpty()){
+                            Long[] ids = Arrays.stream(companyUserQwListVO.getQwUserId().split(","))
+                                    .map(Long::parseLong)
+                                    .toArray(Long[]::new);
+                            List<QwUserVO> qwUserVOS = qwUserService.selectQwUserVOByIds(ids);
+                            companyUserQwListVO.setQwUsers(qwUserVOS);
+                        }
+                    }
+                });
+                futures.add(future);
             }
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
         }
         return getDataTable(list);
     }

+ 7 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferLogController.java

@@ -14,6 +14,7 @@ import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwExternalContactTransferLog;
 import com.fs.qw.param.QwExternalContactTransferLogParam;
 import com.fs.qw.service.IQwExternalContactTransferLogService;
+import com.fs.qw.service.impl.AsyncQwExternalContactTransferService;
 import com.fs.qw.vo.QwExternalContactTransferLogListVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -41,6 +42,9 @@ public class QwExternalContactTransferLogController extends BaseController
     @Autowired
     private CompanyDeptServiceImpl companyDeptService;
 
+    @Autowired
+    private AsyncQwExternalContactTransferService transferService;
+
     /**
      * 查询转接记录列表
      */
@@ -116,8 +120,10 @@ public class QwExternalContactTransferLogController extends BaseController
     @GetMapping("/sync/{corpId}")
     public R syncTag(@PathVariable("corpId") String corpId)
     {
+        transferService.syncQwExternalContactTransferLog(corpId);
 
-        return qwExternalContactTransferLogService.syncQwExternalContactTransferLog(corpId);
+//        return qwExternalContactTransferLogService.syncQwExternalContactTransferLog(corpId);
+        return R.ok();
     }
     /**
      * 获取转接记录详细信息

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

@@ -115,4 +115,8 @@ public class CompanyUserQwParam extends BaseEntity {
     private Long qwUserId;
 
     private Integer qwStatus;
+
+    private Integer pageNum;
+
+    private Integer pageSize;
 }

+ 5 - 5
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -52,6 +52,7 @@ import com.fs.system.service.ISysRoleService;
 import com.fs.system.service.ISysUserService;
 import com.fs.voice.utils.StringUtil;
 import com.fs.wxUser.domain.CompanyWxUser;
+import com.github.pagehelper.PageHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -670,14 +671,13 @@ public class CompanyUserServiceImpl implements ICompanyUserService
 //        if(!StringUtils.isEmpty(companyConfig.getConfigValue())){
 //            isAdminShow = Boolean.parseBoolean(companyConfig.getConfigValue());
 //        }
-        List<CompanyUserQwListVO> companyUserQwListVOS = companyUserMapper.selectCompanyUserQwListVO(user);
-        if(!isAdminShow){
+        if(isAdminShow){
             Company company = companyService.selectCompanyById(user.getCompanyId());
             Long userId = company.getUserId();
-            companyUserQwListVOS = companyUserQwListVOS.stream()
-                    .filter(vo -> !vo.getUserId().equals(userId))
-                    .collect(Collectors.toList());
+            user.setUserId(userId);
         }
+        PageHelper.startPage(user.getPageNum(), user.getPageSize());
+        List<CompanyUserQwListVO> companyUserQwListVOS = companyUserMapper.selectCompanyUserQwListVO(user);
         return companyUserQwListVOS;
     }
 

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

@@ -528,4 +528,6 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      * 查询训练营看课人数
      */
     Integer getUserCountByCampId(@Param("trainingCampId") Long trainingCampId);
+
+    List<FsCourseWatchLogStatisticsListByCompanyVO> selectFsCourseWatchLogStatisticsListByCompanyVO(FsCourseWatchLogStatisticsListParam param);
 }

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

@@ -86,7 +86,9 @@ public class FsCourseWatchLogListParam implements Serializable {
      */
     private String userType;
 
-    //是否是会员
+    /**
+     * 是否是会员
+     */
     private Integer isVip;
 
     /**

+ 2 - 4
fs-service/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java

@@ -3,10 +3,7 @@ package com.fs.course.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.param.*;
-import com.fs.course.vo.FsCourseOverVO;
-import com.fs.course.vo.FsCourseUserStatisticsListVO;
-import com.fs.course.vo.FsCourseWatchLogListVO;
-import com.fs.course.vo.FsCourseWatchLogStatisticsListVO;
+import com.fs.course.vo.*;
 import com.fs.qw.param.QwWatchLogStatisticsListParam;
 import com.fs.qw.vo.QwWatchLogStatisticsListVO;
 
@@ -92,6 +89,7 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
     void testFinishMsg();
 
     List<FsCourseWatchLogStatisticsListVO> selectFsCourseWatchLogStatisticsListVO(FsCourseWatchLogStatisticsListParam param);
+    List<FsCourseWatchLogStatisticsListByCompanyVO> selectFsCourseWatchLogStatisticsListByCompanyVO(FsCourseWatchLogStatisticsListParam param);
 
     void scheduleBatchUpdateToDatabase();
 

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

@@ -723,6 +723,11 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         return fsCourseWatchLogMapper.selectFsCourseWatchLogStatisticsListVO(param);
     }
 
+    @Override
+    public List<FsCourseWatchLogStatisticsListByCompanyVO> selectFsCourseWatchLogStatisticsListByCompanyVO(FsCourseWatchLogStatisticsListParam param) {
+        return fsCourseWatchLogMapper.selectFsCourseWatchLogStatisticsListByCompanyVO(param);
+    }
+
 
     public void sendSocket(String cmd,String message,String appKey){
         MsgBean msgBean=new MsgBean();

+ 42 - 0
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogStatisticsListByCompanyVO.java

@@ -0,0 +1,42 @@
+package com.fs.course.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FsCourseWatchLogStatisticsListByCompanyVO {
+
+
+    @Excel(name = "公司名称")
+    private String companyName;
+    private Integer project;
+    @Excel(name = "项目名称")
+    private String projectName;
+
+    private Long courseId;
+    @Excel(name = "课程名称")
+    private String courseName;
+
+    private Long videoId;
+    @Excel(name = "小节名称")
+    private String videoName;
+
+    @Excel(name = "待看课")
+    private String type1;
+    @Excel(name = "看课中")
+    private String type2;
+    @Excel(name = "已完课")
+    private String type3;
+    @Excel(name = "看课中断")
+    private String type4;
+    @Excel(name = "上线数")
+    private Long onLineNum;
+
+    private Long userId;
+    @Excel(name = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createTime;
+}

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

@@ -125,4 +125,5 @@ public interface IFsStorePaymentService
 
     R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param);
 
+    String payConfirm(String payCode,String tradeNo,String bankTransactionId,String bankSerialNo);
 }

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

@@ -1024,7 +1024,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
                         try {
                             HuiFuUtils.doDiv(o,fsPackageOrder.getCompanyId());
                             //存储分账明细
-                            HuiFuUtils.saveDivItem(o, fsPackageOrder, storePayment);
+                            HuiFuUtils.saveDivItem(o, fsPackageOrder.getOrderSn(), storePayment.getPayCode());
                         } catch (Exception e) {
                             logger.error("-------------分账出错:{}", e.getMessage());
                         }

+ 48 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -56,6 +56,8 @@ import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
+import com.fs.hisStore.domain.FsStorePaymentScrm;
+import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
 import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
 import com.fs.hisStore.param.FsStorePaymentPayParam;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
@@ -64,6 +66,7 @@ import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
@@ -126,6 +129,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     @Autowired
     private FsStorePaymentMapper fsStorePaymentMapper;
     @Autowired
+    private FsStorePaymentScrmMapper fsStorePaymentScrmMapper;
+    @Autowired
     private TzBankService tzBankService;
     @Autowired
     private IFsInquiryOrderService inquiryOrderService;
@@ -1473,6 +1478,41 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         }
     }
 
+    @Override
+    @Transactional
+    public String payConfirm(String payCode, String tradeNo, String bankTransactionId, String bankSerialNo) {
+        try {
+            //更新订单状态
+            FsStorePayment storePayment=fsStorePaymentMapper.selectFsStorePaymentByPaymentCode(payCode);
+            if(!storePayment.getStatus().equals(0)){
+                return "";
+            }
+            storePayment.setStatus(1);
+            storePayment.setPayTime(new Date());
+            storePayment.setTradeNo(tradeNo);
+            storePayment.setBankSerialNo(bankSerialNo);
+            storePayment.setBankTransactionId(bankTransactionId);
+            fsStorePaymentMapper.updateFsStorePayment(storePayment);
+            //增加佣金
+//        if(storePayment.getCompanyId()!=null&&storePayment.getCompanyId()>0){
+//            companyService.addCompanyPaymentMoney(storePayment);
+//        }
+        } catch (Exception e) {
+            //更新订单状态
+            FsStorePaymentScrm storePayment=fsStorePaymentScrmMapper.selectFsStorePaymentByPaymentCode(payCode);
+            if(!storePayment.getStatus().equals(0)){
+                return "";
+            }
+            storePayment.setStatus(1);
+            storePayment.setPayTime(new Date());
+            storePayment.setTradeNo(tradeNo);
+            storePayment.setBankSerialNo(bankSerialNo);
+            storePayment.setBankTransactionId(bankTransactionId);
+            fsStorePaymentScrmMapper.updateFsStorePayment(storePayment);
+        }
+        return "SUCCESS";
+    }
+
     @Override
     public R paymentByWxaCode(FsStorePaymentPayParam param) {
         FsUser user = userMapper.selectFsUserById(param.getUserId());
@@ -1549,6 +1589,14 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         o.setTransAmt(storePayment.getPayMoney().toString());
         o.setGoodsDesc("商城订单支付");
         o.setAppId(appId);
+        //公司分账
+        try {
+            HuiFuUtils.doDiv(o,company.getCompanyId());
+            //存储分账明细
+            HuiFuUtils.saveDivItem(o, storePayment.getPayCode(), storePayment.getPayCode());
+        } catch (Exception e) {
+            logger.error("-------------微信收款分账出错:{}", e.getMessage());
+        }
         HuifuCreateOrderResult result = huiFuService.createOrder(o);
         if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
             FsStorePayment mt=new FsStorePayment();

+ 1 - 4
fs-service/src/main/java/com/fs/hisStore/enums/SysConfigEnum.java

@@ -85,10 +85,7 @@ public enum SysConfigEnum {
     //红包流量,joinTime.switch.config
     JOIN_TIME_SWITCH_CONFIG("joinTime.switch.config", "红包流量"),
     //签到配置,store.sign
-    SIGN_CONFIG("store.sign", "签到配置"),
-    //商城支付配置,store.pay
-    STORE_PAY_CONFIG("store.pay", "商城支付配置");
-
+    SIGN_CONFIG("store.sign", "签到配置");
     private final String key;
     private final String name;
 

+ 2 - 6
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -2152,12 +2152,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             //将钱退还给用户
             List<FsStorePaymentScrm> payments = paymentService.selectFsStorePaymentByOrderId(order.getId());
             if (payments != null) {
-                String json;
-                if (CloudHostUtils.hasCloudHostName("康年堂")) {
-                    json = configService.selectConfigByKey("his.pay");
-                } else {
-                    json = configService.selectConfigByKey("store.pay");
-                }
+                String json = configService.selectConfigByKey("his.pay");
+
                 FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
                 for (FsStorePaymentScrm payment : payments) {
                     if (payment.getPayMode() == null || payment.getPayMode().equals("wx")) {

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

@@ -41,6 +41,7 @@ import com.fs.hisStore.enums.SysConfigEnum;
 import com.fs.hisStore.param.*;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.pay.pay.config.PayConfig;
 import com.fs.pay.pay.dto.WxJspayDTO;
@@ -891,6 +892,14 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         o.setTransAmt(storePayment.getPayMoney().toString());
         o.setGoodsDesc("商城订单支付");
         o.setAppId(param.getAppId());
+        //公司分账
+        try {
+            HuiFuUtils.doDiv(o,company.getCompanyId());
+            //存储分账明细
+            HuiFuUtils.saveDivItem(o, storePayment.getPayCode(), storePayment.getPayCode());
+        } catch (Exception e) {
+            logger.error("-------------微信收款分账出错:{}", e.getMessage());
+        }
         HuifuCreateOrderResult result = huiFuService.createOrder(o);
         if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
             FsStorePaymentScrm mt=new FsStorePaymentScrm();

+ 3 - 3
fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/utils/HuiFuUtils.java

@@ -144,11 +144,11 @@ public class HuiFuUtils {
         }
     }
 
-    public static void saveDivItem(HuiFuCreateOrder o, FsPackageOrder fsPackageOrder, FsStorePayment storePayment) {
+    public static void saveDivItem(HuiFuCreateOrder o, String orderCode, String payCode) {
         CompanyDivItem companyDivItem = new CompanyDivItem();
         if (StringUtils.isNotBlank(o.getAcctSplitBunch())){
-            companyDivItem.setOrderCode(fsPackageOrder.getOrderSn());
-            companyDivItem.setPayCode(storePayment.getPayCode());
+            companyDivItem.setOrderCode(orderCode);
+            companyDivItem.setPayCode(payCode);
             companyDivItem.setDetail(o.getAcctSplitBunch());
             companyDivItem.setIsRefund(0); //支付
             companyDivItem.setIsDelay(0); //延迟分账

+ 10 - 1
fs-service/src/main/java/com/fs/qw/domain/QwExternalContactTransferLog.java

@@ -1,9 +1,14 @@
 package com.fs.qw.domain;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 转接记录对象 qw_external_contact_transfer_log
  *
@@ -11,7 +16,7 @@ import lombok.Data;
  * @date 2024-06-27
  */
 @Data
-public class QwExternalContactTransferLog extends BaseEntity
+public class QwExternalContactTransferLog
 {
     private static final long serialVersionUID = 1L;
 
@@ -46,6 +51,10 @@ public class QwExternalContactTransferLog extends BaseEntity
     @Excel(name = "状态")
     private Integer status;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
     private String takeoverUserId;
     private String handoverUserId;
     private Long qwUserId;

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

@@ -1,5 +1,7 @@
 package com.fs.qw.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwExternalContactTransferLog;
 import com.fs.qw.param.QwExternalContactTransferLogParam;
 import com.fs.qw.vo.QwExternalContactTransferLogListVO;
@@ -16,7 +18,7 @@ import java.util.List;
  * @date 2024-06-27
  */
 @Repository
-public interface QwExternalContactTransferLogMapper
+public interface QwExternalContactTransferLogMapper extends BaseMapper<QwExternalContactTransferLog>
 {
     /**
      * 查询转接记录

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

@@ -36,7 +36,7 @@ public interface QwUserVideoMapper
             "select quv.* from qw_user_video quv LEFT JOIN qw_user qu on quv.app_key=qu.app_key "+
             "where qu.is_del=0 and qu.company_user_id is not null and qu.app_key is not null "+
             "            <if test=\"data.qwUserName != null  and data.qwUserName != ''\"> and qu.qw_user_name like concat('%', #{data.qwUserName}, '%') </if>\n" +
-            "            <if test=\"data.nickname != null  and data.nickname != ''\"> and quv.nickname like concat('%', #{data.nickname}, '%') </if> " +
+            "            <if test=\"data.nickname != null  and data.nickname != ''\"> and quv.nick_name like concat('%', #{data.nickname}, '%') </if> " +
             "            <if test=\"data.companyId != null \"> and qu.company_id = #{data.companyId}</if>\n" +
             "</script>"})
     public List<QwUserVideoVO> selectQwUserVideoListVO(@Param("data") QwUserVideoParam param);

+ 3 - 0
fs-service/src/main/java/com/fs/qw/param/QwAutoTagsRulesTags.java

@@ -2,6 +2,7 @@ package com.fs.qw.param;
 
 import lombok.Data;
 
+import java.time.LocalDate;
 import java.util.List;
 
 @Data
@@ -12,4 +13,6 @@ public class QwAutoTagsRulesTags {
     private String endTime;
     private String remarks;
     private Integer isDay;
+    private Integer dayOrWeek;
+    private List<LocalDate> days;
 }

+ 3 - 1
fs-service/src/main/java/com/fs/qw/service/IQwExternalContactTransferLogService.java

@@ -1,6 +1,8 @@
 package com.fs.qw.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
+import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwExternalContactTransferLog;
 import com.fs.qw.param.QwExternalContactTransferLogParam;
 import com.fs.qw.vo.QwExternalContactTransferLogListVO;
@@ -13,7 +15,7 @@ import java.util.List;
  * @author fs
  * @date 2024-06-27
  */
-public interface IQwExternalContactTransferLogService
+public interface IQwExternalContactTransferLogService extends IService<QwExternalContactTransferLog>
 {
     /**
      * 查询转接记录

+ 174 - 0
fs-service/src/main/java/com/fs/qw/service/impl/AsyncQwExternalContactTransferService.java

@@ -0,0 +1,174 @@
+package com.fs.qw.service.impl;
+
+
+import com.fs.course.domain.FsUserCourse;
+import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.domain.QwExternalContactTransferLog;
+import com.fs.qw.mapper.QwExternalContactTransferLogMapper;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwExternalContactTransferLogService;
+import com.fs.qwApi.domain.QwGetTransferResult;
+import com.fs.qwApi.param.QwGetTransferParam;
+import com.fs.qwApi.service.QwApiService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@AllArgsConstructor
+public class AsyncQwExternalContactTransferService {
+
+    @Autowired
+    private QwExternalContactTransferLogMapper qwExternalContactTransferLogMapper;
+
+    @Autowired
+    private QwApiService qwApiService;
+
+    @Autowired
+    private IQwExternalContactService iQwExternalContactService;
+
+    @Autowired
+    private IQwExternalContactTransferLogService iQwExternalContactTransferLogService;
+
+    @Async("scheduledExecutorService")
+    public void syncQwExternalContactTransferLog(String corpId) {
+        try {
+            QwExternalContactTransferLog qwExternalContactTransferLog = new QwExternalContactTransferLog();
+            qwExternalContactTransferLog.setStatus(2);
+            qwExternalContactTransferLog.setCorpId(corpId);
+            List<QwExternalContactTransferLog> qwExternalContactTransferLogs = qwExternalContactTransferLogMapper.selectQwExternalContactTransferLogList(qwExternalContactTransferLog);
+
+            Map<String, List<QwExternalContactTransferLog>> groupedLogs = qwExternalContactTransferLogs.stream()
+                    .collect(Collectors.groupingBy(log ->
+                            log.getCorpId() + "/-/" + log.getTakeoverUserId() + "/-/" + log.getHandoverUserId()
+                    ));
+
+            for (Map.Entry<String, List<QwExternalContactTransferLog>> entry : groupedLogs.entrySet()) {
+
+
+                try {
+                    // 拆分key
+                    String[] keyParts = entry.getKey().split("/-/");
+                    String keyPartsCorpId = keyParts[0];
+                    String keyPartsTakeoverUserId = keyParts[1];
+                    String keyPartsHandoverUserId = keyParts[2];
+
+                    List<QwExternalContactTransferLog> transferLogListEntry = entry.getValue();
+
+
+                    QwGetTransferParam getTransferParam = new QwGetTransferParam();
+                    getTransferParam.setTakeover_userid(keyPartsTakeoverUserId);
+                    getTransferParam.setHandover_userid(keyPartsHandoverUserId);
+
+
+                    // 第一次请求游标为空
+                    String cursor = null;
+                    List<QwGetTransferResult.Customer> allCustomers = new ArrayList<>();
+
+                    int page = 0;
+                    do {
+                        page++;
+
+                        // 设置游标(第一次请求可能不需要设置或设为空)
+                        if (cursor != null) {
+                            getTransferParam.setCursor(cursor);
+                        }
+
+                        // 调用接口
+                        QwGetTransferResult transfer = qwApiService.getTransfer(getTransferParam, keyPartsCorpId);
+
+                        // 检查接口返回是否成功
+                        if (transfer.getErrcode() != 0) {
+                            log.error("获取转移记录失败: errcode={}, errmsg={}, takeover_userid={}, handover_userid={}",
+                                    transfer.getErrcode(), transfer.getErrmsg(),
+                                    keyPartsTakeoverUserId, keyPartsHandoverUserId);
+                            break;
+                        }
+
+                        // 获取当前页数据
+                        List<QwGetTransferResult.Customer> customers = transfer.getCustomer();
+                        if (customers != null && !customers.isEmpty()) {
+                            allCustomers.addAll(customers);
+                            log.info("第 {} 页获取到 {} 条转移记录", page, customers.size());
+                        } else {
+                            log.info("第 {} 页没有数据", page);
+                            // 如果没有数据,也退出循环
+                            break;
+                        }
+
+                        // 更新游标,准备下一次请求
+                        cursor = transfer.getNext_cursor();
+
+                        // 添加短暂延时,避免请求过快
+                        try {
+                            Thread.sleep(200);
+                        } catch (InterruptedException e) {
+                            Thread.currentThread().interrupt();
+                            break;
+                        }
+
+                        // 如果next_cursor为空或没有更多数据,则退出循环
+                    } while (cursor != null && !cursor.isEmpty() && !"0".equals(cursor));
+
+                    List<QwExternalContactTransferLog> transferLogList=new ArrayList<>();
+
+                    List<QwExternalContact> contactList = new ArrayList<>();
+
+
+                    Map<String, QwGetTransferResult.Customer> allCustomersMap = allCustomers.stream()
+                            .collect(Collectors.toMap(
+                                    QwGetTransferResult.Customer::getExternal_userid,
+                                    customer -> customer
+                            ));
+
+                    for (QwExternalContactTransferLog transferLog : transferLogListEntry) {
+
+                        QwGetTransferResult.Customer customer = allCustomersMap.get(transferLog.getExternalUserId());
+
+                        if (customer != null && customer.getStatus() != 2) {
+                            transferLog.setStatus(customer.getStatus());
+                            transferLogList.add(transferLog);
+
+                            QwExternalContact qwExternalContact = new QwExternalContact();
+                            qwExternalContact.setId(transferLog.getExternalContactId());
+                            qwExternalContact.setTransferStatus(customer.getStatus());
+
+                            if (customer.getStatus() == 1) {
+                                qwExternalContact.setUserId(transferLog.getTakeoverUserId());
+                                qwExternalContact.setQwUserId(transferLog.getQwUserId());
+                                qwExternalContact.setCompanyUserId(transferLog.getCompanyUserId());
+                            }
+                            contactList.add(qwExternalContact);
+                        }
+                    }
+
+                    if (!transferLogList.isEmpty()){
+                        log.info("更新{}条外部联系人转移日志",transferLogList.size());
+                        iQwExternalContactTransferLogService.updateBatchById(transferLogList,300);
+                    }
+                    if (!contactList.isEmpty()){
+                        log.info("更新{}条外部联系人",contactList.size());
+                        iQwExternalContactService.updateBatchById(contactList,300);
+                    }
+                }catch (Exception e){
+                    log.error("查询转接记录失败:"+entry);
+                }
+
+
+            }
+
+            log.info("转接记录同步成功");
+        } catch (Exception e){
+            e.printStackTrace();
+            log.info("转接记录同步失败");
+        }
+    }
+}

+ 53 - 15
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -67,6 +67,7 @@ import com.fs.system.service.ISysDictTypeService;
 import com.fs.voice.utils.StringUtil;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -95,7 +96,7 @@ import java.util.stream.Stream;
  * @date 2024-06-20
  */
 @Service
-
+@Slf4j
 public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactMapper, QwExternalContact> implements IQwExternalContactService {
 
     private static final String miniappRealLink = "/pages_course/video.html?course=";
@@ -2567,20 +2568,25 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                         qwAutoTagsLogs.setType(3L);
                         qwAutoTagsLogs.setQwUserid(qwUser.getId());
                         qwAutoTagsLogs.setExternalUserId(externalUserID);
-                            List<QwAutoTagsRulesTags> qwAutoTagsRulesTagsList = JSON.parseArray(qwAutoTags.getRulesTags(), QwAutoTagsRulesTags.class);
-                            // 获取今天的星期数
-                            DayOfWeek today = LocalDate.now().getDayOfWeek();
-                            int todayIndex = today.getValue(); // 1: Monday, 2: Tuesday, ..., 7: Sunday
-                            // 获取当前时间
-                            LocalTime now = LocalTime.now();
-                            // 遍历所有规则
-                            for (QwAutoTagsRulesTags rulesTags : qwAutoTagsRulesTagsList) {
-                                List<String> tagsItem = rulesTags.getTags();
-                                List<Integer> week = rulesTags.getWeek();
-                                String startTime = rulesTags.getStartTime();
-                                String endTime = rulesTags.getEndTime();
-                                String remarks = rulesTags.getRemarks();
-
+                        List<QwAutoTagsRulesTags> qwAutoTagsRulesTagsList = JSON.parseArray(qwAutoTags.getRulesTags(), QwAutoTagsRulesTags.class);
+                        LocalDate dateNow = LocalDate.now();
+                        // 获取今天的星期数
+                        DayOfWeek today = dateNow.getDayOfWeek();
+                        int todayIndex = today.getValue(); // 1: Monday, 2: Tuesday, ..., 7: Sunday
+                        // 获取当前时间
+                        LocalTime now = LocalTime.now();
+                        // 遍历所有规则
+                        for (QwAutoTagsRulesTags rulesTags : qwAutoTagsRulesTagsList) {
+                            List<String> tagsItem = rulesTags.getTags();
+                            List<Integer> week = rulesTags.getWeek();
+                            String startTime = rulesTags.getStartTime();
+                            String endTime = rulesTags.getEndTime();
+                            String remarks = rulesTags.getRemarks();
+                            Integer dayOrWeek = rulesTags.getDayOrWeek();
+                            boolean isWeek = dayOrWeek == null || dayOrWeek == 0;
+                            log.info("自动打标签规则:{}", JSON.toJSONString(rulesTags));
+                            if(isWeek){
+                                log.info("进入按星期打标签");
                                 // 检查今天是否在 week 集合中
                                 boolean isTodayInWeek = week.contains(todayIndex);
                                 // 转换时间字符串为 LocalTime
@@ -2591,6 +2597,37 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                                 // 如果当前时间和日期匹配规则,将 tagsItem 添加到 combinedTagsSet 中
                                 if (isTodayInWeek && isNowInTimeRange) {
 
+                                    combinedTagsSet.addAll(tagsItem);
+                                    combinedTagsItem.addAll(tagsItem);
+                                    isMatch = true;
+                                    if (rulesTags.getIsDay()!=null&&rulesTags.getIsDay()==1){
+                                        String DayDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd"));
+                                        tagRemark=DayDate.substring(1);
+                                    }
+                                    //如果备注不为空
+                                    if (rulesTags.getIsDay()!=null&&rulesTags.getIsDay()==1){
+                                        String DayDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd"));
+                                        tagRemark=DayDate.substring(1);
+                                    }
+                                    //如果备注不为空
+                                    if (!StringUtil.strIsNullOrEmpty(remarks)){
+                                        tagRemark = (tagRemark==null?"":(tagRemark+ "-") ) +remarks;
+                                    }
+                                }
+                            }else if(rulesTags.getDays() != null && rulesTags.getDays().size() == 2){
+                                log.info("进入按日期打标签");
+                                LocalDate startDate = rulesTags.getDays().get(0);
+                                LocalDate endDate = rulesTags.getDays().get(1);
+                                boolean isInRange = (dateNow.isEqual(startDate) || dateNow.isAfter(startDate))
+                                        && (dateNow.isEqual(endDate) || dateNow.isBefore(endDate));
+                                log.info("是否满足日期start:{},end:{},now:{},boolean:{}", startDate, endDate, dateNow, isInRange);
+                                // 转换时间字符串为 LocalTime
+                                LocalTime start = LocalTime.parse(startTime);
+                                LocalTime end = LocalTime.parse(endTime.equals("24:00") ? "23:59:59" : endTime);
+                                // 检查当前时间是否在 startTime 和 endTime 之间
+                                boolean isNowInTimeRange = !now.isBefore(start) && !now.isAfter(end);
+                                if (isInRange && isNowInTimeRange) {
+
                                     combinedTagsSet.addAll(tagsItem);
                                     combinedTagsItem.addAll(tagsItem);
                                     isMatch = true;
@@ -2609,6 +2646,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                                     }
                                 }
                             }
+                        }
                     }
 
                         // 如果有匹配的规则,使用 combinedTagsList

+ 130 - 19
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactTransferLogServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.qw.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.qw.domain.QwExternalContact;
@@ -7,15 +8,20 @@ import com.fs.qw.domain.QwExternalContactTransferLog;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwExternalContactTransferLogMapper;
 import com.fs.qw.param.QwExternalContactTransferLogParam;
+import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qw.service.IQwExternalContactTransferLogService;
 import com.fs.qw.vo.QwExternalContactTransferLogListVO;
 import com.fs.qwApi.domain.QwGetTransferResult;
 import com.fs.qwApi.param.QwGetTransferParam;
 import com.fs.qwApi.service.QwApiService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 转接记录Service业务层处理
@@ -23,8 +29,9 @@ import java.util.List;
  * @author fs
  * @date 2024-06-27
  */
+@Slf4j
 @Service
-public class QwExternalContactTransferLogServiceImpl implements IQwExternalContactTransferLogService
+public class QwExternalContactTransferLogServiceImpl extends ServiceImpl<QwExternalContactTransferLogMapper, QwExternalContactTransferLog> implements IQwExternalContactTransferLogService
 {
     @Autowired
     private QwExternalContactTransferLogMapper qwExternalContactTransferLogMapper;
@@ -33,6 +40,9 @@ public class QwExternalContactTransferLogServiceImpl implements IQwExternalConta
 
     @Autowired
     private QwExternalContactMapper qwExternalContactMapper;
+
+    @Autowired
+    private IQwExternalContactService iQwExternalContactService;
     /**
      * 查询转接记录
      *
@@ -108,34 +118,135 @@ public class QwExternalContactTransferLogServiceImpl implements IQwExternalConta
 
     @Override
     public R syncQwExternalContactTransferLog(String corpId) {
+
+        try {
         QwExternalContactTransferLog qwExternalContactTransferLog = new QwExternalContactTransferLog();
-//        qwExternalContactTransferLog.setCompanyId(companyId);
         qwExternalContactTransferLog.setStatus(2);
         List<QwExternalContactTransferLog> qwExternalContactTransferLogs = qwExternalContactTransferLogMapper.selectQwExternalContactTransferLogList(qwExternalContactTransferLog);
-        for (QwExternalContactTransferLog externalContactTransferLog : qwExternalContactTransferLogs) {
-            QwGetTransferParam getTransferParam = new QwGetTransferParam();
-            getTransferParam.setTakeover_userid(externalContactTransferLog.getTakeoverUserId());
-            getTransferParam.setHandover_userid(externalContactTransferLog.getHandoverUserId());
-            QwGetTransferResult transfer = qwApiService.getTransfer(getTransferParam, corpId);
-            List<QwGetTransferResult.Customer> customers = transfer.getCustomer();
-            for (QwGetTransferResult.Customer customer: customers) {
-                if (customer.getExternal_userid().equals(externalContactTransferLog.getExternalUserId())){
-                    if (customer.getStatus()!=2){
-                        externalContactTransferLog.setStatus(customer.getStatus());
-                        qwExternalContactTransferLogMapper.updateQwExternalContactTransferLog(externalContactTransferLog);
+
+        Map<String, List<QwExternalContactTransferLog>> groupedLogs = qwExternalContactTransferLogs.stream()
+                .collect(Collectors.groupingBy(log ->
+                        log.getCorpId() + "/-/" + log.getTakeoverUserId() + "/-/" + log.getHandoverUserId()
+                ));
+
+                for (Map.Entry<String, List<QwExternalContactTransferLog>> entry : groupedLogs.entrySet()) {
+
+
+            try {
+                // 拆分key
+                String[] keyParts = entry.getKey().split("/-/");
+                String keyPartsCorpId = keyParts[0];
+                String keyPartsTakeoverUserId = keyParts[1];
+                String keyPartsHandoverUserId = keyParts[2];
+
+                List<QwExternalContactTransferLog> transferLogListEntry = entry.getValue();
+
+
+                QwGetTransferParam getTransferParam = new QwGetTransferParam();
+                getTransferParam.setTakeover_userid(keyPartsTakeoverUserId);
+                getTransferParam.setHandover_userid(keyPartsHandoverUserId);
+
+
+                // 第一次请求游标为空
+                String cursor = null;
+                List<QwGetTransferResult.Customer> allCustomers = new ArrayList<>();
+
+                int page = 0;
+                do {
+                    page++;
+
+                    // 设置游标(第一次请求可能不需要设置或设为空)
+                    if (cursor != null) {
+                        getTransferParam.setCursor(cursor);
+                    }
+
+                    // 调用接口
+                    QwGetTransferResult transfer = qwApiService.getTransfer(getTransferParam, keyPartsCorpId);
+
+                    // 检查接口返回是否成功
+                    if (transfer.getErrcode() != 0) {
+                        log.error("获取转移记录失败: errcode={}, errmsg={}, takeover_userid={}, handover_userid={}",
+                                transfer.getErrcode(), transfer.getErrmsg(),
+                                keyPartsTakeoverUserId, keyPartsHandoverUserId);
+                        break;
+                    }
+
+                    // 获取当前页数据
+                    List<QwGetTransferResult.Customer> customers = transfer.getCustomer();
+                    if (customers != null && !customers.isEmpty()) {
+                        allCustomers.addAll(customers);
+                        log.info("第 {} 页获取到 {} 条转移记录", page, customers.size());
+                    } else {
+                        log.info("第 {} 页没有数据", page);
+                        // 如果没有数据,也退出循环
+                        break;
+                    }
+
+                    // 更新游标,准备下一次请求
+                    cursor = transfer.getNext_cursor();
+
+                    // 添加短暂延时,避免请求过快
+                    try {
+                        Thread.sleep(200);
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        break;
+                    }
+
+                    // 如果next_cursor为空或没有更多数据,则退出循环
+                } while (cursor != null && !cursor.isEmpty() && !"0".equals(cursor));
+
+                List<QwExternalContactTransferLog> transferLogList=new ArrayList<>();
+
+                List<QwExternalContact> contactList = new ArrayList<>();
+
+
+                Map<String, QwGetTransferResult.Customer> allCustomersMap = allCustomers.stream()
+                        .collect(Collectors.toMap(
+                                QwGetTransferResult.Customer::getExternal_userid,
+                                customer -> customer
+                        ));
+
+                for (QwExternalContactTransferLog transferLog : transferLogListEntry) {
+
+                    QwGetTransferResult.Customer customer = allCustomersMap.get(transferLog.getExternalUserId());
+
+                    if (customer != null && customer.getStatus() != 2) {
+                        transferLog.setStatus(customer.getStatus());
+                        transferLogList.add(transferLog);
+
                         QwExternalContact qwExternalContact = new QwExternalContact();
-                        qwExternalContact.setId(externalContactTransferLog.getExternalContactId());
+                        qwExternalContact.setId(transferLog.getExternalContactId());
                         qwExternalContact.setTransferStatus(customer.getStatus());
-                        if (customer.getStatus()==1){
-                            qwExternalContact.setUserId(externalContactTransferLog.getTakeoverUserId());
-                            qwExternalContact.setQwUserId(externalContactTransferLog.getQwUserId());
-                            qwExternalContact.setCompanyUserId(externalContactTransferLog.getCompanyUserId());
+
+                        if (customer.getStatus() == 1) {
+                            qwExternalContact.setUserId(transferLog.getTakeoverUserId());
+                            qwExternalContact.setQwUserId(transferLog.getQwUserId());
+                            qwExternalContact.setCompanyUserId(transferLog.getCompanyUserId());
                         }
-                        qwExternalContactMapper.updateQwExternalContact(qwExternalContact);
+                        contactList.add(qwExternalContact);
                     }
                 }
+
+                if (!transferLogList.isEmpty()){
+                    log.info("更新{}条外部联系人转移日志",transferLogList.size());
+                    super.updateBatchById(transferLogList,300);
+                }
+                if (!contactList.isEmpty()){
+                    log.info("更新{}条外部联系人",contactList.size());
+                    iQwExternalContactService.updateBatchById(contactList,300);
+                }
+            }catch (Exception e){
+                log.error("查询转接记录失败:"+entry);
             }
 
+
+        }
+
+                log.info("转接记录同步成功");
+            } catch (Exception e){
+            e.printStackTrace();
+            log.info("转接记录同步失败");
         }
         return null;
     }

+ 2 - 0
fs-service/src/main/java/com/fs/qw/vo/QwUserVO.java

@@ -94,4 +94,6 @@ public class QwUserVO {
     private String isAuto;
 
     private Long doctorId;
+
+    private Integer videoGetStatus;
 }

+ 22 - 0
fs-service/src/main/java/com/fs/tulin/JsonSortUtils.java

@@ -0,0 +1,22 @@
+package com.fs.tulin;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/22 上午9:59
+ */
+public class JsonSortUtils {
+
+    private static final ObjectMapper mapper = new ObjectMapper();
+
+    public static String toSortedJson(Object obj) {
+        try {
+            return mapper.writeValueAsString(obj); // 自动应用@JsonPropertyOrder
+        } catch (Exception e) {
+            throw new RuntimeException("JSON序列化失败", e);
+        }
+    }
+
+}

+ 49 - 0
fs-service/src/main/java/com/fs/tulin/PharmacyEnum.java

@@ -0,0 +1,49 @@
+package com.fs.tulin;
+
+/**
+ * @description: 这个后面要放到数据库去方便动态添加
+ * @author: Guos
+ * @time: 2025/10/22 上午9:41
+ */
+public enum PharmacyEnum {
+
+
+    YJKQS("药济康強昇专卖店"	,"ab0017b8-4961-4230-877e-e86fc1e96b3b", "prod"),
+
+    YJKJS("药济康匀善专卖店"	,"cbcdec50-ea88-448f-810d-3f2f1b809915", "prod"),
+
+    YJKYSY("药济康益寿缘专卖店","a8392536-7554-4e0a-9d12-20f856c94c55", "prod"),
+
+    YJKKM("药济康凯蒙专卖店"	,"517d85c4-e4d4-4a36-af7f-57097b59c650", "prod"),
+
+    YJKKMEB("药济康凯蒙二部专卖店","48e79523-3563-4252-a4a7-fdbcf4af4f34", "prod"),
+
+    YJKSST("药济康盛世堂专卖店","69cdae19-fbe6-4976-b9c2-611f9414440a", "prod"),
+
+    BDHD("保定弘德专卖店"	,"611edbf5-1e75-4f48-8171-533d60d50019", "prod"),
+
+    DEVCS("测试店铺"	,"26ee29ce-35aa-46c8-9650-3fe46014690c", "dev");
+
+    private String pharmacyName;
+
+    private String pharmacyId;
+
+    private String useEnvironment;
+
+    PharmacyEnum(String pharmacyName, String pharmacyId, String useEnvironment){
+        this.pharmacyName = pharmacyName;
+        this.pharmacyId = pharmacyId;
+        this.useEnvironment = useEnvironment;
+    }
+    public String getPharmacyId() {
+        return this.pharmacyId;
+    }
+
+    public String getPharmacyName() {
+        return this.pharmacyName;
+    }
+
+    public String getUseEnvironment() {
+        return this.useEnvironment;
+    }
+}

+ 83 - 0
fs-service/src/main/java/com/fs/tulin/StudentInfo.java

@@ -0,0 +1,83 @@
+package com.fs.tulin;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/22 上午9:15
+ */
+@Setter
+@Getter
+@Builder
+@ToString
+@JsonPropertyOrder(alphabetic = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StudentInfo {
+
+     /**
+      * 必填 union_id
+      * 小程序union_id
+      */
+     private String union_id;
+
+     /**
+      * 必填 open_id
+      * 小程序open_id
+      */
+     private String open_id;
+
+     /**
+      * 必填 appid
+      * 微信小程序appid
+      */
+     private String appid;
+
+     /**
+      * 必填 nickname
+      * 昵称
+      */
+     private String nickname;
+
+     /**
+      * 必填 column_name
+      * 栏目名称
+      */
+     private String column_name;
+
+     /**
+      * 必填 pharmacy_id
+      * 药店ID
+      */
+     private String pharmacy_id;
+
+     /**
+      * 必填 service_phone
+      * 客服手机号
+      */
+     private String service_phone;
+
+     /**
+      * 可选 period_name
+      * 学员所属期名称(可选)
+      */
+     private String period_name;
+
+     /**
+      * 可选 name
+      * 学员名称(可选)
+      */
+     private String name;
+
+     /**
+      * 可选 avatar
+      * 学员头像 (可选)
+      */
+     private String avatar;
+
+}

+ 182 - 0
fs-service/src/main/java/com/fs/tulin/SyncStudentInfoService.java

@@ -0,0 +1,182 @@
+package com.fs.tulin;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+import java.util.logging.Logger;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/21 下午3:40
+ */
+public class SyncStudentInfoService {
+
+
+    private static final Logger logger = Logger.getLogger(SyncStudentInfoService.class.getName());
+    /**
+     * 密钥
+     */
+    private static final String SECRET_KEY = "xysync_dLsSaheCzK7RU9gd";
+
+    /**
+     * 测试药店ID
+     */
+    private static final String PHARMACY_ID = "26ee29ce-35aa-46c8-9650-3fe46014690c";
+
+    /**
+     * 测试企业ID
+     */
+    private static final String CORP_ID = "PNBnO6MajM0tAd8t";
+
+
+    public static void main(String[] args) throws JsonProcessingException {
+//第一种方式
+//        Map<String, Object> requestBody = new HashMap<>();
+//        requestBody.put("corp_id", "PNBnO6MajM0tAd8t");
+//        List<Map<String, Object>> dataList = new ArrayList<>();
+//        Map<String, Object> dataItem = new HashMap<>();
+//        dataItem.put("union_id", "oLH_O648dcNgoZdQT4CN2Qft8i7k");
+//        dataItem.put("open_id", "ozzk-19AxQC5D3X9Wqpb-I3_Y3EQ");
+//        dataItem.put("appid", "wx6688e6b9b6fb8700");
+//        dataItem.put("nickname", "@冰阔落");
+//        dataItem.put("column_name", "测试栏目0921");
+//        dataItem.put("pharmacy_id", "26ee29ce-35aa-46c8-9650-3fe46014690c");
+//        dataItem.put("service_phone", "13760648472");
+//        dataList.add(dataItem);
+//        String sort = sortRequestBody(dataItem);
+//        requestBody.put("data", dataList);
+//      // 生成签名
+//        long timestamp = generateTimestamp();
+//        String sign = generateSign("PNBnO6MajM0tAd8t", sort, timestamp);
+//        System.out.println("时间戳: " + timestamp);
+//        System.out.println("签名: " + sign);
+//        // 构建完整的请求URL          "https://api.xiangyue.life/api/v1/mp/sync/student
+//        String url = String.format("https://api.xiangyue.life/api/v1/mp/sync/student?sign=%s&t=%d", sign, timestamp);
+//        HttpRequest httpRequest = HttpUtil.createPost(url);
+//        httpRequest.header("Content-Type", "application/json");
+//        System.out.println("url: " + url);
+//        System.out.println("排序后的"+sortRequestBody(requestBody));
+//        httpRequest.body(sortRequestBody(requestBody));
+//        HttpResponse execute = httpRequest.execute();
+//        String body = execute.body();
+//        System.out.println("响应结果: " + body);
+//第二种方式
+//        StudentInfo student = StudentInfo.builder()
+//                .union_id("oLH_O648dcNgoZdQT4CN2Qft8i7k")
+//                .open_id("ozzk-19AxQC5D3X9Wqpb-I3_Y3EQ")
+//                .appid("wx6688e6b9b6fb8700")
+//                .nickname("@冰阔落")
+//                .column_name("测试栏目0921")
+//                .pharmacy_id(PHARMACY_ID).service_phone("13760648472").build();
+//        //排序
+//        String sortedJson = JsonSortUtils.toSortedJson(student);
+//        long timestamp = generateTimestamp();
+//        String sign = generateSign(CORP_ID, sortedJson, timestamp);
+//        String url = String.format("https://api.xiangyue.life/api/v1/mp/sync/student?sign=%s&t=%d", sign, timestamp);
+//        Map<String, Object> request = new HashMap<>();
+//        request.put("corp_id", CORP_ID);
+//        request.put("data", Collections.singletonList(student));
+//        String jsonBody = mapper.writeValueAsString(request);
+//        System.out.println("正确JSON:");
+//        System.out.println(jsonBody);
+//        sendHttpPost(url, jsonBody);
+
+        StudentInfo student = StudentInfo.builder()
+                .union_id("oLH_O648dcNgoZdQT4CN2Qft8i7k")
+                .open_id("ozzk-19AxQC5D3X9Wqpb-I3_Y3EQ")
+                .appid("wx6688e6b9b6fb8700")
+                .nickname("@冰阔落")
+                .column_name("测试栏目0921")
+                .pharmacy_id(PHARMACY_ID).service_phone("13760648472").build();
+        String result = send(CORP_ID, student);
+    }
+
+    /**
+     * @param corpId 企业ID
+     * @param studentInfo 学生信息对象
+     * @return 请求结果
+     * @throws JsonProcessingException
+     */
+    public static String send(String corpId, StudentInfo studentInfo) throws JsonProcessingException {
+        String sortedJson = JsonSortUtils.toSortedJson(studentInfo);
+        long timestamp = generateTimestamp();
+        String sign = generateSign(corpId, sortedJson, timestamp);
+        String url = String.format("https://api.xiangyue.life/api/v1/mp/sync/student?sign=%s&t=%d", sign, timestamp);
+        Map<String, Object> request = new HashMap<>();
+        request.put("corp_id", corpId);
+        request.put("data", Collections.singletonList(studentInfo));
+        String jsonBody = JsonSortUtils.toSortedJson(request);
+        return sendHttpPost(url, jsonBody);
+    }
+
+    /**
+     * 发送HTTP POST请求
+     * @param url 请求URL
+     * @param jsonBody 请求体JSON字符串
+     * @return 响应结果
+     */
+    private static String sendHttpPost(String url, String jsonBody) {
+        logger.info("云联学生信息同步接口");
+        logger.info("请求URL:"+ url);
+        logger.info("请求Body:"+ jsonBody);
+        HttpRequest httpRequest = HttpUtil.createPost(url);
+        httpRequest.header("Content-Type", "application/json");
+        httpRequest.body(jsonBody);
+        HttpResponse execute = httpRequest.execute();
+        String result = execute.body();
+        logger.info("请求结果:"+ result);
+        return result;
+    }
+
+    /**
+     * 生成签名,在这里去组装成数组的样子,然后进行MD5加密
+     * @param corpId 企业ID
+     * @param sortStr 请求体对象
+     * @param timestamp 时间戳(秒级)
+     * @return 32位小写MD5签名
+     */
+    private static String generateSign(String corpId, Object sortStr, long timestamp) {
+        try {
+            String signString = SECRET_KEY + corpId + "["+sortStr+"]" + timestamp;
+            return generateMD5(signString);
+        } catch (Exception e) {
+            throw new RuntimeException("生成签名失败", e);
+        }
+    }
+
+    /**
+     * 生成MD5哈希值
+     */
+    private static String generateMD5(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] hash = md.digest(input.getBytes());
+            // 转换为16进制小写字符串
+            StringBuilder hexString = new StringBuilder();
+            for (byte b : hash) {
+                String hex = Integer.toHexString(0xff & b);
+                if (hex.length() == 1) {
+                    hexString.append('0');
+                }
+                hexString.append(hex);
+            }
+            return hexString.toString();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("MD5算法不可用", e);
+        }
+    }
+
+    /**
+     * 生成当前时间戳(秒级)
+     */
+    private static long generateTimestamp() {
+        return System.currentTimeMillis() / 1000;
+    }
+
+}

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

@@ -33,6 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDelay != null "> and is_delay = #{isDelay}</if>
             <if test="isRefund != null "> and is_refund = #{isRefund}</if>
         </where>
+        order by id desc
     </select>
 
     <select id="selectCompanyDivItemById" parameterType="Long" resultMap="CompanyDivItemResult">

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

@@ -66,9 +66,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="callerNo" column="caller_no"/>
         <result property="isNeedRegisterMember"    column="is_need_register_member" />
         <result property="isAllowedAllRegister"    column="is_allowed_all_register" />
-        <collection property="roleNames" ofType="java.lang.String" javaType="java.util.ArrayList">
-            <result column="role_name"/>
-        </collection>
+        <collection property="roleNames" ofType="java.lang.String" javaType="java.util.ArrayList"
+                    select="selectUserRoles" column="user_id"/>
     </resultMap>
 
     <resultMap id="deptResult" type="CompanyDept">
@@ -97,19 +96,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         u.avatar,
         u.qw_user_id,
         d.dept_name,
-        d.leader,
-        cr.role_name as role_name
+        d.leader
         from
         company_user u
         left join
         company_dept d on u.dept_id = d.dept_id
-        left join
-        company_user_role cur on u.user_id = cur.user_id
-        left join
-        company_role cr on cr.role_id = cur.role_id
+
         where
         u.del_flag = '0'
-
+        <if test="userId != null ">
+            AND u.user_id = #{userId}
+        </if>
         <if test="userName != null and userName != ''">
             AND u.user_name like concat('%', #{userName}, '%')
         </if>
@@ -150,6 +147,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ${params.dataScope}
     </select>
 
+    <!-- 角色子查询 -->
+    <select id="selectUserRoles" resultType="java.lang.String">
+        SELECT cr.role_name
+        FROM company_user_role cur
+                 LEFT JOIN company_role cr ON cr.role_id = cur.role_id
+        WHERE cur.user_id = #{userId}
+    </select>
+
 
     <select id="selectCompanyUserList" parameterType="CompanyUser" resultMap="CompanyUserResult">
         select u.*, d.dept_name, d.leader from company_user u

+ 54 - 2
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -71,7 +71,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          LEFT JOIN qw_external_contact qec on l.qw_external_contact_id = qec.id
         <where>
             <if test ='maps.isVip != null and maps.isVip == 0'>
-                and (l.user_id = #{maps.isVip} or l.user_id is null)
+                and (l.user_id = 0 or l.user_id is null)
             </if>
             <if test ='maps.isVip != null and maps.isVip == 1'>
                 and l.user_id != 0 and l.user_id is not null
@@ -158,7 +158,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.qwUserName != null  and maps.qwUserName != '' ">
                 and qu.qw_user_name = #{maps.qwUserName}
             </if>
-
+            <if test='maps.cuDeptIdList != null and !maps.cuDeptIdList.isEmpty() and  maps.userType != "00" '>
+                AND cu.dept_id IN
+                <foreach collection='maps.cuDeptIdList' item='item' open='(' separator=',' close=')'>
+                    #{item}
+                </foreach>
+            </if>
         </where>
          order by l.finish_time desc,l.update_time desc,l.create_time desc
     </select>
@@ -863,4 +868,51 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where ucp.training_camp_id = #{trainingCampId}
     </select>
 
+    <select id="selectFsCourseWatchLogStatisticsListByCompanyVO"
+            resultType="com.fs.course.vo.FsCourseWatchLogStatisticsListByCompanyVO">
+        SELECT
+        o.video_id,
+        o.company_id,
+        comp.company_name,
+        o.qw_user_id,
+        DATE(o.create_time) create_time,
+        v.title videoName,
+        uc.course_name,
+        SUM(CASE WHEN o.log_type = '1' THEN 1 ELSE 0 END) AS type1,
+        SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END) AS type2,
+        SUM(CASE WHEN o.log_type = '3' THEN 1 ELSE 0 END) AS type3,
+        SUM(CASE WHEN o.log_type = '4' THEN 1 ELSE 0 END) AS type4
+        FROM
+        fs_course_watch_log o
+        LEFT JOIN fs_user_course_video v ON v.video_id = o.video_id
+        LEFT JOIN company comp ON comp.company_id = o.company_id
+        LEFT JOIN qw_user qu ON qu.id = o.qw_user_id
+        LEFT JOIN fs_user_course uc ON uc.course_id = v.course_id
+        <where>
+            <if test="sendType != null">
+                and send_type = #{sendType}
+            </if>
+            <if test="companyId != null">
+                and o.company_id = #{companyId}
+            </if>
+            <if test="sTime != null">
+                AND DATE (o.create_time) &gt;= DATE (#{sTime})
+            </if>
+            <if test="eTime != null">
+                AND DATE (o.create_time) &lt;= DATE (#{eTime})
+            </if>
+            <if test="courseId != null">
+                and o.course_id = #{courseId}
+            </if>
+            <if test="videoId != null">
+                and o.video_id = #{videoId}
+            </if>
+        </where>
+        GROUP BY
+            DATE (o.create_time),
+            o.company_id
+        ORDER BY
+        comp.company_id,
+            DATE (o.create_time)
+    </select>
 </mapper>

+ 7 - 0
fs-service/src/main/resources/mapper/sop/QwSopTempMapper.xml

@@ -43,6 +43,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="sort != null "> and sort = #{sort}</if>
             <if test="companyId != null "> and company_id = #{companyId}</if>
             <if test="sendType != null "> and send_type = #{sendType}</if>
+            <if test="createBy != null "> and create_by = #{createBy}</if>
+            <if test="cuDeptIdList != null and !cuDeptIdList.isEmpty()">
+                AND create_by_dept IN
+                <foreach collection='cuDeptIdList' item='item' open='(' separator=',' close=')'>
+                    #{item}
+                </foreach>
+            </if>
         </where>
         order by sort,create_time desc
     </select>

+ 13 - 6
fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java

@@ -6,10 +6,7 @@ import com.fs.company.service.ICompanyDivItemService;
 import com.fs.course.service.IFsCourseProductOrderService;
 import com.fs.course.service.IFsUserCourseOrderService;
 import com.fs.course.service.IFsUserVipOrderService;
-import com.fs.his.service.IFsInquiryOrderService;
-import com.fs.his.service.IFsIntegralOrderService;
-import com.fs.his.service.IFsPackageOrderService;
-import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.service.*;
 import com.fs.huifuPay.domain.HuiFuOnlinePay;
 import com.fs.huifuPay.domain.HuiFuOnlineRefund;
 import com.fs.huifuPay.domain.HuiFuResult;
@@ -36,6 +33,8 @@ public class HuifuPayController {
     private IFsIntegralOrderService integralOrderService;
     @Autowired
     private IFsCourseProductOrderService courseProductOrderService;
+    @Autowired
+    private IFsStorePaymentService storePaymentService;
 
     org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
     @Autowired
@@ -104,15 +103,23 @@ public class HuifuPayController {
                         logger.error("-------分账明细回调错误{}", e.getMessage());
                     }
                     break;
+                case "payment":
+                    storePaymentService.payConfirm(orderId[1],huiFuResult.getHf_seq_id(),huiFuResult.getOut_trans_id(),huiFuResult.getParty_order_id());
+                    try {
+                        updateDivItem(orderId[1]);
+                    } catch (Exception e) {
+                        logger.error("-------分账明细回调错误{}", e.getMessage());
+                    }
+                    break;
             }
         }
 
         return "ok";
     }
 
-    private void updateDivItem(String orderId) {
+    private void updateDivItem(String payCode) {
         //修改分账状态
-        CompanyDivItem companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(orderId);
+        CompanyDivItem companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payCode);
         if (companyDivItem != null) {
             companyDivItem.setIsPay(1);
             companyDivItemService.updateCompanyDivItem(companyDivItem);