Commit 5847eda988d1c12c269f8b1055a01c638a91d167

Authored by 张志伟
2 parents fab43eca 5e96fd92

Merge remote-tracking branch 'origin/dev' into test

Showing 46 changed files with 1261 additions and 167 deletions
doc/v1.1.3/sql.sql 0 → 100644
  1 +alter table follow_record_log
  2 + add task_id bigint null comment '跟进任务id' after id;
  3 +
  4 +update follow_record_log t1
  5 +set task_id = (select w1.task_id from follow_record w1 where w1.id = t1.record_id)
  6 +where t1.task_id is null;
  7 +
  8 +
  9 +create table secret_report_history
  10 +(
  11 + id bigint auto_increment,
  12 + task_id bigint not null comment '任务id',
  13 + task_type int(3) not null comment '跟进类型 ',
  14 + follow_record_id bigint not null comment '跟进记录id',
  15 + first_call tinyint(1) not null comment '是否是首次通话',
  16 + call_id varchar(225) not null comment '通话记录id',
  17 + staff_id bigint not null comment '工作人员id',
  18 + staff_name varchar(64) null comment '工作人员名称',
  19 + customer_id bigint not null comment '客户id',
  20 + call_type int(3) not null comment '主/被叫',
  21 + call_time datetime not null comment '呼叫时间',
  22 + call_duration bigint null comment '通话时长(秒)',
  23 + shop_id bigint not null comment '门店id',
  24 + group_id bigint not null comment '集团id',
  25 + constraint secret_report_history_pk
  26 + primary key (id)
  27 +)
  28 + comment '智能电话通话记录';
  29 +
  30 +create index secret_report_history_call_time_index
  31 + on secret_report_history (call_time);
  32 +
  33 +create index secret_report_history_customer_id_index
  34 + on secret_report_history (customer_id);
  35 +
  36 +create index secret_report_history_staff_id_index
  37 + on secret_report_history (staff_id);
  38 +
  39 +
  40 +
  41 +
  42 +-- 报表字段调整
  43 +alter table cas_015_d
  44 + add i10 int null comment '智能电话跟进有效数';
  45 +alter table cas_015_d
  46 + add i11 int null comment '智能电话跟进数';
  47 +alter table cas_015_d
  48 + add i12 int null comment '首次智能电话跟进有效数';
  49 +alter table cas_015_d
  50 + add i13 int null comment '首次智能电话跟进数';
  51 +
  52 +
  53 +
  54 +alter table cas_015_m
  55 + add i10 int null comment '智能电话跟进有效数';
  56 +alter table cas_015_m
  57 + add i11 int null comment '智能电话跟进数';
  58 +alter table cas_015_m
  59 + add i12 int null comment '首次智能电话跟进有效数';
  60 +alter table cas_015_m
  61 + add i13 int null comment '首次智能电话跟进数';
0 \ No newline at end of file 62 \ No newline at end of file
fw-valhalla-dao/src/main/java/cn/fw/valhalla/dao/mapper/SecretReportHistoryMapper.java 0 → 100644
  1 +package cn.fw.valhalla.dao.mapper;
  2 +
  3 +import cn.fw.valhalla.domain.db.SecretReportHistory;
  4 +import cn.fw.valhalla.domain.dto.SecretReportHistoryDTO;
  5 +import cn.fw.valhalla.domain.query.SecretReportHistoryQuery;
  6 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  7 +import org.apache.ibatis.annotations.Param;
  8 +import org.springframework.stereotype.Repository;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * @author : kurisu
  14 + * @className : SecretReportHistoryMapper
  15 + * @description : 通话记录mapper
  16 + * @date: 2021-02-21 14:54
  17 + */
  18 +@Repository
  19 +public interface SecretReportHistoryMapper extends BaseMapper<SecretReportHistory> {
  20 + /**
  21 + * 查询通话记录池
  22 + *
  23 + * @param startIndex
  24 + * @param pageSize
  25 + * @param queryVO
  26 + * @return
  27 + */
  28 + List<SecretReportHistoryDTO> secretReportList(@Param("startIndex") Integer startIndex, @Param("pageSize") Integer pageSize, @Param("condition") SecretReportHistoryQuery queryVO);
  29 +
  30 + /**
  31 + * 查询通话记录总数
  32 + *
  33 + * @param queryVO
  34 + * @return
  35 + */
  36 + Long secretReportCount(@Param("condition") SecretReportHistoryQuery queryVO);
  37 +}
fw-valhalla-dao/src/main/resources/mapper/FollowTaskMapper.xml
@@ -9,6 +9,7 @@ @@ -9,6 +9,7 @@
9 SELECT t1.id, 9 SELECT t1.id,
10 if(t1.type=3 , t4.plate_no, t3.plate_no)plate_no, 10 if(t1.type=3 , t4.plate_no, t3.plate_no)plate_no,
11 if(t1.type=3 , t4.frame_no, t3.frame_no)frame_no, 11 if(t1.type=3 , t4.frame_no, t3.frame_no)frame_no,
  12 + t3.cus_level cus_level,
