Преглед на файлове

将润天的 sop营期 相关的功能迁移到 his_scrm (我的sop/部门sop只能看见 相应的 我创建的模板/部门创建的模板)

三七 преди 3 дни
родител
ревизия
c1cd722261
променени са 17 файла, в които са добавени 675 реда и са изтрити 109 реда
  1. 99 8
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java
  2. 69 13
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  3. 53 6
      fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsController.java
  4. 134 32
      fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsInfoController.java
  5. 72 0
      fs-qwhook/src/main/java/com/fs/app/controller/ApisQwUserController.java
  6. 0 4
      fs-qwhook/src/main/java/com/fs/app/controller/QwUserController.java
  7. 0 4
      fs-qwhook/src/main/java/com/fs/app/params/LoginBindCompanyParam.java
  8. 7 0
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  9. 6 0
      fs-service/src/main/java/com/fs/sop/domain/QwSopTemp.java
  10. 13 0
      fs-service/src/main/java/com/fs/sop/dto/QwCreateLinkByAppDTO.java
  11. 21 0
      fs-service/src/main/java/com/fs/sop/dto/QwSopLogsQueryListDTO.java
  12. 13 0
      fs-service/src/main/java/com/fs/sop/dto/SopUserLogsParamDTO.java
  13. 139 41
      fs-service/src/main/java/com/fs/sop/mapper/SopUserLogsMapper.java
  14. 13 0
      fs-service/src/main/java/com/fs/sop/params/QwSopLogsParam.java
  15. 12 0
      fs-service/src/main/java/com/fs/sop/params/SopUserLogsParam.java
  16. 10 0
      fs-service/src/main/resources/mapper/qw/QwUserMapper.xml
  17. 14 1
      fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml

+ 99 - 8
fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java

@@ -6,26 +6,31 @@ import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.course.service.IFsCourseLinkService;
+import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.dto.QwUserKeyDTO;
+import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.param.GenerateShortLinkParam;
 import com.fs.qw.service.IQwUserService;
+import com.fs.sop.domain.QwSop;
 import com.fs.sop.domain.QwSopLogs;
 import com.fs.sop.params.QwSopLogsParam;
 import com.fs.sop.service.IQwSopLogsService;
 import com.fs.sop.vo.QwSopLogsListCVO;
+import com.fs.voice.utils.StringUtil;
 import org.apache.commons.lang3.tuple.Pair;
 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;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -50,6 +55,15 @@ public class QwSopLogsController extends BaseController
     @Autowired
     private IFsCourseLinkService linkService;
 
+    @Autowired
+    private QwUserMapper qwUserMapper;
+
+    @Autowired
+    private ICompanyUserService iCompanyUserService;
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
     /**
      * 查询企业微信SOP  定时任务列表
      */
@@ -57,12 +71,54 @@ public class QwSopLogsController extends BaseController
     @GetMapping("/listCVO")
     public TableDataInfo listCVO(QwSopLogsParam param)
     {
-        startPage();
+//        startPage();
+//        List<QwSopLogsListCVO> list = iQwSopLogsService.selectQwSopLogsListBySopId(param);
+//        if (!list.isEmpty()){
+//
+//            // 2. 提取不重复的 (qwUserId, corpId) 组合
+//            Set<QwUserKeyDTO> userCorpPairs = list.stream()
+//                    .filter(log -> log.getQwUserid() != null && log.getCorpId() != null)
+//                    .map(log -> new QwUserKeyDTO(log.getQwUserid(), log.getCorpId()))
+//                    .collect(Collectors.toSet());
+//
+//            // 3. 批量查询 qw_user 表
+//            List<QwUser> userList = iQwUserService.batchGetQwUser(new ArrayList<>(userCorpPairs));
+//
+//            // 4. 构建映射表
+//            Map<QwUserKeyDTO, String> userInfoMap = userList.stream()
+//                    .collect(Collectors.toMap(
+//                            user -> new QwUserKeyDTO(user.getQwUserId(), user.getCorpId()),
+//                            QwUser::getQwUserName
+//                    ));
+//
+//            // 5. 填充用户名
+//            list.forEach(log -> {
+//                QwUserKeyDTO key = new QwUserKeyDTO(log.getQwUserid(), log.getCorpId());
+//                log.setQwUserName(userInfoMap.getOrDefault(key, "未知用户"));
+//            });
+//
+//        }
+
+        List<String> qwUserIds=null;
+        if (!StringUtil.strIsNullOrEmpty(param.getQwUserName())){
+            qwUserIds = qwUserMapper.selectQwUserByQwUserName(param.getQwUserName(),param.getCorpId());
+        }
+        if (qwUserIds!=null&& !qwUserIds.isEmpty()){
+            param.setQwUseridList(qwUserIds);
+        }
+
+        if (!StringUtil.strIsNullOrEmpty(param.getQwUserName()) && (qwUserIds==null || qwUserIds.isEmpty())){
+            return getDataTable(new ArrayList<>());
+        }
+
 
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setQwUserKeyList(getQwUserKeyList(param,loginUser));
+
+        startPage();
         List<QwSopLogsListCVO> list = iQwSopLogsService.selectQwSopLogsListBySopId(param);
 
         if (!list.isEmpty()){
-
             // 2. 提取不重复的 (qwUserId, corpId) 组合
             Set<QwUserKeyDTO> userCorpPairs = list.stream()
                     .filter(log -> log.getQwUserid() != null && log.getCorpId() != null)
@@ -84,14 +140,49 @@ public class QwSopLogsController extends BaseController
                 QwUserKeyDTO key = new QwUserKeyDTO(log.getQwUserid(), log.getCorpId());
                 log.setQwUserName(userInfoMap.getOrDefault(key, "未知用户"));
             });
-
         }
 
-
         return getDataTable(list);
     }
 
