Просмотр исходного кода

1.增加销售行为分析代码
2.增加销售上线和下线代码

jzp 2 дней назад
Родитель
Сommit
c1793e67c2

+ 22 - 4
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -25,10 +25,7 @@ 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;
-import com.fs.company.vo.CompanyUserImportVO;
-import com.fs.company.vo.CompanyUserQwListVO;
-import com.fs.company.vo.CompanyUserVO;
+import com.fs.company.vo.*;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.config.saas.ProjectConfig;
 import com.fs.course.config.CourseConfig;
@@ -39,6 +36,7 @@ import com.fs.framework.security.SecurityUtils;
 import com.fs.framework.service.TokenService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
+import com.fs.hisStore.domain.FsUserScrm;
 import com.fs.hisStore.service.IFsUserScrmService;
 import com.fs.hisStore.vo.FsStoreProductExportVO;
 import com.fs.im.dto.OpenImResponseDTO;
@@ -73,6 +71,8 @@ import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
+import static net.sf.jsqlparser.util.validation.metadata.NamedObject.user;
+
 
 /**
  * 用户信息
@@ -290,6 +290,24 @@ public class CompanyUserController extends BaseController {
         return AjaxResult.success(message);
     }
 
+    /**
+     * 销售行为分析
+     * @return
+     */
+    @GetMapping("/analyseCompanyUserInfo/{id}")
+    public AjaxResult analyseCompanyUserInfo(@PathVariable("id") Long id) {
+        CompanyUserAnalyseVO paramInfo = companyUserService.createCompanyUserAnalyseInfo(id);
+        return AjaxResult.success(paramInfo);
+    }
+
+    @GetMapping("/selectCompanyUserInfo/{id}")
+    public AjaxResult selectCompanyUserInfo(@PathVariable("id") Long id) {
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(id);
+        return AjaxResult.success(companyUser);
+    }
+
+
+
 
     @GetMapping("/importTemplate")
     public AjaxResult importTemplate()

+ 10 - 0
fs-company/src/main/java/com/fs/company/controller/fastGpt/FastGptChatSessionController.java

@@ -109,6 +109,16 @@ public class FastGptChatSessionController extends BaseController
         return toAjax(fastGptChatSessionService.updateFastGptChatSession(session));
     }
 
+    @PreAuthorize("@ss.hasPermi('fastGpt:fastGptChatSession:edit')")
+    @Log(title = "转人工取消ai回复", businessType = BusinessType.UPDATE)
+    @GetMapping("/notReply")
+    public AjaxResult notReply(Long sessionId)
+    {
+        FastGptChatSession session = new FastGptChatSession();
+        session.setSessionId(sessionId);
+        return toAjax(fastGptChatSessionService.updateFastGptChatSessionNew(session));
+    }
+
     /**
      * 删除对话关系
      */

+ 10 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -199,9 +199,19 @@ public class CompanyUser extends BaseEntity
     /** 绑定的公司用户ID */
     private Long bindCompanyUserId;
 
+    private String analyseData;
+
     @TableField(exist = false)
     private List<Long> deptList;
 
+    public String getAnalyseData() {
+        return analyseData;
+    }
+
+    public void setAnalyseData(String analyseData) {
+        this.analyseData = analyseData;
+    }
+
     public String getMaOpenId() {
         return maOpenId;
     }

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

@@ -364,4 +364,12 @@ public interface CompanyUserMapper
     public int updateCompanyUserByAiSipCall(@Param("companyUserId") Long companyUserId, @Param("aiSipCallId") Long aiSipCallId);
 
     Integer getUserCount();
+
+    CompanyUserAnalyseVO selectCompanyUserOrderCountAndMoney(@Param("companyUserId") Long id);
+
+    CompanyUserAnalyseVO selectCompanyUserWatchCourseCount(@Param("companyUserId") Long id);
+
+    CompanyUserAnalyseVO selectCompanyUserNewUserCount(@Param("companyUserId") Long id);
+
+    CompanyUserAnalyseVO selectCompanyUserPhoneLogCount(@Param("companyUserId") Long id);
 }

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

