修改投流显示

master
wujingtao 2 years ago
parent f5135b645a
commit 10dadbe349

@ -31,7 +31,7 @@ public enum ClueStageEnum {
/** /**
* *
*/ */
INTENTION(4, "Intention"), INTENTION(4, "intention"),
/** /**
* *

@ -20,9 +20,14 @@ public class ReportStageAndTurnoverDto {
/** /**
* id * id
*/ */
private Long memberId;
/**
* ids
*/
private List<Long> memberIds; private List<Long> memberIds;
/** /**
* id * id
*/ */
private List<Long> organizeIds; private List<Long> organizeIds;
} }

@ -33,6 +33,7 @@ public class BaseClueMiddle implements Serializable {
@ApiModelProperty(value = "线索阶段修改时间") @ApiModelProperty(value = "线索阶段修改时间")
@Column(name = "clue_stage_time") @Column(name = "clue_stage_time")
@CreationTimestamp
private Date clueStageTime; private Date clueStageTime;
@ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通") @ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通")

@ -202,6 +202,11 @@ public class ClueController {
return clueService.reportClueStageAndTurnover(reportStageAndTurnoverDto); return clueService.reportClueStageAndTurnover(reportStageAndTurnoverDto);
} }
@PostMapping("/report/funnel")
@ApiOperation("销售漏斗图")
public CommonResponse<Object> reportFunnel(@RequestBody ReportStageAndTurnoverDto reportStageAndTurnoverDto) {
return clueService.reportFunnel(reportStageAndTurnoverDto);
}
@PostMapping("/count/memberStatus") @PostMapping("/count/memberStatus")

@ -50,5 +50,4 @@ public class ReportTokerController {
public CommonResponse<Map<String, HomePageReportDTO>> getReportHomePage(@RequestParam(value = "userId") Long userId) { public CommonResponse<Map<String, HomePageReportDTO>> getReportHomePage(@RequestParam(value = "userId") Long userId) {
return reportTokerService.getReportHomePage(userId); return reportTokerService.getReportHomePage(userId);
} }
} }

