From 7d4f41d4a38aa6add2ff86f8faca547f68667c4c Mon Sep 17 00:00:00 2001 From: wujingtao Date: Fri, 12 Aug 2022 16:20:08 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E6=A0=87=E7=AD=BE=202.?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=BA=BF=E7=B4=A2=E5=85=AC=E6=B5=B7=203.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A1=A5=E5=85=85=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/baiye/model/dto/ClueDto.java | 3 +- .../baiye/model/dto/ClueQueryCriteria.java | 1 + .../baiye/model/dto/PublicCluePoolDto.java | 46 ++++++ .../dto/PublicCluePoolQueryCriteria.java | 22 +++ .../java/com/baiye/model/dto/UserDto.java | 2 + .../baiye/model/entity/BaseClueMiddle.java | 8 +- .../com/baiye/feign/SourceClueClient.java | 12 +- .../baiye/feign/SourceClueClientFallback.java | 10 ++ .../modules/report/api/ReportController.java | 14 +- .../report/entity/vo/MemberInfoVO.java | 3 + .../report/service/QueryReportService.java | 9 + .../service/impl/QueryReportServiceImpl.java | 102 ++++++++++-- .../modules/system/rest/UserController.java | 6 + .../modules/system/service/UserService.java | 29 +++- .../system/service/impl/UserServiceImpl.java | 10 +- .../main/java/com/baiye/feign/UserClient.java | 5 + .../feign/fallback/UserClientFallback.java | 7 + .../module/controller/ClueController.java | 18 +- .../controller/PublicCluePoolController.java | 64 ++++++++ .../java/com/baiye/module/dao/ClueJpa.java | 151 +++++++++++++---- .../module/dao/ClueMiddleRepository.java | 44 +++++ .../module/dao/ConductRecordRepository.java | 7 + .../module/dao/PublicCluePoolRepository.java | 33 ++++ .../dao/PublicPoolConfigureRepository.java | 20 +++ .../java/com/baiye/module/entity/Clue.java | 4 + .../com/baiye/module/entity/ClueMiddle.java | 5 + .../baiye/module/entity/PublicCluePool.java | 54 ++++++ .../module/entity/PublicPoolConfigure.java | 66 ++++++++ .../com/baiye/module/entity/vo/TaskZdyVo.java | 3 + .../com/baiye/module/entity/vo/ZdyVo.java | 3 + .../com/baiye/module/service/ClueService.java | 26 +++ .../module/service/PublicCluePoolService.java | 41 +++++ .../module/service/impl/ClueServiceImpl.java | 52 ++++-- .../impl/PublicCluePoolServiceImpl.java | 135 +++++++++++++++ .../com/baiye/task/PublicCluePoolSync.java | 155 ++++++++++++++++++ .../main/java/com/baiye/util/TestingUtil.java | 6 +- 36 files changed, 1102 insertions(+), 74 deletions(-) create mode 100644 ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java create mode 100644 ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolQueryCriteria.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicCluePoolRepository.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicPoolConfigureRepository.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicCluePool.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicPoolConfigure.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java create mode 100644 services/ad-platform-source/src/main/java/com/baiye/task/PublicCluePoolSync.java diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java index 6b91c8fb..ebf6fae9 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java @@ -117,5 +117,6 @@ public class ClueDto implements Serializable { @ApiModelProperty(value = "添加微信状态 -2已添加未通过 -1未添加 0已添加 1已通过 ") private Integer addWeChatStatus; - + @ApiModelProperty(value = "线索标识") + private String tag; } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueQueryCriteria.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueQueryCriteria.java index 34b53364..9d7544df 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueQueryCriteria.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueQueryCriteria.java @@ -67,4 +67,5 @@ public class ClueQueryCriteria { @ApiModelProperty(value = "线索阶段:0:新线索 1:待沟通 2:有意向 3:已加微信 4:无意向") private Integer clueStage; + } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java new file mode 100644 index 00000000..7222b041 --- /dev/null +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java @@ -0,0 +1,46 @@ +package com.baiye.model.dto; + +import com.baiye.util.JpaConverterListJson; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; + +import javax.persistence.Convert; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author wjt + * @date 2022/08/10 + */ +@Data +public class PublicCluePoolDto implements Serializable { + + private static final long serialVersionUID = -5088918906455840794L; + private Long ClueId; + private String ClueName; + @ApiModelProperty(value = "线索阶段:0:新线索 1:待沟通 2:有意向 3:已加微信 4:无意向") + private Integer clueStage; + + @ApiModelProperty(value = "线索通话状态:0:无状态 1:未接听 2:已接通") + private Integer clueCallStatus; + + @ApiModelProperty(value = "上次跟进组员id") + private Long memberId; + @ApiModelProperty(value = "上次跟进组员名") + private String memberName; + + @ApiModelProperty(value = "组员跟进状态 0:无状态 1:进行中 2:已完成") + private Integer memberStatus; + + private Object sourceLabel; + + @ApiModelProperty(value = "创建时间") + @CreationTimestamp + private Date createTime; + + @ApiModelProperty(value = "线索最新通话时间") + private Date newestCallTime; + +} diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolQueryCriteria.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolQueryCriteria.java new file mode 100644 index 00000000..b00ee94b --- /dev/null +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolQueryCriteria.java @@ -0,0 +1,22 @@ +package com.baiye.model.dto; + +import com.baiye.annotation.Query; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author wjt + * @date 2022/08/04 + */ +@Data +public class PublicCluePoolQueryCriteria { + + @Query + @NotNull + private Long companyId; + + @Query + private Long clueId; + +} diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java index e04cc6eb..03982575 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java @@ -73,6 +73,8 @@ public class UserDto extends BaseDTO implements Serializable { private Integer companyStatus; + private Long organizeId; + private String organizeName; private Double userBalance; 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 acc58137..0c0f8edd 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 @@ -31,7 +31,9 @@ public class BaseClueMiddle implements Serializable { @ApiModelProperty(value = "线索阶段:0:新线索 1:待沟通 2:有意向 3:已加微信 4:无意向") @Column(name = "clue_stage") private Integer clueStage; - + @ApiModelProperty(value = "线索阶段修改时间") + @Column(name = "clue_stage_time") + private Date clueStageTime; @ApiModelProperty(value = "线索通话状态:0:无状态 1:未接听 2:已接通") @Column(name = "clue_call_status") private Integer clueCallStatus; @@ -72,4 +74,8 @@ public class BaseClueMiddle implements Serializable { @NotNull(message = "版本号不能为空") @Column(name = "optimistic_version") private Integer optimisticVersion; + + @ApiModelProperty(value = "是否移入到公海") + @Column(name = "public_pool_status") + private Integer publicPoolStatus; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java index c47a1b89..39cd3994 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java @@ -9,6 +9,7 @@ import com.baiye.modules.system.service.dto.ClueMiddleTo; import com.baiye.modules.telemarkting.entity.ClueMiddle; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -56,7 +57,7 @@ public interface SourceClueClient { ResponseEntity queryDetails(@RequestParam("clueId") Long clueId); @ApiOperation("查询资源标签") - @PostMapping(API_PREFIX+"/findSourceLabel") + @PostMapping(API_PREFIX + "/findSourceLabel") ResponseEntity> findSourceLabel(@RequestBody List clueIds); @ApiOperation("资源是否分配到此人") @@ -70,5 +71,14 @@ public interface SourceClueClient { @ApiOperation("更新资源信息") @PostMapping(API_PREFIX + "/update") CommonResponse update(@RequestBody ClueMiddle clueMiddle); + + @ApiOperation("查询有意向的线索") + @GetMapping(API_PREFIX + "/queryClueByCondition") + ResponseEntity> queryClueByCondition(@RequestParam(value = "startTime") String startTime, + @RequestParam(value = "endTime") String endTime, + @RequestParam(value = "memberId") Long memberId); + @ApiOperation("管理员获取当日所有意向数据") + @GetMapping(API_PREFIX+"/queryClueByAdmin") + CommonResponse queryClueByAdmin(@RequestParam(value = "memberId") Long memberId) ; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java index 2b60808e..e21ecc00 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java @@ -73,4 +73,14 @@ public class SourceClueClientFallback implements SourceClueClient { return null; } + @Override + public ResponseEntity> queryClueByCondition(String startTime, String endTime, Long memberId) { + return null; + } + + @Override + public CommonResponse queryClueByAdmin(Long memberId) { + return null; + } + } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/api/ReportController.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/api/ReportController.java index 6fe1bb06..688bbcd4 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/api/ReportController.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/api/ReportController.java @@ -67,10 +67,18 @@ public class ReportController { @GetMapping("/report/member") @ApiOperation("获取单个成员统计信息") - public CommonResponse getMemberReport(String beginTime, String endTime, Long memberId) { - return queryReportService.getMemberReport(beginTime, endTime, memberId); + public CommonResponse getMemberReport(String beginTime, String endTime) { + Long currentUserId = SecurityUtils.getCurrentUserId(); +// Long currentUserId = 68L; + return queryReportService.getMemberReport(beginTime, endTime, currentUserId); + } + @GetMapping("/report/member/month") + @ApiOperation("获取单个成员近30天的统计信息") + public CommonResponse getMemberReportByMonth() { +// Long currentUserId = 68L; + Long currentUserId = SecurityUtils.getCurrentUserId(); + return queryReportService.getMemberReportByMonth( currentUserId); } - @GetMapping("/download/member") @ApiOperation("导出单个成员统计信息") public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) { diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java index b6471337..cc8591e9 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java @@ -70,6 +70,9 @@ public class MemberInfoVO { @ExcelProperty(value = "平均通话时长(秒)", index = 7) private Double breatheAverageDuration; +// @ExcelProperty(value = "意向数", index = 8) +@ExcelIgnore + private Integer intentionNum; /** * 平均时长 */ diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/QueryReportService.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/QueryReportService.java index 900242b5..8a3447b6 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/QueryReportService.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/QueryReportService.java @@ -63,6 +63,14 @@ public interface QueryReportService { */ CommonResponse getMemberReport(String beginTime, String endTime, Long memberId); + /** + * 获取成员近一个月接通信息 + * + * @param memberId + * @return + */ + CommonResponse getMemberReportByMonth(Long memberId); + /** * 导出成员统计 * @@ -92,6 +100,7 @@ public interface QueryReportService { /** * 导出线索的通话记录详情 + * * @param response * @param clueId */ diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java index a0913466..3e065637 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java @@ -3,6 +3,7 @@ package com.baiye.modules.report.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; @@ -38,6 +39,7 @@ import com.baiye.modules.telemarkting.dao.AllCallInfoRepository; import com.baiye.modules.telemarkting.dao.CallClueRepository; import com.baiye.modules.telemarkting.entity.AllCallInfo; import com.baiye.modules.telemarkting.entity.CallClueInfo; +import com.baiye.modules.telemarkting.entity.ClueMiddle; import com.baiye.timed.ReportSync; import com.baiye.util.DateTimeUtil; import com.baiye.util.ExportExcelUtil; @@ -85,6 +87,9 @@ public class QueryReportServiceImpl implements QueryReportService { List callClueInfos = callClueRepository.queryAllByTimeAndCompanyId(beginOfDay, endOfDay, companyId); //对查询的数据进行处理 MemberInfoVO messageInfo = getMessageInfo(beginOfDay, endOfDay, callClueInfos); + //加入管理员查看当日的意向数 + Integer data = sourceClueClient.queryClueByAdmin(SecurityUtils.getCurrentUserId()).getData(); + messageInfo.setIntentionNum(data); return CommonResponse.createBySuccess(messageInfo); } @@ -220,7 +225,7 @@ public class QueryReportServiceImpl implements QueryReportService { List allCallInfos = allCallInfoRepository.selectClueByTaskId(id); //以线索id分组 Map> map = new HashMap<>(16); - allCallInfos.stream().collect(Collectors.groupingBy(AllCallInfo::getClueId, Collectors.toList())).forEach(map::put); + map.putAll(allCallInfos.stream().collect(Collectors.groupingBy(AllCallInfo::getClueId, Collectors.toList()))); //提取线索id List clueIds = allCallInfos.stream().map(AllCallInfo::getClueId).collect(Collectors.toList()); @@ -396,21 +401,24 @@ public class QueryReportServiceImpl implements QueryReportService { @Override public CommonResponse getMemberReport(String beginTime, String endTime, Long memberId) { - if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { - beginTime = DateUtil.today(); - endTime = DateUtil.today(); - } if (memberId == null) { log.error("成员id为空"); return CommonResponse.createByErrorMessage("成员id为空"); } - List userReports = userReportRepository.queryAllByTimeAndId(beginTime, endTime, memberId); - // TODO: 2022/5/6 0006 这里将统计今日的数据 + List userReports = new ArrayList<>(); + if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { + beginTime = DateUtil.beginOfDay(DateUtil.date()).toString(); + endTime = DateUtil.date().toString(); + } else { + userReports = userReportRepository.queryAllByTimeAndId(beginTime, endTime, memberId); + } + + // 这里统计的今日的实时数据 boolean betweenDays = DateTimeUtil.betweenByDay(DateUtil.date(), DateUtil.parseDate(endTime)); if (betweenDays) { - List callClueInfos = callClueRepository.queryAllByTimeAndMemberId(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.date().toString(), memberId); - List list = reportSync.autoCountReportByUser(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.date().toString(), callClueInfos); + List callClueInfos = callClueRepository.queryAllByTimeAndMemberId(beginTime, endTime, memberId); + List list = reportSync.autoCountReportByUser(beginTime, endTime, callClueInfos); if (CollUtil.isEmpty(userReports)) { userReports = list; } else { @@ -418,7 +426,7 @@ public class QueryReportServiceImpl implements QueryReportService { } } - Map map = new HashMap<>(); + Map map = new HashMap<>(2); //合并同一个人的线索数据 for (UserReport info : userReports) { if (map.containsKey(info.getMemberId())) { @@ -440,9 +448,83 @@ public class QueryReportServiceImpl implements QueryReportService { break; } } + //用户意向客户数 + List clueMiddles = sourceClueClient.queryClueByCondition(beginTime, endTime, memberId).getBody(); + if (CollUtil.isNotEmpty(clueMiddles) && clueMiddles != null) { + memberInfoVO.setIntentionNum(clueMiddles.size()); + } else { + memberInfoVO.setIntentionNum(0); + } return CommonResponse.createBySuccess(memberInfoVO); } + /** + * 查询用户一个月的数据 + * + * @param memberId + * @return + */ + @Override + public CommonResponse getMemberReportByMonth(Long memberId) { + + if (memberId == null) { + log.error("成员id为空"); + return CommonResponse.createByErrorMessage("成员id为空"); + } + String endTime = DateUtil.yesterday().toString(); + String beginTime = DateUtil.offsetDay(DateUtil.yesterday(), -30).toString(); + + List userReports = userReportRepository.queryAllByTimeAndId(beginTime, endTime, memberId); + //用户意向客户 + List clueMiddles = sourceClueClient.queryClueByCondition(beginTime, endTime, memberId).getBody(); + //按时间分组 + List> mapByTime = getMapByTime(beginTime, endTime); + for (Map map : mapByTime) { + String time = String.valueOf(map.get("time")); + for (UserReport userReport : userReports) { + if (time.equals(DateUtil.format(userReport.getCreateTime(), "yyyy-MM-dd"))) { + map.put("usrNum", userReport.getUsrNum()); + map.put("turnOnNum", userReport.getTurnOnNum()); + } + } + int intentionNum = 0; + if (clueMiddles != null && clueMiddles.size() > 0) { + for (ClueMiddle clueMiddle : clueMiddles) { + String clueStageTime = DateUtil.format(clueMiddle.getClueStageTime(), "yyyy-MM-dd"); + if (time.equals(clueStageTime)) { + intentionNum += 1; + } + } + } + map.put("intentionNum", intentionNum); + } + return CommonResponse.createBySuccess(mapByTime); + } + + /** + * 以一个月每天的时间做key + * + * @param beginTime + * @param endTime + * @return + */ + private List> getMapByTime(String beginTime, String endTime) { + Date begin = DateUtil.parse(beginTime); + Date end = DateUtil.parse(endTime); + long betweenDay = DateUtil.between(begin, end, DateUnit.DAY); + List> list = new ArrayList<>(); + for (int i = 0; i <= betweenDay; i++) { + String time = DateUtil.format(DateUtil.offsetDay(begin, i), "yyyy-MM-dd"); + Map map = new LinkedHashMap<>(2); + map.put("time", time); + map.put("usrNum", 0); + map.put("turnOnNum", 0); + map.put("intentionNum", 0); + list.add(map); + } + return list; + } + @Override public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) { if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/UserController.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/UserController.java index 580a488e..dbf2bd32 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/UserController.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/UserController.java @@ -236,6 +236,12 @@ public class UserController { return userService.queryName(userIds); } + @GetMapping("/info/id") + @ApiOperation("用户id查询") + public UserDto findUserInfo(@RequestParam("userId") Long userId) { + return userService.findUserInfo(userId); + } + /** * 获取指定用户是否开启审核资源文件权限 * diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java index fd916472..bfbfeb4d 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java @@ -51,12 +51,13 @@ public interface UserService { * 新增用户 * * @param resources / - * @return / + * @return / */ User create(User resources); /** * 编辑用户 + * * @param resources / * @throws Exception */ @@ -144,12 +145,14 @@ public interface UserService { /** * 查询所有启用id + * * @return */ List queryAllUserIds(); /** * 管理员查询所有列表 + * * @param managerId * @return */ @@ -157,6 +160,7 @@ public interface UserService { /** * 角色查询用户 + * * @param roleId * @return */ @@ -164,16 +168,18 @@ public interface UserService { /** * 创建用户 + * * @param file * @param companyId * @param userDto * @return * @throws IOException */ - Boolean fileCreateUser(List file, Long companyId, UserDto userDto) ; + Boolean fileCreateUser(List file, Long companyId, UserDto userDto); /** * 查询用户树状图 + * * @param criteria * @param pageable * @return @@ -182,6 +188,7 @@ public interface UserService { /** * 公司id修改账户状态 + * * @param flag * @param ids */ @@ -189,6 +196,7 @@ public interface UserService { /** * 公司删除用户 + * * @param companyId * @return */ @@ -196,33 +204,46 @@ public interface UserService { /** * 创建用户 + * * @param userDTO */ void createUserOrFile(CreateUserDTO userDTO); /** * 批量开通用户过期时间 + * * @param orderDtoList */ void updateUserExpirationTime(List orderDtoList); /** * 过期时间查找 - * @return + * * @param date * @param flag + * @return */ List findUserByExpirationTime(DateTime date, Boolean flag); /** * 获取指定用户昵称 + * * @param userIds * @return */ Map queryName(Set userIds); + /** + * 查询用户信息 + * + * @param userId + * @return + */ + UserDto findUserInfo(Long userId); + /** * 获取指定用户是否开启审核资源文件权限 + * * @param userId * @return */ @@ -230,6 +251,7 @@ public interface UserService { /** * 购买套餐 + * * @param buyComboDTO 请求参数 */ void buyPackage(BuyComboDTO buyComboDTO); @@ -237,6 +259,7 @@ public interface UserService { /** * 修改用户过期时间 + * * @param userId * @param newDate */ diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java index 1c99796d..83a79381 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java @@ -253,6 +253,13 @@ public class UserServiceImpl implements UserService { return map; } + @Override + public UserDto findUserInfo(Long userId) { + User user = userRepository.findById(userId).orElseGet(User::new); + ValidationUtil.isNull(user.getId(), "User", "id", userId); + return userMapper.toDto(user); + } + @Override public Boolean findIsReview(Long userId) { Boolean isReview = null; @@ -340,7 +347,6 @@ public class UserServiceImpl implements UserService { } - @Override @Transactional(rollbackFor = Exception.class) public void update(User resources) throws Exception { @@ -457,7 +463,7 @@ public class UserServiceImpl implements UserService { convert.setOrganizeName(organize.getOrganizeName()); } - Boolean addWeChatFlag = payTemplateUserService.findAddWeChatFlagByUserId(convert.getId()); + Boolean addWeChatFlag = payTemplateUserService.findAddWeChatFlagByUserId(convert.getId()); convert.setAddWeChatFlag(addWeChatFlag); convert.setOnlineStatus(weChatUserService.isOnlineByWechat(convert.getId())); for (Role role : roles) { diff --git a/services/ad-platform-source/src/main/java/com/baiye/feign/UserClient.java b/services/ad-platform-source/src/main/java/com/baiye/feign/UserClient.java index 87f1d41c..43e41794 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/feign/UserClient.java +++ b/services/ad-platform-source/src/main/java/com/baiye/feign/UserClient.java @@ -1,6 +1,7 @@ package com.baiye.feign; import com.baiye.feign.fallback.UserClientFallback; +import com.baiye.model.dto.UserDto; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -33,4 +34,8 @@ public interface UserClient { @GetMapping(PAY_PREFIX + "/info/findIsReview") @ApiOperation("用户id查询") Boolean findIsReview(@RequestParam("userId") Long userId); + + @GetMapping(PAY_PREFIX + "/info/id") + @ApiOperation("用户id查询") + UserDto findUserInfo(@RequestParam("userId") Long userId); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/feign/fallback/UserClientFallback.java b/services/ad-platform-source/src/main/java/com/baiye/feign/fallback/UserClientFallback.java index 7fba0249..4f76d21a 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/feign/fallback/UserClientFallback.java +++ b/services/ad-platform-source/src/main/java/com/baiye/feign/fallback/UserClientFallback.java @@ -1,6 +1,8 @@ package com.baiye.feign.fallback; import com.baiye.feign.UserClient; +import com.baiye.model.dto.UserDto; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import java.util.Map; @@ -17,4 +19,9 @@ public class UserClientFallback implements UserClient { public Boolean findIsReview(Long userId) { return null; } + + @Override + public UserDto findUserInfo(Long userId) { + return null; + } } 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 98ecb560..912e152b 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 @@ -5,6 +5,7 @@ import com.baiye.http.ResponseCode; import com.baiye.model.dto.ClueDto; import com.baiye.model.dto.ClueQueryCriteria; import com.baiye.model.dto.DistributeResponseDTO; +import com.baiye.model.dto.PublicCluePoolQueryCriteria; import com.baiye.model.vo.ResSourceLabel; import com.baiye.module.entity.Clue; import com.baiye.module.entity.ClueMiddle; @@ -134,7 +135,7 @@ public class ClueController { @ApiOperation("资源是否分配到此人") @GetMapping("/judgeMember") - public ResponseEntity judgeMember(@RequestParam("judgeMemberId") Long judgeMemberId){ + public ResponseEntity judgeMember(@RequestParam("judgeMemberId") Long judgeMemberId) { return new ResponseEntity<>(clueService.judgeMember(judgeMemberId), HttpStatus.OK); } @@ -159,8 +160,21 @@ public class ClueController { @ApiOperation("查询管理员下(本公司内)所有资源,资源公海") @GetMapping("/findCompanyClue") - public ResponseEntity findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable){ + public ResponseEntity findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable) { return new ResponseEntity<>(clueService.findCompanyClue(clueQueryCriteria, pageable), HttpStatus.OK); } + @ApiOperation("查询有意向的线索") + @GetMapping("/queryClueByCondition") + public ResponseEntity> queryClueByCondition(@RequestParam(value = "startTime", required = false) String startTime, + @RequestParam(value = "endTime", required = false) String endTime, + @RequestParam(value = "memberId") Long memberId) { + return new ResponseEntity<>(clueService.queryClueByCondition(startTime, endTime, memberId), HttpStatus.OK); + } + + @ApiOperation("管理员获取当日所有意向数据") + @GetMapping("/queryClueByAdmin") + public CommonResponse queryClueByAdmin(@RequestParam(value = "memberId") Long memberId) { + return CommonResponse.createBySuccess(clueService.queryClueByAdmin(memberId)); + } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java new file mode 100644 index 00000000..c4de9ce4 --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java @@ -0,0 +1,64 @@ +package com.baiye.module.controller; + +import com.baiye.http.CommonResponse; +import com.baiye.model.dto.PublicCluePoolQueryCriteria; +import com.baiye.module.entity.PublicPoolConfigure; +import com.baiye.module.service.PublicCluePoolService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * @author wjt + * @date 2022/08/04 + */ +@RequiredArgsConstructor +@RestController +@Api(tags = "资源管理") +@RequestMapping("/source/clue") +@Slf4j +public class PublicCluePoolController { + private final PublicCluePoolService publicCluePoolService; + + @ApiOperation("查询公共的资源池") + @GetMapping("/publicCluePool") + public ResponseEntity queryPublicCluePool(@Validated PublicCluePoolQueryCriteria publicCluePoolQueryCriteria, Pageable pageable) { + return new ResponseEntity<>(publicCluePoolService.queryPublicCluePool(publicCluePoolQueryCriteria, pageable), HttpStatus.OK); + } + + @ApiOperation("手动回收线索到公海") + @GetMapping("/recycle") + public ResponseEntity recyclePublicPool(@RequestParam(value = "clueId") Long clueId, + @RequestParam(value = "companyId") Long companyId) { + publicCluePoolService.recyclePublicPool(clueId, companyId); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation("公海里领取线索") + @GetMapping("/receive") + public ResponseEntity receiveClue(@RequestParam(value = "clueId") Long clueId, + @RequestParam(value = "memberId") Long memberId + ) { + publicCluePoolService.receiveClue(clueId, memberId); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation("公海回收条件配置") + @PostMapping("/pool/configure") + public ResponseEntity publicPoolConfigure(@Validated @RequestBody PublicPoolConfigure publicPoolConfigure) { + publicCluePoolService.publicPoolConfigure(publicPoolConfigure); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation("查询公海配置") + @GetMapping("/pool/query") + public CommonResponse queryPoolConfigure(@RequestParam("companyId") Long companyId) { + return CommonResponse.createBySuccess(publicCluePoolService.queryPoolConfigure(companyId)); + } +} 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 23c650b1..36d8423e 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 @@ -9,6 +9,8 @@ import com.baiye.exception.BadRequestException; import com.baiye.feign.OrganizeClient; import com.baiye.model.dto.ClueDto; import com.baiye.model.dto.ClueQueryCriteria; +import com.baiye.model.dto.PublicCluePoolDto; +import com.baiye.model.dto.PublicCluePoolQueryCriteria; import com.baiye.model.vo.ResSourceLabel; import com.baiye.module.entity.Clue; import com.baiye.util.AESUtils; @@ -54,7 +56,7 @@ public class ClueJpa { public List getClueList(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,cm.remark as remark,cm.member_status as memberStatus,cm.organize_id as organizeId,cm.member_id as memberId," + + "c.create_time as createTime,c.amount as amount,c.platform as platform,c.tag as tag,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 " + "from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 "); @@ -105,16 +107,16 @@ public class ClueJpa { if (clueQueryCriteria.getMemberStatus() != null) { sql.append("and cm.member_status = :memberStatus "); } - if (clueQueryCriteria.getLabel() != null){ + if (clueQueryCriteria.getLabel() != null) { sql.append("and cm.source_label like :sourceLabel "); } - if (clueQueryCriteria.getClueCallStatus() != null){ + if (clueQueryCriteria.getClueCallStatus() != null) { sql.append("and cm.clue_call_status = :clueCallStatus "); } - if (clueQueryCriteria.getClueStage() != null){ + if (clueQueryCriteria.getClueStage() != null) { sql.append("and cm.clue_stage = :clueStage "); } - if (newestCallTimeList != null && newestCallTimeList.size() == 2){ + if (newestCallTimeList != null && newestCallTimeList.size() == 2) { sql.append("and cm.newest_call_time between :createTimeBegin and :createTimeEnd "); } //拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格) @@ -139,20 +141,20 @@ public class ClueJpa { if (clueQueryCriteria.getMemberStatus() != null) { query.setParameter("memberStatus", clueQueryCriteria.getMemberStatus()); } - if (clueQueryCriteria.getClueStage() != null){ + if (clueQueryCriteria.getClueStage() != null) { query.setParameter("clueStage", clueQueryCriteria.getClueStage()); } - if (clueQueryCriteria.getLabel() != null){ + if (clueQueryCriteria.getLabel() != null) { query.setParameter("sourceLabel", "%" + clueQueryCriteria.getLabel() + "%"); } - if (clueQueryCriteria.getClueCallStatus() != null){ + if (clueQueryCriteria.getClueCallStatus() != null) { query.setParameter("clueCallStatus", clueQueryCriteria.getClueCallStatus()); } - if (newestCallTimeList != null && newestCallTimeList.size() == 2){ + if (newestCallTimeList != null && newestCallTimeList.size() == 2) { String createTimeBegin = this.format.format(newestCallTimeList.get(0)); String createTimeEnd = this.format.format(newestCallTimeList.get(1)); - query.setParameter("createTimeBegin",createTimeBegin); - query.setParameter("createTimeEnd",createTimeEnd); + query.setParameter("createTimeBegin", createTimeBegin); + query.setParameter("createTimeEnd", createTimeEnd); } if (pageable != null) { query.setParameter("number", pageable.getPageNumber() * pageable.getPageSize()); @@ -214,7 +216,7 @@ public class ClueJpa { clueDto.setOrigin((Integer) row.get("origin")); clueDto.setCollectTime((Date) row.get("collectTime")); BigInteger organizeId = (BigInteger) row.get("organizeId"); - if (organizeId != null){ + if (organizeId != null) { clueDto.setOrganizeId(organizeId.longValue()); } BigInteger memberId = (BigInteger) row.get("memberId"); @@ -275,6 +277,7 @@ public class ClueJpa { Integer origin = clueQueryCriteria.getOrigin(); List createTimeList = clueQueryCriteria.getCreateTime(); Integer clueStage = clueQueryCriteria.getClueStage(); + List userIdList = clueQueryCriteria.getUserIdList(); StringBuilder sql = new StringBuilder(); sql.append("SELECT tc.id as id,tc.nid as nid,tc.create_time as createTime,tc.name as name,tc.origin as origin,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 " + @@ -284,24 +287,28 @@ public class ClueJpa { } if (pageable != null) { Integer memberStatus = clueQueryCriteria.getMemberStatus(); - if (memberStatus != null && memberStatus == 0){ + if (memberStatus != null && memberStatus == 0) { sql.append("AND tcm.member_id is null "); } - if (memberStatus != null && memberStatus > 0){ + if (memberStatus != null && memberStatus > 0) { sql.append("AND tcm.member_id is not null "); } - if (StringUtils.isNotBlank(name)){ + if (userIdList != null && userIdList.size() > 0) { + sql.append("and tcm.member_id in (:userIdList)"); + } + if (StringUtils.isNotBlank(name)) { sql.append("and tc.name like :name "); } if (origin != null) { sql.append("and tc.origin = :origin "); } - if (clueStage != null){ + if (clueStage != null) { sql.append("AND tcm.clue_stage = :clueStage "); } - if (createTimeList != null && createTimeList.size() == 2){ + if (createTimeList != null && createTimeList.size() == 2) { sql.append("and tc.create_time between :createTimeBegin and :createTimeEnd "); } + //拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格) sql.append("ORDER BY tc.create_time desc ,tc.id "); sql.append("LIMIT :number,:size "); @@ -314,17 +321,20 @@ public class ClueJpa { if (origin != null) { query.setParameter("origin", origin); } - if (clueStage != null){ + if (clueStage != null) { query.setParameter("clueStage", clueStage); } - if (StringUtils.isNotBlank(name)){ + if (StringUtils.isNotBlank(name)) { query.setParameter("name", "%" + name + "%"); } - if (createTimeList != null && createTimeList.size() == 2){ + if (createTimeList != null && createTimeList.size() == 2) { String createTimeBegin = this.format.format(createTimeList.get(0)); String createTimeEnd = this.format.format(createTimeList.get(1)); - query.setParameter("createTimeBegin",createTimeBegin); - query.setParameter("createTimeEnd",createTimeEnd); + query.setParameter("createTimeBegin", createTimeBegin); + query.setParameter("createTimeEnd", createTimeEnd); + } + if (userIdList != null && userIdList.size() > 0) { + query.setParameter("userIdList", userIdList); } query.setParameter("number", pageable.getPageNumber() * pageable.getPageSize()); query.setParameter("size", pageable.getPageSize()); @@ -352,7 +362,7 @@ public class ClueJpa { clue.setClueStage((Integer) row.get("clueStage")); clue.setClueCallStatus((Integer) row.get("clueCallStatus")); BigInteger memberId = (BigInteger) row.get("memberId"); - if (memberId != null){ + if (memberId != null) { clue.setMemberId(memberId.longValue()); } } @@ -373,19 +383,19 @@ public class ClueJpa { if (CollUtil.isNotEmpty(taskIds)) { sql.append("AND cm.task_id IN (:taskId) "); Integer memberStatus = clueQueryCriteria.getMemberStatus(); - if (memberStatus != null && memberStatus == 0){ + if (memberStatus != null && memberStatus == 0) { sql.append("AND cm.member_id is null "); } - if (memberStatus != null && memberStatus > 0){ + if (memberStatus != null && memberStatus > 0) { sql.append("AND cm.member_id is not null "); } - if (StringUtils.isNotBlank(name)){ + if (StringUtils.isNotBlank(name)) { sql.append("and c.name like :name "); } if (origin != null) { sql.append("and c.origin = :origin "); } - if (createTimeList != null && createTimeList.size() == 2){ + if (createTimeList != null && createTimeList.size() == 2) { sql.append("and c.create_time between :createTimeBegin and :createTimeEnd "); } } @@ -395,14 +405,14 @@ public class ClueJpa { if (origin != null) { query.setParameter("origin", origin); } - if (StringUtils.isNotBlank(name)){ + if (StringUtils.isNotBlank(name)) { query.setParameter("name", "%" + name + "%"); } - if (createTimeList != null && createTimeList.size() == 2){ + if (createTimeList != null && createTimeList.size() == 2) { String createTimeBegin = this.format.format(createTimeList.get(0)); String createTimeEnd = this.format.format(createTimeList.get(1)); - query.setParameter("createTimeBegin",createTimeBegin); - query.setParameter("createTimeEnd",createTimeEnd); + query.setParameter("createTimeBegin", createTimeBegin); + query.setParameter("createTimeEnd", createTimeEnd); } } query.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); @@ -415,4 +425,83 @@ public class ClueJpa { } return count; } + + /** + * 分页查询,不分页传null + */ + public List getCluePoolList(PublicCluePoolQueryCriteria publicCluePoolQueryCriteria, Pageable pageable) { + StringBuilder sql = new StringBuilder(); + sql.append("select p.clue_id as clueId,c.name as clueName,cm.clue_stage as clueStage ,cm.clue_call_status as clueCallStatus ," + + "p.member_id as memberId ,p.member_name as memberName ,cm.member_status as memberStatus ,cm.source_label as sourceLabel ," + + "p.create_time as createTime ,cm.newest_call_time as newestCallTime from tb_public_clue_pool as p left join tb_clue_middle as cm on p.clue_id=cm.clue_id " + + "left join tb_clue as c on c.id =p.clue_id where 1=1"); + List confirmReceipt = getCluePoolListCondition(publicCluePoolQueryCriteria, sql, pageable); + return getPoolClue(confirmReceipt); + } + + public Long getPoolCount(PublicCluePoolQueryCriteria clueQueryCriteria) { + StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_public_clue_pool as p left join tb_clue_middle as cm on p.clue_id=cm.clue_id where 1=1 "); + List confirmReceipt = getCluePoolListCondition(clueQueryCriteria, sql, null); + Long count = 0L; + for (Object obj : confirmReceipt) { + Map row = (Map) obj; + BigInteger countBig = (BigInteger) row.get("countNum"); + count = countBig.longValue(); + } + return count; + } + + /** + * 拼接sql条件查询(注意空格) + * + * @param pageable 不分页查询参数传输null + * @return + */ + @Transactional(rollbackOn = Exception.class) + public List getCluePoolListCondition(PublicCluePoolQueryCriteria clueQueryCriteria, StringBuilder sql, Pageable pageable) { + Long companyId = clueQueryCriteria.getCompanyId(); + sql.append(" and p.company_id = :companyId "); + //拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格) + sql.append("ORDER BY p.create_time desc "); + if (pageable != null) { + sql.append("LIMIT :number,:size "); + } + Query query = entityManager.createNativeQuery(sql.toString()); + query.setParameter("companyId", companyId); + + if (pageable != null) { + query.setParameter("number", pageable.getPageNumber() * pageable.getPageSize()); + query.setParameter("size", pageable.getPageSize()); + } + query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); + return query.getResultList(); + } + + /** + * 转换封装为Dto,key对应sql语句的as别名 + */ + private List getPoolClue(List list) { + List clueDtoList = new ArrayList<>(); + for (Object obj : list) { + Map row = (Map) obj; + PublicCluePoolDto clueDto = new PublicCluePoolDto(); + + BigInteger id = (BigInteger) row.get("clueId"); + clueDto.setClueId(id.longValue()); + + clueDto.setClueName((String) row.get("clueName")); + clueDto.setClueStage((Integer) row.get("clueStage")); + clueDto.setClueCallStatus((Integer) row.get("clueCallStatus")); + BigInteger memberId = (BigInteger) row.get("memberId"); + clueDto.setMemberId(memberId.longValue()); + clueDto.setMemberName((String) row.get("memberName")); + JSONArray sourceLabel = JSONUtil.parseArray(row.get("sourceLabel")); + clueDto.setSourceLabel(sourceLabel); + clueDto.setMemberStatus((Integer) row.get("memberStatus")); + clueDto.setCreateTime((Date) row.get("createTime")); + clueDto.setNewestCallTime((Date) row.get("newestCallTime")); + clueDtoList.add(clueDto); + } + return clueDtoList; + } } 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 58348e82..033788e1 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 @@ -1,5 +1,6 @@ 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; @@ -81,6 +82,7 @@ public interface ClueMiddleRepository extends JpaRepository, J /** * 查询组员 + * * @param taskId * @param organizeId * @return @@ -89,6 +91,7 @@ public interface ClueMiddleRepository extends JpaRepository, J /** * 查询版本号 + * * @param clueId * @return */ @@ -101,6 +104,7 @@ public interface ClueMiddleRepository extends JpaRepository, J /** * 查询任务总数 + * * @param taskId * @return */ @@ -116,12 +120,14 @@ public interface ClueMiddleRepository extends JpaRepository, J /** * 根据任务id批量查询 + * * @param taskIds */ List findByTaskIdIn(Set taskIds); /** * 删除所有任务相关 + * * @param taskIds */ void deleteByTaskIdIn(Set taskIds); @@ -132,4 +138,42 @@ public interface ClueMiddleRepository extends JpaRepository, J @Query(value = "select clue_id from tb_clue_middle where task_id = ?1", nativeQuery = true) Set findByTaskIdReturnClueId(Long taskId); + + /** + * 根据条件查询线索 + * + * @param startTime + * @param endTime + * @param memberId + * @param stages + * @return + */ + @Query(value = " select * from tb_clue_middle as t where t.clue_stage_time >= ?1 and t.clue_stage_time< ?2 and t.member_id =?3 and t.clue_stage in ?4", nativeQuery = true) + List queryClueByCondition(String startTime, String endTime, Long memberId, List stages); + + /** + * 查询当日所有有意向的数据 + * + * @param memberId + * @param time + * @param stages + * @return + */ + @Query(value = " select count(*) from tb_clue_middle as cm left join tb_task as t on cm.task_id=t.task_id where t.create_by =?1 and DATE_FORMAT( cm.clue_stage_time, '%Y-%m-%d') =?2 and cm.clue_stage in ?3", nativeQuery = true) + Integer queryClueByAdmin(Long memberId, String time, List stages); + + /** + * 根据时间 和公司查询所有未终结的线索 + * @param companyId + * @param time + * @param clueStage + * @return + */ + @Query(value = "select cm.* from tb_clue_middle as cm " + + "left join tb_clue as c on cm.clue_id =c.id " + + "left join tb_company as m on c.create_by=m.user_id " + + "where m.id=?1 and cm.create_time < ?2 and cm.clue_stage not in ?3 and cm.public_pool_status =0", nativeQuery = true) + List queryClueMiddleByClueStage(Long companyId, String time, List clueStage); + + } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ConductRecordRepository.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ConductRecordRepository.java index 789097fa..3c74f058 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ConductRecordRepository.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ConductRecordRepository.java @@ -12,4 +12,11 @@ import java.util.Set; public interface ConductRecordRepository extends JpaRepository, JpaSpecificationExecutor { List findByClueIdIn(Set clueIdList); + + /** + * 根据用户id查询记录 + * @param createBy + * @return + */ + List findConductRecordByCreateBy(Long createBy); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicCluePoolRepository.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicCluePoolRepository.java new file mode 100644 index 00000000..b835111a --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicCluePoolRepository.java @@ -0,0 +1,33 @@ +package com.baiye.module.dao; + +import com.baiye.module.entity.ConductRecord; +import com.baiye.module.entity.PublicCluePool; +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; + +/** + * @author wjt + * @date 2022/08/04 + */ +@Repository +public interface PublicCluePoolRepository extends JpaRepository, JpaSpecificationExecutor { + /** + * 根据状态获取公海线索 + * @param status + * @return + */ + List findAllByStatus(Boolean status); + + /** + * 修改状态 + * @param clueId + */ + @Modifying + @Query(value = " update tb_public_clue_pool set status = 1 where clue_id = ?1 ", nativeQuery = true) + void updateStatus(Long clueId); +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicPoolConfigureRepository.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicPoolConfigureRepository.java new file mode 100644 index 00000000..e18ed03a --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/PublicPoolConfigureRepository.java @@ -0,0 +1,20 @@ +package com.baiye.module.dao; + +import com.baiye.module.entity.PublicPoolConfigure; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; + +/** + * @author wjt + * @date 2022/08/05 + */ +@Repository +public interface PublicPoolConfigureRepository extends JpaRepository, JpaSpecificationExecutor { + /** + * 按公司查询公海配置 + * @param companyId + * @return + */ + PublicPoolConfigure findPublicPoolConfigureByCompanyId(Long companyId); +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java index 0f88ddad..3d5c6eec 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java @@ -51,4 +51,8 @@ public class Clue extends BaseClue { @ApiModelProperty(value = "线索分配人名称") @Transient private String distributeUserName; + + @ApiModelProperty(value = "标识") + @Transient + private String tag; } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/ClueMiddle.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/ClueMiddle.java index 3da9ea4f..085b129f 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/entity/ClueMiddle.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/ClueMiddle.java @@ -30,4 +30,9 @@ public class ClueMiddle extends BaseClueMiddle { @Column(name = "clue_id") @NotNull(message = "资源id不能为空") private Long clueId; + + @Transient + private String clueName; + @Transient + private String memberName; } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicCluePool.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicCluePool.java new file mode 100644 index 00000000..8bcbd9d8 --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicCluePool.java @@ -0,0 +1,54 @@ +package com.baiye.module.entity; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * @author wjt + * @date 2022/08/04 + */ +@Setter +@Getter +@Entity +@Table(name = "tb_public_clue_pool") +@EntityListeners(AuditingEntityListener.class) +public class PublicCluePool implements Serializable { + + private static final long serialVersionUID = 6750014883996523348L; + @Id + @Column(name = "clue_id", nullable = false) + @JsonSerialize(using = ToStringSerializer.class) + private Long clueId; + @ApiModelProperty(value = "状态 0-冷静期(不可用) 1-可用") + @Column(name = "status") + private Boolean status; + + @ApiModelProperty(value = "最后操作人id") + @Column(name = "member_id") + @JsonSerialize(using = ToStringSerializer.class) + private Long memberId; + + @ApiModelProperty(value = "最后操作人名称") + @Column(name = "member_name") + private String memberName; + + @ApiModelProperty(value = "创建时间") + @Column(name = "create_time") + @CreationTimestamp + private Date createTime; + + @ApiModelProperty(value = "公司id") + @Column(name = "company_id") + @JsonSerialize(using = ToStringSerializer.class) + private Long companyId; +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicPoolConfigure.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicPoolConfigure.java new file mode 100644 index 00000000..87a24039 --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/PublicPoolConfigure.java @@ -0,0 +1,66 @@ +package com.baiye.module.entity; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + * @author wjt + * @date 2022/08/05 + */ +@Setter +@Getter +@Entity +@Table(name = "tb_public_pool_configure") +@EntityListeners(AuditingEntityListener.class) +public class PublicPoolConfigure implements Serializable { + + private static final long serialVersionUID = -4464411698317483175L; + @Id + @ApiModelProperty(value = "主键id(自动递增)") + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + + @ApiModelProperty(value = "自动回收的 时长") + @Column(name = "recycle_number") + @NotNull + private Integer recycleNumber; + + @ApiModelProperty(value = "回收时长的单位 0-天 1-周 2-月") + @Column(name = "recycle_unit") + @NotNull + private String recycleUnit; + + @ApiModelProperty(value = "线索冷静的 时长") + @Column(name = "idle_number") + @NotNull + private Integer idleNumber; + + + @ApiModelProperty(value = "线索冷静时长的单位 0-时 1-天") + @Column(name = "idle_unit") + @NotNull + private String idleUnit; + + @ApiModelProperty(value = "创建时间") + @Column(name = "create_time") + @CreationTimestamp + private Date createTime; + + @ApiModelProperty(value = "公司id") + @Column(name = "company_id") + @JsonSerialize(using = ToStringSerializer.class) + @NotNull + private Long companyId; +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/TaskZdyVo.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/TaskZdyVo.java index e5541ade..54f26cdc 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/TaskZdyVo.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/TaskZdyVo.java @@ -37,4 +37,7 @@ public class TaskZdyVo { @ApiModelProperty(value = "金额") private String amount; + @ExcelProperty(value = "标识", index = 5) + @ApiModelProperty(value = "标识") + private String tag; } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/ZdyVo.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/ZdyVo.java index b8245ec7..1a38fef8 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/ZdyVo.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/vo/ZdyVo.java @@ -45,4 +45,7 @@ public class ZdyVo { @ApiModelProperty(value = "平台") private String platform; + @ExcelProperty(value = "标识",index = 7) + @ApiModelProperty(value = "标识") + private String tag; } 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 f21bbe98..a5339c55 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 @@ -12,6 +12,7 @@ import com.baiye.module.service.dto.ClueRecordCriteria; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -123,8 +124,10 @@ public interface ClueService { * @return */ Set findMemberIdList(ClueMiddle clueMiddle); + /** * 查询详情 + * * @param clueId * @return */ @@ -132,6 +135,7 @@ public interface ClueService { /** * 查询资源标签 + * * @param clueIds * @return */ @@ -139,6 +143,7 @@ public interface ClueService { /** * 资源是否分配到此人 + * * @param memberId * @return */ @@ -151,12 +156,14 @@ public interface ClueService { /** * 删除所有关联数据 + * * @param taskIds */ void delClueAll(Set taskIds); /** * 分页查询动态任务下资源 + * * @param clueQueryCriteria * @param pageable * @return @@ -165,6 +172,7 @@ public interface ClueService { /** * 撤回动态资源,返回无法撤回的手机号 + * * @param clueIds * @return */ @@ -172,9 +180,27 @@ public interface ClueService { /** * 查询管理员下(本公司内)所有资源,资源公海 + * * @param clueQueryCriteria * @param pageable * @return */ Object findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable); + + /** + * 查询有意向的线索 + * + * @param startTime + * @param endTime + * @param memberId + * @return + */ + List queryClueByCondition(String startTime, String endTime, Long memberId); + + /** + * 管理员获取当日意向数 + * @param memberId + * @return + */ + Integer queryClueByAdmin(Long memberId); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java new file mode 100644 index 00000000..f55f5a77 --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java @@ -0,0 +1,41 @@ +package com.baiye.module.service; + +import com.baiye.model.dto.PublicCluePoolQueryCriteria; +import com.baiye.module.dao.ClueMiddleRepository; +import com.baiye.module.entity.PublicCluePool; +import com.baiye.module.entity.PublicPoolConfigure; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.Map; + +/** + * @author wjt + * @date 2022/08/04 + */ +public interface PublicCluePoolService { + + + /** + * 分页查询公用资源池 + * + * @param publicCluePoolQueryCriteria + * @param pageable + * @return + */ + Map queryPublicCluePool(PublicCluePoolQueryCriteria publicCluePoolQueryCriteria, Pageable pageable); + + /** + * 手动回收资源 + * + * @param clueId + * @param companyId + */ + void recyclePublicPool(Long clueId, Long companyId); + + void receiveClue(Long clueId, Long memberId); + + void publicPoolConfigure(PublicPoolConfigure publicPoolConfigure); + + PublicPoolConfigure queryPoolConfigure(Long companyId); +} 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 a72922e2..9ad769c3 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.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @@ -55,7 +56,6 @@ public class ClueServiceImpl implements ClueService { private final WeChatAddFriendClient weChatAddFriendClient; - private static SimpleDateFormat timeOne = new SimpleDateFormat("yyyyMMddHHmmssSSS"); @Override @@ -64,11 +64,11 @@ public class ClueServiceImpl implements ClueService { if (clueList.size() > 0) { try { Iterator it = clueList.iterator(); - while(it.hasNext()){ + while (it.hasNext()) { Clue clue = it.next(); - if (StringUtils.isNotBlank(clue.getNid())){ + if (StringUtils.isNotBlank(clue.getNid())) { boolean bool = MobileUtil.checkPhone(clue.getNid()); - if (!bool){ + if (!bool) { it.remove(); } } @@ -158,7 +158,7 @@ public class ClueServiceImpl implements ClueService { } } } - return new ResponseEntity<>(null,HttpStatus.OK); + return new ResponseEntity<>(null, HttpStatus.OK); } /** @@ -173,24 +173,24 @@ public class ClueServiceImpl implements ClueService { Set clueIdList = clueDtoList.stream().map(ClueDto::getId).collect(Collectors.toSet()); List conductRecords = conductRecordRepository.findByClueIdIn(clueIdList); Map map = new HashMap<>(); - if (CollUtil.isNotEmpty(conductRecords)){ + if (CollUtil.isNotEmpty(conductRecords)) { List sortConductRecord = conductRecords.stream().sorted(Comparator.comparing(ConductRecord::getCreateTime)).collect(Collectors.toList()); for (ConductRecord conductRecord : sortConductRecord) { - map.put(conductRecord.getClueId(),conductRecord.getRecordInfo()); + map.put(conductRecord.getClueId(), conductRecord.getRecordInfo()); } } // 列表中查询标签信息 和 axb请求字段 for (ClueDto clueDto : clueDtoList) { String taskNameKey = "task:name:" + clueDto.getTaskId(); String str = (String) redisUtils.get(taskNameKey); - if (str.equals("null") || StringUtils.isBlank(str)) { + if ("null".equals(str) || StringUtils.isBlank(str)) { //设置空,取值判断空 clueDto.setIsRedis(1); Map> body = organizeClient.getLabel(clueDto).getBody(); str = body.get("taskName").get(0); } clueDto.setTaskName(str); - if (CollUtil.isNotEmpty(map) && map.containsKey(clueDto.getId())){ + if (CollUtil.isNotEmpty(map) && map.containsKey(clueDto.getId())) { clueDto.setClueRecord(map.get(clueDto.getId())); } } @@ -213,7 +213,7 @@ public class ClueServiceImpl implements ClueService { for (ClueDto clueDto : clueDtoList) { //查询分配人的用户名称 Long memberId = clueDto.getMemberId(); - if (memberId != null && userNickNameMap.containsKey(memberId)){ + if (memberId != null && userNickNameMap.containsKey(memberId)) { clueDto.setDistributeUserName(userNickNameMap.get(memberId)); } //循环查库,ID查询只一次循环 @@ -295,13 +295,14 @@ public class ClueServiceImpl implements ClueService { if (StringUtils.isNotBlank(clueMiddle.getRemark())) { clueMiddleOne.setRemark(clueMiddle.getRemark()); } - if (clueMiddle.getClueStage() != null){ + if (clueMiddle.getClueStage() != null) { clueMiddleOne.setClueStage(clueMiddle.getClueStage()); + clueMiddleOne.setClueStageTime(DateUtil.date()); } - if (clueMiddle.getClueCallStatus() != null){ + if (clueMiddle.getClueCallStatus() != null) { clueMiddleOne.setClueCallStatus(clueMiddle.getClueCallStatus()); } - if (clueMiddle.getNewestCallTime() != null){ + if (clueMiddle.getNewestCallTime() != null) { clueMiddleOne.setNewestCallTime(clueMiddle.getNewestCallTime()); } clueMiddleOne.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1); @@ -316,7 +317,7 @@ public class ClueServiceImpl implements ClueService { public void updateBatchMember(ClueQueryCriteria clueQueryCriteria) { List clueIdList = clueQueryCriteria.getClueIdList(); List userIdList = clueQueryCriteria.getUserIdList(); - if (CollUtil.isEmpty(clueIdList) || CollUtil.isEmpty(userIdList)){ + if (CollUtil.isEmpty(clueIdList) || CollUtil.isEmpty(userIdList)) { throw new BadRequestException("资源和指派人不能为空,请选择后重试"); } //Map>:用户id -> 资源ID集合 @@ -458,10 +459,10 @@ public class ClueServiceImpl implements ClueService { List list = reportClient.getTurnOnIds(clueIds).getData(); if (CollUtil.isNotEmpty(list)) { //过滤掉打过电话的线索ID - clueIds = clueIds.stream().filter(num -> !list.contains(num)) .collect(Collectors.toList()); + 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)){ + if (CollUtil.isNotEmpty(clueIds)) { List clueList = new ArrayList<>(); List clueAll = clueMiddleRepository.findAllById(clueIds); for (ClueMiddle clueMiddle : clueAll) { @@ -477,7 +478,7 @@ public class ClueServiceImpl implements ClueService { clueMiddleRepository.saveAll(clueList); } } - if (CollUtil.isNotEmpty(phoneList)){ + if (CollUtil.isNotEmpty(phoneList)) { String str = ""; for (String phone : phoneList) { str = str + phone + ","; @@ -498,6 +499,21 @@ public class ClueServiceImpl implements ClueService { return findClueList(taskQueryCriteria, clueQueryCriteria, pageable); } + @Override + public List queryClueByCondition(String startTime, String endTime, Long memberId) { + //有意向的阶段 + List stages = Arrays.asList(2, 3, 5, 6); + return clueMiddleRepository.queryClueByCondition(startTime, endTime, memberId, stages); + } + + @Override + public Integer queryClueByAdmin(Long memberId) { + + //有意向的阶段 + List stages = Arrays.asList(2, 3, 5, 6); + return clueMiddleRepository.queryClueByAdmin(memberId, DateUtil.today(), stages); + } + /** * 分页查询任务 * @@ -518,7 +534,7 @@ public class ClueServiceImpl implements ClueService { clue.setTaskName(str); //查询分配人的用户名称 Long memberId = clue.getMemberId(); - if (memberId != null && userNickNameMap.containsKey(memberId)){ + if (memberId != null && userNickNameMap.containsKey(memberId)) { clue.setDistributeUserName(userNickNameMap.get(memberId)); } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java new file mode 100644 index 00000000..1101e82d --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java @@ -0,0 +1,135 @@ +package com.baiye.module.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import com.baiye.exception.BadRequestException; +import com.baiye.feign.UserClient; +import com.baiye.model.dto.ClueDto; +import com.baiye.model.dto.PublicCluePoolDto; +import com.baiye.model.dto.PublicCluePoolQueryCriteria; +import com.baiye.model.dto.UserDto; +import com.baiye.module.dao.*; +import com.baiye.module.entity.*; +import com.baiye.module.service.PublicCluePoolService; +import com.baiye.util.PageUtil; +import com.baiye.util.QueryHelp; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author wjt + * @date 2022/08/04 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class PublicCluePoolServiceImpl implements PublicCluePoolService { + private final PublicCluePoolRepository publicCluePoolRepository; + private final ClueMiddleRepository clueMiddleRepository; + private final ConductRecordRepository conductRecordRepository; + private final ClueRepository clueRepository; + private final UserClient userClient; + private final ClueJpa clueJpa; + private final PublicPoolConfigureRepository publicPoolConfigureRepository; + + @Override + public Map queryPublicCluePool(PublicCluePoolQueryCriteria publicCluePoolQueryCriteria, Pageable pageable) { + + List cluePoolList = clueJpa.getCluePoolList(publicCluePoolQueryCriteria, pageable); + Long poolCount = clueJpa.getPoolCount(publicCluePoolQueryCriteria); + return PageUtil.toPage(cluePoolList, poolCount); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void recyclePublicPool(Long clueId, Long companyId) { + ClueMiddle clueMiddle = clueMiddleRepository.findById(clueId).orElseGet(ClueMiddle::new); + //加操作记录 + Set memberIds = new HashSet<>(); + memberIds.add(clueMiddle.getMemberId()); + Map userNickNameMap = userClient.findById(memberIds); + + //放入公海 + PublicCluePool publicCluePool = new PublicCluePool(); + publicCluePool.setClueId(clueId); + publicCluePool.setCompanyId(companyId); + publicCluePool.setMemberId(clueMiddle.getMemberId()); + publicCluePool.setMemberName(userNickNameMap.get(clueMiddle.getMemberId())); + publicCluePool.setStatus(false); + publicCluePoolRepository.save(publicCluePool); + + + ConductRecord conductRecord = new ConductRecord(); + conductRecord.setClueId(clueId); + conductRecord.setRecordInfo("移入公海"); + conductRecord.setName(userNickNameMap.get(clueMiddle.getMemberId())); + conductRecord.setCreateBy(clueMiddle.getMemberId()); + conductRecordRepository.save(conductRecord); + + //重置线索的所属人 + clueMiddle.setMemberId(null); + clueMiddle.setOrganizeId(null); + clueMiddle.setPublicPoolStatus(1); + clueMiddle.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1); + clueMiddleRepository.save(clueMiddle); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveClue(Long clueId, Long memberId) { + List conductRecords = conductRecordRepository.findConductRecordByCreateBy(memberId); + if (CollUtil.isNotEmpty(conductRecords)) { + throw new BadRequestException("已经跟进过此线索,无法领取"); + } + PublicCluePool publicCluePool = publicCluePoolRepository.findById(clueId).orElseGet(PublicCluePool::new); + if (!publicCluePool.getStatus()) { + throw new BadRequestException("未过公示期,无法领取"); + } + UserDto userInfo = userClient.findUserInfo(memberId); + //从公海移除 + publicCluePoolRepository.deleteById(clueId); + + //增加记录 + ConductRecord conductRecord = new ConductRecord(); + conductRecord.setClueId(clueId); + conductRecord.setRecordInfo("领取线索"); + conductRecord.setName(userInfo.getUsername()); + conductRecord.setCreateBy(memberId); + conductRecordRepository.save(conductRecord); + + //重置线索的所属人 + ClueMiddle clueMiddle = clueMiddleRepository.findById(clueId).orElseGet(ClueMiddle::new); + clueMiddle.setMemberId(memberId); + clueMiddle.setOrganizeId(userInfo.getOrganizeId()); + clueMiddle.setPublicPoolStatus(0); + clueMiddle.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1); + clueMiddleRepository.save(clueMiddle); + } + + @Override + public void publicPoolConfigure(PublicPoolConfigure publicPoolConfigure) { + if (publicPoolConfigure.getId() != null) { + PublicPoolConfigure publicPoolConfigure1 = publicPoolConfigureRepository.findById(publicPoolConfigure.getId()).orElseGet(PublicPoolConfigure::new); + BeanUtil.copyProperties(publicPoolConfigure, publicPoolConfigure1); + publicPoolConfigureRepository.save(publicPoolConfigure1); + } else { + publicPoolConfigureRepository.save(publicPoolConfigure); + } + } + + @Override + public PublicPoolConfigure queryPoolConfigure(Long companyId) { + return publicPoolConfigureRepository.findPublicPoolConfigureByCompanyId(companyId); + } +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/task/PublicCluePoolSync.java b/services/ad-platform-source/src/main/java/com/baiye/task/PublicCluePoolSync.java new file mode 100644 index 00000000..f3d3663b --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/task/PublicCluePoolSync.java @@ -0,0 +1,155 @@ +package com.baiye.task; + + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baiye.feign.UserClient; +import com.baiye.module.dao.ClueMiddleRepository; +import com.baiye.module.dao.ConductRecordRepository; +import com.baiye.module.dao.PublicCluePoolRepository; +import com.baiye.module.dao.PublicPoolConfigureRepository; +import com.baiye.module.entity.ClueMiddle; +import com.baiye.module.entity.ConductRecord; +import com.baiye.module.entity.PublicCluePool; +import com.baiye.module.entity.PublicPoolConfigure; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + + +/** + * @author wjt + * @date 2022/08/05 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class PublicCluePoolSync { + +// @Scheduled(cron = "0 0 23 * * ? ") + + private final PublicCluePoolRepository publicCluePoolRepository; + private final PublicPoolConfigureRepository publicPoolConfigureRepository; + + private final ClueMiddleRepository clueMiddleRepository; + private final ConductRecordRepository conductRecordRepository; + private final UserClient userClient; + + /** + * 每小时检测公海里的线索是否过了冷静期 + */ + @Scheduled(cron = "0 0 0/1 * * ?") + @Transactional(rollbackFor = Exception.class) + public void publicPoolIdleClue() { + List allByStatus = publicCluePoolRepository.findAllByStatus(false); + //按公司分组 + HashMap> map = new HashMap<>(allByStatus.stream().collect(Collectors.groupingBy(PublicCluePool::getCompanyId, Collectors.toList()))); + for (Long companyId : map.keySet()) { + //获取该公司设置的冷静期 + PublicPoolConfigure config = publicPoolConfigureRepository.findPublicPoolConfigureByCompanyId(companyId); + if (ObjectUtil.isNotNull(config)) { + int idleUnit = Integer.parseInt(config.getIdleUnit()); + Integer idleNumber = config.getIdleNumber(); + if (idleUnit == 0) { + //小时 + updateStatusByHour(map.get(companyId), idleNumber); + } else { + //天 + updateStatusByDay(map.get(companyId), idleNumber); + } + } + + } + } + + public void updateStatusByHour(List publicCluePools, Integer idleNumber) { + for (PublicCluePool publicCluePool : publicCluePools) { + Date createTime = publicCluePool.getCreateTime(); + DateTime dateTime = DateUtil.offsetHour(createTime, idleNumber); + int compare = DateUtil.compare(DateUtil.date(), dateTime); + if (compare > 0) { + publicCluePoolRepository.updateStatus(publicCluePool.getClueId()); + } + } + } + + public void updateStatusByDay(List publicCluePools, Integer idleNumber) { + for (PublicCluePool publicCluePool : publicCluePools) { + Date createTime = publicCluePool.getCreateTime(); + DateTime dateTime = DateUtil.offsetDay(createTime, idleNumber); + int compare = DateUtil.compare(DateUtil.date(), dateTime); + if (compare > 0) { + publicCluePoolRepository.updateStatus(publicCluePool.getClueId()); + } + } + } + + + /** + * 每天检测一次线索是否满足自动加入公海 + */ + // @Scheduled(cron = "0 0/1 * * * ? ") + @Scheduled(cron = "0 0 23 * * ? ") + @Transactional(rollbackFor = Exception.class) + public void publicPoolAutoExpired() { + + List clueStage = Arrays.asList(4, 7); + List all = publicPoolConfigureRepository.findAll(); + for (PublicPoolConfigure configure : all) { + Long companyId = configure.getCompanyId(); + int recycleNumber = configure.getRecycleNumber(); + int recycleUnit = Integer.parseInt(configure.getRecycleUnit()); + String time; + if (recycleUnit == 0) { + time = DateUtil.offsetDay(DateUtil.date(), -recycleNumber).toString(); + } else if (recycleUnit == 1) { + time = DateUtil.offsetWeek(DateUtil.date(), -recycleNumber).toString(); + } else { + time = DateUtil.offsetMonth(DateUtil.date(), -recycleNumber).toString(); + } + List clueMiddles = clueMiddleRepository.queryClueMiddleByClueStage(companyId, time, clueStage); + if (clueMiddles != null && clueMiddles.size() > 0) { + updateClueMiddle(clueMiddles, companyId); + } + } + } + + public void updateClueMiddle(List clueMiddles, Long companyId) { + for (ClueMiddle clueMiddle : clueMiddles) { + //加操作记录 + Set memberIds = new HashSet<>(); + memberIds.add(clueMiddle.getMemberId()); + Map userNickNameMap = userClient.findById(memberIds); + + //放入公海 + PublicCluePool publicCluePool = new PublicCluePool(); + publicCluePool.setClueId(clueMiddle.getClueId()); + publicCluePool.setCompanyId(companyId); + publicCluePool.setMemberId(clueMiddle.getMemberId()); + publicCluePool.setMemberName(userNickNameMap.get(clueMiddle.getMemberId())); + publicCluePool.setStatus(false); + publicCluePoolRepository.save(publicCluePool); + + + ConductRecord conductRecord = new ConductRecord(); + conductRecord.setClueId(clueMiddle.getClueId()); + conductRecord.setRecordInfo("移入公海"); + conductRecord.setName(userNickNameMap.get(clueMiddle.getMemberId())); + conductRecord.setCreateBy(clueMiddle.getMemberId()); + conductRecordRepository.save(conductRecord); + + //重置线索的所属人 + clueMiddle.setMemberId(null); + clueMiddle.setOrganizeId(null); + clueMiddle.setPublicPoolStatus(1); + clueMiddle.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1); + clueMiddleRepository.save(clueMiddle); + } + } +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/util/TestingUtil.java b/services/ad-platform-source/src/main/java/com/baiye/util/TestingUtil.java index 3a22c095..b0e174a7 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/util/TestingUtil.java +++ b/services/ad-platform-source/src/main/java/com/baiye/util/TestingUtil.java @@ -34,8 +34,9 @@ public class TestingUtil { String zdyCollectTime = String.valueOf(list.get(4)); String zdyAddress = String.valueOf(list.get(5)); String zdyPlatform = String.valueOf(list.get(6)); + String zdyTag = String.valueOf(list.get(7)); if (!(zdyName.equals("姓名") && zdyNid.equals("电话") && zdyWx.equals("微信") && zdyCollectTime.equals("日期(****/**/** 00:00:00)") - && zdyAddress.equals("线索归属地") && zdyAmount.equals("金额") && zdyPlatform.equals("平台"))) { + && zdyAddress.equals("线索归属地") && zdyAmount.equals("金额") && zdyPlatform.equals("平台") &&zdyTag.equals("标识"))) { log.info("======================自定义单内容格式不正确====================="); return false; } @@ -68,8 +69,9 @@ public class TestingUtil { String taskCollectTime = String.valueOf(list.get(2)); String taskPlatform = String.valueOf(list.get(3)); String taskAmount = String.valueOf(list.get(4)); + String tag=String.valueOf(list.get(5)); if (!(taskName.equals("姓名") && taskNid.equals("电话") && taskCollectTime.equals("日期(****/**/** 00:00:00)") && taskPlatform.equals("平台") - && taskAmount.equals("金额"))) { + && taskAmount.equals("金额")&&tag.equals("标识"))) { log.info("======================动态任务内容格式不正确====================="); return false; }