Bladeren bron

add:app下载统计 update:historyApp设置值

ct 23 uur geleden
bovenliggende
commit
a4ae708e7a

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

@@ -31,6 +31,7 @@ import com.fs.qw.domain.QwContactWay;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwTag;
 import com.fs.qw.dto.CompanyTransferDTO;
+import com.fs.qw.dto.SalesAppDownloadStatDTO;
 import com.fs.qw.param.*;
 import com.fs.qw.service.*;
 import com.fs.qw.vo.QwExternalContactVO;
@@ -1002,4 +1003,31 @@ public class QwExternalContactController extends BaseController
 
     }
 
+    @GetMapping("/getSalesAppDownloadStats")
+    public TableDataInfo getSalesAppDownloadStats(AppDownloadParam param) {
+        // 设置企业ID(实际项目中从登录信息获取)
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getCompany().getCompanyId();
+        param.setCompanyId(companyId);
+
+        TableDataInfo salesAppDownloadStats = qwExternalContactService.getSalesAppDownloadStats(param);
+
+        return salesAppDownloadStats;
+    }
+
+    @GetMapping("/exportSalesAppDownloadStats")
+    public AjaxResult exportSalesAppDownloadStats(AppDownloadParam param) {
+        // 设置企业ID(实际项目中从登录信息获取)
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getCompany().getCompanyId();
+        param.setCompanyId(companyId);
+
+        // 获取所有统计数据(不分页)
+        List<SalesAppDownloadStatDTO> list = qwExternalContactService.exportSalesAppDownloadStats(param);
+
+        // 用 ExcelUtil 导出
+        ExcelUtil<SalesAppDownloadStatDTO> util = new ExcelUtil<>(SalesAppDownloadStatDTO.class);
+        return util.exportExcel(list, "销售APP下载统计");
+    }
+
 }

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

@@ -7,6 +7,8 @@ import com.fs.company.param.CompanyUserAreaParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.vo.*;
 import com.fs.his.vo.OptionsVO;
+import com.fs.qw.dto.SalesAppDownloadStatDTO;
+import com.fs.qw.param.AppDownloadParam;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwOptionsVO;
 import com.fs.qw.vo.QwUserVO;
@@ -356,4 +358,8 @@ public interface CompanyUserMapper
     Long getUserByUserName(String companyUserName);
 
     List<CompanyUser> selectCompanyUserListByPhone(@Param("phone") String phone);
+
+    List<CompanyUser> getSalesByCompanyId(@Param("param") AppDownloadParam param);
+
+    SalesAppDownloadStatDTO getSalesAppDownloadStats(@Param("param") AppDownloadParam param);
 }

+ 31 - 0
fs-service/src/main/java/com/fs/qw/dto/SalesAppDownloadStatDTO.java

@@ -0,0 +1,31 @@
+package com.fs.qw.dto;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class SalesAppDownloadStatDTO {
+    @Excel(name = "销售ID")
+    private Long userId;
+    @Excel(name = "部门ID")
+    private Long deptId;
+    @Excel(name = "销售名称")
+    private String nickName;
+    @Excel(name = "已注册客户数")
+    private Integer totalCustomers;
+    @Excel(name = "下载app客户数")
+    private Integer downloadCount;
+    @Excel(name = "未下载app客户数")
+    private Integer notDownloadCount;
+    @Excel(name = "总客户数")
+    private Integer externalTotal;
+
+    @Excel(name = "下载APP比例(%)")
+    private Double downloadRate;
+    public Double getDownloadRate() {
+        if (externalTotal == null || externalTotal == 0) {
+            return 0.0;
+        }
+        return downloadCount * 1.0 / externalTotal;
+    }
+}

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

@@ -533,4 +533,6 @@ public interface QwUserMapper extends BaseMapper<QwUser>
     Long getqwUserByphone(String phone);
 
     QwUserVO getQwUserCompanyInfo(@Param("qwUserId") Long qwUserId);
+
+    List<Long> selectIdByCompanyUserId(@Param("companyUserId")Long companyUserId);
 }