@@ -275,4 +275,5 @@ public interface ICompanyUserService {
     List<CompanyUser> getDataScopeCompanyUser(Long companyUserId);
 
     Integer getUserCount();
+    CompanyUserAnalyseVO createCompanyUserAnalyseInfo(Long id);
 }

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

@@ -23,6 +23,9 @@ import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.service.*;
 import com.fs.company.vo.*;
 import com.fs.course.service.IFsUserCompanyUserService;
+import com.fs.fastgptApi.param.ChatParam;
+import com.fs.fastgptApi.result.ChatDetailTStreamFResult;
+import com.fs.fastgptApi.service.ChatService;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.service.IFsCityService;
 import com.fs.his.vo.CitysAreaVO;
@@ -50,6 +53,7 @@ import com.fs.system.service.ISysUserService;
 import com.fs.voice.utils.StringUtil;
 import com.fs.wxUser.domain.CompanyWxUser;
 import com.github.pagehelper.PageHelper;
+import com.google.gson.Gson;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -128,6 +132,9 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     @Autowired
     private CompanyRoleMapper companyRoleMapper;
 
+    @Autowired
+    private ChatService chatService;
+
 
     /**
      * 查询物业公司管理员信息
@@ -1125,4 +1132,59 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     public Integer getUserCount() {
         return companyUserMapper.getUserCount();
     }
+
+    @Override
+    public CompanyUserAnalyseVO createCompanyUserAnalyseInfo(Long id) {
+        CompanyUserAnalyseVO analyseVO = new CompanyUserAnalyseVO();
+        analyseVO.setCompanyUserId(id);
+        CompanyUserAnalyseVO param = companyUserMapper.selectCompanyUserOrderCountAndMoney(id);
+        analyseVO.setMoneyCount(param==null || param.getMoneyCount()==null?0:param.getMoneyCount());
+        analyseVO.setOrderCount(param==null || param.getOrderCount()==null?0:param.getOrderCount());
+        CompanyUserAnalyseVO param1 = companyUserMapper.selectCompanyUserWatchCourseCount(id);
+        analyseVO.setWatchCourseCount(param1==null || param1.getWatchCourseCount()==null?0:param1.getWatchCourseCount());
+        CompanyUserAnalyseVO param2 = companyUserMapper.selectCompanyUserNewUserCount(id);
+        analyseVO.setNewUserCount(param2==null || param2.getNewUserCount()==null?0:param2.getNewUserCount());
+        CompanyUserAnalyseVO param3 = companyUserMapper.selectCompanyUserPhoneLogCount(id);
+        analyseVO.setPhoneLogCount(param3==null || param3.getPhoneLogCount()==null?0:param3.getPhoneLogCount());
+        String data = this.analyseCompanyUser(analyseVO);
+        if(data != null){
+            CompanyUser companyUser = new CompanyUser();
+            companyUser.setUserId(analyseVO.getCompanyUserId());
+            companyUser.setAnalyseData(data);
+            int i = companyUserMapper.updateCompanyUser(companyUser);
+        }
+        analyseVO.setData(data);
+        return analyseVO;
+    }
+    private String analyseCompanyUser(CompanyUserAnalyseVO analyseVO) {
+        ChatParam param=new ChatParam();
+        param.setChatId(String.valueOf(analyseVO.getCompanyUserId()));
+        param.setStream(false);
+        param.setDetail(true);
+
+        ChatParam.Variables variables=new ChatParam.Variables();
+        variables.setUid(String.valueOf(analyseVO.getCompanyUserId()));
+        variables.setName("test");
+        param.setVariables(variables);
+
+
+        List<ChatParam.Message> messageList=new ArrayList<ChatParam.Message>();
+        ChatParam.Message message = new ChatParam.Message();
+        message.setRole("user");
+
+        Gson gson = new Gson();
+        String contents = gson.toJson(analyseVO);
+        message.setContent(contents);
+        messageList.add(message);
+        param.setMessages(messageList);
+
+        R r = chatService.initiatingTakeChatNew(param, "http://129.28.170.206:3000/api", "fastgpt-nTyTMclhu2wnx9b7yypwLGeYV2cGE40SU5JtOgJRSWpRH8tyGggKQK7XiVJ9srdpb");
+        ChatDetailTStreamFResult result=(ChatDetailTStreamFResult)r.get("data");
+
+        String contentKh = result.getChoices().get(0).getMessage().getContent();
+        System.out.println("模型解析图片结果:"+contentKh);
+
+        return contentKh;
+    }
+
 }

+ 36 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyUserAnalyseVO.java

@@ -0,0 +1,36 @@
+package com.fs.company.vo;
+
+import lombok.Data;
+
+@Data
+public class CompanyUserAnalyseVO {
+
+    private Long companyUserId;
+
+    /**
+     * 7天订单成交金额
+     */
+    private Long moneyCount;
+
+    /**
+     * 7天下单数量
+     */
+    private Long orderCount;
+
+    /**
+     * 客户7天看课完成数量
+     */
+    private Long watchCourseCount;
+
+    /**
+     * 7天新进线新增客户数量
+     */
+    private Long newUserCount;
+
+    /**
+     * 7天外呼通话记录/外呼次数
+     */
+    private Long phoneLogCount;
+
+    private String data;
+}

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