+    /**
+     * 我的自动化任务 和部门自动化任务 就只显示自己的或者部门的
+     */
+    private List<Long> getQwUserKeyList(QwSopLogsParam param, LoginUser loginUser) {
 
+        switch (param.getFilterSopType()) {
+            case 2:
+                CompanyUser companyUser = iCompanyUserService.selectCompanyUserById(loginUser.getUser().getUserId());
+                return Arrays.stream(companyUser.getQwUserId().split(","))
+                        .map(String::trim)
+                        .filter(s -> !s.isEmpty())
+                        .map(Long::valueOf)
+                        .collect(Collectors.toList());
+
+            case 3:
+                QwSop qwSop = new QwSop();
+                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());
+
+                return iQwUserService.selectQwUserListByCuDeptIdList(qwSop);
+
+            default:
+                return new ArrayList<>(); // 返回空列表而不是null
+        }
+    }
     /**
      * 查询企业微信SOP  定时任务列表
      */

+ 69 - 13
fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.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.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.vo.SortDayVo;
@@ -41,6 +42,11 @@ public class QwSopTempController extends BaseController
     private IQwSopTempService qwSopTempService;
     @Autowired
     private TokenService tokenService;
+
+
+    @Autowired
+    private CompanyDeptServiceImpl companyDeptService;
+
     /**
      * 查询sop模板列表
      */
@@ -57,10 +63,59 @@ public class QwSopTempController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询我创建的sop模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:myList')")
+    @GetMapping("/myList")
+    public TableDataInfo myList(QwSopTemp qwSopTemp)
+    {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwSopTemp.setCompanyId(loginUser.getCompany().getCompanyId());
+        qwSopTemp.setCreateBy(String.valueOf(loginUser.getUser().getUserId()));
+        startPage();
+//        List<QwSopTemp> list = qwSopTempService.selectQwSopTempList(qwSopTemp);
+        List<QwSopTemp> list = qwSopTempService.selectQwSopTempListNew(qwSopTemp);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 查询部门下的sop模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:deptList')")
+    @GetMapping("/deptList")
+    public TableDataInfo deptList(QwSopTemp qwSopTemp)
+    {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwSopTemp.setCompanyId(loginUser.getCompany().getCompanyId());
+
+        List<Long> combinedDpetList = new ArrayList<>();
+        //本部门
+        Long deptId = loginUser.getUser().getDeptId();
+        if (deptId!=null){
+            combinedDpetList.add(deptId);
+        }
+        //本部门的下级部门
+        List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
+        if (!deptList.isEmpty()){
+            combinedDpetList.addAll(deptList);
+        }
+        qwSopTemp.setCuDeptIdList(combinedDpetList);
+
+        startPage();
+//        List<QwSopTemp> list = qwSopTempService.selectQwSopTempList(qwSopTemp);
+        List<QwSopTemp> list = qwSopTempService.selectQwSopTempListNew(qwSopTemp);
+        return getDataTable(list);
+    }
+
+
     /**
      * 导出sop模板列表
      */
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:export')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:export') or @ss.hasPermi('qw:sopTemp:myExport') or @ss.hasPermi('qw:sopTemp:deptExport')")
     @Log(title = "sop模板", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
     public AjaxResult export(QwSopTemp qwSopTemp)
@@ -81,7 +136,7 @@ public class QwSopTempController extends BaseController
     /**
      * 新增sop模板
      */
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:add')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:add') or @ss.hasPermi('qw:sopTemp:myAdd') or @ss.hasPermi('qw:sopTemp:deptAdd')")
     @Log(title = "sop模板", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody QwSopTemp qwSopTemp){
@@ -94,7 +149,7 @@ public class QwSopTempController extends BaseController
     /**
      * 修改sop模板
      */
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
     @Log(title = "sop模板", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody QwSopTemp qwSopTemp)
@@ -109,7 +164,7 @@ public class QwSopTempController extends BaseController
     /**
      * 删除sop模板
      */
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:remove')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:remove') or @ss.hasPermi('qw:sopTemp:myRemove') or @ss.hasPermi('qw:sopTemp:deptRemove')")
     @Log(title = "sop模板", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String[] ids)
@@ -120,7 +175,7 @@ public class QwSopTempController extends BaseController
     }
 
     /** 分享sop模板 */
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:share')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:share') or @ss.hasPermi('qw:sopTemp:myShare') or @ss.hasPermi('qw:sopTemp:deptShare')")
     @Log(title = "分享sop模板", businessType = BusinessType.DELETE)
     @PostMapping("/shareTemp")
     public AjaxResult shareTemp(@RequestBody QwSopShareTempParam param)