12 t2.expires loan_expires, 13 t2.expires loan_expires,
13 t1.type type, 14 t1.type type,
14 t1.follow_user user_id, 15 t1.follow_user user_id,
fw-valhalla-dao/src/main/resources/mapper/SecretReportHistoryMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.fw.valhalla.dao.mapper.SecretReportHistoryMapper">
  4 + <select
  5 + id="secretReportList"
  6 + resultType="cn.fw.valhalla.domain.dto.SecretReportHistoryDTO"
  7 + parameterType="cn.fw.valhalla.domain.query.SecretReportHistoryQuery"
  8 + >
  9 + SELECT t1.id,
  10 + t1.task_id task_id,
  11 + t1.task_type follow_type,
  12 + t1.follow_record_id follow_record_id,
  13 + t1.first_call first_call,
  14 + t1.call_id call_id,
  15 + t1.staff_id staff_id,
  16 + t1.staff_name staff_name,
  17 + t1.customer_id customer_id,
  18 + t1.customer_id customer_id,
  19 + if(t1.task_type=3 , t4.name, t3.name) customer_name,
  20 + if(t1.task_type=3 , t4.plate_no, t2.plate_no) plate_no,
  21 + t1.call_type dial_type,
  22 + t1.call_time call_time,
  23 + t1.call_duration call_duration,
  24 + t1.shop_id shop_id,
  25 + t1.group_id group_id
  26 + FROM secret_report_history t1
  27 + left join customer t2 on t1.customer_id = t2.id
  28 + left join customer_base_info t3 on t2.base_id = t3.id
  29 + left join accident_pool t4 on t1.customer_id = t4.id
  30 + <where>
  31 + <if test="condition.groupId !=null">
  32 + and t1.group_id = #{condition.groupId}
  33 + </if>
  34 + <if test="condition.userId !=null">
  35 + and t1.staff_id = #{condition.userId}
  36 + </if>
  37 + <if test="condition.userName !=null and condition.userName != ''">
  38 + and t1.staff_name like concat('%', #{condition.userName}, '%')
  39 + </if>
  40 + <if test="condition.plateNo != null and condition.plateNo !=''">
  41 + and (t2.plate_no like concat('%', #{condition.plateNo}, '%') or t4.plate_no like concat('%', #{condition.plateNo}, '%'))
  42 + </if>
  43 + <if test="condition.customerName != null and condition.customerName !=''">
  44 + and (t3.name like concat('%', #{condition.customerName}, '%') or t4.name like concat('%', #{condition.customerName}, '%'))
  45 + </if>
  46 + <if test="condition.shopIds !=null">
  47 + and t1.shop_id in
  48 + <foreach collection="condition.shopIds" item="id" index="index" open="(" close=")" separator=",">
  49 + #{id}
  50 + </foreach>
  51 + </if>
  52 + <if test="condition.taskType !=null">
  53 + and t1.task_type = #{condition.taskType}
  54 + </if>
  55 + <if test="condition.startTime1 !=null">
  56 + and t1.call_time >= #{condition.startTime1}
  57 + </if>
  58 + <if test="condition.startTime2 !=null">
  59 + and t1.call_time &lt;= #{condition.startTime2}
  60 + </if>
  61 + </where>
  62 + <if test="condition.orderString != null and condition.orderString !='' ">
  63 + ${condition.orderString}
  64 + </if>
  65 + limit #{startIndex},#{pageSize};
  66 + </select>
  67 +
  68 +
  69 + <select
  70 + id="secretReportCount"
  71 + resultType="java.lang.Long"
  72 + parameterType="cn.fw.valhalla.domain.query.SecretReportHistoryQuery"
  73 + >
  74 + SELECT count(t1.id)
  75 + FROM secret_report_history t1
  76 + left join customer t2 on t1.customer_id = t2.id
  77 + left join customer_base_info t3 on t2.base_id = t3.id
  78 + left join accident_pool t4 on t1.customer_id = t4.id
  79 + <where>
  80 + <if test="condition.groupId !=null">
  81 + and t1.group_id = #{condition.groupId}
  82 + </if>
  83 + <if test="condition.userId !=null">
  84 + and t1.staff_id = #{condition.userId}
  85 + </if>
  86 + <if test="condition.userName !=null and condition.userName != ''">
  87 + and t1.staff_name like concat('%', #{condition.userName}, '%')
  88 + </if>
  89 + <if test="condition.plateNo != null and condition.plateNo !=''">
  90 + and (t2.plate_no like concat('%', #{condition.plateNo}, '%') or t4.plate_no like concat('%', #{condition.plateNo}, '%'))
  91 + </if>
  92 + <if test="condition.customerName != null and condition.customerName !=''">
  93 + and (t3.name like concat('%', #{condition.customerName}, '%') or t4.name like concat('%', #{condition.customerName}, '%'))
  94 + </if>
  95 + <if test="condition.shopIds !=null">
  96 + and t1.shop_id in
  97 + <foreach collection="condition.shopIds" item="id" index="index" open="(" close=")" separator=",">
  98 + #{id}
  99 + </foreach>
  100 + </if>
  101 + <if test="condition.taskType !=null">
  102 + and t1.task_type = #{condition.taskType}
  103 + </if>
  104 + <if test="condition.startTime1 !=null">
  105 + and t1.call_time >= #{condition.startTime1}
  106 + </if>
  107 + <if test="condition.startTime2 !=null">
  108 + and t1.call_time &lt;= #{condition.startTime2}
  109 + </if>
  110 + </where>
  111 + </select>
  112 +</mapper>
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/db/SecretReportHistory.java 0 → 100644
  1 +package cn.fw.valhalla.domain.db;
  2 +
  3 +import cn.fw.common.data.entity.BaseEntity;
  4 +import cn.fw.valhalla.domain.enums.CallTypeEnum;
  5 +import cn.fw.valhalla.domain.enums.FollowTypeEnum;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +import java.util.Date;
  11 +
  12 +/**
  13 + * @author : kurisu
  14 + * @className : SecretReportHistory
  15 + * @description : 通话记录
  16 + * @date: 2021-02-21 11:41
  17 + */
  18 +@Data
  19 +@ToString(callSuper = true)
  20 +@EqualsAndHashCode(callSuper = true)
  21 +public class SecretReportHistory extends BaseEntity<SecretReportHistory, Long> {
  22 + /**
  23 + * 任务id
  24 + */
  25 + private Long taskId;
  26 + /**
  27 + * 跟进类型
  28 + */
  29 + private FollowTypeEnum taskType;
  30 + /**
  31 + * 跟进id
  32 + */
  33 + private Long followRecordId;
  34 + /**
  35 + * 是否首次通话(针对跟进任务来说)
  36 + */
  37 + private Boolean firstCall;
  38 + /**
  39 + * 通话id
  40 + */
  41 + private String callId;
  42 + /**
  43 + * 工作人员id
  44 + */
  45 + private Long staffId;
  46 + /**
  47 + * 工作人员名称
  48 + */
  49 + private String staffName;
  50 + /**
  51 + * 客户id
  52 + */
  53 + private Long customerId;
  54 + /**
  55 + * 呼叫类型
  56 + */
  57 + private CallTypeEnum callType;
  58 + /**
  59 + * 呼叫时间
  60 + */
  61 + private Date callTime;
  62 + /**
  63 + * 通话时长
  64 + */
  65 + private Long callDuration;
  66 + /**
  67 + * 门店id
  68 + */
  69 + private Long shopId;
  70 + /**
  71 + * 集团id
  72 + */
  73 + private Long groupId;
  74 +}
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/db/follow/FollowRecordLog.java
@@ -21,6 +21,10 @@ public class FollowRecordLog extends BaseEntity&lt;FollowRecordLog, Long&gt; { @@ -21,6 +21,10 @@ public class FollowRecordLog extends BaseEntity&lt;FollowRecordLog, Long&gt; {
21 */ 21 */
22 private Long recordId; 22 private Long recordId;
23 /** 23 /**
  24 + * 任务id
  25 + */
  26 + private Long taskId;
  27 + /**
24 * 附件类型 28 * 附件类型
25 */ 29 */
26 private AttTypeEnum attType; 30 private AttTypeEnum attType;
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/dto/AccidentPoolDTO.java
@@ -29,6 +29,7 @@ public class AccidentPoolDTO { @@ -29,6 +29,7 @@ public class AccidentPoolDTO {
29 /** 29 /**
30 * 报案手机号 30 * 报案手机号
31 */ 31 */
  32 + @NotBlank(message = "报案手机号不能为空")
32 private String reportMobile; 33 private String reportMobile;
33 /** 34 /**
34 * 车牌号 35 * 车牌号
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/dto/CallReportDTO.java
1 package cn.fw.valhalla.domain.dto; 1 package cn.fw.valhalla.domain.dto;
2 2
  3 +import cn.fw.valhalla.domain.enums.CallTypeEnum;
3 import lombok.Data; 4 import lombok.Data;
4 5
5 import java.time.LocalDateTime; 6 import java.time.LocalDateTime;
@@ -22,6 +23,10 @@ public class CallReportDTO { @@ -22,6 +23,10 @@ public class CallReportDTO {
22 */ 23 */
23 private Long staffId; 24 private Long staffId;
24 /** 25 /**
  26 + * 工作人员名称
  27 + */
  28 + private String staffName;
  29 + /**
25 * 用户号码 30 * 用户号码
26 */ 31 */
27 private String staffMobile; 32 private String staffMobile;
@@ -38,6 +43,10 @@ public class CallReportDTO { @@ -38,6 +43,10 @@ public class CallReportDTO {
38 */ 43 */
39 private Long talkTime; 44 private Long talkTime;
40 /** 45 /**
  46 + * 呼叫类型
  47 + */
  48 + private CallTypeEnum dialType;
  49 + /**
41 * 集团id 50 * 集团id
42 */ 51 */
43 private Long groupId; 52 private Long groupId;
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/dto/CustomerDetailDto.java
@@ -138,6 +138,10 @@ public class CustomerDetailDto { @@ -138,6 +138,10 @@ public class CustomerDetailDto {
138 */ 138 */
139 private String idCode; 139 private String idCode;
140 /** 140 /**
  141 + * 进站次数
  142 + */
  143 + private Integer arrivalCount;
  144 + /**
141 * 上次进站时间 145 * 上次进站时间
142 */ 146 */
143 private Date arrivalTime; 147 private Date arrivalTime;
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/dto/FollowPoolDTO.java
@@ -17,6 +17,10 @@ public class FollowPoolDTO { @@ -17,6 +17,10 @@ public class FollowPoolDTO {
17 */ 17 */
18 private String plateNo; 18 private String plateNo;
19 /** 19 /**
  20 + * 客户星级
  21 + */
  22 + private Integer cusLevel;
  23 + /**
20 * 车架号 24 * 车架号
21 */ 25 */
22 private String frameNo; 26 private String frameNo;
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/dto/LeaveAllocationDTO.java
@@ -3,7 +3,11 @@ package cn.fw.valhalla.domain.dto; @@ -3,7 +3,11 @@ package cn.fw.valhalla.domain.dto;
3 import cn.fw.valhalla.common.enums.AllocationTypeEnum; 3 import cn.fw.valhalla.common.enums.AllocationTypeEnum;
4 import lombok.Data; 4 import lombok.Data;
5 5
  6 +import javax.validation.Valid;
  7 +import javax.validation.constraints.Min;
  8 +import javax.validation.constraints.NotEmpty;
6 import javax.validation.constraints.NotNull; 9 import javax.validation.constraints.NotNull;
  10 +import java.util.List;
7 11
8 /** 12 /**
9 * @author : kurisu 13 * @author : kurisu
@@ -15,26 +19,70 @@ import javax.validation.constraints.NotNull; @@ -15,26 +19,70 @@ import javax.validation.constraints.NotNull;
15 public class LeaveAllocationDTO { 19 public class LeaveAllocationDTO {
16 @NotNull(message = "记录id不能为空") 20 @NotNull(message = "记录id不能为空")
17 private Long id; 21 private Long id;
18 -  
19 - @NotNull(message = "分配方式不能为空")  
20 - private Integer allocationType;  
21 -  
22 /** 22 /**
23 - * 指定人员id 23 + * 分配规则
24 */ 24 */
25 - private Long userId; 25 + @Valid
  26 + @NotEmpty(message = "分配规则不能为空")
  27 + private List<Allocation> ruleList;
26 28
27 - /**  
28 - * 门店id (前端无关)  
29 - */  
30 - private Long shopId;  
31 29
32 /** 30 /**
33 - * 分配方式 (前端无关)  
34 - */  
35 - private AllocationTypeEnum type;  
36 - /**  
37 - * 顾问id (前端无关) 31 + * 原始顾问id (前端无关)
38 */ 32 */
39 private Long adviserId; 33 private Long adviserId;
  34 +
  35 + public static class Allocation {
  36 + /**
  37 + * 指定人员id
  38 + */
  39 + @NotNull(message = "人员id不能为空")
  40 + private Long userId;
  41 + /**
  42 + * 人员名称
  43 + */
  44 + private String userName;
  45 + /**
  46 + * 指定人员id
  47 + */
  48 + @Min(value = 1, message = "保有客数量必须大于0")
  49 + private Integer num;
  50 +
  51 + /**
  52 + * 门店id (前端无关)
  53 + */
  54 + private Long shopId;
  55 +
  56 + public Long getUserId() {
  57 + return userId;
  58 + }
  59 +
  60 + public void setUserId(Long userId) {
  61 + this.userId = userId;
  62 + }
  63 +
  64 + public String getUserName() {
  65 + return userName;
  66 + }
  67 +
  68 + public void setUserName(String userName) {
  69 + this.userName = userName;
  70 + }
  71 +
  72 + public Integer getNum() {
  73 + return num;
  74 + }
  75 +
  76 + public void setNum(Integer num) {
  77 + this.num = num;
  78 + }
  79 +
  80 + public Long getShopId() {
  81 + return shopId;
  82 + }
  83 +
  84 + public void setShopId(Long shopId) {
  85 + this.shopId = shopId;
  86 + }
  87 + }
40 } 88 }
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/dto/RoleChangeDTO.java 0 → 100644
  1 +package cn.fw.valhalla.domain.dto;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +import lombok.ToString;
  7 +
  8 +/**
  9 + * @author : kurisu
  10 + * @className : RoleChangeDTO
  11 + * @description : 角色变动dto
  12 + * @date: 2021-02-20 15:11
  13 + */
  14 +@Data
  15 +@AllArgsConstructor
  16 +@NoArgsConstructor
  17 +@ToString
  18 +public class RoleChangeDTO {
  19 + /**
  20 + * 门店
  21 + */
  22 + private Long shopId;
  23 + /**
  24 + * 用户id
  25 + */
  26 + private Long userId;
  27 + /**
  28 + * 用户名称
  29 + */
  30 + private String userName;
  31 +}
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/dto/SecretReportHistoryDTO.java 0 → 100644
  1 +package cn.fw.valhalla.domain.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.util.Date;
  6 +
  7 +/**
  8 + * @author : kurisu
  9 + * @className : SecretReportHistoryDTO
  10 + * @description :
  11 + * @date: 2021-02-21 15:47
  12 + */
  13 +@Data
  14 +public class SecretReportHistoryDTO {
  15 + private Long id;
  16 + /**
  17 + * 任务id
  18 + */
  19 + private Long taskId;
  20 + /**
  21 + * 跟进类型
  22 + */
  23 + private Integer followType;
  24 + /**
  25 + * 跟进id
  26 + */
  27 + private Long followRecordId;
  28 + /**
  29 + * 是否首次通话(针对跟进任务来说)
  30 + */
  31 + private Boolean firstCall;
  32 + /**
  33 + * 通话id
  34 + */
  35 + private String callId;
  36 + /**
  37 + * 工作人员id
  38 + */
  39 + private Long staffId;
  40 + /**
  41 + * 工作人员名称
  42 + */
  43 + private String staffName;
  44 + /**
  45 + * 客户id
  46 + */
  47 + private Long customerId;
  48 + /**
  49 + * 客户名称
  50 + */
  51 + private String customerName;
  52 + /**
  53 + * 车牌号
  54 + */
  55 + private String plateNo;
  56 + /**
  57 + * 呼叫类型
  58 + */
  59 + private Integer dialType;
  60 + /**
  61 + * 呼叫时间
  62 + */
  63 + private Date callTime;
  64 + /**
  65 + * 通话时长
  66 + */
  67 + private Long callDuration;
  68 + /**
  69 + * 门店id
  70 + */
  71 + private Long shopId;
  72 + /**
  73 + * 集团id
  74 + */
  75 + private Long groupId;
  76 +}
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/enums/CallTypeEnum.java 0 → 100644
  1 +package cn.fw.valhalla.domain.enums;
  2 +
  3 +import com.baomidou.mybatisplus.core.enums.IEnum;
  4 +import com.fasterxml.jackson.annotation.JsonCreator;
  5 +import com.fasterxml.jackson.annotation.JsonValue;
  6 +import lombok.Getter;
  7 +
  8 +/**
  9 + * @author : kurisu
  10 + * @className : CallTypeEnum
  11 + * @description : 呼叫类型
  12 + * @date: 2020-08-11 17:37
  13 + */
  14 +public enum CallTypeEnum implements IEnum<Integer> {
  15 + /**
  16 + * 主叫
  17 + */
  18 + CALL(0, "主叫"),
  19 + /**
  20 + * 被叫
  21 + */
  22 + P_CALL(1, "被叫"),
  23 + ;
  24 +
  25 + /**
  26 + * 值
  27 + */
  28 + private final Integer value;
  29 + /**
  30 + * 名称
  31 + */
  32 + @Getter
  33 + private final String name;
  34 +
  35 + CallTypeEnum(final Integer value, final String name) {
  36 + this.value = value;
  37 + this.name = name;
  38 + }
  39 +
  40 + /**
  41 + * 根据枚举值获取枚举对象
  42 + */
  43 + @JsonCreator
  44 + public static CallTypeEnum ofValue(final Integer value) {
  45 + for (final CallTypeEnum typeEnum : CallTypeEnum.values()) {
  46 + if (typeEnum.value.equals(value)) {
  47 + return typeEnum;
  48 + }
  49 + }
  50 + return null;
  51 + }
  52 +
  53 + /**
  54 + * 获取值
  55 + *
  56 + * @return 值
  57 + */
  58 + @JsonValue
  59 + @Override
  60 + public Integer getValue() {
  61 + return value;
  62 + }
  63 +
  64 + /**
  65 + * 获取描述
  66 + *
  67 + * @return 值
  68 + */
  69 + @JsonCreator
  70 + public static String getNameByVale(final Integer value) {
  71 + for (final CallTypeEnum typeEnum : CallTypeEnum.values()) {
  72 + if (typeEnum.value.equals(value)) {
  73 + return typeEnum.getName();
  74 + }
  75 + }
  76 + return "";
  77 + }
  78 +}
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/query/SecretReportHistoryQuery.java 0 → 100644
  1 +package cn.fw.valhalla.domain.query;
  2 +
  3 +import cn.fw.common.validator.EnumValue;
  4 +import cn.fw.valhalla.common.utils.DateUtil;
  5 +import cn.fw.valhalla.domain.enums.CallTypeEnum;
  6 +import cn.fw.valhalla.domain.enums.FollowTypeEnum;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
  10 +import org.apache.commons.lang3.StringUtils;
  11 +import org.apache.commons.lang3.math.NumberUtils;
  12 +
  13 +import java.time.Instant;
  14 +import java.time.LocalDateTime;
  15 +import java.time.ZoneId;
  16 +import java.util.Date;
  17 +
  18 +/**
  19 + * @author : kurisu
  20 + * @className : SecretReportHistoryQuery
  21 + * @description : 查询条件
  22 + * @date: 2021-02-21 15:55
  23 + */
  24 +@EqualsAndHashCode(callSuper = true)
  25 +@Data
  26 +@ToString(callSuper = true)
  27 +public class SecretReportHistoryQuery extends PoolQuery {
  28 + @EnumValue(enumClass = FollowTypeEnum.class, message = "跟进类型不正确")
  29 + private Integer taskType;
  30 +
  31 + /**
  32 + * 主叫/被叫
  33 + */
  34 + @EnumValue(enumClass = CallTypeEnum.class, message = "主被叫类型不正确")
  35 + private Integer callType;
  36 +
  37 + /**
  38 + * 通话时间段(区间)
  39 + */
  40 + private String callTime;
  41 + /**
  42 + * 客户名称
  43 + */
  44 + private String customerName;
  45 +
  46 +
  47 + public Date getStartTime1() {
  48 + if (StringUtils.isBlank(callTime)) {
  49 + return null;
  50 + }
  51 + String[] times = callTime.split(",");
  52 + if (StringUtils.isNotBlank(times[0]) && NumberUtils.isDigits(times[0])) {
  53 + LocalDateTime localDateTime = Instant.ofEpochMilli(NumberUtils.toLong(times[0])).atZone(ZoneId.systemDefault()).toLocalDateTime();
  54 + return DateUtil.getBeginInTime(DateUtil.localDateTime2Date(localDateTime));
  55 + }
  56 + return null;
  57 + }
  58 +
  59 + public Date getStartTime2() {
  60 + if (StringUtils.isBlank(callTime)) {
  61 + return null;
  62 + }
  63 + String[] times = callTime.split(",");
  64 + if (times.length < TIME_STR_LENGTH) {
  65 + return null;
  66 + }
  67 + if (StringUtils.isNotBlank(times[1]) && NumberUtils.isDigits(times[1])) {
  68 + LocalDateTime localDateTime = Instant.ofEpochMilli(NumberUtils.toLong(times[1])).atZone(ZoneId.systemDefault()).toLocalDateTime();
  69 + return DateUtil.getEndInTime(DateUtil.localDateTime2Date(localDateTime));
  70 + }
  71 + return null;
  72 + }
  73 +}
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/vo/PostUserVO.java
@@ -23,4 +23,8 @@ public class PostUserVO implements Serializable { @@ -23,4 +23,8 @@ public class PostUserVO implements Serializable {
23 * 用户姓名 23 * 用户姓名
24 */ 24 */
25 private String userName; 25 private String userName;
  26 + /**
  27 + * 当前保有客数
  28 + */
  29 + private Integer curQuantity;
26 } 30 }
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/vo/SecretReportHistoryVO.java 0 → 100644
  1 +package cn.fw.valhalla.domain.vo;
  2 +
  3 +import cn.fw.valhalla.domain.enums.CallTypeEnum;
  4 +import lombok.Data;
  5 +
  6 +import java.util.Date;
  7 +import java.util.Objects;
  8 +
  9 +/**
  10 + * @author : kurisu
  11 + * @className : SecretReportHistoryVO
  12 + * @description : 智能通话池
  13 + * @date: 2021-02-21 15:40
  14 + */
  15 +@Data
  16 +public class SecretReportHistoryVO {
  17 + private Long id;
  18 + /**
  19 + * 任务id
  20 + */
  21 + private Long taskId;
  22 + /**
  23 + * 跟进类型
  24 + */
  25 + private Integer followType;
  26 + /**
  27 + * 跟进id
  28 + */
  29 + private Long followRecordId;
  30 + /**
  31 + * 是否首次通话(针对跟进任务来说)
  32 + */
  33 + private Boolean firstCall;
  34 + /**
  35 + * 通话id
  36 + */
  37 + private String callId;
  38 + /**
  39 + * 工作人员id
  40 + */
  41 + private Long staffId;
  42 + /**
  43 + * 工作人员名称
  44 + */
  45 + private String staffName;
  46 + /**
  47 + * 客户id
  48 + */
  49 + private Long customerId;
  50 + /**
  51 + * 客户名称
  52 + */
  53 + private String customerName;
  54 + /**
  55 + * 车牌号
  56 + */
  57 + private String plateNo;
  58 + /**
  59 + * 呼叫类型
  60 + */
  61 + private CallTypeEnum callType;
  62 + /**
  63 + * 呼叫时间
  64 + */
  65 + private Date callTime;
  66 + /**
  67 + * 通话时长
  68 + */
  69 + private Long callDuration;
  70 + /**
  71 + * 门店id
  72 + */
  73 + private Long shopId;
  74 + /**
  75 + * 门店名称
  76 + */
  77 + private String shopName;
  78 + /**
  79 + * 集团id
  80 + */
  81 + private Long groupId;
  82 +
  83 + public String getCallTypeDesc() {
  84 + if (Objects.isNull(callType)) {
  85 + return null;
  86 + }
  87 + return callType.getName();
  88 + }
  89 +}
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/vo/follow/FollowDetailVO.java
@@ -53,6 +53,18 @@ public class FollowDetailVO { @@ -53,6 +53,18 @@ public class FollowDetailVO {
53 */ 53 */
54 private String tags; 54 private String tags;
55 /** 55 /**
  56 + * 跟进次数
  57 + */
  58 + private Integer times;
  59 + /**
  60 + * 客户星级
  61 + */
  62 + private Integer cusLevel;
  63 + /**
  64 + * 进站次数
  65 + */
  66 + private Integer arrivalCount;
  67 + /**
56 * 所属服务顾问 68 * 所属服务顾问
57 */ 69 */
58 private Long adviserId; 70 private Long adviserId;
fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/vo/pool/FollowPoolListVO.java
@@ -19,6 +19,10 @@ public class FollowPoolListVO { @@ -19,6 +19,10 @@ public class FollowPoolListVO {
19 */ 19 */
20 private String plateNo; 20 private String plateNo;
21 /** 21 /**
  22 + * 客户星级
  23 + */
  24 + private Integer cusLevel;
  25 + /**
22 * 车架号 26 * 车架号
23 */ 27 */
24 private String frameNo; 28 private String frameNo;
fw-valhalla-sdk/pom.xml
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 <relativePath>../pom.xml</relativePath> 10 <relativePath>../pom.xml</relativePath>
11 </parent> 11 </parent>
12 <artifactId>fw-valhalla-sdk</artifactId> 12 <artifactId>fw-valhalla-sdk</artifactId>
13 - <version>1.1.1</version> 13 + <version>1.1.3</version>
14 <packaging>jar</packaging> 14 <packaging>jar</packaging>
15 <name>fw-valhalla-sdk</name> 15 <name>fw-valhalla-sdk</name>
16 16
fw-valhalla-sdk/src/main/java/cn/fw/valhalla/sdk/api/CustomerApiService.java
@@ -2,6 +2,7 @@ package cn.fw.valhalla.sdk.api; @@ -2,6 +2,7 @@ package cn.fw.valhalla.sdk.api;
2 2
3 import cn.fw.data.base.domain.common.Message; 3 import cn.fw.data.base.domain.common.Message;
4 import cn.fw.valhalla.sdk.param.ChangeAdviserReq; 4 import cn.fw.valhalla.sdk.param.ChangeAdviserReq;
  5 +import cn.fw.valhalla.sdk.param.ChangePlateNoReq;
5 import cn.fw.valhalla.sdk.param.CustomerParams; 6 import cn.fw.valhalla.sdk.param.CustomerParams;
6 import cn.fw.valhalla.sdk.result.CustomerContactDto; 7 import cn.fw.valhalla.sdk.result.CustomerContactDto;
7 import cn.fw.valhalla.sdk.result.CustomerInfoDto; 8 import cn.fw.valhalla.sdk.result.CustomerInfoDto;
@@ -88,7 +89,7 @@ public interface CustomerApiService { @@ -88,7 +89,7 @@ public interface CustomerApiService {
88 * @return 是否变更成功 89 * @return 是否变更成功
89 */ 90 */
90 @PostMapping("/change/adviser") 91 @PostMapping("/change/adviser")
91 - Message<Boolean> changeAdviser(@RequestBody ChangeAdviserReq changeAdviserReq); 92 + Message<Boolean> changeAdviser(@Valid @RequestBody ChangeAdviserReq changeAdviserReq);
92 93
93 /** 94 /**
94 * 会员关联商家(专属商家和进站的商家) 95 * 会员关联商家(专属商家和进站的商家)
@@ -140,4 +141,12 @@ public interface CustomerApiService { @@ -140,4 +141,12 @@ public interface CustomerApiService {
140 */ 141 */
141 @GetMapping("/queryReceivable") 142 @GetMapping("/queryReceivable")
142 Message<ReceptionResultDto> queryReceivable(@RequestParam("userId") Long userId, @RequestParam("plateNo") String plateNo); 143 Message<ReceptionResultDto> queryReceivable(@RequestParam("userId") Long userId, @RequestParam("plateNo") String plateNo);
  144 +
  145 + /**
  146 + * 修改车牌号
  147 + * @param changePlateNoReq
  148 + * @return
  149 + */
  150 + @PostMapping("/updatePlateNo")
  151 + Message<Boolean> updatePlateNo(@Valid @RequestBody ChangePlateNoReq changePlateNoReq);
143 } 152 }
fw-valhalla-sdk/src/main/java/cn/fw/valhalla/sdk/param/ChangePlateNoReq.java 0 → 100644
  1 +package cn.fw.valhalla.sdk.param;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotBlank;
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +/**
  12 + * 修改车牌号
  13 + * @author kurisu
  14 + */
  15 +@Data
  16 +@AllArgsConstructor
  17 +@NoArgsConstructor
  18 +@ToString
  19 +public class ChangePlateNoReq {
  20 + /**
  21 + * 车架号
  22 + */
  23 + @NotBlank(message = "车架号不能为空")
  24 + private String frameNo;
  25 + /**
  26 + * 车牌号
  27 + */
  28 + @NotBlank(message = "车牌号不能为空")
  29 + private String plateNo;
  30 + /**
  31 + * 集团id
  32 + */
  33 + @NotNull(message = "集团id不能为空")
  34 + private Long groupId;
  35 +}
fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/api/CustomerApiServiceImpl.java
@@ -4,6 +4,7 @@ import cn.fw.data.base.domain.common.Message; @@ -4,6 +4,7 @@ import cn.fw.data.base.domain.common.Message;
4 import cn.fw.valhalla.domain.dto.CustomerDetailDto; 4 import cn.fw.valhalla.domain.dto.CustomerDetailDto;
5 import cn.fw.valhalla.sdk.api.CustomerApiService; 5 import cn.fw.valhalla.sdk.api.CustomerApiService;
6 import cn.fw.valhalla.sdk.param.ChangeAdviserReq; 6 import cn.fw.valhalla.sdk.param.ChangeAdviserReq;
  7 +import cn.fw.valhalla.sdk.param.ChangePlateNoReq;
7 import cn.fw.valhalla.sdk.param.CustomerParams; 8 import cn.fw.valhalla.sdk.param.CustomerParams;
8 import cn.fw.valhalla.sdk.result.CustomerContactDto; 9 import cn.fw.valhalla.sdk.result.CustomerContactDto;
9 import cn.fw.valhalla.sdk.result.CustomerInfoDto; 10 import cn.fw.valhalla.sdk.result.CustomerInfoDto;
@@ -11,6 +12,7 @@ import cn.fw.valhalla.sdk.result.ReceptionResultDto; @@ -11,6 +12,7 @@ import cn.fw.valhalla.sdk.result.ReceptionResultDto;
11 import cn.fw.valhalla.service.bus.cust.ContactBizService; 12 import cn.fw.valhalla.service.bus.cust.ContactBizService;
12 import cn.fw.valhalla.service.bus.cust.CustomerBizService; 13 import cn.fw.valhalla.service.bus.cust.CustomerBizService;
13 import cn.fw.valhalla.service.bus.cust.CustomerChangeBizService; 14 import cn.fw.valhalla.service.bus.cust.CustomerChangeBizService;
  15 +import cn.fw.valhalla.service.bus.cust.PickUpCustomerService;
14 import lombok.extern.slf4j.Slf4j; 16 import lombok.extern.slf4j.Slf4j;
15 import org.apache.commons.lang.StringUtils; 17 import org.apache.commons.lang.StringUtils;
16 import org.springframework.beans.BeanUtils; 18 import org.springframework.beans.BeanUtils;
@@ -42,15 +44,18 @@ public class CustomerApiServiceImpl implements CustomerApiService { @@ -42,15 +44,18 @@ public class CustomerApiServiceImpl implements CustomerApiService {
42 private final CustomerBizService customerBiz; 44 private final CustomerBizService customerBiz;
43 private final CustomerChangeBizService changeBizService; 45 private final CustomerChangeBizService changeBizService;
44 private final ContactBizService contactBizService; 46 private final ContactBizService contactBizService;
  47 + private final PickUpCustomerService pickUpCustomerService;
45 48
46 49
47 @Autowired 50 @Autowired
48 CustomerApiServiceImpl(final CustomerBizService customerBiz, 51 CustomerApiServiceImpl(final CustomerBizService customerBiz,
49 final CustomerChangeBizService changeBizService, 52 final CustomerChangeBizService changeBizService,
50 - final ContactBizService contactBizService) { 53 + final ContactBizService contactBizService,
  54 + final PickUpCustomerService pickUpCustomerService) {
51 this.customerBiz = customerBiz; 55 this.customerBiz = customerBiz;
52 this.changeBizService = changeBizService; 56 this.changeBizService = changeBizService;
53 this.contactBizService = contactBizService; 57 this.contactBizService = contactBizService;
  58 + this.pickUpCustomerService = pickUpCustomerService;
54 } 59 }
55 60
56 @PostMapping("/save") 61 @PostMapping("/save")
@@ -174,7 +179,7 @@ public class CustomerApiServiceImpl implements CustomerApiService { @@ -174,7 +179,7 @@ public class CustomerApiServiceImpl implements CustomerApiService {
174 179
175 @PostMapping("/change/adviser") 180 @PostMapping("/change/adviser")
176 @Override 181 @Override
177 - public Message<Boolean> changeAdviser(@RequestBody final ChangeAdviserReq changeAdviserReq) { 182 + public Message<Boolean> changeAdviser(@Valid @RequestBody final ChangeAdviserReq changeAdviserReq) {
178 final String msg = "修改保有客专属顾问[changeAdviser]"; 183 final String msg = "修改保有客专属顾问[changeAdviser]";
179 log.info("{}: param:{}", msg, changeAdviserReq); 184 log.info("{}: param:{}", msg, changeAdviserReq);
180 try { 185 try {
@@ -255,4 +260,18 @@ public class CustomerApiServiceImpl implements CustomerApiService { @@ -255,4 +260,18 @@ public class CustomerApiServiceImpl implements CustomerApiService {
255 return failureWithMessage("查询联系人信息失败"); 260 return failureWithMessage("查询联系人信息失败");
256 } 261 }
257 } 262 }
  263 +
  264 + @Override
  265 + @PostMapping("/updatePlateNo")
  266 + public Message<Boolean> updatePlateNo(@Valid @RequestBody ChangePlateNoReq changePlateNoReq) {
  267 + final String msg = "通过vin修改车牌号[updatePlateNo]";
  268 + log.info("{}: param:[{}]", msg, changePlateNoReq);
  269 + try {
  270 + return success(pickUpCustomerService.fixPlateNo(changePlateNoReq.getFrameNo(), changePlateNoReq.getPlateNo(), changePlateNoReq.getGroupId()),
  271 + data -> log.info("{}:data[{}]", msg, data));
  272 + } catch (Exception ex) {
  273 + handleException(ex, e -> log.error("{}失败: param:[{}]", msg, changePlateNoReq, e));
  274 + return failureWithMessage("通过vin修改车牌号失败");
  275 + }
  276 + }
258 } 277 }
fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/app/CommonController.java
@@ -56,15 +56,14 @@ public class CommonController { @@ -56,15 +56,14 @@ public class CommonController {
56 56
57 @GetMapping("/staff/list") 57 @GetMapping("/staff/list")
58 @IgnoreAuth 58 @IgnoreAuth
59 - public Message<List<PostUserVO>> list(@NotNull(message = "服务站ID不能为空") final Long shopId,  
60 - @NotNull(message = "跟进类型不能为空") final Integer type) {  
61 - final String msg = "查询跟进人员[app/common/staff/list]"; 59 + public Message<List<PostUserVO>> list(@NotNull(message = "服务站ID不能为空") final Long shopId) {
  60 + final String msg = "查询人员[app/common/staff/list]";
62 try { 61 try {
63 - log.info("{}: param[shopId: {} type: {}]", msg, shopId, type);  
64 - List<PostUserVO> list = commonService.getUsers(shopId, type); 62 + log.info("{}: param[shopId: {}]", msg, shopId);
  63 + List<PostUserVO> list = commonService.getUsers(shopId);
65 return success(list, data -> log.info("{}", data)); 64 return success(list, data -> log.info("{}", data));
66 } catch (Exception ex) { 65 } catch (Exception ex) {
67 - handleException(ex, e -> log.error("{}失败:param[shopId: {} type: {}]", msg, shopId, type, e)); 66 + handleException(ex, e -> log.error("{}失败:param[shopId: {}]", msg, shopId, e));
68 return failureWithMessage(SAVE_FAILURE); 67 return failureWithMessage(SAVE_FAILURE);
69 } 68 }
70 } 69 }
fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/app/PoolController.java
@@ -9,7 +9,9 @@ import cn.fw.security.auth.client.annotation.IgnoreAuth; @@ -9,7 +9,9 @@ import cn.fw.security.auth.client.annotation.IgnoreAuth;
9 import cn.fw.security.auth.client.enums.AuthType; 9 import cn.fw.security.auth.client.enums.AuthType;
10 import cn.fw.valhalla.domain.query.CustomerCluePoolQueryVO; 10 import cn.fw.valhalla.domain.query.CustomerCluePoolQueryVO;
11 import cn.fw.valhalla.domain.query.FollowPoolQueryVO; 11 import cn.fw.valhalla.domain.query.FollowPoolQueryVO;
  12 +import cn.fw.valhalla.domain.query.SecretReportHistoryQuery;
12 import cn.fw.valhalla.domain.query.StammkundePoolQueryVO; 13 import cn.fw.valhalla.domain.query.StammkundePoolQueryVO;
  14 +import cn.fw.valhalla.domain.vo.SecretReportHistoryVO;
13 import cn.fw.valhalla.domain.vo.follow.FollowDetailVO; 15 import cn.fw.valhalla.domain.vo.follow.FollowDetailVO;
14 import cn.fw.valhalla.domain.vo.pool.*; 16 import cn.fw.valhalla.domain.vo.pool.*;
15 import cn.fw.valhalla.service.bus.follow.FollowBizService; 17 import cn.fw.valhalla.service.bus.follow.FollowBizService;
@@ -161,4 +163,19 @@ public class PoolController { @@ -161,4 +163,19 @@ public class PoolController {
161 return failureWithMessage(QUERY_FAILURE); 163 return failureWithMessage(QUERY_FAILURE);
162 } 164 }
163 } 165 }
  166 +
  167 + @GetMapping("/secret/report/list")
  168 + @IgnoreAuth
  169 + public Message<AppPage<SecretReportHistoryVO>> reportList(@CurrentUser LoginAuthBean currentUser, final SecretReportHistoryQuery queryVO) {
  170 + final String msg = "查询智能通话记录池列表[pool/clue/list]";
  171 + try {
  172 + log.info("{}: param[{}]", msg, queryVO);
  173 + queryVO.setGroupId(currentUser.getGroupId());
  174 + AppPage<SecretReportHistoryVO> page = poolBizService.secretReportList(queryVO);
  175 + return success(page, data -> log.info("dataSize: {}", CollectionUtils.isEmpty(data.getData()) ? 0 : data.getData().size()));
  176 + } catch (Exception ex) {
  177 + handleException(ex, e -> log.error("{}失败:param[{}]", msg, queryVO.getTaskType(), e));
  178 + return failureWithMessage(QUERY_FAILURE);
  179 + }
  180 + }
164 } 181 }
fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/CallReportDealTask.java
@@ -69,7 +69,7 @@ public class CallReportDealTask { @@ -69,7 +69,7 @@ public class CallReportDealTask {
69 /** 69 /**
70 * 处理通话记录 70 * 处理通话记录
71 */ 71 */
72 - @Scheduled(initialDelay = 1000 * 5, fixedRate = 1000 * 5) 72 + @Scheduled(initialDelay = 1000 * 5, fixedRate = 1000 * 15)
73 public void dealCallReport() { 73 public void dealCallReport() {
74 List<String> failList = new ArrayList<>(); 74 List<String> failList = new ArrayList<>();
75 String callStr; 75 String callStr;
@@ -78,20 +78,21 @@ public class CallReportDealTask { @@ -78,20 +78,21 @@ public class CallReportDealTask {
78 if (Objects.isNull(dto)) { 78 if (Objects.isNull(dto)) {
79 continue; 79 continue;
80 } 80 }
81 - final String mobileNo = dto.getPeerNo(); 81 + final String staffMobile = dto.getStaffMobile();
  82 + final String peerMobile = dto.getPeerNo();
82 final Long groupId = dto.getGroupId(); 83 final Long groupId = dto.getGroupId();
83 final Long staffId = dto.getStaffId(); 84 final Long staffId = dto.getStaffId();
84 try { 85 try {
85 boolean isValid = Objects.nonNull(staffId) && Objects.nonNull(groupId); 86 boolean isValid = Objects.nonNull(staffId) && Objects.nonNull(groupId);
86 if (!isValid) { 87 if (!isValid) {
87 - StaffInfoDTO info = ehrRpcService.queryStaffInfoByMobile(mobileNo);  
88 - BV.notNull(info, () -> "员工信息获取失败"); 88 + StaffInfoDTO info = ehrRpcService.queryStaffInfoByMobile(staffMobile);
  89 + BV.notNull(info, () -> String.format("[%s]员工信息获取失败", staffMobile));
89 assert info != null; 90 assert info != null;
90 dto.setStaffId(info.getId()); 91 dto.setStaffId(info.getId());
91 dto.setGroupId(info.getGroupId()); 92 dto.setGroupId(info.getGroupId());
92 } 93 }
93 - followBizService.readCallReport(dto, true, queryAccidentCar(mobileNo, groupId));  
94 - followBizService.readCallReport(dto, false, queryCustomerIds(mobileNo, groupId)); 94 + followBizService.readCallReport(dto, true, queryAccidentCar(peerMobile, groupId));
  95 + followBizService.readCallReport(dto, false, queryCustomerIds(peerMobile, groupId));
95 } catch (Exception e) { 96 } catch (Exception e) {
96 if (StringUtils.isValid(callStr)) { 97 if (StringUtils.isValid(callStr)) {
97 failList.add(callStr); 98 failList.add(callStr);
fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/RoleChangeTask.java
1 package cn.fw.valhalla.controller.task; 1 package cn.fw.valhalla.controller.task;
2 2
  3 +import cn.fw.valhalla.common.constant.RoleCode;
3 import cn.fw.valhalla.common.utils.StringUtils; 4 import cn.fw.valhalla.common.utils.StringUtils;
4 import cn.fw.valhalla.domain.db.LeaveNeedDo; 5 import cn.fw.valhalla.domain.db.LeaveNeedDo;
  6 +import cn.fw.valhalla.domain.dto.RoleChangeDTO;
  7 +import cn.fw.valhalla.domain.enums.LeaveReasonEnum;
  8 +import cn.fw.valhalla.domain.enums.LeaveTodoTypeEnum;
5 import cn.fw.valhalla.service.bus.LeaveNeedDoBizService; 9 import cn.fw.valhalla.service.bus.LeaveNeedDoBizService;
6 import com.alibaba.fastjson.JSONObject; 10 import com.alibaba.fastjson.JSONObject;
7 import lombok.Getter; 11 import lombok.Getter;
@@ -15,6 +19,7 @@ import org.springframework.stereotype.Component; @@ -15,6 +19,7 @@ import org.springframework.stereotype.Component;
15 import org.springframework.util.CollectionUtils; 19 import org.springframework.util.CollectionUtils;
16 20
17 import java.util.ArrayList; 21 import java.util.ArrayList;
  22 +import java.util.Date;
18 import java.util.List; 23 import java.util.List;
19 import java.util.Objects; 24 import java.util.Objects;
20 25
@@ -31,9 +36,9 @@ public class RoleChangeTask { @@ -31,9 +36,9 @@ public class RoleChangeTask {
31 private final LeaveNeedDoBizService leaveNeedDoBizService; 36 private final LeaveNeedDoBizService leaveNeedDoBizService;
32 private final StringRedisTemplate redisTemplate; 37 private final StringRedisTemplate redisTemplate;
33 38
34 - @Value("${spring.cache.custom.global-prefix}:mq:role:change") 39 + @Value("${spring.cache.custom.global-prefix}:mq:role")
35 @Getter 40 @Getter
36 - private String roleChangeKey; 41 + private String keyPrefix;
37 42
38 @Autowired 43 @Autowired
39 public RoleChangeTask(final LeaveNeedDoBizService leaveNeedDoBizService, 44 public RoleChangeTask(final LeaveNeedDoBizService leaveNeedDoBizService,
@@ -44,28 +49,71 @@ public class RoleChangeTask { @@ -44,28 +49,71 @@ public class RoleChangeTask {
44 49
45 50
46 /** 51 /**
47 - * 处理员工角色变动 52 + * 服务顾问角色变动
48 */ 53 */
49 @Scheduled(initialDelay = 1000 * 30, fixedRate = 1000 * 60 * 60) 54 @Scheduled(initialDelay = 1000 * 30, fixedRate = 1000 * 60 * 60)
50 - public void dealData() { 55 + public void dealFwgwData() {
51 List<String> failList = new ArrayList<>(); 56 List<String> failList = new ArrayList<>();
52 String jsonStr; 57 String jsonStr;
53 - while ((jsonStr = redisTemplate.opsForList().leftPop(getRoleChangeKey())) != null) {  
54 - LeaveNeedDo leaveNeedDo = JSONObject.parseObject(jsonStr, LeaveNeedDo.class);  
55 - if (Objects.isNull(leaveNeedDo)) { 58 + while ((jsonStr = redisTemplate.opsForList().leftPop(getRedisKey(RoleCode.FWGW))) != null) {
  59 + RoleChangeDTO roleChangeDTO = JSONObject.parseObject(jsonStr, RoleChangeDTO.class);
  60 + if (Objects.isNull(roleChangeDTO)) {
56 continue; 61 continue;
57 } 62 }
58 try { 63 try {
59 - leaveNeedDoBizService.add(leaveNeedDo); 64 + leaveNeedDoBizService.add(createDb(roleChangeDTO.getUserId(), roleChangeDTO.getShopId(), roleChangeDTO.getUserName()));
60 } catch (Exception e) { 65 } catch (Exception e) {
61 if (StringUtils.isValid(jsonStr)) { 66 if (StringUtils.isValid(jsonStr)) {
62 failList.add(jsonStr); 67 failList.add(jsonStr);
63 } 68 }
64 - log.error("处理员工角色变动失败", e); 69 + log.error("处理服务接待角色变动失败", e);
65 } 70 }
66 } 71 }
67 if (!CollectionUtils.isEmpty(failList)) { 72 if (!CollectionUtils.isEmpty(failList)) {
68 - redisTemplate.opsForList().rightPushAll(getRoleChangeKey(), failList); 73 + redisTemplate.opsForList().rightPushAll(getRedisKey(RoleCode.FWGW), failList);
69 } 74 }
70 } 75 }
  76 +
  77 + /**
  78 + * 续保角色
  79 + */
  80 + @Scheduled(initialDelay = 1000 * 30, fixedRate = 1000 * 60 * 60)
  81 + public void dealXbData() {
  82 + List<String> failList = new ArrayList<>();
  83 + String jsonStr;
  84 + while ((jsonStr = redisTemplate.opsForList().leftPop(getRedisKey(RoleCode.XBGJ))) != null) {
  85 + RoleChangeDTO roleChangeDTO = JSONObject.parseObject(jsonStr, RoleChangeDTO.class);
  86 + if (Objects.isNull(roleChangeDTO)) {
  87 + continue;
  88 + }
  89 + try {
  90 + leaveNeedDoBizService.xbgjChanged(roleChangeDTO);
  91 + } catch (Exception e) {
  92 + if (StringUtils.isValid(jsonStr)) {
  93 + failList.add(jsonStr);
  94 + }
  95 + log.error("处理续保跟进角色变动失败", e);
  96 + }
  97 + }
  98 + if (!CollectionUtils.isEmpty(failList)) {
  99 + redisTemplate.opsForList().rightPushAll(getRedisKey(RoleCode.XBGJ), failList);
  100 + }
  101 + }
  102 +
  103 + private String getRedisKey(final String roleCode) {
  104 + return String.format("%s:change:%s", getKeyPrefix(), roleCode);
  105 + }
  106 +
  107 + private LeaveNeedDo createDb(Long userId, Long shopId, String userName) {
  108 + LeaveNeedDo leaveNeedDo = new LeaveNeedDo();
  109 + leaveNeedDo.setDone(Boolean.FALSE);
  110 + leaveNeedDo.setEffectiveTime(new Date());
  111 + leaveNeedDo.setReason(LeaveReasonEnum.CHANGE);
  112 + leaveNeedDo.setType(LeaveTodoTypeEnum.CUSTOMER);
  113 + leaveNeedDo.setShopId(shopId);
  114 + leaveNeedDo.setUserId(userId);
  115 + leaveNeedDo.setUserName(userName);
  116 + leaveNeedDo.setCreateTime(new Date());
  117 + return leaveNeedDo;
  118 + }
71 } 119 }
fw-valhalla-server/src/test/java/cn/fw/valhalla/ValhallaAppTests.java
1 package cn.fw.valhalla; 1 package cn.fw.valhalla;
2 2
  3 +import cn.fw.common.util.ValidationUtils;
3 import org.junit.jupiter.api.Test; 4 import org.junit.jupiter.api.Test;
4 import org.junit.runner.RunWith; 5 import org.junit.runner.RunWith;
5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,4 +36,9 @@ class ValhallaAppTests { @@ -35,4 +36,9 @@ class ValhallaAppTests {
35 .andDo(MockMvcResultHandlers.print()); 36 .andDo(MockMvcResultHandlers.print());
36 } 37 }
37 38
  39 + @Test
  40 + public void phoneTest() {
  41 + String phone ="+8619142820251";
  42 + System.out.println(ValidationUtils.checkMobile(phone));
  43 + }
38 } 44 }
fw-valhalla-service/src/main/java/cn/fw/valhalla/component/CallReportConsumer.java
1 package cn.fw.valhalla.component; 1 package cn.fw.valhalla.component;
2 2
  3 +import cn.fw.pstn.sdk.enums.DialTypeEnum;
3 import cn.fw.pstn.sdk.mq.CallReport; 4 import cn.fw.pstn.sdk.mq.CallReport;
4 import cn.fw.valhalla.common.utils.StringUtils; 5 import cn.fw.valhalla.common.utils.StringUtils;
5 import cn.fw.valhalla.domain.dto.CallReportDTO; 6 import cn.fw.valhalla.domain.dto.CallReportDTO;
  7 +import cn.fw.valhalla.domain.enums.CallTypeEnum;
6 import cn.fw.valhalla.rpc.ehr.EhrRpcService; 8 import cn.fw.valhalla.rpc.ehr.EhrRpcService;
7 import cn.fw.valhalla.rpc.ehr.dto.StaffInfoDTO; 9 import cn.fw.valhalla.rpc.ehr.dto.StaffInfoDTO;
8 import com.alibaba.fastjson.JSON; 10 import com.alibaba.fastjson.JSON;
@@ -52,6 +54,10 @@ public class CallReportConsumer implements RocketMQListener&lt;CallReport&gt; { @@ -52,6 +54,10 @@ public class CallReportConsumer implements RocketMQListener&lt;CallReport&gt; {
52 } 54 }
53 CallReportDTO dto = new CallReportDTO(); 55 CallReportDTO dto = new CallReportDTO();
54 BeanUtils.copyProperties(t, dto); 56 BeanUtils.copyProperties(t, dto);
  57 + dto.setDialType(CallTypeEnum.CALL);
  58 + if (DialTypeEnum.P_CALL.equals(t.getCallType())) {
  59 + dto.setDialType(CallTypeEnum.P_CALL);
  60 + }
55 String staffMobile = t.getStaffMobile(); 61 String staffMobile = t.getStaffMobile();
56 if (StringUtils.isEmpty(staffMobile)) { 62 if (StringUtils.isEmpty(staffMobile)) {
57 return; 63 return;
@@ -59,6 +65,7 @@ public class CallReportConsumer implements RocketMQListener&lt;CallReport&gt; { @@ -59,6 +65,7 @@ public class CallReportConsumer implements RocketMQListener&lt;CallReport&gt; {
59 StaffInfoDTO info = ehrRpcService.queryStaffInfoByMobile(staffMobile); 65 StaffInfoDTO info = ehrRpcService.queryStaffInfoByMobile(staffMobile);
60 if (Objects.nonNull(info)) { 66 if (Objects.nonNull(info)) {
61 dto.setStaffId(info.getId()); 67 dto.setStaffId(info.getId());
  68 + dto.setStaffName(info.getName());
62 dto.setGroupId(info.getGroupId()); 69 dto.setGroupId(info.getGroupId());
63 } 70 }
64 redisTemplate.opsForList().rightPush(getCallReportKey(), JSONObject.toJSONString(dto)); 71 redisTemplate.opsForList().rightPush(getCallReportKey(), JSONObject.toJSONString(dto));
fw-valhalla-service/src/main/java/cn/fw/valhalla/component/RoleChangeConsumer.java
@@ -4,6 +4,7 @@ import cn.fw.erp.sdk.api.enums.OperateTypeEnum; @@ -4,6 +4,7 @@ import cn.fw.erp.sdk.api.enums.OperateTypeEnum;
4 import cn.fw.erp.sdk.api.mq.RoleChangeEvent; 4 import cn.fw.erp.sdk.api.mq.RoleChangeEvent;
5 import cn.fw.valhalla.common.constant.RoleCode; 5 import cn.fw.valhalla.common.constant.RoleCode;
6 import cn.fw.valhalla.domain.db.LeaveNeedDo; 6 import cn.fw.valhalla.domain.db.LeaveNeedDo;
  7 +import cn.fw.valhalla.domain.dto.RoleChangeDTO;
7 import cn.fw.valhalla.domain.enums.LeaveReasonEnum; 8 import cn.fw.valhalla.domain.enums.LeaveReasonEnum;
8 import cn.fw.valhalla.domain.enums.LeaveTodoTypeEnum; 9 import cn.fw.valhalla.domain.enums.LeaveTodoTypeEnum;
9 import com.alibaba.fastjson.JSON; 10 import com.alibaba.fastjson.JSON;
@@ -32,9 +33,9 @@ import java.util.Objects; @@ -32,9 +33,9 @@ import java.util.Objects;
32 public class RoleChangeConsumer implements RocketMQListener<RoleChangeEvent> { 33 public class RoleChangeConsumer implements RocketMQListener<RoleChangeEvent> {
33 private final StringRedisTemplate redisTemplate; 34 private final StringRedisTemplate redisTemplate;
34 35
35 - @Value("${spring.cache.custom.global-prefix}:mq:role:change") 36 + @Value("${spring.cache.custom.global-prefix}:mq:role")
36 @Getter 37 @Getter
37 - private String roleChangeKey; 38 + private String keyPrefix;
38 39
39 @Autowired 40 @Autowired
40 public RoleChangeConsumer(final StringRedisTemplate redisTemplate) { 41 public RoleChangeConsumer(final StringRedisTemplate redisTemplate) {
@@ -48,28 +49,21 @@ public class RoleChangeConsumer implements RocketMQListener&lt;RoleChangeEvent&gt; { @@ -48,28 +49,21 @@ public class RoleChangeConsumer implements RocketMQListener&lt;RoleChangeEvent&gt; {
48 if (Objects.isNull(t)) { 49 if (Objects.isNull(t)) {
49 return; 50 return;
50 } 51 }
51 - if (OperateTypeEnum.REMOVE.getValue().equals(t.getType()) && RoleCode.FWGW.equalsIgnoreCase(t.getRoleCode())) {  
52 - Long shopId = t.getRangeValue();  
53 - Long userId = t.getUserId();  
54 - String userName = t.getUserName();  
55 - LeaveNeedDo leaveNeedDo = createDb(userId, shopId, userName);  
56 - redisTemplate.boundListOps(getRoleChangeKey()).rightPush(JSONObject.toJSONString(leaveNeedDo)); 52 + if (OperateTypeEnum.BLOCK.getValue().equals(t.getType()) && RoleCode.FWGW.equalsIgnoreCase(t.getRoleCode())) {
  53 + String jsonString = JSONObject.toJSONString(new RoleChangeDTO(t.getRangeValue(), t.getUserId(), t.getUserName()));
  54 + redisTemplate.boundListOps(getRedisKey(RoleCode.FWGW)).rightPush(jsonString);
  55 + }
  56 +
  57 + if (OperateTypeEnum.BLOCK.getValue().equals(t.getType()) && RoleCode.XBGJ.equalsIgnoreCase(t.getRoleCode())) {
  58 + String jsonString = JSONObject.toJSONString(new RoleChangeDTO(t.getRangeValue(), t.getUserId(), t.getUserName()));
  59 + redisTemplate.boundListOps(getRedisKey(RoleCode.XBGJ)).rightPush(jsonString);
57 } 60 }
58 } catch (Exception ex) { 61 } catch (Exception ex) {
59 log.error("消费角色变动mq失败,原因:{}", JSON.toJSONString(ex)); 62 log.error("消费角色变动mq失败,原因:{}", JSON.toJSONString(ex));
60 } 63 }
61 } 64 }
62 65
63 - private LeaveNeedDo createDb(Long userId, Long shopId, String userName) {  
64 - LeaveNeedDo leaveNeedDo = new LeaveNeedDo();  
65 - leaveNeedDo.setDone(Boolean.FALSE);  
66 - leaveNeedDo.setEffectiveTime(new Date());  
67 - leaveNeedDo.setReason(LeaveReasonEnum.CHANGE);  
68 - leaveNeedDo.setType(LeaveTodoTypeEnum.CUSTOMER);  
69 - leaveNeedDo.setShopId(shopId);  
70 - leaveNeedDo.setUserId(userId);  
71 - leaveNeedDo.setUserName(userName);  
72 - leaveNeedDo.setCreateTime(new Date());  
73 - return leaveNeedDo; 66 + private String getRedisKey(final String roleCode) {
  67 + return String.format("%s:change:%s", getKeyPrefix(), roleCode);
74 } 68 }
75 } 69 }
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/CommonService.java
1 package cn.fw.valhalla.service.bus; 1 package cn.fw.valhalla.service.bus;
2 2
  3 +import cn.fw.common.util.ValidationUtils;
3 import cn.fw.valhalla.common.constant.RoleCode; 4 import cn.fw.valhalla.common.constant.RoleCode;
4 import cn.fw.valhalla.domain.db.customer.AccidentPool; 5 import cn.fw.valhalla.domain.db.customer.AccidentPool;
5 import cn.fw.valhalla.domain.db.customer.Customer; 6 import cn.fw.valhalla.domain.db.customer.Customer;
6 import cn.fw.valhalla.domain.db.customer.CustomerBaseInfo; 7 import cn.fw.valhalla.domain.db.customer.CustomerBaseInfo;
  8 +import cn.fw.valhalla.domain.db.pool.StammkundePool;
7 import cn.fw.valhalla.domain.enums.FollowTypeEnum; 9 import cn.fw.valhalla.domain.enums.FollowTypeEnum;
  10 +import cn.fw.valhalla.domain.enums.StammkundeStatusEnum;
8 import cn.fw.valhalla.domain.vo.PostUserVO; 11 import cn.fw.valhalla.domain.vo.PostUserVO;
9 import cn.fw.valhalla.rpc.ehr.EhrRpcService; 12 import cn.fw.valhalla.rpc.ehr.EhrRpcService;
10 import cn.fw.valhalla.rpc.ehr.dto.StaffInfoDTO; 13 import cn.fw.valhalla.rpc.ehr.dto.StaffInfoDTO;
11 import cn.fw.valhalla.rpc.erp.UserService; 14 import cn.fw.valhalla.rpc.erp.UserService;
12 import cn.fw.valhalla.rpc.erp.dto.PostUserDTO; 15 import cn.fw.valhalla.rpc.erp.dto.PostUserDTO;
13 -import cn.fw.valhalla.rpc.order.OrderRpcService;  
14 import cn.fw.valhalla.rpc.pstn.PstnService; 16 import cn.fw.valhalla.rpc.pstn.PstnService;
15 import cn.fw.valhalla.service.bus.cust.CustomerChangeBizService; 17 import cn.fw.valhalla.service.bus.cust.CustomerChangeBizService;
16 import cn.fw.valhalla.service.data.AccidentPoolService; 18 import cn.fw.valhalla.service.data.AccidentPoolService;
17 import cn.fw.valhalla.service.data.CustomerBaseInfoService; 19 import cn.fw.valhalla.service.data.CustomerBaseInfoService;
18 import cn.fw.valhalla.service.data.CustomerService; 20 import cn.fw.valhalla.service.data.CustomerService;
  21 +import cn.fw.valhalla.service.data.StammkundePoolService;
  22 +import com.baomidou.mybatisplus.core.toolkit.Wrappers;
19 import lombok.RequiredArgsConstructor; 23 import lombok.RequiredArgsConstructor;
20 import lombok.extern.slf4j.Slf4j; 24 import lombok.extern.slf4j.Slf4j;
21 import org.springframework.stereotype.Service; 25 import org.springframework.stereotype.Service;
  26 +import org.springframework.util.CollectionUtils;
22 27
  28 +import java.util.ArrayList;
23 import java.util.List; 29 import java.util.List;
24 -import java.util.stream.Collectors;  
25 30
26 import static cn.fw.common.businessvalidator.Validator.BV; 31 import static cn.fw.common.businessvalidator.Validator.BV;
27 32
@@ -38,18 +43,33 @@ public class CommonService { @@ -38,18 +43,33 @@ public class CommonService {
38 private final UserService userService; 43 private final UserService userService;
39 private final CustomerService customerService; 44 private final CustomerService customerService;
40 private final CustomerBaseInfoService customerBaseInfoService; 45 private final CustomerBaseInfoService customerBaseInfoService;
41 - private final OrderRpcService orderRpcService; 46 + private final StammkundePoolService stammkundePoolService;
42 private final PstnService pstnService; 47 private final PstnService pstnService;
43 private final EhrRpcService ehrRpcService; 48 private final EhrRpcService ehrRpcService;
44 private final AccidentPoolService accidentPoolService; 49 private final AccidentPoolService accidentPoolService;
45 private final CustomerChangeBizService customerChangeBizService; 50 private final CustomerChangeBizService customerChangeBizService;
46 51
47 52
48 - public List<PostUserVO> getUsers(final Long shopId, final Integer type) {  
49 - FollowTypeEnum typeEnum = FollowTypeEnum.ofValue(type);  
50 - BV.notNull(typeEnum, () -> "跟进类型错误");  
51 - List<PostUserDTO> userByRole = userService.getUserByRole(shopId, getRoleCode(typeEnum));  
52 - return userByRole.stream().map(user -> new PostUserVO(user.getUserId(), user.getUserName())).collect(Collectors.toList()); 53 + public List<PostUserVO> getUsers(final Long shopId) {
  54 + List<PostUserVO> list = new ArrayList<>();
  55 + List<PostUserDTO> userByRole = userService.getUserByRole(shopId, RoleCode.FWGW);
  56 + if (CollectionUtils.isEmpty(userByRole)) {
  57 + return list;
  58 + }
  59 +
  60 + for (PostUserDTO userDTO : userByRole) {
  61 + PostUserVO vo = new PostUserVO(userDTO.getUserId(), userDTO.getUserName(), 0);
  62 + int count = stammkundePoolService.count(Wrappers.<StammkundePool>lambdaQuery()
  63 + .eq(StammkundePool::getAdviserId, userDTO.getUserId())
  64 + .eq(StammkundePool::getShopId, shopId)
  65 + .eq(StammkundePool::getPoolStatus, StammkundeStatusEnum.KUNDE)
  66 + .eq(StammkundePool::getAktiv, Boolean.TRUE)
  67 + .isNull(StammkundePool::getRejectTime)
  68 + );
  69 + vo.setCurQuantity(count);
  70 + list.add(vo);
  71 + }
  72 + return list;
53 } 73 }
54 74
55 public void rollBack(String vin, Long groupId) { 75 public void rollBack(String vin, Long groupId) {
@@ -77,6 +97,9 @@ public class CommonService { @@ -77,6 +97,9 @@ public class CommonService {
77 AccidentPool accidentPool = accidentPoolService.getById(cusId); 97 AccidentPool accidentPool = accidentPoolService.getById(cusId);
78 BV.notNull(accidentPool, () -> "用户不存在"); 98 BV.notNull(accidentPool, () -> "用户不存在");
79 becallNo = accidentPool.getReportMobile(); 99 becallNo = accidentPool.getReportMobile();
  100 + if (!ValidationUtils.checkMobile(becallNo)) {
  101 + return becallNo;
  102 + }
80 } else { 103 } else {
81 Customer customer = customerService.queryByIdWithInvalid(cusId); 104 Customer customer = customerService.queryByIdWithInvalid(cusId);
82 BV.notNull(customer, () -> "用户不存在"); 105 BV.notNull(customer, () -> "用户不存在");
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/LeaveNeedDoBizService.java
@@ -16,6 +16,7 @@ import cn.fw.valhalla.domain.db.follow.FollowTask; @@ -16,6 +16,7 @@ import cn.fw.valhalla.domain.db.follow.FollowTask;
16 import cn.fw.valhalla.domain.db.pool.CustomerCluePool; 16 import cn.fw.valhalla.domain.db.pool.CustomerCluePool;
17 import cn.fw.valhalla.domain.db.pool.StammkundePool; 17 import cn.fw.valhalla.domain.db.pool.StammkundePool;
18 import cn.fw.valhalla.domain.dto.LeaveAllocationDTO; 18 import cn.fw.valhalla.domain.dto.LeaveAllocationDTO;
  19 +import cn.fw.valhalla.domain.dto.RoleChangeDTO;
19 import cn.fw.valhalla.domain.dto.StammkundeDto; 20 import cn.fw.valhalla.domain.dto.StammkundeDto;
20 import cn.fw.valhalla.domain.enums.*; 21 import cn.fw.valhalla.domain.enums.*;
21 import cn.fw.valhalla.domain.query.LeaveQueryVO; 22 import cn.fw.valhalla.domain.query.LeaveQueryVO;
@@ -67,6 +68,7 @@ public class LeaveNeedDoBizService { @@ -67,6 +68,7 @@ public class LeaveNeedDoBizService {
67 private final OopService oopService; 68 private final OopService oopService;
68 private final FollowBizService followBizService; 69 private final FollowBizService followBizService;
69 private final FollowTaskService followTaskService; 70 private final FollowTaskService followTaskService;
  71 + private final FollowRecordService followRecordService;
70 private final DistributedLocker distributedLocker; 72 private final DistributedLocker distributedLocker;
71 private final ImSendMessage imSendMessage; 73 private final ImSendMessage imSendMessage;
72 private final TodoRpcService todoRpcService; 74 private final TodoRpcService todoRpcService;
@@ -175,26 +177,56 @@ public class LeaveNeedDoBizService { @@ -175,26 +177,56 @@ public class LeaveNeedDoBizService {
175 } 177 }
176 } 178 }
177 179
  180 +
  181 + @Transactional(rollbackFor = Exception.class)
  182 + public void xbgjChanged(RoleChangeDTO dto) {
  183 + final Long userId = dto.getUserId();
  184 + final Long shopId = dto.getShopId();
  185 + List<ClueStatusEnum> statusList = Arrays.asList(ClueStatusEnum.WAITING, ClueStatusEnum.ONGOING);
  186 + List<CustomerCluePool> list = customerCluePoolService.list(Wrappers.<CustomerCluePool>lambdaQuery()
  187 + .in(CustomerCluePool::getClueStatus, statusList)
  188 + .eq(CustomerCluePool::getOriginalShopId, shopId)
  189 + .eq(CustomerCluePool::getClueType, FollowTypeEnum.IR)
  190 + .eq(CustomerCluePool::getOriginalUserId, userId)
  191 + );
  192 + if (CollectionUtils.isEmpty(list)) {
  193 + return;
  194 + }
  195 + List<PostUserDTO> userList = userService.getUserByRole(shopId, RoleCode.XBGJ);
  196 + BV.isNotEmpty(userList, () -> "更换跟进人员失败:没有更多续保跟进员");
  197 + Collections.shuffle(userList);
  198 + PostUserDTO userDTO = userList.stream().filter(u -> !u.getUserId().equals(userId)).findAny().orElse(null);
  199 + BV.notNull(userDTO, () -> "更换跟进人员失败:没有更多续保跟进员");
  200 +
  201 + for (CustomerCluePool clue : list) {
  202 + if (ClueStatusEnum.WAITING.equals(clue.getClueStatus())) {
  203 + clue.setOriginalUserId(userDTO.getUserId());
  204 + clue.setOriginalUserName(userDTO.getUserName());
  205 + clue.setOriginalShopId(shopId);
  206 + Optional.ofNullable(oopService.shop(shopId)).ifPresent(shop -> clue.setOriginalShopName(shop.getShortName()));
  207 + continue;
  208 + }
  209 + dealTask(clue, userDTO.getUserId(), shopId);
  210 + }
  211 +
  212 + customerCluePoolService.updateBatchById(list);
  213 + }
  214 +
178 private void prepareAllocation(LeaveAllocationDTO dto) { 215 private void prepareAllocation(LeaveAllocationDTO dto) {
179 - AllocationTypeEnum typeEnum = AllocationTypeEnum.ofValue(dto.getAllocationType());  
180 - BV.notNull(typeEnum, () -> "分配方式不正确,请重试");  
181 - dto.setType(typeEnum);  
182 LeaveNeedDo needDo = leaveNeedDoService.queryProcessableById(dto.getId()); 216 LeaveNeedDo needDo = leaveNeedDoService.queryProcessableById(dto.getId());
183 BV.notNull(needDo, () -> "该条记录已处理或不存在,请刷新后重试"); 217 BV.notNull(needDo, () -> "该条记录已处理或不存在,请刷新后重试");
184 -  
185 dto.setAdviserId(needDo.getUserId()); 218 dto.setAdviserId(needDo.getUserId());
186 - if (AllocationTypeEnum.ONE.equals(typeEnum)) {  
187 - BV.notNull(dto.getUserId(), () -> "指定人员不能为空");  
188 - List<UserRoleDataRangeDTO> dataRange = userService.getUserRoleDataRange(dto.getUserId(), RoleCode.FWGW); 219 +
  220 + List<LeaveAllocationDTO.Allocation> ruleList = dto.getRuleList();
  221 + BV.notNull(ruleList, () -> "分配规则不能为空");
  222 +
  223 + for (LeaveAllocationDTO.Allocation rule : ruleList) {
  224 + List<UserRoleDataRangeDTO> dataRange = userService.getUserRoleDataRange(rule.getUserId(), RoleCode.FWGW);
189 List<Long> shopIdList = dataRange.stream().map(UserRoleDataRangeDTO::getRangeValue).collect(Collectors.toList()); 225 List<Long> shopIdList = dataRange.stream().map(UserRoleDataRangeDTO::getRangeValue).collect(Collectors.toList());
190 - BV.isNotEmpty(shopIdList, () -> "指定人员非服务顾问角色,请核对"); 226 + BV.isNotEmpty(shopIdList, () -> String.format("[%s]无服务接待角色,请核对", rule.getUserName()));
191 Long shopId = shopIdList.get(0); 227 Long shopId = shopIdList.get(0);
192 - BV.isTrue(needDo.getShopId().equals(shopId), () -> "指定人员所属门店与档案归属门店不符");  
193 - dto.setShopId(shopId);  
194 - }  
195 -  
196 - if (AllocationTypeEnum.ALL.equals(dto.getType())) {  
197 - dto.setShopId(needDo.getShopId()); 228 + BV.isTrue(needDo.getShopId().equals(shopId), () -> String.format("[%s]所属门店与离职人员门店不符", rule.getUserName()));
  229 + rule.setShopId(shopId);
198 } 230 }
199 } 231 }
200 232
@@ -209,63 +241,35 @@ public class LeaveNeedDoBizService { @@ -209,63 +241,35 @@ public class LeaveNeedDoBizService {
209 if (CollectionUtils.isEmpty(customerList)) { 241 if (CollectionUtils.isEmpty(customerList)) {
210 return null; 242 return null;
211 } 243 }
212 - if (AllocationTypeEnum.ONE.equals(dto.getType())) {  
213 - allocation(key, customerList, dto);  
214 - }  
215 - if (AllocationTypeEnum.ALL.equals(dto.getType())) {  
216 - allocation(key, customerList, dto.getShopId());  
217 - }  
218 - return customerList;  
219 - } 244 + List<LeaveAllocationDTO.Allocation> ruleList = dto.getRuleList();
220 245
221 - /**  
222 - * 分配给指定人员  
223 - *  
224 - * @param list  
225 - * @param dto  
226 - */  
227 - private void allocation(String key, List<Customer> list, LeaveAllocationDTO dto) {  
228 - List<StammkundePool> spl = new ArrayList<>(list.size());  
229 - final String userName = Optional.ofNullable(userService.user(dto.getUserId())).map(UserInfoDTO::getUserName).orElse("");  
230 - for (Customer customer : list) {  
231 - customer.setShopId(dto.getShopId());  
232 - customer.setAdviserId(dto.getUserId());  
233 - spl.add(createPool(customer, userName));  
234 - rejectPool(customer.getId(), dto.getShopId(), userName, dto.getUserId(), customer.getGroupId());  
235 - }  
236 - customerService.updateBatchById(list);  
237 - stammkundePoolService.saveBatch(spl);  
238 - setToCache(key, new UserInfo(dto.getUserId(), "", list.size()));  
239 - } 246 + final List<Customer> list = new ArrayList<>();
  247 + final List<StammkundePool> spl = new ArrayList<>();
  248 + final LinkedList<UserInfo> queue = new LinkedList<>();
240 249
241 - /**  
242 - * 门店内平均分配  
243 - *  
244 - * @param list  
245 - * @param shopId  
246 - */  
247 - private void allocation(String key, List<Customer> list, Long shopId) {  
248 - List<PostUserDTO> users = userService.getUserByRole(shopId, RoleCode.FWGW);  
249 - BV.isNotEmpty(users, () -> "该门店没有服务顾问,请检查配置是否正确");  
250 - List<StammkundePool> spl = new ArrayList<>(list.size());  
251 - LinkedList<UserInfo> queue = new LinkedList<>();  
252 - for (PostUserDTO user : users) {  
253 - queue.offer(new UserInfo(user.getUserId(), user.getUserName()));  
254 - }  
255 - for (Customer customer : list) {  
256 - UserInfo info = queue.poll();  
257 - customer.setShopId(shopId);  
258 - customer.setAdviserId(Objects.requireNonNull(info, "服务顾问信息获取异常,请重试").getUserId());  
259 - info.setCount(info.getCount() + 1);  
260 - rejectPool(customer.getId(), shopId, info.getUserName(), info.getUserId(), customer.getGroupId());  
261 - spl.add(createPool(customer, info.getUserName()));  
262 - queue.offer(info); 250 + for (LeaveAllocationDTO.Allocation rule : ruleList) {
  251 + int size = customerList.size();
  252 + List<Customer> subList = customerList.subList(0, rule.getNum() > size ? size : rule.getNum());
  253 + if (CollectionUtils.isEmpty(subList)) {
  254 + continue;
  255 + }
  256 + for (Customer customer : subList) {
  257 + customer.setShopId(rule.getShopId());
  258 + customer.setAdviserId(rule.getUserId());
  259 + rejectPool(customer.getId(), rule.getShopId(), rule.getUserName(), rule.getUserId(), customer.getGroupId());
  260 + spl.add(createPool(customer, rule.getUserName()));
  261 + list.add(customer);
  262 + }
  263 + queue.add(new UserInfo(rule.getUserId(), rule.getUserName(), subList.size()));
  264 + subList.clear();
263 } 265 }
264 customerService.updateBatchById(list); 266 customerService.updateBatchById(list);
265 stammkundePoolService.saveBatch(spl); 267 stammkundePoolService.saveBatch(spl);
266 setToCache(key, queue); 268 setToCache(key, queue);
  269 + return list;
267 } 270 }
268 271
  272 +
269 /** 273 /**
270 * 完成分配的后续处理逻辑 274 * 完成分配的后续处理逻辑
271 * 275 *
@@ -310,24 +314,27 @@ public class LeaveNeedDoBizService { @@ -310,24 +314,27 @@ public class LeaveNeedDoBizService {
310 customerCluePoolService.updateBatchById(list); 314 customerCluePoolService.updateBatchById(list);
311 } 315 }
312 316
313 - private void dealTask(CustomerCluePool clue, Long adviserId, Long shopId) {  
314 - if (Boolean.FALSE.equals(clue.getRedistribution())) {  
315 - clue.setRedistribution(Boolean.TRUE);  
316 - } 317 + private void dealTask(CustomerCluePool clue, Long userId, Long shopId) {
317 FollowTask task = followTaskService.queryOngoingTaskByClueId(clue.getId()); 318 FollowTask task = followTaskService.queryOngoingTaskByClueId(clue.getId());
318 if (Objects.isNull(task)) { 319 if (Objects.isNull(task)) {
319 return; 320 return;
320 } 321 }
321 - if (Boolean.TRUE.equals(task.getRedistribution())) {  
322 - task.setFollowUser(adviserId);  
323 - task.setFollowShop(shopId);  
324 - followTaskService.updateById(task);  
325 - return;  
326 - } 322 + UserInfoDTO user = userService.user(userId);
  323 + String userName = Objects.nonNull(user) ? user.getUserName() : "";
327 task.setCloseTime(new Date()); 324 task.setCloseTime(new Date());
328 task.setState(TaskStateEnum.DEFEAT); 325 task.setState(TaskStateEnum.DEFEAT);
329 task.setReason(TaskDefeatTypeEnum.D); 326 task.setReason(TaskDefeatTypeEnum.D);
330 followTaskService.updateById(task); 327 followTaskService.updateById(task);
  328 + followRecordService.removeByTaskId(task.getId());
  329 +
  330 + if (Boolean.TRUE.equals(task.getRedistribution())) {
  331 + clue.setCloseTime(new Date());
  332 + clue.setClueStatus(ClueStatusEnum.FAILURE);
  333 + return;
  334 + } else {
  335 + clue.setRedistribution(Boolean.TRUE);
  336 + }
  337 +
331 FollowTask nTask = new FollowTask(); 338 FollowTask nTask = new FollowTask();
332 nTask.setClueId(clue.getId()); 339 nTask.setClueId(clue.getId());
333 nTask.setCustomerId(clue.getRefererId()); 340 nTask.setCustomerId(clue.getRefererId());
@@ -336,13 +343,15 @@ public class LeaveNeedDoBizService { @@ -336,13 +343,15 @@ public class LeaveNeedDoBizService {
336 nTask.setBeginTime(new Date()); 343 nTask.setBeginTime(new Date());
337 nTask.setRedistribution(Boolean.TRUE); 344 nTask.setRedistribution(Boolean.TRUE);
338 nTask.setDeadline(clue.getDeadline()); 345 nTask.setDeadline(clue.getDeadline());
339 - nTask.setFollowUser(adviserId); 346 + nTask.setFollowUser(userId);
  347 + task.setFollowUserName(userName);
340 nTask.setFollowShop(shopId); 348 nTask.setFollowShop(shopId);
341 nTask.setGroupId(clue.getGroupId()); 349 nTask.setGroupId(clue.getGroupId());
342 followTaskService.save(nTask); 350 followTaskService.save(nTask);
343 followBizService.startTask(nTask); 351 followBizService.startTask(nTask);
344 } 352 }
345 353
  354 +
346 private void finish(LoginAuthBean user, Long leaveId, String key) { 355 private void finish(LoginAuthBean user, Long leaveId, String key) {
347 leaveNeedDoService.dealById(leaveId); 356 leaveNeedDoService.dealById(leaveId);
348 List<UserInfo> list = getAllFromCache(key); 357 List<UserInfo> list = getAllFromCache(key);
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/cust/AbstractCustomerService.java
@@ -131,6 +131,7 @@ public abstract class AbstractCustomerService { @@ -131,6 +131,7 @@ public abstract class AbstractCustomerService {
131 dto.setInsuranceExpires(customer.getInsuranceExpires()); 131 dto.setInsuranceExpires(customer.getInsuranceExpires());
132 dto.setArrivalTime(customer.getArrivalTime()); 132 dto.setArrivalTime(customer.getArrivalTime());
133 dto.setAdviserId(customer.getAdviserId()); 133 dto.setAdviserId(customer.getAdviserId());
  134 + dto.setArrivalCount(customer.getArrivalCount());
134 UserInfoDTO user = userService.user(customer.getAdviserId()); 135 UserInfoDTO user = userService.user(customer.getAdviserId());
135 if (Objects.nonNull(user)) { 136 if (Objects.nonNull(user)) {
136 dto.setAdviserName(user.getUserName()); 137 dto.setAdviserName(user.getUserName());
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/cust/CustomerBizService.java
@@ -369,9 +369,6 @@ public class CustomerBizService extends AbstractCustomerService { @@ -369,9 +369,6 @@ public class CustomerBizService extends AbstractCustomerService {
369 if (Objects.isNull(detailDto)) { 369 if (Objects.isNull(detailDto)) {
370 return; 370 return;
371 } 371 }
372 - if (publicPoolService.queryByPlate(detailDto.getPlateNo(), detailDto.getGroupId()).isPresent()) {  
373 - return;  
374 - }  
375 List<FollowTypeEnum> typeList = Arrays.asList(FollowTypeEnum.AC, FollowTypeEnum.IR); 372 List<FollowTypeEnum> typeList = Arrays.asList(FollowTypeEnum.AC, FollowTypeEnum.IR);
376 HashSet<FollowTypeEnum> set = new HashSet<>(typeList); 373 HashSet<FollowTypeEnum> set = new HashSet<>(typeList);
377 if (set.contains(task.getType())) { 374 if (set.contains(task.getType())) {
@@ -383,6 +380,9 @@ public class CustomerBizService extends AbstractCustomerService { @@ -383,6 +380,9 @@ public class CustomerBizService extends AbstractCustomerService {
383 if (FollowTypeEnum.RM.equals(task.getType())) { 380 if (FollowTypeEnum.RM.equals(task.getType())) {
384 type = PublicPoolTypeEnum.RM; 381 type = PublicPoolTypeEnum.RM;
385 } 382 }
  383 + if (publicPoolService.queryByPlate(detailDto.getPlateNo(), detailDto.getGroupId()).isPresent()) {
  384 + return;
  385 + }
386 PublicPool publicPool = createPublicPool(detailDto, type, "系统判定"); 386 PublicPool publicPool = createPublicPool(detailDto, type, "系统判定");
387 boolean updated = customerService.update(Wrappers.<Customer>lambdaUpdate() 387 boolean updated = customerService.update(Wrappers.<Customer>lambdaUpdate()
388 .set(Customer::getAdviserId, null) 388 .set(Customer::getAdviserId, null)
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/cust/PickUpCustomerService.java
@@ -74,6 +74,22 @@ public class PickUpCustomerService extends AbstractCustomerService { @@ -74,6 +74,22 @@ public class PickUpCustomerService extends AbstractCustomerService {
74 } 74 }
75 75
76 /** 76 /**
  77 + * 修改车牌号
  78 + *
  79 + * @param frameNo
  80 + * @param plateNo
  81 + * @param groupId
  82 + * @return
  83 + */
  84 + @Transactional(rollbackFor = Exception.class)
  85 + public Boolean fixPlateNo(String frameNo, String plateNo, Long groupId) {
  86 + Customer customer = customerService.queryByFrameNo(frameNo, groupId);
  87 + BV.notNull(customer, () -> "车架号有误");
  88 + customer.setPlateNo(plateNo);
  89 + return customerService.updateById(customer);
  90 + }
  91 +
  92 + /**
77 * 根据vin查询档案 93 * 根据vin查询档案
78 * 94 *
79 * @param currentUser 95 * @param currentUser
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/FollowBizService.java
@@ -6,7 +6,9 @@ import cn.fw.common.web.auth.LoginAuthBean; @@ -6,7 +6,9 @@ import cn.fw.common.web.auth.LoginAuthBean;
6 import cn.fw.valhalla.common.utils.DateUtil; 6 import cn.fw.valhalla.common.utils.DateUtil;
7 import cn.fw.valhalla.domain.db.ApproveRecord; 7 import cn.fw.valhalla.domain.db.ApproveRecord;
8 import cn.fw.valhalla.domain.db.OriginalData; 8 import cn.fw.valhalla.domain.db.OriginalData;
  9 +import cn.fw.valhalla.domain.db.SecretReportHistory;
9 import cn.fw.valhalla.domain.db.follow.FollowRecord; 10 import cn.fw.valhalla.domain.db.follow.FollowRecord;
  11 +import cn.fw.valhalla.domain.db.follow.FollowRecordLog;
10 import cn.fw.valhalla.domain.db.follow.FollowTask; 12 import cn.fw.valhalla.domain.db.follow.FollowTask;
11 import cn.fw.valhalla.domain.db.pool.CustomerCluePool; 13 import cn.fw.valhalla.domain.db.pool.CustomerCluePool;
12 import cn.fw.valhalla.domain.dto.CallReportDTO; 14 import cn.fw.valhalla.domain.dto.CallReportDTO;
@@ -23,10 +25,7 @@ import cn.fw.valhalla.rpc.flow.FlowApproveRpc; @@ -23,10 +25,7 @@ import cn.fw.valhalla.rpc.flow.FlowApproveRpc;
23 import cn.fw.valhalla.rpc.flow.dto.FlowDto; 25 import cn.fw.valhalla.rpc.flow.dto.FlowDto;
24 import cn.fw.valhalla.sdk.enums.DataTypeEnum; 26 import cn.fw.valhalla.sdk.enums.DataTypeEnum;
25 import cn.fw.valhalla.service.bus.follow.strategy.FollowStrategy; 27 import cn.fw.valhalla.service.bus.follow.strategy.FollowStrategy;
26 -import cn.fw.valhalla.service.data.ApproveRecordService;  
27 -import cn.fw.valhalla.service.data.CustomerCluePoolService;  
28 -import cn.fw.valhalla.service.data.FollowRecordService;  
29 -import cn.fw.valhalla.service.data.FollowTaskService; 28 +import cn.fw.valhalla.service.data.*;
30 import cn.fw.valhalla.service.event.TaskCancelEvent; 29 import cn.fw.valhalla.service.event.TaskCancelEvent;
31 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 30 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
32 import lombok.Getter; 31 import lombok.Getter;
@@ -67,6 +66,8 @@ public class FollowBizService { @@ -67,6 +66,8 @@ public class FollowBizService {
67 private final UserService userService; 66 private final UserService userService;
68 private final DistributedLocker distributedLocker; 67 private final DistributedLocker distributedLocker;
69 private final CustomerCluePoolService customerCluePoolService; 68 private final CustomerCluePoolService customerCluePoolService;
  69 + private final SecretReportHistoryService secretReportHistoryService;
  70 + private final FollowRecordLogService followRecordLogService;
70 71
71 @Value("${follow.flowNo}") 72 @Value("${follow.flowNo}")
72 @Getter 73 @Getter
@@ -84,7 +85,9 @@ public class FollowBizService { @@ -84,7 +85,9 @@ public class FollowBizService {
84 final FollowRecordService followRecordService, 85 final FollowRecordService followRecordService,
85 final UserService userService, 86 final UserService userService,
86 final DistributedLocker distributedLocker, 87 final DistributedLocker distributedLocker,
87 - final CustomerCluePoolService customerCluePoolService) { 88 + final CustomerCluePoolService customerCluePoolService,
  89 + final SecretReportHistoryService secretReportHistoryService,
  90 + final FollowRecordLogService followRecordLogService) {
88 this.followMap = followStrategyList.stream().collect(Collectors.toMap(FollowStrategy::getFollowType, v -> v)); 91 this.followMap = followStrategyList.stream().collect(Collectors.toMap(FollowStrategy::getFollowType, v -> v));
89 this.flowApproveRpc = flowApproveRpc; 92 this.flowApproveRpc = flowApproveRpc;
90 this.approveRecordService = approveRecordService; 93 this.approveRecordService = approveRecordService;
@@ -93,6 +96,8 @@ public class FollowBizService { @@ -93,6 +96,8 @@ public class FollowBizService {
93 this.userService = userService; 96 this.userService = userService;
94 this.distributedLocker = distributedLocker; 97 this.distributedLocker = distributedLocker;
95 this.customerCluePoolService = customerCluePoolService; 98 this.customerCluePoolService = customerCluePoolService;
  99 + this.secretReportHistoryService = secretReportHistoryService;
  100 + this.followRecordLogService = followRecordLogService;
96 } 101 }
97 102
98 /** 103 /**
@@ -479,6 +484,10 @@ public class FollowBizService { @@ -479,6 +484,10 @@ public class FollowBizService {
479 } 484 }
480 final Long groupId = dto.getGroupId(); 485 final Long groupId = dto.getGroupId();
481 final Long staffId = dto.getStaffId(); 486 final Long staffId = dto.getStaffId();
  487 + final Long talkTime = dto.getTalkTime();
  488 + if (Objects.isNull(talkTime) || talkTime <= 0) {
  489 + return;
  490 + }
482 if (accidentCar) { 491 if (accidentCar) {
483 CustomerCluePool cluePool = customerCluePoolService.getOne(Wrappers.<CustomerCluePool>lambdaQuery() 492 CustomerCluePool cluePool = customerCluePoolService.getOne(Wrappers.<CustomerCluePool>lambdaQuery()
484 .eq(CustomerCluePool::getRefererId, idArr[0]) 493 .eq(CustomerCluePool::getRefererId, idArr[0])
@@ -489,7 +498,7 @@ public class FollowBizService { @@ -489,7 +498,7 @@ public class FollowBizService {
489 .last(" limit 1") 498 .last(" limit 1")
490 ); 499 );
491 if (Objects.nonNull(cluePool)) { 500 if (Objects.nonNull(cluePool)) {
492 - completeRecord(cluePool.getId(), staffId, dto.getCallId()); 501 + completeRecord(dto, cluePool.getId(), staffId, dto.getCallId());
493 } 502 }
494 } else { 503 } else {
495 List<CustomerCluePool> list = customerCluePoolService.list(Wrappers.<CustomerCluePool>lambdaQuery() 504 List<CustomerCluePool> list = customerCluePoolService.list(Wrappers.<CustomerCluePool>lambdaQuery()
@@ -498,7 +507,7 @@ public class FollowBizService { @@ -498,7 +507,7 @@ public class FollowBizService {
498 .in(CustomerCluePool::getRefererId, Arrays.asList(idArr)) 507 .in(CustomerCluePool::getRefererId, Arrays.asList(idArr))
499 ); 508 );
500 if (!CollectionUtils.isEmpty(list)) { 509 if (!CollectionUtils.isEmpty(list)) {
501 - list.forEach(cluePool -> completeRecord(cluePool.getId(), staffId, dto.getCallId())); 510 + list.forEach(cluePool -> completeRecord(dto, cluePool.getId(), staffId, dto.getCallId()));
502 } 511 }
503 } 512 }
504 } 513 }
@@ -540,7 +549,7 @@ public class FollowBizService { @@ -540,7 +549,7 @@ public class FollowBizService {
540 ) > 0; 549 ) > 0;
541 } 550 }
542 551
543 - private void completeRecord(final Long clueId, final Long staffId, final String callId) { 552 + private void completeRecord(CallReportDTO reportDTO, final Long clueId, final Long staffId, final String callId) {
544 FollowTask followTask = followTaskService.queryOngoingTaskByClueId(clueId); 553 FollowTask followTask = followTaskService.queryOngoingTaskByClueId(clueId);
545 if (Objects.isNull(followTask)) { 554 if (Objects.isNull(followTask)) {
546 return; 555 return;
@@ -560,6 +569,7 @@ public class FollowBizService { @@ -560,6 +569,7 @@ public class FollowBizService {
560 569
561 FollowStrategy strategy = followMap.get(followType); 570 FollowStrategy strategy = followMap.get(followType);
562 Assert.notNull(strategy, "strategy cannot be null"); 571 Assert.notNull(strategy, "strategy cannot be null");
  572 + List<SecretReportHistory> reportHistoryList = new ArrayList<>();
563 573
564 for (FollowRecord record : list) { 574 for (FollowRecord record : list) {
565 FollowAttachmentDTO dto = new FollowAttachmentDTO(); 575 FollowAttachmentDTO dto = new FollowAttachmentDTO();
@@ -569,6 +579,31 @@ public class FollowBizService { @@ -569,6 +579,31 @@ public class FollowBizService {
569 dto.setFeedbackType(FollowTypeEnum.AC.equals(followType) ? FeedbackTypeEnum.OTHER.getValue() : null); 579 dto.setFeedbackType(FollowTypeEnum.AC.equals(followType) ? FeedbackTypeEnum.OTHER.getValue() : null);
570 dto.setAttType(AttTypeEnum.SMART_PHONE.getValue()); 580 dto.setAttType(AttTypeEnum.SMART_PHONE.getValue());
571 strategy.uploadAtt(dto, staffId); 581 strategy.uploadAtt(dto, staffId);
  582 + reportHistoryList.add(createHistory(reportDTO, record, followType));
572 } 583 }
  584 + secretReportHistoryService.saveBatch(reportHistoryList);
  585 + }
  586 +
  587 +
  588 + private SecretReportHistory createHistory(CallReportDTO reportDTO, FollowRecord record, FollowTypeEnum followTypeEnum) {
  589 + SecretReportHistory history = new SecretReportHistory();
  590 + history.setTaskId(record.getTaskId());
  591 + history.setTaskType(followTypeEnum);
  592 + history.setFollowRecordId(record.getId());
  593 + history.setCallId(reportDTO.getCallId());
  594 + history.setStaffId(reportDTO.getStaffId());
  595 + history.setStaffName(reportDTO.getStaffName());
  596 + history.setCustomerId(record.getCustomerId());
  597 + history.setCallType(reportDTO.getDialType());
  598 + history.setCallTime(reportDTO.getCallTime());
  599 + history.setCallDuration(reportDTO.getTalkTime());
  600 + history.setShopId(record.getShopId());
  601 + history.setGroupId(record.getGroupId());
  602 + int count = followRecordLogService.count(Wrappers.<FollowRecordLog>lambdaQuery()
  603 + .eq(FollowRecordLog::getTaskId, record.getTaskId())
  604 + .eq(FollowRecordLog::getAttType, AttTypeEnum.SMART_PHONE)
  605 + );
  606 + history.setFirstCall(count <= 0);
  607 + return history;
573 } 608 }
574 } 609 }
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/PoolBizService.java
@@ -8,13 +8,12 @@ import cn.fw.valhalla.domain.db.customer.AffiliationRecord; @@ -8,13 +8,12 @@ import cn.fw.valhalla.domain.db.customer.AffiliationRecord;
8 import cn.fw.valhalla.domain.db.pool.PublicPool; 8 import cn.fw.valhalla.domain.db.pool.PublicPool;
9 import cn.fw.valhalla.domain.dto.CustomerCluePoolDTO; 9 import cn.fw.valhalla.domain.dto.CustomerCluePoolDTO;
10 import cn.fw.valhalla.domain.dto.FollowPoolDTO; 10 import cn.fw.valhalla.domain.dto.FollowPoolDTO;
  11 +import cn.fw.valhalla.domain.dto.SecretReportHistoryDTO;
11 import cn.fw.valhalla.domain.dto.StammkundePoolDTO; 12 import cn.fw.valhalla.domain.dto.StammkundePoolDTO;
12 import cn.fw.valhalla.domain.enums.*; 13 import cn.fw.valhalla.domain.enums.*;
13 -import cn.fw.valhalla.domain.query.CustomerCluePoolQueryVO;  
14 -import cn.fw.valhalla.domain.query.FollowPoolQueryVO;  
15 -import cn.fw.valhalla.domain.query.PoolQuery;  
16 -import cn.fw.valhalla.domain.query.StammkundePoolQueryVO; 14 +import cn.fw.valhalla.domain.query.*;
17 import cn.fw.valhalla.domain.vo.AppPageVO; 15 import cn.fw.valhalla.domain.vo.AppPageVO;
  16 +import cn.fw.valhalla.domain.vo.SecretReportHistoryVO;
18 import cn.fw.valhalla.domain.vo.pool.*; 17 import cn.fw.valhalla.domain.vo.pool.*;
19 import cn.fw.valhalla.rpc.erp.UserService; 18 import cn.fw.valhalla.rpc.erp.UserService;
20 import cn.fw.valhalla.rpc.erp.dto.UserInfoDTO; 19 import cn.fw.valhalla.rpc.erp.dto.UserInfoDTO;
@@ -55,6 +54,7 @@ public class PoolBizService { @@ -55,6 +54,7 @@ public class PoolBizService {
55 private final UserService userService; 54 private final UserService userService;
56 private final AffiliationRecordService affiliationRecordService; 55 private final AffiliationRecordService affiliationRecordService;
57 private final OrderRpcService orderRpcService; 56 private final OrderRpcService orderRpcService;
  57 + private final SecretReportHistoryService secretReportHistoryService;
58 58
59 59
60 /** 60 /**
@@ -191,6 +191,36 @@ public class PoolBizService { @@ -191,6 +191,36 @@ public class PoolBizService {
191 return vo; 191 return vo;
192 } 192 }
193 193
  194 + /**
  195 + * 查询通话记录池
  196 + *
  197 + * @param query
  198 + * @return
  199 + */
  200 + public AppPage<SecretReportHistoryVO> secretReportList(SecretReportHistoryQuery query) {
  201 + BV.isNotEmpty(query.getShopIds(), () -> "人员权限范围不正确,请确认是否有管理权限");
  202 + if (Objects.isNull(query.getOrder())) {
  203 + query.setOrderString(" order by call_time asc ");
  204 + }
  205 + AppPageVO<SecretReportHistoryVO> page = AppPageVO.init(query);
  206 + long total = secretReportHistoryService.secretReportCount(query);
  207 + if (total <= 0) {
  208 + return page;
  209 + }
  210 + page.setTotal(total);
  211 + List<SecretReportHistoryDTO> list = secretReportHistoryService.secretReportList(query);
  212 + List<SecretReportHistoryVO> appList = new ArrayList<>();
  213 + for (SecretReportHistoryDTO dto : list) {
  214 + SecretReportHistoryVO vo = new SecretReportHistoryVO();
  215 + BeanUtils.copyProperties(dto, vo);
  216 + vo.setShopName(Optional.ofNullable(oopService.shop(dto.getShopId())).map(ShopDTO::getShortName).orElse(null));
  217 + vo.setCallType(CallTypeEnum.ofValue(dto.getDialType()));
  218 + appList.add(vo);
  219 + }
  220 + page.setData(appList);
  221 + return page;
  222 + }
  223 +
194 private FollowPoolListVO trans2FollowPool(FollowPoolDTO poolDTO) { 224 private FollowPoolListVO trans2FollowPool(FollowPoolDTO poolDTO) {
195 FollowPoolListVO vo = new FollowPoolListVO(); 225 FollowPoolListVO vo = new FollowPoolListVO();
196 BeanUtils.copyProperties(poolDTO, vo); 226 BeanUtils.copyProperties(poolDTO, vo);
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/AbstractFollowStrategy.java
@@ -3,6 +3,7 @@ package cn.fw.valhalla.service.bus.follow.strategy; @@ -3,6 +3,7 @@ package cn.fw.valhalla.service.bus.follow.strategy;
3 import cn.fw.common.cache.locker.DistributedLocker; 3 import cn.fw.common.cache.locker.DistributedLocker;
4 import cn.fw.common.exception.BusinessException; 4 import cn.fw.common.exception.BusinessException;
5 import cn.fw.common.web.auth.LoginAuthBean; 5 import cn.fw.common.web.auth.LoginAuthBean;
  6 +import cn.fw.valhalla.common.constant.RoleCode;
6 import cn.fw.valhalla.common.utils.DateUtil; 7 import cn.fw.valhalla.common.utils.DateUtil;
7 import cn.fw.valhalla.common.utils.StringUtils; 8 import cn.fw.valhalla.common.utils.StringUtils;
8 import cn.fw.valhalla.domain.db.OriginalData; 9 import cn.fw.valhalla.domain.db.OriginalData;
@@ -23,7 +24,9 @@ import cn.fw.valhalla.rpc.angel.dto.InsuranceDTO; @@ -23,7 +24,9 @@ import cn.fw.valhalla.rpc.angel.dto.InsuranceDTO;
23 import cn.fw.valhalla.rpc.erp.TodoRpcService; 24 import cn.fw.valhalla.rpc.erp.TodoRpcService;
24 import cn.fw.valhalla.rpc.erp.UserService; 25 import cn.fw.valhalla.rpc.erp.UserService;
25 import cn.fw.valhalla.rpc.erp.dto.BackLogItemDTO; 26 import cn.fw.valhalla.rpc.erp.dto.BackLogItemDTO;
  27 +import cn.fw.valhalla.rpc.erp.dto.PostUserDTO;
26 import cn.fw.valhalla.rpc.erp.dto.UserInfoDTO; 28 import cn.fw.valhalla.rpc.erp.dto.UserInfoDTO;
  29 +import cn.fw.valhalla.rpc.erp.dto.UserRoleDataRangeDTO;
27 import cn.fw.valhalla.rpc.oop.OopService; 30 import cn.fw.valhalla.rpc.oop.OopService;
28 import cn.fw.valhalla.rpc.oop.dto.ShopDTO; 31 import cn.fw.valhalla.rpc.oop.dto.ShopDTO;
29 import cn.fw.valhalla.service.bus.cust.CustomerBizService; 32 import cn.fw.valhalla.service.bus.cust.CustomerBizService;
@@ -136,10 +139,31 @@ public abstract class AbstractFollowStrategy implements FollowStrategy { @@ -136,10 +139,31 @@ public abstract class AbstractFollowStrategy implements FollowStrategy {
136 139
137 @Override 140 @Override
138 public List<FollowRecordVO> getRecordList(Long taskId) { 141 public List<FollowRecordVO> getRecordList(Long taskId) {
139 - List<FollowRecord> followRecordList = followRecordService.getRecordList(taskId); 142 + List<FollowRecord> followRecordList = new ArrayList<>();
  143 + FollowTask task = followTaskService.getById(taskId);
  144 + if (Objects.nonNull(task)) {
  145 + Long clueId = task.getClueId();
  146 + List<FollowTask> taskList = followTaskService.list(Wrappers.<FollowTask>lambdaQuery()
  147 + .eq(FollowTask::getClueId, clueId)
  148 + .ne(FollowTask::getId, taskId)
  149 + );
  150 + if (!CollectionUtils.isEmpty(taskList)) {
  151 + for (FollowTask followTask : taskList) {
  152 + List<FollowRecord> recordList = followRecordService.getRecordList(followTask.getId());
  153 + if (!CollectionUtils.isEmpty(recordList)) {
  154 + followRecordList.addAll(recordList);
  155 + }
  156 + }
  157 + }
  158 + }
  159 + List<FollowRecord> recordList = followRecordService.getRecordList(taskId);
  160 + if (!CollectionUtils.isEmpty(recordList)) {
  161 + followRecordList.addAll(recordList);
  162 + }
140 if (CollectionUtils.isEmpty(followRecordList)) { 163 if (CollectionUtils.isEmpty(followRecordList)) {
141 return new ArrayList<>(); 164 return new ArrayList<>();
142 } 165 }
  166 + List<FollowRecord> records = followRecordList.stream().sorted(Comparator.comparing(FollowRecord::getId)).collect(Collectors.toList());
143 List<Long> recordIds = followRecordList.stream().map(FollowRecord::getId).collect(Collectors.toList()); 167 List<Long> recordIds = followRecordList.stream().map(FollowRecord::getId).collect(Collectors.toList());
144 List<FollowRecordLog> attachments = followRecordLogService.getListByRecordIds(recordIds); 168 List<FollowRecordLog> attachments = followRecordLogService.getListByRecordIds(recordIds);
145 if (CollectionUtils.isEmpty(attachments)) { 169 if (CollectionUtils.isEmpty(attachments)) {
@@ -157,7 +181,7 @@ public abstract class AbstractFollowStrategy implements FollowStrategy { @@ -157,7 +181,7 @@ public abstract class AbstractFollowStrategy implements FollowStrategy {
157 vo.setFollowType(followRecordList.get(0).getType()); 181 vo.setFollowType(followRecordList.get(0).getType());
158 vo.setUploadTime(attachment.getUploadTime()); 182 vo.setUploadTime(attachment.getUploadTime());
159 vo.setDescribes(attachment.getDescribes()); 183 vo.setDescribes(attachment.getDescribes());
160 - int i = queryIndexFromRecords(followRecordList, attachment.getRecordId()); 184 + int i = queryIndexFromRecords(records, attachment.getRecordId());
161 vo.setTimes(i + 1); 185 vo.setTimes(i + 1);
162 list.add(vo); 186 list.add(vo);
163 } 187 }
@@ -801,6 +825,18 @@ public abstract class AbstractFollowStrategy implements FollowStrategy { @@ -801,6 +825,18 @@ public abstract class AbstractFollowStrategy implements FollowStrategy {
801 followRecordService.updateById(record); 825 followRecordService.updateById(record);
802 } 826 }
803 827
  828 + protected void queryTimes(Long clueId, FollowDetailVO vo) {
  829 + List<FollowTask> list = followTaskService.list(Wrappers.<FollowTask>lambdaQuery()
  830 + .eq(FollowTask::getClueId, clueId)
  831 + );
  832 + if (CollectionUtils.isEmpty(list)) {
  833 + vo.setTimes(0);
  834 + return;
  835 + }
  836 + int sum = list.stream().filter(r -> Objects.nonNull(r.getTimes())).mapToInt(FollowTask::getTimes).sum();
  837 + vo.setTimes(sum);
  838 + }
  839 +
804 private void onStopClue(CustomerCluePool clue, TaskDefeatTypeEnum defeatTypeEnum) { 840 private void onStopClue(CustomerCluePool clue, TaskDefeatTypeEnum defeatTypeEnum) {
805 clue.setClueStatus(ClueStatusEnum.FAILURE); 841 clue.setClueStatus(ClueStatusEnum.FAILURE);
806 clue.setCloseTime(new Date()); 842 clue.setCloseTime(new Date());
@@ -844,6 +880,11 @@ public abstract class AbstractFollowStrategy implements FollowStrategy { @@ -844,6 +880,11 @@ public abstract class AbstractFollowStrategy implements FollowStrategy {
844 if (!TaskStateEnum.ONGOING.equals(task.getState())) { 880 if (!TaskStateEnum.ONGOING.equals(task.getState())) {
845 return true; 881 return true;
846 } 882 }
  883 + boolean isFwgw = FollowTypeEnum.FM.equals(task.getType()) || FollowTypeEnum.RM.equals(task.getType());
  884 + List<UserRoleDataRangeDTO> dataRange = userService.getUserRoleDataRange(task.getFollowUser(), isFwgw ? RoleCode.FWGW : RoleCode.XBGJ);
  885 + if (CollectionUtils.isEmpty(dataRange)) {
  886 + return true;
  887 + }
847 //任务截止日期 888 //任务截止日期
848 final Date deadline = task.getDeadline(); 889 final Date deadline = task.getDeadline();
849 Optional<SettingVO> fcsetting = settingBizService.querySettingByType(record.getType(), SettingTypeEnum.FOLLOW_CYCLE, record.getGroupId()); 890 Optional<SettingVO> fcsetting = settingBizService.querySettingByType(record.getType(), SettingTypeEnum.FOLLOW_CYCLE, record.getGroupId());
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/ACFollowStrategy.java
1 package cn.fw.valhalla.service.bus.follow.strategy.impl; 1 package cn.fw.valhalla.service.bus.follow.strategy.impl;
2 2
3 import cn.fw.common.exception.BusinessException; 3 import cn.fw.common.exception.BusinessException;
  4 +import cn.fw.common.util.ValidationUtils;
4 import cn.fw.valhalla.common.utils.DateUtil; 5 import cn.fw.valhalla.common.utils.DateUtil;
5 import cn.fw.valhalla.common.utils.MobileUtil; 6 import cn.fw.valhalla.common.utils.MobileUtil;
6 import cn.fw.valhalla.common.utils.StringUtils; 7 import cn.fw.valhalla.common.utils.StringUtils;
@@ -93,7 +94,7 @@ public class ACFollowStrategy extends AbstractFollowStrategy { @@ -93,7 +94,7 @@ public class ACFollowStrategy extends AbstractFollowStrategy {
93 ACDetailVO vo = assemble(followRecord.getCustomerId()); 94 ACDetailVO vo = assemble(followRecord.getCustomerId());
94 vo.setId(followRecord.getId()); 95 vo.setId(followRecord.getId());
95 vo.setTaskId(followRecord.getTaskId()); 96 vo.setTaskId(followRecord.getTaskId());
96 - vo.setHadCall(count > 0); 97 + vo.setHadCall(count > 0 || !ValidationUtils.checkMobile(vo.getReportMobile()));
97 vo.setDeadline(Objects.isNull(followRecord.getLimitTime()) ? followRecord.getDeadline() : followRecord.getLimitTime()); 98 vo.setDeadline(Objects.isNull(followRecord.getLimitTime()) ? followRecord.getDeadline() : followRecord.getLimitTime());
98 return vo; 99 return vo;
99 } 100 }
@@ -315,6 +316,8 @@ public class ACFollowStrategy extends AbstractFollowStrategy { @@ -315,6 +316,8 @@ public class ACFollowStrategy extends AbstractFollowStrategy {
315 vo.setCustomerId(customer.getId()); 316 vo.setCustomerId(customer.getId());
316 vo.setAdviserId(customerDetailDto.getAdviserId()); 317 vo.setAdviserId(customerDetailDto.getAdviserId());
317 vo.setAdviserName(customerDetailDto.getAdviserName()); 318 vo.setAdviserName(customerDetailDto.getAdviserName());
  319 + vo.setCusLevel(customerDetailDto.getCusLevel());
  320 + vo.setArrivalCount(customerDetailDto.getArrivalCount());
318 vo.setVin(customerDetailDto.getFrameNo()); 321 vo.setVin(customerDetailDto.getFrameNo());
319 Optional<InsuranceDTO> insuranceDTO = queryInsuInfo(customer.getId()); 322 Optional<InsuranceDTO> insuranceDTO = queryInsuInfo(customer.getId());
320 insuranceDTO.ifPresent(ins -> vo.setInsComName(ins.getTciInsurerName())); 323 insuranceDTO.ifPresent(ins -> vo.setInsComName(ins.getTciInsurerName()));
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/FMFollowStrategy.java
@@ -80,10 +80,10 @@ public class FMFollowStrategy extends AbstractFollowStrategy { @@ -80,10 +80,10 @@ public class FMFollowStrategy extends AbstractFollowStrategy {
80 vo.setId(followRecord.getId()); 80 vo.setId(followRecord.getId());
81 vo.setTaskId(followRecord.getTaskId()); 81 vo.setTaskId(followRecord.getTaskId());
82 vo.setFMExpiration(followTask.getDeadline()); 82 vo.setFMExpiration(followTask.getDeadline());
  83 + queryTimes(followTask.getClueId(), vo);
83 int count = followRecordLogService.count(Wrappers.<FollowRecordLog>lambdaQuery() 84 int count = followRecordLogService.count(Wrappers.<FollowRecordLog>lambdaQuery()
84 - .eq(FollowRecordLog::getRecordId, followRecord.getId()) 85 + .eq(FollowRecordLog::getTaskId, followRecord.getTaskId())
85 .eq(FollowRecordLog::getAttType, AttTypeEnum.SMART_PHONE) 86 .eq(FollowRecordLog::getAttType, AttTypeEnum.SMART_PHONE)
86 - .isNotNull(FollowRecordLog::getFeedbackType)  
87 ); 87 );
88 vo.setHadCall(count > 0); 88 vo.setHadCall(count > 0);
89 return vo; 89 return vo;
@@ -197,6 +197,8 @@ public class FMFollowStrategy extends AbstractFollowStrategy { @@ -197,6 +197,8 @@ public class FMFollowStrategy extends AbstractFollowStrategy {
197 vo.setAdviserName(customerDetailDto.getAdviserName()); 197 vo.setAdviserName(customerDetailDto.getAdviserName());
198 vo.setCarModel(customerDetailDto.getBrandName() + " " + customerDetailDto.getSeriesName()); 198 vo.setCarModel(customerDetailDto.getBrandName() + " " + customerDetailDto.getSeriesName());
199 vo.setBuyDate(customerDetailDto.getBuyDate()); 199 vo.setBuyDate(customerDetailDto.getBuyDate());
  200 + vo.setCusLevel(customerDetailDto.getCusLevel());
  201 + vo.setArrivalCount(customerDetailDto.getArrivalCount());
200 return vo; 202 return vo;
201 } 203 }
202 } 204 }
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/IRFollowStrategy.java
@@ -17,7 +17,6 @@ import cn.fw.valhalla.domain.enums.*; @@ -17,7 +17,6 @@ import cn.fw.valhalla.domain.enums.*;
17 import cn.fw.valhalla.domain.vo.follow.*; 17 import cn.fw.valhalla.domain.vo.follow.*;
18 import cn.fw.valhalla.domain.vo.setting.SettingVO; 18 import cn.fw.valhalla.domain.vo.setting.SettingVO;
19 import cn.fw.valhalla.rpc.angel.dto.InsuranceDTO; 19 import cn.fw.valhalla.rpc.angel.dto.InsuranceDTO;
20 -import cn.fw.valhalla.rpc.erp.dto.BackLogItemDTO;  
21 import cn.fw.valhalla.rpc.erp.dto.PostUserDTO; 20 import cn.fw.valhalla.rpc.erp.dto.PostUserDTO;
22 import cn.fw.valhalla.rpc.erp.dto.UserInfoDTO; 21 import cn.fw.valhalla.rpc.erp.dto.UserInfoDTO;
23 import cn.fw.valhalla.rpc.oop.dto.ShopDTO; 22 import cn.fw.valhalla.rpc.oop.dto.ShopDTO;
@@ -86,9 +85,12 @@ public class IRFollowStrategy extends AbstractFollowStrategy { @@ -86,9 +85,12 @@ public class IRFollowStrategy extends AbstractFollowStrategy {
86 public FollowDetailVO getDetail(Long id) { 85 public FollowDetailVO getDetail(Long id) {
87 FollowRecord followRecord = followRecordService.getById(id); 86 FollowRecord followRecord = followRecordService.getById(id);
88 BV.notNull(followRecord, "跟进记录不存在"); 87 BV.notNull(followRecord, "跟进记录不存在");
  88 + FollowTask followTask = followTaskService.getById(followRecord.getTaskId());
  89 + BV.notNull(followTask, "跟进信息不存在");
89 IRDetailVO vo = assemble(followRecord.getCustomerId()); 90 IRDetailVO vo = assemble(followRecord.getCustomerId());
  91 + queryTimes(followTask.getClueId(), vo);
90 int count = followRecordLogService.count(Wrappers.<FollowRecordLog>lambdaQuery() 92 int count = followRecordLogService.count(Wrappers.<FollowRecordLog>lambdaQuery()
91 - .eq(FollowRecordLog::getRecordId, followRecord.getId()) 93 + .eq(FollowRecordLog::getTaskId, followRecord.getTaskId())
92 .eq(FollowRecordLog::getAttType, AttTypeEnum.SMART_PHONE) 94 .eq(FollowRecordLog::getAttType, AttTypeEnum.SMART_PHONE)
93 ); 95 );
94 vo.setHadCall(count > 0); 96 vo.setHadCall(count > 0);
@@ -424,6 +426,8 @@ public class IRFollowStrategy extends AbstractFollowStrategy { @@ -424,6 +426,8 @@ public class IRFollowStrategy extends AbstractFollowStrategy {
424 vo.setExpires(detailDto.getExpires()); 426 vo.setExpires(detailDto.getExpires());
425 vo.setPeriods(detailDto.getPeriods()); 427 vo.setPeriods(detailDto.getPeriods());
426 vo.setLoanCustomer(detailDto.isLoanCustomer()); 428 vo.setLoanCustomer(detailDto.isLoanCustomer());
  429 + vo.setCusLevel(detailDto.getCusLevel());
  430 + vo.setArrivalCount(detailDto.getArrivalCount());
427 Optional<InsuranceDTO> insuranceDTO = queryInsuInfo(customerId); 431 Optional<InsuranceDTO> insuranceDTO = queryInsuInfo(customerId);
428 insuranceDTO.ifPresent(ins -> { 432 insuranceDTO.ifPresent(ins -> {
429 vo.setTclInsComName(ins.getTciInsurerName()); 433 vo.setTclInsComName(ins.getTciInsurerName());
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/RMFollowStrategy.java
@@ -103,15 +103,18 @@ public class RMFollowStrategy extends AbstractFollowStrategy { @@ -103,15 +103,18 @@ public class RMFollowStrategy extends AbstractFollowStrategy {
103 public FollowDetailVO getDetail(Long id) { 103 public FollowDetailVO getDetail(Long id) {
104 FollowRecord followRecord = followRecordService.getById(id); 104 FollowRecord followRecord = followRecordService.getById(id);
105 BV.notNull(followRecord, "跟进记录不存在"); 105 BV.notNull(followRecord, "跟进记录不存在");
  106 + FollowTask followTask = followTaskService.getById(followRecord.getTaskId());
  107 + BV.notNull(followTask, "跟进信息不存在");
106 RMDetailVO vo = assemble(followRecord.getCustomerId()); 108 RMDetailVO vo = assemble(followRecord.getCustomerId());
107 int count = followRecordLogService.count(Wrappers.<FollowRecordLog>lambdaQuery() 109 int count = followRecordLogService.count(Wrappers.<FollowRecordLog>lambdaQuery()
108 - .eq(FollowRecordLog::getRecordId, followRecord.getId())  
109 .eq(FollowRecordLog::getAttType, AttTypeEnum.SMART_PHONE) 110 .eq(FollowRecordLog::getAttType, AttTypeEnum.SMART_PHONE)
  111 + .eq(FollowRecordLog::getTaskId, followRecord.getTaskId())
110 ); 112 );
111 vo.setHadCall(count > 0); 113 vo.setHadCall(count > 0);
112 vo.setId(followRecord.getId()); 114 vo.setId(followRecord.getId());
113 vo.setTaskId(followRecord.getTaskId()); 115 vo.setTaskId(followRecord.getTaskId());
114 vo.setDeadline(followRecord.getDeadline()); 116 vo.setDeadline(followRecord.getDeadline());
  117 + queryTimes(followTask.getClueId(), vo);
115 return vo; 118 return vo;
116 } 119 }
117 120
@@ -260,6 +263,8 @@ public class RMFollowStrategy extends AbstractFollowStrategy { @@ -260,6 +263,8 @@ public class RMFollowStrategy extends AbstractFollowStrategy {
260 vo.setAdviserName(customerDetailDto.getAdviserName()); 263 vo.setAdviserName(customerDetailDto.getAdviserName());
261 vo.setCarModel(customerDetailDto.getBrandName() + " " + customerDetailDto.getSeriesName()); 264 vo.setCarModel(customerDetailDto.getBrandName() + " " + customerDetailDto.getSeriesName());
262 vo.setLastMileage(customerDetailDto.getCurrentMileage()); 265 vo.setLastMileage(customerDetailDto.getCurrentMileage());
  266 + vo.setCusLevel(customerDetailDto.getCusLevel());
  267 + vo.setArrivalCount(customerDetailDto.getArrivalCount());
263 OriginalData originalData = originalDataService.getOne(Wrappers.<OriginalData>lambdaQuery() 268 OriginalData originalData = originalDataService.getOne(Wrappers.<OriginalData>lambdaQuery()
264 .eq(OriginalData::getCustomerId, customerId) 269 .eq(OriginalData::getCustomerId, customerId)
265 .eq(OriginalData::getType, DataTypeEnum.FS) 270 .eq(OriginalData::getType, DataTypeEnum.FS)
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/data/SecretReportHistoryService.java 0 → 100644
  1 +package cn.fw.valhalla.service.data;
  2 +
  3 +import cn.fw.valhalla.domain.db.SecretReportHistory;
  4 +import cn.fw.valhalla.domain.dto.SecretReportHistoryDTO;
  5 +import cn.fw.valhalla.domain.query.SecretReportHistoryQuery;
  6 +import com.baomidou.mybatisplus.extension.service.IService;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * @author : kurisu
  12 + * @className : SecretReportHistoryService
  13 + * @description : 通话记录
  14 + * @date: 2021-02-21 14:58
  15 + */
  16 +public interface SecretReportHistoryService extends IService<SecretReportHistory> {
  17 + /**
  18 + * 通话记录池
  19 + * @param query
  20 + * @return
  21 + */
  22 + List<SecretReportHistoryDTO> secretReportList(SecretReportHistoryQuery query);
  23 +
  24 + /**
  25 + * 查询总数
  26 + * @param query
  27 + * @return
  28 + */
  29 + Long secretReportCount(SecretReportHistoryQuery query);
  30 +}
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/data/impl/FollowRecordServiceImpl.java
@@ -44,6 +44,7 @@ public class FollowRecordServiceImpl extends ServiceImpl&lt;FollowRecordMapper, Fol @@ -44,6 +44,7 @@ public class FollowRecordServiceImpl extends ServiceImpl&lt;FollowRecordMapper, Fol
44 public List<FollowRecord> getRecordList(final Long taskId) { 44 public List<FollowRecord> getRecordList(final Long taskId) {
45 return this.list(Wrappers.<FollowRecord>lambdaQuery() 45 return this.list(Wrappers.<FollowRecord>lambdaQuery()
46 .eq(FollowRecord::getTaskId, taskId) 46 .eq(FollowRecord::getTaskId, taskId)
  47 + .eq(FollowRecord::getAddTodo, Boolean.TRUE)
47 .orderByAsc(FollowRecord::getId) 48 .orderByAsc(FollowRecord::getId)
48 ); 49 );
49 } 50 }
@@ -72,7 +73,7 @@ public class FollowRecordServiceImpl extends ServiceImpl&lt;FollowRecordMapper, Fol @@ -72,7 +73,7 @@ public class FollowRecordServiceImpl extends ServiceImpl&lt;FollowRecordMapper, Fol
72 public boolean removeByTaskId(Long taskId) { 73 public boolean removeByTaskId(Long taskId) {
73 return this.remove(Wrappers.<FollowRecord>lambdaQuery() 74 return this.remove(Wrappers.<FollowRecord>lambdaQuery()
74 .eq(FollowRecord::getTaskId, taskId) 75 .eq(FollowRecord::getTaskId, taskId)
75 - .eq(FollowRecord::getOutTime, Boolean.FALSE) 76 + .eq(FollowRecord::getAddTodo, Boolean.FALSE)
76 .isNull(FollowRecord::getFollowTime) 77 .isNull(FollowRecord::getFollowTime)
77 ); 78 );
78 } 79 }
fw-valhalla-service/src/main/java/cn/fw/valhalla/service/data/impl/SecretReportHistoryServiceImpl.java 0 → 100644
  1 +package cn.fw.valhalla.service.data.impl;
  2 +
  3 +import cn.fw.valhalla.dao.mapper.SecretReportHistoryMapper;
  4 +import cn.fw.valhalla.domain.db.SecretReportHistory;
  5 +import cn.fw.valhalla.domain.dto.SecretReportHistoryDTO;
  6 +import cn.fw.valhalla.domain.query.SecretReportHistoryQuery;
  7 +import cn.fw.valhalla.service.data.SecretReportHistoryService;
  8 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9 +import lombok.extern.slf4j.Slf4j;
  10 +import org.springframework.stereotype.Service;
  11 +
  12 +import java.util.ArrayList;
  13 +import java.util.List;
  14 +import java.util.Optional;
  15 +
  16 +/**
  17 + * @author : kurisu
  18 + * @className : SecretReportHistoryServiceImpl
  19 + * @description : 通话记录
  20 + * @date: 2021-02-21 14:58
  21 + */
  22 +@Slf4j
  23 +@Service
  24 +public class SecretReportHistoryServiceImpl extends ServiceImpl<SecretReportHistoryMapper, SecretReportHistory> implements SecretReportHistoryService {
  25 + @Override
  26 + public List<SecretReportHistoryDTO> secretReportList(SecretReportHistoryQuery queryVO) {
  27 + Integer current = queryVO.getCurrent();
  28 + Integer pageSize = queryVO.getPageSize();
  29 + Integer startIndex = (current - 1) * pageSize;
  30 + return Optional.ofNullable(getBaseMapper().secretReportList(startIndex, pageSize, queryVO)).orElse(new ArrayList<>());
  31 + }
  32 +
  33 + @Override
  34 + public Long secretReportCount(SecretReportHistoryQuery query) {
  35 + return Optional.ofNullable(getBaseMapper().secretReportCount(query)).orElse(0L);
  36 + }
  37 +}
@@ -114,7 +114,7 @@ @@ -114,7 +114,7 @@
114 <dependency> 114 <dependency>
115 <groupId>cn.fw</groupId> 115 <groupId>cn.fw</groupId>
116 <artifactId>fw-valhalla-sdk</artifactId> 116 <artifactId>fw-valhalla-sdk</artifactId>
117 - <version>1.1.1</version> 117 + <version>1.1.3</version>
118 </dependency> 118 </dependency>
119 <dependency> 119 <dependency>
120 <groupId>cn.fw</groupId> 120 <groupId>cn.fw</groupId>