+ 44 - 0
fs-service/src/main/java/com/fs/qw/param/AppDownloadParam.java

@@ -0,0 +1,44 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class AppDownloadParam {
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 员工姓名(模糊搜索)
+     */
+    private String companyUserName;
+
+    /**
+     * 统计日期,默认当天
+     */
+    private Date statDate;
+
+    /**
+     * 企业ID(可以从登录信息中获取)
+     */
+    private Long companyId;
+
+    Long companyUserId;
+    private List<Long> qwUserIds;
+
+    private int pageNum;
+
+    private int pageSize;
+
+
+    public Date getStatDate() {
+        if (statDate == null) {
+            return new Date();
+        }
+        return statDate;
+    }
+}

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

@@ -3,10 +3,12 @@ package com.fs.qw.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
 import com.fs.course.param.FsCourseListBySidebarParam;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwTag;
 import com.fs.qw.domain.QwUser;
+import com.fs.qw.dto.SalesAppDownloadStatDTO;
 import com.fs.qw.param.*;
 import com.fs.qw.param.newparam.ExternalContactPageListParam;
 import com.fs.qw.param.sidebar.ExternalContactInfoParam;
@@ -289,4 +291,8 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
     List<QwMandatoryRegistrParam> selectQwExternalContactMandatoryRegistrationByIds(String corpId);
 
     int batchUpdateQwExternalContactMandatoryRegistration(List<QwMandatoryRegistrParam> batchList);
+
+    TableDataInfo getSalesAppDownloadStats(AppDownloadParam param);
+
+    List<SalesAppDownloadStatDTO> exportSalesAppDownloadStats(AppDownloadParam param);
 }

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

@@ -14,11 +14,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.ad.enums.AdUploadType;
 import com.fs.ad.service.IAdHtmlClickLogService;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.PubFun;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.service.ICompanyConfigService;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.domain.FsCourseSop;
@@ -37,6 +40,7 @@ import com.fs.his.domain.FsUser;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.qw.domain.*;
+import com.fs.qw.dto.SalesAppDownloadStatDTO;
 import com.fs.qw.mapper.*;
 import com.fs.qw.param.*;
 import com.fs.qw.param.newparam.ExternalContactPageListParam;
@@ -71,6 +75,8 @@ import com.fs.sop.service.ISopUserLogsService;
 import com.fs.system.service.ISysConfigService;
 import com.fs.system.service.ISysDictTypeService;
 import com.fs.voice.utils.StringUtil;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
@@ -220,6 +226,8 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
     private QwExternalContactTransferCompanyAuditUserMapper companyAuditUserMapper;
     @Autowired
     private CloudHostProper cloudHostProper;
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
 
     Logger logger = LoggerFactory.getLogger(getClass());
 
@@ -6024,6 +6032,74 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         return qwExternalContactMapper.batchUpdateQwExternalContactMandatoryRegistration( batchList);
     }
 