@ -2,6 +2,7 @@ package com.baiye.module.dao;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -62,7 +63,7 @@ public class ClueJpa {
"cm.newest_call_time as newestCallTime ,cm.turnover_amount as turnoverAmount ,cm.clue_type as clueType " + "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_middle as cm on c.id = cm.clue_id where 1=1 "); "from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 ");
List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, pageable); List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, pageable);
return getTradeInfo(confirmReceipt); return getTradeInfo(confirmReceipt, clueQueryCriteria.getClueType());
} }
/** /**
@ -193,7 +194,7 @@ public class ClueJpa {
/** /**
* Dtokeysqlas * Dtokeysqlas
*/ */
private List<ClueDto> getTradeInfo(List list) { private List<ClueDto> getTradeInfo(List list, Integer clueType) {
List<ClueDto> clueDtoList = new ArrayList<>(); List<ClueDto> clueDtoList = new ArrayList<>();
for (Object obj : list) { for (Object obj : list) {
Map row = (Map) obj; Map row = (Map) obj;
@ -214,35 +215,40 @@ public class ClueJpa {
String nid = AESUtils.decrypt(phone, secret); String nid = AESUtils.decrypt(phone, secret);
String key = "task:encryption:" + taskId; String key = "task:encryption:" + taskId;
String str = String.valueOf(redisUtils.get(key)); String str = String.valueOf(redisUtils.get(key));
// 查看资源是否需要加密显示 //fixme 投流线索 返回处理
if (isEncryption != null && isEncryption == 1) { if (clueType == 4) {
StringBuilder stringBuilder = new StringBuilder(nid); clueDto.setNid(RandomUtil.randomString(22));
String strRep = stringBuilder.replace(3, 7, "****").toString();
clueDto.setNid(strRep);
} else { } else {
// 查看任务是否需要加密显示资源 // 查看资源是否需要加密显示
if ("null".equals(str) || StringUtils.isBlank(str)) { if (isEncryption != null && isEncryption == 1) {
ClueDto clueDtoClient = new ClueDto();
clueDtoClient.setTaskId(taskId.longValue());
clueDtoClient.setIsRedis(1);
Map<String, List<String>> body;
try {
body = organizeClient.getLabel(clueDtoClient).getBody();
} catch (Exception e) {
log.error("Method【getTradeInfo】An error occurred ,error:{},time:{}", e.getMessage(), DateUtil.now());
throw new BadRequestException("获取加密信息错误");
}
if (body != null && body.containsKey("taskIsEncryption")) {
str = body.get("taskIsEncryption").get(0);
}
}
//str此次任务是否加密线索手机号 0:不加密 1:加密
if ("0".equals(str)) {
clueDto.setNid(nid);
} else {
StringBuilder stringBuilder = new StringBuilder(nid); StringBuilder stringBuilder = new StringBuilder(nid);
String strRep = stringBuilder.replace(3, 7, "****").toString(); String strRep = stringBuilder.replace(3, 7, "****").toString();
clueDto.setNid(strRep); clueDto.setNid(strRep);
} else {
// 查看任务是否需要加密显示资源
if ("null".equals(str) || StringUtils.isBlank(str)) {
ClueDto clueDtoClient = new ClueDto();
clueDtoClient.setTaskId(taskId.longValue());
clueDtoClient.setIsRedis(1);
Map<String, List<String>> body;
try {
body = organizeClient.getLabel(clueDtoClient).getBody();
} catch (Exception e) {
log.error("Method【getTradeInfo】An error occurred ,error:{},time:{}", e.getMessage(), DateUtil.now());
throw new BadRequestException("获取加密信息错误");
}
if (body != null && body.containsKey("taskIsEncryption")) {
str = body.get("taskIsEncryption").get(0);
}
}
//str此次任务是否加密线索手机号 0:不加密 1:加密
if ("0".equals(str)) {
clueDto.setNid(nid);
} else {
StringBuilder stringBuilder = new StringBuilder(nid);
String strRep = stringBuilder.replace(3, 7, "****").toString();
clueDto.setNid(strRep);
}
} }
} }
} }

@ -192,6 +192,9 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
@Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.member_id in ?3", nativeQuery = true) @Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.member_id in ?3", nativeQuery = true)
List<ClueMiddle> queryAllByTimeAndMemberIds(String beginTime, String endTime, List<Long> memberIds); List<ClueMiddle> queryAllByTimeAndMemberIds(String beginTime, String endTime, List<Long> memberIds);
@Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.member_id = ?3", nativeQuery = true)
List<ClueMiddle> queryAllByTimeAndMemberId(String beginTime, String endTime, Long memberId);
@Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.organize_id in ?3", nativeQuery = true) @Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.organize_id in ?3", nativeQuery = true)
List<ClueMiddle> queryAllByTimeAndorganizeIds(String beginTime, String endTime, List<Long> organizeIds); List<ClueMiddle> queryAllByTimeAndorganizeIds(String beginTime, String endTime, List<Long> organizeIds);
@ -217,7 +220,7 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
* @param userId * @param userId
* @return * @return
*/ */
@Query(value = " select * from tb_clue_middle as tcm left join tb_clue as tc on tcm.clue_id =tc.id" + @Query(value = " select tcm.* from tb_clue_middle as tcm left join tb_clue as tc on tcm.clue_id =tc.id" +
" where tc.create_by = ?1", nativeQuery = true) " where tc.create_by = ?1", nativeQuery = true)
List<ClueMiddle> findClueMiddleByCreateBy(Long userId); List<ClueMiddle> findClueMiddleByCreateBy(Long userId);
} }