@@ -130,7 +185,7 @@ public class QwSopTempController extends BaseController
 
 
 
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:add')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:add') or @ss.hasPermi('qw:sopTemp:myAdd') or @ss.hasPermi('qw:sopTemp:deptAdd')")
     @Log(title = "sop模板addNew", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult addNew(@RequestBody QwSopTemp qwSopTemp){
@@ -148,7 +203,7 @@ public class QwSopTempController extends BaseController
         return toAjax(i);
     }
 
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
     @Log(title = "sop模板update", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     public AjaxResult updateNew(@RequestBody QwSopTemp qwSopTemp){
@@ -156,41 +211,42 @@ public class QwSopTempController extends BaseController
         return toAjax(update);
     }
 
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
     @Log(title = "addOrUpdateSop模板规则", businessType = BusinessType.UPDATE)
     @PostMapping("/addOrUpdateSetting")
     public AjaxResult addOrUpdateSetting(@RequestBody QwSopTempDay day){
         return AjaxResult.success(qwSopTempService.addOrUpdateSetting(day));
     }
 
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
     @Log(title = "sop模板规则delRules", businessType = BusinessType.DELETE)
     @GetMapping("/delRules")
     public AjaxResult delRules(Long id){
         qwSopTempService.delRules(id);
         return toAjax(1);
     }
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:list')")
+
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:list') or @ss.hasPermi('qw:sopTemp:myList') or @ss.hasPermi('qw:sopTemp:deptList')")
     @GetMapping("/selectRulesInfo")
     public AjaxResult selectRulesInfo(Long id){
         return AjaxResult.success(qwSopTempService.selectRulesInfo(id));
     }
 
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
     @PostMapping("/copyTemplate")
     public AjaxResult copyTemplate(@RequestBody QwSopTemp qwSopTemp){
         qwSopTempService.copyTemplate(qwSopTemp);
         return toAjax(1);
     }
 
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
     @PostMapping("/sortDay")
     public AjaxResult sortDay(@RequestBody List<SortDayVo> list){
         qwSopTempService.sortDay(list);
         return toAjax(1);
     }
 
-    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit') or @ss.hasPermi('qw:sopTemp:myEdit') or @ss.hasPermi('qw:sopTemp:deptEdit')")
     @GetMapping("/dayList")
     public AjaxResult dayList(String id){
         return AjaxResult.success(qwSopTempService.dayList(id));

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

@@ -7,7 +7,10 @@ import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.ServletUtils;
+import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
+import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.param.SopUserLogsVO;
 import com.fs.qw.service.IQwUserService;
@@ -15,15 +18,19 @@ import com.fs.qw.vo.AddSopUserGroupChat;
 import com.fs.qw.vo.UpdateSopUserLogDateVo;
 import com.fs.sop.domain.QwSop;
 import com.fs.sop.domain.SopUserLogs;
+import com.fs.sop.dto.SopUserLogsParamDTO;
 import com.fs.sop.mapper.QwSopMapper;
 import com.fs.sop.params.SopUserLogsParam;
 import com.fs.sop.service.ISopUserLogsService;
+import com.fs.voice.utils.StringUtil;
 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;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * sopUserLogsController
@@ -46,6 +53,9 @@ public class SopUserLogsController extends BaseController
     @Autowired
     private QwSopMapper sopMapper;
 
+    @Autowired
+    private IQwUserService iQwUserService;
+
     /**
      * 查询sopUserLogs列表
      */
@@ -55,22 +65,59 @@ public class SopUserLogsController extends BaseController
     {
         sopUserLogs.setStatus(1);
 
+        List<String> qwUserIds=null;
+        if (!StringUtil.strIsNullOrEmpty(sopUserLogs.getQwUserName())){
+            qwUserIds = qwUserMapper.selectQwUserByQwUserName(sopUserLogs.getQwUserName(),sopUserLogs.getCorpId());
+        }
+        if (qwUserIds!=null&& !qwUserIds.isEmpty()){
+            sopUserLogs.setQwUseridList(qwUserIds);
+        }
+
+        if (!StringUtil.strIsNullOrEmpty(sopUserLogs.getQwUserName()) && (qwUserIds==null || qwUserIds.isEmpty())){
+            return getDataTable(new ArrayList<>());
+        }
+
         QwSop qwSop = sopMapper.selectQwSopById(sopUserLogs.getSopId());
         Integer filterMode = qwSop.getFilterMode();
 
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+        List<String> qwUserIdList=null;
+        if (sopUserLogs.getType()==2){
+            qwUserIdList = iQwUserService.selectQwUserListByCompanyUserId(loginUser.getUser().getUserId(), sopUserLogs.getCorpId());
+        }
+        if (qwUserIdList!=null&& !qwUserIdList.isEmpty() && sopUserLogs.getType()==2 ){
+            sopUserLogs.setQwIdsList(qwUserIdList);
+        }
+
         List<SopUserLogsVO> list=null;
         if(filterMode == null || filterMode == 1){
             startPage();
-             list = sopUserLogsService.selectSopUserLogsList(sopUserLogs);
+            list = sopUserLogsService.selectSopUserLogsList(sopUserLogs);
         }else {
             startPage();
             list = sopUserLogsService.selectSopUserLogsGroupListByParam(sopUserLogs);
         }
-
-        list.forEach(item->{
-            item.setQwUserName(qwUserMapper.selectQwUserByQwUserIdAndCorpId(item.getQwUserId(), item.getCorpId()));
-        });
-
+        if (!list.isEmpty()){
+            // 收集所有需要查询的 qwUserId 和 corpId 组合
+            List<SopUserLogsParamDTO> queryList = list.stream()
+                    .map(item -> new SopUserLogsParamDTO(item.getQwUserId(), item.getCorpId()))
+                    .distinct()  // 去重
+                    .collect(Collectors.toList());
+
+            List<QwUser> userList = qwUserMapper.batchSelectQwUserByQwUserIdAndCorpId(queryList);
+            Map<String, String> userMap = userList.stream()
+                    .collect(Collectors.toMap(
+                            user -> user.getQwUserId() + "_" + user.getCorpId(),
+                            QwUser::getQwUserName
+                    ));
+
+            // 设置用户名
+            list.forEach(item -> {
+                String key = item.getQwUserId() + "_" + item.getCorpId();
+                item.setQwUserName(userMap.get(key));
+            });
+        }
         return getDataTable(list);
     }
 

+ 134 - 32
fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsInfoController.java

@@ -31,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -89,6 +90,7 @@ public class SopUserLogsInfoController extends BaseController
                                 QwExternalContactVOTime::getId,
                                 item -> new SopExternalContactInfo(item.getCreateTime(), item.getTagIds(), item.getRemark(),item.getLevel())
                         ));
+
                 List<String> tagIds = qwExternalContactVOTimes.stream().map(QwExternalContactVOTime::getTagIds).filter(StringUtils::isNotEmpty).flatMap(e -> JSON.parseArray(e, String.class).stream()).collect(Collectors.toList());
                 if(!tagIds.isEmpty()){
                     List<QwTag> tagList = qwTagMapper.selectQwTagListByTagIdsNew(tagIds);
@@ -114,22 +116,14 @@ public class SopUserLogsInfoController extends BaseController
                 });
             }
 
