ソースを参照

Merge branch 'master' into 红德堂APP调试

Long 8 時間 前
コミット
5980cb70b9
100 ファイル変更2723 行追加350 行削除
  1. 25 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyUserController.java
  2. 42 3
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  3. 11 7
      fs-admin/src/main/java/com/fs/his/controller/FsUserController.java
  4. 14 0
      fs-admin/src/main/java/com/fs/his/task/FsCourseTask.java
  5. 65 13
      fs-admin/src/main/java/com/fs/his/task/Task.java
  6. 57 0
      fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java
  7. 199 0
      fs-admin/src/main/java/com/fs/stats/SalesWatchStatisController.java
  8. 11 0
      fs-company-app/src/main/java/com/fs/app/controller/CommonController.java
  9. 11 5
      fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java
  10. 29 3
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  11. 2 1
      fs-company/src/main/java/com/fs/company/controller/company/CompanyMenuController.java
  12. 12 0
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java
  13. 52 22
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java
  14. 53 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  15. 35 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferLogController.java
  16. 37 4
      fs-company/src/main/java/com/fs/company/controller/qw/QwFriendWelcomeController.java
  17. 59 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatController.java
  18. 71 14
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopController.java
  19. 35 4
      fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java
  20. 1 1
      fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsController.java
  21. 207 0
      fs-company/src/main/java/com/fs/company/controller/stats/SalesWatchStatisController.java
  22. 40 1
      fs-company/src/main/java/com/fs/company/controller/store/FsStoreOrderController.java
  23. 1 1
      fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java
  24. 1 0
      fs-company/src/main/java/com/fs/framework/config/DataSourceConfig.java
  25. 44 5
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  26. 1 0
      fs-framework/src/main/java/com/fs/framework/config/DataSourceConfig.java
  27. 1 0
      fs-qw-api/src/main/java/com/fs/framework/config/DataSourceConfig.java
  28. 39 0
      fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java
  29. 1 1
      fs-qw-task/src/main/java/com/fs/app/task/CourseWatchLogScheduler.java
  30. 1 1
      fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java
  31. 34 18
      fs-qw-task/src/main/java/com/fs/app/task/qwTask.java
  32. 21 9
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  33. 6 23
      fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java
  34. 6 23
      fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  35. 1 0
      fs-qwhook-sop/src/main/java/com/fs/framework/config/DataSourceConfig.java
  36. 6 23
      fs-qwhook/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java
  37. 6 23
      fs-qwhook/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  38. 1 0
      fs-qwhook/src/main/java/com/fs/framework/config/DataSourceConfig.java
  39. 5 0
      fs-service/src/main/java/com/fs/company/cache/ICompanyDeptCacheService.java
  40. 5 0
      fs-service/src/main/java/com/fs/company/cache/ICompanyUserCacheService.java
  41. 27 0
      fs-service/src/main/java/com/fs/company/cache/impl/CompanyDeptCacheServiceImpl.java
  42. 31 0
      fs-service/src/main/java/com/fs/company/cache/impl/CompanyUserCacheServiceImpl.java
  43. 28 6
      fs-service/src/main/java/com/fs/company/mapper/CompanyDeptMapper.java
  44. 10 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java
  45. 2 2
      fs-service/src/main/java/com/fs/company/mapper/CompanyRoleMapper.java
  46. 1 1
      fs-service/src/main/java/com/fs/company/mapper/CompanyTagMapper.java
  47. 22 1
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  48. 5 0
      fs-service/src/main/java/com/fs/company/service/ICompanyDeptService.java
  49. 13 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  50. 16 6
      fs-service/src/main/java/com/fs/company/service/impl/CompanyDeptServiceImpl.java
  51. 8 4
      fs-service/src/main/java/com/fs/company/service/impl/CompanyMenuServiceImpl.java
  52. 2 2
      fs-service/src/main/java/com/fs/company/service/impl/CompanyRoleServiceImpl.java
  53. 454 9
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  54. 7 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyTagUserServiceImpl.java
  55. 8 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  56. 22 0
      fs-service/src/main/java/com/fs/company/vo/DeptDataVO.java
  57. 3 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseAnswerLogs.java
  58. 1 1
      fs-service/src/main/java/com/fs/course/domain/FsCourseRealLink.java
  59. 2 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseRedPacketLog.java
  60. 2 0
      fs-service/src/main/java/com/fs/course/domain/FsVideoResource.java
  61. 1 1
      fs-service/src/main/java/com/fs/course/mapper/FsCourseLinkMapper.java
  62. 13 1
      fs-service/src/main/java/com/fs/course/mapper/FsCourseRedPacketLogMapper.java
  63. 7 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  64. 1 1
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoMapper.java
  65. 1 0
      fs-service/src/main/java/com/fs/course/param/FsCourseLinkRoomParam.java
  66. 1 0
      fs-service/src/main/java/com/fs/course/param/FsCourseQuestionAnswerUParam.java
  67. 17 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  68. 2 0
      fs-service/src/main/java/com/fs/course/param/FsUserCourseVideoAddKfUParam.java
  69. 4 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseLinkService.java
  70. 3 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseRedPacketLogService.java
  71. 117 15
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java
  72. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java
  73. 84 1
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseRedPacketLogServiceImpl.java
  74. 1 1
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  75. 6 3
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  76. 175 52
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  77. 2 0
      fs-service/src/main/java/com/fs/course/vo/FsVideoResourceVO.java
  78. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  79. 12 10
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  80. 2 2
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java
  81. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java
  82. 1 1
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  83. 77 19
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  84. 10 0
      fs-service/src/main/java/com/fs/his/vo/FsUserVO.java
  85. 60 0
      fs-service/src/main/java/com/fs/qw/cache/QwSopCacheService.java
  86. 61 0
      fs-service/src/main/java/com/fs/qw/cache/QwUserCacheService.java
  87. 12 0
      fs-service/src/main/java/com/fs/qw/dto/QwUserDTO.java
  88. 3 0
      fs-service/src/main/java/com/fs/qw/mapper/CustomerTransferApprovalMapper.java
  89. 6 1
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  90. 6 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactTransferLogMapper.java
  91. 6 0
      fs-service/src/main/java/com/fs/qw/mapper/QwFriendWelcomeMapper.java
  92. 6 0
      fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatMapper.java
  93. 39 0
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  94. 11 0
      fs-service/src/main/java/com/fs/qw/param/QwExternalContactParam.java
  95. 12 0
      fs-service/src/main/java/com/fs/qw/param/QwExternalContactTransferLogParam.java
  96. 11 0
      fs-service/src/main/java/com/fs/qw/param/QwFriendWelcomeParam.java
  97. 10 0
      fs-service/src/main/java/com/fs/qw/param/QwGroupChatParam.java
  98. 15 0
      fs-service/src/main/java/com/fs/qw/param/QwUserListParam.java
  99. 5 0
      fs-service/src/main/java/com/fs/qw/service/ICustomerTransferApprovalService.java
  100. 1 2
      fs-service/src/main/java/com/fs/qw/service/IQwGroupChatService.java

+ 25 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyUserController.java

@@ -136,4 +136,29 @@ public class CompanyUserController extends BaseController
         List<CompanyUser> list = companyUserService.selectCompanyUserList(map);
         return  R.ok().put("data",list);
     }
+
+    /**
+     * 更换会员归属销售
+     * @return
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyUser:change')")
+    @Log(title = "更换会员归属", businessType = BusinessType.OTHER)
+    @PostMapping("/changeCompanyUser")
+    public AjaxResult changeCompanyUser(@RequestBody List<Long> userIds, @RequestParam Long companyUserId, @RequestParam Long companyId)
+    {
+        return toAjax(companyUserService.changeCompanyUser(userIds, companyUserId, companyId));
+    }
+    /**
+     * 根据登录的用户公司获取所有的销售
+     * @return
+     */
+    @GetMapping("/getCompanyUserList")
+    public R getCompanyUserList(@RequestParam Long companyId)
+    {
+        CompanyUser cu = new CompanyUser();
+        cu.setCompanyId(companyId);
+        List<CompanyUser> list = companyUserService.selectCompanyUserList(cu);
+        return  R.ok().put("data",list);
+    }
+
 }

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

@@ -21,6 +21,7 @@ import com.fs.erp.dto.ErpOrderQueryRequert;
 import com.fs.erp.dto.ErpOrderQueryResponse;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.framework.web.service.TokenService;
+import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.dto.ExpressInfoDTO;
 import com.fs.his.dto.StoreOrderExpressExportDTO;
@@ -31,8 +32,10 @@ import com.fs.his.param.FsStoreOrderSalesParam;
 import com.fs.his.service.IFsExportTaskService;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsStoreService;
+import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.*;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -72,6 +75,15 @@ public class FsStoreOrderController extends BaseController
     private IFsStoreService fsStoreService;
     @Autowired
     private IFsExportTaskService exportTaskService;
+    @Autowired
+    private ConfigUtil configUtil;
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
     /**
      * 查询订单列表
      */
@@ -194,8 +206,6 @@ public class FsStoreOrderController extends BaseController
     /**
      * 获取订单详细信息
      */
-    @Autowired
-    IErpOrderService erpOrderService;
     @GetMapping(value = "/{orderId}")
     public R getInfo(@PathVariable("orderId") Long orderId) throws ParseException {
         FsStoreOrderVO order = fsStoreOrderService.selectFsStoreOrderByOrderIdVO(orderId);
@@ -317,6 +327,7 @@ public class FsStoreOrderController extends BaseController
     public R updateErpOrder( @RequestBody FsStoreOrder param) {
         FsStoreOrder order = fsStoreOrderService.selectFsStoreOrderByOrderId(param.getOrderId());
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+        IErpOrderService erpOrderService = getErpService();
         request.setCode(order.getExtendOrderId());
         ErpOrderQueryResponse response = erpOrderService.getOrder(request);
         if(response.getOrders()!=null&&response.getOrders().size()>0){
@@ -336,6 +347,29 @@ public class FsStoreOrderController extends BaseController
         return R.error("未查询到快递信息");
     }
 
+    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;
+                }
+                return erpOrderService;
+
+
+            }
+        }
+        return null;
+    }
+
     /**
      * 删除订单
      */
@@ -459,7 +493,12 @@ public class FsStoreOrderController extends BaseController
     public R getEroOrder(@PathVariable("extendOrderId") String extendOrderId) {
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(extendOrderId);
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        IErpOrderService erpOrderService = getErpService();
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+        if (erpOrderService!=null){
+            response = erpOrderService.getOrder(request);
+        }
+
         return R.ok().put("data",response);
     }
 

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

@@ -4,6 +4,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.utils.ParseUtils;
@@ -196,15 +197,18 @@ public class FsUserController extends BaseController
     @ApiOperation("小黑屋")
     public R darkRoomList(FsUserPageListParam param) {
 //        startPage();
-        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+//        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
-        for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOPageInfo.getList()) {
-            fsUserPageListVO.setPhone(ParseUtils.parsePhone(fsUserPageListVO.getPhone()));
+        if(ObjectUtils.isNotNull(fsUserPageListVOPageInfo)){
+            for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOPageInfo.getList()) {
+                fsUserPageListVO.setPhone(ParseUtils.parsePhone(fsUserPageListVO.getPhone()));
+            }
+            Map<String, Object> map = new HashMap<String, Object>();
+            map.put("rows", fsUserPageListVOPageInfo.getList());
+            map.put("total", fsUserPageListVOPageInfo.getList().size());
+            return R.ok(map);
         }
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("rows", fsUserPageListVOPageInfo.getList());
-        map.put("total", fsUserPageListVOPageInfo.getList().size());
-        return R.ok(map);
+        return R.ok();
     }
 
     @PreAuthorize("@ss.hasPermi('his:user:enabledUsers')")

+ 14 - 0
fs-admin/src/main/java/com/fs/his/task/FsCourseTask.java

@@ -1,7 +1,9 @@
 package com.fs.his.task;
 
 import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.qw.service.ICustomerTransferApprovalService;
 import com.fs.qw.service.IHyWorkTaskService;
+import com.fs.statis.service.FsStatisSalerWatchService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -16,6 +18,11 @@ public class FsCourseTask {
     private IFsCourseWatchLogService fsCourseWatchLogService;
     @Autowired
     private IHyWorkTaskService hyWorkTaskService;
+
+    @Autowired
+    private FsStatisSalerWatchService fsStatisSalerWatchService;
+    @Autowired
+    private ICustomerTransferApprovalService customerTransferApprovalService;
     /**
      * 添加会员观看日志
      * @throws Exception
@@ -44,4 +51,11 @@ public class FsCourseTask {
         hyWorkTaskService.hyWorkTask();
     }
 
+    /**
+     * 客户转移审批自动通过
+     */
+    public void fsUserTransferAutoPass(){
+        customerTransferApprovalService.autoApprovePass();
+    }
+
 }

+ 65 - 13
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -21,6 +21,7 @@ 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.his.config.FsSysConfig;
 import com.fs.his.config.StoreConfig;
 import com.fs.his.domain.FsInquiryOrder;
 import com.fs.his.domain.FsStoreAfterSales;
@@ -33,6 +34,7 @@ import com.fs.his.mapper.*;
 import com.fs.his.param.FsInquiryOrderFinishParam;
 import com.fs.his.service.*;
 import com.fs.his.service.impl.FsPackageOrderServiceImpl;
