Bläddra i källkod

Merge remote-tracking branch 'origin/master'

xdd 1 vecka sedan
förälder
incheckning
a3cb7438d4
29 ändrade filer med 432 tillägg och 90 borttagningar
  1. 0 37
      fs-admin/src/test/java/com/fs/api/controller/IndexStatisticsControllerTest.java
  2. 37 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  3. 6 1
      fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java
  4. 74 2
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  5. 4 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwTagController.java
  6. 29 25
      fs-qw-api-msg/src/main/java/com/fs/app/controller/QwMsgController.java
  7. 19 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  8. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  9. 11 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  10. 9 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  11. 7 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java
  12. 11 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  13. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  14. 47 0
      fs-service/src/main/java/com/fs/hisStore/enums/CompanyEnum.java
  15. 2 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  16. 5 2
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  17. 9 7
      fs-service/src/main/java/com/fs/qw/mapper/QwTagMapper.java
  18. 64 1
      fs-service/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java
  19. 5 0
      fs-service/src/main/java/com/fs/qw/param/QwExternalContactParam.java
  20. 5 0
      fs-service/src/main/java/com/fs/qw/param/QwExternalContactUpdateNoteParam.java
  21. 5 0
      fs-service/src/main/java/com/fs/qw/param/QwTagParam.java
  22. 2 0
      fs-service/src/main/java/com/fs/qw/service/IQwWatchLogService.java
  23. 3 3
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  24. 1 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwTagServiceImpl.java
  25. 64 8
      fs-service/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java
  26. 3 0
      fs-service/src/main/java/com/fs/qw/vo/QwTagVO.java
  27. 1 1
      fs-service/src/main/resources/application-config-druid-hat.yml
  28. 2 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  29. 0 1
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

+ 0 - 37
fs-admin/src/test/java/com/fs/api/controller/IndexStatisticsControllerTest.java

@@ -1,37 +0,0 @@
-package com.fs.api.controller;
-
-import com.fs.FSApplication;
-import com.fs.common.core.domain.R;
-import com.fs.statis.dto.AnalysisPreviewQueryDTO;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.jupiter.api.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = FSApplication.class)
-@RequiredArgsConstructor
-@Slf4j
-public class IndexStatisticsControllerTest {
-
-    @Autowired
-    private IndexStatisticsController indexStatisticsController;
-
-    @Test
-    public void analysisPreview() {
-        AnalysisPreviewQueryDTO dto = new AnalysisPreviewQueryDTO();
-        dto.setCompanyId(null);
-        dto.setDeptId(1L);
-        dto.setEndTime("2025-10-31 23:59:59");
-        dto.setStartTime("2025-10-01 00:00:00");
-        dto.setType(4);
-        dto.setUserType(1);
-        R r = indexStatisticsController.analysisPreview(dto);
-        log.info("r: {}",r);
-    }
-}

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

@@ -21,6 +21,7 @@ import com.fs.company.param.CompanyUserAreaParam;
 import com.fs.company.param.CompanyUserCodeParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.service.*;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.company.utils.DomainUtil;
 import com.fs.company.utils.QwStatusEnum;
 import com.fs.company.vo.BatchUserRolesVO;
@@ -100,6 +101,10 @@ public class CompanyUserController extends BaseController {
     @Autowired
     IQwCompanyService iQwCompanyService;
 
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
+
     @Autowired
     private IQwUserService qwUserService;
 
@@ -475,6 +480,38 @@ public class CompanyUserController extends BaseController {
         return  R.ok().put("data",list);
     }
 
+    @GetMapping("/getQwMyUserList/{id}")
+    public R getQwMyUserList(@PathVariable("id") String corpId)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        List<QwUserVO> list = companyUserService.selectCompanyQwUserListByMy(corpId,loginUser.getCompany().getCompanyId(),loginUser.getUser().getUserId());
+        return  R.ok().put("data",list);
+    }
+
+    @GetMapping("/getQwDeptUserList/{id}")
+    public R getQwDeptUserList(@PathVariable("id") String corpId)
+    {
+        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);
+        }
+        String userType = loginUser.getUser().getUserType();
+
+        List<QwUserVO> list = companyUserService.selectCompanyQwUserListByDept(corpId,loginUser.getCompany().getCompanyId(),combinedList,userType);
+        return  R.ok().put("data",list);
+    }
+
+
+
     /**
      * 根据部门的id获取到企业微信的qwuserid
      */

+ 6 - 1
fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java

@@ -225,8 +225,13 @@ public class FsQwCourseWatchLogController extends BaseController
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId( loginUser.getCompany().getCompanyId());
+        List<QwWatchLogStatisticsListVO> list = new ArrayList<>();
 
-        List<QwWatchLogStatisticsListVO> list = qwWatchLogService.selectQwWatchLogStatisticsListVOExport(param);
+        if ("济南联志健康".equals(signProjectName)) {
+            list = qwWatchLogService.selectQwWatchLogStatisticsListVOExportExcludeTransfer(param);
+        }else{
+            list = qwWatchLogService.selectQwWatchLogStatisticsListVOExport(param);
+        }
 
         ExcelUtil<QwWatchLogStatisticsListVO> util = new ExcelUtil<QwWatchLogStatisticsListVO>(QwWatchLogStatisticsListVO.class);
         return util.exportExcel(list, "短链课程看课记录数据");

+ 74 - 2
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java

@@ -13,9 +13,10 @@ import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.impl.CompanyDeptServiceImpl;
+import com.fs.course.param.FsCourseWatchLogListParam;
 import com.fs.course.param.FsUserCourseListUParam;
-import com.fs.course.service.IFsUserCompanyBindService;
-import com.fs.course.service.IFsUserCourseStudyService;
+import com.fs.course.service.*;
+import com.fs.course.vo.FsCourseWatchLogListVO;
 import com.fs.course.vo.FsUserCourseStudyListUVO;
 import com.fs.course.vo.UserWatchLogListVo;
 import com.fs.crm.param.CrmMyCustomerListQueryParam;
@@ -718,7 +719,78 @@ public class QwExternalContactController extends BaseController
         return R.ok("正在批量修改备注中");
     }
 
+    /**
+     * copy批量修改备注方法,该方法提供给我的看课记录里面使用
+     * @param param
+     * @return
+     * @throws JSONException
+     */
+    @PreAuthorize("@ss.hasPermi('qw:externalContact:edit')")
+    @Log(title = "批量修改备注", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchUpdateExternalContactNotesByWatchLog")
+    public R batchUpdateExternalContactNotesByWatchLog(@RequestBody QwExternalContactUpdateNoteParam param) throws JSONException {
+        if(param.isFilter()){
+            param.setWatchLogIds(getWatchLogIds(param.getFromMyList(), param.getWatchLogParam()));
+        }
+        //查询
+        if(null != param.getWatchLogIds() && !param.getWatchLogIds().isEmpty()){
+            param.setUserIds(getUserIdsByWatchLogIds(param.getWatchLogIds()));
+        }
+
+        if(param.getUserIds() == null || param.getUserIds().isEmpty()){
+            return R.error("修改用户为空");
+        }
+        qwUserServiceAsyncHelper.batchUpdateExternalContactNotes(param);
+        return R.ok("正在批量修改备注中");
+    }
+
+    @Autowired
+    private IFsUserCoursePeriodService userCoursePeriodService;
 
+    @Autowired
+    private IFsUserCoursePeriodDaysService userCoursePeriodDaysService;
+
+    @Autowired
+    private IFsCourseWatchLogService fsCourseWatchLogService;
+    /**
+     * 用于适配看课批量修改标签【根据过滤条件版】
+     * @param fromMyList
+     * @param watchLogParam
+     * @return
+     */
+    private List<Long> getWatchLogIds(Integer fromMyList,FsCourseWatchLogListParam watchLogParam){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(Integer.valueOf(0).equals(fromMyList)){
+            watchLogParam.setCompanyId( loginUser.getCompany().getCompanyId());
+        }else{
+            watchLogParam.setCompanyUserId( loginUser.getUser().getUserId());
+        }
+
+        if (watchLogParam.getSendType()==1&& watchLogParam.getPeriodETime()!=null && watchLogParam.getPeriodSTime()!=null) {
+            List<Long> periodIds = userCoursePeriodDaysService.selectFsUserCoursePeriodDaysByTime(watchLogParam.getPeriodSTime(), watchLogParam.getPeriodETime());
+
+            if (!periodIds.isEmpty()){
+                List<Long> longs = userCoursePeriodService.selectFsUserCoursePeriodListByPeriodId(periodIds, loginUser.getCompany().getCompanyId());
+                if (!longs.isEmpty()){
+                    watchLogParam.setPeriodIds(longs);
+                }else {
+                    return new ArrayList<>();
+                }
+            }else {
+                return new ArrayList<>();
+            }
+
+        }
+
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(watchLogParam);
+        List<Long> collect = list.stream().map(FsCourseWatchLogListVO::getLogId).collect(Collectors.toList());
+        return collect;
+    }
+    private List<Long> getUserIdsByWatchLogIds(List<Long> watchLogIds){
+        List<Long> exContactIdsIdsByWatchLogIds = fsCourseWatchLogService.getExContactIdsIdsByWatchLogIds(watchLogIds);
+        Set<Long> set = new HashSet<>(exContactIdsIdsByWatchLogIds);
+        return new ArrayList<>(set);
+    }
 
     private List<Long> getList(Integer addType, QwExternalContactParam param){
         if(addType == null){

+ 4 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwTagController.java

@@ -5,7 +5,9 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwTag;
 import com.fs.qw.param.QwTagParam;
@@ -45,6 +47,8 @@ public class QwTagController extends BaseController
     @PostMapping("/searchTags")
     public TableDataInfo  searchTags(@RequestBody QwTagParam tagParam)
     {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        tagParam.setCompanyId(loginUser.getCompany().getCompanyId());
         return getDataTable(qwTagService.searchTags(tagParam));
     }
     /**

+ 29 - 25
fs-qw-api-msg/src/main/java/com/fs/app/controller/QwMsgController.java

@@ -308,7 +308,7 @@ public class QwMsgController {
                 if (wxWorkMessageDTO.getReferid()!=0){
                     break;
                 }
-                if (wxWorkMessageDTO.getMsgtype()==2||wxWorkMessageDTO.getMsgtype()==0||wxWorkMessageDTO.getMsgtype()==16||wxWorkMessageDTO.getMsgtype() == 101||wxWorkMessageDTO.getMsgtype() == 104||wxWorkMessageDTO.getMsgtype()==141){
+                if (wxWorkMessageDTO.getMsgtype()==2||wxWorkMessageDTO.getMsgtype()==0||wxWorkMessageDTO.getMsgtype()==16||wxWorkMessageDTO.getMsgtype() == 101||wxWorkMessageDTO.getMsgtype() == 104){
 
                     String content = wxWorkMessageDTO.getContent();
                     log.info("id:{}, 接收人:"+wxWorkMessageDTO.getReceiver(), id);
@@ -347,30 +347,6 @@ public class QwMsgController {
                         content = wxWorkMessageDTO.getUrl();
                         log.info("id:{}, 用户发送表情"+content, id);
                     }//视频号
-                    else if (wxWorkMessageDTO.getMsgtype()==141){
-                        QwUser qwUserByAppKey = qwUserMapper.selectQwUserById(id);
-                        if(qwUserByAppKey.getVideoGetStatus() != null && qwUserByAppKey.getVideoGetStatus() == 1){
-                            QwUserVideo qwUserVideo = qwUserVideoService.selectByObjectId(wxWorkMessageDTO.getObjectId(), qwUserByAppKey.getId());
-                            if(qwUserVideo == null){
-                                QwUserVideo userVideo=new QwUserVideo();
-                                userVideo.setSenderName(wxWorkMessageDTO.getSender_name());
-                                userVideo.setAppKey(qwUserByAppKey.getAppKey());
-                                userVideo.setNickName(wxWorkMessageDTO.getNickname());
-                                userVideo.setObjectId(wxWorkMessageDTO.getObjectId());
-                                userVideo.setCoverUrl(wxWorkMessageDTO.getCover_url());
-                                userVideo.setThumbUrl(wxWorkMessageDTO.getThumb_url());
-                                userVideo.setAvatar(wxWorkMessageDTO.getAvatar());
-                                userVideo.setDesc(wxWorkMessageDTO.getDesc());
-                                userVideo.setUrl(wxWorkMessageDTO.getUrl());
-                                userVideo.setExtras(wxWorkMessageDTO.getExtras());
-                                userVideo.setObjectNonceId(wxWorkMessageDTO.getObjectNonceId());
-                                userVideo.setQwUserId(qwUserByAppKey.getId());
-                                userVideo.setCompanyUserId(qwUserByAppKey.getCompanyUserId());
-                                userVideo.setCompanyId(qwUserByAppKey.getCompanyId());
-                                qwUserVideoService.insertQwUserVideo(userVideo);
-                            }
-                        }
-                    }
 
                     if (2000000000000000L-receiver>0){
                         log.info("id:{}, 客户发送", id);
@@ -381,6 +357,34 @@ public class QwMsgController {
                     }
 
                 }
+                //视频号
+                if (wxWorkMessageDTO.getMsgtype()==141){
+                    QwUser qwUserByAppKey = qwUserMapper.selectQwUserById(id);
+                    log.info("进入到视频号:{}",qwUserByAppKey);
+
+                    if(qwUserByAppKey.getVideoGetStatus() != null && qwUserByAppKey.getVideoGetStatus() == 1){
+                        QwUserVideo qwUserVideo = qwUserVideoService.selectByObjectId(wxWorkMessageDTO.getObjectId(), qwUserByAppKey.getId());
+                        if(qwUserVideo == null){
+                            QwUserVideo userVideo=new QwUserVideo();
+                            userVideo.setSenderName(wxWorkMessageDTO.getSender_name());
+                            userVideo.setAppKey(qwUserByAppKey.getAppKey());
+                            userVideo.setNickName(wxWorkMessageDTO.getNickname());
+                            userVideo.setObjectId(wxWorkMessageDTO.getObjectId());
+                            userVideo.setCoverUrl(wxWorkMessageDTO.getCover_url());
+                            userVideo.setThumbUrl(wxWorkMessageDTO.getThumb_url());
+                            userVideo.setAvatar(wxWorkMessageDTO.getAvatar());
+                            userVideo.setDesc(wxWorkMessageDTO.getDesc());
+                            userVideo.setUrl(wxWorkMessageDTO.getUrl());
+                            userVideo.setExtras(wxWorkMessageDTO.getExtras());
+                            userVideo.setObjectNonceId(wxWorkMessageDTO.getObjectNonceId());
+                            userVideo.setQwUserId(qwUserByAppKey.getId());
+                            userVideo.setCompanyUserId(qwUserByAppKey.getCompanyUserId());
+                            userVideo.setCompanyId(qwUserByAppKey.getCompanyId());
+                            qwUserVideoService.insertQwUserVideo(userVideo);
+                            log.info("存储完成:userVideo={}",userVideo);
+                        }
+                    }
+                }
                 //语音通话
                 if (wxWorkMessageDTO.getMsgtype()==40){
                     if (wxWorkMessageDTO.getRecordtype()==null){

+ 19 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -151,6 +151,25 @@ public interface CompanyUserMapper
     @Select("select * from  qw_user  where corp_id=#{corpId} and company_id=#{companyId}")
     List<QwUserVO> selectCompanyQwUserList(@Param("corpId") String corpId,@Param("companyId")Long companyId);
 
+    @Select("select * from  qw_user  where corp_id=#{corpId} and company_id=#{companyId} and company_user_id=#{userId}")
+    List<QwUserVO> selectCompanyQwUserListByMy(@Param("corpId") String corpId,@Param("companyId")Long companyId,@Param("userId")Long userId);
+
+    @Select("<script>" +
+            "select qu.* from qw_user qu " +
+            "left join company_user cu on cu.user_id = qu.company_user_id " +
+            "where 1=1 " +
+            "and qu.corp_id = #{corpId} " +
+            "and qu.company_id = #{companyId} " +
+            "<if test=\"combinedList != null and !combinedList.isEmpty() and  userType != '00' \">" +
+            "and cu.dept_id IN " +
+            "<foreach collection='combinedList' item='deptId' open='(' separator=',' close=')'>" +
+            "#{deptId}" +
+            "</foreach>" +
+            "</if>" +
+            "</script>")
+    List<QwUserVO> selectCompanyQwUserListByDept(@Param("corpId") String corpId,@Param("companyId")Long companyId,
+                                                 @Param("combinedList") List<Long> combinedList,@Param("userType")String userType);
+
 
     List<CompanyUserQwListVO> selectCompanyUserQwListVO(CompanyUserQwParam user);
 

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

@@ -129,6 +129,8 @@ public interface ICompanyUserService {
     List<CitysAreaVO> getCitysAreaList();
 
     List<QwUserVO> selectCompanyQwUserList(String corpId,Long companyId);
+    List<QwUserVO> selectCompanyQwUserListByMy(String corpId,Long companyId,Long userId);
+    List<QwUserVO> selectCompanyQwUserListByDept(String corpId,Long companyId,List<Long> combinedList,String userType);
 
     List<CompanyUserQwListVO> selectCompanyUserQwListVO(CompanyUserQwParam user);
 

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

@@ -663,6 +663,17 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     public List<QwUserVO> selectCompanyQwUserList(String corpId,Long companyId) {
         return companyUserMapper.selectCompanyQwUserList(corpId,companyId);
     }
+
+    @Override
+    public List<QwUserVO> selectCompanyQwUserListByMy(String corpId, Long companyId, Long userId) {
+        return companyUserMapper.selectCompanyQwUserListByMy(corpId,companyId,userId);
+    }
+
+    @Override
+    public List<QwUserVO> selectCompanyQwUserListByDept(String corpId, Long companyId, List<Long> combinedList, String userType) {
+        return companyUserMapper.selectCompanyQwUserListByDept(corpId,companyId,combinedList,userType);
+    }
+
     @Override
     @DataScope(deptAlias = "u", userAlias = "u")
     public List<CompanyUserQwListVO> selectCompanyUserQwListVO(CompanyUserQwParam user) {

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

@@ -570,4 +570,13 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
 
     // 统计当天各公司的观看人数和完播人数, 存到redis中,定时任务每 ? 分钟执行一次
     List<WatchCourseStatisticsResultDTO> watchCourseStatisticsGroupByCompany(@Param("params") Map<String, Object> params);
+
+    @Select({"<script>" +
+            " select qw_external_contact_id from fs_course_watch_log where log_id in  " +
+            "        <foreach collection=\"watchLogIds\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n" +
+               "    #{id} " +
+               "</foreach>" +
+            "</script>"
+    })
+    List<Long> getExContactIdsIdsByWatchLogIds(@Param("watchLogIds")List<Long> watchLogIds);
 }

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

@@ -139,4 +139,11 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
      * 看课统计
      * */
     List<FsCourseWatchLogStatisticsListVO> selectQwFsCourseWatchLogStatisticsListVO(QwSidebarStatsParam param);
+
+    /**
+     * 根据看课记录id获取所有的外部联系人ids
+     * @param watchLogIds
+     * @return
+     */
+    List<Long> getExContactIdsIdsByWatchLogIds(List<Long> watchLogIds);
 }

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

@@ -1289,5 +1289,16 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         return fsCourseWatchLogMapper.selectQwFsCourseWatchLogStatisticsListVO(param);
     }
 
+    /**
+     * 根据看课记录id获取所有的外部联系人ids
+     * @param watchLogIds
+     * @return
+     */
+    @Override
+    public List<Long> getExContactIdsIdsByWatchLogIds(List<Long> watchLogIds){
+        return fsCourseWatchLogMapper.getExContactIdsIdsByWatchLogIds(watchLogIds);
+    }
+
+
 
 }

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