-            Predicate<SopUserLogsInfo> tagFilter = item -> {
-                String queryTagIds = sopUserLogsInfo.getTagIds();
-                String itemTagIds = item.getTagIds();
-
-                if (queryTagIds == null || queryTagIds.trim().equals("[]")) {
-                    return true;
-                }
-                List<String> queryTags = parseTagIds(queryTagIds);
-                List<String> itemTags = parseTagIds(itemTagIds);
-
-                // 检查 itemTags 是否包含所有 queryTags(AND 关系)
-                return itemTags.containsAll(queryTags);
-            };
-
             // 优化过滤条件
             boolean isRemarkEmpty = StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getRemark());
+
+            Predicate<SopUserLogsInfo> tagFilter = item ->
+                    sopUserLogsInfo.getTagIds() == null ||
+                            sopUserLogsInfo.getTagIds().isEmpty() ||
+                            item.getTagIds().contains(sopUserLogsInfo.getTagIds());
+
             Predicate<SopUserLogsInfo> remarkFilter = item ->
                     isRemarkEmpty ||
                             item.getRemark().contains(sopUserLogsInfo.getRemark());
@@ -142,34 +136,25 @@ public class SopUserLogsInfoController extends BaseController
 
 
             Predicate<SopUserLogsInfo> timeFilter = item -> {
-
-                if (StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingSTime())
-                        && StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingETime()) ) {
+                if (StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getEntryTime())) {
                     return true;
                 }
                 try {
-                    LocalDateTime entryDate = LocalDateTime.parse(item.getInComTime(),
-                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+                    LocalDate entryDate = LocalDate.parse(
+                            sopUserLogsInfo.getEntryTime(),
+                            DateTimeFormatter.ofPattern("yyyy-MM-dd")
                     );
-                    LocalDateTime inComingSTime = LocalDateTime.parse(sopUserLogsInfo.getInComingSTime(),
-                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+                    LocalDate createDate = LocalDate.parse(
+                            item.getInComTime().substring(0, 10),
+                            DateTimeFormatter.ofPattern("yyyy-MM-dd")
                     );
-
-                    LocalDateTime inComingETime = LocalDateTime.parse(sopUserLogsInfo.getInComingETime(),
-                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
-                    );
-
-                    return !entryDate.isBefore(inComingSTime) && !entryDate.isAfter(inComingETime);
+                    return entryDate.equals(createDate);
                 } catch (Exception e) {
                     return false;
                 }
             };
 
-
-            boolean hasTimeFilter = !StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingSTime())
-                    && !StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingETime());
-
-            if (sopUserLogsInfo.getTagIds() != null || !isRemarkEmpty || hasTimeFilter ||!isLevelEmpty) {
+            if (sopUserLogsInfo.getTagIds() != null || !isRemarkEmpty || !StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getEntryTime()) ||!isLevelEmpty) {
                 list = list.stream()
                         .filter(tagFilter.and(remarkFilter).and(timeFilter).and(levelFilter))
                         .collect(Collectors.toList());
@@ -188,6 +173,123 @@ public class SopUserLogsInfoController extends BaseController
                 item.setLevelName(getLevel(item.getLevel()));
             });
 