+import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsSubOrderResultVO;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
@@ -45,6 +47,7 @@ import com.google.gson.Gson;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
@@ -72,8 +75,8 @@ public class Task {
     private IFsFollowService fsFollowService;
     @Autowired
     private IFsStoreAfterSalesService fsStoreAfterSalesService;
-    @Autowired
-    IErpOrderService erpOrderService;
+//    @Autowired
+//    IErpOrderService erpOrderService;
     @Autowired
     FsIntegralOrderMapper integralOrderMapper;
     @Autowired
@@ -139,6 +142,8 @@ public class Task {
 
     @Autowired
     ITencentCloudCosService tencentCloudCosService;
+    @Autowired
+    private ConfigUtil configUtil;
     public void videoTranscode() throws Exception
     {
 
@@ -199,6 +204,14 @@ public class Task {
     }
 
 
+    public void redPacketAddMoney() throws Exception
+    {
+        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseAddRedPacketLogByCompany();
+        for (RedPacketMoneyVO redPacketMoneyVO : redPacketMoneyVOS) {
+            companyService.addRedPacketCompanyMoney(redPacketMoneyVO.getMoney(),redPacketMoneyVO.getCompanyId());
+        }
+    }
+
     public void updateCompanyUserStatus()
     {
         CompanyUser user = new CompanyUser();
@@ -232,27 +245,37 @@ public class Task {
 
     public void deliveryOp()
     {
-        List<FsStoreOrder> orders = fsStoreOrderMapper.selectOmsOrderdeliveryOp();
+        IErpOrderService erpOrderService = getErpService();
+        List<FsStoreOrder> orders = null;
+        if (erpOrderService == gyOrderService){
+            orders = fsStoreOrderMapper.selectOmsOrderdeliveryOp();
+        } else if (erpOrderService == wdtOrderService){
+            orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOp();
+        }
+
         for(FsStoreOrder order:orders){
 
             ErpOrderQueryRequert request=new ErpOrderQueryRequert();
 
             request.setCode(order.getExtendOrderId());
-            ErpOrderQueryResponse response=erpOrderService.getOrder(request);
-            if(response.getOrders()!=null&&response.getOrders().size()>0){
-                for(ErpOrderQuery orderQuery : response.getOrders()){
-                    if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
-                        for(ErpDeliverys delivery:orderQuery.getDeliverys()){
-                            if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
-                                //更新商订单状态 删除REDIS
-                                fsStoreOrderService.deliveryOrder(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
-                                redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+            if (erpOrderService != null){
+                ErpOrderQueryResponse response=erpOrderService.getOrder(request);
+                if(response.getOrders()!=null&&response.getOrders().size()>0){
+                    for(ErpOrderQuery orderQuery : response.getOrders()){
+                        if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
+                            for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                                if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
+                                    //更新商订单状态 删除REDIS
+                                    fsStoreOrderService.deliveryOrder(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                    redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+                                }
                             }
-                        }
 
+                        }
                     }
                 }
             }
+
         }
 
 
@@ -958,4 +981,33 @@ public class Task {
 //    }
 //
 //}
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+    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;
+                }
+                return erpOrderService;
+
+
+            }
+        }
+        return null;
+    }
 }

+ 57 - 0
fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java

@@ -7,11 +7,15 @@ import com.fs.qw.service.IQwUserService;
 import com.fs.sop.service.impl.QwSopLogsServiceImpl;
 import com.fs.sop.service.impl.QwSopServiceImpl;
 import com.fs.sop.service.ISopUserLogsService;
+import com.fs.statis.IFsStatisQwWatchService;
+import com.fs.statis.service.FsStatisSalerWatchService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDate;
+
 @Component("qwTask")
 public class qwTask {
 
@@ -35,6 +39,13 @@ public class qwTask {
     @Autowired
     private IQwUserService qwUserService;
 
+
+    @Autowired
+    private FsStatisSalerWatchService fsStatisSalerWatchService;
+
+    @Autowired
+    private IFsStatisQwWatchService fsStatisQwWatchService;
+
     //正在使用
     public void qwExternalContact()
     {
@@ -131,4 +142,50 @@ public class qwTask {
     public void unlockQwUserLoginCodeUrlTask(){
         qwUserService.unlockQwUserLoginCodeUrlTask();
     }
+
+
+    /**
+     * 看课统计
+     */
+    public void watchCourseStatis(String date){
+        if("1".equals(date)){
+            fsStatisSalerWatchService.writeData(null);
+        } else {
+            fsStatisSalerWatchService.writeData(date);
+        }
+    }
+
+    /**
+     * 看课统计昨天
+     */
+    public void watchCourseStatisPrevious(){
+        LocalDate localDate = LocalDate.now().minusDays(1);
+        fsStatisSalerWatchService.writeData(localDate.toString());
+    }
+    /**
+     * 看课统计-统计当天的-每15分钟统计一次
+     */
+    public void watchCourseStatisToday(){
+        fsStatisSalerWatchService.writeDataToday();
+    }
+
+    /**
+     * 进线转化统计
+     */
+    public void qwWatchCourseStatis(String date){
+        if("1".equals(date)){
+            fsStatisQwWatchService.writeData(null);
+        } else {
+            fsStatisQwWatchService.writeData(date);
+        }
+    }
+
+    /**
+     * 进线转化统计
+     */
+    public void qwWatchCourseStatisToday(){
+        LocalDate today = LocalDate.now();
+        fsStatisQwWatchService.writeData(today.toString());
+    }
+
 }

+ 199 - 0
fs-admin/src/main/java/com/fs/stats/SalesWatchStatisController.java

@@ -0,0 +1,199 @@
+package com.fs.stats;
+
+import com.fs.common.annotation.RateLimiter;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.cache.ICompanyUserCacheService;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.vo.DeptDataVO;
+import com.fs.sop.params.GetSOPTaskDataParam;
+import com.fs.sop.service.IQwSopLogsService;
+import com.fs.sop.service.IQwSopService;
+import com.fs.sop.vo.QwSopTask;
+import com.fs.statis.IFsStatisQwWatchService;
+import com.fs.statis.domain.FsStatisEveryDayWatch;
+import com.fs.statis.domain.FsStatisQwWatch;
+import com.fs.statis.domain.FsStatisSalerWatch;
+import com.fs.statis.domain.FsStatisSopWatch;
+import com.fs.statis.dto.StatsWatchLogPageListDTO;
+import com.fs.statis.service.FsStatisSalerWatchService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 看课统计接口
+ */
+@RestController
+@RequestMapping("/stats")
+@AllArgsConstructor
+public class SalesWatchStatisController {
+
+    @Autowired
+    private FsStatisSalerWatchService fsStatisSalerWatchService;
+
+    @Autowired
+    private IQwSopService qwSopService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private ICompanyUserCacheService companyUserCacheService;
+
+    @Autowired
+    private IFsStatisQwWatchService fsStatisQwWatchService;
+
+    @Autowired
+    private IQwSopLogsService qwSopLogsService;
+
+    @GetMapping("/computedData")
+    public R computedData(@RequestParam("date") String date){
+        fsStatisSalerWatchService.writeData(date);
+        return R.ok();
+    }
+    /**
+     * 销售完播统计查询
+     * @param param param
+     * @return R
+     */
+    @PostMapping("/seller/pageList")
+    public R sellerQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.queryList(param);
+        return R.ok().put("data",new PageInfo<>(list));
+    }
+
+    /**
+     * 进线转化统计
+     * @param param 参数
+     * @return R
+     */
+    @PostMapping("/inline/pageList")
+    public R inlineTransferStats(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        List<FsStatisQwWatch> list = fsStatisQwWatchService.queryList(param);
+        return R.ok().put("data",new PageInfo<>(list));
+    }
+    @PostMapping("/inline/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportInlineQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisQwWatch> list = fsStatisQwWatchService.exportQueryList(param);
+        ExcelUtil<FsStatisQwWatch> util = new ExcelUtil<>(FsStatisQwWatch.class);
+        return util.exportExcel(list, "销售完播统计");
+    }
+
+
+    @PostMapping("/seller/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportSellerQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.export(param);
+        ExcelUtil<FsStatisSalerWatch> util = new ExcelUtil<>(FsStatisSalerWatch.class);
+        return util.exportExcel(list, "销售完播统计");
+    }
+
+    /**
+     * 训练营完播统计查询
+     * @param param param
+     * @return R
+     */
+    @PostMapping("/period/pageList")
+    public R periodQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.queryPeriodList(param);
+        return R.ok().put("data", new PageInfo<>(list));
+    }
+
+    @PostMapping("/period/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportPeriodQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisSopWatch> list = fsStatisSalerWatchService.exportQueryPeriodList(param);
+        ExcelUtil<FsStatisSopWatch> util = new ExcelUtil<>(FsStatisSopWatch.class);
+        return util.exportExcel(list, "SOP任务完播统计");
+    }
+
+    /**
+     * 每日完播统计查询
+     * @param param param
+     * @return R
+     */
+    @PostMapping("/everyDay/pageList")
+    public R everyDayQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.queryTodayList(param);
+        return R.ok().put("data", new PageInfo<>(list));
+    }
+    @PostMapping("/everyDay/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportEveryDayQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisEveryDayWatch> list = fsStatisSalerWatchService.exportQueryEveryDayList(param);
+        ExcelUtil<FsStatisEveryDayWatch> util = new ExcelUtil<>(FsStatisEveryDayWatch.class);
+        return util.exportExcel(list, "每日完播统计");
+    }
+    /**
+     * 获取SOP任务数据
+     * @return
+     */
+    @PostMapping("/sopTaskData")
+    public R getSOPTaskData(@RequestBody GetSOPTaskDataParam param){
+        if(StringUtils.isBlank(param.getStartDate()) && StringUtils.isBlank(param.getEndDate())) {
+            param.setStartDate(LocalDate.now().minusDays(7).toString());
+            param.setEndDate(LocalDate.now().toString());
+        }
+        List<QwSopTask> qwSopTaskList = qwSopService.getQwSopTaskList(param);
+        return R.ok().put("data",qwSopTaskList);
+    }
+
+    /**
+     * 获取部门数据
+     * @return
+     */
+    @GetMapping("/getDeptData")
+    public R getDeptData(Long companyId){
+        List<DeptDataVO> data = companyUserCacheService.getDeptData(companyId);
+        return R.ok().put("data",data);
+    }
+
+}

+ 11 - 0
fs-company-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -25,6 +25,7 @@ import com.fs.his.service.IFsAppVersionService;
 import com.fs.his.service.IFsCityService;
 import com.fs.jpush.service.JpushService;
 
+import com.fs.store.service.IFsUserCourseCountService;
 import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
@@ -228,5 +229,15 @@ public class CommonController extends AppBaseController {
 	}
 
 
+	@Autowired
+	private IFsUserCourseCountService userCourseCountService;
+
+	@PostMapping("test")
+	public R test() throws Exception
+	{
+		userCourseCountService.insertFsUserCourseCountTask();
+		return R.ok();
+	}
+
 
 }

+ 11 - 5
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -39,8 +39,9 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.io.InputStream;
-import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 @Slf4j
@@ -75,7 +76,7 @@ public class FsUserController extends AppBaseController {
     @ApiOperation("用户会员分页列表")
     public ResponseResult<PageInfo<FsUserPageListVO>> pageList(@RequestBody FsUserPageListParam param) {
         param.setUserId(Long.parseLong(getUserId()));
-        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+//        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
         return ResponseResult.ok(fsUserPageListVOPageInfo);
     }
@@ -152,18 +153,23 @@ public class FsUserController extends AppBaseController {
     public ResponseResult<FsUserStatisticsVO> userStatistics(@ApiParam(value = "开始时间", required = true) @RequestParam String startTime,
                                                              @ApiParam(value = "结束时间", required = true) @RequestParam String endTime) {
         long userId = Long.parseLong(getUserId());
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String nowDate = dateFormat.format(new Date());
         /*---------- 如果传入的日期是今天 ----------*/
         UserStatisticsCommonParam param = new UserStatisticsCommonParam();
         param.setUserId(userId).setStartTime(startTime).setEndTime(endTime);
         FsUserStatisticsVO vo = fsUserService.userStatistics(param);
-        if (nowDate.compareTo(startTime) > 0 && nowDate.compareTo(endTime) < 0) {
+
+        DateTimeFormatter dfm = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDate today = LocalDate.now();
+        LocalDateTime startDateTime = LocalDateTime.parse(startTime, dfm);
+        LocalDateTime endDateTime = LocalDateTime.parse(endTime, dfm);
+        if (startDateTime.toLocalDate().equals(today) && endDateTime.toLocalDate().equals(today)) {
             String yesterday = LocalDate.now().minusDays(1).toString();
             UserStatisticsCommonParam paramYes = new UserStatisticsCommonParam();
             paramYes.setUserId(userId).setStartTime(yesterday + " 00:00:00").setEndTime(yesterday + " 23:59:59");
             FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatistics(paramYes);
             vo.setYesterdayVO(fsUserStatisticsVO);
+        } else {
+            vo.setYesterdayVO(new FsUserStatisticsVO());
         }
         return ResponseResult.ok(vo);
     }

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

@@ -1,10 +1,14 @@
 package com.fs.app.controller;
 
+import cn.hutool.json.JSONUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.config.ImageStorageConfig;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.param.FsWatchCourseTimeParam;
@@ -15,11 +19,13 @@ 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.impl.FsUserCourseServiceImpl;
 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.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -49,6 +55,8 @@ public class FsUserCourseVideoController extends AppBaseController {
 
     @Autowired
     private IFsUserCourseService fsUserCourseService;
+    @Autowired
+    private ISysConfigService configService;
 
     @Autowired
     private IFsCourseLinkService courseLinkService;
@@ -58,6 +66,8 @@ public class FsUserCourseVideoController extends AppBaseController {
 
     @Autowired
     private IFsUserCoursePeriodService fsUserCoursePeriodService;
+    @Autowired
+    private ICompanyUserService companyUserService;
 
     @Login
     @GetMapping("/pageList")
@@ -108,12 +118,23 @@ public class FsUserCourseVideoController extends AppBaseController {
                                                       @RequestParam(required = false) String keyword,
                                                       @RequestParam(required = false, defaultValue = "1") Integer pageNum,
                                                       @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
-        log.debug("参与记录 keyword: {}, pageNum: {}, pageSize: {}", keyword, pageNum, pageSize);
+        log.debug("参与记录 videoId:{}, type:{}, keyword: {}, pageNum: {}, pageSize: {}", videoId, type, keyword, pageNum, pageSize);
         Map<String, Object> params = new HashMap<>();
         params.put("videoId", videoId);
         params.put("type", type);
         params.put("keyword", keyword);
 
+        // type 0 答题领奖记录----答题正确并且领取红包的
+        // type 1 完播----这堂课看完的人
+        // type 2 未完播---看课中断
+        // 管理员看整个公司 否则看自己的
+        CompanyUser companyUser = companyUserService.selectCompanyUserByUserId(Long.parseLong(getUserId()));
+        if (companyUser.isAdmin()) {
+            params.put("companyId", companyUser.getCompanyId());
+        } else {
+            params.put("companyUserId", companyUser.getUserId());
+        }
+
         PageHelper.startPage(pageNum, pageSize);
         List<FsUserCourseParticipationRecordVO> record = fsUserCourseService.getParticipationRecordByMap(params);
         return ResponseResult.ok(new PageInfo<>(record));
@@ -143,8 +164,13 @@ public class FsUserCourseVideoController extends AppBaseController {
 
         R courseSortLink = fsUserCourseService.createCourseSortLink(fsCourseLinkCreateParam);
         String link = courseSortLink.get("link").toString();
-        R r = courseLinkService.getRealLink(link);
-        String realLink = r.get("realLink").toString();
+//        R r = courseLinkService.getRealLink(link);
+//        String realLink = r.get("realLink").toString();
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        String realLink = config.getRealLinkDomainName() + FsUserCourseServiceImpl.shortLink + link;
+
+        log.info("二维码生成地址:{}", realLink);
         try {
             String path = imageConfig.getServerPath();
             log.info("获取的logo图片路径,fileUrl:{}", path);

+ 2 - 1
fs-company/src/main/java/com/fs/company/controller/company/CompanyMenuController.java

@@ -77,7 +77,8 @@ public class CompanyMenuController extends BaseController
     public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        List<CompanyMenu> menus = menuService.selectMenuList(new CompanyMenu(),loginUser.getUser().getUserId(),loginUser.getUser().getUserType());
+        CompanyMenu companyMenu = new CompanyMenu();
+        List<CompanyMenu> menus = menuService.selectMenuList(companyMenu,loginUser.getUser().getUserId(),loginUser.getUser().getUserType());
         AjaxResult ajax = AjaxResult.success();
         ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
         ajax.put("menus", menuService.buildMenuTreeSelect(menus));

+ 12 - 0
fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java

@@ -194,6 +194,18 @@ public class FsCourseRedPacketLogController extends BaseController
         return toAjax(fsCourseRedPacketLogService.deleteFsCourseRedPacketLogByLogIds(logIds));
     }
 
+
+    /**
+     * 删除短链课程看课记录
+     */
+
+    @Log(title = "短链课程看课记录", businessType = BusinessType.DELETE)
+    @PutMapping("/retryCourseRedPacketLog/{logIds}")
+    public AjaxResult retryCourseRedPacketLog(@PathVariable Long[] logIds)
+    {
+        return toAjax(fsCourseRedPacketLogService.retryCourseRedPacketLog(logIds));
+    }
+
     @GetMapping("/courseList")
     public R courseList()
     {

+ 52 - 22
fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java

@@ -7,6 +7,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.param.FsCourseOverParam;
 import com.fs.course.param.FsCourseUserStatisticsListParam;
@@ -49,6 +50,10 @@ public class FsCourseWatchLogController extends BaseController
     private SopUserLogsMapper sopUserLogsMapper;
     @Autowired
     private IQwWatchLogService qwWatchLogService;
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
     /**
      * 查询短链课程看课记录列表
      */
@@ -56,14 +61,6 @@ public class FsCourseWatchLogController extends BaseController
     @GetMapping("/list")
     public TableDataInfo list(FsCourseWatchLogListParam param)
     {
-
-//        if (param.getScheduleStartTime() != null && param.getScheduleEndTime() != null){
-//            List<String> sopUserLogsVOS = sopUserLogsMapper.selectSopUserLogsByDate(param.getScheduleStartTime(), param.getScheduleEndTime());
-//            param.setSopIds(sopUserLogsVOS);
-//            if (sopUserLogsVOS==null||sopUserLogsVOS.size()==0){
-//                return getDataTable(new ArrayList<>());
-//            }
-//        }
         startPage();
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId( loginUser.getCompany().getCompanyId());
@@ -71,6 +68,53 @@ public class FsCourseWatchLogController extends BaseController
         return getDataTable(list);
     }
 
+
+    /**
+     * 查询短链课程 我的部门 看课记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseWatchLog:deptList')")
+    @GetMapping("/deptList")
+    public TableDataInfo deptList(FsCourseWatchLogListParam param) {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+
+        List<Long> combinedList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedList.addAll(deptList);
+        }
+
+        param.setCuDeptIdList(combinedList);
+        param.setUserType(loginUser.getUser().getUserType());
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
+
+        startPage();
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
+
+        return getDataTable(list);
+    }
+    /**
+     * 查询短链课程看课记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseWatchLog:myList')")
+    @GetMapping("/myList")
+    public TableDataInfo myList(FsCourseWatchLogListParam param)
+    {
+        startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompanyUserId( loginUser.getUser().getUserId());
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
+        return getDataTable(list);
+    }
+
+
     @PreAuthorize("@ss.hasPermi('course:courseWatchLog:statisticsList')")
     @GetMapping("/statisticsList")
     public TableDataInfo statisticsList(FsCourseWatchLogStatisticsListParam param)
@@ -171,20 +215,6 @@ public class FsCourseWatchLogController extends BaseController
 
 
 
-    /**
-     * 查询短链课程看课记录列表
-     */
-    @PreAuthorize("@ss.hasPermi('course:courseWatchLog:myList')")
-    @GetMapping("/myList")
-    public TableDataInfo myList(FsCourseWatchLogListParam param)
-    {
-        startPage();
-        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        param.setCompanyUserId( loginUser.getUser().getUserId());
-        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
-        return getDataTable(list);
-    }
-
     /**
      * 导出短链课程看课记录列表
      */

+ 53 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java

@@ -10,6 +10,7 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.course.param.FsUserCourseListUParam;
 import com.fs.course.service.IFsUserCourseStudyService;
 import com.fs.course.vo.FsUserCourseStudyListUVO;
@@ -38,6 +39,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
@@ -72,6 +74,10 @@ public class QwExternalContactController extends BaseController
 
     @Autowired
     private IQwExternalContactInfoService qwExternalContactInfoService;
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
     /**
      * 查询企业微信客户列表
      */
@@ -122,6 +128,53 @@ public class QwExternalContactController extends BaseController
         return qwExternalContactService.syncQwExternalContact(qwExternalContact.getCorpId());
     }
 
+    /**
+     * 我的部门客户
+     */
+    @PreAuthorize("@ss.hasPermi('qw:externalContact:myDeptExtList')")
+    @GetMapping("/myDeptExtList")
+    public TableDataInfo myDeptExtList(QwExternalContactParam qwExternalContact)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+        List<Long> combinedList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedList.addAll(deptList);
+        }
+
+        qwExternalContact.setCuDeptIdList(combinedList);
+        qwExternalContact.setUserType(loginUser.getUser().getUserType());
+        qwExternalContact.setCompanyId(loginUser.getCompany().getCompanyId());
+
+        startPage();
+        List<QwExternalContactVO> list = qwExternalContactService.selectQwExternalContactListVO(qwExternalContact);
+        list.forEach(item->{
+
+            if (!Objects.equals(item.getTagIds(), "[]") && item.getTagIds()!=null) {
+                QwTagSearchParam param = new QwTagSearchParam();
+                Gson gson = new Gson();
+                List<String> tagIds = gson.fromJson(
+                        item.getTagIds(),
+                        new TypeToken<List<String>>() {
+                        }.getType()
+                );
+
+                param.setTagIds(tagIds);
+
+                item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
+            }
+        });
+
+        return getDataTable(list);
+    }
+
     @PreAuthorize("@ss.hasPermi('qw:externalContact:myList')")
     @GetMapping("/myList")
     public TableDataInfo myList(QwExternalContactParam qwExternalContact)

+ 35 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferLogController.java

@@ -8,6 +8,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwExternalContactTransferLog;
@@ -18,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -32,8 +34,13 @@ public class QwExternalContactTransferLogController extends BaseController
 {
     @Autowired
     private IQwExternalContactTransferLogService qwExternalContactTransferLogService;
+
     @Autowired
     private TokenService tokenService;
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
     /**
      * 查询转接记录列表
      */
@@ -50,6 +57,34 @@ public class QwExternalContactTransferLogController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询部门转接记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:externalContactTransferLog:deptList')")
+    @GetMapping("/deptList")
+    public TableDataInfo deptList(QwExternalContactTransferLogParam qwExternalContactTransferLog)
+    {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        List<Long> combinedList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedList.addAll(deptList);
+        }
+        qwExternalContactTransferLog.setCuDeptIdList(combinedList);
+        qwExternalContactTransferLog.setUserType(loginUser.getUser().getUserType());
+
+        startPage();
+        List<QwExternalContactTransferLogListVO> list = qwExternalContactTransferLogService.selectQwExternalContactTransferLogListVO(qwExternalContactTransferLog);
+        return getDataTable(list);
+    }
+
     @PreAuthorize("@ss.hasPermi('qw:externalContactTransferLog:myList')")
     @GetMapping("/myList")
     public TableDataInfo myList(QwExternalContactTransferLogParam qwExternalContactTransferLog)

+ 37 - 4
fs-company/src/main/java/com/fs/company/controller/qw/QwFriendWelcomeController.java

@@ -10,6 +10,7 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwFriendWelcome;
@@ -22,10 +23,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -46,6 +44,10 @@ public class QwFriendWelcomeController extends BaseController
 
     @Autowired
     private IQwUserService qwUserService;
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
     /**
      * 查询好友欢迎语列表
      */
@@ -61,6 +63,37 @@ public class QwFriendWelcomeController extends BaseController
         return getDataTable(list);
     }
 
+
+    /**
+     * 查询部门好友欢迎语列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:friendWelcome:deptList')")
+    @GetMapping("/deptList")
+    public TableDataInfo deptList(QwFriendWelcomeParam qwFriendWelcomeParam)
+    {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwFriendWelcomeParam.setCompanyId(loginUser.getCompany().getCompanyId());
+        List<Long> combinedList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedList.addAll(deptList);
+        }
+        qwFriendWelcomeParam.setCuDeptIdList(combinedList);
+        qwFriendWelcomeParam.setUserType(loginUser.getUser().getUserType());
+
+        startPage();
+        List<QwFriendWelcome> list = qwFriendWelcomeService.selectQwFriendWelcomeListMyVO(qwFriendWelcomeParam);
+        return getDataTable(list);
+    }
+
+
     /**
      * 查询好友欢迎语列表
      */

+ 59 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwGroupChatController.java

@@ -4,9 +4,13 @@ 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.utils.ServletUtils;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
+import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.param.QwGroupChatParam;
 import com.fs.qw.service.IQwGroupChatService;
+import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.QwGroupChatOptionsVO;
 import com.fs.qw.vo.QwGroupChatVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +20,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -33,6 +38,14 @@ public class QwGroupChatController extends BaseController
 
     @Autowired
     private TokenService tokenService;
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
+
+    @Autowired
+    private IQwUserService iQwUserService;
+
     /**
      * 查询客户群详情列表
      */
@@ -45,6 +58,35 @@ public class QwGroupChatController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询我的部门客户群详情列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:groupChat:deptList')")
+    @GetMapping("/deptList")
+    public TableDataInfo deptList(QwGroupChatParam qwGroupChat)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+        List<Long> combinedList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedList.addAll(deptList);
+        }
+        qwGroupChat.setCuDeptIdList(combinedList);
+        qwGroupChat.setUserType(loginUser.getUser().getUserType());
+
+
+        startPage();
+        List<QwGroupChatVO> list = qwGroupChatService.selectQwGroupChatList(qwGroupChat);
+        return getDataTable(list);
+    }
+
 
     /**
      * 我的-查询客户群详情列表
@@ -53,6 +95,9 @@ public class QwGroupChatController extends BaseController
     @GetMapping("/myList")
     public TableDataInfo myList(QwGroupChatParam qwGroupChat)
     {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwGroupChat.setCompanyId(loginUser.getCompany().getCompanyId());
+        qwGroupChat.setCompanyUserId(loginUser.getUser().getUserId());
         startPage();
         List<QwGroupChatVO> list = qwGroupChatService.selectQwGroupChatList(qwGroupChat);
         return getDataTable(list);
@@ -77,8 +122,21 @@ public class QwGroupChatController extends BaseController
 
 //        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
 //        Long companyId = loginUser.getCompany().getCompanyId();
+        List<String> qwUserIdList=new ArrayList<>();
+        return qwGroupChatService.cogradientGroupChat(corpId,qwUserIdList);
+    }
+
+    /**
+     *  同步 我的客户群信息
+     */
+    @GetMapping("/cogradientMyGroupChat/{corpId}")
+    public R cogradientMyGroupChat(@PathVariable("corpId") String corpId) throws Exception {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+        List<String> qwUserIdList = iQwUserService.selectQwUserListByCompanyUserId(loginUser.getUser().getUserId(), corpId);
 
-        return qwGroupChatService.cogradientGroupChat(corpId);
+        return qwGroupChatService.cogradientGroupChat(corpId,qwUserIdList);
     }
 
     @GetMapping("/allList/{corpId}")

+ 71 - 14
fs-company/src/main/java/com/fs/company/controller/qw/QwSopController.java

@@ -9,6 +9,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.course.mapper.FsUserCourseMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.framework.security.LoginUser;
@@ -28,6 +29,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -55,6 +57,13 @@ public class QwSopController extends BaseController
     private FsUserCourseVideoMapper fsUserCourseVideoMapper;
     @Autowired
     private ICompanySopRoleService companySopRoleService;
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
+    @Autowired
+    private IQwUserService iQwUserService;
+
     /**
      * 查询企微sop列表
      */
@@ -70,6 +79,67 @@ public class QwSopController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询部门企微sop列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:sop:deptList')")
+    @GetMapping("/deptList")
+    public TableDataInfo deptList(QwSop qwSop)
+    {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwSop.setCompanyId(loginUser.getCompany().getCompanyId());
+
+        List<Long> combinedList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedList.addAll(deptList);
+        }
+        qwSop.setCuDeptIdList(combinedList);
+        qwSop.setUserType(loginUser.getUser().getUserType());
+
+        List<Long> userIds = iQwUserService.selectQwUserListByCuDeptIdList(qwSop);
+
+        qwSop.setQwUserIdList(userIds);
+
+        startPage();
+        List<QwSop> list = qwSopService.selectQwSopMyList(qwSop);
+        return getDataTable(list);
+    }
+
+
+
+    /**
+     * 查询企微sop列表-我的
+     */
+    @PreAuthorize("@ss.hasPermi('qw:sop:myList')")
+    @GetMapping("/myList")
+    public TableDataInfo myList(QwSop qwSop)
+    {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwSop.setCompanyId( loginUser.getCompany().getCompanyId());
+        qwSop.setUserId(loginUser.getUser().getUserId());
+        List<Long> userIds = iQwUserService.selectQwUserListByCuDeptIdList(qwSop);
+        qwSop.setQwUserIdList(userIds);
+
+        List<QwSop> list=new ArrayList<>();
+
+        if (userIds.isEmpty()){
+            return  getDataTable(list);
+        }
+
+        startPage();
+        list = qwSopService.selectQwSopMyList(qwSop);
+        return getDataTable(list);
+    }
+
     /**
      * 查询aiChatsop列表
      */
@@ -97,20 +167,7 @@ public class QwSopController extends BaseController
         List<OptionsVO> optionsVOS = fsUserCourseVideoMapper.selectFsUserCourseVodeAllList(id);
         return R.ok().put("list", optionsVOS);
     }
-    /**
-     * 查询企微sop列表-我的
-     */
-    @PreAuthorize("@ss.hasPermi('qw:sop:myList')")
-    @GetMapping("/myList")
-    public TableDataInfo myList(QwSop qwSop)
-    {
-        startPage();
-        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        qwSop.setCompanyId( loginUser.getCompany().getCompanyId());
-        qwSop.setQwUserIds(String.valueOf(loginUser.getUser().getQwUserId()));
-        List<QwSop> list = qwSopService.selectQwSopMyList(qwSop);
-        return getDataTable(list);
-    }
+
     /**
      * 导出企微sop列表
      */

+ 35 - 4
fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java

@@ -18,6 +18,7 @@ import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.service.ICompanyUserService;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.fastGpt.domain.FastGptRole;
 import com.fs.fastGpt.mapper.FastGptRoleMapper;
 import com.fs.framework.manager.AsyncManager;
@@ -51,10 +52,7 @@ import org.springframework.security.core.Authentication;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -96,6 +94,9 @@ public class QwUserController extends BaseController
     @Resource
     private AuthenticationManager authenticationManager;
 
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
     /**
      * 查询企微员工列表
      */
@@ -111,6 +112,36 @@ public class QwUserController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询我的部门 企业微信员工列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:user:myDepartList')")
+    @GetMapping("/myDepartList")
+    public TableDataInfo myDepartList(QwUserListParam qwUser)
+    {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwUser.setCompanyId(loginUser.getCompany().getCompanyId());
+        qwUser.setUserType(loginUser.getUser().getUserType());
+        List<Long> combinedList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedList.addAll(deptList);
+        }
+        qwUser.setCuDeptIdList(combinedList);
+        qwUser.setUserType(loginUser.getUser().getUserType());
+
+        startPage();
+        List<QwUserVO> list = qwUserService.selectQwUserListStaffVO(qwUser);
+        return getDataTable(list);
+    }
+
     @PreAuthorize("@ss.hasPermi('qw:user:login')")
     @PostMapping("/loginQwIpad")
     public R loginQwIpad(@RequestBody QwLoginHookParam loginParam){

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

@@ -112,7 +112,7 @@ public class SopUserLogsController extends BaseController
     /**
      * 删除sopUserLogs
      */
-    @PreAuthorize("@ss.hasPermi('qwSop:sopUserLogs:remove')")
+    @PreAuthorize("@ss.hasPermi('qw:sopUserLogs:remove')")
     @Log(title = "删除sopUserLogs", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String[] ids)

+ 207 - 0
fs-company/src/main/java/com/fs/company/controller/stats/SalesWatchStatisController.java

@@ -0,0 +1,207 @@
+package com.fs.company.controller.stats;
+
+import com.fs.common.annotation.RateLimiter;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.cache.ICompanyUserCacheService;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.vo.DeptDataVO;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.service.TokenService;
+import com.fs.sop.params.GetSOPTaskDataParam;
+import com.fs.sop.service.IQwSopService;
+import com.fs.sop.vo.QwSopTask;
+import com.fs.statis.IFsStatisQwWatchService;
+import com.fs.statis.domain.FsStatisEveryDayWatch;
+import com.fs.statis.domain.FsStatisQwWatch;
+import com.fs.statis.domain.FsStatisSalerWatch;
+import com.fs.statis.domain.FsStatisSopWatch;
+import com.fs.statis.dto.StatsWatchLogPageListDTO;
+import com.fs.statis.service.FsStatisSalerWatchService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.AllArgsConstructor;
+import org.apache.http.util.Asserts;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 看课统计接口
+ */
+@RestController
+@RequestMapping("/stats")
+@AllArgsConstructor
+public class SalesWatchStatisController {
+
+    @Autowired
+    private FsStatisSalerWatchService fsStatisSalerWatchService;
+
+    @Autowired
+    private IQwSopService qwSopService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private ICompanyUserCacheService companyUserCacheService;
+
+    @Autowired
+    private IFsStatisQwWatchService fsStatisQwWatchService;
+
+    @Autowired
+    private TokenService tokenService;
+    /**
+     * 销售完播统计查询
+     * @param param param
+     * @return R
+     */
+    @PostMapping("/seller/pageList")
+    public R sellerQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.queryList(param);
+        return R.ok().put("data",new PageInfo<>(list));
+    }
+
+    /**
+     * 进线转化统计
+     * @param param 参数
+     * @return R
+     */
+    @PostMapping("/inline/pageList")
+    public R inlineTransferStats(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        List<FsStatisQwWatch> list = fsStatisQwWatchService.queryList(param);
+        return R.ok().put("data",new PageInfo<>(list));
+    }
+    @PostMapping("/inline/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportInlineQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisQwWatch> list = fsStatisQwWatchService.exportQueryList(param);
+        ExcelUtil<FsStatisQwWatch> util = new ExcelUtil<>(FsStatisQwWatch.class);
+        return util.exportExcel(list, "销售完播统计");
+    }
+
+
+    @PostMapping("/seller/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportSellerQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.export(param);
+        ExcelUtil<FsStatisSalerWatch> util = new ExcelUtil<>(FsStatisSalerWatch.class);
+        return util.exportExcel(list, "销售完播统计");
+    }
+
+    /**
+     * 训练营完播统计查询
+     * @param param param
+     * @return R
+     */
+    @PostMapping("/period/pageList")
+    public R periodQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.queryPeriodList(param);
+        return R.ok().put("data", new PageInfo<>(list));
+    }
+
+    @PostMapping("/period/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportPeriodQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisSopWatch> list = fsStatisSalerWatchService.exportQueryPeriodList(param);
+        ExcelUtil<FsStatisSopWatch> util = new ExcelUtil<>(FsStatisSopWatch.class);
+        return util.exportExcel(list, "SOP任务完播统计");
+    }
+
+    /**
+     * 每日完播统计查询
+     * @param param param
+     * @return R
+     */
+    @PostMapping("/everyDay/pageList")
+    public R everyDayQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        if(param.getPageNum() == null) {
+            param.setPageNum(1);
+        }
+        if(param.getPageSize() == null) {
+            param.setPageSize(10);
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<FsStatisSalerWatch> list = fsStatisSalerWatchService.queryTodayList(param);
+        return R.ok().put("data", new PageInfo<>(list));
+    }
+    @PostMapping("/everyDay/export")
+    @RateLimiter(time=5,count = 1)
+    public AjaxResult exportEveryDayQueryList(@RequestBody StatsWatchLogPageListDTO param){
+        param.setPageNum(null);
+        param.setPageSize(null);
+        List<FsStatisEveryDayWatch> list = fsStatisSalerWatchService.exportQueryEveryDayList(param);
+        ExcelUtil<FsStatisEveryDayWatch> util = new ExcelUtil<>(FsStatisEveryDayWatch.class);
+        return util.exportExcel(list, "每日完播统计");
+    }
+    /**
+     * 获取SOP任务数据
+     * @return
+     */
+    @PostMapping("/sopTaskData")
+    public R getSOPTaskData(@RequestBody GetSOPTaskDataParam param){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getCompany().getCompanyId();
+
+        if(StringUtils.isBlank(param.getStartDate()) && StringUtils.isBlank(param.getEndDate())) {
+            param.setStartDate(LocalDate.now().minusDays(7).toString());
+            param.setEndDate(LocalDate.now().toString());
+        }
+        param.setCompanyId(companyId);
+        List<QwSopTask> qwSopTaskList = qwSopService.getQwSopTaskList(param);
+        return R.ok().put("data",qwSopTaskList);
+    }
+    /**
+     * 获取部门数据
+     * @return
+     */
+    @GetMapping("/getDeptData")
+    public R getDeptData(Long companyId){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        companyId = loginUser.getCompany().getCompanyId();
+
+        Long userId = loginUser.getUser().getUserId();
+        Long deptId = loginUser.getUser().getDeptId();
+        Asserts.notNull(companyId,"公司id");
+        Asserts.notNull(userId,"销售id");
+        Asserts.notNull(deptId,"部门id");
+        List<DeptDataVO> data = companyService.getDeptData(companyId,userId,deptId);
+        return R.ok().put("data",data);
+    }
+
+}