@@ -243,6 +243,11 @@ public class FsUserServiceImpl implements IFsUserService {
         } else {
             fsUser.setPhone(null);
         }
+        if (ObjectUtils.isNotEmpty(fsUser.getLevel())&&fsUser.getLevel().equals(1)){
+            fsUser.setIsShow(1);
+        }else {
+            fsUser.setIsShow(0);
+        }
         return fsUserMapper.updateFsUser(fsUser);
     }
 

+ 47 - 0
fs-service/src/main/java/com/fs/hisStore/enums/CompanyEnum.java

@@ -0,0 +1,47 @@
+package com.fs.hisStore.enums;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 设置单店铺的商城
+ */
+public enum CompanyEnum {
+    YISHANYUAN("益善缘"),
+    KANGNIAN_TANG("康年堂"),
+    SIFU_TANG("四福堂"),
+    NMG_MYT("内蒙古一贴"),
+    CQ_TYT("重庆泰医堂"),
+    CHUNZHENG_TANG("纯正堂");
+
+    private final String companyName;
+
+    CompanyEnum(String companyName) {
+        this.companyName = companyName;
+    }
+
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    /**
+     * 静态集合,避免每次调用都重新创建
+     */
+    private static final Set<String> COMPANY_NAMES = Collections.unmodifiableSet(
+            Arrays.stream(values())
+                    .map(CompanyEnum::getCompanyName)
+                    .collect(Collectors.toSet())
+    );
+
+    /**
+     * 比较是否存在
+     *
+     * @param companyName
+     * @return
+     */
+    public static boolean contains(String companyName) {
+        return COMPANY_NAMES.contains(companyName);
+    }
+}

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

@@ -28,6 +28,7 @@ import com.fs.his.vo.FsStoreProductListSVO;
 import com.fs.his.vo.OptionsVO;
 import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.hisStore.domain.*;
+import com.fs.hisStore.enums.CompanyEnum;
 import com.fs.hisStore.mapper.*;
 import com.fs.hisStore.utils.StoreAuditLogUtil;
 import com.fs.statis.dto.ModifyMoreDTO;
@@ -338,7 +339,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         product.setStoreId(param.getStoreId());
         product.setIsDrug(param.getIsDrug().toString());
         //校验店铺资质信息
-        if(!("益善缘".equals(cloudHostProper.getCompanyName())) && !("康年堂".equals(cloudHostProper.getCompanyName())) && !("纯正堂".equals(cloudHostProper.getCompanyName()))){
+        if (!CompanyEnum.contains(cloudHostProper.getCompanyName())) {
             //获取店铺
             FsStoreScrm store = fsStoreScrmService.selectFsStoreByStoreId(product.getStoreId());
             if(store == null || 1 != store.getStatus()){
@@ -416,7 +417,6 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         return R.ok();
     }
 
-
     private void addProductAttr(Long productId, List<ProductArrtDTO> items, List<FsStoreProductAttrValueScrm> values){
         //清空attr
         fsStoreProductAttrMapper.clear(productId);

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

@@ -251,8 +251,11 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "    </foreach>\n" +
             "    )"+
             "</if> " +
-
-//            "            <if test=\"remarkMobiles != null  and remarkMobiles != ''\"> and ec.remark_mobiles like concat( #{remarkMobiles}, '%')</if>\n" +
+            "<if test='outTagIds !=null'>\n" +
+            "    AND <foreach collection=\"outTagIds\" item=\"item\" open=\"(\" separator=\" AND \" close=\")\">\n" +
+            "        NOT find_in_set(#{item}, REGEXP_REPLACE(ec.tag_ids, '[\\\"\\\\[\\\\]]', ''))\n" +
+            "    </foreach>\n" +
+            "</if>"+
             "<if test=\"remarkMobiles != null and remarkMobiles != ''\">\n" +
             "    AND ec.search_mobile LIKE concat(#{remarkMobiles}, '%')\n" +
             "</if>" +

+ 9 - 7
fs-service/src/main/java/com/fs/qw/mapper/QwTagMapper.java

@@ -70,14 +70,16 @@ public interface QwTagMapper
      */
     public int deleteQwTagByIds(Long[] ids);
     @Select({"<script> " +
-            "select * from qw_tag "+
+            " select t1.*,t2.corp_name from qw_tag t1 "+
+            " inner join qw_company t2 on t1.corp_id = t2.corp_id " +
             "<where>\n" +
-            "            <if test=\"tagId != null  and tagId != ''\"> and tag_id = #{tagId}</if>\n" +
-            "            <if test=\"name != null  and name != ''\"> and name like concat('%', #{name}, '%')</if>\n" +
-            "            <if test=\"groupId != null  and groupId != ''\"> and group_id = #{groupId}</if>\n" +
-            "            <if test=\"order != null  and order != ''\"> and `order` = #{order}</if>\n" +
-            "            <if test=\"corpId != null  and corpId != ''\"> and corp_id = #{corpId}</if>\n" +
-            "            <if test=\"companyId != null \"> and company_id = #{companyId}</if>\n" +
+            "            <if test=\"tagId != null  and tagId != ''\"> and t1.tag_id = #{tagId}</if>\n" +
+            "            <if test=\"name != null  and name != ''\"> and t1.name like concat('%', #{name}, '%')</if>\n" +
+            "            <if test=\"groupId != null  and groupId != ''\"> and t1.group_id = #{groupId}</if>\n" +
+            "            <if test=\"order != null  and order != ''\"> and t1.`order` = #{order}</if>\n" +
+            "            <if test=\"corpId != null  and corpId != ''\"> and t1.corp_id = #{corpId}</if>\n" +
+//            "            <if test=\"companyId != null \"> and t1.company_id = #{companyId}</if>\n" +
+            "            <if test=\"companyId != null \">and FIND_IN_SET(#{companyId},t2.company_ids) </if>\n" +
             "</where>"+
             "</script>"})
     List<QwTagVO> selectQwTagListVO(QwTag qwTag);

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

@@ -145,7 +145,7 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
             "<if test ='nickName !=null and nickName!=\"\"'>\n" +
             "   and qu.qw_user_name like concat( #{nickName}, '%')\n" +
             "</if>" +
-            "<if test ='deptId !=null and deptId!=\"\"'>\n" +
+            "<if test ='(deptIds ==null or deptIds.size = 0) and deptId !=null and deptId!=\"\"'>\n" +
             "   and cu.dept_id = #{deptId}\n" +
             "</if>" +
             " <if test=\"filterDeptIds != null and filterDeptIds.size() != 0\">\n" +
@@ -154,6 +154,12 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
             "         ${item}\n" +
             "      </foreach>\n" +
             " </if> " +
+            "<if test ='deptIds !=null and deptIds.size > 0'>\n" +
+            "and cu.dept_id in" +
+            "<foreach collection=\"deptIds\" item=\"deptId\" index=\"index\"  separator=\",\" open=\"(\" close=\")\">\n" +
+            "     #{deptId}\n" +
+            "</foreach>" +
+            "</if>" +
             "<if test ='ids !=null and ids!=\"\"'>\n" +
             "   and qec.qw_user_id in (${ids})\n" +
             "</if>" +
@@ -212,6 +218,63 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
             "    DATE(qec.create_time) "+
             "</script>"})
     List<QwWatchLogStatisticsListVO> selectQwExtCountByDayAndOther(FsCourseWatchLogListParam param);
+
+    @Select({"<script> " +
+            "SELECT\n" +
+            "    qec.qw_user_id id,\n" +
+            "    qu.qw_user_name AS qw_user_name, \n" +
+            "    DATE(qec.create_time) AS create_time, \n" +
+            "    COUNT(1) AS line,\n" +
+            "    COUNT(CASE WHEN qec.is_interact = 1 THEN 1 END) AS interact,\n" +
+            "    COUNT(CASE WHEN qec.`level` = 1 THEN 1 END) AS A,\n" +
+            "    COUNT(CASE WHEN qec.`level` = 2 THEN 1 END) AS B,\n" +
+            "    COUNT(CASE WHEN qec.`level` = 3 THEN 1 END) AS C,\n" +
+            "    COUNT(CASE WHEN qec.`level` = 4 THEN 1 END) AS D,\n" +
+            "    COUNT(CASE WHEN qec.`level` = 5 THEN 1 END) AS E,\n" +
+            "    COUNT(CASE WHEN qec.fs_user_id IS NOT NULL THEN 1 END) AS sign,\n" +
+            "    COUNT(CASE WHEN qec.`status` =3 THEN 1 END) AS los,\n" +
+            "    COUNT(CASE WHEN qec.`status` IN (4, 5,6) THEN 1 END) AS del\n" +
+            "FROM\n" +
+            "    qw_external_contact qec\n" +
+            "JOIN\n" +
+            "    qw_user qu ON qec.qw_user_id = qu.id \n" +
+            "left join company_user cu on qec.company_user_id = cu.user_id "+
+            "WHERE\n" +
+            "    DATE(qec.create_time) &gt;= DATE(#{sTime}) and  DATE(qec.create_time) &lt;= DATE(#{eTime}) and qec.company_id =#{companyId} " +
+            " and NOT EXISTS (\n" +
+            " SELECT 1 \n" +
+            " FROM qw_external_contact_transfer_log t " +
+            " WHERE t.external_contact_id = qec.id " +
+            " AND DATE(t.create_time) &gt;= DATE(#{sTime}) \n" +
+            " AND DATE(t.create_time) &lt;= DATE(#{eTime})\n" +
+            " )" +
+            "<if test ='nickName !=null and nickName!=\"\"'>\n" +
+            "   and qu.qw_user_name like concat( #{nickName}, '%')\n" +
+            "</if>" +
+            "<if test ='deptIds !=null and deptIds.size > 0'>\n" +
+            "and cu.dept_id in" +
+            "<foreach collection=\"deptIds\" item=\"deptId\" index=\"index\"  separator=\",\" open=\"(\" close=\")\">\n" +
+            "     #{deptId}\n" +
+            "</foreach>" +
+            "</if>" +
+            "<if test ='(deptIds == null or deptIds.size == 0) and deptId !=null and deptId!=\"\"'>\n" +
+            "   and cu.dept_id = #{deptId}\n" +
+            "</if>" +
+            " <if test=\"deptIds != null and deptIds.size() != 0\">\n" +
+            "     and cu.dept_id  in\n" +
+            "      <foreach collection=\"deptIds\" item=\"item\" open=\"(\" close=\")\" separator=\",\">\n" +
+            "         ${item}\n" +
+            "      </foreach>\n" +
+            " </if> " +
+            "<if test ='ids !=null and ids!=\"\"'>\n" +
+            "   and qec.qw_user_id in (${ids})\n" +
+            "</if>" +
+            "GROUP BY\n" +
+            "    qec.qw_user_id, DATE(qec.create_time) \n" +
+            "ORDER BY\n" +
+            "    DATE(qec.create_time) "+
+            "</script>"})
+    List<QwWatchLogStatisticsListVO> selectQwExtCountByDayAndOtherExcludeTransfer(FsCourseWatchLogListParam param);
     @Select("select \n" +
             "COUNT(CASE WHEN day = 0 and status in (1,2) THEN 1 END) AS firstOnline,\n" +
             "COUNT(CASE WHEN day = 0 and status=2 THEN 1 END) AS firstOver,\n" +

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

@@ -70,6 +70,11 @@ public class QwExternalContactParam {
     @Excel(name = "标签id")
     private List<String> tagIds;
 
+
+    /** 排除的标签id */
+    @Excel(name = "排除标签id")
+    private List<String> outTagIds;
+
     private String remark;
 
     /** 备注电话号码 */

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

@@ -1,5 +1,6 @@
 package com.fs.qw.param;
 
+import com.fs.course.param.FsCourseWatchLogListParam;
 import lombok.Data;
 
 import java.util.List;
@@ -13,4 +14,8 @@ public class QwExternalContactUpdateNoteParam {
     private Integer addType;
     private boolean filter;
     private QwExternalContactParam param;
+    private List<Long> watchLogIds;
+    //来源于我的看课记录 1 来源于看课记录 0
+    private Integer fromMyList;
+    private FsCourseWatchLogListParam watchLogParam;
 }

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

@@ -12,4 +12,9 @@ public class QwTagParam  {
     /** 企业id */
     @Excel(name = "企业id")
     private String corpId;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
 }

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

@@ -81,4 +81,6 @@ public interface IQwWatchLogService extends IService<QwWatchLog>{
     TableDataInfo selectQwWatchLogStatisticsListVONew(QwWatchLogStatisticsListParam param);
 
     List<QwWatchLogStatisticsListVO> selectQwWatchLogStatisticsListVOExport(FsCourseWatchLogListParam param);
+
+    List<QwWatchLogStatisticsListVO> selectQwWatchLogStatisticsListVOExportExcludeTransfer(FsCourseWatchLogListParam param);
 }

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

@@ -4337,9 +4337,9 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
     @Override
     public void deletefollowUserByExternalUserId(String externalUserID, String userID, String corpId) {
 
-        //客户删除销售-找这个销售的sop任务中所有的营期里有没有这个客户,删了(暂时不要删-这种流失的有些一样能发消息)
-//        sopUserLogsInfoMapper.deleteByQwUserIdAndCorpIdToContactId(userID,corpId, externalUserID);
-//        logger.error("客户删除销售-"+"|"+externalUserID+"|"+userID+"|"+corpId);
+        //客户删除销售-找这个销售的sop任务中所有的营期里有没有这个客户-流失客户删除
+        sopUserLogsInfoMapper.deleteByQwUserIdAndCorpIdToContactId(userID,corpId, externalUserID);
+        logger.error("客户删除销售-"+"|"+externalUserID+"|"+userID+"|"+corpId);
 
         QwExternalContact qwExternalContact = qwExternalContactMapper.selectQwExternalContactUserIdAndExternalIdAndCompanyId(externalUserID, userID, corpId);
         if (qwExternalContact != null) {

+ 1 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwTagServiceImpl.java

@@ -74,6 +74,7 @@ public class QwTagServiceImpl implements IQwTagService
         QwTag qwTag = new QwTag();
         qwTag.setName(tagParam.getName());
         qwTag.setCorpId(tagParam.getCorpId());
+        qwTag.setCompanyId(tagParam.getCompanyId());
         List<QwTagVO> qwTags = qwTagMapper.selectQwTagListVO(qwTag);
 
         // Step 2: 提取 GroupId 列表(去重)

+ 64 - 8
fs-service/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java

@@ -183,6 +183,44 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         }
         return vos;
     }
+    @Override
+    public List<QwWatchLogStatisticsListVO> selectQwWatchLogStatisticsListVOExportExcludeTransfer(FsCourseWatchLogListParam param) {
+        List<Long> deptIds = param.getDeptIds();
+        if (deptIds !=null && !deptIds.isEmpty()){
+            List<CompanyDept> companyDeptList  = companyDeptMapper.selectCompanyDeptByIds(deptIds);
+            if (companyDeptList!=null && !companyDeptList.isEmpty()){
+                for (CompanyDept c : companyDeptList) {
+                    if (c.getParentId() == 0L) {
+                        param.setDeptId(null);
+                        param.setDeptIds(null);
+                        break;
+                    }
+                }
+            }
+        } else {
+            CompanyDept companyDept = companyDeptMapper.selectCompanyDeptById(param.getDeptId());
+            if (ObjectUtils.isNotEmpty(companyDept)&&companyDept.getParentId()==0L){
+                param.setDeptId(null);
+            }
+        }
+
+
+        if (param.getCompanyUserId()!=null){
+            param.setIds(companyUserMapper.selectQwUserIdsByCompany(param.getCompanyUserId()));
+        }
+//        List<QwWatchLogStatisticsListVO> vos = qwWatchLogMapper.selectQwExtCountByDayAndOther(param);
+        List<QwWatchLogStatisticsListVO> vos = qwWatchLogMapper.selectQwExtCountByDayAndOtherExcludeTransfer(param);
+        for (QwWatchLogStatisticsListVO vo : vos) {
+            Long id = vo.getId();
+            Date createTime = vo.getCreateTime();
+            QwWatchLogStatisticsListVO stat = qwWatchLogMapper.selectQwWatchLogByQwUserId(id, createTime);
+            vo.setD1Online(stat.getD1Online());
+            vo.setD1Over(stat.getD1Over());
+            vo.setFirstOnline(stat.getFirstOnline());
+            vo.setFirstOver(stat.getFirstOver());
+        }
+        return vos;
+    }
 
     @Override
     public TableDataInfo selectQwWatchLogStatisticsListVO(QwWatchLogStatisticsListParam param) {
@@ -246,14 +284,32 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
      */
     @Override
     public TableDataInfo selectQwWatchLogStatisticsListVOExcludeTransfer(QwWatchLogStatisticsListParam param){
-        CompanyDept companyDept = companyDeptMapper.selectCompanyDeptById(param.getDeptId());
-        if (ObjectUtils.isNotEmpty(companyDept)&&companyDept.getParentId()==0L){
-            param.setDeptId(null);
-        }else {
-            //通过部门id去找到所有子部门id
-            List<Long> currentDeptIdDownTreeIds = companyDeptMapper.getCurrentDeptIdDownTreeIds(param.getDeptId());
-            param.setFilterDeptIds(currentDeptIdDownTreeIds);
-            param.setDeptId(null);
+//        CompanyDept companyDept = companyDeptMapper.selectCompanyDeptById(param.getDeptId());
+//        if (ObjectUtils.isNotEmpty(companyDept)&&companyDept.getParentId()==0L){
+//            param.setDeptId(null);
+//        }else {
+//            //通过部门id去找到所有子部门id
+//            List<Long> currentDeptIdDownTreeIds = companyDeptMapper.getCurrentDeptIdDownTreeIds(param.getDeptId());
+//            param.setFilterDeptIds(currentDeptIdDownTreeIds);
+//            param.setDeptId(null);
+//        }
+        List<Long> deptIds = param.getDeptIds();
+        if (deptIds !=null && !deptIds.isEmpty()){
+            List<CompanyDept> companyDeptList  = companyDeptMapper.selectCompanyDeptByIds(deptIds);
+            if (companyDeptList!=null && !companyDeptList.isEmpty()){
+                for (CompanyDept c : companyDeptList) {
+                    if (c.getParentId() == 0L) {
+                        param.setDeptId(null);
+                        param.setDeptIds(null);
+                        break;
+                    }
+                }
+            }
+        } else {
+            CompanyDept companyDept = companyDeptMapper.selectCompanyDeptById(param.getDeptId());
+            if (ObjectUtils.isNotEmpty(companyDept)&&companyDept.getParentId()==0L){
+                param.setDeptId(null);
+            }
         }
         TableDataInfo rspData = new TableDataInfo();
         rspData.setCode(HttpStatus.SUCCESS);

+ 3 - 0
fs-service/src/main/java/com/fs/qw/vo/QwTagVO.java

@@ -28,5 +28,8 @@ public class QwTagVO {
      */
     private Integer tagFrom;
 
+    /** 主体名称 */
+    private String corpName;
+
 
 }

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

@@ -91,7 +91,7 @@ cloud_host:
 headerImg:
   imgUrl: https://hat-1323137866.cos.ap-chongqing.myqcloud.com/fs/20250928/hatlogo.png
 ipad:
-  ipadUrl: http://ipad.****.cn
+  ipadUrl: http://hatipad.ylrzcloud.com
   aiApi: http://62:3000/api
   voiceApi:
   commonApi:

+ 2 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -624,12 +624,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null">is_del = #{isDel},</if>
             <if test="userCode != null">user_code = #{userCode},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="level != null">level = #{level},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="lastIp != null">last_ip = #{lastIp},</if>
             <if test="balance != null">balance = #{balance},</if>
             <if test="integralStatus != null">integral_status = #{integralStatus},</if>
             <if test="isBuy != null">is_buy = #{isBuy},</if>
+            <if test="isShow != null">is_show = #{isShow},</if>
             <if test="password != null">password = #{password},</if>
             <if test="jpushId != null">jpush_id = #{jpushId},</if>
             <if test="isVip != null">is_vip = #{isVip},</if>

+ 0 - 1
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -92,7 +92,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                p.unit_price,p.batch_number,p.mah,p.mah_address,p.manufacturer,p.manufacturer_address,p.indications,p.dosage,
                p.adverse_reactions,p.contraindications,p.precautions,p.is_audit,p.store_id
         from fs_store_product_scrm p
-        select product_id, video, image, slider_image, product_name, product_info, keyword, bar_code, cate_id, price, vip_price, ot_price, agent_price, postage, unit_name, sort, sales, stock, is_show, is_hot, is_benefit, is_best, is_new, description, create_time, update_time, is_postage, is_del, give_integral, cost, is_good, browse, code_path, temp_id, spec_type, is_integral, integral, product_type, prescribe_code, prescribe_spec, prescribe_factory, prescribe_name, is_display, tui_cate_id, company_ids, store_id, is_drug, drug_image, drug_reg_cert_no, common_name, dosage_form, unit_price, batch_number, mah, mah_address, manufacturer, manufacturer_address, indications, dosage, adverse_reactions, contraindications, precautions, is_audit from fs_store_product_scrm
     </sql>
 
     <select id="selectFsStoreProductByProductId" parameterType="Long" resultMap="FsStoreProductResult">