拓客线索和crm分库

master
wujingtao 2 years ago
parent 9081c7e2a4
commit a714cd1aef

@ -73,6 +73,4 @@ public class ClueQueryCriteria {
private String nid;
private Integer clueType;
private List<Integer> clueTypes;
}

@ -82,11 +82,11 @@ public class BaseClueMiddle implements Serializable {
@ApiModelProperty(value = "是否移入到公海")
@Column(name = "public_pool_status")
private Integer publicPoolStatus;
private Integer publicPoolStatus = 0;
@ApiModelProperty(value = "成交金额")
@Column(name = "turnover_amount")
private Double turnoverAmount;
private Double turnoverAmount = 0.00;
@ApiModelProperty(value = "线索来源 1-表单推送 2-个人上传 3-抖音 4-投流 5-拓客 6-拓客回流 7-投流回流")
@Column(name = "clue_type")

@ -578,7 +578,6 @@ public class QueryReportServiceImpl implements QueryReportService {
int turnOnNum = 0;
int validNum = 0;
//查询线索的所有通话记录 (7天内7天外的录音会被迁移无法下载)
// List<AllCallInfo> allByClueId = allCallInfoRepository.findAllByClueId(clueId);
String beginOfDay = DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.date(), -7)).toString();
String endOfDay = DateUtil.date().toString();
List<AllCallInfo> allByClueId = allCallInfoRepository.queryAllByTime(beginOfDay, endOfDay, clueId);

@ -42,6 +42,7 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
/**
*
*
* @param userId
* @return
*/
@ -50,6 +51,16 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
/**
* ID
* @param taskIds
* @return
*/
Set<Task> findByIdIn(Set<Long> taskIds);
/**
*
*
* @param userId
* @param isForm
* @return
*/
List<Task> findByCreateByAndIsForm(Long userId, Integer isForm);
}