+ 40 - 1
fs-company/src/main/java/com/fs/company/controller/store/FsStoreOrderController.java

@@ -17,6 +17,7 @@ import com.fs.erp.dto.ErpOrderQueryResponse;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
+import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.dto.ExpressInfoDTO;
 import com.fs.his.enums.ShipperCodeEnum;
@@ -27,12 +28,14 @@ import com.fs.his.param.FsStoreOrderSalesParam;
 import com.fs.his.service.IFsExportTaskService;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.utils.ConfigUtil;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsStoreOrderListVO;
 import com.fs.his.vo.FsStoreOrderVO;
 import com.fs.his.vo.FsStoreProductDeliverExcelVO;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -460,7 +463,11 @@ public class FsStoreOrderController extends BaseController
     public R getEroOrder(@PathVariable("extendOrderId") String extendOrderId) {
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(extendOrderId);
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        IErpOrderService erpOrderService = getErpService();
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+        if (erpOrderService != null){
+            response = erpOrderService.getOrder(request);
+        }
         return R.ok().put("data",response);
     }
     @Log(title = "同步物流", businessType = BusinessType.UPDATE)
@@ -511,4 +518,36 @@ public class FsStoreOrderController extends BaseController
         return AjaxResult.success(fsStoreOrderService.selectFsFollowVOByFollowId(followId));
     }
 
+    @Autowired
+    private ConfigUtil configUtil;
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+    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;
+                }
+                return erpOrderService;
+
+
+            }
+        }
+        return null;
+    }
+
 }

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

@@ -235,7 +235,7 @@ public class FsUserController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setUserId(loginUser.getUser().getUserId());
 //        startPage();
-        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+//        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("rows", fsUserPageListVOPageInfo.getList());

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

@@ -40,6 +40,7 @@ public class DataSourceConfig {
     @Primary
     public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
         targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
         return new DynamicDataSource(masterDataSource, targetDataSources);
     }

+ 44 - 5
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -1,5 +1,6 @@
 package com.fs.user;
 
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
@@ -7,11 +8,16 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
+
 import com.fs.his.service.IFsUserService;
+import com.fs.qw.domain.CustomerTransferApproval;
+import com.fs.qw.dto.FsUserTransferParamDTO;
+import com.fs.qw.service.ICustomerTransferApprovalService;
 import com.fs.store.param.h5.FsUserPageListParam;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -19,8 +25,11 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Date;
+
 @Api(tags = "会员管理接口")
 @RestController
