Przeglądaj źródła

新增查询客户添加销售数

xw 5 dni temu
rodzic
commit
1bba0f0580

+ 86 - 4
fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactController.java

@@ -1,19 +1,30 @@
 package com.fs.qw.controller;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.service.ICompanyService;
+import com.fs.course.config.CourseConfig;
+import com.fs.framework.web.service.TokenService;
+import com.fs.his.vo.OptionsVO;
 import com.fs.qw.domain.QwContactWay;
+import com.fs.qw.domain.QwUser;
 import com.fs.qw.param.*;
 import com.fs.qw.service.IQwContactWayService;
 import com.fs.qw.service.IQwExternalContactInfoService;
 import com.fs.qw.service.IQwGroupChatUserService;
 import com.fs.qw.service.IQwTagService;
+import com.fs.qw.service.IQwUserService;
 import com.fs.course.service.IFsUserCompanyBindService;
 import com.fs.course.vo.UserWatchLogListVo;
 import com.fs.qw.vo.QwExternalContactUnionIdExportVO;
@@ -41,6 +52,7 @@ import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.system.service.ISysConfigService;
 
 /**
  * 企业微信客户Controller
@@ -67,6 +79,18 @@ public class QwExternalContactController extends BaseController
     @Autowired
     private IFsUserCompanyBindService fsUserCompanyBindService;
 
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private IQwUserService qwUserService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private ISysConfigService configService;
+
     QwExternalContactController(IQwExternalContactService qwExternalContactService,IQwTagService iQwTagService){
         this.qwExternalContactService=qwExternalContactService;
         this.iQwTagService=iQwTagService;
@@ -80,10 +104,16 @@ public class QwExternalContactController extends BaseController
     @GetMapping("/list")
     public TableDataInfo list(QwExternalContactParam qwExternalContact)
     {
-        if (qwExternalContact.getFsUserId() == null
-                && qwExternalContact.getExtId() == null
-                && qwExternalContact.getId() == null
-                && StringUtils.isEmpty(qwExternalContact.getExternalUserId())) {
+        boolean hasBasicQuery = qwExternalContact.getFsUserId() != null
+                || qwExternalContact.getExtId() != null
+                || qwExternalContact.getId() != null
+                || StringUtils.isNotEmpty(qwExternalContact.getExternalUserId());
+        boolean hasAddSalesQuery = qwExternalContact.getAddSalesCount() != null
+                && hasAddSalesCountScope(qwExternalContact);
+        if (!hasBasicQuery && !hasAddSalesQuery) {
+            return getDataTable(new ArrayList<>());
+        }
+        if (qwExternalContact.getAddSalesCount() != null && !hasAddSalesCountScope(qwExternalContact)) {
             return getDataTable(new ArrayList<>());
         }
 
@@ -132,6 +162,58 @@ public class QwExternalContactController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 添加销售数筛选 - 公司下拉
+     */
+    @PreAuthorize("@ss.hasPermi('qw:externalContact:list')")
+    @GetMapping("/companyOptions")
+    public R companyOptions() {
+        Long deptId = resolveDeptIdForCompanyScope();
+        List<OptionsVO> list = companyService.selectAllCompanyList(deptId);
+        return R.ok().put("data", list);
+    }
+
+    /**
+     * 添加销售数筛选 - 销售下拉(企微昵称 qwUserName)
+     */
+    @PreAuthorize("@ss.hasPermi('qw:externalContact:list')")
+    @GetMapping("/salesOptions")
+    public R salesOptions(@RequestParam(required = false) Long companyId) {
+        if (companyId == null) {
+            return R.ok().put("data", new ArrayList<>());
+        }
+        QwUser query = new QwUser();
+        query.setCompanyId(companyId);
+        List<Map<String, String>> options = qwUserService.selectQwUserList(query).stream()
+                .map(QwUser::getQwUserName)
+                .filter(StringUtils::isNotEmpty)
+                .distinct()
+                .sorted()
+                .map(name -> {
+                    Map<String, String> option = new HashMap<>(2);
+                    option.put("dictLabel", name);
+                    option.put("dictValue", name);
+                    return option;
+                })
+                .collect(Collectors.toList());
+        return R.ok().put("data", options);
+    }
+
+    private Long resolveDeptIdForCompanyScope() {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig courseConfig = JSONUtil.toBean(json, CourseConfig.class);
+        if (!loginUser.isAdmin() && courseConfig.getDept() != null && courseConfig.getDept()) {
+            return loginUser.getDeptId();
+        }
+        return null;
+    }
+
+    private boolean hasAddSalesCountScope(QwExternalContactParam param) {
+        return param.getCompanyId() != null
+                || StringUtils.isNotEmpty(param.getQwUserName());
+    }
+
     public String getContactWayNameStream(String configStr, List<QwContactWay> wayList) {
         if (configStr == null || wayList == null || wayList.isEmpty()) {
             return null;

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

@@ -237,6 +237,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
 
     @Select({"<script> " +
             "select ec.*,qu.qw_user_name,qd.dept_name as departmentName,cw.name way_name,wg.group_name way_group_name," +
+            "<if test=\"addSalesCount != null\">pr_asc.add_sales_count as addSalesCount,</if>" +
             "fu.first_login_app_time as firstLoginAppTime,fu.first_login_reward_address as firstLoginRewardAddress,fu.red_status as redStatus," +
             "fu.manage_status as manageStatus,fu.manage_remark as manageRemark from qw_external_contact ec " +
             "left join qw_user qu on ec.user_id=qu.qw_user_id and qu.corp_id=ec.corp_id " +
@@ -244,7 +245,18 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "left join company_user cu on ec.company_user_id=cu.user_id " +
             "left join fs_user fu on fu.user_id = ec.fs_user_id " +
             "left join qw_contact_way cw on cw.id = ec.way_id " +
-            "left join qw_contact_way_group wg on wg.id=cw.group_id" +
+            "left join qw_contact_way_group wg on wg.id=cw.group_id " +
+            "<if test=\"addSalesCount != null\">" +
+            " inner join (" +
+            "   select fs_user_id, max(qw_user_count) as add_sales_count" +
+            "   from fs_user_project_repeat" +
+            "   where fs_user_id is not null" +
+            "   <if test=\"companyId != null\"> and company_id = #{companyId}</if>" +
+            "   <if test=\"canonicalProjectId != null\"> and project_id = #{canonicalProjectId}</if>" +
+            "   group by fs_user_id" +
+            "   having max(qw_user_count) &gt;= #{addSalesCount}" +
+            " ) pr_asc on ec.fs_user_id = pr_asc.fs_user_id" +
+            "</if>" +
             "<where>  \n" +
             "            <if test=\"id != null  and id != ''\"> and ec.id   like concat( #{id}, '%') </if>\n" +
             "            <if test=\"isRepeat != null\"> and ec.is_repeat   = #{isRepeat} </if>\n" +
@@ -324,7 +336,10 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
                 "and (cu.nick_name like concat('%', #{companyUser}, '%') or cu.phonenumber= #{companyUser})"+
             "</if> " +
             "        </where>"+
-            "order by ec.create_time desc,ec.id desc"+
+            "<choose>" +
+            "<when test=\"addSalesCount != null\">order by pr_asc.add_sales_count desc, ec.create_time desc, ec.id desc</when>" +
+            "<otherwise>order by ec.create_time desc, ec.id desc</otherwise>" +
+            "</choose>"+
             "</script>"})
     @DataSource(DataSourceType.SLAVE)
     List<QwExternalContactVO> selectQwExternalContactListVO(QwExternalContactParam qwExternalContact);
@@ -372,6 +387,17 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "                  )\n" +
             "            </if>\n" +
             "            <if test=\"projectId == null and userRepeat != null \"> and ec.user_repeat = #{userRepeat}</if>\n" +
+            "            <if test=\"addSalesCount != null\">\n" +
+            "                  and ec.fs_user_id is not null\n" +
+            "                  and exists (\n" +
+            "                    select 1 from fs_user_project_repeat pr\n" +
+            "                    where pr.fs_user_id = ec.fs_user_id\n" +
+            "                      <if test=\"canonicalProjectId != null\">\n" +
+            "                        and pr.project_id = #{canonicalProjectId}\n" +
+            "                      </if>\n" +
+            "                      and pr.qw_user_count &gt;= #{addSalesCount}\n" +
+            "                  )\n" +
+            "            </if>\n" +
             "            <if test=\"transferStatus != null \"> and ec.transfer_status = #{transferStatus}</if>\n" +
             "            <if test=\"qwUserId != null \"> and ec.qw_user_id = #{qwUserId}</if>\n" +
             "            <if test=\"level != null \"> and ec.level = #{level}</if>\n" +

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

@@ -174,4 +174,10 @@ public class QwExternalContactParam {
 
     //群名称
     private String chatName;
+
+    /**
+     * 添加销售数筛选(查询 qw_user_count >= addSalesCount,须同时传 companyId 或 qwUserName)
+     */
+    @TableField(exist = false)
+    private Integer addSalesCount;
 }

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

@@ -22,6 +22,8 @@ import com.fs.course.domain.FsCourseSop;
 import com.fs.course.domain.FsCourseSopLogs;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.domain.FsUserCourse;
+import com.fs.course.domain.FsUserProjectRepeat;
+import com.fs.course.mapper.FsUserProjectRepeatMapper;
 import com.fs.course.mapper.FsCourseLinkMapper;
 import com.fs.course.mapper.FsCourseSopLogsMapper;
 import com.fs.course.mapper.FsCourseSopMapper;
@@ -122,6 +124,8 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
     @Autowired
     private QwExternalContactMapper qwExternalContactMapper;
     @Autowired
+    private FsUserProjectRepeatMapper fsUserProjectRepeatMapper;
+    @Autowired
     private IQwTagService iQwTagService;
     @Autowired
     ICompanyConfigService companyConfigService;
@@ -906,6 +910,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         prepareProjectRepeatFilter(qwExternalContact);
         List<QwExternalContactVO> list = qwExternalContactMapper.selectQwExternalContactListVO(qwExternalContact);
         list.forEach(this::fillManageInfo);
+        fillAddSalesCount(list, qwExternalContact);
         return list;
     }
 
@@ -920,6 +925,53 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         }
     }
 