+    @Override
+    public TableDataInfo getSalesAppDownloadStats(AppDownloadParam param) {
+
+        // 分页查询销售列表
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<CompanyUser> sales = companyUserMapper.getSalesByCompanyId(param);
+
+        List<Long> userIds = sales.stream().map(CompanyUser::getUserId).collect(Collectors.toList());
+        if (userIds.isEmpty()) {
+            return new TableDataInfo(Collections.emptyList(), 0);
+        }
+        List<SalesAppDownloadStatDTO> statDTOs = new ArrayList<>();
+        for (Long userId : userIds) {
+            List<Long> longs = qwUserMapper.selectIdByCompanyUserId(userId);
+            param.setCompanyUserId(userId);
+            param.setQwUserIds(longs);
+            SalesAppDownloadStatDTO salesAppDownloadStats = companyUserMapper.getSalesAppDownloadStats(param);
+            statDTOs.add(salesAppDownloadStats);
+        }
+
+//        param.setCompanyUserIds(userIds);
+
+        //  查询统计数据 不分页
+        PageHelper.clearPage();
+        //List<SalesAppDownloadStatDTO> statDTOs = companyUserMapper.getSalesAppDownloadStats(param);
+
+        //  total 取销售列表总数
+        Long total = ((Page<?>) sales).getTotal();  // PageHelper 返回的 Page 对象保存 total
+
+        return new TableDataInfo(statDTOs, Integer.parseInt(total.toString()));
+    }
+
+    @Override
+    public List<SalesAppDownloadStatDTO> exportSalesAppDownloadStats(AppDownloadParam param) {
+
+        //  获取当前企业所有销售(不分页)
+        List<CompanyUser> sales = companyUserMapper.getSalesByCompanyId(param);
+        List<Long> userIds = sales.stream().map(CompanyUser::getUserId).collect(Collectors.toList());
+
+        if (userIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        List<SalesAppDownloadStatDTO> statDTOs = new ArrayList<>();
+        for (Long userId : userIds) {
+            List<Long> longs = qwUserMapper.selectIdByCompanyUserId(userId);
+            param.setCompanyUserId(userId);
+            param.setQwUserIds(longs);
+            SalesAppDownloadStatDTO salesAppDownloadStats = companyUserMapper.getSalesAppDownloadStats(param);
+            statDTOs.add(salesAppDownloadStats);
+        }
+
+//        param.setCompanyUserIds(userIds);
+
+        //  查询统计数据 不分页
+        PageHelper.clearPage();
+        //List<SalesAppDownloadStatDTO> statDTOs = companyUserMapper.getSalesAppDownloadStats(param);
+        statDTOs.forEach(s -> {
+            if (s.getTotalCustomers() == null || s.getTotalCustomers() == 0) {
+                s.setDownloadRate(0.00);
+            } else {
+                double rate = s.getDownloadCount() * 100.0 / s.getTotalCustomers();
+                s.setDownloadRate(Double.parseDouble(String.format("%.2f", rate)));
+            }
+        });
+        return statDTOs;
+    }
+
     @Override
     public R getRepeat(RepeatParam param) {
         List<QwExternalContact> list = qwExternalContactMapper.selectList(new QueryWrapper<QwExternalContact>().eq("external_user_id", param.getExternalUserId()));

+ 54 - 0
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -744,5 +744,59 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select * from company_user
          where phonenumber=#{phone} and del_flag = '0'
     </select>
+    <select id="getSalesByCompanyId" resultType="com.fs.company.domain.CompanyUser">
+        SELECT user_id, dept_id, nick_name
+        FROM company_user
+        WHERE company_id = #{param.companyId}
+        <if test="param.deptId != null">
+            AND dept_id = #{param.deptId}
+        </if>
+        <if test="param.companyUserName != null and param.companyUserName != ''">
+            AND nick_name LIKE CONCAT('%', #{param.companyUserName}, '%')
+        </if>
+    </select>
+    <select id="getSalesAppDownloadStats" resultType="com.fs.qw.dto.SalesAppDownloadStatDTO">
+        <if test="param.qwUserIds != null and param.qwUserIds.size() > 0">
+            SELECT cu.user_id,cu.dept_id,cu.nick_name,
+            IFNULL(cust.totalCustomers, 0) AS totalCustomers,
+            IFNULL(cust.downloadCount, 0) AS downloadCount,
+            IFNULL(cust.totalCustomers, 0) - IFNULL(cust.downloadCount, 0) AS notDownloadCount,
+            (SELECT COUNT(*)
+            FROM qw_external_contact ec2
+            WHERE ec2.qw_user_id IN
+            <foreach collection="param.qwUserIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+            AND (ec2.create_time &lt;= #{param.statDate}))
+            AS externalTotal
+            FROM company_user cu
+            LEFT JOIN (SELECT ec.company_user_id,COUNT(*) AS totalCustomers,
+            SUM(u.history_app IS NOT NULL) AS downloadCount
+            FROM qw_external_contact ec
+            LEFT JOIN fs_user u
+            ON u.user_id = ec.fs_user_id
+            WHERE ec.qw_user_id IN
+            <foreach collection="param.qwUserIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+            AND ec.fs_user_id is not null AND
+            ec.create_time &lt; #{param.statDate}
+            GROUP BY ec.company_user_id) AS cust
+            ON cu.user_id = cust.company_user_id
+            WHERE cu.user_id = #{param.companyUserId}
+        </if>
+        <if test="param.qwUserIds == null or param.qwUserIds.size() == 0">
+            SELECT
+            cu.user_id,
+            cu.dept_id,
+            cu.nick_name,
+            0 AS totalCustomers,
+            0 AS downloadCount,
+            0 AS notDownloadCount,
+            0 AS externalTotal
+            FROM company_user cu
+            WHERE user_id = #{param.companyUserId}
+        </if>
+    </select>
 
 </mapper>

+ 11 - 1
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -52,10 +52,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="level" column="level"/>
         <result property="appOpenId"    column="app_open_id"    />
         <result property="appleKey"    column="apple_key"    />
+        <result property="historyApp"    column="history_app"    />
     </resultMap>
 
     <sql id="selectFsUserVo">
-        select user_id,qw_ext_id,sex,is_buy,`level`,course_ma_open_id,is_push,is_add_qw,source,login_device,is_individuation_push,store_open_id,password,jpush_id, is_vip,vip_start_date,vip_end_date,vip_level,vip_status,nick_name,integral_status, avatar, phone, integral,sign_num, status, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, create_time, update_time, last_ip, balance,is_weixin_auth,parent_id,qw_user_id,app_id,company_id,company_user_id,is_promoter,now_money,brokerage_price,spread_user_id, spread_time,pay_count, spread_count,user_type,app_open_id,apple_key from fs_user
+        select user_id,qw_ext_id,sex,is_buy,`level`,course_ma_open_id,is_push,is_add_qw,source,login_device,
+               is_individuation_push,store_open_id,password,jpush_id, is_vip,vip_start_date,vip_end_date,
+               vip_level,vip_status,nick_name,integral_status, avatar, phone, integral,sign_num, status,
+               tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code,
+               remark, create_time, update_time, last_ip, balance,is_weixin_auth,parent_id,qw_user_id,app_id,
+               company_id,company_user_id,is_promoter,now_money,brokerage_price,spread_user_id, spread_time,pay_count,
+               spread_count,user_type,app_open_id,apple_key,history_app from fs_user
     </sql>
 
     <select id="selectFsUserList" parameterType="FsUser" resultMap="FsUserResult">
@@ -593,6 +600,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="appId != null">app_id,</if>
             <if test="appOpenId != null">app_open_id,</if>
             <if test="appleKey != null">apple_key,</if>
+            <if test="historyApp != null">history_app,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="nickName != null">#{nickName},</if>
@@ -645,6 +653,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="appId != null">#{appId},</if>
             <if test="appOpenId != null">#{appOpenId},</if>
             <if test="appleKey != null">#{appleKey},</if>
+            <if test="historyApp != null">#{historyApp},</if>
          </trim>
     </insert>
 
@@ -699,6 +708,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="appId != null">app_id = #{appId},</if>
             <if test="appOpenId != null">app_open_id = #{appOpenId},</if>
             <if test="appleKey != null">apple_key = #{appleKey},</if>
+            <if test="historyApp != null and historyApp != ''">history_app = #{historyApp},</if>
         </trim>
         where user_id = #{userId}
     </update>

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

@@ -378,6 +378,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select qu.qw_user_id,qu.qw_user_name,c.company_name from qw_user qu left join company c on qu.company_id = c.company_id
         where qu.id = #{qwUserId}
     </select>
+    <select id="selectIdByCompanyUserId" resultType="java.lang.Long">
+        select id from qw_user where company_user_id = #{companyUserId}
+    </select>
 
 
 </mapper>

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -357,7 +357,7 @@ public class UserController extends  AppBaseController {
         String userId = getUserId();
         FsUser fsUser = new FsUser();
         fsUser.setUserId(Long.parseLong(userId));
-//        fsUser.setHistoryApp(historyApp);
+        fsUser.setHistoryApp(historyApp);
         if (userService.updateFsUser(fsUser)>0) {
             return R.ok();
         } else {