@ -31,7 +31,7 @@ public class LabelOrganizeController {
@ApiOperation("新增标签组和标签")
@PostMapping("/add")
public CommonResponse<Object> save(@Validated({AddGroup.class}) @RequestBody LabelOrganize labelOrganize){
public CommonResponse<Object> save(@Validated({AddGroup.class}) @RequestBody LabelOrganize labelOrganize) {
labelOrganizeService.save(labelOrganize);
return CommonResponse.createBySuccess();
}
@ -52,13 +52,13 @@ public class LabelOrganizeController {
@ApiOperation("查询标签组列表")
@GetMapping("/query")
public ResponseEntity<Object> query(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria){
public ResponseEntity<Object> query(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria) {
return new ResponseEntity<>(labelOrganizeService.query(labelOrganizeQueryCriteria), HttpStatus.OK);
}
@ApiOperation("查询标签组列表(分页,返回数据中插入了组中标签信息)")
@GetMapping("/queryAll")
public ResponseEntity<Object> queryAll(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria, Pageable pageable){
return new ResponseEntity<>(labelOrganizeService.queryAll(labelOrganizeQueryCriteria, pageable),HttpStatus.OK);
public ResponseEntity<Object> queryAll(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria, Pageable pageable) {
return new ResponseEntity<>(labelOrganizeService.queryAll(labelOrganizeQueryCriteria, pageable), HttpStatus.OK);
}
}

@ -13,24 +13,28 @@ public interface LabelOrganizeService {
/**
*
*
* @param labelOrganize
*/
void save(LabelOrganize labelOrganize);
/**
*
*
* @param labelOrganize
*/
void update(LabelOrganize labelOrganize);
/**
*
*
* @param ids
*/
void del(Set<Long> ids);
/**
*
*
* @param labelOrganizeQueryCriteria
* @return
*/
@ -38,6 +42,7 @@ public interface LabelOrganizeService {
/**
* (,)
*
* @param labelOrganizeQueryCriteria
* @param pageable
* @return
@ -46,8 +51,16 @@ public interface LabelOrganizeService {
/**
* IDID
*
* @param labelOrganizeIds
* @return
*/
Map<Long, List<Label>> organizeIdGroup(Set<Long> labelOrganizeIds);
/**
*
* @param userId
* @return
*/
Long saveDefault(Long userId);
}

@ -42,7 +42,7 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
LabelOrganize saveLabelOrganize = labelOrganizeRepository.save(labelOrganize);
Long saveLabelOrganizeId = saveLabelOrganize.getId();
List<Label> labelList = labelOrganize.getLabelList();
if (CollUtil.isNotEmpty(labelList)){
if (CollUtil.isNotEmpty(labelList)) {
for (Label label : labelList) {
label.setUserId(currentUserId);
label.setLabelOrganizeId(saveLabelOrganizeId);
@ -60,27 +60,27 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
List<Label> labelList = labelOrganize.getLabelList();
Long currentUserId = SecurityUtils.getCurrentUserId();
//1、删除标签信息
if (CollUtil.isNotEmpty(delLabelIds)){
if (CollUtil.isNotEmpty(delLabelIds)) {
labelRepository.deleteAllByIdIn(delLabelIds);
}
//2、查询并修改标签组信息
LabelOrganize updateLabelOrganize = labelOrganizeRepository.findById(organizeId).orElseGet(LabelOrganize::new);
if (StringUtils.isNotBlank(name)){
if (StringUtils.isNotBlank(name)) {
updateLabelOrganize.setName(name);
}
labelOrganizeRepository.save(updateLabelOrganize);
//3、是否有新增标签
if (CollUtil.isNotEmpty(labelList)){
if (CollUtil.isNotEmpty(labelList)) {
List<Label> list = new ArrayList<>();
for (Label label : labelList) {
String labelName = label.getLabelName();
if (label.getId() == null && StringUtils.isNotBlank(labelName)){
if (label.getId() == null && StringUtils.isNotBlank(labelName)) {
label.setUserId(currentUserId);
label.setLabelOrganizeId(organizeId);
list.add(label);
}
}
if (CollUtil.isNotEmpty(list)){
if (CollUtil.isNotEmpty(list)) {
labelRepository.saveAll(list);
}
}
@ -89,7 +89,7 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
@Override
@Transactional(rollbackOn = Exception.class)
public void del(Set<Long> ids) {
if (CollUtil.isNotEmpty(ids)){
if (CollUtil.isNotEmpty(ids)) {
//1、删除组信息
labelOrganizeRepository.deleteAllByIdIn(ids);
//2、删除标签信息
@ -121,7 +121,7 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
for (LabelOrganizeDto labelOrganizeDto : map) {
Long id = labelOrganizeDto.getId();
//6、取出组ID相同的标签集合并set值
if (collect.containsKey(id)){
if (collect.containsKey(id)) {
labelOrganizeDto.setLabelList(collect.get(id));
}
}
@ -130,14 +130,45 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
/**
* IDID
*
* @param labelOrganizeIds
* @return
*/
public Map<Long, List<Label>> organizeIdGroup(Set<Long> labelOrganizeIds){
if (CollUtil.isNotEmpty(labelOrganizeIds)){
@Override
public Map<Long, List<Label>> organizeIdGroup(Set<Long> labelOrganizeIds) {
if (CollUtil.isNotEmpty(labelOrganizeIds)) {
Set<Label> labels = labelRepository.findByLabelOrganizeIdIn(labelOrganizeIds);
return labels.stream().collect(Collectors.groupingBy(Label::getLabelOrganizeId));
}
return new HashMap<>();
}
/**
*
*/
@Override
public Long saveDefault(Long userId) {
LabelOrganize labelOrganize = new LabelOrganize();
labelOrganize.setCreateBy(userId);
labelOrganize.setName("默认标签");
LabelOrganize saveLabelOrganize = labelOrganizeRepository.save(labelOrganize);
Long saveLabelOrganizeId = saveLabelOrganize.getId();
List<Label> labelList = new ArrayList<>();
Label label = new Label();
label.setLabelName("男");
label.setUserId(userId);
label.setLabelOrganizeId(saveLabelOrganizeId);
Label label1 = new Label();
label1.setLabelName("女");
label.setUserId(userId);
label.setLabelOrganizeId(saveLabelOrganizeId);
labelList.add(label);
labelList.add(label1);
labelRepository.saveAll(labelList);
return saveLabelOrganizeId;
}
}

@ -267,12 +267,13 @@ public class TaskServiceImpl implements TaskService {
//查询所有标签
Set<Long> labelOrganizeIds = taskDtoMap.stream().map(TaskDto::getLabelOrganizeId).collect(Collectors.toSet());
Map<Long, List<Label>> collect = labelOrganizeService.organizeIdGroup(labelOrganizeIds);
Map<Long, Integer> taskIdCount = new HashMap<>();
Map<Long, Integer> taskIdCount = new HashMap<>(8);
//未分配数
if (taskDtoMap.getTotalPages() > 0) {
ClueQueryCriteria clueQueryCriteria = new ClueQueryCriteria();
clueQueryCriteria.setTaskIds(taskDtoMap.stream().map(TaskDto::getId).collect(Collectors.toSet()));
clueQueryCriteria.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueQueryCriteria.setClueType(taskQueryCriteria.getIsForm());
taskIdCount = sourceClueClient.countClueByMemberStatus(clueQueryCriteria).getData();
}

@ -93,6 +93,7 @@ public class UserServiceImpl implements UserService {
private final TaskRepository taskRepository;
private final CallDeductService callDeductService;
private final LabelOrganizeService labelOrganizeService;
@Override
@Transactional(rollbackFor = Exception.class)
@ -218,15 +219,17 @@ public class UserServiceImpl implements UserService {
//todo 如果是管理员 则创建任务
if (flag) {
//todo 新建标签组
Long labelOrganizeId = labelOrganizeService.saveDefault(userCreateResult.getId());
if (userDTO.getCompanyType() == 1) {
//抖音(飞鱼)
createTask(userCreateResult.getId(), "抖音任务", DefaultNumberConstants.THREE_NUMBER);
createTask(userCreateResult.getId(), "抖音任务", DefaultNumberConstants.THREE_NUMBER, labelOrganizeId);
}
//公司名称做的对应,所以将公司名设为表单任务名
createTask(userCreateResult.getId(), userCreateResult.getUsername(), DefaultNumberConstants.ONE_NUMBER);
createTask(userCreateResult.getId(), "员工上传任务", DefaultNumberConstants.TWO_NUMBER);
createTask(userCreateResult.getId(), "投流回流任务", DefaultNumberConstants.SEVEN_NUMBER);
createTask(userCreateResult.getId(), "拓客回流任务", DefaultNumberConstants.SIX_NUMBER);
createTask(userCreateResult.getId(), userCreateResult.getUsername(), DefaultNumberConstants.ONE_NUMBER, labelOrganizeId);
createTask(userCreateResult.getId(), "员工上传任务", DefaultNumberConstants.TWO_NUMBER, labelOrganizeId);
createTask(userCreateResult.getId(), "拓客模块-投流回流池", DefaultNumberConstants.SEVEN_NUMBER, labelOrganizeId);
createTask(userCreateResult.getId(), "拓客模块-拓客回流池", DefaultNumberConstants.SIX_NUMBER, labelOrganizeId);
}
MultipartFile file = userDTO.getFile();
@ -247,7 +250,7 @@ public class UserServiceImpl implements UserService {
*
* @param username
*/
private void createTask(Long id, String username, Integer isForm) {
private void createTask(Long id, String username, Integer isForm, Long labelOrganizeId) {
Long taskId = IdUtil.getSnowflake(9, 9).nextId();
Task task = new Task();
task.setId(taskId);
@ -263,6 +266,7 @@ public class UserServiceImpl implements UserService {
task.setIsForm(isForm);
task.setCreateBy(id);
task.setLabelOrganizeId(null);
task.setLabelOrganizeId(labelOrganizeId);
taskRepository.save(task);
}
@ -461,6 +465,13 @@ public class UserServiceImpl implements UserService {
}
if (ObjectUtil.isNotNull(resources.getCompanyType())) {
companyService.updateCompanyTypeById(resources.getCompanyType(), user.getCompanyId());
if (resources.getCompanyType() == DefaultNumberConstants.ONE_NUMBER) {
//抖音授权
List<Task> tasks = taskRepository.findByCreateByAndIsForm(user.getId(), DefaultNumberConstants.THREE_NUMBER);
if (CollUtil.isEmpty(tasks)) {
createTask(user.getId(), "抖音任务", DefaultNumberConstants.THREE_NUMBER, null);
}
}
}
user.setIsReview(resources.getIsReview());

@ -127,21 +127,20 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
String sessionId = doubleCallBackStatus.getSessionId();
long userDate = Long.parseLong(doubleCallBackStatus.getUserData());
String flag = Objects.requireNonNull(CallStatusEnum.find(doubleCallBackStatus.getStatus())).getDescription();
AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(sessionId);
if (CallStatusEnum.ANSWER.getDescription().equals(flag)) {
int status = CallStatusEnum.ANSWER.getValue();
callClueRepository.updateByStatus(status, userDate);
// allCallInfoRepository.updateByStatus(status, sessionId);
AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(sessionId);
allCallInfo.setStatus(status);
allCallInfoRepository.save(allCallInfo);
//实时扣费
callCostCount(allCallInfo.getMemberId(), allCallInfo.getClueId(), allCallInfo.getClueType(), allCallInfo.getDuration(), DefaultNumberConstants.TWO_NUMBER);
//更新资源通话状态
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER));
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueType()));
} else {
//更新资源通话状态
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER));
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType()));
}
}
@ -300,12 +299,12 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
callClueRepository.updateByStatus(DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueId());
allCallInfoRepository.updateByDurationAndStatus(DefaultNumberConstants.TWO_NUMBER, Integer.valueOf(rollCallBackDTO.getDuration()), allCallInfo.getId());
//更新资源通话状态
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.TWO_NUMBER));
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueType()));
//TODO 实时扣除话费
callCostCount(allCallInfo.getMemberId(), allCallInfo.getClueId(), allCallInfo.getClueType(), Integer.valueOf(rollCallBackDTO.getDuration()), 2);
} else {
//更新资源通话状态
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER));
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType()));
}
}
}
@ -317,12 +316,13 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
* @param clueId ID
* @param status 1 2
*/
private void updateSourceCallStatus(Long clueId, Integer status) {
private void updateSourceCallStatus(Long clueId, Integer status, Integer clueType) {
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(clueId);
clueMiddle.setClueCallStatus(status);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.THREE_NUMBER);
clueMiddle.setNewestCallTime(new Date());
clueMiddle.setClueType(clueType);
sourceClueClient.update(clueMiddle);
}

@ -151,8 +151,8 @@ public class ClueController {
@ApiOperation("撤回动态资源")
@PostMapping("/withdrawSource")
public ResponseEntity<Object> withdrawSource(@RequestBody List<Long> clueIds) {
return new ResponseEntity<>(clueService.withdrawSource(clueIds), HttpStatus.OK);
public ResponseEntity<Object> withdrawSource(@RequestBody ClueQueryCriteria clueQueryCriteria) {
return new ResponseEntity<>(clueService.withdrawSource(clueQueryCriteria), HttpStatus.OK);
}
@ApiOperation("查询管理员下(本公司内)所有资源,资源公海")
@ -183,12 +183,6 @@ public class ClueController {
return CommonResponse.createBySuccess(clueService.countClueByTaskId(taskId, beginTime, endTime));
}
/**
*
*
* @param dynamicTaskDto
* @return
*/
@PostMapping("/dynamic/task")
@ApiOperation("表单上传动态任务")
public CommonResponse<Object> insertDynamicTask(@Validated @RequestBody DynamicTaskDto dynamicTaskDto) {
@ -215,13 +209,11 @@ public class ClueController {
return CommonResponse.createBySuccess(clueService.countClueByMemberStatus(clueQueryCriteria));
}
@GetMapping("/backFlow")
@ApiOperation("拓客线索回流crm")
public CommonResponse<Object> clueBackFlow(@RequestParam(value = "taskId") Long taskId,
@RequestParam(value = "clueId") Long clueId,
@RequestParam(value = "userId") Long userId,
@RequestParam(value = "clueType") Integer clueType) {
clueService.clueBackFlow(taskId, clueId, userId, clueType);
return CommonResponse.createBySuccess();
}
// @GetMapping("/backFlow")
// @ApiOperation("拓客线索回流crm")
// public CommonResponse<Object> clueBackFlow(@RequestParam(value = "clueId") Long clueId,
// @RequestParam(value = "clueType") Integer clueType) {
// clueService.clueBackFlow(clueId, clueType);
// return CommonResponse.createBySuccess();
// }
}

@ -53,7 +53,7 @@ public class ClueJpa {
/**
* null
* crm线null
*/
public List<ClueDto> getClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
StringBuilder sql = new StringBuilder();
@ -66,13 +66,40 @@ public class ClueJpa {
return getTradeInfo(confirmReceipt, clueQueryCriteria.getClueType());
}
/**
* 线null
*/
public List<ClueDto> getTalkClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
StringBuilder sql = new StringBuilder();
sql.append("select c.id as id,c.name as name,c.nid as nid,c.wx as wx,c.origin as origin,c.collect_time as collectTime,c.address as address,c.record_id as recordId," +
"c.create_time as createTime,c.amount as amount,c.platform as platform,c.tag as tag,c.audio_url as audioUrl,c.cast_info as castInfo,c.is_encryption as isEncryption, cm.remark as remark,cm.member_status as memberStatus,cm.organize_id as organizeId,cm.member_id as memberId," +
"cm.optimistic_version as optimisticVersion,cm.source_label as sourceLabel,cm.task_id as taskId,cm.clue_stage as clueStage,cm.clue_call_status as clueCallStatus," +
"cm.newest_call_time as newestCallTime ,cm.turnover_amount as turnoverAmount ,cm.clue_type as clueType " +
"from tb_clue as c LEFT JOIN tb_clue_talk as cm on c.id = cm.clue_id where 1=1 ");
List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, pageable);
return getTradeInfo(confirmReceipt, clueQueryCriteria.getClueType());
}
/**
*
*/
public Long getCount(ClueQueryCriteria clueQueryCriteria) {
StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 ");
return executeSql(clueQueryCriteria, sql);
}
/**
*
*/
public Long getTalkCount(ClueQueryCriteria clueQueryCriteria) {
StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_talk as cm on c.id = cm.clue_id where 1=1 ");
return executeSql(clueQueryCriteria, sql);
}
private Long executeSql(ClueQueryCriteria clueQueryCriteria, StringBuilder sql) {
List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, null);
Long count = 0L;
long count = 0L;
for (Object obj : confirmReceipt) {
Map row = (Map) obj;
BigInteger countBig = (BigInteger) row.get("countNum");
@ -117,7 +144,7 @@ public class ClueJpa {
if (clueQueryCriteria.getMemberStatus() != null) {
sql.append("and cm.member_status = :memberStatus ");
}
if (clueQueryCriteria.getLabel() != null) {
if (StrUtil.isNotEmpty(clueQueryCriteria.getLabel())) {
sql.append("and cm.source_label like :sourceLabel ");
}
if (clueQueryCriteria.getClueCallStatus() != null) {
@ -131,8 +158,9 @@ public class ClueJpa {
}
if (clueType != null) {
sql.append("AND cm.clue_type = :clueType ");
} else {
sql.append("AND cm.clue_type in :clueTypes ");
}
if (CollUtil.isNotEmpty(clueQueryCriteria.getTaskIds())) {
sql.append("and cm.task_id in :taskIds ");
}
//拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格)
sql.append("ORDER BY c.create_time desc ,c.id ");
@ -166,7 +194,7 @@ public class ClueJpa {
if (clueQueryCriteria.getClueStage() != null) {
query.setParameter("clueStage", clueQueryCriteria.getClueStage());
}
if (clueQueryCriteria.getLabel() != null) {
if (StrUtil.isNotEmpty(clueQueryCriteria.getLabel())) {
query.setParameter("sourceLabel", "%" + clueQueryCriteria.getLabel() + "%");
}
if (clueQueryCriteria.getClueCallStatus() != null) {
@ -184,8 +212,9 @@ public class ClueJpa {
}
if (clueType != null) {
query.setParameter("clueType", clueType);
} else {
query.setParameter("clueTypes", clueQueryCriteria.getClueTypes());
}
if (CollUtil.isNotEmpty(clueQueryCriteria.getTaskIds())) {
query.setParameter("taskIds", clueQueryCriteria.getTaskIds());
}
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.getResultList();
@ -327,9 +356,16 @@ public class ClueJpa {
Integer clueCallStatus = clueQueryCriteria.getClueCallStatus();
StringBuilder sql = new StringBuilder();
sql.append("SELECT tc.id as id,tc.nid as nid,tc.audio_url as audioUrl,tc.create_time as createTime,tc.name as name,tc.origin as origin,tc.cast_info as castInfo, tc.is_encryption as isEncryption, tcm.task_id as taskId,tcm.member_status as memberStatus," +
"tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel ,tcm.turnover_amount as turnoverAmount " +
"FROM tb_clue_middle tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
if (clueType == null) {
sql.append("SELECT tc.id as id,tc.nid as nid,tc.audio_url as audioUrl,tc.create_time as createTime,tc.name as name,tc.origin as origin,tc.cast_info as castInfo, tc.is_encryption as isEncryption, tcm.task_id as taskId,tcm.member_status as memberStatus," +
"tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel ,tcm.turnover_amount as turnoverAmount " +
"FROM tb_clue_middle tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
} else {
sql.append("SELECT tc.id as id,tc.nid as nid,tc.audio_url as audioUrl,tc.create_time as createTime,tc.name as name,tc.origin as origin,tc.cast_info as castInfo, tc.is_encryption as isEncryption, tcm.task_id as taskId,tcm.member_status as memberStatus," +
"tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel ,tcm.turnover_amount as turnoverAmount " +
"FROM tb_clue_talk tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
}
if (CollUtil.isNotEmpty(taskIds)) {
sql.append("AND tcm.task_id IN (:taskId) ");
}
@ -358,8 +394,6 @@ public class ClueJpa {
}
if (clueType != null) {
sql.append("AND tcm.clue_type = :clueType ");
} else {
sql.append("AND tcm.clue_type in :clueTypes ");
}
if (clueCallStatus != null) {
sql.append("AND tcm.clue_call_status = :clueCallStatus ");
@ -393,8 +427,6 @@ public class ClueJpa {
}
if (clueType != null) {
query.setParameter("clueType", clueType);
} else {
query.setParameter("clueTypes", clueQueryCriteria.getClueTypes());
}
if (clueCallStatus != null) {
query.setParameter("clueCallStatus", clueCallStatus);

@ -1,6 +1,5 @@
package com.baiye.module.dao;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueMiddle;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@ -201,18 +200,9 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
@Query(value = "select d.task_id from tb_clue_middle d where d.member_status = ?1 and d.task_id in ?2", nativeQuery = true)
List<Long> selectClueMiddleByMember(Integer memberStatus, Set<Long> taskIds);
/**
* 线线
*
* @param startTime
* @param endTime
* @param clueType 线
* @return
*/
@Query(value = " select * from tb_clue_middle as t where t.label_time >= ?1 and t.label_time< ?2 and t.clue_type in ?3", nativeQuery = true)
List<ClueMiddle> queryClueByClueType(String startTime, String endTime, List<Integer> clueType);
List<ClueMiddle> findByTaskIdAndMemberStatus(Long taskId, int memberStatus);
@Query(value = "select clue_id from tb_clue_middle where task_id = ?1 and member_status =?2", nativeQuery = true)
List<Long> findByTaskIdAndMemberStatus(Long taskId, int memberStatus);
/**
* 线

@ -0,0 +1,70 @@
package com.baiye.module.dao;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.ClueTalk;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Set;
/**
* @author jt
*/
@Repository
public interface ClueTalkRepository extends JpaRepository<ClueTalk, Long>, JpaSpecificationExecutor<ClueTalk> {
/**
* 线
*
* @param startTime
* @param endTime
* @return
*/
@Query(value = " select * from tb_clue_talk where label_time between ?1 and ?2", nativeQuery = true)
List<ClueTalk> queryClueByLabelTime(String startTime, String endTime);
/**
* 线
*
* @param startTime
* @param endTime
* @param taskIds
* @param memberId
* @return
*/
@Query(value = " select * from tb_clue_talk where (label_time between ?1 and ?2) and task_id in ?3 and (coalesce (?4,null) is null or member_id = ?4)", nativeQuery = true)
List<ClueTalk> queryClueByLabelTimeAndTaskIds(String startTime, String endTime, List<Long> taskIds,Long memberId);
/**
* 线
*
* @param userId
* @return
*/
@Query(value = " select tcm.* from tb_clue_talk as tcm left join tb_clue as tc on tcm.clue_id =tc.id" +
" where tc.create_by = ?1", nativeQuery = true)
List<ClueTalk> findClueTalkByCreateBy(Long userId);
/**
*
*
* @param taskId
* @return
*/
@Query(value = "select count(*) from tb_clue_talk where task_id = ?1", nativeQuery = true)
Integer findTaskNum(Long taskId);
@Query(value = "select clue_id from tb_clue_talk where task_id = ?1 and member_status =?2", nativeQuery = true)
List<Long> findByTaskIdAndMemberStatus(Long taskId, int memberStatus);
@Modifying
@Query(value = " update tb_clue_talk set member_id = ?2, member_status = 1 where clue_id in ?1 ", nativeQuery = true)
void updateMemberIdByClueIdIn(List<Long> clueIdList, Long userId);
@Query(value = "select d.task_id from tb_clue_talk d where d.member_status = ?1 and d.task_id in ?2", nativeQuery = true)
List<Long> selectClueTalkByMember(Integer memberStatus, Set<Long> taskIds);
}

@ -0,0 +1,29 @@
package com.baiye.module.entity;
import com.baiye.model.entity.BaseClueMiddle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
/**
* @author jt
*/
@Data
@Entity
@Table(name = "tb_clue_talk")
@ApiModel(value = "ClueTalk")
public class ClueTalk extends BaseClueMiddle {
@Id
@ApiModelProperty(value = "线索id")
@Column(name = "clue_id")
@NotNull(message = "资源id不能为空")
private Long clueId;
@Transient
private String clueName;
@Transient
private String memberName;
}

@ -175,10 +175,10 @@ public interface ClueService {
/**
* ,
*
* @param clueIds
* @param clueQueryCriteria
* @return
*/
Object withdrawSource(List<Long> clueIds);
Object withdrawSource(ClueQueryCriteria clueQueryCriteria);
/**
* (),
@ -267,17 +267,16 @@ public interface ClueService {
*/
void saveClue(List<String> tagList, List<String> phoneList, Long taskId, Long userId, Integer num);
/**
* 线crm
*
* @param taskId
* @param clueId
* @param clueType
*/
void clueBackFlow(Long taskId, Long clueId, Long userId, Integer clueType);
// /**
// * 将拓客的线索回流到crm
// *
// * @param clueId
// * @param clueType
// */
// void clueBackFlow( Long clueId, Integer clueType);
/**
*
*/
void dynamicTaskDistribution(Long taskId);
void dynamicTaskDistribution(Long taskId,Integer uploadType);
}

@ -1,9 +1,9 @@
package com.baiye.module.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
@ -11,12 +11,12 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.SourceLabelConstants;
import com.baiye.enums.ClueStageEnum;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.*;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.*;
import com.baiye.model.entity.BaseClue;
import com.baiye.model.vo.ResSourceLabel;
import com.baiye.constant.FileConstant;
import com.baiye.module.dao.*;
@ -43,7 +43,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@ -58,6 +57,7 @@ public class ClueServiceImpl implements ClueService {
private final ClueRecordRepository clueRecordRepository;
private final ClueRecordMapper clueRecordMapper;
private final ClueMiddleRepository clueMiddleRepository;
private final ClueTalkRepository clueTalkRepository;
private final ClueJpa clueJpa;
private final OrganizeClient organizeClient;
private final RedisUtils redisUtils;
@ -111,20 +111,37 @@ public class ClueServiceImpl implements ClueService {
clueFailRecordRepository.saveAll(failRecords);
}
List<Clue> clueListAll = clueRepository.saveAll(clueList);
//插入中间表数据
List<ClueMiddle> clueMiddleList = new ArrayList<>();
for (Clue clue : clueListAll) {
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(clue.getId());
clueMiddle.setTaskId(taskId);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueType(clueType);
clueMiddleList.add(clueMiddle);
if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(clueType)) {
List<ClueTalk> clueTalks = new ArrayList<>();
for (Clue clue : clueListAll) {
ClueTalk clueTalk = new ClueTalk();
clueTalk.setClueId(clue.getId());
clueTalk.setTaskId(taskId);
clueTalk.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueType(clueType);
clueTalks.add(clueTalk);
}
clueTalkRepository.saveAll(clueTalks);
} else {
//插入中间表数据
List<ClueMiddle> clueMiddleList = new ArrayList<>();
for (Clue clue : clueListAll) {
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(clue.getId());
clueMiddle.setTaskId(taskId);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueType(clueType);
clueMiddleList.add(clueMiddle);
}
clueMiddleRepository.saveAll(clueMiddleList);
}
clueMiddleRepository.saveAll(clueMiddleList);
}
}
@ -205,23 +222,37 @@ public class ClueServiceImpl implements ClueService {
String nid = clueQueryCriteria.getNid();
if (clueQueryCriteria.getMemberId() != null) {
if (StrUtil.isNotEmpty(clueQueryCriteria.getTaskName())) {
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getMemberId());
taskQueryCriteria.setBlurry(clueQueryCriteria.getTaskName());
Set<Long> taskIds = findTaskId(taskQueryCriteria);
clueQueryCriteria.setTaskIds(taskIds);
}
List<Long> userIds = organizeClient.findOrganizeIdByMember(clueQueryCriteria.getMemberId()).getBody();
//如果查询的小组id不为空 ,说明是组长并有权限查看组员信息
if (CollUtil.isNotEmpty(userIds)) {
clueQueryCriteria.setUserIdList(userIds);
clueQueryCriteria.setMemberId(null);
}
List<ClueDto> clueDtoList;
Long count;
//线索类型为空 查询的是crm线索
if (clueQueryCriteria.getClueType() == null) {
//4 dmp 5拓客 是特殊的任务,单独处理
clueQueryCriteria.setClueTypes(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
clueDtoList = clueJpa.getClueList(clueQueryCriteria, pageable);
count = clueJpa.getCount(clueQueryCriteria);
} else {
//拓客,投流
clueDtoList = clueJpa.getTalkClueList(clueQueryCriteria, pageable);
count = clueJpa.getTalkCount(clueQueryCriteria);
}
List<ClueDto> clueDtoList = clueJpa.getClueList(clueQueryCriteria, pageable);
//手机号搜索
if (StringUtils.isNotBlank(nid)) {
clueDtoList = clueDtoList.stream().filter(ct -> ct.getNid().contains(nid)).collect(Collectors.toList());
}
Long count = clueJpa.getCount(clueQueryCriteria);
//查询线索记录
Set<Long> clueIdList = clueDtoList.stream().map(ClueDto::getId).collect(Collectors.toSet());
List<ConductRecord> conductRecords = conductRecordRepository.findByClueIdIn(clueIdList);
@ -258,11 +289,12 @@ public class ClueServiceImpl implements ClueService {
@Override
public List<ClueDto> query(ClueQueryCriteria clueQueryCriteria) {
if (clueQueryCriteria.getMemberId() != null) {
List<ClueDto> clueDtoList;
if (clueQueryCriteria.getClueType() == null) {
//4 dmp 5拓客 是特殊的任务,单独处理
clueQueryCriteria.setClueTypes(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
clueDtoList = clueJpa.getClueList(clueQueryCriteria, null);
} else {
clueDtoList = clueJpa.getTalkClueList(clueQueryCriteria, null);
}
List<ClueDto> clueDtoList = clueJpa.getClueList(clueQueryCriteria, null);
Set<Long> memberIds = clueDtoList.stream().map(ClueDto::getMemberId).collect(Collectors.toSet());
Map<Long, String> userNickNameMap = userClient.findById(memberIds);
// id查询(详情查询)时返回标签信息
@ -293,14 +325,6 @@ public class ClueServiceImpl implements ClueService {
clueDto.setAddWeChatStatus(recordDTO.getStatus());
clueDto.setAddWeChatTime(recordDTO.getAddFriendTime());
}
//通过任务判断线索是否是飞鱼任务
// Task task = taskClient.queryDetails(clueDto.getTaskId()).getBody();
// if (ObjectUtil.isNotEmpty(task) && task.getIsForm() != null && task.getIsForm() == DefaultNumberConstants.THREE_NUMBER) {
// //飞鱼任务得线索
// clueDto.setClueType(DefaultNumberConstants.ONE_NUMBER);
// } else {
// clueDto.setClueType(DefaultNumberConstants.ZERO_NUMBER);
// }
}
}
return clueDtoList;
@ -337,6 +361,11 @@ public class ClueServiceImpl implements ClueService {
@Override
@Transactional(rollbackFor = Exception.class)
public void update(ClueMiddle clueMiddle) {
if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(clueMiddle.getClueType())) {
//执行拓客线索处理
executeTalkClue(clueMiddle);
return;
}
//更新通话状态时不加锁
if (clueMiddle.getClueCallStatus() == null) {
//乐观锁,不用jpa查询(jpa有缓存这个坑)
@ -375,7 +404,6 @@ public class ClueServiceImpl implements ClueService {
callbackOceanEngine(clueMiddle.getClueId(), stage);
}
}
}
if (clueMiddle.getClueCallStatus() != null) {
clueMiddleOne.setClueCallStatus(clueMiddle.getClueCallStatus());
@ -390,7 +418,29 @@ public class ClueServiceImpl implements ClueService {
clueMiddleOne.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1);
}
clueMiddleRepository.save(clueMiddleOne);
}
private void executeTalkClue(ClueMiddle clueMiddle) {
ClueTalk clueTalk = clueTalkRepository.findById(clueMiddle.getClueId()).orElseGet(ClueTalk::new);
if (clueMiddle.getClueCallStatus() != null) {
clueTalk.setClueCallStatus(clueMiddle.getClueCallStatus());
clueTalk.setMemberStatus(DefaultNumberConstants.TWO_NUMBER);
}
if (clueMiddle.getNewestCallTime() != null) {
clueTalk.setNewestCallTime(clueMiddle.getNewestCallTime());
}
if (CollUtil.isNotEmpty(clueMiddle.getSourceLabel())) {
List<String> sourceLabelList = clueMiddle.getSourceLabel();
// 标签去重
List<String> sourceLabel = new ArrayList<>(new TreeSet<>(sourceLabelList));
clueTalk.setSourceLabel(sourceLabel);
clueTalk.setLabelTime(new Date());
if (SourceLabelConstants.INTENTION.equals(sourceLabel.get(0))) {
//如果转有意向 转crm
clueBackFlow(clueTalk);
}
}
clueTalkRepository.save(clueTalk);
}
/**
@ -435,7 +485,11 @@ public class ClueServiceImpl implements ClueService {
if (clueIds.size() <= 0) {
throw new BadRequestException("用户分配比率过低,请减少分配用户");
}
clueMiddleRepository.updateMemberIdByClueIdIn(clueIds, userId);
if (clueQueryCriteria.getClueType() != null && clueQueryCriteria.getClueType() == DefaultNumberConstants.NINETY_NINE) {
clueTalkRepository.updateMemberIdByClueIdIn(clueIds, userId);
} else {
clueMiddleRepository.updateMemberIdByClueIdIn(clueIds, userId);
}
}
}
}
@ -493,7 +547,12 @@ public class ClueServiceImpl implements ClueService {
Long taskId = baseExcelListenerDto.getTaskId();
Long userId = baseExcelListenerDto.getUserId();
Integer origin = baseExcelListenerDto.getOrigin();
Integer taskNum = clueMiddleRepository.findTaskNum(taskId);
Integer taskNum;
if (origin == DefaultNumberConstants.SIX_NUMBER) {
taskNum = clueTalkRepository.findTaskNum(taskId);
} else {
taskNum = clueMiddleRepository.findTaskNum(taskId);
}
if (taskNum == null || taskNum == 0) {
try {
taskClient.sendErrMessage("导入资源合规条数0条,请检查文件重新导入", userId);
@ -545,13 +604,17 @@ public class ClueServiceImpl implements ClueService {
if (clueQueryCriteria.getMemberId() != null) {
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getMemberId());
taskQueryCriteria.setTaskType(1);
if (clueQueryCriteria.getTaskName() != null) {
taskQueryCriteria.setBlurry(clueQueryCriteria.getTaskName());
}
if (clueQueryCriteria.getTaskId() != null) {
taskQueryCriteria.setId(clueQueryCriteria.getTaskId());
}
if (clueQueryCriteria.getClueType() == null) {
taskQueryCriteria.setIsForms(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
} else {
taskQueryCriteria.setIsForms(Arrays.asList(ClueTypeConstants.TOKER_TYPE));
}
return findClueList(taskQueryCriteria, clueQueryCriteria, pageable);
} else {
log.info("========================用户id为空============================");
@ -560,40 +623,47 @@ public class ClueServiceImpl implements ClueService {
}
@Override
public Object withdrawSource(List<Long> clueIds) {
List<String> phoneList = new ArrayList<>();
if (CollUtil.isNotEmpty(clueIds)) {
// 查询已打过电话的
List<Long> list = reportClient.getTurnOnIds(clueIds).getData();
if (CollUtil.isNotEmpty(list)) {
//过滤掉打过电话的线索ID
clueIds = clueIds.stream().filter(num -> !list.contains(num)).collect(Collectors.toList());
phoneList = clueRepository.findAllById(list).stream().map(BaseClue::getNid).collect(Collectors.toList());
}
if (CollUtil.isNotEmpty(clueIds)) {
public Object withdrawSource(ClueQueryCriteria clueQueryCriteria) {
if (CollUtil.isNotEmpty(clueQueryCriteria.getClueIdList())) {
if (clueQueryCriteria.getClueType() != null && clueQueryCriteria.getClueType() == DefaultNumberConstants.NINETY_NINE) {
List<ClueTalk> clueList = new ArrayList<>();
List<ClueTalk> clueAll = clueTalkRepository.findAllById(clueQueryCriteria.getClueIdList());
for (ClueTalk clueTalk : clueAll) {
if (clueTalk.getClueCallStatus() == DefaultNumberConstants.ZERO_NUMBER) {
clueTalk.setSourceLabel(null);
clueTalk.setOptimisticVersion(0);
clueTalk.setRemark(null);
clueTalk.setMemberStatus(0);
clueTalk.setMemberId(null);
clueTalk.setOrganizeId(null);
clueTalk.setClueStage(0);
clueList.add(clueTalk);
} else {
throw new BadRequestException("存在已通话资源,无法撤回");
}
}
clueTalkRepository.saveAll(clueList);
} else {
List<ClueMiddle> clueList = new ArrayList<>();
List<ClueMiddle> clueAll = clueMiddleRepository.findAllById(clueIds);
List<ClueMiddle> clueAll = clueMiddleRepository.findAllById(clueQueryCriteria.getClueIdList());
for (ClueMiddle clueMiddle : clueAll) {
clueMiddle.setSourceLabel(null);
clueMiddle.setOptimisticVersion(0);
clueMiddle.setRemark(null);
clueMiddle.setMemberStatus(0);
clueMiddle.setMemberId(null);
clueMiddle.setOrganizeId(null);
clueMiddle.setClueStage(0);
clueList.add(clueMiddle);
if (clueMiddle.getClueCallStatus() == DefaultNumberConstants.ZERO_NUMBER) {
clueMiddle.setSourceLabel(null);
clueMiddle.setOptimisticVersion(0);
clueMiddle.setRemark(null);
clueMiddle.setMemberStatus(0);
clueMiddle.setMemberId(null);
clueMiddle.setOrganizeId(null);
clueMiddle.setClueStage(0);
clueList.add(clueMiddle);
} else {
throw new BadRequestException("存在已通话资源,无法撤回");
}
}
clueMiddleRepository.saveAll(clueList);
}
}
if (CollUtil.isNotEmpty(phoneList)) {
String str = "";
for (String phone : phoneList) {
str = str + phone + ",";
}
str = str.substring(0, str.length() - 1);
throw new BadRequestException(str + " 已通话,无法撤回");
}
return new ResponseEntity<>(HttpStatus.OK);
}
@ -728,50 +798,23 @@ public class ClueServiceImpl implements ClueService {
String endTime = reportDto.getEndTime();
List<ClueMiddle> clueMiddles;
if (StrUtil.isBlank(reportDto.getStartTime()) || StrUtil.isBlank(reportDto.getEndTime())) {
// startTime = DateUtil.beginOfDay(DateUtil.date()).toString();
// endTime = DateUtil.date().toString();
clueMiddles = clueMiddleRepository.findByMemberId(reportDto.getMemberId());
} else {
clueMiddles = clueMiddleRepository.queryAllByTimeAndMemberId(startTime, endTime, reportDto.getMemberId());
}
HashMap<String, Object> reportMap = getReportMap(clueMiddles);
// List<Integer> stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(), ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey());
// double dealRate = 0.00;
// double communicatRate = 0.00;
// double intentionRate = 0.00;
// if (CollUtil.isNotEmpty(clueMiddles)) {
// //无意向
// int noIntention = (int) reportMap.get(ClueStageEnum.NO_INTENTION.getValue());
// int size = clueMiddles.size() - noIntention;
// //成交
// int deal = (int) reportMap.get(ClueStageEnum.DEAL.getValue());
// dealRate = NumberUtil.div(deal, size, 2);
//
// //待跟进
// int communicat = (int) reportMap.get(ClueStageEnum.NEW_CLUE.getValue()) + (int) reportMap.get(ClueStageEnum.COMMUNICAT.getValue());
// communicatRate = NumberUtil.div(communicat, size, 2);
//
// //有意向
// int i = (int) reportMap.get(ClueStageEnum.EFFICIENT.getValue());
// int i1 = (int) reportMap.get(ClueStageEnum.ADD_WECHAT.getValue());
// int i2 = (int) reportMap.get(ClueStageEnum.INTENTION.getValue());
// int i3 = (int) reportMap.get(ClueStageEnum.INVITING.getValue());
// int i4 = (int) reportMap.get(ClueStageEnum.INTERVIEW.getValue());
// int intention = i + i1 + i2 + i3 + i4;
// intentionRate = NumberUtil.div(intention, size, 2);
//
// }
// reportMap.put("dealRate", dealRate);
// reportMap.put("communicatRate", communicatRate);
// reportMap.put("intentionRate", intentionRate);
return CommonResponse.createBySuccess(reportMap);
}
@Override
public Map<Long, Integer> countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) {
List<Long> longs = clueMiddleRepository.selectClueMiddleByMember(clueQueryCriteria.getMemberStatus(), clueQueryCriteria.getTaskIds());
List<Long> longs;
if (clueQueryCriteria.getClueType() != null) {
longs = clueTalkRepository.selectClueTalkByMember(clueQueryCriteria.getMemberStatus(), clueQueryCriteria.getTaskIds());
} else {
longs = clueMiddleRepository.selectClueMiddleByMember(clueQueryCriteria.getMemberStatus(), clueQueryCriteria.getTaskIds());
}
Map<Long, Integer> map = new HashMap<>();
for (Long key : longs) {
if (map.containsKey(key)) {
@ -789,34 +832,45 @@ public class ClueServiceImpl implements ClueService {
return clueMiddleRepository.findTaskNum(taskId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void clueBackFlow(Long taskId, Long clueId, Long userId, Integer clueType) {
ClueMiddle clueMiddle = clueMiddleRepository.findById(clueId).orElseGet(ClueMiddle::new);
Integer userCount = turnCrmLogRepository.findByUserIdCount(clueMiddle.getMemberId()) + DefaultNumberConstants.ONE_NUMBER;
UserDto userInfo = userClient.findUserInfo(clueMiddle.getMemberId());
if (userCount != null && userCount > userInfo.getTurnCrmNum()) {
/**
* 线crm
*/
public void clueBackFlow(ClueTalk clueTalk) {
if (clueTalk.getMemberStatus() == DefaultNumberConstants.FOUR_NUMBER) {
throw new BadRequestException("已经转为crm,请勿重复操作");
}
if (clueTalk.getClueCallStatus() == null || clueTalk.getClueCallStatus() == DefaultNumberConstants.ZERO_NUMBER) {
throw new BadRequestException("未拨打电话,不能转crm");
}
int userCount = turnCrmLogRepository.findByUserIdCount(clueTalk.getMemberId()) + DefaultNumberConstants.ONE_NUMBER;
UserDto userInfo = userClient.findUserInfo(clueTalk.getMemberId());
if (userCount > userInfo.getTurnCrmNum()) {
throw new BadRequestException("回流失败,每天上限" + userInfo.getTurnCrmNum() + "条,请联系管理员");
}
// 记录转crm日志
TurnCrmLog turnCrmLog = new TurnCrmLog();
turnCrmLog.setClueId(clueId);
turnCrmLog.setUserId(clueMiddle.getMemberId());
turnCrmLog.setClueId(clueTalk.getClueId());
turnCrmLog.setUserId(clueTalk.getMemberId());
turnCrmLogRepository.save(turnCrmLog);
// 初始化线索加密字段
Clue clue = clueRepository.findById(clueId).orElseGet(Clue::new);
Clue clue = clueRepository.findById(clueTalk.getClueId()).orElseGet(Clue::new);
clue.setIsEncryption(DefaultNumberConstants.ZERO_NUMBER);
//查看crm任务
clueRepository.save(clue);
//查看crm的回流任务
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
int crmClueType = 0;
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
if (clueTalk.getClueType() == DefaultNumberConstants.FOUR_NUMBER) {
crmClueType = DefaultNumberConstants.SEVEN_NUMBER;
taskQueryCriteria.setIsForm(DefaultNumberConstants.SEVEN_NUMBER);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
} else if (clueTalk.getClueType() == DefaultNumberConstants.FIVE_NUMBER) {
crmClueType = DefaultNumberConstants.SIX_NUMBER;
taskQueryCriteria.setIsForm(DefaultNumberConstants.SIX_NUMBER);
}
taskQueryCriteria.setCreateBy(userId);
taskQueryCriteria.setCreateBy(clue.getCreateBy());
Object body = taskClient.query(taskQueryCriteria).getBody();
JSONArray taskList = JSONUtil.parseArray(body);
Long crmTaskId;
@ -827,32 +881,40 @@ public class ClueServiceImpl implements ClueService {
} else {
throw new BadRequestException("回流失败");
}
Task crmTask = new Task();
crmTask.setId(crmTaskId);
crmTask.setTotalNumber(crmTotalNumber + 1);
taskClient.updateTask(crmTask);
//初始化线索
ClueMiddle clueMiddle = new ClueMiddle();
BeanUtil.copyProperties(clueTalk, clueMiddle);
clueMiddle.setTaskId(crmTaskId);
clueMiddle.setSourceLabel(null);
clueMiddle.setClueType(crmClueType);
clueMiddle.setMemberStatus(DefaultNumberConstants.TWO_NUMBER);
clueMiddle.setClueStage(DefaultNumberConstants.TWO_NUMBER);
clueMiddle.setClueStageTime(new Date());
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddleRepository.save(clueMiddle);
//todo 改变两个任务的总数量
Task crmTask = new Task();
crmTask.setId(crmTaskId);
crmTask.setTotalNumber(crmTotalNumber + 1);
taskClient.updateTask(crmTask);
Integer taskNum = clueMiddleRepository.findTaskNum(taskId);
Task task = new Task();
task.setId(taskId);
task.setTotalNumber(taskNum);
taskClient.updateTask(task);
clueTalk.setMemberStatus(DefaultNumberConstants.FOUR_NUMBER);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void dynamicTaskDistribution(Long taskId) {
List<ClueMiddle> clueAll = clueMiddleRepository.findByTaskIdAndMemberStatus(taskId, DefaultNumberConstants.ZERO_NUMBER);
List<Long> clueIds = clueAll.stream().map(ClueMiddle::getClueId).collect(Collectors.toList());
public void dynamicTaskDistribution(Long taskId, Integer uploadType) {
List<Long> clueIds;
if (uploadType == 6) {
clueIds = clueTalkRepository.findByTaskIdAndMemberStatus(taskId, DefaultNumberConstants.ZERO_NUMBER);
} else {
clueIds = clueMiddleRepository.findByTaskIdAndMemberStatus(taskId, DefaultNumberConstants.ZERO_NUMBER);
}
CommonResponse<DynamicTaskDistributionDTO> response = taskClient.findTaskDistribution(taskId);
if (response.getStatus() == DefaultNumberConstants.ZERO_NUMBER) {
DynamicTaskDistributionDTO dynamicTaskDistributionDTO = response.getData();
// 开启了自动分配
@ -880,9 +942,14 @@ public class ClueServiceImpl implements ClueService {
distributeDTO.setWeights(weights);
distributeDTO.setResourceList(clueIds);
CommonResponse<List<DistributeResponseDTO>> distributeResponse = assignDataClient.dataDistribution(distributeDTO);
if (distributeResponse.getStatus() == DefaultNumberConstants.ZERO_NUMBER) {
for (DistributeResponseDTO data : distributeResponse.getData()) {
clueMiddleRepository.updateMemberIdByClueIdIn(data.getResponseList(), data.getDeptId());
if (uploadType == 6) {
clueTalkRepository.updateMemberIdByClueIdIn(data.getResponseList(), data.getDeptId());
} else {
clueMiddleRepository.updateMemberIdByClueIdIn(data.getResponseList(), data.getDeptId());
}
}
}
}
@ -890,7 +957,6 @@ public class ClueServiceImpl implements ClueService {
}
}
private List<HashMap<String, Object>> getOrganizeInfo(String startTime, String endTime, List<Long> organizeIds) {
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryAllByTimeAndorganizeIds(startTime, endTime, organizeIds);
Set<Long> ids = clueMiddles.stream().map(ClueMiddle::getOrganizeId).collect(Collectors.toSet());
@ -1013,9 +1079,6 @@ public class ClueServiceImpl implements ClueService {
double turnoverAmount = 0;
for (ClueMiddle clueMiddle : clueMiddles) {
Date clueStageTime = clueMiddle.getClueStageTime();
// if (DateUtil.between(date, clueStageTime, DateUnit.DAY) == 0) {
// turnoverAmount += clueMiddle.getTurnoverAmount();
// }
if (clueStageTime != null && clueMiddle.getTurnoverAmount() != null && Objects.equals(DateUtil.formatDate(date), DateUtil.formatDate(clueStageTime))) {
turnoverAmount += clueMiddle.getTurnoverAmount();
}
@ -1039,10 +1102,6 @@ public class ClueServiceImpl implements ClueService {
//获取所有任务id
Set<Long> taskIds = findTaskId(taskQueryCriteria);
if (CollUtil.isNotEmpty(taskIds)) {
if (clueQueryCriteria.getClueType() == null) {
//4 dmp 5拓客 是特殊的任务,单独处理
clueQueryCriteria.setClueTypes(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
}
List<Clue> clueAll = clueJpa.findClue(taskIds, pageable, clueQueryCriteria);
Set<Long> memberIds = clueAll.stream().map(Clue::getMemberId).collect(Collectors.toSet());
Map<Long, String> userNickNameMap = userClient.findById(memberIds);
@ -1089,7 +1148,8 @@ public class ClueServiceImpl implements ClueService {
if (str == null || "null".equals(str) || StringUtils.isBlank(str)) {
Task body = taskClient.queryDetails(taskId).getBody();
if (ObjectUtil.isNotEmpty(body)) {
redisUtils.set(taskNameKey, body.getTaskName(), 2592000);// 缓存三十天
// 缓存三十天
redisUtils.set(taskNameKey, body.getTaskName(), 2592000);
return body.getTaskName();
}
}
@ -1113,18 +1173,20 @@ public class ClueServiceImpl implements ClueService {
clue.setNid(phone);
clue.setCreateBy(userId);
clue.setCastInfo(tagList.get(i));
clue.setOrigin(DefaultNumberConstants.FIVE_NUMBER);
clue.setOrigin(DefaultNumberConstants.SIX_NUMBER);
clue.setIsEncryption(DefaultNumberConstants.ONE_NUMBER);
Clue save = clueRepository.save(clue);
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(save.getId());
clueMiddle.setClueType(num);
clueMiddle.setTaskId(taskId);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddleRepository.save(clueMiddle);
ClueTalk clueTalk = new ClueTalk();
clueTalk.setClueId(save.getId());
clueTalk.setClueType(num);
clueTalk.setTaskId(taskId);
clueTalk.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueStageTime(new Date());
clueTalk.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueTalkRepository.save(clueTalk);
clueNumber++;
}
}

@ -6,7 +6,6 @@ import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.TaskClient;
@ -14,8 +13,10 @@ import com.baiye.feign.UserClient;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.HomePageReportDTO;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueTalkRepository;
import com.baiye.module.dao.ReportTokerRepository;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.ClueTalk;
import com.baiye.module.entity.ReportToker;
import com.baiye.module.entity.Task;
import com.baiye.module.entity.dto.ReportTokerDTO;
@ -45,19 +46,19 @@ public class ReportTokerServiceImpl implements ReportTokerService {
private final ReportSync reportSync;
private final ClueMiddleRepository clueMiddleRepository;
private final ClueTalkRepository clueTalkRepository;
@Override
public Map<String, Object> reportTokerBroken(ReportTokerDTO reportTokerDTO) {
dealTime(reportTokerDTO);
String beginTime = reportTokerDTO.getBeginTime();
String endTime = reportTokerDTO.getEndTime();
if (reportTokerDTO.getTaskId() == null) {
throw new BadRequestException("请选择任务");
}
List<ReportToker> reportTokers = reportTokerRepository.queryAllByTimeAndTaskId(beginTime, endTime, reportTokerDTO.getTaskId(), reportTokerDTO.getMemberId());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime(), Collections.singletonList(reportTokerDTO.getTaskId()), reportTokerDTO.getMemberId());
reportTokers.addAll(todayData);
return dealReportData(beginTime, endTime, reportTokerDTO.getTaskId(), reportTokerDTO.getMemberId(), reportTokers);
}
@ -69,7 +70,7 @@ public class ReportTokerServiceImpl implements ReportTokerService {
throw new BadRequestException("请选择任务");
}
List<ReportToker> reportTokers = reportTokerRepository.queryAllByTimeAndTaskId(reportTokerDTO.getBeginTime(), reportTokerDTO.getEndTime(), reportTokerDTO.getTaskId(), null);
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime(), reportTokerDTO.getTaskIds(), null);
reportTokers.addAll(todayData);
List<UploadTokerDTO> list = new ArrayList<>();
for (ReportToker reportToker : reportTokers) {
@ -100,11 +101,12 @@ public class ReportTokerServiceImpl implements ReportTokerService {
/**
*
*/
private List<ReportToker> getTodayData(String endTime) {
private List<ReportToker> getTodayData(String endTime, List<Long> taskIds, Long memberId) {
long between = DateUtil.between(DateUtil.parseDate(endTime), DateUtil.parseDate(DateUtil.today()), DateUnit.DAY);
// 需要实时查询当天的统计
if (between == DefaultNumberConstants.ZERO_NUMBER) {
return reportSync.dealData(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.endOfDay(DateUtil.date()).toString());
List<ClueTalk> clueTalks = clueTalkRepository.queryClueByLabelTimeAndTaskIds(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.endOfDay(DateUtil.date()).toString(), taskIds, memberId);
return reportSync.dealData(clueTalks);
}
return new ArrayList<>();
}
@ -180,7 +182,7 @@ public class ReportTokerServiceImpl implements ReportTokerService {
}
List<HashMap<String, Object>> list = new ArrayList<>();
List<ReportToker> tokers = reportTokerRepository.queryAllByTimeAndTaskIds(reportTokerDTO.getBeginTime(), reportTokerDTO.getEndTime(), reportTokerDTO.getTaskIds());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime(), reportTokerDTO.getTaskIds(), null);
tokers.addAll(todayData);
Map<Long, List<ReportToker>> tokerByTaskId = tokers.stream().collect(Collectors.groupingBy(ReportToker::getTaskId, Collectors.toList()));
HashMap<String, Object> map = new HashMap<>(5);
@ -210,16 +212,21 @@ public class ReportTokerServiceImpl implements ReportTokerService {
Map<String, HomePageReportDTO> map = new HashMap<>(2);
List<ClueMiddle> clueMiddles = clueMiddleRepository.findClueMiddleByCreateBy(userId);
HomePageReportDTO crmReport = new HomePageReportDTO().init();
HomePageReportDTO talkReport = new HomePageReportDTO().init();
//crm
if (CollUtil.isNotEmpty(clueMiddles)) {
crmReport.setTotalNum(clueMiddles.size());
for (ClueMiddle clueMiddle : clueMiddles) {
//crm
if (Arrays.asList(ClueTypeConstants.SCREEN_TYPE).contains(clueMiddle.getClueType())) {
dealData(clueMiddle, crmReport, 1);
} else if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(clueMiddle.getClueType())) {
//拓客投流
dealData(clueMiddle, talkReport, 2);
}
dealCrmData(clueMiddle, crmReport);
}
}
//拓客
List<ClueTalk> clueTalks = clueTalkRepository.findClueTalkByCreateBy(userId);
HomePageReportDTO talkReport = new HomePageReportDTO().init();
if (CollUtil.isNotEmpty(clueTalks)) {
talkReport.setTotalNum(clueTalks.size());
for (ClueTalk clueTalk : clueTalks) {
dealTalkData(clueTalk, talkReport);
}
}
map.put("crm", rate(crmReport));
@ -241,41 +248,23 @@ public class ReportTokerServiceImpl implements ReportTokerService {
return report;
}
private void dealData(ClueMiddle clueMiddle, HomePageReportDTO report, Integer flag) {
private void dealCrmData(ClueMiddle clueMiddle, HomePageReportDTO report) {
Integer clueType = clueMiddle.getClueType();
report.setTotalNum(report.getTotalNum() + 1);
//来源
if (flag == 1) {
//投流来源
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
} else {
//拓客来源
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
//昨日新增
DateTime yesterday = DateUtil.yesterday();
if (clueMiddle.getCreateTime() != null && DateUtil.betweenDay(clueMiddle.getCreateTime(), yesterday, true) == DefaultNumberConstants.ZERO_NUMBER) {
report.setAddTotalNum(report.getAddTotalNum() + 1);
if (flag == 1) {
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
} else {
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
}
//今日实时
@ -289,4 +278,33 @@ public class ReportTokerServiceImpl implements ReportTokerService {
}
}
}
private void dealTalkData(ClueTalk clueTalk, HomePageReportDTO report) {
Integer clueType = clueTalk.getClueType();
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
//昨日新增
DateTime yesterday = DateUtil.yesterday();
if (clueTalk.getCreateTime() != null && DateUtil.betweenDay(clueTalk.getCreateTime(), yesterday, true) == DefaultNumberConstants.ZERO_NUMBER) {
report.setAddTotalNum(report.getAddTotalNum() + 1);
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
}
//今日实时
DateTime today = DateUtil.date();
if (clueTalk.getNewestCallTime() != null && DateUtil.betweenDay(clueTalk.getNewestCallTime(), today, true) == DefaultNumberConstants.ZERO_NUMBER) {
if (clueTalk.getClueCallStatus() == DefaultNumberConstants.ONE_NUMBER) {
report.setUsrNum(report.getUsrNum() + 1);
} else if (clueTalk.getClueCallStatus() == DefaultNumberConstants.TWO_NUMBER) {
report.setTurnOnNum(report.getTurnOnNum() + 1);
report.setUsrNum(report.getUsrNum() + 1);
}
}
}
}

@ -6,10 +6,7 @@ import com.baiye.exception.BadRequestException;
import com.baiye.feign.TaskClient;
import com.baiye.model.dto.ClueQueryCriteria;
import com.baiye.constant.FileConstant;
import com.baiye.module.dao.ClueJpa;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueRecordRepository;
import com.baiye.module.dao.ClueRepository;
import com.baiye.module.dao.*;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueRecord;
import com.baiye.module.entity.Task;
@ -46,6 +43,8 @@ public class FileAnalysisTask {
private TaskClient taskClient;
@Resource
private ClueRecordRepository clueRecordRepository;
@Resource
private ClueTalkRepository clueTalkRepository;
/**
*
@ -96,14 +95,20 @@ public class FileAnalysisTask {
Integer uploadType = clueRecords.get(0).getUploadType();
if (uploadType == FileConstant.FIVE_NUMBER || (uploadType == FileConstant.SIX_NUMBER && !isCreateTask)) {
Long taskId = clueRecords.get(0).getTaskId();
Integer taskNum = clueMiddleRepository.findTaskNum(taskId);
Integer taskNum;
if (uploadType == FileConstant.SIX_NUMBER) {
taskNum = clueTalkRepository.findTaskNum(taskId);
} else {
taskNum = clueMiddleRepository.findTaskNum(taskId);
}
Task task = new Task();
task.setId(taskId);
task.setTotalNumber(taskNum);
task.setIsDistribution(1);
taskClient.updateTask(task);
// 查看此任务是否开启自动分配,开启了就分配掉
clueService.dynamicTaskDistribution(taskId);
clueService.dynamicTaskDistribution(taskId,uploadType);
return;
}
//创建任务

@ -1,12 +1,11 @@
package com.baiye.task;
import cn.hutool.core.date.DateUtil;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.SourceLabelConstants;
import com.baiye.feign.UserClient;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueTalkRepository;
import com.baiye.module.dao.ReportTokerRepository;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.ClueTalk;
import com.baiye.module.entity.ReportToker;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -23,9 +22,9 @@ import java.util.stream.Collectors;
@Component
@Slf4j
public class ReportSync {
private final ClueMiddleRepository clueMiddleRepository;
private final UserClient userClient;
private final ReportTokerRepository reportTokerRepository;
private final ClueTalkRepository clueTalkRepository;
/**
* 23
@ -37,35 +36,32 @@ public class ReportSync {
//当前时间
String beginOfDay = DateUtil.formatDateTime(DateUtil.yesterday());
String endOfDay = DateUtil.formatDateTime(DateUtil.date());
List<ReportToker> list = dealData(beginOfDay, endOfDay);
List<ClueTalk> clueTalks = clueTalkRepository.queryClueByLabelTime(beginOfDay, endOfDay);
List<ReportToker> list = dealData(clueTalks);
reportTokerRepository.saveAll(list);
log.info("拓客投流统计 结束------------------{}", DateUtil.date());
}
public List<ReportToker> dealData(String beginOfDay, String endOfDay) {
//只统计拓客和投流的 clueTypes 为 4和5 的
List<Integer> clueTypes = Arrays.asList(ClueTypeConstants.TOKER_TYPE);
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryClueByClueType(beginOfDay, endOfDay, clueTypes);
public List<ReportToker> dealData(List<ClueTalk> clueTalks) {
List<ReportToker> list = new ArrayList<>();
//按人员id分组
HashMap<Long, List<ClueMiddle>> mapByUserId = new HashMap<>(clueMiddles.stream().collect(Collectors.groupingBy(ClueMiddle::getMemberId, Collectors.toList())));
HashMap<Long, List<ClueTalk>> mapByUserId = new HashMap<>(clueTalks.stream().collect(Collectors.groupingBy(ClueTalk::getMemberId, Collectors.toList())));
Set<Long> userIds = mapByUserId.keySet();
Map<Long, String> userNameList = userClient.findById(userIds);
for (Long memberId : mapByUserId.keySet()) {
List<ClueMiddle> clueMiddlesByUserId = mapByUserId.get(memberId);
List<ClueTalk> clueByUserId = mapByUserId.get(memberId);
//任务分组
HashMap<Long, List<ClueMiddle>> mapByTaskId = new HashMap<>(clueMiddlesByUserId.stream().collect(Collectors.groupingBy(ClueMiddle::getTaskId, Collectors.toList())));
HashMap<Long, List<ClueTalk>> mapByTaskId = new HashMap<>(clueByUserId.stream().collect(Collectors.groupingBy(ClueTalk::getTaskId, Collectors.toList())));
for (Long taskId : mapByTaskId.keySet()) {
List<ClueMiddle> clueMiddlesByTaskId = mapByTaskId.get(taskId);
List<ClueTalk> clueByTaskId = mapByTaskId.get(taskId);
int intention = 0;
int notIntention = 0;
int notTurnOn = 0;
for (ClueMiddle clueMiddle : clueMiddlesByTaskId) {
for (ClueTalk clueTalk : clueByTaskId) {
//标签
String sourceLabel = "";
if (clueMiddle.getSourceLabel().size() > 0) {
sourceLabel = clueMiddle.getSourceLabel().get(0);
if (clueTalk.getSourceLabel().size() > 0) {
sourceLabel = clueTalk.getSourceLabel().get(0);
}
switch (sourceLabel) {
case SourceLabelConstants.INTENTION:

Loading…
Cancel
Save