@@ -155,4 +155,6 @@ public class CompanyUserQwListVO extends BaseEntity {
      */
     private  Integer bindStatus;
 
+    private String analyseData;
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/fastGpt/service/IFastGptChatSessionService.java

@@ -80,4 +80,6 @@ public interface IFastGptChatSessionService
     void qwHookNotifyAddMsg(QwHookMsgVO msgVo);
 
     Integer selectFastGptChatSessionArtificialType(FastGptChatSessionParam sessionParam);
+
+    int updateFastGptChatSessionNew(FastGptChatSession session);
 }

+ 24 - 16
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -407,9 +407,7 @@ public class AiHookServiceImpl implements AiHookService {
         if (qwContent.trim().isEmpty()){
             return R.ok();
         }
-        if (qwContent.contains("我已经添加了你")){
-            return R.ok();
-        }
+
         log.info("数据:{}", qwUserId);
         QwUser user = qwUserMapper.selectQwUserById(qwUserId);
         String corpId = user.getCorpId();
@@ -491,6 +489,9 @@ public class AiHookServiceImpl implements AiHookService {
         // 添加脱敏逻辑
         if(qwExternalContacts.getType() == 1){
             FastGptChatSession fastGptChatSession= getFastGptSession(qwExternalContacts,user,dto);
+            if (qwContent.contains("我已经添加了你")){
+                return R.ok();
+            }
             if(type == 104||type == 101){
                 String imageParse = aiImgUtil.getImageParse(qwContent,user,sender);
                 if (imageParse==null){
@@ -2217,20 +2218,27 @@ public class AiHookServiceImpl implements AiHookService {
                 // 客服进行回复后就转人工10分钟
                 if(type == 1){
                     Calendar calendar = Calendar.getInstance();
-                    calendar.add(Calendar.MINUTE, -5);
+                    calendar.add(Calendar.MINUTE, -3);
                     Date lastTime = calendar.getTime();
-                    if(lastTime.after(fastGptChatSession.getCreateTime())){
-                        Calendar calendar1 = Calendar.getInstance();
-                        //定时任务会处理10分钟以内的,所以设置20分钟
-                        calendar1.add(Calendar.MINUTE, 10);
-                        Date expireTime = calendar1.getTime();
-
-                        FastGptChatSession chatSession = new FastGptChatSession();
-                        chatSession.setLastTime(expireTime);
-                        chatSession.setIsArtificial(1);
-                        chatSession.setSessionId(fastGptChatSession.getSessionId());
-
-                        fastGptChatSessionMapper.updateFastGptChatSession(chatSession);
+                    //10:00:00
+                    if(lastTime.after(fastGptChatSession.getCreateTime())) {
+                        Calendar oneDayAgo = Calendar.getInstance();
+                        oneDayAgo.add(Calendar.DAY_OF_MONTH, -1);
+                        // 增加判断:lastTime必须在createTime之后,且与当前时间相差不超过1天
+                        if (oneDayAgo.getTime().after(fastGptChatSession.getLastTime())) {
+                            Calendar calendar1 = Calendar.getInstance();
+                            //定时任务会处理10分钟以内的,所以设置20分钟
+                            calendar1.add(Calendar.MINUTE, 20);
+                            Date expireTime = calendar1.getTime();
+
+                            FastGptChatSession chatSession = new FastGptChatSession();
+                            chatSession.setLastTime(expireTime);
+                            chatSession.setIsArtificial(1);
+                            chatSession.setUserId(String.valueOf(sender));
+                            chatSession.setSessionId(fastGptChatSession.getSessionId());
+
+                            fastGptChatSessionMapper.updateFastGptChatSession(chatSession);
+                        }
                     }
                 }
             }else {

+ 10 - 0
fs-service/src/main/java/com/fs/fastGpt/service/impl/FastGptChatSessionServiceImpl.java

@@ -375,6 +375,16 @@ public class FastGptChatSessionServiceImpl implements IFastGptChatSessionService
         return null;
     }
 
+    @Override
+    public int updateFastGptChatSessionNew(FastGptChatSession fastGptChatSession) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.YEAR, 10);
+        fastGptChatSession.setLastTime(calendar.getTime());
+        fastGptChatSession.setUpdateTime(DateUtils.getNowDate());
+        fastGptChatSession.setIsArtificial(1);
+        return fastGptChatSessionMapper.updateFastGptChatSession(fastGptChatSession);
+    }
+
     @Override
     public void qwHookNotifyAddMsg(QwHookMsgVO vo) {
         QwUser sendUser=qwUserService.selectQwUserByAppKey(vo.getKey());

+ 2 - 0
fs-service/src/main/java/com/fs/fastgptApi/service/ChatService.java

@@ -16,4 +16,6 @@ public interface ChatService {
     R initiatingTakeChat(ChatParam param,String url,String appKey);
 
     R initiatingTakeChatNew(ChatParamNew param, String url, String appKey);
+
+    R initiatingTakeChatNew(ChatParam param, String url, String appKey);
 }

+ 84 - 0
fs-service/src/main/java/com/fs/fastgptApi/service/Impl/ChatServiceImpl.java

@@ -199,5 +199,89 @@ public class ChatServiceImpl implements ChatService {
         return null;
     }
 
+    @Override
+    public R initiatingTakeChatNew(ChatParam param, String url, String appKey) {
+
+        String json = HttpUtil.sendPost(param, url+FastGptApiConfig.completionsUrl, appKey);
+
+        JSONObject jsonObject = JSON.parseObject(json);
+
+        // 判断是否有回应消息
+        if(jsonObject.containsKey("choices")){
+            // 获取消息列表
+            JSONArray choices = jsonObject.getJSONArray("choices");
+            // 回复消息不为空
+            if(!choices.isEmpty()){
+                // 判断是否转人工
+                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("【转人工】")){
+                    jsonObject.put("artificial", true);
+                }
+                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("FunctionCallBegin")){
+                    jsonObject.put("artificial", true);
+                }
+
+
+                // 替换AI回复里面的所有的【】包括里面的字符串
+                List<JSONObject> list = choices.stream().map(e -> {
+                    JSONObject result = JSON.parseObject(e.toString());
+                    JSONObject message = result.getJSONObject("message");
+                    message.put("content", message.getString("content"));
+                    return result;
+                }).collect(Collectors.toList());
+                jsonObject.put("choices", list);
+            }
+        }
+        // 判断是否匹配知识库逻辑
+        if(jsonObject.containsKey("responseData")){
+            // 遍历查找主对话框
+            JSONArray responseData = jsonObject.getJSONArray("responseData");
+            // 筛选出主对话框里面的信息,里面的historyPreview是匹配信息
+            responseData.stream().filter(e -> "主对话框".equals(JSON.parseObject(e.toString()).getString("moduleName"))).findFirst().ifPresent(e -> {
+                // 进入方法证明以及查找主对话框
+                JSONObject eJson = JSON.parseObject(e.toString());
+                // 如果主对话框里面信息为空则不处理
+                if(!eJson.containsKey("historyPreview") || StringUtils.isEmpty(eJson.getString("historyPreview"))) return;
+                // 循环里面的所有数据
+                JSONArray historyPreview = eJson.getJSONArray("historyPreview");
+                // 判断是否包含未匹配信息  -> true:未匹配到知识库  false:已匹配到知识库
+                boolean knowledge = historyPreview.stream().anyMatch(h -> {
+                    JSONObject hJson = JSON.parseObject(h.toString());
+                    return hJson.getString("value").contains("<Data>\n\n</Data>");
+                });
+                // 之所以取反,是为了后面实体类方便查看
+                jsonObject.put("knowledge", !knowledge);
+            });
+        }
+
+
+        if (jsonObject.containsKey("code") && !("200".equals(jsonObject.getString("code")))) {
+            return R.error().put("data", JSON.parseObject(json, KnowledgeBaseResult.class));
+        }
+        if (!param.getDetail() && !param.getStream()){
+
+            ChatDetailFStreamFResult result = jsonObject.toJavaObject(ChatDetailFStreamFResult.class);
+
+            return R.ok().put("data", result);
+        }
+        // flase true 的方式不建议(即stream流的方式),都是输出完才返回,没意义
+        if (!param.getDetail() && param.getStream()){
+
+//            ChatDetailFStreamTResult result = jsonObject.toJavaObject(ChatDetailFStreamTResult.class);
+
+            return R.ok().put("data", json);
+        }
+
+        if (param.getDetail()&&!param.getStream()){
+            ChatDetailTStreamFResult result = jsonObject.toJavaObject(ChatDetailTStreamFResult.class);
+            return R.ok().put("data", result);
+        }
+
+        // true true 的方式不建议(即stream流的方式),都是输出完才返回,没意义
+        if (param.getDetail()&&param.getStream()){
+
+            return R.ok().put("data", json);
+        }
+        return null;
+    }
 
 }

+ 1 - 0
fs-service/src/main/resources/db/tenant-initTable.sql

@@ -2269,6 +2269,7 @@ CREATE TABLE `company_user`
     `invitation_code`          varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邀请码',
     `cid_server_id`            bigint NULL DEFAULT NULL COMMENT 'cid服务id',
     `ai_sip_call_user_id`      bigint NULL DEFAULT NULL COMMENT 'sip外呼绑定用户id',
+    `analyse_data`             text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '销售行为分析',
     PRIMARY KEY (`user_id`) USING BTREE,
     UNIQUE INDEX `username`(`user_name`) USING BTREE,
     INDEX                      `idcard`(`id_card`) USING BTREE

+ 64 - 2
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -46,6 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="bindCompanyUserId"    column="bind_company_user_id"    />
         <result property="unionId"    column="union_id"    />
         <result property="cidServerId" column="cid_server_id"/>
+        <result property="analyseData" column="analyse_data"/>
         <association property="dept"    column="dept_id" javaType="CompanyDept" resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
     </resultMap>
@@ -104,7 +105,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         d.dept_name,
         d.leader,
         u.cid_server_id,
-        u.ai_sip_call_user_id
+        u.ai_sip_call_user_id,
+        u.analyse_data
         from
         company_user u
         left join
@@ -323,6 +325,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isAudit != null">`is_audit` = #{isAudit},</if>
             <if test="doctorId != null">`doctor_id` = #{doctorId},</if>
             <if test="unionId != null">`union_id` = #{unionId},</if>
+            <if test="analyseData != null">`analyse_data` = #{analyseData},</if>
         </trim>
         where user_id = #{userId}
     </update>
@@ -451,7 +454,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                u.create_time,u.id_card, u.remark,u.user_type,u.open_id,u.qr_code_weixin,u.qr_code_wecom,u.jpush_id,u.domain,u.is_audit,u.address_id,
                d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
                r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,
-               u.is_need_register_member, u.is_allowed_all_register,u.doctor_id,u.union_id,u.cid_server_id
+               u.is_need_register_member, u.is_allowed_all_register,u.doctor_id,u.union_id,u.cid_server_id,u.analyse_data
         from company_user u
                  left join company_dept d on u.dept_id = d.dept_id
                  left join company_user_role ur on u.user_id = ur.user_id
@@ -764,5 +767,64 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="getUserCount" resultType="java.lang.Integer">
         select count(1) from company_user WHERE `status` = 0 AND del_flag = 0
     </select>
+    <select id="selectCompanyUserOrderCountAndMoney" resultType="com.fs.company.vo.CompanyUserAnalyseVO">
+        <![CDATA[SELECT
+        SUM(order_count) AS orderCount,
+        sum(order_money) AS moneyCount
+        FROM (
+        -- 子查询:两个表的原始统计
+        SELECT
+        DATE_FORMAT(create_time,'%Y-%m-%d') AS stat_date,
+        company_id,
+        company_user_id,
+        count(1) AS order_count,
+        sum(pay_money) AS order_money
+        FROM `fs_store_order_scrm`
+        WHERE `status` > 0
+        AND create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+        AND create_time < CURDATE()
+        and company_user_id = #{companyUserId}
+        GROUP BY DATE_FORMAT(create_time,'%Y-%m-%d'), company_user_id
+
+        UNION ALL
+
+        SELECT
+        DATE_FORMAT(create_time,'%Y-%m-%d') AS stat_date,
+        company_id,
+        company_user_id,
+        count(1) AS order_count,
+        sum(pay_money) AS order_money
+        FROM `fs_store_order`
+        WHERE `status` > 0
+        AND create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+        AND create_time < CURDATE()
+        and company_user_id = #{companyUserId}
+        GROUP BY DATE_FORMAT(create_time,'%Y-%m-%d'), company_user_id
+        ) AS t
+        -- 外层汇总
+        GROUP BY  company_user_id
+        ORDER BY stat_date, company_user_id ]]>
+    </select>
+    <select id="selectCompanyUserWatchCourseCount" resultType="com.fs.company.vo.CompanyUserAnalyseVO">
+        <![CDATA[SELECT count(1) watchCourseCount FROM `fs_course_watch_log`
+                 where log_type = 2 AND create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+                   AND create_time < CURDATE() and company_user_id = #{companyUserId}
+                 GROUP BY company_user_id]]>
+    </select>
+    <select id="selectCompanyUserNewUserCount" resultType="com.fs.company.vo.CompanyUserAnalyseVO">
+        <![CDATA[SELECT cu.company_id,cu.user_id,count(1) from company_user cu left join qw_watch_log qw on FIND_IN_SET(qw.qw_user_id,cu.qw_user_id)
+                 where qw.`status` = 2
+                   AND qw.create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+                   AND qw.create_time < CURDATE() and company_user_id = #{companyUserId}
+                 GROUP BY cu.user_id]]>
+    </select>
+
+    <select id="selectCompanyUserPhoneLogCount" resultType="com.fs.company.vo.CompanyUserAnalyseVO">
+        <![CDATA[SELECT b.company_id,b.company_user_id,count(1) from company_voice_robotic_call_log_callphone a left join company_voice_robotic b on a.robotic_id = b.id
+                 where b.create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+                   AND b.create_time < CURDATE() and a.company_user_id = #{companyUserId}
+                 GROUP BY b.company_user_id
+        ]]>
+    </select>
 
 </mapper>