+//            List<SopUserLogsInfo> list = sopUserLogsInfoService.selectSopUserLogsInfoList(sopUserLogsInfo);
+//
+//            if (!list.isEmpty()) {
+//                // 使用并行流提取externalId
+//                List<Long> externalIdList = list.parallelStream()
+//                        .map(SopUserLogsInfo::getExternalId)
+//                        .filter(Objects::nonNull)
+//                        .collect(Collectors.toList());
+//
+//                List<QwExternalContactVOTime> qwExternalContactVOTimes =
+//                        iQwExternalContactService.selectQwExternalContactListVOByIds(externalIdList);
+//
+//                // 构建联系人信息映射
+//                Map<Long, SopExternalContactInfo> externalContactInfoMap = qwExternalContactVOTimes.stream()
+//                        .collect(Collectors.toMap(
+//                                QwExternalContactVOTime::getId,
+//                                item -> new SopExternalContactInfo(item.getCreateTime(), item.getTagIds(), item.getRemark(),item.getLevel())
+//                        ));
+//                List<String> tagIds = qwExternalContactVOTimes.stream().map(QwExternalContactVOTime::getTagIds).filter(StringUtils::isNotEmpty).flatMap(e -> JSON.parseArray(e, String.class).stream()).collect(Collectors.toList());
+//                if(!tagIds.isEmpty()){
+//                    List<QwTag> tagList = qwTagMapper.selectQwTagListByTagIdsNew(tagIds);
+//                    Map<String, QwTag> tagMap = PubFun.listToMapByGroupObject(tagList, QwTag::getTagId);
+//                    qwExternalContactVOTimes.forEach(e -> {
+//                        List<String> tagId = JSON.parseArray(e.getTagIds(), String.class);
+//                        if(StringUtils.isNotEmpty(tagId)){
+//                            List<String> tagNameList = tagId.stream().filter(tagMap::containsKey).map(t -> tagMap.get(t).getName()).filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+//                            e.setTagIdsName(tagNameList);
+//                        }
+//                    });
+//                }
+//                // 设置联系信息
+//                list.forEach(item -> {
+//                    SopExternalContactInfo info = externalContactInfoMap.getOrDefault(
+//                            item.getExternalId(),
+//                            new SopExternalContactInfo("无进线时间", "无标签", "无备注",0));
+//                    item.setInComTime(info.getCreateTime());
+//                    item.setTagIds(info.getTagIds());
+//                    item.setRemark(info.getRemark());
+//                    item.setLevel(info.getLevel());
+//
+//                });
+//            }
+//
+//            Predicate<SopUserLogsInfo> tagFilter = item -> {
+//                String queryTagIds = sopUserLogsInfo.getTagIds();
+//                String itemTagIds = item.getTagIds();
+//
+//                if (queryTagIds == null || queryTagIds.trim().equals("[]")) {
+//                    return true;
+//                }
+//                List<String> queryTags = parseTagIds(queryTagIds);
+//                List<String> itemTags = parseTagIds(itemTagIds);
+//
+//                // 检查 itemTags 是否包含所有 queryTags(AND 关系)
+//                return itemTags.containsAll(queryTags);
+//            };
+//
+//            // 优化过滤条件
+//            boolean isRemarkEmpty = StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getRemark());
+//            Predicate<SopUserLogsInfo> remarkFilter = item ->
+//                    isRemarkEmpty ||
+//                            item.getRemark().contains(sopUserLogsInfo.getRemark());
+//
+//
+//            boolean isLevelEmpty = sopUserLogsInfo.getLevel() == null;
+//            Predicate<SopUserLogsInfo> levelFilter = item ->
+//                    isLevelEmpty ||
+//                            (item.getLevel() != null && Objects.equals(item.getLevel(), sopUserLogsInfo.getLevel()) );
+//
+//
+//            Predicate<SopUserLogsInfo> timeFilter = item -> {
+//
+//                if (StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingSTime())
+//                        && StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingETime()) ) {
+//                    return true;
+//                }
+//                try {
+//                    LocalDateTime entryDate = LocalDateTime.parse(item.getInComTime(),
+//                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+//                    );
+//                    LocalDateTime inComingSTime = LocalDateTime.parse(sopUserLogsInfo.getInComingSTime(),
+//                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+//                    );
+//
+//                    LocalDateTime inComingETime = LocalDateTime.parse(sopUserLogsInfo.getInComingETime(),
+//                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+//                    );
+//
+//                    return !entryDate.isBefore(inComingSTime) && !entryDate.isAfter(inComingETime);
+//                } catch (Exception e) {
+//                    return false;
+//                }
+//            };
+//
+//
+//            boolean hasTimeFilter = !StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingSTime())
+//                    && !StringUtil.strIsNullOrEmpty(sopUserLogsInfo.getInComingETime());
+//
+//            if (sopUserLogsInfo.getTagIds() != null || !isRemarkEmpty || hasTimeFilter ||!isLevelEmpty) {
+//                list = list.stream()
+//                        .filter(tagFilter.and(remarkFilter).and(timeFilter).and(levelFilter))
+//                        .collect(Collectors.toList());
+//            }
+//
+//            // 处理标签名称
+//            list.parallelStream().forEach(item -> {
+//                if (item.getTagIds() != null && !item.getTagIds().equals("[]") && !item.getTagIds().equals("无标签")) {
+//                    List<String> tagIds = GSON.fromJson(item.getTagIds(), new TypeToken<List<String>>() {}.getType());
+//                    QwTagSearchParam param = new QwTagSearchParam();
+//                    param.setTagIds(tagIds);
+//                    item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
+//                }
+//
+//                // 处理 level
+//                item.setLevelName(getLevel(item.getLevel()));
+//            });
+
             return getDataTable(list);
         }
         else {

+ 72 - 0
fs-qwhook/src/main/java/com/fs/app/controller/ApisQwUserController.java

@@ -1,10 +1,22 @@
 package com.fs.app.controller;
 
+import com.fs.app.params.LoginBindCompanyParam;
 import com.fs.common.BeanCopyUtils;
+import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
+import com.fs.common.exception.base.BaseException;
+import com.fs.common.utils.PatternUtils;
+import com.fs.common.utils.SecurityUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.param.CompanyUserCodeParam;
+import com.fs.company.service.ICompanyPostService;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.course.param.FsCourseListBySidebarParam;
 import com.fs.qw.domain.QwExternalContactInfo;
 import com.fs.qw.domain.QwTagGroup;
@@ -32,6 +44,7 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
@@ -56,6 +69,19 @@ public class ApisQwUserController extends BaseController {
     @Autowired
     private ISopUserLogsInfoService iSopUserLogsInfoService;
 
+    @Autowired
+    private ICompanyUserService companyUserService;
+
+    @Autowired
+    ICompanyUserService userService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    ICompanyPostService postService;
+
+
 
     @GetMapping("/details")
     @ApiOperation("会员看课详情")
@@ -184,5 +210,51 @@ public class ApisQwUserController extends BaseController {
         return R.error();
     }
 
+    /**
+     * 注册或者绑定销售
+     */
+    @PostMapping("/registerCompany")
+    @Log(title = "注册或者绑定销售", businessType = BusinessType.INSERT)
+    public R registerCompany(@RequestBody CompanyUserCodeParam userCodeParam) {
+        return companyUserService.registerCompany(userCodeParam);
+    }
+
+    @PostMapping("/login")
+    @ApiOperation("密码登录")
+    public R login(@Validated @RequestBody LoginBindCompanyParam param) {
+
+        // 密码校验
+        if (!PatternUtils.checkPassword(param.getPassword())) {
+            return R.error("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20位");
+        }
+
+        try {
+
+            //判断用户基本规则
+            CompanyUser companyUser = userService.selectUserByUserName(param.getAccount());
+            if (companyUser == null) {
+                return R.error("工号不存在");
+            }
+            if (companyUser.getStatus().equals("1")) {
+                return R.error("用户已禁用");
+            }
+            if (!SecurityUtils.matchesPassword(param.getPassword(), companyUser.getPassword())) {
+                return R.error("密码错误");
+            }
+            if (companyUser.getIsAudit() == 0) {
+                return R.error("用户未审核");
+            }
+
+            Company company = companyService.selectCompanyById(companyUser.getCompanyId());
+            if (company == null || company.getStatus() == 0 || company.getIsDel() == 1) {
+                throw new BaseException("此用户所属公司不存在或已停用");
+            }
+
+            return R.ok("验证成功");
+        } catch (Exception e) {
+            return R.error("登录异常:"+e.getMessage());
+        }
+    }
+
 
 }

+ 0 - 4
fs-qwhook/src/main/java/com/fs/app/controller/QwUserController.java

@@ -217,10 +217,6 @@ public class QwUserController extends BaseController {
                 throw new BaseException("此用户所属公司不存在或已停用");
             }
 
-            if (StringUtils.isNotEmpty(company.getCourseMiniAppId()) && !company.getCourseMiniAppId().equals(param.getAppid())){
-                return R.error("登录用户不属于该小程序");
-            }
-
             return R.ok("验证成功");
         } catch (Exception e) {
             return R.error("登录异常:"+e.getMessage());

+ 0 - 4
fs-qwhook/src/main/java/com/fs/app/params/LoginBindCompanyParam.java

@@ -14,8 +14,4 @@ public class LoginBindCompanyParam {
     private String account;
     @NotBlank(message = "请填写密码")
     private String password;
-
-    private String jpushId;
-    @JsonAlias({"appid", "appId"})
-    private String appid;
 }

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

@@ -11,6 +11,7 @@ import com.fs.qw.param.*;
 import com.fs.qw.vo.*;
 import com.fs.qw.vo.sidebar.ExternalContactQwUserVO;
 import com.fs.sop.domain.QwSop;
+import com.fs.sop.dto.SopUserLogsParamDTO;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
@@ -37,6 +38,9 @@ public interface QwUserMapper extends BaseMapper<QwUser>
      */
     public QwUser selectQwUserById(Long id);
 
+    @Select("select qw_user_id from qw_user where qw_user_name = #{qwUserName} and corp_id = #{corpId}")
+    public List<String> selectQwUserByQwUserName (@Param("qwUserName") String qwUserName,@Param("corpId") String corpId);
+
     @Select("SELECT qw_user_id,qw_user_name,corp_id,app_key FROM qw_user WHERE company_user_id is NULL and login_code_url is not NULL")
     public List<QwUser> unlockQwUserLoginCodeUrlTask();
 
@@ -328,6 +332,9 @@ public interface QwUserMapper extends BaseMapper<QwUser>
     @Select("select qw_user_name from qw_user  WHERE qw_user_id=#{userId} and corp_id=#{corpId}")
     String selectQwUserByQwUserIdAndCorpId(@Param("userId") String userId,@Param("corpId")String corpId);
 
+    List<QwUser> batchSelectQwUserByQwUserIdAndCorpId(@Param("data") List<SopUserLogsParamDTO> queryList);
+
+
     @Select("select id from qw_user  WHERE qw_user_id=#{userId} and corp_id=#{corpId}")
 
     Long selectQwUserByQwUserIdAndCorpIdToId(@Param("userId") String userId,@Param("corpId")String corpId);

+ 6 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSopTemp.java

@@ -88,4 +88,10 @@ public class QwSopTemp implements Serializable
     @TableField(exist = false)
     private List<String> timeDesc;
 
+    /**
+     * 销售部门
+     */
+    @TableField(exist = false)
+    private List<Long> cuDeptIdList;
+
 }