@ -232,6 +232,13 @@ public interface ClueService {
*/ */
CommonResponse<Object> reportClueStageAndTurnover(ReportStageAndTurnoverDto reportStageAndTurnoverDto); CommonResponse<Object> reportClueStageAndTurnover(ReportStageAndTurnoverDto reportStageAndTurnoverDto);
/**
*
*
* @param reportStageAndTurnoverDto
* @return
*/
CommonResponse<Object> reportFunnel(ReportStageAndTurnoverDto reportStageAndTurnoverDto);
/** /**
* 线 * 线

@ -3,6 +3,7 @@ package com.baiye.module.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
@ -199,7 +200,6 @@ public class ClueServiceImpl implements ClueService {
List<Long> userIds = organizeClient.findOrganizeIdByMember(clueQueryCriteria.getMemberId()).getBody(); List<Long> userIds = organizeClient.findOrganizeIdByMember(clueQueryCriteria.getMemberId()).getBody();
//如果查询的小组id不为空 ,说明是组长并有权限查看组员信息 //如果查询的小组id不为空 ,说明是组长并有权限查看组员信息
if (CollUtil.isNotEmpty(userIds)) { if (CollUtil.isNotEmpty(userIds)) {
// clueQueryCriteria.setOrganizeId(organizeId);
clueQueryCriteria.setUserIdList(userIds); clueQueryCriteria.setUserIdList(userIds);
clueQueryCriteria.setMemberId(null); clueQueryCriteria.setMemberId(null);
} }
@ -614,14 +614,14 @@ public class ClueServiceImpl implements ClueService {
@Override @Override
public Integer queryClueByAdmin(Long memberId) { public Integer queryClueByAdmin(Long memberId) {
//有意向的阶段 3已加微信 4:高意向 5:邀约中 6到场 //有意向的阶段 3已加微信 4:高意向 5:邀约中 6到场
List<Integer> stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(),ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey()); List<Integer> stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(), ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey());
return clueMiddleRepository.queryClueByAdmin(memberId, DateUtil.today(), stages); return clueMiddleRepository.queryClueByAdmin(memberId, DateUtil.today(), stages);
} }
@Override @Override
public Integer countClueByTaskId(Long taskId, String beginTime, String endTime) { public Integer countClueByTaskId(Long taskId, String beginTime, String endTime) {
//有意向的阶段 3已加微信 4:高意向 5:邀约中 6到场 //有意向的阶段 3已加微信 4:高意向 5:邀约中 6到场
List<Integer> stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(),ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey()); List<Integer> stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(), ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey());
return clueMiddleRepository.countClueByTaskId(taskId, beginTime, endTime, stages); return clueMiddleRepository.countClueByTaskId(taskId, beginTime, endTime, stages);
} }
@ -636,6 +636,7 @@ public class ClueServiceImpl implements ClueService {
if (dynamicTaskDto.getWhichUserId() == null) { if (dynamicTaskDto.getWhichUserId() == null) {
throw new BadRequestException("添加失败"); throw new BadRequestException("添加失败");
} }
dynamicTaskDto.setUserId(dynamicTaskDto.getWhichUserId());
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria(); TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(dynamicTaskDto.getWhichUserId()); taskQueryCriteria.setCreateBy(dynamicTaskDto.getWhichUserId());
taskQueryCriteria.setIsForm(2); taskQueryCriteria.setIsForm(2);
@ -714,6 +715,55 @@ public class ClueServiceImpl implements ClueService {
return CommonResponse.createBySuccess(list); return CommonResponse.createBySuccess(list);
} }
@Override
public CommonResponse<Object> reportFunnel(ReportStageAndTurnoverDto reportDto) {
if (ObjectUtil.isNull(reportDto) || reportDto.getMemberId() == null) {
return CommonResponse.createByErrorMessage("查询人员为空");
}
String startTime = reportDto.getStartTime();
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 @Override
public Map<Long, Integer> countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) { public Map<Long, Integer> countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) {

Loading…
Cancel
Save