From 10dadbe349d75a3e9649579e99e06b4cd99925be Mon Sep 17 00:00:00 2001 From: wujingtao Date: Fri, 18 Nov 2022 17:14:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8A=95=E6=B5=81=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/baiye/enums/ClueStageEnum.java | 2 +- .../model/dto/ReportStageAndTurnoverDto.java | 5 ++ .../baiye/model/entity/BaseClueMiddle.java | 1 + .../module/controller/ClueController.java | 5 ++ .../controller/ReportTokerController.java | 1 - .../java/com/baiye/module/dao/ClueJpa.java | 60 ++++++++++--------- .../module/dao/ClueMiddleRepository.java | 5 +- .../com/baiye/module/service/ClueService.java | 7 +++ .../module/service/impl/ClueServiceImpl.java | 56 ++++++++++++++++- 9 files changed, 109 insertions(+), 33 deletions(-) diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/ClueStageEnum.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/ClueStageEnum.java index 22102433..73bba733 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/ClueStageEnum.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/ClueStageEnum.java @@ -31,7 +31,7 @@ public enum ClueStageEnum { /** * 高意向 */ - INTENTION(4, "Intention"), + INTENTION(4, "intention"), /** * 邀约 diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ReportStageAndTurnoverDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ReportStageAndTurnoverDto.java index 4d4f1c09..382b785c 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ReportStageAndTurnoverDto.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ReportStageAndTurnoverDto.java @@ -20,9 +20,14 @@ public class ReportStageAndTurnoverDto { /** * 人员id */ + private Long memberId; + /** + * 人员ids + */ private List memberIds; /** * 小组id */ private List organizeIds; + } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java index c2a38eba..00388478 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java @@ -33,6 +33,7 @@ public class BaseClueMiddle implements Serializable { @ApiModelProperty(value = "线索阶段修改时间") @Column(name = "clue_stage_time") + @CreationTimestamp private Date clueStageTime; @ApiModelProperty(value = "线索通话状态:0:无状态 1:未接听 2:已接通") diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java index 1e8130f1..26525a9d 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java @@ -202,6 +202,11 @@ public class ClueController { return clueService.reportClueStageAndTurnover(reportStageAndTurnoverDto); } + @PostMapping("/report/funnel") + @ApiOperation("销售漏斗图") + public CommonResponse reportFunnel(@RequestBody ReportStageAndTurnoverDto reportStageAndTurnoverDto) { + return clueService.reportFunnel(reportStageAndTurnoverDto); + } @PostMapping("/count/memberStatus") diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ReportTokerController.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ReportTokerController.java index 68ff010d..503e3379 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ReportTokerController.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ReportTokerController.java @@ -50,5 +50,4 @@ public class ReportTokerController { public CommonResponse> getReportHomePage(@RequestParam(value = "userId") Long userId) { return reportTokerService.getReportHomePage(userId); } - } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java index 70929436..79bcf2d7 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java @@ -2,6 +2,7 @@ package com.baiye.module.dao; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; 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 " + "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); - return getTradeInfo(confirmReceipt); + return getTradeInfo(confirmReceipt, clueQueryCriteria.getClueType()); } /** @@ -193,7 +194,7 @@ public class ClueJpa { /** * 转换封装为Dto,key对应sql语句的as别名 */ - private List getTradeInfo(List list) { + private List getTradeInfo(List list, Integer clueType) { List clueDtoList = new ArrayList<>(); for (Object obj : list) { Map row = (Map) obj; @@ -214,35 +215,40 @@ public class ClueJpa { String nid = AESUtils.decrypt(phone, secret); String key = "task:encryption:" + taskId; String str = String.valueOf(redisUtils.get(key)); - // 查看资源是否需要加密显示 - if (isEncryption != null && isEncryption == 1) { - StringBuilder stringBuilder = new StringBuilder(nid); - String strRep = stringBuilder.replace(3, 7, "****").toString(); - clueDto.setNid(strRep); + //fixme 投流线索 返回处理 + if (clueType == 4) { + clueDto.setNid(RandomUtil.randomString(22)); } else { - // 查看任务是否需要加密显示资源 - if ("null".equals(str) || StringUtils.isBlank(str)) { - ClueDto clueDtoClient = new ClueDto(); - clueDtoClient.setTaskId(taskId.longValue()); - clueDtoClient.setIsRedis(1); - Map> 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 { + // 查看资源是否需要加密显示 + if (isEncryption != null && isEncryption == 1) { StringBuilder stringBuilder = new StringBuilder(nid); String strRep = stringBuilder.replace(3, 7, "****").toString(); clueDto.setNid(strRep); + } else { + // 查看任务是否需要加密显示资源 + if ("null".equals(str) || StringUtils.isBlank(str)) { + ClueDto clueDtoClient = new ClueDto(); + clueDtoClient.setTaskId(taskId.longValue()); + clueDtoClient.setIsRedis(1); + Map> 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); + } } } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java index 400feb2f..801fe47f 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java @@ -192,6 +192,9 @@ public interface ClueMiddleRepository extends JpaRepository, 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) List queryAllByTimeAndMemberIds(String beginTime, String endTime, List 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 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) List queryAllByTimeAndorganizeIds(String beginTime, String endTime, List organizeIds); @@ -217,7 +220,7 @@ public interface ClueMiddleRepository extends JpaRepository, J * @param userId * @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) List findClueMiddleByCreateBy(Long userId); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java index 43e9b318..040850d6 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java @@ -232,6 +232,13 @@ public interface ClueService { */ CommonResponse reportClueStageAndTurnover(ReportStageAndTurnoverDto reportStageAndTurnoverDto); + /** + * 销售漏斗 + * + * @param reportStageAndTurnoverDto + * @return + */ + CommonResponse reportFunnel(ReportStageAndTurnoverDto reportStageAndTurnoverDto); /** * 未分配线索的总条数 diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java index 39a9d0d5..f804dbb7 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java @@ -3,6 +3,7 @@ package com.baiye.module.service.impl; 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; @@ -199,7 +200,6 @@ public class ClueServiceImpl implements ClueService { List userIds = organizeClient.findOrganizeIdByMember(clueQueryCriteria.getMemberId()).getBody(); //如果查询的小组id不为空 ,说明是组长并有权限查看组员信息 if (CollUtil.isNotEmpty(userIds)) { -// clueQueryCriteria.setOrganizeId(organizeId); clueQueryCriteria.setUserIdList(userIds); clueQueryCriteria.setMemberId(null); } @@ -614,14 +614,14 @@ public class ClueServiceImpl implements ClueService { @Override public Integer queryClueByAdmin(Long memberId) { //有意向的阶段 3:已加微信 4:高意向 5:邀约中 6:到场 - List stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(),ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey()); + List 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); } @Override public Integer countClueByTaskId(Long taskId, String beginTime, String endTime) { //有意向的阶段 3:已加微信 4:高意向 5:邀约中 6:到场 - List stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(),ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey()); + List 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); } @@ -636,6 +636,7 @@ public class ClueServiceImpl implements ClueService { if (dynamicTaskDto.getWhichUserId() == null) { throw new BadRequestException("添加失败"); } + dynamicTaskDto.setUserId(dynamicTaskDto.getWhichUserId()); TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria(); taskQueryCriteria.setCreateBy(dynamicTaskDto.getWhichUserId()); taskQueryCriteria.setIsForm(2); @@ -714,6 +715,55 @@ public class ClueServiceImpl implements ClueService { return CommonResponse.createBySuccess(list); } + @Override + public CommonResponse reportFunnel(ReportStageAndTurnoverDto reportDto) { + if (ObjectUtil.isNull(reportDto) || reportDto.getMemberId() == null) { + return CommonResponse.createByErrorMessage("查询人员为空"); + } + String startTime = reportDto.getStartTime(); + String endTime = reportDto.getEndTime(); + List 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 reportMap = getReportMap(clueMiddles); +// List 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 countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) {