+    private void fillAddSalesCount(List<QwExternalContactVO> list, QwExternalContactParam param) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        List<Long> fsUserIds = list.stream()
+                .map(QwExternalContactVO::getFsUserId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        if (fsUserIds.isEmpty()) {
+            return;
+        }
+
+        QueryWrapper<FsUserProjectRepeat> wrapper = new QueryWrapper<FsUserProjectRepeat>()
+                .in("fs_user_id", fsUserIds);
+        if (param.getCompanyId() != null) {
+            wrapper.eq("company_id", param.getCompanyId());
+        }
+        if (param.getCanonicalProjectId() != null) {
+            wrapper.eq("project_id", param.getCanonicalProjectId());
+        }
+        List<FsUserProjectRepeat> records = fsUserProjectRepeatMapper.selectList(wrapper);
+        if (records.isEmpty()) {
+            return;
+        }
+
+        Map<Long, Integer> countMap;
+        if (param.getCanonicalProjectId() != null) {
+            countMap = records.stream().collect(Collectors.toMap(
+                    FsUserProjectRepeat::getFsUserId,
+                    FsUserProjectRepeat::getQwUserCount,
+                    (left, right) -> left));
+        } else {
+            countMap = records.stream().collect(Collectors.groupingBy(
+                    FsUserProjectRepeat::getFsUserId,
+                    Collectors.collectingAndThen(
+                            Collectors.mapping(FsUserProjectRepeat::getQwUserCount, Collectors.toList()),
+                            counts -> counts.stream().filter(Objects::nonNull).max(Integer::compareTo).orElse(null))));
+        }
+
+        list.forEach(item -> {
+            if (item.getFsUserId() != null && item.getAddSalesCount() == null) {
+                item.setAddSalesCount(countMap.get(item.getFsUserId()));
+            }
+        });
+    }
+
     @Override
     public List<QwExternalContactUnionIdExportVO> selectQwExternalContactUnionIdExportVO(QwExternalContactParam qwExternalContact) {
         prepareProjectRepeatFilter(qwExternalContact);

+ 4 - 0
fs-service/src/main/java/com/fs/qw/vo/QwExternalContactVO.java

@@ -173,4 +173,8 @@ public class QwExternalContactVO {
 
     //群名称
     private List<String> chatNames;
+
+    /** 添加销售数(fs_user_project_repeat.qw_user_count) */
+    @Excel(name = "添加销售数")
+    private Integer addSalesCount;
 }