@ -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 ( clue QueryCriteria. getClue IdLi st( ) ) ;
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 ( clue Talk. getClue Id( ) ) ;
turnCrmLog . setUserId ( clue Talk . getMemberId ( ) ) ;
turnCrmLogRepository . save ( turnCrmLog ) ;
// 初始化线索加密字段
Clue clue = clueRepository . findById ( clue Id) . orElseGet ( Clue : : new ) ;
Clue clue = clueRepository . findById ( clue Talk. getClue Id( ) ) . orElseGet ( Clue : : new ) ;
clue . setIsEncryption ( DefaultNumberConstants . ZERO_NUMBER ) ;
//查看crm任务
clueRepository . save ( clue ) ;
//查看crm的回流任务
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria ( ) ;
int crmClueType = 0 ;
if ( clueT ype = = DefaultNumberConstants . FOUR_NUMBER ) {
if ( clueT alk. getClueT ype( ) = = DefaultNumberConstants . FOUR_NUMBER ) {
crmClueType = DefaultNumberConstants . SEVEN_NUMBER ;
taskQueryCriteria . setIsForm ( DefaultNumberConstants . SEVEN_NUMBER ) ;
} else if ( clueT ype = = DefaultNumberConstants . FIVE_NUMBER ) {
} else if ( clueT alk. getClueT ype( ) = = 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 + + ;
}
}