+ 13 - 0
fs-service/src/main/java/com/fs/sop/dto/QwCreateLinkByAppDTO.java

@@ -0,0 +1,13 @@
+package com.fs.sop.dto;
+
+import lombok.Data;
+
+@Data
+public class QwCreateLinkByAppDTO {
+
+    //卡片跳转得短链
+    private String sortLink ;
+
+    //发送app消息的链接
+    private String appMsgLink;
+}

+ 21 - 0
fs-service/src/main/java/com/fs/sop/dto/QwSopLogsQueryListDTO.java

@@ -0,0 +1,21 @@
+package com.fs.sop.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QwSopLogsQueryListDTO implements Serializable {
+    /**
+     * SOP任务名称
+     */
+    private String sopName;
+    /**
+     * SOP营期
+     */
+    private String period;
+    /**
+     * 开始时间
+     */
+    private String startTime;
+}

+ 13 - 0
fs-service/src/main/java/com/fs/sop/dto/SopUserLogsParamDTO.java

@@ -0,0 +1,13 @@
+package com.fs.sop.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode
+public class SopUserLogsParamDTO {
+    private String qwUserId;
+    private String corpId;
+}

+ 139 - 41
fs-service/src/main/java/com/fs/sop/mapper/SopUserLogsMapper.java

@@ -146,6 +146,47 @@ public interface SopUserLogsMapper {
     @DataSource(DataSourceType.SOP)
     SopUserLogs selectSopUserLogsByDateAndIds(SopUserLogsParamByDate sopUserLogs);
 
+//    @DataSource(DataSourceType.SOP)
+//    @Select({"<script> " +
+//            "SELECT DISTINCT\n" +
+//            "            l.id,\n" +
+//            "            l.sop_id,\n" +
+//            "            l.sop_temp_id,\n" +
+//            "            l.qw_user_id,\n" +
+//            "            l.corp_id,\n" +
+//            "            l.chat_id,\n" +
+//            "            l.start_time,\n" +
+//            "            l.status,\n" +
+//            "            l.user_id,\n" +
+//            "            DATEDIFF(CURRENT_DATE, l.start_time) + 1 AS count_days\n" +
+//            "        FROM sop_user_logs l " +
+//            "inner join sop_user_logs_info i on l.id = i.user_logs_id "  +
+//            "where 1=1 " +
+//            "<if test = ' maps.id!=null '> " +
+//            "and l.id = #{maps.id} " +
+//            "</if>" +
+//            "<if test = ' maps.sopId != null '> " +
+//            "and l.sop_id = #{maps.sopId} " +
+//            "</if>" +
+//            "<if test = ' maps.sopTempId != null '> " +
+//            "and l.sop_temp_id = #{maps.sopTempId} " +
+//            "</if>" +
+//            "<if test = ' maps.qwUserId!=null  '> " +
+//            "and l.qw_user_id = #{maps.qwUserId} " +
+//            "</if>" +
+//            "<if test = ' maps.startTime!=null  '> " +
+//            "and l.start_time = #{maps.startTime} " +
+//            "</if>" +
+//            "<if test = ' maps.status!=null  '> " +
+//            "and l.status = #{maps.status} " +
+//            "</if>" +
+//            "<if test = ' maps.externalUserName!=null and maps.externalUserName != \"\"  '> " +
+//            "and i.external_user_name like concat('%', #{maps.externalUserName}, '%') " +
+//            "</if>" +
+//            "order by start_time desc" +
+//            "</script>"})
+//    List<SopUserLogsVO> selectSopUserLogsListByParam(@Param("maps") SopUserLogsParam param);
+
     @DataSource(DataSourceType.SOP)
     @Select({"<script> " +
             "SELECT DISTINCT\n" +
@@ -153,8 +194,8 @@ public interface SopUserLogsMapper {
             "            l.sop_id,\n" +
             "            l.sop_temp_id,\n" +
             "            l.qw_user_id,\n" +
-            "            l.corp_id,\n" +
             "            l.chat_id,\n" +
+            "            l.corp_id,\n" +
             "            l.start_time,\n" +
             "            l.status,\n" +
             "            l.user_id,\n" +
@@ -180,54 +221,111 @@ public interface SopUserLogsMapper {
             "<if test = ' maps.status!=null  '> " +
             "and l.status = #{maps.status} " +
             "</if>" +
+            "<if test = ' maps.externalId!=null  '> " +
+            "and i.external_id = #{maps.externalId} " +
+            "</if>" +
             "<if test = ' maps.externalUserName!=null and maps.externalUserName != \"\"  '> " +
             "and i.external_user_name like concat('%', #{maps.externalUserName}, '%') " +
             "</if>" +
-            "order by start_time desc" +
-            "</script>"})
-    List<SopUserLogsVO> selectSopUserLogsListByParam(@Param("maps") SopUserLogsParam param);
-
-    @DataSource(DataSourceType.SOP)
-    @Select({"<script> " +
-            "SELECT DISTINCT\n" +
-            "            l.id,\n" +
-            "            l.sop_id,\n" +
-            "            l.sop_temp_id,\n" +
-            "            l.qw_user_id,\n" +
-            "            l.corp_id,\n" +
-            "            l.chat_id,\n" +
-            "            l.start_time,\n" +
-            "            l.status,\n" +
-            "            l.user_id,\n" +
-            "            DATEDIFF(CURRENT_DATE, l.start_time) + 1 AS count_days\n" +
-            "        FROM sop_user_logs l " +
-            "left join sop_user_logs_info i on l.id = i.user_logs_id "  +
-            "where 1=1 " +
-            "<if test = ' maps.id!=null '> " +
-            "and l.id = #{maps.id} " +
-            "</if>" +
-            "<if test = ' maps.sopId != null '> " +
-            "and l.sop_id = #{maps.sopId} " +
-            "</if>" +
-            "<if test = ' maps.sopTempId != null '> " +
-            "and l.sop_temp_id = #{maps.sopTempId} " +
-            "</if>" +
-            "<if test = ' maps.qwUserId!=null  '> " +
-            "and l.qw_user_id = #{maps.qwUserId} " +
-            "</if>" +
-            "<if test = ' maps.startTime!=null  '> " +
-            "and l.start_time = #{maps.startTime} " +
+            "<if test=\"maps.qwUseridList != null and maps.qwUseridList.size() > 0\">\n" +
+            "    AND l.qw_user_id IN\n" +
+            "    <foreach collection=\"maps.qwUseridList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n" +
+            "        #{item}\n" +
+            "    </foreach>\n" +
             "</if>" +
-            "<if test = ' maps.status!=null  '> " +
-            "and l.status = #{maps.status} " +
-            "</if>" +
-            "<if test = ' maps.externalUserName!=null and maps.externalUserName != \"\"  '> " +
-            "and i.external_user_name like concat('%', #{maps.externalUserName}, '%') " +
+            "<if test=\"maps.type==2 and maps.qwIdsList != null and !maps.qwIdsList.isEmpty() \">\n" +
+            "    AND l.qw_user_id IN\n" +
+            "    <foreach collection=\"maps.qwIdsList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n" +
+            "        #{item}\n" +
+            "    </foreach>\n" +
             "</if>" +
             "order by start_time desc" +
             "</script>"})
-    List<SopUserLogsVO> selectSopUserLogsGroupListByParam(@Param("maps") SopUserLogsParam param);
+    List<SopUserLogsVO> selectSopUserLogsListByParam(@Param("maps") SopUserLogsParam param);
 
+//    @DataSource(DataSourceType.SOP)
+//    @Select({"<script> " +
+//            "SELECT DISTINCT\n" +
+//            "            l.id,\n" +
+//            "            l.sop_id,\n" +
+//            "            l.sop_temp_id,\n" +
+//            "            l.qw_user_id,\n" +
+//            "            l.corp_id,\n" +
+//            "            l.chat_id,\n" +
+//            "            l.start_time,\n" +
+//            "            l.status,\n" +
+//            "            l.user_id,\n" +
+//            "            DATEDIFF(CURRENT_DATE, l.start_time) + 1 AS count_days\n" +
+//            "        FROM sop_user_logs l " +
+//            "left join sop_user_logs_info i on l.id = i.user_logs_id "  +
+//            "where 1=1 " +
+//            "<if test = ' maps.id!=null '> " +
+//            "and l.id = #{maps.id} " +
+//            "</if>" +
+//            "<if test = ' maps.sopId != null '> " +
+//            "and l.sop_id = #{maps.sopId} " +
+//            "</if>" +
+//            "<if test = ' maps.sopTempId != null '> " +
+//            "and l.sop_temp_id = #{maps.sopTempId} " +
+//            "</if>" +
+//            "<if test = ' maps.qwUserId!=null  '> " +
+//            "and l.qw_user_id = #{maps.qwUserId} " +
+//            "</if>" +
+//            "<if test = ' maps.startTime!=null  '> " +
+//            "and l.start_time = #{maps.startTime} " +
+//            "</if>" +
+//            "<if test = ' maps.status!=null  '> " +
+//            "and l.status = #{maps.status} " +
+//            "</if>" +
+//            "<if test = ' maps.externalUserName!=null and maps.externalUserName != \"\"  '> " +
+//            "and i.external_user_name like concat('%', #{maps.externalUserName}, '%') " +
+//            "</if>" +
+//            "order by start_time desc" +
+//            "</script>"})
+//    List<SopUserLogsVO> selectSopUserLogsGroupListByParam(@Param("maps") SopUserLogsParam param);
+@DataSource(DataSourceType.SOP)
+@Select({"<script> " +
+        "SELECT DISTINCT\n" +
+        "            l.id,\n" +
+        "            l.sop_id,\n" +
+        "            l.sop_temp_id,\n" +
+        "            l.qw_user_id,\n" +
+        "            l.corp_id,\n" +
+        "            l.chat_id,\n" +
+        "            l.start_time,\n" +
+        "            l.status,\n" +
+        "            l.user_id,\n" +
+        "            DATEDIFF(CURRENT_DATE, l.start_time) + 1 AS count_days\n" +
+        "        FROM sop_user_logs l " +
+        "left join sop_user_logs_info i on l.id = i.user_logs_id "  +
+        "where 1=1 " +
+        "<if test = ' maps.id!=null '> " +
+        "and l.id = #{maps.id} " +
+        "</if>" +
+        "<if test = ' maps.sopId != null '> " +
+        "and l.sop_id = #{maps.sopId} " +
+        "</if>" +
+        "<if test = ' maps.sopTempId != null '> " +
+        "and l.sop_temp_id = #{maps.sopTempId} " +
+        "</if>" +
+        "<if test = ' maps.qwUserId!=null  '> " +
+        "and l.qw_user_id = #{maps.qwUserId} " +
+        "</if>" +
+        "<if test = ' maps.startTime!=null  '> " +
+        "and l.start_time = #{maps.startTime} " +
+        "</if>" +
+        "<if test = ' maps.status!=null  '> " +
+        "and l.status = #{maps.status} " +
+        "</if>" +
+        "<if test=\" maps.type==2 and maps.qwIdsList != null and maps.qwIdsList.size() > 0  \">\n" +
+        "    AND l.qw_user_id IN\n" +
+        "    <foreach collection=\"maps.qwIdsList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n" +
+        "        #{item}\n" +
+        "    </foreach>\n" +
+        "</if>" +
+        "order by start_time desc" +
+        "</script>"})
+List<SopUserLogsVO> selectSopUserLogsGroupListByParam(@Param("maps") SopUserLogsParam param);
 
     @DataSource(DataSourceType.SOP)
     void batchInsertSopUserLogs(@Param("list") List<SopUserLogs> list);

+ 13 - 0
fs-service/src/main/java/com/fs/sop/params/QwSopLogsParam.java

@@ -1,5 +1,6 @@
 package com.fs.sop.params;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
@@ -18,8 +19,11 @@ public class QwSopLogsParam {
     private String qwUserName;
 
     private String qwUserid;
+
     private List<String> qwUseridByList;
 
+    private List<String> qwUseridList;
+
     /**
      * 客户昵称
      */
@@ -46,6 +50,15 @@ public class QwSopLogsParam {
 
     private Integer type;
 
+    /**
+     * 1 自动化任务 2 我的自动化任务 3 部门自动化任务 只看各自或者部门的
+     */
+    @TableField(exist = false)
+    private Integer filterSopType;
+
+    @TableField(exist = false)
+    private List<Long> qwUserKeyList;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private String scheduleStartTime;
 

+ 12 - 0
fs-service/src/main/java/com/fs/sop/params/SopUserLogsParam.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 @Data
 public class SopUserLogsParam implements Serializable {
@@ -12,6 +13,13 @@ public class SopUserLogsParam implements Serializable {
     private String sopTempId;
 
     private String qwUserId;
+
+    //按名字搜索的存值
+    private List<String> qwUseridList;
+    //按销售id搜索的存值
+    private List<String> qwIdsList;
+
+    private String qwUserName;
     private String corpId;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private String startTime;
@@ -25,6 +33,10 @@ public class SopUserLogsParam implements Serializable {
 
     private String externalUserName;
 
+    private Long externalId;
+
+    //type 2:我的sop 1:部门sop/销售公司sop
+    private Long type;
 
 
 }

+ 10 - 0
fs-service/src/main/resources/mapper/qw/QwUserMapper.xml

@@ -259,4 +259,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectOfflineUser" resultType="com.fs.qw.domain.QwUser">
         select * from qw_user where send_msg_type = 2 and server_id is not null and server_status = 1 and ipad_status = 1 limit 1
     </select>
+
+    <select id="batchSelectQwUserByQwUserIdAndCorpId" resultType="QwUser">
+        SELECT qw_user_id, corp_id, qw_user_name
+        FROM qw_user
+        WHERE
+        <foreach collection="data" item="query" open="(" separator=" OR " close=")">
+            (qw_user_id = #{query.qwUserId} AND corp_id = #{query.corpId})
+        </foreach>
+    </select>
+
 </mapper>

+ 14 - 1
fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml

@@ -191,7 +191,20 @@
             <if test="map.qwUseridByList != null">AND qw_userid IN
                 <foreach collection="map.qwUseridByList" item="item" open="(" separator="," close=")">
                     #{item}
-                </foreach></if>
+                </foreach>
+            </if>
+            <if test="map.qwUseridList != null and map.qwUseridList.size() > 0">
+                AND qw_userid IN
+                <foreach collection="map.qwUseridList" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="map.qwUserKeyList != null and !map.qwUserKeyList.isEmpty() ">
+                AND qw_user_key IN
+                <foreach collection='map.qwUserKeyList' item='item' open='(' separator=',' close=')'>
+                    #{item}
+                </foreach>
+            </if>
         </where>
         ORDER BY send_time desc,real_send_time desc