+@Slf4j
 @RequestMapping("/user/fsUser")
 @AllArgsConstructor
 public class FsUserAdminController extends BaseController {
@@ -34,6 +43,9 @@ public class FsUserAdminController extends BaseController {
     @Autowired
     private TokenService tokenService;
 
+    @Autowired
+    private ICustomerTransferApprovalService transferApprovalService;
+
     @PreAuthorize("@ss.hasPermi('user:fsUser:list')")
     @PostMapping("/list")
     @ApiOperation("会员列表(与移动端使用的相同查询)")
@@ -41,12 +53,15 @@ public class FsUserAdminController extends BaseController {
         //startPage();
 
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        param.setCompanyId(loginUser.getCompany().getCompanyId());
-        param.setCompanyUserId(String.valueOf(loginUser.getUser().getUserId()));
-
-        if(param.getCompanyUserId() == null) {
-            throw new IllegalArgumentException("当前销售不存在!");
+        if (param.getIsMyFsUser()){
+            param.setCompanyId(loginUser.getCompany().getCompanyId());
+            param.setCompanyUserId(String.valueOf(loginUser.getUser().getUserId()));
+        }else {
+            param.setCompanyId(loginUser.getCompany().getCompanyId());
         }
+//        if(param.getCompanyUserId() == null) {
+//            throw new IllegalArgumentException("当前销售不存在!");
+//        }
         return fsUserService.selectFsUserPageListNew(param);
     }
 
@@ -60,5 +75,29 @@ public class FsUserAdminController extends BaseController {
         return R.error();
     }
 
+    /**
+     * 转移
+     * @param param
+     */
+    @PostMapping("/transfer")
+    public R transfer(@RequestBody FsUserTransferParamDTO param){
+        log.info("客户转移: {}",param);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setSourceCompanyUserId(loginUser.getUser().getUserId());
+        CustomerTransferApproval customerTransferApproval = new CustomerTransferApproval();
+        customerTransferApproval.setCorpId(String.valueOf(loginUser.getCompany().getCompanyId()));
+        customerTransferApproval.setCustomerIds(JSON.toJSONString(param.getUserIds()));
+        customerTransferApproval.setOriginalUserId(param.getSourceCompanyUserId());
+        customerTransferApproval.setTargetUserId(param.getTargetCompanyUserId());
+        customerTransferApproval.setInitiatorUserId(param.getSourceCompanyUserId());
+        customerTransferApproval.setContent(param.getContent());
+        customerTransferApproval.setCreatedAt(new Date());
+        customerTransferApproval.setUpdatedAt(new Date());
+        customerTransferApproval.setApprovalStatus(0);
+        customerTransferApproval.setTransferType(2);
+        transferApprovalService.insertCustomerTransferApproval(customerTransferApproval);
+        return R.ok("转移申请已经提交,等待转移成功!");
+    }
+
 
 }

+ 1 - 0
fs-framework/src/main/java/com/fs/framework/config/DataSourceConfig.java

@@ -43,6 +43,7 @@ public class DataSourceConfig {
     @Primary
     public DynamicDataSource dataSource(@Qualifier("clickhouseDataSource") DataSource clickhouseDataSource,@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
         targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
         targetDataSources.put(DataSourceType.CLICKHOUSE.name(), clickhouseDataSource);
         return new DynamicDataSource(masterDataSource, targetDataSources);

+ 1 - 0
fs-qw-api/src/main/java/com/fs/framework/config/DataSourceConfig.java

@@ -40,6 +40,7 @@ public class DataSourceConfig {
     @Primary
     public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
         targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
         return new DynamicDataSource(masterDataSource, targetDataSources);
     }

+ 39 - 0
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -29,6 +29,9 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.List;
 
@@ -87,6 +90,42 @@ public class CommonController {
     private IFsUserCourseCountService userCourseCountService;
 
 
+    /**
+    * 发官方通连
+    */
+    @GetMapping("/sopguanfanone")
+    public R sopguanfanone(String dateTime) throws Exception {
+
+        LocalDateTime localDateTime = DateUtil.parseLocalDateTime(dateTime);
+
+        int currentHour = localDateTime.getHour();
+        LocalDate localDate = localDateTime.toLocalDate();
+
+        String taskStartTime = localDate.atTime(currentHour, 0, 0)
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        String taskEndTime = localDate.atTime(currentHour, 59, 59)
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+        qwSopLogsService.createCorpMassSendingByUserLogs( taskStartTime, taskEndTime);
+        return R.ok();
+    }
+
+    /**
+    * 发一对一
+    */
+    @GetMapping("/sopguanfantwo")
+    public R sopguanfantwo(String dateTime) throws Exception {
+
+        LocalDateTime localDateTime = DateUtil.parseLocalDateTime(dateTime);
+
+
+        LocalDate localDate = localDateTime.toLocalDate();
+        String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
+        qwSopLogsService.createCorpMassSending(date);
+        return R.ok();
+    }
+
     @GetMapping("/testSop")
     public R testSop() throws Exception {
 

+ 1 - 1
fs-qw-task/src/main/java/com/fs/app/task/CourseWatchLogScheduler.java

@@ -126,7 +126,7 @@ public class CourseWatchLogScheduler {
 
     }
 
-    @Scheduled(fixedRate = 60000) // 每分钟执行一次
+    @Scheduled(fixedRate = 30000) // 每分钟执行一次
     public void checkFsUserWatchStatus() {
         // 尝试设置标志为 true,表示任务开始执行
         if (!isRunning4.compareAndSet(false, true)) {

+ 1 - 1
fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java

@@ -16,7 +16,7 @@ public class UserCourseWatchCountTask {
     /**
      * 每15分钟执行一次
      */
-    @Scheduled(cron = "0 */15 * * * ?")  // 每15分钟执行一次
+    @Scheduled(cron = "0 */10 * * * ?")  // 每10分钟执行一次
     public void userCourseCountTask() {
         try {
             log.info("==============会员看课统计任务执行===============开始");

+ 34 - 18
fs-qw-task/src/main/java/com/fs/app/task/qwTask.java

@@ -28,7 +28,7 @@ import java.util.List;
 /**
  * 企业微信SOP定时任务管理类
  * 负责处理各种定时任务,包括SOP规则检查、消息发送、数据清理等
- * 
+ *
  * @author 系统
  * @version 1.0
  */
@@ -50,10 +50,10 @@ public class qwTask {
 
     @Autowired
     private ISopUserLogsService sopUserLogsService;
-    
+
     @Autowired
     private SopLogsTaskService sopLogsTaskService;
-    
+
     @Autowired
     private SopWxLogsService sopWxLogsService;
 
@@ -71,7 +71,7 @@ public class qwTask {
 
     @Autowired
     private QwSopLogsMapper qwSopLogsMapper;
-    
+
     @Autowired
     private IQwSopTagService qwSopTagService;
 
@@ -99,7 +99,7 @@ public class qwTask {
      * 定时任务:根据营期生成sopLogs待发记录
      * 执行时间:每小时的第5分钟执行
      * 功能:根据营期时间生成需要发送的SOP日志记录
-     * 
+     *
      * @throws Exception 执行异常
      */
     @Scheduled(cron = "0 5 * * * ?") // 每小时的第5分钟触发
@@ -118,7 +118,7 @@ public class qwTask {
      * 定时任务:微信SOP处理
      * 执行时间:每小时的第5分钟执行
      * 功能:处理微信相关的SOP日志
-     * 
+     *
      * @throws Exception 执行异常
      */
     @Scheduled(cron = "0 5 * * * ?") // 每小时的第5分钟触发
@@ -136,7 +136,7 @@ public class qwTask {
      * 定时任务:处理聊天SOP用户日志
      * 执行时间:已注释,原为每分钟的第5秒执行
      * 功能:将clickHouse的sopUserLogsChat(营期表)按每分钟巡回处理
-     * 
+     *
      * @throws Exception 执行异常
      */
 //    @Scheduled(cron = "5 0/1 * * * ?")
@@ -149,20 +149,36 @@ public class qwTask {
     }
 
     /**
-     * 定时任务:发送企业微信SOP群发消息(新版-按营期发送)
-     * 执行时间:每天凌晨 0:20:00
-     * 功能:通过调用企业微信接口发送SOP群发消息
+     * 定时 发送 通过调用 企业微信接口 发送的 SOP 群发消息(按单链发)
      */
-    @Scheduled(cron = "0 20 0 * * ?")
-    public void SendQwApiSopLogTimerNew() {
-        log.info("zyp \n【企微官方接口群发开始】");
-        
-        // 获取当前日期
+    @Scheduled(cron = "0 20 1 * * ?")
+    public void SendQwApiSopLogTimer(){
+        log.info("zyp \n【企微官方接口群发开始-单链】");
+//        qwSopLogsService.checkQwSopLogs();
         LocalDate localDate = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0).toLocalDate();
         String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
 
-        // 根据用户日志创建企业群发
-        qwSopLogsService.createCorpMassSendingByUserLogs(date);
+        qwSopLogsService.createCorpMassSending(date);
+    }
+
+    /**
+     * 定时 发送 通过调用 企业微信接口 发送的 SOP 群发消息(新版-安装营期发)
+     */
+    @Scheduled(cron = "0 10 0,1 * * ?")
+    public void SendQwApiSopLogTimerNew(){
+
+        log.info("zyp \n【企微官方接口群发开始】");
+//        qwSopLogsService.checkQwSopLogs();
+//        LocalDate localDate = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0).toLocalDate();
+//        String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
+        int currentHour = LocalDateTime.now().getHour();
+        String taskStartTime = LocalDate.now().atTime(currentHour, 0, 0)
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        String taskEndTime = LocalDate.now().atTime(currentHour, 59, 59)
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+        qwSopLogsService.createCorpMassSendingByUserLogs(taskStartTime,taskEndTime);
     }
 
     /**
@@ -246,7 +262,7 @@ public class qwTask {
 
     /**
      * 批量处理插入逻辑,支持每500条数据一次的批量插入
-     * 
+     *
      * @param logsByJsApiNotExtId 需要处理的日志列表
      */
     private void processAndInsertQwSopLogs(List<QwSopLogsDoSendListTVO> logsByJsApiNotExtId) {

+ 21 - 9
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -774,22 +774,33 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         sopLogs.setQwUserid(logVo.getQwUserId());
         sopLogs.setCorpId(logVo.getCorpId());
         sopLogs.setLogType(ruleTimeVO.getType());
+        sopLogs.setTakeRecords(0);
 
         if (isOfficial == 1) {
 
-            if (fsUserId== null || Long.valueOf(0L).equals(fsUserId)){
-                sopLogs.setSendType(2);
-                sopLogs.setRemark("未绑定小程序用户,单链补发");
-                //时间设置成固定7点
-                LocalDateTime dateTime = LocalDateTime.parse(formattedSendTime, DATE_TIME_FORMATTER);
-                sopLogs.setSendTime(OUTPUT_FORMATTER.format(dateTime));
+            if (logVo.getIsSampSend()== 1) {
+                if (fsUserId == null || Long.valueOf(0L).equals(fsUserId)) {
+                    sopLogs.setSendType(2);
+                    sopLogs.setRemark("未绑定小程序用户,单链补发");
+                    //时间设置成固定8点
+                    LocalDateTime dateTime = LocalDateTime.parse(formattedSendTime, DATE_TIME_FORMATTER);
+                    sopLogs.setSendTime(OUTPUT_FORMATTER.format(dateTime));
+                } else {
+                    sopLogs.setSendType(1);
+                }
+
             }else {
-                sopLogs.setSendType(1);
+                if (fsUserId == null || Long.valueOf(0L).equals(fsUserId)) {
+                    sopLogs.setTakeRecords(1);
+                    sopLogs.setSendType(1);
+                }else {
+                    sopLogs.setSendType(1);
+                }
             }
 
-        }else if (isOfficial==0){
+        } else if (isOfficial == 0) {
             sopLogs.setSendType(ruleTimeVO.getSendType() == 1 ? 2 : ruleTimeVO.getSendType());
-        }else{
+        } else {
             sopLogs.setSendType(ruleTimeVO.getSendType());
         }
 
@@ -1828,6 +1839,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         sopLogs.setExternalUserId(externalContact.getExternalUserId());
         sopLogs.setExternalUserName(externalContact.getName());
         sopLogs.setFsUserId(finishLog.getUserId() != null ? finishLog.getUserId() : null );
+        sopLogs.setUserLogsId("-");
         // 解析模板设置
         List<QwSopCourseFinishTempSetting.Setting> settings = parseSettings(finishTemp.getSetting());
         if (settings == null) {

+ 6 - 23
fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java

@@ -144,7 +144,11 @@ public class ApisFsUserCourseVideoController extends BaseController {
             return R.error("客户id不能为空");
         }
 
-        return fsUserCourseVideoService.createCartLink(param);
+        if (param.getType()==null || param.getType()==1){
+            return fsUserCourseVideoService.createCartLink(param);
+        }else {
+            return fsUserCourseVideoService.createMiniLink(param);
+        }
     }
 
     @GetMapping("/createRoomLink")
@@ -154,28 +158,7 @@ public class ApisFsUserCourseVideoController extends BaseController {
         if (qwUser==null||qwUser.getCompanyId()==null){
             return R.error("无权限");
         }
-        FsCourseLinkCreateParam createParam = new FsCourseLinkCreateParam();
-        createParam.setCourseId(param.getCourseId());
-        createParam.setVideoId(param.getVideoId());
-        createParam.setCorpId(param.getCorpId());
-        createParam.setCompanyUserId(qwUser.getCompanyUserId());
-        createParam.setCompanyId(qwUser.getCompanyId());
-        createParam.setQwUserId(qwUser.getId());
-        String linkUrl;
-        R createLink = courseLinkService.createRoomLinkUrl(createParam);
-        if (createLink.get("code").equals(500)){
-            return R.error("链接生成失败!");
-        }
-        linkUrl = (String) createLink.get("url");
-
-        FsUserCourse course = fsUserCourseService.selectFsUserCourseByCourseId(param.getCourseId());
-
-        JSONObject news = new JSONObject(true); // true 表示保持字段顺序
-        news.put("link", linkUrl);
-        news.put("title", course.getCourseName());
-        news.put("desc", param.getTitle());
-        news.put("imgUrl", course.getImgUrl());
-        return R.ok().put("news",news);
+        return courseLinkService.createRoomLink(param, qwUser);
     }
 
 }

+ 6 - 23
fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -101,28 +101,7 @@ public class FsUserCourseVideoController {
         if (qwUser==null||qwUser.getCompanyId()==null){
             return R.error("无权限");
         }
-        FsCourseLinkCreateParam createParam = new FsCourseLinkCreateParam();
-        createParam.setCourseId(param.getCourseId());
-        createParam.setVideoId(param.getVideoId());
-        createParam.setCorpId(param.getCorpId());
-        createParam.setCompanyUserId(qwUser.getCompanyUserId());
-        createParam.setCompanyId(qwUser.getCompanyId());
-        createParam.setQwUserId(qwUser.getId());
-        String linkUrl;
-        R createLink = courseLinkService.createRoomLinkUrl(createParam);
-        if (createLink.get("code").equals(500)){
-            return R.error("链接生成失败!");
-        }
-        linkUrl = (String) createLink.get("url");
-
-        FsUserCourse course = fsUserCourseService.selectFsUserCourseByCourseId(param.getCourseId());
-
-        JSONObject news = new JSONObject(true); // true 表示保持字段顺序
-        news.put("link", linkUrl);
-        news.put("title", course.getCourseName());
-        news.put("desc", param.getTitle());
-        news.put("imgUrl", course.getImgUrl());
-        return R.ok().put("news",news);
+        return courseLinkService.createRoomLink(param, qwUser);
     }
 
     /**
@@ -177,6 +156,10 @@ public class FsUserCourseVideoController {
             return R.error("客户id不能为空");
         }
 
-        return fsUserCourseVideoService.createCartLink(param);
+        if (param.getType()==null || param.getType()==1){
+            return fsUserCourseVideoService.createCartLink(param);
+        }else {
+            return fsUserCourseVideoService.createMiniLink(param);
+        }
     }
 }

+ 1 - 0
fs-qwhook-sop/src/main/java/com/fs/framework/config/DataSourceConfig.java

@@ -40,6 +40,7 @@ public class DataSourceConfig {
     @Primary
     public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
         targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
         return new DynamicDataSource(masterDataSource, targetDataSources);
     }

+ 6 - 23
fs-qwhook/src/main/java/com/fs/app/controller/ApisFsUserCourseVideoController.java

@@ -143,7 +143,11 @@ public class ApisFsUserCourseVideoController extends BaseController {
             return R.error("客户id不能为空");
         }
 
-        return fsUserCourseVideoService.createCartLink(param);
+        if (param.getType()==null || param.getType()==1){
+            return fsUserCourseVideoService.createCartLink(param);
+        }else {
+            return fsUserCourseVideoService.createMiniLink(param);
+        }
 
     }
 
@@ -154,28 +158,7 @@ public class ApisFsUserCourseVideoController extends BaseController {
         if (qwUser==null||qwUser.getCompanyId()==null){
             return R.error("无权限");
         }
-        FsCourseLinkCreateParam createParam = new FsCourseLinkCreateParam();
-        createParam.setCourseId(param.getCourseId());
-        createParam.setVideoId(param.getVideoId());
-        createParam.setCorpId(param.getCorpId());
-        createParam.setCompanyUserId(qwUser.getCompanyUserId());
-        createParam.setCompanyId(qwUser.getCompanyId());
-        createParam.setQwUserId(qwUser.getId());
-        String linkUrl;
-        R createLink = courseLinkService.createRoomLinkUrl(createParam);
-        if (createLink.get("code").equals(500)){
-            return R.error("链接生成失败!");
-        }
-        linkUrl = (String) createLink.get("url");
-
-        FsUserCourse course = fsUserCourseService.selectFsUserCourseByCourseId(param.getCourseId());
-
-        JSONObject news = new JSONObject(true); // true 表示保持字段顺序
-        news.put("link", linkUrl);
-        news.put("title", course.getCourseName());
-        news.put("desc", param.getTitle());
-        news.put("imgUrl", course.getImgUrl());
-        return R.ok().put("news",news);
+        return courseLinkService.createRoomLink(param, qwUser);
     }
 
 }

+ 6 - 23
fs-qwhook/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -150,7 +150,11 @@ public class FsUserCourseVideoController {
             return R.error("客户id不能为空");
         }
 
-        return fsUserCourseVideoService.createCartLink(param);
+        if (param.getType()==null || param.getType()==1){
+            return fsUserCourseVideoService.createCartLink(param);
+        }else {
+            return fsUserCourseVideoService.createMiniLink(param);
+        }
 
     }
 
@@ -161,28 +165,7 @@ public class FsUserCourseVideoController {
         if (qwUser==null||qwUser.getCompanyId()==null){
             return R.error("无权限");
         }
-        FsCourseLinkCreateParam createParam = new FsCourseLinkCreateParam();
-        createParam.setCourseId(param.getCourseId());
-        createParam.setVideoId(param.getVideoId());
-        createParam.setCorpId(param.getCorpId());
-        createParam.setCompanyUserId(qwUser.getCompanyUserId());
-        createParam.setCompanyId(qwUser.getCompanyId());
-        createParam.setQwUserId(qwUser.getId());
-        String linkUrl;
-        R createLink = courseLinkService.createRoomLinkUrl(createParam);
-        if (createLink.get("code").equals(500)){
-            return R.error("链接生成失败!");
-        }
-        linkUrl = (String) createLink.get("url");
-
-        FsUserCourse course = fsUserCourseService.selectFsUserCourseByCourseId(param.getCourseId());
-
-        JSONObject news = new JSONObject(true); // true 表示保持字段顺序
-        news.put("link", linkUrl);
-        news.put("title", course.getCourseName());
-        news.put("desc", param.getTitle());
-        news.put("imgUrl", course.getImgUrl());
-        return R.ok().put("news",news);
+        return courseLinkService.createRoomLink(param, qwUser);
     }
 
 }

+ 1 - 0
fs-qwhook/src/main/java/com/fs/framework/config/DataSourceConfig.java

@@ -40,6 +40,7 @@ public class DataSourceConfig {
     @Primary
     public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("sopDataSource") DataSource sopDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
         targetDataSources.put(DataSourceType.SOP.name(), sopDataSource);
         return new DynamicDataSource(masterDataSource, targetDataSources);
     }

+ 5 - 0
fs-service/src/main/java/com/fs/company/cache/ICompanyDeptCacheService.java

@@ -0,0 +1,5 @@
+package com.fs.company.cache;
+
+public interface ICompanyDeptCacheService {
+    String getDeptNameById(Long deptId);
+}

+ 5 - 0
fs-service/src/main/java/com/fs/company/cache/ICompanyUserCacheService.java

@@ -1,7 +1,9 @@
 package com.fs.company.cache;
 
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.vo.DeptDataVO;
 
+import java.util.List;
 import java.util.Set;
 
 ;
@@ -29,4 +31,7 @@ public interface ICompanyUserCacheService {
      */
     public Set<Long> selectUserAllCompanyUserId(Long companyUserId);
 
+    List<DeptDataVO> getDeptData(Long companyId);
+    List<DeptDataVO> getDeptData(Long companyId,Long companyUserId);
+
 }

+ 27 - 0
fs-service/src/main/java/com/fs/company/cache/impl/CompanyDeptCacheServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fs.company.cache.impl;
+
+import com.fs.company.cache.ICompanyDeptCacheService;
+import com.fs.company.service.ICompanyDeptService;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class CompanyDeptCacheServiceImpl implements ICompanyDeptCacheService {
+    private static final Cache<Long, String> COMPANY_DEPT_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(10, TimeUnit.MINUTES)
+            .build();
+    @Autowired
+    private ICompanyDeptService companyDeptService;
+    @Override
+    public String getDeptNameById(Long deptId) {
+        if(deptId == null) {
+            return "-";
+        }
+        return COMPANY_DEPT_CACHE.get(deptId,e-> companyDeptService.selectDeptNameById(deptId));
+    }
+}

+ 31 - 0
fs-service/src/main/java/com/fs/company/cache/impl/CompanyUserCacheServiceImpl.java

@@ -2,13 +2,17 @@ package com.fs.company.cache.impl;
 
 import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
+import com.fs.company.vo.DeptDataVO;
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -21,6 +25,9 @@ public class CompanyUserCacheServiceImpl implements ICompanyUserCacheService {
     @Autowired
     private ICompanyUserService companyUserService;
 
+    @Autowired
+    private ICompanyService companyService;
+
     private static final Cache<Long, CompanyUser> USER_CACHE = Caffeine.newBuilder()
             .maximumSize(1000)
             .expireAfterWrite(3, TimeUnit.MINUTES)
@@ -36,6 +43,11 @@ public class CompanyUserCacheServiceImpl implements ICompanyUserCacheService {
             .expireAfterWrite(5, TimeUnit.MINUTES)
             .build();
 
+    private static final Cache<Long,List<DeptDataVO>> COMPANY_USER_TREE_CACHE = Caffeine.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(10, TimeUnit.MINUTES)
+            .build();
+
 
     @Override
     public CompanyUser selectCompanyUserById(Long userId) {
@@ -56,4 +68,23 @@ public class CompanyUserCacheServiceImpl implements ICompanyUserCacheService {
             return set;
         });
     }
+
+    @Override
+    public List<DeptDataVO> getDeptData(Long companyId) {
+        if(companyId == null) {
+            companyId = -1L;
+        }
+        Long finalCompanyId = companyId;
+        return COMPANY_USER_TREE_CACHE.get(companyId, e->{
+            if(ObjectUtils.equals(finalCompanyId,-1L)) {
+                return companyService.getDeptData(null);
+            }
+            return companyService.getDeptData(finalCompanyId);
+        });
+    }
+
+    @Override
+    public List<DeptDataVO> getDeptData(Long companyId, Long companyUserId) {
+        return Collections.emptyList();
+    }
 }

+ 28 - 6
fs-service/src/main/java/com/fs/company/mapper/CompanyDeptMapper.java

@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 部门Mapper接口
@@ -30,6 +31,18 @@ public interface CompanyDeptMapper
      */
     public List<CompanyDept> selectCompanyDeptList(CompanyDept companyDept);
 
+    @Select("select * from company_dept where dept_id = #{parentId} or parent_id = #{parentId} and company_id=#{companyId} and status=#{status}")
+    public List<CompanyDept> selectCompanyDeptListByDeptAndParent(CompanyDept companyDept);
+    /**
+     * 获取公司默认部门
+     * @param companyId 公司ID
+     * @return  公司部门
+     * 获取所有部门的数据
+     * @param companyId 公司id
+     * @return 部门数据
+     */
+    @Select("select cd.* from company_dept cd where cd.company_id = #{companyId} and cd.dept_name = '默认' and cd.parent_id = 0 limit 1")
+    CompanyDept getTopCompanyDeptByCompanyId(@Param("companyId") Long companyId);
     /**
      * 新增部门
      *
@@ -54,6 +67,7 @@ public interface CompanyDeptMapper
      */
     public int deleteCompanyDeptById(Long deptId);
 
+
     /**
      * 批量删除部门
      *
@@ -83,12 +97,20 @@ public interface CompanyDeptMapper
 
     @Select("select company_id from company_dept where dept_id =#{deptId} ")
     Long selectCompanyDeptByIdCompany(Long deptId);
-
     /**
-     * 获取公司默认部门
-     * @param companyId 公司ID
-     * @return  公司部门
+     * 获取所有部门的数据
+     * @param companyId 公司id
+     * @return 部门数据
      */
-    @Select("select cd.* from company_dept cd where cd.company_id = #{companyId} and cd.dept_name = '默认' and cd.parent_id = 0 limit 1")
-    CompanyDept getTopCompanyDeptByCompanyId(@Param("companyId") Long companyId);
+    @Select("select * from company_dept where company_id = ${companyId}")
+    List<CompanyDept> selectDeptDataByCompanyId(@Param("companyId") Long companyId);
+
+    @Select("select dept_id from company_dept where parent_id=#{parentId}")
+    List<Long> selectCompanyDeptByParentId(@Param("parentId") Long parentId);
+
+    @Select("select * from company_dept where status='0' and del_flag='0'")
+    List<CompanyDept> queryDeptDataAll();
+
+    @Select("select dept_name from company_dept where dept_id=${deptId} limit 1")
+    String selectDeptNameById(@Param("deptId") Long deptId);
 }

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

@@ -8,6 +8,7 @@ import com.fs.company.vo.CompanyCrmVO;
 import com.fs.company.vo.CompanyNameVO;
 import com.fs.company.vo.CompanyVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.huifuPay.sdk.opps.core.utils.StringUtil;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -170,6 +171,15 @@ public interface CompanyMapper
     @Select("select company_id from company")
     List<Long> selectCompanyIds();
 
+    String selectCompanyNameCompanyByIds(@Param("companyIds") String companyIds);
+
+    String selectDoctorIdsByCompanyId(Long companyId);
+
+    List<Company> selectCompanyAllList();
+
+    List<OptionsVO> selectByIds(@Param("ids") List<Long> ids);
+
+
     /**
      * 通过企业id批量查询
      * **/

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

@@ -65,9 +65,9 @@ public interface CompanyRoleMapper
 
     List<CompanyRole> selectRolesByUserName(String username);
 
-    CompanyRole checkRoleNameUnique(String roleName);
+    CompanyRole checkRoleNameUnique(@Param("roleName") String roleName, @Param("companyId") Long companyId);
 
-    CompanyRole checkRoleKeyUnique(String roleKey);
+    CompanyRole checkRoleKeyUnique(@Param("roleKey") String roleKey,@Param("companyId") Long companyId);
 
     List<Integer> selectRoleListByUserId(Long userId);
 

+ 1 - 1
fs-service/src/main/java/com/fs/company/mapper/CompanyTagMapper.java

@@ -78,6 +78,6 @@ public interface CompanyTagMapper
     List<CompanyTag> selectCompanyTagListByUserId(@Param("userId") Long userId);
 
     String findUserTagByUserId(@Param("userId") Long userId,@Param("companyUserId") Long companyUserId);
-    @MapKey("tag_id")
+    @MapKey("tagId")
     Map<Long,CompanyTag> queryAllTagMap();
 }

+ 22 - 1
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -17,6 +17,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -214,7 +215,7 @@ public interface CompanyUserMapper
     @Select("select domain from company_user where user_id = #{userId}")
     String selectDomainByUserId(Long userId);
 
-    List<CompanyUser> selectAllCompanyUserAndSelf(@Param("userId") Long userId);
+    List<CompanyUser> selectAllCompanyUserAndSelf(@Param("userId") Long userId,@Param("companyId") Long companyId);
 
     @Select("select * from company_user where company_id=#{companyId} and del_flag=0")
     List<CompanyUser> selectCompanyUserByCompanyId(Long companyId);
@@ -264,4 +265,24 @@ public interface CompanyUserMapper
     List<CompanyUser> getUserInfoByUserIds(@Param("ids") List<Long> ids);
     @DataSource(DataSourceType.MASTER)
     CompanyUser selectCompanyUserByPhone(String phone);
+
+    @Select("select user_id,dept_id,user_name,company_id,nick_name from company_user where ifnull(del_flag,0)=0 and status=0")
+    List<CompanyUser> selectAllCompanyUserList();
+
+    /**
+     * 获取对应的销售观看记录数
+     *
+     * @param companyUserId
+     * @return
+     */
+    Long queryCompanyUserWatchCount(@Param("companyUserId") Long companyUserId,
+                                    @Param("previousDay") LocalDate previousDay);
+
+    Long queryCompanyUserWatchCountCompleted(@Param("companyUserId") Long companyUserId,
+                                             @Param("previousDay") LocalDate previousDay);
+
+    Long queryCompanyUserInterruptCount(@Param("companyUserId") Long companyUserId,
+                                        @Param("previousDay") LocalDate previousDay);
+
+
 }

+ 5 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyDeptService.java

@@ -1,5 +1,6 @@
 package com.fs.company.service;
 
+import com.fs.common.core.domain.entity.SysDept;
 import com.fs.company.domain.CompanyDept;
 import com.fs.company.domain.CompanyDeptTreeSelect;
 
@@ -28,6 +29,7 @@ public interface ICompanyDeptService
      * @return 部门集合
      */
     public List<CompanyDept> selectCompanyDeptList(CompanyDept companyDept);
+    public List<CompanyDept> selectCompanyDeptListByDeptAndParent(CompanyDept companyDept);
 
     /**
      * 新增部门
@@ -78,6 +80,9 @@ public interface ICompanyDeptService
 
     List<String> selectCompanyDeptNamesByIds(String ids);
 
+    List<Long> selectCompanyDeptByParentId(Long parentId);
+
+    String selectDeptNameById(Long deptId);
 
     /**
      * 获取公司默认部门

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

@@ -9,6 +9,7 @@ import com.fs.company.param.CompanyParam;
 import com.fs.company.vo.CompanyCrmVO;
 import com.fs.company.vo.CompanyNameVO;
 import com.fs.company.vo.CompanyVO;
+import com.fs.company.vo.DeptDataVO;
 import com.fs.his.domain.FsInquiryOrder;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStorePayment;
@@ -115,5 +116,17 @@ public interface ICompanyService
 
     List<Long> selectCompanyIds();
 
+    /**
+     * 查询多个公司的名字
+     * @param companyIds
+     * @return
+     */
+    String selectCompanyByIds(String companyIds);
+
+    List<DeptDataVO> getDeptData(Long companyId);
+    List<DeptDataVO> getDeptData(Long companyId,Long currentCompanyUserId,Long currentDeptId);
+
     void configUserCheck(Long companyId, Integer userIsDefaultBlack);
+
+    void addRedPacketCompanyMoney(BigDecimal money, Long companyId);
 }

+ 16 - 6
fs-service/src/main/java/com/fs/company/service/impl/CompanyDeptServiceImpl.java

@@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -57,6 +58,11 @@ public class CompanyDeptServiceImpl implements ICompanyDeptService
         return companyDeptMapper.selectCompanyDeptList(companyDept);
     }
 
+    @Override
+    public List<CompanyDept> selectCompanyDeptListByDeptAndParent(CompanyDept companyDept) {
+        return companyDeptMapper.selectCompanyDeptListByDeptAndParent(companyDept);
+    }
+
     /**
      * 新增部门
      *
@@ -224,16 +230,20 @@ public class CompanyDeptServiceImpl implements ICompanyDeptService
         return companyDeptMapper.selectCompanyDeptNamesByIds(ids);
     }
 
-    /**
-     * 获取公司默认部门
-     * @param companyId 公司ID
-     * @return 部门
-     */
+    @Override
+    public List<Long> selectCompanyDeptByParentId(Long parentId) {
+        return companyDeptMapper.selectCompanyDeptByParentId(parentId);
+    }
+
+    @Override
+    public String selectDeptNameById(Long deptId) {
+        return companyDeptMapper.selectDeptNameById(deptId);
+    }
+
     @Override
     public CompanyDept getDefaultCompanyDeptByCompanyId(Long companyId) {
         return companyDeptMapper.getTopCompanyDeptByCompanyId(companyId);
     }
-
     /**
      * 递归列表
      */

+ 8 - 4
fs-service/src/main/java/com/fs/company/service/impl/CompanyMenuServiceImpl.java

@@ -140,8 +140,11 @@ public class CompanyMenuServiceImpl implements ICompanyMenuService
             // 如果是顶级节点, 遍历该父节点的所有子节点
             if (!tempList.contains(menu.getParentId()))
             {
-                recursionFn(menus, menu);
-                returnList.add(menu);
+                // 如果正常
+                if("0".equals(menu.getStatus())){
+                    recursionFn(menus, menu);
+                    returnList.add(menu);
+                }
             }
         }
         if (returnList.isEmpty())
@@ -233,7 +236,6 @@ public class CompanyMenuServiceImpl implements ICompanyMenuService
         else
         {
             menu.getParams().put("userId", userId);
-//            menu.setStatus("0");
             menuList = companyMenuMapper.selectCompanyMenuList(menu);
         }
         return menuList;
@@ -300,7 +302,9 @@ public class CompanyMenuServiceImpl implements ICompanyMenuService
             CompanyMenu n = (CompanyMenu) it.next();
             if (n.getParentId().longValue() == t.getMenuId().longValue())
             {
-                tlist.add(n);
+                if("0".equals(n.getStatus())){
+                    tlist.add(n);
+                }
             }
         }
         return tlist;

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

@@ -127,7 +127,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
     @Override
     public String checkRoleNameUnique(CompanyRole role) {
         Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
-        CompanyRole info = companyRoleMapper.checkRoleNameUnique(role.getRoleName());
+        CompanyRole info = companyRoleMapper.checkRoleNameUnique(role.getRoleName(),role.getCompanyId());
         if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
         {
             return UserConstants.NOT_UNIQUE;
@@ -139,7 +139,7 @@ public class CompanyRoleServiceImpl implements ICompanyRoleService
     public String checkRoleKeyUnique(CompanyRole role) {
 
         Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
-        CompanyRole info = companyRoleMapper.checkRoleKeyUnique(role.getRoleKey());
+        CompanyRole info = companyRoleMapper.checkRoleKeyUnique(role.getRoleKey(),role.getCompanyId());
         if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
         {
             return UserConstants.NOT_UNIQUE;

+ 454 - 9
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -1,10 +1,8 @@
 package com.fs.company.service.impl;
 
 import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
@@ -18,22 +16,20 @@ import com.fs.company.service.ICompanyProfitService;
 import com.fs.company.vo.CompanyCrmVO;
 import com.fs.company.vo.CompanyNameVO;
 import com.fs.company.vo.CompanyVO;
+import com.fs.company.vo.DeptDataVO;
 import com.fs.his.config.StoreConfig;
 import com.fs.his.domain.FsInquiryOrder;
-import com.fs.his.domain.FsPayConfig;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStorePayment;
 import com.fs.his.dto.InquiryConfigDTO;
 import com.fs.his.mapper.FsStoreOrderMapper;
-import com.fs.his.service.IFsInquiryOrderService;
-import com.fs.his.service.impl.FsInquiryOrderServiceImpl;
 import com.fs.his.vo.OptionsVO;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.google.gson.Gson;
-import io.swagger.models.auth.In;
-import lombok.Synchronized;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -77,6 +73,13 @@ public class CompanyServiceImpl implements ICompanyService
     private ICompanyProfitService companyProfitService;
     @Autowired
     private SysConfigMapper sysConfigMapper;
+
+    @Autowired
+    private CompanyDeptMapper companyDeptMapper;
+
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
     @Override
     public List<OptionsVO> selectAllCompanyList() {
         return companyMapper.selectAllCompanyList();
@@ -528,6 +531,427 @@ public class CompanyServiceImpl implements ICompanyService
         return companyMapper.selectCompanyIds() ;
     }
 
+    @Override
+    public String selectCompanyByIds(String companyIds) {
+        return companyMapper.selectCompanyNameCompanyByIds(companyIds);
+
+    }
+
+    @Override
+    public List<DeptDataVO> getDeptData(Long companyId) {
+        List<DeptDataVO> result = new ArrayList<>();
+
+        // 获取用户按部门分组的数据
+        Map<Long, List<CompanyUser>> companyUserGroupByDeptId = getCompanyUserGroupByDeptId();
+        // 获取部门按公司分组的数据
+        Map<Long, List<CompanyDept>> companyDeptGroupByCompanyId = getCompanyDeptGroupByCompanyId();
+        // 获取子部门按父部门分组的数据
+        Map<Long, List<CompanyDept>> deptGroupByParentId = getDeptGroupByParentId();
+
+        if (companyId != null) {
+            Company company = companyMapper.selectCompanyById(companyId);
+            if (company != null) {
+                DeptDataVO companyNode = buildCompanyNode(company, companyUserGroupByDeptId,
+                        companyDeptGroupByCompanyId, deptGroupByParentId);
+                result.add(companyNode);
+            }
+        } else {
+            List<Company> companies = companyMapper.selectCompanyAllList();
+            if (companies != null && !companies.isEmpty()) {
+                for (Company company : companies) {
+                    DeptDataVO companyNode = buildCompanyNode(company, companyUserGroupByDeptId,
+                            companyDeptGroupByCompanyId, deptGroupByParentId);
+                    result.add(companyNode);
+                }
+            }
+        }
+
+        return result.stream()
+                .filter(e -> CollectionUtils.isNotEmpty(e.getChildren()))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<DeptDataVO> getDeptData(Long companyId, Long currentCompanyUserId, Long currentDeptId) {
+        List<DeptDataVO> result = new ArrayList<>();
+
+        // 1. 获取所有部门数据
+        List<CompanyDept> allCompanyDepts = companyDeptMapper.queryDeptDataAll();
+
+        // 2. 按部门ID分组,方便直接获取部门信息
+        Map<Long, CompanyDept> deptMapById = allCompanyDepts.stream()
+                .filter(e -> e.getDeptId() != null)
+                .collect(Collectors.toMap(CompanyDept::getDeptId, dept -> dept, (a, b) -> a));
+
+        // 3. 按父部门ID分组,用于构建树结构
+        Map<Long, List<CompanyDept>> deptsByParentIdMap = allCompanyDepts.stream()
+                .filter(e -> e.getParentId() != null && e.getDeptId() != null)
+                .collect(Collectors.groupingBy(CompanyDept::getParentId));
+
+        // 4. 获取所有用户数据并按部门分组
+        Map<Long, List<CompanyUser>> allUsersByDeptIdMap = getCompanyUserGroupByDeptId();
+
+        // 5. 获取当前用户可见的部门ID集合(本部门及下级部门)
+        Set<Long> visibleDeptIds = new HashSet<>();
+        if (currentDeptId != null) {
+            visibleDeptIds.add(currentDeptId); // 添加当前部门
+            collectSubDepartments(currentDeptId, visibleDeptIds, deptsByParentIdMap); // 添加所有下级部门
+        }
+
+        // 6. 如果没有可见部门,直接返回空列表
+        if (visibleDeptIds.isEmpty()) {
+            return result;
+        }
+
+        // 7. 获取公司信息
+        Company company = companyMapper.selectCompanyById(companyId);
+        if (company == null) {
+            return result;
+        }
+
+        // 8. 构建公司节点
+        DeptDataVO companyNode = new DeptDataVO();
+        companyNode.setLabel(company.getCompanyName());
+        companyNode.setId("company_"+company.getCompanyId());
+
+        // 9. 构建部门树(仅包含可见部门)
+        // 先找到当前部门对象
+        CompanyDept currentDept = deptMapById.get(currentDeptId);
+        if (currentDept == null) {
+            return result;
+        }
+
+        // 获取当前部门的所有上级部门路径
+        List<Long> deptPath = new ArrayList<>();
+        Long tempDeptId = currentDeptId;
+        while (tempDeptId != null && tempDeptId > 0) {
+            CompanyDept dept = deptMapById.get(tempDeptId);
+            if (dept == null) break;
+            deptPath.add(tempDeptId);
+            tempDeptId = dept.getParentId();
+        }
+
+        // 构建以公司为根的树形结构
+        // 找出顶级部门(parentId为null或0的部门)
+        List<CompanyDept> rootDepts = allCompanyDepts.stream()
+                .filter(dept -> dept.getCompanyId() != null &&
+                        dept.getCompanyId().equals(companyId) &&
+                        (dept.getParentId() == null || dept.getParentId().equals(0L)))
+                .collect(Collectors.toList());
+
+        // 递归构建带权限的树
+        List<DeptDataVO> deptTree = buildDeptTreeWithPermission(
+                rootDepts,
+                allUsersByDeptIdMap,
+                deptsByParentIdMap,
+                visibleDeptIds,
+                deptPath,
+                currentDeptId,
+                currentCompanyUserId);
+
+        companyNode.setChildren(deptTree.isEmpty() ? null : deptTree);
+        result.add(companyNode);
+
+        // 过滤掉空公司节点
+        return result.stream()
+                .filter(node -> node.getChildren() != null && !node.getChildren().isEmpty())
+                .collect(Collectors.toList());
+    }
+    /**
+     * 递归收集所有下级部门ID
+     */
+    private void collectSubDepartments(Long parentDeptId, Set<Long> deptIds, Map<Long, List<CompanyDept>> deptsByParentIdMap) {
+        List<CompanyDept> childDepts = deptsByParentIdMap.get(parentDeptId);
+        if (childDepts != null && !childDepts.isEmpty()) {
+            for (CompanyDept childDept : childDepts) {
+                if (childDept.getDeptId() != null && deptIds.add(childDept.getDeptId())) {
+                    collectSubDepartments(childDept.getDeptId(), deptIds, deptsByParentIdMap);
+                }
+            }
+        }
+    }
+    /**
+     * 递归构建带权限控制的部门树
+     */
+    private List<DeptDataVO> buildDeptTreeWithPermission(
+            List<CompanyDept> depts,
+            Map<Long, List<CompanyUser>> allUsersByDeptIdMap,
+            Map<Long, List<CompanyDept>> deptsByParentIdMap,
+            Set<Long> visibleDeptIds,
+            List<Long> deptPath,
+            Long currentDeptId,
+            Long currentCompanyUserId) {
+
+        if (depts == null || depts.isEmpty()) {
+            return new ArrayList<>();
+        }
+        List<DeptDataVO> result = new ArrayList<>();
+        for (CompanyDept dept : depts) {
+            // 如果当前部门不在用户可见范围内,且不在部门路径中,则跳过
+            if (!visibleDeptIds.contains(dept.getDeptId()) && !deptPath.contains(dept.getDeptId())) {
+                continue;
+            }
+
+            // 先递归构建子部门
+            List<CompanyDept> childDepts = deptsByParentIdMap.get(dept.getDeptId());
+            List<DeptDataVO> children = new ArrayList<>();
+
+            if (childDepts != null && !childDepts.isEmpty()) {
+                List<DeptDataVO> childDeptNodes = buildDeptTreeWithPermission(
+                        childDepts,
+                        allUsersByDeptIdMap,
+                        deptsByParentIdMap,
+                        visibleDeptIds,
+                        deptPath,
+                        currentDeptId,
+                        currentCompanyUserId);
+                if (!childDeptNodes.isEmpty()) {
+                    children.addAll(childDeptNodes);
+                }
+            }
+            // 添加部门下的用户(需要权限控制)
+            List<DeptDataVO> userNodes = new ArrayList<>();
+            if (visibleDeptIds.contains(dept.getDeptId())) {
+                List<CompanyUser> deptUsers = allUsersByDeptIdMap.get(dept.getDeptId());
+                if (deptUsers != null && !deptUsers.isEmpty()) {
+                    for (CompanyUser user : deptUsers) {
+                        // 如果是当前部门,只显示当前用户
+                        if (dept.getDeptId().equals(currentDeptId)) {
+                            if (user.getUserId().equals(currentCompanyUserId)) {
+                                DeptDataVO userNode = new DeptDataVO();
+                                userNode.setLabel(user.getNickName() + "_" + user.getUserName());
+                                userNode.setId("user_"+user.getUserId());
+                                userNode.setChildren(null);
+                                userNodes.add(userNode);
+                            }
+                        } else {
+                            // 非当前部门,显示所有用户
+                            DeptDataVO userNode = new DeptDataVO();
+                            userNode.setLabel(user.getNickName() + "_" + user.getUserName());
+                            userNode.setId("user_"+user.getUserId());
+                            userNode.setChildren(null);
+                            userNodes.add(userNode);
+                        }
+                    }
+                }
+            }
+
+            // 将用户节点添加到子节点列表
+            if (!userNodes.isEmpty()) {
+                children.addAll(userNodes);
+            }
+            // 只有当下面有子部门或者有用户时,才添加此部门
+            if (!children.isEmpty()) {
+                DeptDataVO deptNode = new DeptDataVO();
+                deptNode.setLabel(dept.getDeptName());
+                deptNode.setId("dept_"+dept.getDeptId());
+                deptNode.setChildren(children);
+                result.add(deptNode);
+            } else if (deptPath.contains(dept.getDeptId())) {
+                // 即使没有子部门和用户,如果是部门路径上的节点,仍然需要添加
+                DeptDataVO deptNode = new DeptDataVO();
+                deptNode.setLabel(dept.getDeptName());
+                deptNode.setId("dept_"+dept.getDeptId());
+                deptNode.setChildren(null);
+                result.add(deptNode);
+            }
+        }
+        return result;
+    }
+    /**
+     * 获取用户按部门ID分组
+     */
+    public Map<Long, List<CompanyUser>> getCompanyUserGroupByDeptId() {
+        List<CompanyUser> userList = companyUserMapper.selectAllCompanyUserList();
+        return userList.stream()
+                .filter(user -> user.getDeptId() != null)
+                .collect(Collectors.groupingBy(CompanyUser::getDeptId));
+    }
+
+
+    /**
+     * 获取部门按公司ID分组
+     */
+    public Map<Long, List<CompanyDept>> getCompanyDeptGroupByCompanyId() {
+        List<CompanyDept> companyDepts = companyDeptMapper.queryDeptDataAll();
+        return companyDepts.stream()
+                .collect(Collectors.groupingBy(CompanyDept::getCompanyId));
+    }
+
+    /**
+     * 获取部门按父部门ID分组(新增方法)
+     */
+    public Map<Long, List<CompanyDept>> getDeptGroupByParentId() {
+        List<CompanyDept> companyDepts = companyDeptMapper.queryDeptDataAll();
+        return companyDepts.stream()
+                .filter(dept -> dept.getParentId() != null) // 过滤掉顶级部门
+                .collect(Collectors.groupingBy(CompanyDept::getParentId));
+    }
+
+    /**
+     * 构建公司节点,包含其下属多级部门和用户
+     */
+    private DeptDataVO buildCompanyNode(Company company,
+                                        Map<Long, List<CompanyUser>> companyUserGroupByDeptId,
+                                        Map<Long, List<CompanyDept>> companyDeptGroupByCompanyId,
+                                        Map<Long, List<CompanyDept>> deptGroupByParentId) {
+        DeptDataVO companyNode = new DeptDataVO();
+        companyNode.setLabel(company.getCompanyName());
+        companyNode.setId("company_"+company.getCompanyId());
+
+        // 获取公司下的顶级部门(parentId为null或为公司ID的部门)
+        List<CompanyDept> topLevelDepts = companyDeptGroupByCompanyId.get(company.getCompanyId());
+        if (topLevelDepts != null) {
+            topLevelDepts = topLevelDepts.stream()
+                    .filter(dept -> dept.getParentId() == null || dept.getParentId().equals(0L))
+                    .collect(Collectors.toList());
+        }
+
+        List<DeptDataVO> deptDataList = buildDeptTree(topLevelDepts, companyUserGroupByDeptId, deptGroupByParentId);
+        companyNode.setChildren(deptDataList.isEmpty() ? null : deptDataList);
+
+        return companyNode;
+    }
+
+    /**
+     * 构建公司节点,包含其下属多级部门和用户
+     */
+    private DeptDataVO buildCompanyNode(Company company,
+                                        Map<Long, List<CompanyUser>> companyUserGroupByDeptId,
+                                        Map<Long, List<CompanyDept>> companyDeptGroupByCompanyId,
+                                        Map<Long, List<CompanyDept>> deptGroupByParentId,
+                                        Long currentDeptId,
+                                        Long currentCompanyUserId
+                                        ) {
+        DeptDataVO companyNode = new DeptDataVO();
+        companyNode.setLabel(company.getCompanyName());
+        companyNode.setId("company_"+company.getCompanyId());
+
+        // 获取公司下的顶级部门(parentId为null或为公司ID的部门)
+        List<CompanyDept> topLevelDepts = companyDeptGroupByCompanyId.get(company.getCompanyId());
+        if (topLevelDepts != null) {
+            topLevelDepts = topLevelDepts.stream()
+                    .filter(dept -> dept.getParentId() == null || dept.getParentId().equals(0L))
+                    .collect(Collectors.toList());
+        }
+
+        List<DeptDataVO> deptDataList = buildDeptTree(topLevelDepts, companyUserGroupByDeptId, deptGroupByParentId,currentDeptId,currentCompanyUserId);
+        companyNode.setChildren(deptDataList.isEmpty() ? null : deptDataList);
+
+        return companyNode;
+    }
+
+    /**
+     * 递归构建部门树
+     */
+    private List<DeptDataVO> buildDeptTree(List<CompanyDept> depts,
+                                           Map<Long, List<CompanyUser>> companyUserGroupByDeptId,
+                                           Map<Long, List<CompanyDept>> deptGroupByParentId) {
+        if (depts == null || depts.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        List<DeptDataVO> result = new ArrayList<>();
+
+        for (CompanyDept dept : depts) {
+            DeptDataVO deptNode = new DeptDataVO();
+            deptNode.setLabel(dept.getDeptName());
+            deptNode.setId("dept_"+dept.getDeptId());
+
+            List<DeptDataVO> children = new ArrayList<>();
+
+            // 1. 添加子部门(递归)
+            List<CompanyDept> childDepts = deptGroupByParentId.get(dept.getDeptId());
+            if (childDepts != null && !childDepts.isEmpty()) {
+                List<DeptDataVO> childDeptNodes = buildDeptTree(childDepts, companyUserGroupByDeptId, deptGroupByParentId);
+                children.addAll(childDeptNodes);
+            }
+
+            // 2. 添加部门下的用户
+            List<CompanyUser> deptUsers = companyUserGroupByDeptId.get(dept.getDeptId());
+            if (deptUsers != null && !deptUsers.isEmpty()) {
+                for (CompanyUser user : deptUsers) {
+                    DeptDataVO userNode = new DeptDataVO();
+                    userNode.setLabel(user.getNickName()+"_"+user.getUserName());
+                    userNode.setId("user_"+user.getUserId());
+                    userNode.setChildren(null);
+                    children.add(userNode);
+                }
+            }
+
+            deptNode.setChildren(children.isEmpty() ? null : children);
+            result.add(deptNode);
+        }
+
+        return result;
+    }
+    /**
+     * 递归构建部门树
+     */
+    /**
+     *
+     * @param depts
+     * @param companyUserGroupByDeptId
+     * @param deptGroupByParentId
+     * @param currentDeptId 当前部门id
+     * @param currentCompanyUserId 当前销售id
+     * @return
+     */
+    private List<DeptDataVO> buildDeptTree(List<CompanyDept> depts,
+                                           Map<Long, List<CompanyUser>> companyUserGroupByDeptId,
+                                           Map<Long, List<CompanyDept>> deptGroupByParentId,
+                                           Long currentDeptId,
+                                           Long currentCompanyUserId) {
+        if (depts == null || depts.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        List<DeptDataVO> result = new ArrayList<>();
+
+        for (CompanyDept dept : depts) {
+            DeptDataVO deptNode = new DeptDataVO();
+            deptNode.setLabel(dept.getDeptName());
+            deptNode.setId("dept_"+dept.getDeptId());
+
+            List<DeptDataVO> children = new ArrayList<>();
+
+            // 1. 添加子部门(递归)
+            List<CompanyDept> childDepts = deptGroupByParentId.get(dept.getDeptId());
+            if (childDepts != null && !childDepts.isEmpty()) {
+                List<DeptDataVO> childDeptNodes = buildDeptTree(childDepts, companyUserGroupByDeptId, deptGroupByParentId);
+                children.addAll(childDeptNodes);
+            }
+
+            // 2. 添加部门下的用户
+            List<CompanyUser> deptUsers = companyUserGroupByDeptId.get(dept.getDeptId());
+            if (deptUsers != null && !deptUsers.isEmpty()) {
+                for (CompanyUser user : deptUsers) {
+                    // 如果是销售当前部门,不显示同级其他销售
+                    if(ObjectUtils.equals(dept.getDeptId(),currentDeptId)) {
+                        if(ObjectUtils.equals(user.getUserId(),currentCompanyUserId)) {
+                            DeptDataVO userNode = new DeptDataVO();
+                            userNode.setLabel(user.getNickName()+"_"+user.getUserName());
+                            userNode.setId("user_"+user.getUserId());
+                            userNode.setChildren(null);
+                            children.add(userNode);
+                        }
+                    } else {
+                        DeptDataVO userNode = new DeptDataVO();
+                        userNode.setLabel(user.getNickName()+"_"+user.getUserName());
+                        userNode.setId("user_"+user.getUserId());
+                        userNode.setChildren(null);
+                        children.add(userNode);
+                    }
+                }
+            }
+
+            deptNode.setChildren(children.isEmpty() ? null : children);
+            result.add(deptNode);
+        }
+
+        return result;
+    }
+
     @Override
     @Transactional
     public void refundCompanyMoney(FsStoreOrder order) {
@@ -588,4 +1012,25 @@ public class CompanyServiceImpl implements ICompanyService
             companyMapper.updateCompany(company);
         }
     }
+
+    @Override
+    @Transactional
+    public void addRedPacketCompanyMoney(BigDecimal money, Long companyId) {
+        if(companyId!=null&&companyId>0){
+            Company company=companyMapper.selectCompanyByIdForUpdate(companyId);
+            if(company!=null){
+                logger.info("退回红包金额:"+money);
+                company.setMoney(company.getMoney().add(money));
+                companyMapper.updateCompany(company);
+                CompanyMoneyLogs log=new CompanyMoneyLogs();
+                log.setCompanyId(company.getCompanyId());
+                log.setRemark("退回红包金额");
+                log.setMoney(money);
+                log.setLogsType(16);
+                log.setBalance(company.getMoney());
+                log.setCreateTime(new Date());
+                moneyLogsMapper.insertCompanyMoneyLogs(log);
+            }
+        }
+    }
 }

+ 7 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyTagUserServiceImpl.java

@@ -117,8 +117,14 @@ public class CompanyTagUserServiceImpl implements ICompanyTagUserService
                 keywords = param.getKeyword().split(",");
             }
         }
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param != null ? param.getUserId() : null);
+        if (companyUser != null && companyUser.isAdmin()){
+            companyId = companyUser.getCompanyId();
+        }
         //获取所有销售
-        List<CompanyUser> companyUsers = companyUserMapper.selectAllCompanyUserAndSelf(param != null ? param.getUserId() : null);
+        List<CompanyUser> companyUsers = companyUserMapper.selectAllCompanyUserAndSelf(param != null ? param.getUserId() : null, companyId);
         List<Long> userIds = Collections.emptyList();
         if(companyUsers != null && !companyUsers.isEmpty()){
             userIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toList());

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

@@ -452,7 +452,14 @@ public class CompanyUserServiceImpl implements ICompanyUserService
 
     @Override
     public List<CompanyUser> selectAllCompanyUserAndSelf(Long userId) {
-        return companyUserMapper.selectAllCompanyUserAndSelf(userId);
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        List<CompanyUser> list = new ArrayList<>();
+        if (companyUser.isAdmin()){
+            list = companyUserMapper.selectAllCompanyUserAndSelf(userId,companyUser.getCompanyId());
+        }else {
+            list =   companyUserMapper.selectAllCompanyUserAndSelf(userId,null);
+        }
+        return list;
     }
 
     /**

+ 22 - 0
fs-service/src/main/java/com/fs/company/vo/DeptDataVO.java

@@ -0,0 +1,22 @@
+package com.fs.company.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class DeptDataVO implements Serializable {
+    /**
+     * 节点名称
+     */
+    private String label;
+    /**
+     * 节点id
+     */
+    private String id;
+    /**
+     * 子节点
+     */
+    private List<DeptDataVO> children;
+}

+ 3 - 0
fs-service/src/main/java/com/fs/course/domain/FsCourseAnswerLogs.java

@@ -66,4 +66,7 @@ public class FsCourseAnswerLogs extends BaseEntity {
     private String questionJson;
 
     private Long watchLogId;//绑定观看的记录id
+
+    /** 营期id */
+    private Long periodId;
 }

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

@@ -42,5 +42,5 @@ public class FsCourseRealLink implements Serializable
     @ApiModelProperty(value = "营期课程id")
     private Long id;
 
-
+    private String chatId;
 }

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

@@ -57,4 +57,6 @@ public class FsCourseRedPacketLog extends BaseEntity
     /** 营期id */
     private Long periodId;
 
+    private String result;
+
 }

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

@@ -95,4 +95,6 @@ public class FsVideoResource {
     private Integer isTranscode;//是否转码
 
     private String transcodeFileKey;//转码的文件key
+
+    private Integer sort;
 }

+ 1 - 1
fs-service/src/main/java/com/fs/course/mapper/FsCourseLinkMapper.java

@@ -68,7 +68,7 @@ public interface FsCourseLinkMapper
      */
     public int deleteFsCourseLinkByLinkIds(Long[] linkIds);
 
-    @Select("select link, real_link, update_time,company_user_id from fs_course_link where link = #{suffix} order by link_id desc limit 1 ")
+    @Select("select link, real_link,chat_id, update_time,company_user_id from fs_course_link where link = #{suffix} order by link_id desc limit 1 ")
     FsCourseLink selectFsCourseLinkByLink(@Param("suffix") String suffix);
 
     void insertFsCourseLinkBatch(@Param("courseLinks")List<FsCourseLink> courseLinkToInsert);

+ 13 - 1
fs-service/src/main/java/com/fs/course/mapper/FsCourseRedPacketLogMapper.java

@@ -127,7 +127,7 @@ public interface FsCourseRedPacketLogMapper
             "</script>"})
     List<FsCourseRedPacketLogListPVO> selectFsCourseRedPacketLogListVO(@Param("maps")FsCourseRedPacketLogParam fsCourseRedPacketLog);
 
-    @Select("SELECT company_id,sum(amount) as money from fs_course_red_packet_log  WHERE status = 1 and  DATE(create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) GROUP BY company_id")
+    @Select("SELECT company_id, SUM(amount) as money  FROM fs_course_red_packet_log    WHERE status in (0,1) and create_time >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)   AND create_time < CURDATE()  GROUP BY company_id " )
     List<RedPacketMoneyVO> selectFsCourseRedPacketLogByCompany();
 
     List<FsCourseRedPacketLogListPVO> selectFsCourseRedPacketLogListVONew(FsCourseRedPacketLogParam fsCourseRedPacketLog);
@@ -144,4 +144,16 @@ public interface FsCourseRedPacketLogMapper
     int getCountByCompanyUserIdId(@Param("companyUserId") Long companyUserId);
 
     BigDecimal getNewVipRedPackAmountByCompanyUserIdId(@Param("companyUserId") Long companyUserId);
+
+    /**
+     * 查询红包金额数
+     * @param companyUserId 销售ID
+     * @return amount
+     */
+    @Select("select ifnull(sum(fcrpl.amount), 0) from fs_course_red_packet_log fcrpl where fcrpl.company_user_id = #{companyUserId}")
+    BigDecimal getSumByCompanyUserIdId(@Param("companyUserId") Long companyUserId);
+
+    @Select("SELECT company_id, SUM(amount) as money FROM fs_course_red_packet_log    WHERE status = 0 and create_time >= DATE_SUB(CURDATE(), INTERVAL 2 DAY)  AND create_time < DATE_SUB(CURDATE(), INTERVAL 1 DAY) GROUP BY company_id  ")
+    List<RedPacketMoneyVO> selectFsCourseAddRedPacketLogByCompany();
+
 }

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

@@ -396,4 +396,11 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
 
     @Select("select * from fs_course_watch_log where user_id = #{userId} and video_id = #{videoId} and send_type = 1")
     FsCourseWatchLog getCourseWatchLogByUser(@Param("userId") Long userId, @Param("videoId") Long videoId);
+
+    /**
+     * 根据条件查询条数
+     * @param params    参数
+     * @return  count
+     */
+    int countByMap(@Param("params") Map<String, Object> params);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoMapper.java

@@ -152,7 +152,7 @@ public interface FsUserCourseVideoMapper
     List<FsUserCourseVideo> selectVideoIsPrivate();
     @Select("select * from fs_user_course_video WHERE video_id=#{videoId}")
     FsUserCourseVideo selectFsUserCourseVideoByVideoStringId(String videoId);
-    @Select("select * from fs_user_course_video WHERE course_id=#{courseId}")
+    @Select("select * from fs_user_course_video WHERE course_id=#{courseId} and is_del = 0 order by course_sort,video_id")
     List<FsUserCourseVideo> selectVideoByCourseId(Long courseId);
     @Select("select v.* from fs_user_course_video v " +
             "left join fs_user_course c on c.course_id = v.course_id " +

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

@@ -14,5 +14,6 @@ public class FsCourseLinkRoomParam {
     private Long courseId;
 
     private String title;//视频标题
+    private String chatId;
 
 }

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

@@ -30,5 +30,6 @@ public class FsCourseQuestionAnswerUParam implements Serializable
     private Long duration;
     private Long qwExternalId;
     private List<FsCourseQuestionBank> questions;
+    private Long periodId;
 
 }

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

@@ -54,4 +54,21 @@ public class FsCourseWatchLogListParam implements Serializable {
     private String scheduleEndTime;
 
     private List<String> sopIds;
+
+
+    private Long taskId;//任务ID
+
+    private String customPageStr;
+
+    private Long lastId;
+
+    /**
+     * 销售部门
+     */
+    private List<Long> cuDeptIdList;
+
+    /**
+     * 部门类型 00 管理员 01 员工
+     */
+    private String userType;
 }

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

@@ -61,5 +61,7 @@ public class FsUserCourseVideoAddKfUParam implements Serializable {
     private String link;
 
     private Integer isRoom;
+    private String chatId;
+    private String nickName;
 
 }

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

@@ -3,6 +3,8 @@ package com.fs.course.service;
 import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsCourseLink;
 import com.fs.course.param.FsCourseLinkCreateParam;
+import com.fs.course.param.FsCourseLinkRoomParam;
+import com.fs.qw.domain.QwUser;
 
 import java.util.List;
 
@@ -79,4 +81,6 @@ public interface IFsCourseLinkService
     R createRoomLinkUrl(FsCourseLinkCreateParam param);
 
     R getRealLinkH5(String link);
+
+    R createRoomLink(FsCourseLinkRoomParam param, QwUser qwUser);
 }

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

@@ -79,4 +79,7 @@ public interface IFsCourseRedPacketLogService
     int getCountByCompanyUserIdId(Long userId);
 
     BigDecimal getNewVipRedPackAmountByCompanyUserIdId(Long userId);
+
+    int retryCourseRedPacketLog(Long[] logIds);
+
 }

+ 117 - 15
fs-service/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java

@@ -1,47 +1,51 @@
 package com.fs.course.service.impl;
 
-import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.PubFun;
 import com.fs.common.utils.StringUtils;
-import com.fs.company.domain.CompanyUser;
+import com.fs.common.utils.date.DateUtil;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.config.CourseConfig;
-import com.fs.course.domain.FsCourseDomainName;
-import com.fs.course.domain.FsCourseLink;
-import com.fs.course.domain.FsCourseRealLink;
-import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.domain.*;
 import com.fs.course.mapper.FsCourseDomainNameMapper;
 import com.fs.course.mapper.FsCourseLinkMapper;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.param.FsCourseLinkCreateParam;
-import com.fs.course.service.IFsCourseDomainNameService;
+import com.fs.course.param.FsCourseLinkRoomParam;
 import com.fs.course.service.IFsCourseLinkService;
+import com.fs.course.service.IFsUserCourseService;
+import com.fs.qw.domain.QwGroupChat;
+import com.fs.qw.domain.QwGroupChatUser;
 import com.fs.qw.domain.QwUser;
+import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.service.IQwGroupChatService;
+import com.fs.qw.service.IQwGroupChatUserService;
+import com.fs.qw.vo.GroupUserExternalVo;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
-import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.UnsupportedEncodingException;
-import java.net.URI;
 import java.net.URLDecoder;
-import java.security.SecureRandom;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
 
 import static com.fs.course.utils.LinkUtil.generateRandomStringWithLock;
+import static com.fs.sop.service.impl.SopUserLogsInfoServiceImpl.convertStringToDate;
 
 /**
  * 短链Service业务层处理
@@ -60,6 +64,21 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
 
     @Autowired
     private FsCourseDomainNameMapper fsCourseDomainNameMapper;
+
+    @Autowired
+    private FsCourseWatchLogMapper fsCourseWatchLogMapper;
+
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
+
+    @Autowired
+    private IFsUserCourseService fsUserCourseService;
+
+    @Autowired
+    private IQwGroupChatService qwGroupChatService;
+
+    @Autowired
+    private IQwGroupChatUserService qwGroupChatUserService;
     @Autowired
     private QwUserMapper qwUserMapper;
     @Autowired
@@ -202,7 +221,7 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
     }
 
     @Override
-    public R createRoomLinkUrl(FsCourseLinkCreateParam param) {
+    public R  createRoomLinkUrl(FsCourseLinkCreateParam param) {
 //        QwUser qwUser;
 //        if(param.getQwUserId() != null){
 //            qwUser = qwUserMapper.selectById(param.getQwUserIdLong());
@@ -216,13 +235,15 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
         BeanUtils.copyProperties(param,link);
         link.setLinkType(0);
         link.setIsRoom(1);
+        String randomString = generateRandomString();
+        link.setLink(randomString);
+        link.setChatId(param.getChatId());
+
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link,courseMap);
         // 将实体类对象转换为 JSON 字符串
         String course = JSON.toJSONString(courseMap);
         link.setRealLink(realLink+course);
-        String randomString = generateRandomString();
-        link.setLink(randomString);
         link.setCreateTime(new Date());
         Integer expireDays = 0;
         if (param.getDays() == null || param.getDays() == 0){
@@ -238,6 +259,7 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
         if (fsCourseLinkMapper.insertFsCourseLink(link)>0){
             String domainName = getDomainName(param.getCompanyUserId(), config);
             String sortLink = domainName + shortLink + link.getLink();
+
             return R.ok("短链生成").put("url",sortLink);
         }
         return R.error("短链生成失败!");
@@ -540,7 +562,7 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
                         domainName = config.getRealLinkDomainName();
                     }
                     String realLink = domainName+courseLink.getRealLink();
-                    String imgUrl = "";
+                    String imgUrl = cloudHostProper.getHeaderImg();
                     return R.ok().put("realLink",realLink ).put("config",config).put("headerImg",imgUrl);
                 }
             } else {
@@ -559,4 +581,84 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
             return R.error("发生未知错误,请稍后再试").put("realLink", link);
         }
     }
+
+    @Override
+    public R createRoomLink(FsCourseLinkRoomParam param, QwUser qwUser) {
+        FsCourseLinkCreateParam createParam = new FsCourseLinkCreateParam();
+        createParam.setCourseId(param.getCourseId());
+        createParam.setVideoId(param.getVideoId());
+        createParam.setCorpId(param.getCorpId());
+        createParam.setCompanyUserId(qwUser.getCompanyUserId());
+        createParam.setCompanyId(qwUser.getCompanyId());
+        createParam.setQwUserId(qwUser.getId());
+        createParam.setChatId(param.getChatId());
+        String linkUrl;
+        R createLink = createRoomLinkUrl(createParam);
+        if (createLink.get("code").equals(500)){
+            return R.error("链接生成失败!");
+        }
+
+        QwGroupChat groupChat = qwGroupChatService.selectQwGroupChatByChatId(param.getChatId());
+        List<QwGroupChatUser> qwGroupChatUserList = qwGroupChatUserService.selectQwGroupChatUserByChatIds(new String[]{param.getChatId()});
+        List<String> groupChatUserIds = PubFun.listToNewList(qwGroupChatUserList, QwGroupChatUser::getUserId);
+        if(!groupChatUserIds.isEmpty()){
+            List<GroupUserExternalVo> userList = qwExternalContactMapper.selectByGroupUser(groupChatUserIds);
+            Map<String, List<GroupUserExternalVo>> userMap = PubFun.listToMapByGroupList(userList, GroupUserExternalVo::getExternalUserId);
+            qwGroupChatUserList.forEach(e -> {
+                e.setUserList(userMap.getOrDefault(e.getUserId(), Collections.emptyList()));
+            });
+        }
+        try {
+            qwGroupChatUserList.stream().filter(e -> e.getUserList() != null && !e.getUserList().isEmpty()).forEach(e -> {
+                Map<String, GroupUserExternalVo> userMap = PubFun.listToMapByGroupObject(e.getUserList(), GroupUserExternalVo::getUserId);
+                GroupUserExternalVo vo = userMap.get(groupChat.getOwner());
+                if (vo != null && vo.getId() != null) {
+                    addWatchLogIfNeeded(param.getVideoId(), param.getCourseId(), vo.getFsUserId(), qwUser.getId(), qwUser.getCompanyUserId(), qwUser.getCompanyId(), vo.getId(), new Date(), new Date());
+                }
+            });
+        } catch (Exception e) {
+            log.error("群聊创建看课记录失败!", e);
+        }
+
+        linkUrl = (String) createLink.get("url");
+
+        FsUserCourse course = fsUserCourseService.selectFsUserCourseByCourseId(param.getCourseId());
+
+        JSONObject news = new JSONObject(true); // true 表示保持字段顺序
+        news.put("link", linkUrl);
+        news.put("title", course.getCourseName());
+        news.put("desc", param.getTitle()==null?"":param.getTitle());
+        news.put("imgUrl", course.getImgUrl());
+        return R.ok().put("news",news);
+    }
+
+
+    private void addWatchLogIfNeeded(Long videoId, Long courseId,
+                                     Long fsUserId, Long qwUserId, Long companyUserId,
+                                     Long companyId, Long externalId, Date startTime,Date createTime) {
+
+        try {
+            FsCourseWatchLog watchLog = new FsCourseWatchLog();
+            watchLog.setVideoId(videoId);
+            watchLog.setQwExternalContactId(externalId);
+            watchLog.setSendType(2);
+            watchLog.setQwUserId(qwUserId);
+            watchLog.setDuration(0L);
+            watchLog.setCourseId(courseId);
+            watchLog.setCompanyUserId(companyUserId);
+            watchLog.setCompanyId(companyId);
+            watchLog.setCreateTime(createTime);
+            watchLog.setUpdateTime(createTime);
+            watchLog.setLogType(3);
+            watchLog.setUserId(fsUserId);
+            watchLog.setCampPeriodTime(startTime);
+            //存看课记录
+            fsCourseWatchLogMapper.insertOrUpdateFsCourseWatchLog(watchLog);
+        }catch (Exception e){
+            log.error("一键群发失败-插入观看记录失败:"+e.getMessage());
+        }
+
+    }
+
+
 }

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

@@ -230,6 +230,7 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         logs.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null );
         logs.setQuestionJson(JSONObject.toJSONString(param.getQuestions()));
         logs.setCreateTime(new Date());
+        logs.setPeriodId(param.getPeriodId());
 
         if (thisRightCount == param.getQuestions().size()) {
             logs.setIsRight(1);

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

@@ -5,15 +5,26 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyMoneyLogs;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyMoneyLogsMapper;
 import com.fs.course.param.FsCourseRedPacketLogParam;
 import com.fs.course.vo.FsCourseRedPacketLogListPVO;
+import com.fs.his.domain.FsUser;
+import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.param.WxSendRedPacketParam;
+import com.fs.his.service.IFsStorePaymentService;
+import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.service.IFsCourseRedPacketLogService;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 短链课程看课记录Service业务层处理
@@ -122,9 +133,14 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
         return fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogListVONew(fsCourseRedPacketLog);
     }
 
+    /**
+     * 查询红包金额数
+     * @param companyUserId 销售ID
+     * @return amount
+     */
     @Override
     public BigDecimal getSumByCompanyUserIdId(Long companyUserId) {
-        return null;
+        return fsCourseRedPacketLogMapper.getSumByCompanyUserIdId(companyUserId);
     }
 
     @Override
@@ -141,5 +157,72 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
     public BigDecimal getNewVipRedPackAmountByCompanyUserIdId(Long companyUserId) {
         return fsCourseRedPacketLogMapper.getNewVipRedPackAmountByCompanyUserIdId(companyUserId);
     }
+    @Autowired
+    private IFsStorePaymentService paymentService;
+    @Autowired
+    private FsUserMapper fsUserMapper;
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private CompanyMoneyLogsMapper moneyLogsMapper;
+    @Override
+    @Transactional
+    public int retryCourseRedPacketLog(Long[] logIds) {
+        for (int i = 0; i < logIds.length; i++) {
+            Long id = logIds[i];
+            FsCourseRedPacketLog param = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogByLogId(id);
+
+
+            if (param!=null&&param.getStatus()==2){
+                Company company = companyMapper.selectCompanyByIdForUpdate(param.getCompanyId());
+                BigDecimal amount = param.getAmount();
+                BigDecimal money = company.getMoney();
+                BigDecimal subtract = money.subtract(amount);
+                if (subtract.compareTo(BigDecimal.ZERO)<0){
+                    return 0;
+                }
+
+
+                WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
+                FsUser user = fsUserMapper.selectFsUserByUserId(param.getUserId());
+                packetParam.setOpenId(user.getMaOpenId());
+                packetParam.setOpenId(user.getCourseMaOpenId());
+                packetParam.setAmount(param.getAmount());
+                packetParam.setSource(2);
+                packetParam.setRedPacketMode(1);
+                packetParam.setCompanyId(param.getCompanyId());
+                R sendRedPacket = paymentService.sendRedPacket(packetParam);
+                if (sendRedPacket.get("code").equals(200)) {
+                    FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+                    TransferBillsResult transferBillsResult;
+                    if (sendRedPacket.get("isNew").equals(1)){
+                        transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
+                        redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
+                        redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
+                    }else {
+                        redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                    }
+                    // 添加红包记录
+                    redPacketLog.setStatus(0);
+                    fsCourseRedPacketLogMapper.updateFsCourseRedPacketLog(redPacketLog);
+                    // 更新观看记录的奖励类型
+
+                    company.setMoney(subtract);
+                    companyMapper.updateCompany(company);
+
+                    CompanyMoneyLogs logs=new CompanyMoneyLogs();
+                    logs.setCompanyId(company.getCompanyId());
+                    logs.setRemark("扣除红包金额");
+                    logs.setMoney(amount.multiply(new BigDecimal(-1)));
+                    logs.setLogsType(15);
+                    logs.setBalance(company.getMoney());
+                    logs.setCreateTime(new Date());
+                    moneyLogsMapper.insertCompanyMoneyLogs(logs);
+                }
+            }
+
+        }
+        return 0;
+    }
 
 }

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

@@ -345,7 +345,7 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
 
     @Override
     public int countByMap(Map<String, Object> params) {
-        return 0;
+        return baseMapper.countByMap(params);
     }
 
     @Override

+ 6 - 3
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -105,7 +105,8 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     @Autowired
     private RedisCache redisCache;
     private static final String realLink = "/courseH5/pages/course/learning?course=";
-    private static final String shortLink = "/courseH5/pages/course/learning?s=";
+    public static final String shortLink = "/courseH5/pages/course/learning?s=";
+
     private static final String userRealLink = "/pages/user/users/becomeVIP?";
     /**
      * 查询课程
@@ -490,19 +491,21 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     public R createCourseSortLink(FsCourseLinkCreateParam param) {
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        //短链参数
+        String random = generateRandomString();
 
         //新增链接表信息
         FsCourseLink link = new FsCourseLink();
         BeanUtils.copyProperties(param, link);
         link.setLinkType(0);
         link.setIsRoom(0);
+        link.setLink(random);
 
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link, courseMap);
         String courseJson = JSON.toJSONString(courseMap);
-
         link.setRealLink(realLink + courseJson);
-        String random = generateRandomString();
+
         link.setLink(random);
         link.setCreateTime(new Date());
 

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

@@ -17,8 +17,10 @@ import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyMoneyLogs;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyMoneyLogsMapper;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
@@ -51,6 +53,7 @@ import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qwApi.Result.QwAddContactWayResult;
+import com.fs.qwApi.Result.QwGroupChatDetailsResult;
 import com.fs.qwApi.param.QwAddContactWayParam;
 import com.fs.qwApi.service.QwApiService;
 import com.fs.repeat.vo.RepeatUploadVo;
@@ -59,6 +62,7 @@ import com.fs.sop.mapper.SopUserLogsInfoMapper;
 import com.fs.sop.service.ISopUserLogsInfoService;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
+import com.fs.wx.cp.config.WxCpProperties;
 import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -72,6 +76,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.SocketTimeoutException;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -98,7 +103,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     private static final String miniappRealLink = "/pages_course/video.html?course=";
     private static final String REAL_LINK_PREFIX = "/courseH5/pages/course/learning?course=";
     private static final String SHORT_LINK_PREFIX = "/courseH5/pages/course/learning?s=";
-
+    @Autowired
+    private CompanyMoneyLogsMapper moneyLogsMapper;
     @Autowired
     private FsUserCourseVideoMapper fsUserCourseVideoMapper;
     @Autowired
@@ -391,7 +397,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     }
 
     @Override
-    @Transactional
     public R isAddKf(FsUserCourseVideoAddKfUParam param) {
         logger.info("zyp \n【判断添加客服】:{}",param);
         //查询用户
@@ -433,35 +438,103 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     }
 
     private R handleRoom(FsUserCourseVideoAddKfUParam param,FsUser user) {
-        //查询客户列表
-        List<QwExternalContact> contacts = qwExternalContactMapper.selectQwExternalContactListVOByfsUserId(user.getUserId());
-        if (contacts.isEmpty()){
-            return R.error("未注册");
-        }
-        //找出对应销售匹配的客户
-        QwExternalContact matchedContact = contacts.stream()
-                .filter(contact -> contact.getQwUserId().equals(Long.parseLong(param.getQwUserId())))
-                .findFirst()
-                .orElse(null);
-
-        if (matchedContact==null){
-            return R.error("无权限观看,未添加本群主");
-        }
-
-        param.setQwExternalId(matchedContact.getId());
-//        //查询是否有添加客服
-//        QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(param.getQwExternalId());
-//        if (externalContact==null){
-//            return R.error("客户不存在!");
+//        //查询客户列表
+//        List<QwExternalContact> contacts = qwExternalContactMapper.selectQwExternalContactListVOByfsUserId(user.getUserId());
+//        if (contacts.isEmpty()){
+//            return R.error("未注册");
 //        }
-//        if (!externalContact.getQwUserId().equals(param.getUserId())){
-//            return R.error("无权限观看,添加群主非本群主");
+//        //找出对应销售匹配的客户
+//        QwExternalContact matchedContact = contacts.stream()
+//                .filter(contact -> contact.getQwUserId().equals(Long.parseLong(param.getQwUserId())))
+//                .findFirst()
+//                .orElse(null);
+//
+//        if (matchedContact==null){
+//            return R.error("无权限观看,未添加本群主");
 //        }
-        FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(param.getQwExternalId(), param.getVideoId(),param.getQwUserId());
-        if (log==null){
-            createWatchLog(param);
+//
+//        param.setQwExternalId(matchedContact.getId());
+////        //查询是否有添加客服
+////        QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(param.getQwExternalId());
+////        if (externalContact==null){
+////            return R.error("客户不存在!");
+////        }
+////        if (!externalContact.getQwUserId().equals(param.getUserId())){
+////            return R.error("无权限观看,添加群主非本群主");
+////        }
+//        FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(param.getQwExternalId(), param.getVideoId(),param.getQwUserId());
+//        if (log==null){
+//            createWatchLog(param);
+//        }
+//        return R.ok().put("qwExternalId",matchedContact.getId());
+        FsCourseLink courseLink = courseLinkMapper.selectFsCourseLinkByLink(param.getLink());
+        System.out.println("查询的链接参数"+courseLink);
+        String msg = "<div style=\"color: red;margin-bottom: 15px;font-weight: bold;\">本课程为群会员独享<br>请长按二维码</div>\n" +
+                "\t\t\t\t\t<div style=\"color: #999;font-size: 14px;font-weight: bold;\">添加伴学助手免费领取会员权限</div>";
+        System.out.println("企微传参:"+courseLink.getChatId()+"corpId:"+param.getCorpId());
+        QwGroupChatDetailsResult result = qwApiService.groupChatDetails(courseLink.getChatId(), param.getCorpId());
+        if(result.getErrCode() != 0){
+            return R.error("企微接口请求失败,请联系管理员:" +result.getErrMsg());
+        }
+        List<QwGroupChatDetailsResult.Member> collect = result.getGroupChat().getMemberList().stream().filter(e -> e.getType() == 2).collect(Collectors.toList());
+        if(collect.isEmpty()){
+            return addCustomerService(param.getQwUserId(),msg);
         }
-        return R.ok().put("qwExternalId",matchedContact.getId());
+        Optional<QwGroupChatDetailsResult.Member> optional = collect.stream().filter(e -> e.getName().equals(user.getNickName()) || e.getName().equals(param.getNickName())).findFirst();
+        if(!optional.isPresent()){
+            return addCustomerService(param.getQwUserId(),msg);
+        }
+        QwGroupChatDetailsResult.Member member = optional.get();
+        QwExternalContact qwExternalContact = qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>().eq("user_id", result.getGroupChat().getOwner()).eq("external_user_id", member.getUserId()));
+        if(qwExternalContact==null){
+            return addCustomerService(param.getQwUserId(),msg);
+        }
+        Long qwExternalId = qwExternalContact.getId();
+        log.info("外部联系人数据:{}", qwExternalContact);
+//        addCompanyCompanyFsUser(param);
+        FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(qwExternalId, param.getVideoId(),param.getQwUserId());
+        if (log==null ){
+            return addCustomerService(param.getQwUserId(),msg);
+        }
+        //判断外部联系人有没有绑定userId
+        if (qwExternalContact.getFsUserId()!=null){
+            //有客户有小程序id  但 登录的小程序id和根据外部联系人id查出来的小程序id不一致
+            if (!qwExternalContact.getFsUserId().equals(param.getUserId())) {
+                return addCustomerService(param.getQwUserId(),msg);
+            }
+            List<QwExternalContact> qwExternalContacts = qwExternalContactMapper.selectQwExternalContactByMiniUserId(param.getUserId());
+            //匹配客户公司id
+            if (qwExternalContacts.stream().noneMatch(contact -> contact.getCorpId().equals(param.getCorpId()))){
+                return addCustomerService(param.getQwUserId(),msg);
+            }
+
+            //看课记录中userId为0绑定userId
+            if (log.getUserId()==null||log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())){
+                log.setUserId(param.getUserId());
+            }
+
+            log.setUpdateTime(new Date());
+            courseWatchLogMapper.updateFsCourseWatchLog(log);
+
+            iSopUserLogsInfoService.updateSopUserInfoByExternalId(qwExternalId,param.getUserId());
+        }else {
+            //没绑定fsUser直接绑定fsUser
+            QwExternalContact contact = new QwExternalContact();
+            contact.setId(qwExternalId);
+            contact.setFsUserId(param.getUserId());
+            qwExternalContactMapper.updateQwExternalContact(contact);
+            FsUser fsUser = new FsUser();
+            fsUser.setUserId(user.getUserId());
+            fsUser.setIsAddQw(1);
+            fsUserMapper.updateFsUser(fsUser);
+            //绑定上之后 更新观看记录
+            //看课记录中userId为0绑定userId
+            log.setUserId(param.getUserId());
+            log.setUpdateTime(new Date());
+            courseWatchLogMapper.updateFsCourseWatchLog(log);
+        }
+
+        return R.ok().put("qwExternalId", qwExternalContact.getId());
     }
 
     private void createWatchLog(FsUserCourseVideoAddKfUParam param) {
@@ -525,7 +598,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 //        }
 
         //查询是否有添加客服
-        QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(param.getQwExternalId());
+        QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(qwExternalId);
 
         //用小程序id查询外部联系人
         List<QwExternalContact> qwExternalContacts = qwExternalContactMapper.selectQwExternalContactByMiniUserId(param.getUserId());
@@ -756,21 +829,28 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         FsCourseWatchLog log = new FsCourseWatchLog();
 
         // 根据链接类型判断是否已发放奖励
-        if (param.getLinkType() != null && param.getLinkType() == 1) {
+        log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(), param.getVideoId(), param.getQwUserId(), param.getQwExternalId());
+        if (log == null) {
+            return R.error("无记录");
+        }
+        if (log.getRewardType() != null) {
             FsCourseRedPacketLog packetLog = redPacketLogMapper.selectFsCourseRedPacketLogByTemporary(param.getVideoId(), param.getUserId());
-            if (packetLog != null) {
+            if(packetLog != null && packetLog.getStatus() == 1) {
                 return R.error("奖励已发放");
             }
-        } else {
-            log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(), param.getVideoId(), param.getQwUserId(), param.getQwExternalId());
-            if (log == null) {
-                return R.error("无记录");
+            if(packetLog != null && packetLog.getStatus() == 0) {
+                if(StringUtils.isNotEmpty(packetLog.getResult())){
+                    R r = JSON.parseObject(packetLog.getResult(), R.class);
+                    return r;
+                } else {
+                    return R.error("奖励已发放");
+                }
             }
-            if (log.getRewardType() != null) {
-                return R.error("奖励已发放");
+            if(packetLog != null && packetLog.getStatus() == 2) {
+                return R.error("请联系客服补发");
             }
+            return R.error("奖励已发放");
         }
-
         // 获取视频信息
         FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(param.getVideoId());
 
@@ -838,18 +918,22 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
      */
     private R sendRedPacketReward(FsCourseSendRewardUParam param, FsUser user, FsCourseWatchLog log, FsUserCourseVideo video, CourseConfig config) {
         // 判断是否属于领取红包时间(会员看课发放红包)
-        FsUserCoursePeriodDays periodDays = new FsUserCoursePeriodDays();
-        periodDays.setVideoId(param.getVideoId());
-        periodDays.setPeriodId(param.getPeriodId());
-        //正常情况是只能查询到一条,之前可能存在重复的脏数据,暂使用查询list的方式
-        List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(periodDays);
-        if(fsUserCoursePeriodDays != null && !fsUserCoursePeriodDays.isEmpty()){
-            periodDays = fsUserCoursePeriodDays.get(0);
+        if (param.getPeriodId()!=null && param.getPeriodId()>0) {
+            FsUserCoursePeriodDays periodDays = new FsUserCoursePeriodDays();
+            periodDays.setVideoId(param.getVideoId());
+            periodDays.setPeriodId(param.getPeriodId());
+            //正常情况是只能查询到一条,之前可能存在重复的脏数据,暂使用查询list的方式
+            List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(periodDays);
+            if(fsUserCoursePeriodDays != null && !fsUserCoursePeriodDays.isEmpty()){
+                periodDays = fsUserCoursePeriodDays.get(0);
+            }
+            if(periodDays != null && periodDays.getLastJoinTime() !=null && LocalDateTime.now().isAfter(periodDays.getLastJoinTime())) {
+                return R.error(403,"已超过领取红包时间");
+            }
         }
 
-        if(periodDays != null && periodDays.getLastJoinTime() !=null && LocalDateTime.now().isAfter(periodDays.getLastJoinTime())) {
-            return R.error(403,"已超过领取红包时间");
-        }
+
+
 
         // 确定红包金额
         BigDecimal amount = BigDecimal.ZERO;
@@ -879,6 +963,26 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         System.out.println("红包商户号"+packetParam);
         //2025.6.19 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
+
+            Company company = companyMapper.selectCompanyByIdForUpdate(param.getCompanyId());
+            BigDecimal money = company.getMoney();
+            BigDecimal subtract = money.subtract(amount);
+            if (subtract.compareTo(BigDecimal.ZERO)<0){
+                FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+                redPacketLog.setCourseId(param.getCourseId());
+                redPacketLog.setCompanyId(param.getCompanyId());
+                redPacketLog.setUserId(param.getUserId());
+                redPacketLog.setVideoId(param.getVideoId());
+                redPacketLog.setStatus(2);
+                redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
+                redPacketLog.setCompanyUserId(param.getCompanyUserId());
+                redPacketLog.setCreateTime(new Date());
+                redPacketLog.setAmount(amount);
+                redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+                redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+                return R.error("销售公司余额不足");
+            }
             // 发送红包
             R sendRedPacket = paymentService.sendRedPacket(packetParam);
             if (sendRedPacket.get("code").equals(200)) {
@@ -886,6 +990,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 TransferBillsResult transferBillsResult;
                 if (sendRedPacket.get("isNew").equals(1)){
                     transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
+                    redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
                     redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
                 }else {
                     redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
@@ -906,10 +1011,20 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
                 // 更新观看记录的奖励类型
-//            if (param.getLinkType() == null || param.getLinkType() == 0) {
                 log.setRewardType(config.getRewardType());
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
-//            }
+                company.setMoney(subtract);
+                companyMapper.updateCompany(company);
+
+                CompanyMoneyLogs logs=new CompanyMoneyLogs();
+                logs.setCompanyId(company.getCompanyId());
+                logs.setRemark("扣除红包金额");
+                logs.setMoney(amount.multiply(new BigDecimal(-1)));
+                logs.setLogsType(15);
+                logs.setBalance(company.getMoney());
+                logs.setCreateTime(new Date());
+                moneyLogsMapper.insertCompanyMoneyLogs(logs);
+
                 return sendRedPacket;
             } else {
                 return R.error("奖励发送失败,请联系客服");
@@ -1121,8 +1236,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         // 如果开启了黑名单审核,需要提示
         if(fsUser.getStatus() == 0) {
-//            return ResponseResult.fail(505, "管理开启了会员审核,请等待审核");
-            return ResponseResult.fail(BizResponseEnum.WAIT_APPROVAL,getCompanyUserQRCode(companyUser));
+            return ResponseResult.fail(505, "请微信联系您的群主~");
+//            return ResponseResult.fail(BizResponseEnum.WAIT_APPROVAL,getCompanyUserQRCode(companyUser));
         }
 
         //查询看课记录
@@ -1156,6 +1271,11 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             fsCourseWatchLog.setLogType(1);
             fsCourseWatchLog.setProject(courseProject);
             courseWatchLogMapper.insertFsCourseWatchLog(fsCourseWatchLog);
+
+            String redisKey = "h5wxuser:watch:heartbeat:" + param.getUserId() + ":" + param.getVideoId() + ":" + param.getCompanyUserId();
+            redisCache.setCacheObject(redisKey, LocalDateTime.now().toString());
+            // 设置 Redis 记录的过期时间(例如 5 分钟)
+            redisCache.expire(redisKey, 300, TimeUnit.SECONDS);
         }
 
         // 添加会员销售关系表数据
@@ -1367,6 +1487,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Override
     public void batchSaveVideo(BatchVideoSvae vo) {
         List<FsVideoResource> videoResourceList = fsVideoResourceMapper.selectBatchIds(vo.getIds());
+        videoResourceList = videoResourceList.stream()
+                .sorted(Comparator.comparing(FsVideoResource::getSort).thenComparing(FsVideoResource::getId))
+                .collect(Collectors.toList());
         FsUserCourseVideo param = new FsUserCourseVideo();
         param.setCourseId(vo.getCourseId());
         List<FsUserCourseVideo> videoList = selectFsUserCourseVideoList(param);

+ 2 - 0
fs-service/src/main/java/com/fs/course/vo/FsVideoResourceVO.java

@@ -85,4 +85,6 @@ public class FsVideoResourceVO {
      * 课程ID
      */
     private String projectIds;
+
+    private Integer sort;
 }

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

@@ -1081,4 +1081,8 @@ public interface FsStoreOrderMapper
             "</if>" +
             "</script>"})
     Integer selectFsStoreOrderCountByType(@Param("companyId") Long companyId,@Param("userId") long userId, @Param("type")int type);
+
+    @Select("select * from fs_store_order where  `status`=2 ")
+    List<FsStoreOrder> selectWdtOmsOrderdeliveryOp();
+
 }

+ 12 - 10
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -76,7 +76,9 @@ public interface FsUserMapper
      */
     public int deleteFsUserByUserIds(Long[] userIds);
     @Select({"<script> " +
-                "select f1.*,f2.nick_name tui_name,f2.phone tui_phone FROM fs_user f1 LEFT JOIN fs_user f2 ON f1.tui_user_id =f2.user_id "+
+                "select f1.*,f2.nick_name tui_name,f2.phone tui_phone,cu.nick_name AS companyUserNickName,co.company_name FROM fs_user f1 LEFT JOIN fs_user f2 ON f1.tui_user_id =f2.user_id "+
+            " LEFT JOIN company_user cu ON cu.user_id = f1.company_user_id"+
+            " LEFT JOIN company co on co.company_id = f1.company_id"+
             " where f1.is_del=0 "+
             "  <if test=\"nickName != null  and nickName != ''\"> and f1.nick_name like concat( #{nickName}, '%')</if>\n" +
             "            <if test=\"avatar != null  and avatar != ''\"> and f1.avatar = #{avatar}</if>\n" +
@@ -297,7 +299,7 @@ public interface FsUserMapper
     @Select("select * from fs_user where union_id=#{unionId}")
     FsUser selectFsUserByUnionId(String unionId);
 
-    List<UserListCountVO> getUserNumber(@Param("userId") Long userId);
+    List<UserListCountVO> getUserNumber(@Param("userId") Long userId, @Param("companyId") Long companyId);
 
     int getRepeatUserNumber(@Param("userId") Long userId);
 
@@ -307,9 +309,9 @@ public interface FsUserMapper
 
     UserDetailsVO getCountRedPacket(@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
 
-    FsUserSummaryCountVO countUserSummary(@Param("userId") Long userId);
+    FsUserSummaryCountVO countUserSummary(@Param("userId") Long userId, @Param("companyId") Long companyId);
 
-    List<FsUserSummaryCountTagVO> countTag(@Param("userId") Long userId);
+    List<FsUserSummaryCountTagVO> countTag(@Param("userId") Long userId, @Param("companyId") Long companyId);
 
     Map<String, Long> countUserCourse(UserStatisticsCommonParam param);
 
@@ -317,21 +319,21 @@ public interface FsUserMapper
 
     Map<String, Long> countCourseDetails(UserStatisticsCommonParam param);
 
-    List<FsUserRankingVO> countUserRankingByComplete(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId") String periodId, @Param("videoId") String videoId, @Param("order") String order);
+    List<FsUserRankingVO> countUserRankingByComplete(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
 
-    List<FsUserRankingVO> countUserRankingByRight(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId") String periodId, @Param("videoId") String videoId, @Param("order") String order);
+    List<FsUserRankingVO> countUserRankingByRight(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
 
-    List<FsCourseRankingVO> countCourseRankingByComplete(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId") String periodId, @Param("videoId") String videoId, @Param("order") String order);
+    List<FsCourseRankingVO> countCourseRankingByComplete(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
 
-    List<FsCourseRankingVO> countCourseRankingByRight(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId") String periodId, @Param("videoId") String videoId, @Param("order") String order);
+    List<FsCourseRankingVO> countCourseRankingByRight(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
 
     Map<String, Object> countUserRedPacket(UserStatisticsCommonParam param);
 
     List<FsCourseAnalysisCountVO> courseAnalysisCourseCount(CourseAnalysisParam param);
 
-    CompanyUserSummaryCountVO companyUserCount(@Param("companyUserId") String companyUserId);
+    CompanyUserSummaryCountVO companyUserCount(@Param("companyUserId")String companyUserId, @Param("companyId") Long companyId);
 
-    CompanyUserSummaryCountVO newUserRedPacketCount(@Param("companyUserId") String companyUserId);
+    CompanyUserSummaryCountVO newUserRedPacketCount(@Param("companyUserId")String companyUserId, @Param("companyId") Long companyId);
 
 
     @Select("select * from fs_user where course_ma_open_id=#{openId}")

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

@@ -687,8 +687,8 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
                     BigDecimal money=order.getMoney();
                     order.setCompanyId(param.getCompanyId());
                     order.setCompanyUserId(param.getCompanyUserId());
-                    order.setMoney(new BigDecimal(0.1));
-                    order.setPayMoney(new BigDecimal(0.1));
+                    order.setMoney(new BigDecimal(0.0));
+                    order.setPayMoney(new BigDecimal(0.0));
                     order.setCompanyDeductMoney(money);
                     if (companyUser.getDeptId()!=null){
                         order.setDeptId(companyUser.getDeptId());

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java

@@ -121,6 +121,11 @@ public class FsPackageServiceImpl implements IFsPackageService {
                 fsPackage.setTotalCostPrice(toal.add(in));
             }
 //        }
+        //如果公域改私域 需要去掉disease_type值
+        Integer isShow = fsPackage.getIsShow();
+        if (isShow != null && isShow == 0) {
+            fsPackage.setDiseaseType(-1);
+        }
         return fsPackageMapper.updateFsPackage(fsPackage);
     }
 

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

@@ -1980,7 +1980,6 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             return R.error("未生成管易云订单");
         }
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
-        request.setCode(order.getExtendOrderId());
 
         //判断是否开启erp
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -1991,6 +1990,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             if (erpType != null){
 
                 IErpOrderService erpOrderService = null;
+                request.setCode(order.getExtendOrderId());
                 if (erpType == 1){
                     //管易
                     erpOrderService =  gyOrderService;

+ 77 - 19
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -509,7 +509,7 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public PageInfo<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param) {
-          CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+
 
 //        List<CompanyRole> companyRoles = companyRoleMapper.selectRolePermissionByUserId(param.getUserId());
 //        List<CompanyUser> companyUsers;
@@ -527,14 +527,19 @@ public class FsUserServiceImpl implements IFsUserService
 //            companyUsers = new ArrayList<>();
 //        }
 
-        if (companyUser.isAdmin()){
-            param.setUserId(0L);
-            param.setCompanyId(companyUser.getCompanyId());
+        if (param.getUserId() != null) {
+            CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+                if (companyUser.isAdmin()){
+                    param.setUserId(0L);
+                    param.setCompanyId(companyUser.getCompanyId());
+                }
         }
 
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
         List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageList(param);
         // 获取当前销售所有重粉会员
-        List<FsUserCompanyUser> fsUserCompanyUsers = fsUserCompanyUserMapper.selectRepeatUser(companyUser.getUserId());
+        List<FsUserCompanyUser> fsUserCompanyUsers = fsUserCompanyUserMapper.selectRepeatUser(param.getUserId());
 
         if(!fsUserCompanyUsers.isEmpty()){
             List<Long> userIds = fsUserCompanyUsers.stream().map(FsUserCompanyUser::getUserId).collect(Collectors.toList());
@@ -556,6 +561,8 @@ public class FsUserServiceImpl implements IFsUserService
         } else {
             return new PageInfo<>(fsUserPageListVOS);
         }
+
+
     }
 
     private static StringBuilder removeRepeatFansTag(FsUserPageListVO fsUserPageListVO) {
@@ -695,7 +702,14 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public UserListPageVO getUserNumber(Long userId) {
-        List<UserListCountVO> list = fsUserMapper.getUserNumber(userId);
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
+        List<UserListCountVO> list = fsUserMapper.getUserNumber(userId, companyId);
         Map<String, Integer> map = list.stream()
                 .collect(Collectors.toMap(UserListCountVO::getStatus, UserListCountVO::getNum, (v1, v2) -> v1));
         UserListPageVO pageVO = new UserListPageVO();
@@ -739,8 +753,15 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public FsUserSummaryCountVO userSummaryCount(Long userId) {
-        FsUserSummaryCountVO fsUserSummaryCountVO = fsUserMapper.countUserSummary(userId);
-        List<FsUserSummaryCountTagVO> countTagList = fsUserMapper.countTag(userId);
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
+        FsUserSummaryCountVO fsUserSummaryCountVO = fsUserMapper.countUserSummary(userId, companyId);
+        List<FsUserSummaryCountTagVO> countTagList = fsUserMapper.countTag(userId, companyId);
         fsUserSummaryCountVO.setTagList(countTagList);
         return fsUserSummaryCountVO;
     }
@@ -754,6 +775,11 @@ public class FsUserServiceImpl implements IFsUserService
     public FsUserStatisticsVO userStatisticsDetails(UserStatisticsCommonParam param) {
         FsUserStatisticsVO userStatisticsVO = getUserStatistics(param);
 
+        // 判断是否是管理员
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        if (companyUser != null && companyUser.isAdmin()){
+            param.setUserId(0L);
+        }
         //统计课程数据详情,在查询统计详情的时候需要显示
         Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetails(param);
         if(courseDetailsMap != null && courseDetailsMap.get("courseNum") != null && courseDetailsMap.get("videoNum") != null && courseDetailsMap.get("courseUserNum") != null){
@@ -767,25 +793,39 @@ public class FsUserServiceImpl implements IFsUserService
     @Override
     public List<FsUserRankingVO> userRanking(Long userId, String startTime, String endTime, String periodId, String videoId, String order, Integer type) {
         List<FsUserRankingVO> listVO = Collections.emptyList();
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
         if(type == 1){
             //按完播率
-            listVO = fsUserMapper.countUserRankingByComplete(userId, startTime, endTime, periodId, videoId, order);
+            listVO = fsUserMapper.countUserRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
         if(type == 2){
             //按正确率
-            listVO = fsUserMapper.countUserRankingByRight(userId, startTime, endTime, periodId, videoId, order);
+            listVO = fsUserMapper.countUserRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
         return listVO;
     }
 
     @Override
     public List<FsCourseRankingVO> courseRanking(Long userId, String startTime, String endTime, String periodId, String videoId, String order, Integer type) {
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
         List<FsCourseRankingVO> list = Collections.emptyList();
         if(type == 1){
-            list = fsUserMapper.countCourseRankingByComplete(userId, startTime, endTime, periodId, videoId, order);
+            list = fsUserMapper.countCourseRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
         if(type == 2){
-            list = fsUserMapper.countCourseRankingByRight(userId, startTime, endTime, periodId, videoId, order);
+            list = fsUserMapper.countCourseRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
 
         return list;
@@ -857,8 +897,15 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public CompanyUserSummaryCountVO companyUserSummaryCount(Long userId, String companyUserId) {
-        CompanyUserSummaryCountVO companyUserCount = fsUserMapper.companyUserCount(companyUserId);
-        CompanyUserSummaryCountVO newUserRedPacketCount = fsUserMapper.newUserRedPacketCount(companyUserId);
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            companyUserId = String.valueOf(0);
+            companyId = companyUser.getCompanyId();
+        }
+        CompanyUserSummaryCountVO companyUserCount = fsUserMapper.companyUserCount(companyUserId, companyId);
+        CompanyUserSummaryCountVO newUserRedPacketCount = fsUserMapper.newUserRedPacketCount(companyUserId, companyId);
         CompanyUserSummaryCountVO vo = new CompanyUserSummaryCountVO();
         BeanUtils.copyProperties(companyUserCount, vo);
         vo.setUserRedPacketNum(newUserRedPacketCount.getUserRedPacketNum());
@@ -875,13 +922,18 @@ public class FsUserServiceImpl implements IFsUserService
             return ResponseResult.fail(404,"当前用户信息不存在");
         }
 
+        // 逻辑调整:如果会员已经绑定了销售,直接提示,不添加重粉数据了-2025年6月16日14点53分
+        if (fsUser.getCompanyUserId() != null && !param.getCompanyUserId().equals(fsUser.getCompanyUserId())){
+            return ResponseResult.fail(406,"该用户已成为其他销售会员");
+        }
+
         //判断该销售是否存在
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
         if (Objects.isNull(companyUser)){
             return ResponseResult.fail(405,"销售不存在");
         }
 
-        // 判断是否绑定了销售
+        // 添加关系表数据
         FsUserCompanyUser fsUserCompanyUser = getFsUserCompanyUser(param, fsUser);
         QueryWrapper<FsUserCompanyUser> queryWrapper = new QueryWrapper<FsUserCompanyUser>().eq("user_id", param.getUserId()).eq("company_user_id", param.getCompanyUserId());
         Integer i = fsUserCompanyUserMapper.selectCount(queryWrapper);
@@ -922,10 +974,10 @@ public class FsUserServiceImpl implements IFsUserService
             companyTagUserMapper.insertCompanyTagUser(companyTagUser);
         }
 
-        // 如果是重粉,直接打上重粉的标签
-        if(1 == fsUserCompanyUser.getIsRepeatFans()){
-            this.setRepeatFansTag(param);
-        }
+//        // 如果是重粉,直接打上重粉的标签
+//        if(1 == fsUserCompanyUser.getIsRepeatFans()){
+//            this.setRepeatFansTag(param);
+//        }
 
         //如果是设置了需要进入小黑屋,则需要返回提示,否则正常返回
         if(isDefaultBlack == 1){
@@ -938,6 +990,12 @@ public class FsUserServiceImpl implements IFsUserService
     private FsUserStatisticsVO getUserStatistics(UserStatisticsCommonParam param) {
         FsUserStatisticsVO fsUserStatisticsVO = new FsUserStatisticsVO();
 
+        // 判断是否是管理员
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        if (companyUser != null && companyUser.isAdmin()){
+            param.setUserId(0L);
+            param.setCompanyId(companyUser.getCompanyId());
+        }
         // 获取课程统计
         Map<String, Long> couserMap = fsUserMapper.countUserCourse(param);
         if (couserMap != null) {

+ 10 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserVO.java

@@ -2,6 +2,7 @@ package com.fs.his.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.crypto.Cipher;
@@ -99,6 +100,15 @@ public class FsUserVO implements Serializable {
 
     private String source;//app来源
 
+
+    @ApiModelProperty(value = "销售名称")
+    @Excel(name = "所属销售", sort = 10)
+    private String companyUserNickName;
+
+    @ApiModelProperty(value = "所属公司")
+    @Excel(name = "所属公司", sort = 9)
+    private String companyName;
+
     public void setPhone(String phone)
     {
        this.phone = phone;

+ 60 - 0
fs-service/src/main/java/com/fs/qw/cache/QwSopCacheService.java

@@ -0,0 +1,60 @@
+package com.fs.qw.cache;
+
+import com.fs.common.utils.StringUtils;
+import com.fs.qw.mapper.QwUserMapper;
+import com.fs.sop.domain.SopUserLogs;
+import com.fs.sop.mapper.QwSopMapper;
+import com.fs.sop.mapper.SopUserLogsMapper;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class QwSopCacheService {
+    @Autowired
+    private QwSopMapper qwSopMapper;
+
+    @Autowired
+    private QwUserMapper qwUserMapper;
+
+    @Autowired
+    private SopUserLogsMapper sopUserLogsMapper;
+
+    private static final Cache<String, String> QW_SOP_NAME_CACHE = Caffeine.newBuilder()
+            .maximumSize(5000)
+            .expireAfterWrite(10, TimeUnit.MINUTES)
+            .build();
+
+    private static final Cache<String, String> QW_SOP_LOG_NAME_CACHE = Caffeine.newBuilder()
+            .maximumSize(5000)
+            .expireAfterWrite(10, TimeUnit.MINUTES)
+            .build();
+
+
+    public String getQwSopNameBySopId(String sopId) {
+        return QW_SOP_NAME_CACHE.get(sopId,e->{
+            String sopName = qwSopMapper.selectQwSopNameBySopId(sopId);
+            if(StringUtils.isNotBlank(sopName)){
+                return sopName;
+            }
+            return "-";
+        });
+    }
+
+    public String getQwSopLogNameBySopId(String periodId) {
+        return QW_SOP_LOG_NAME_CACHE.get(periodId,e->{
+            SopUserLogs sopUserLogs = sopUserLogsMapper.selectSopUserLogsById(periodId);
+
+            if(sopUserLogs != null) {
+                String qwUserName = qwUserMapper.selectQwUserName(sopUserLogs.getQwUserId(), sopUserLogs.getCorpId());
+                if(qwUserName != null) {
+                    return qwUserName+"_"+sopUserLogs.getStartTime();
+                }
+            }
+            return "-";
+        });
+    }
+}

+ 61 - 0
fs-service/src/main/java/com/fs/qw/cache/QwUserCacheService.java

@@ -0,0 +1,61 @@
+package com.fs.qw.cache;
+
+import com.fs.qw.dto.QwUserDTO;
+import com.fs.qw.mapper.QwUserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class QwUserCacheService {
+
+    @Autowired
+    private QwUserMapper qwUserMapper;
+
+    private Map<String, Map<String, String>> qwUserCache = new ConcurrentHashMap<>();
+
+
+    @PostConstruct
+    public void initCache() {
+        refreshCache();
+    }
+
+    public void refreshCache() {
+        List<QwUserDTO> allUsers = qwUserMapper.selectAllQwUserMapping();
+        Map<String, Map<String, String>> newCache = new ConcurrentHashMap<>();
+
+        for (QwUserDTO user : allUsers) {
+            newCache.computeIfAbsent(user.getCorpId(), k -> new ConcurrentHashMap<>())
+                    .put(user.getQwUserId(), user.getId());
+        }
+
+        this.qwUserCache = newCache;
+    }
+
+    // 根据qwUserId和corpId获取id
+    public String getIdByQwUserIdAndCorpId(String qwUserId, String corpId) {
+        Map<String, String> corpUsers = qwUserCache.get(corpId);
+        return corpUsers != null ? corpUsers.get(qwUserId) : null;
+    }
+
+    public Map<String, String> batchGetIds(List<String> qwUserIds, String corpId) {
+        Map<String, String> result = new HashMap<>();
+        Map<String, String> corpUsers = qwUserCache.get(corpId);
+
+        if (corpUsers != null) {
+            for (String qwUserId : qwUserIds) {
+                String id = corpUsers.get(qwUserId);
+                if (id != null) {
+                    result.put(qwUserId, id);
+                }
+            }
+        }
+
+        return result;
+    }
+}

+ 12 - 0
fs-service/src/main/java/com/fs/qw/dto/QwUserDTO.java

@@ -0,0 +1,12 @@
+package com.fs.qw.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QwUserDTO implements Serializable {
+    private String qwUserId;
+    private String corpId;
+    private String id;
+}

+ 3 - 0
fs-service/src/main/java/com/fs/qw/mapper/CustomerTransferApprovalMapper.java

@@ -59,4 +59,7 @@ public interface CustomerTransferApprovalMapper
      * @return 结果
      */
     public int deleteCustomerTransferApprovalByIds(Long[] ids);
+
+
+    List<CustomerTransferApproval> queryPendingData();
 }

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

@@ -256,7 +256,12 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "            <if test=\"sTime != null \">  and DATE(ec.create_time) &gt;= DATE(#{sTime})</if>\n" +
             "            <if test=\"eTime != null \">  and DATE(ec.create_time) &lt;= DATE(#{eTime})</if>\n" +
             "            <if test=\"companyUserName != null  and companyUserName != ''\"> and cu.user_name = #{companyUserName}</if>\n" +
-
+            "            <if test=\"cuDeptIdList != null and !cuDeptIdList.isEmpty() and  userType != '00' \">" +
+            "               AND cur.dept_id IN " +
+            "                   <foreach collection='cuDeptIdList' item='item' open='(' separator=',' close=')'> " +
+            "                       #{item} " +
+            "                   </foreach> " +
+            "            </if>" +
             "<if test ='companyUser!=null'> " +
                 "and (cu.nick_name like concat('%', #{companyUser}, '%') or cu.phonenumber= #{companyUser})"+
             "</if> " +

+ 6 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactTransferLogMapper.java

@@ -100,6 +100,12 @@ public interface QwExternalContactTransferLogMapper
             "            <if test=\"customerId != null \"> and l.customer_id = #{customerId}</if>\n" +
             "            <if test=\"externalContactId != null \"> and l.external_contact_id = #{externalContactId}</if>\n" +
             "            <if test=\"status != null  and status != ''\"> and l.status = #{status}</if>\n" +
+            "            <if test=\"cuDeptIdList != null and !cuDeptIdList.isEmpty() and  userType != '00' \">" +
+            "               AND cu.dept_id IN " +
+            "                   <foreach collection='cuDeptIdList' item='item' open='(' separator=',' close=')'> " +
+            "                       #{item} " +
+            "                   </foreach> " +
+            "            </if>" +
             "        </where> " +
             "order by l.create_time desc "+
             "</script>"})

+ 6 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwFriendWelcomeMapper.java

@@ -67,6 +67,12 @@ public interface QwFriendWelcomeMapper
             "            <if test=\"createTime != null \"> and qfw.create_time = #{createTime}</if>\n" +
             "            <if test=\"updateTime != null \"> and qfw.update_time = #{updateTime}</if>\n" +
             "            <if test=\"companyUserId != null \"> and qu.company_user_id = #{companyUserId}</if>\n" +
+            "            <if test=\"cuDeptIdList != null and !cuDeptIdList.isEmpty() and  userType != '00' \">" +
+            "               AND cu.dept_id IN " +
+            "                   <foreach collection='cuDeptIdList' item='item' open='(' separator=',' close=')'> " +
+            "                       #{item} " +
+            "                   </foreach> " +
+            "            </if>" +
             "        </where>" +
             "</script>")
     public List<QwFriendWelcome> selectQwFriendWelcomeListMyVO(QwFriendWelcomeParam qwFriendWelcomeParam);

+ 6 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwGroupChatMapper.java

@@ -66,6 +66,12 @@ public interface QwGroupChatMapper
             "           and gc.owner in " +
             "                   <foreach  item='item' index='index' collection='qwUserIds' open='(' separator=',' close=')'> #{item}   </foreach> " +
             "           </if>" +
+            "            <if test=\"map.cuDeptIdList != null and !map.cuDeptIdList.isEmpty() and  map.userType != '00' \">" +
+            "               AND cu.dept_id IN " +
+            "                   <foreach collection='map.cuDeptIdList' item='item' open='(' separator=',' close=')'> " +
+            "                       #{item} " +
+            "                   </foreach> " +
+            "            </if>" +
             "        </where>" +
             "GROUP BY " +
             "    gc.chat_id, cu.nick_name,qu.qw_user_name   " +

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

@@ -5,9 +5,11 @@ import com.fs.course.param.FsCourseListBySidebarParam;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.domain.QwWorkTask;
 import com.fs.qw.dto.QwUserByToolDTO;
+import com.fs.qw.dto.QwUserDTO;
 import com.fs.qw.dto.QwUserKeyDTO;
 import com.fs.qw.param.*;
 import com.fs.qw.vo.*;
+import com.fs.sop.domain.QwSop;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
@@ -150,6 +152,12 @@ public interface QwUserMapper extends BaseMapper<QwUser>
             "            <if test=\"qwUserName != null  and qwUserName != ''\"> and qu.qw_user_name like concat( #{qwUserName}, '%') </if> " +
             "            <if test=\"corpId != null \"> and qu.corp_id = #{corpId}</if>\n" +
             "            <if test=\"companyId != null \"> and qu.company_id = #{companyId}</if>\n " +
+            "            <if test=\"cuDeptIdList != null and !cuDeptIdList.isEmpty() and  userType != '00' \">" +
+            "               AND cu.dept_id IN " +
+            "                   <foreach collection='cuDeptIdList' item='item' open='(' separator=',' close=')'> " +
+            "                       #{item} " +
+            "                   </foreach> " +
+            "            </if>" +
             "ORDER BY  qu.login_status asc,qu.tool_status desc " +
             "</script>"})
     List<QwUserVO> selectQwUserListStaffVO(QwUserListParam qwUser);
@@ -376,4 +384,35 @@ public interface QwUserMapper extends BaseMapper<QwUser>
     List<QwExternalListByHeavyVO> getQwExternalListByHeavy(@Param("data") FsCourseListBySidebarParam param);
 
     List<QwWorkTask> selectQwWorkTaskList(SelectQwWorkTaskListParam param);
+
+    @Select("select id,qw_user_id,company_user_id from qw_user where is_del=0 and company_user_id is not null")
+    List<QwUser> selectQwUserAllList();
+
+    @Select("select qw_user_id, corp_id, id from qw_user where qw_user_id is not null and corp_id is not null")
+    List<QwUserDTO> selectAllQwUserMapping();
+
+    @Select("select qw_user_name from qw_user where qw_user_id=#{qwUserId} and corp_id=#{corpId}")
+    String selectQwUserName(@Param("qwUserId") String qwUserId,@Param("corpId") String corpId);
+
+    @Select("select qw_user_id from qw_user where company_user_id = ${companyUserId}")
+    List<String> findQwUserIdListByCompanyUserId(@Param("companyUserId") Long companyUserId);
+
+    @Select("select qw_user_id from qw_user where company_user_id = #{userId} and corp_id = #{corpId}")
+    List<String> selectQwUserListByCompanyUserId(@Param("userId") Long userId,@Param("corpId") String corpId);
+
+    @Select("<script>" +
+            "select qu.id from qw_user qu " +
+            "left join company_user cu on cu.user_id=qu.company_user_id " +
+            "where 1=1 " +
+            "            <if test=\"map.corpId != null \"> and qu.corp_id = #{map.corpId}</if>\n" +
+            "            <if test=\"map.userId != null \"> and qu.company_user_id = #{map.userId}</if>\n " +
+            "            <if test=\"map.cuDeptIdList != null and !map.cuDeptIdList.isEmpty() and  map.userType != '00' \">" +
+            "               AND cu.dept_id IN " +
+            "                   <foreach collection='map.cuDeptIdList' item='item' open='(' separator=',' close=')'> " +
+            "                       #{item} " +
+            "                   </foreach> " +
+            "            </if>" +
+            "</script>")
+    List<Long> selectQwUserListByCuDeptIdList(@Param("map") QwSop qwSop);
+
 }

+ 11 - 0
fs-service/src/main/java/com/fs/qw/param/QwExternalContactParam.java

@@ -111,4 +111,15 @@ public class QwExternalContactParam {
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date sTime;
+
+    /**
+     * 销售部门
+     */
+    private List<Long> cuDeptIdList;
+
+    /**
+     * 部门类型 00 管理员 01 员工
+     */
+    private String userType;
+
 }

+ 12 - 0
fs-service/src/main/java/com/fs/qw/param/QwExternalContactTransferLogParam.java

@@ -5,6 +5,7 @@ import com.fs.common.annotation.Excel;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class QwExternalContactTransferLogParam {
@@ -44,4 +45,15 @@ public class QwExternalContactTransferLogParam {
     private Integer status;
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
+
+
+    /**
+     * 销售部门
+     */
+    private List<Long> cuDeptIdList;
+
+    /**
+     * 部门类型 00 管理员 01 员工
+     */
+    private String userType;
 }

+ 11 - 0
fs-service/src/main/java/com/fs/qw/param/QwFriendWelcomeParam.java

@@ -6,6 +6,7 @@ import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class QwFriendWelcomeParam extends BaseEntity {
@@ -61,4 +62,14 @@ public class QwFriendWelcomeParam extends BaseEntity {
     /** 部门ID */
     private Long deptId;
 
+    /**
+     * 销售部门
+     */
+    private List<Long> cuDeptIdList;
+
+    /**
+     * 部门类型 00 管理员 01 员工
+     */
+    private String userType;
+
 }

+ 10 - 0
fs-service/src/main/java/com/fs/qw/param/QwGroupChatParam.java

@@ -50,4 +50,14 @@ public class QwGroupChatParam {
     /** 状态集合 */
     private List<String> statusList;
 
+    /**
+     * 销售部门
+     */
+    private List<Long> cuDeptIdList;
+
+    /**
+     * 部门类型 00 管理员 01 员工
+     */
+    private String userType;
+
 }

+ 15 - 0
fs-service/src/main/java/com/fs/qw/param/QwUserListParam.java

@@ -47,4 +47,19 @@ public class QwUserListParam {
 
     private Integer sendType;
 
+    /**
+     * 企业微信李的部门
+     */
+    private Long deptId;
+
+    /**
+     * 销售部门
+     */
+    private List<Long> cuDeptIdList;
+
+    /**
+     * 部门类型 00 管理员 01 员工
+     */
+    private String userType;
+
 }

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/ICustomerTransferApprovalService.java

@@ -59,4 +59,9 @@ public interface ICustomerTransferApprovalService
      * @return 结果
      */
     public int deleteCustomerTransferApprovalById(Long id);
+
+    /**
+     * 自动审批通过
+     */
+    public void autoApprovePass();
 }

+ 1 - 2
fs-service/src/main/java/com/fs/qw/service/IQwGroupChatService.java

@@ -10,7 +10,6 @@ import com.fs.qw.vo.QwGroupChatOptionsVO;
 import com.fs.qw.vo.QwGroupChatTransferVO;
 import com.fs.qw.vo.QwGroupChatVO;
 
-import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -40,7 +39,7 @@ public interface IQwGroupChatService
     /**
      *  同步客户群列表
      */
-    public R cogradientGroupChat(String corpId) throws Exception;
+    public R cogradientGroupChat(String corpId,List<String> qwUserIdList ) throws Exception;
     /**
      * 新增客户群
      *

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません