1.修改标签

2.加入线索公海
3.修改补充功能
master
wujingtao 2 years ago
parent 9f5b37c7a2
commit 7d4f41d4a3

@ -117,5 +117,6 @@ public class ClueDto implements Serializable {
@ApiModelProperty(value = "添加微信状态 -2已添加未通过 -1未添加 0已添加 1已通过 ") @ApiModelProperty(value = "添加微信状态 -2已添加未通过 -1未添加 0已添加 1已通过 ")
private Integer addWeChatStatus; private Integer addWeChatStatus;
@ApiModelProperty(value = "线索标识")
private String tag;
} }

@ -67,4 +67,5 @@ public class ClueQueryCriteria {
@ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向") @ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向")
private Integer clueStage; private Integer clueStage;
} }

@ -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;
}

@ -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;
}

@ -73,6 +73,8 @@ public class UserDto extends BaseDTO implements Serializable {
private Integer companyStatus; private Integer companyStatus;
private Long organizeId;
private String organizeName; private String organizeName;
private Double userBalance; private Double userBalance;

@ -31,7 +31,9 @@ public class BaseClueMiddle implements Serializable {
@ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向") @ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向")
@Column(name = "clue_stage") @Column(name = "clue_stage")
private Integer clueStage; private Integer clueStage;
@ApiModelProperty(value = "线索阶段修改时间")
@Column(name = "clue_stage_time")
private Date clueStageTime;
@ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通") @ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通")
@Column(name = "clue_call_status") @Column(name = "clue_call_status")
private Integer clueCallStatus; private Integer clueCallStatus;
@ -72,4 +74,8 @@ public class BaseClueMiddle implements Serializable {
@NotNull(message = "版本号不能为空") @NotNull(message = "版本号不能为空")
@Column(name = "optimistic_version") @Column(name = "optimistic_version")
private Integer optimisticVersion; private Integer optimisticVersion;
@ApiModelProperty(value = "是否移入到公海")
@Column(name = "public_pool_status")
private Integer publicPoolStatus;
} }

@ -9,6 +9,7 @@ import com.baiye.modules.system.service.dto.ClueMiddleTo;
import com.baiye.modules.telemarkting.entity.ClueMiddle; import com.baiye.modules.telemarkting.entity.ClueMiddle;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -56,7 +57,7 @@ public interface SourceClueClient {
ResponseEntity<Clue> queryDetails(@RequestParam("clueId") Long clueId); ResponseEntity<Clue> queryDetails(@RequestParam("clueId") Long clueId);
@ApiOperation("查询资源标签") @ApiOperation("查询资源标签")
@PostMapping(API_PREFIX+"/findSourceLabel") @PostMapping(API_PREFIX + "/findSourceLabel")
ResponseEntity<List<ResSourceLabel>> findSourceLabel(@RequestBody List<Long> clueIds); ResponseEntity<List<ResSourceLabel>> findSourceLabel(@RequestBody List<Long> clueIds);
@ApiOperation("资源是否分配到此人") @ApiOperation("资源是否分配到此人")
@ -70,5 +71,14 @@ public interface SourceClueClient {
@ApiOperation("更新资源信息") @ApiOperation("更新资源信息")
@PostMapping(API_PREFIX + "/update") @PostMapping(API_PREFIX + "/update")
CommonResponse<Object> update(@RequestBody ClueMiddle clueMiddle); CommonResponse<Object> update(@RequestBody ClueMiddle clueMiddle);
@ApiOperation("查询有意向的线索")
@GetMapping(API_PREFIX + "/queryClueByCondition")
ResponseEntity<List<ClueMiddle>> queryClueByCondition(@RequestParam(value = "startTime") String startTime,
@RequestParam(value = "endTime") String endTime,
@RequestParam(value = "memberId") Long memberId);
@ApiOperation("管理员获取当日所有意向数据")
@GetMapping(API_PREFIX+"/queryClueByAdmin")
CommonResponse<Integer> queryClueByAdmin(@RequestParam(value = "memberId") Long memberId) ;
} }

@ -73,4 +73,14 @@ public class SourceClueClientFallback implements SourceClueClient {
return null; return null;
} }
@Override
public ResponseEntity<List<ClueMiddle>> queryClueByCondition(String startTime, String endTime, Long memberId) {
return null;
}
@Override
public CommonResponse<Integer> queryClueByAdmin(Long memberId) {
return null;
}
} }

@ -67,10 +67,18 @@ public class ReportController {
@GetMapping("/report/member") @GetMapping("/report/member")
@ApiOperation("获取单个成员统计信息") @ApiOperation("获取单个成员统计信息")
public CommonResponse<Object> getMemberReport(String beginTime, String endTime, Long memberId) { public CommonResponse<Object> getMemberReport(String beginTime, String endTime) {
return queryReportService.getMemberReport(beginTime, endTime, memberId); Long currentUserId = SecurityUtils.getCurrentUserId();
// Long currentUserId = 68L;
return queryReportService.getMemberReport(beginTime, endTime, currentUserId);
}
@GetMapping("/report/member/month")
@ApiOperation("获取单个成员近30天的统计信息")
public CommonResponse<Object> getMemberReportByMonth() {
// Long currentUserId = 68L;
Long currentUserId = SecurityUtils.getCurrentUserId();
return queryReportService.getMemberReportByMonth( currentUserId);
} }
@GetMapping("/download/member") @GetMapping("/download/member")
@ApiOperation("导出单个成员统计信息") @ApiOperation("导出单个成员统计信息")
public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) { public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) {

@ -70,6 +70,9 @@ public class MemberInfoVO {
@ExcelProperty(value = "平均通话时长(秒)", index = 7) @ExcelProperty(value = "平均通话时长(秒)", index = 7)
private Double breatheAverageDuration; private Double breatheAverageDuration;
// @ExcelProperty(value = "意向数", index = 8)
@ExcelIgnore
private Integer intentionNum;
/** /**
* *
*/ */

@ -63,6 +63,14 @@ public interface QueryReportService {
*/ */
CommonResponse<Object> getMemberReport(String beginTime, String endTime, Long memberId); CommonResponse<Object> getMemberReport(String beginTime, String endTime, Long memberId);
/**
*
*
* @param memberId
* @return
*/
CommonResponse<Object> getMemberReportByMonth(Long memberId);
/** /**
* *
* *
@ -92,6 +100,7 @@ public interface QueryReportService {
/** /**
* 线 * 线
*
* @param response * @param response
* @param clueId * @param clueId
*/ */

@ -3,6 +3,7 @@ package com.baiye.modules.report.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
@ -38,6 +39,7 @@ import com.baiye.modules.telemarkting.dao.AllCallInfoRepository;
import com.baiye.modules.telemarkting.dao.CallClueRepository; import com.baiye.modules.telemarkting.dao.CallClueRepository;
import com.baiye.modules.telemarkting.entity.AllCallInfo; import com.baiye.modules.telemarkting.entity.AllCallInfo;
import com.baiye.modules.telemarkting.entity.CallClueInfo; import com.baiye.modules.telemarkting.entity.CallClueInfo;
import com.baiye.modules.telemarkting.entity.ClueMiddle;
import com.baiye.timed.ReportSync; import com.baiye.timed.ReportSync;
import com.baiye.util.DateTimeUtil; import com.baiye.util.DateTimeUtil;
import com.baiye.util.ExportExcelUtil; import com.baiye.util.ExportExcelUtil;
@ -85,6 +87,9 @@ public class QueryReportServiceImpl implements QueryReportService {
List<CallClueInfo> callClueInfos = callClueRepository.queryAllByTimeAndCompanyId(beginOfDay, endOfDay, companyId); List<CallClueInfo> callClueInfos = callClueRepository.queryAllByTimeAndCompanyId(beginOfDay, endOfDay, companyId);
//对查询的数据进行处理 //对查询的数据进行处理
MemberInfoVO messageInfo = getMessageInfo(beginOfDay, endOfDay, callClueInfos); MemberInfoVO messageInfo = getMessageInfo(beginOfDay, endOfDay, callClueInfos);
//加入管理员查看当日的意向数
Integer data = sourceClueClient.queryClueByAdmin(SecurityUtils.getCurrentUserId()).getData();
messageInfo.setIntentionNum(data);
return CommonResponse.createBySuccess(messageInfo); return CommonResponse.createBySuccess(messageInfo);
} }
@ -220,7 +225,7 @@ public class QueryReportServiceImpl implements QueryReportService {
List<AllCallInfo> allCallInfos = allCallInfoRepository.selectClueByTaskId(id); List<AllCallInfo> allCallInfos = allCallInfoRepository.selectClueByTaskId(id);
//以线索id分组 //以线索id分组
Map<Long, List<AllCallInfo>> map = new HashMap<>(16); Map<Long, List<AllCallInfo>> 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 //提取线索id
List<Long> clueIds = allCallInfos.stream().map(AllCallInfo::getClueId).collect(Collectors.toList()); List<Long> clueIds = allCallInfos.stream().map(AllCallInfo::getClueId).collect(Collectors.toList());
@ -396,21 +401,24 @@ public class QueryReportServiceImpl implements QueryReportService {
@Override @Override
public CommonResponse<Object> getMemberReport(String beginTime, String endTime, Long memberId) { public CommonResponse<Object> getMemberReport(String beginTime, String endTime, Long memberId) {
if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) {
beginTime = DateUtil.today();
endTime = DateUtil.today();
}
if (memberId == null) { if (memberId == null) {
log.error("成员id为空"); log.error("成员id为空");
return CommonResponse.createByErrorMessage("成员id为空"); return CommonResponse.createByErrorMessage("成员id为空");
} }
List<UserReport> userReports = userReportRepository.queryAllByTimeAndId(beginTime, endTime, memberId);
// TODO: 2022/5/6 0006 这里将统计今日的数据 List<UserReport> 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)); boolean betweenDays = DateTimeUtil.betweenByDay(DateUtil.date(), DateUtil.parseDate(endTime));
if (betweenDays) { if (betweenDays) {
List<CallClueInfo> callClueInfos = callClueRepository.queryAllByTimeAndMemberId(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.date().toString(), memberId); List<CallClueInfo> callClueInfos = callClueRepository.queryAllByTimeAndMemberId(beginTime, endTime, memberId);
List<UserReport> list = reportSync.autoCountReportByUser(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.date().toString(), callClueInfos); List<UserReport> list = reportSync.autoCountReportByUser(beginTime, endTime, callClueInfos);
if (CollUtil.isEmpty(userReports)) { if (CollUtil.isEmpty(userReports)) {
userReports = list; userReports = list;
} else { } else {
@ -418,7 +426,7 @@ public class QueryReportServiceImpl implements QueryReportService {
} }
} }
Map<Long, UserReport> map = new HashMap<>(); Map<Long, UserReport> map = new HashMap<>(2);
//合并同一个人的线索数据 //合并同一个人的线索数据
for (UserReport info : userReports) { for (UserReport info : userReports) {
if (map.containsKey(info.getMemberId())) { if (map.containsKey(info.getMemberId())) {
@ -440,9 +448,83 @@ public class QueryReportServiceImpl implements QueryReportService {
break; break;
} }
} }
//用户意向客户数
List<ClueMiddle> 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); return CommonResponse.createBySuccess(memberInfoVO);
} }
/**
*
*
* @param memberId
* @return
*/
@Override
public CommonResponse<Object> 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<UserReport> userReports = userReportRepository.queryAllByTimeAndId(beginTime, endTime, memberId);
//用户意向客户
List<ClueMiddle> clueMiddles = sourceClueClient.queryClueByCondition(beginTime, endTime, memberId).getBody();
//按时间分组
List<Map<String, Object>> mapByTime = getMapByTime(beginTime, endTime);
for (Map<String, Object> 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<Map<String, Object>> getMapByTime(String beginTime, String endTime) {
Date begin = DateUtil.parse(beginTime);
Date end = DateUtil.parse(endTime);
long betweenDay = DateUtil.between(begin, end, DateUnit.DAY);
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i <= betweenDay; i++) {
String time = DateUtil.format(DateUtil.offsetDay(begin, i), "yyyy-MM-dd");
Map<String, Object> 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 @Override
public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) { public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) {
if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) {

@ -236,6 +236,12 @@ public class UserController {
return userService.queryName(userIds); return userService.queryName(userIds);
} }
@GetMapping("/info/id")
@ApiOperation("用户id查询")
public UserDto findUserInfo(@RequestParam("userId") Long userId) {
return userService.findUserInfo(userId);
}
/** /**
* *
* *

@ -57,6 +57,7 @@ public interface UserService {
/** /**
* *
*
* @param resources / * @param resources /
* @throws Exception * @throws Exception
*/ */
@ -144,12 +145,14 @@ public interface UserService {
/** /**
* id * id
*
* @return * @return
*/ */
List<Long> queryAllUserIds(); List<Long> queryAllUserIds();
/** /**
* *
*
* @param managerId * @param managerId
* @return * @return
*/ */
@ -157,6 +160,7 @@ public interface UserService {
/** /**
* *
*
* @param roleId * @param roleId
* @return * @return
*/ */
@ -164,16 +168,18 @@ public interface UserService {
/** /**
* *
*
* @param file * @param file
* @param companyId * @param companyId
* @param userDto * @param userDto
* @return * @return
* @throws IOException * @throws IOException
*/ */
Boolean fileCreateUser(List<UserFavorOfExcel> file, Long companyId, UserDto userDto) ; Boolean fileCreateUser(List<UserFavorOfExcel> file, Long companyId, UserDto userDto);
/** /**
* *
*
* @param criteria * @param criteria
* @param pageable * @param pageable
* @return * @return
@ -182,6 +188,7 @@ public interface UserService {
/** /**
* id * id
*
* @param flag * @param flag
* @param ids * @param ids
*/ */
@ -189,6 +196,7 @@ public interface UserService {
/** /**
* *
*
* @param companyId * @param companyId
* @return * @return
*/ */
@ -196,33 +204,46 @@ public interface UserService {
/** /**
* *
*
* @param userDTO * @param userDTO
*/ */
void createUserOrFile(CreateUserDTO userDTO); void createUserOrFile(CreateUserDTO userDTO);
/** /**
* *
*
* @param orderDtoList * @param orderDtoList
*/ */
void updateUserExpirationTime(List<UpdateOrderDto> orderDtoList); void updateUserExpirationTime(List<UpdateOrderDto> orderDtoList);
/** /**
* *
* @return *
* @param date * @param date
* @param flag * @param flag
* @return
*/ */
List<User> findUserByExpirationTime(DateTime date, Boolean flag); List<User> findUserByExpirationTime(DateTime date, Boolean flag);
/** /**
* *
*
* @param userIds * @param userIds
* @return * @return
*/ */
Map<Long, String> queryName(Set<Long> userIds); Map<Long, String> queryName(Set<Long> userIds);
/**
*
*
* @param userId
* @return
*/
UserDto findUserInfo(Long userId);
/** /**
* *
*
* @param userId * @param userId
* @return * @return
*/ */
@ -230,6 +251,7 @@ public interface UserService {
/** /**
* *
*
* @param buyComboDTO * @param buyComboDTO
*/ */
void buyPackage(BuyComboDTO buyComboDTO); void buyPackage(BuyComboDTO buyComboDTO);
@ -237,6 +259,7 @@ public interface UserService {
/** /**
* *
*
* @param userId * @param userId
* @param newDate * @param newDate
*/ */

@ -253,6 +253,13 @@ public class UserServiceImpl implements UserService {
return map; 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 @Override
public Boolean findIsReview(Long userId) { public Boolean findIsReview(Long userId) {
Boolean isReview = null; Boolean isReview = null;
@ -340,7 +347,6 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void update(User resources) throws Exception { public void update(User resources) throws Exception {

@ -1,6 +1,7 @@
package com.baiye.feign; package com.baiye.feign;
import com.baiye.feign.fallback.UserClientFallback; import com.baiye.feign.fallback.UserClientFallback;
import com.baiye.model.dto.UserDto;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -33,4 +34,8 @@ public interface UserClient {
@GetMapping(PAY_PREFIX + "/info/findIsReview") @GetMapping(PAY_PREFIX + "/info/findIsReview")
@ApiOperation("用户id查询") @ApiOperation("用户id查询")
Boolean findIsReview(@RequestParam("userId") Long userId); Boolean findIsReview(@RequestParam("userId") Long userId);
@GetMapping(PAY_PREFIX + "/info/id")
@ApiOperation("用户id查询")
UserDto findUserInfo(@RequestParam("userId") Long userId);
} }

@ -1,6 +1,8 @@
package com.baiye.feign.fallback; package com.baiye.feign.fallback;
import com.baiye.feign.UserClient; import com.baiye.feign.UserClient;
import com.baiye.model.dto.UserDto;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Map; import java.util.Map;
@ -17,4 +19,9 @@ public class UserClientFallback implements UserClient {
public Boolean findIsReview(Long userId) { public Boolean findIsReview(Long userId) {
return null; return null;
} }
@Override
public UserDto findUserInfo(Long userId) {
return null;
}
} }

@ -5,6 +5,7 @@ import com.baiye.http.ResponseCode;
import com.baiye.model.dto.ClueDto; import com.baiye.model.dto.ClueDto;
import com.baiye.model.dto.ClueQueryCriteria; import com.baiye.model.dto.ClueQueryCriteria;
import com.baiye.model.dto.DistributeResponseDTO; import com.baiye.model.dto.DistributeResponseDTO;
import com.baiye.model.dto.PublicCluePoolQueryCriteria;
import com.baiye.model.vo.ResSourceLabel; import com.baiye.model.vo.ResSourceLabel;
import com.baiye.module.entity.Clue; import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueMiddle; import com.baiye.module.entity.ClueMiddle;
@ -134,7 +135,7 @@ public class ClueController {
@ApiOperation("资源是否分配到此人") @ApiOperation("资源是否分配到此人")
@GetMapping("/judgeMember") @GetMapping("/judgeMember")
public ResponseEntity<Boolean> judgeMember(@RequestParam("judgeMemberId") Long judgeMemberId){ public ResponseEntity<Boolean> judgeMember(@RequestParam("judgeMemberId") Long judgeMemberId) {
return new ResponseEntity<>(clueService.judgeMember(judgeMemberId), HttpStatus.OK); return new ResponseEntity<>(clueService.judgeMember(judgeMemberId), HttpStatus.OK);
} }
@ -159,8 +160,21 @@ public class ClueController {
@ApiOperation("查询管理员下(本公司内)所有资源,资源公海") @ApiOperation("查询管理员下(本公司内)所有资源,资源公海")
@GetMapping("/findCompanyClue") @GetMapping("/findCompanyClue")
public ResponseEntity<Object> findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable){ public ResponseEntity<Object> findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
return new ResponseEntity<>(clueService.findCompanyClue(clueQueryCriteria, pageable), HttpStatus.OK); return new ResponseEntity<>(clueService.findCompanyClue(clueQueryCriteria, pageable), HttpStatus.OK);
} }
@ApiOperation("查询有意向的线索")
@GetMapping("/queryClueByCondition")
public ResponseEntity<List<ClueMiddle>> 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<Integer> queryClueByAdmin(@RequestParam(value = "memberId") Long memberId) {
return CommonResponse.createBySuccess(clueService.queryClueByAdmin(memberId));
}
} }

@ -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<Object> queryPublicCluePool(@Validated PublicCluePoolQueryCriteria publicCluePoolQueryCriteria, Pageable pageable) {
return new ResponseEntity<>(publicCluePoolService.queryPublicCluePool(publicCluePoolQueryCriteria, pageable), HttpStatus.OK);
}
@ApiOperation("手动回收线索到公海")
@GetMapping("/recycle")
public ResponseEntity<Object> 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<Object> 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<Object> publicPoolConfigure(@Validated @RequestBody PublicPoolConfigure publicPoolConfigure) {
publicCluePoolService.publicPoolConfigure(publicPoolConfigure);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("查询公海配置")
@GetMapping("/pool/query")
public CommonResponse<Object> queryPoolConfigure(@RequestParam("companyId") Long companyId) {
return CommonResponse.createBySuccess(publicCluePoolService.queryPoolConfigure(companyId));
}
}

@ -9,6 +9,8 @@ import com.baiye.exception.BadRequestException;
import com.baiye.feign.OrganizeClient; import com.baiye.feign.OrganizeClient;
import com.baiye.model.dto.ClueDto; import com.baiye.model.dto.ClueDto;
import com.baiye.model.dto.ClueQueryCriteria; 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.model.vo.ResSourceLabel;
import com.baiye.module.entity.Clue; import com.baiye.module.entity.Clue;
import com.baiye.util.AESUtils; import com.baiye.util.AESUtils;
@ -54,7 +56,7 @@ public class ClueJpa {
public List<ClueDto> getClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) { public List<ClueDto> getClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
StringBuilder sql = new StringBuilder(); 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," + 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.optimistic_version as optimisticVersion,cm.source_label as sourceLabel,cm.task_id as taskId,cm.clue_stage as clueStage,cm.clue_call_status as clueCallStatus," +
"cm.newest_call_time as newestCallTime " + "cm.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 "); "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) { if (clueQueryCriteria.getMemberStatus() != null) {
sql.append("and cm.member_status = :memberStatus "); sql.append("and cm.member_status = :memberStatus ");
} }
if (clueQueryCriteria.getLabel() != null){ if (clueQueryCriteria.getLabel() != null) {
sql.append("and cm.source_label like :sourceLabel "); sql.append("and cm.source_label like :sourceLabel ");
} }
if (clueQueryCriteria.getClueCallStatus() != null){ if (clueQueryCriteria.getClueCallStatus() != null) {
sql.append("and cm.clue_call_status = :clueCallStatus "); sql.append("and cm.clue_call_status = :clueCallStatus ");
} }
if (clueQueryCriteria.getClueStage() != null){ if (clueQueryCriteria.getClueStage() != null) {
sql.append("and cm.clue_stage = :clueStage "); 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 "); sql.append("and cm.newest_call_time between :createTimeBegin and :createTimeEnd ");
} }
//拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格) //拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格)
@ -139,20 +141,20 @@ public class ClueJpa {
if (clueQueryCriteria.getMemberStatus() != null) { if (clueQueryCriteria.getMemberStatus() != null) {
query.setParameter("memberStatus", clueQueryCriteria.getMemberStatus()); query.setParameter("memberStatus", clueQueryCriteria.getMemberStatus());
} }
if (clueQueryCriteria.getClueStage() != null){ if (clueQueryCriteria.getClueStage() != null) {
query.setParameter("clueStage", clueQueryCriteria.getClueStage()); query.setParameter("clueStage", clueQueryCriteria.getClueStage());
} }
if (clueQueryCriteria.getLabel() != null){ if (clueQueryCriteria.getLabel() != null) {
query.setParameter("sourceLabel", "%" + clueQueryCriteria.getLabel() + "%"); query.setParameter("sourceLabel", "%" + clueQueryCriteria.getLabel() + "%");
} }
if (clueQueryCriteria.getClueCallStatus() != null){ if (clueQueryCriteria.getClueCallStatus() != null) {
query.setParameter("clueCallStatus", clueQueryCriteria.getClueCallStatus()); 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 createTimeBegin = this.format.format(newestCallTimeList.get(0));
String createTimeEnd = this.format.format(newestCallTimeList.get(1)); String createTimeEnd = this.format.format(newestCallTimeList.get(1));
query.setParameter("createTimeBegin",createTimeBegin); query.setParameter("createTimeBegin", createTimeBegin);
query.setParameter("createTimeEnd",createTimeEnd); query.setParameter("createTimeEnd", createTimeEnd);
} }
if (pageable != null) { if (pageable != null) {
query.setParameter("number", pageable.getPageNumber() * pageable.getPageSize()); query.setParameter("number", pageable.getPageNumber() * pageable.getPageSize());
@ -214,7 +216,7 @@ public class ClueJpa {
clueDto.setOrigin((Integer) row.get("origin")); clueDto.setOrigin((Integer) row.get("origin"));
clueDto.setCollectTime((Date) row.get("collectTime")); clueDto.setCollectTime((Date) row.get("collectTime"));
BigInteger organizeId = (BigInteger) row.get("organizeId"); BigInteger organizeId = (BigInteger) row.get("organizeId");
if (organizeId != null){ if (organizeId != null) {
clueDto.setOrganizeId(organizeId.longValue()); clueDto.setOrganizeId(organizeId.longValue());
} }
BigInteger memberId = (BigInteger) row.get("memberId"); BigInteger memberId = (BigInteger) row.get("memberId");
@ -275,6 +277,7 @@ public class ClueJpa {
Integer origin = clueQueryCriteria.getOrigin(); Integer origin = clueQueryCriteria.getOrigin();
List<Timestamp> createTimeList = clueQueryCriteria.getCreateTime(); List<Timestamp> createTimeList = clueQueryCriteria.getCreateTime();
Integer clueStage = clueQueryCriteria.getClueStage(); Integer clueStage = clueQueryCriteria.getClueStage();
List<Long> userIdList = clueQueryCriteria.getUserIdList();
StringBuilder sql = new StringBuilder(); 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," + 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 " + "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) { if (pageable != null) {
Integer memberStatus = clueQueryCriteria.getMemberStatus(); Integer memberStatus = clueQueryCriteria.getMemberStatus();
if (memberStatus != null && memberStatus == 0){ if (memberStatus != null && memberStatus == 0) {
sql.append("AND tcm.member_id is null "); 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 "); 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 "); sql.append("and tc.name like :name ");
} }
if (origin != null) { if (origin != null) {
sql.append("and tc.origin = :origin "); sql.append("and tc.origin = :origin ");
} }
if (clueStage != null){ if (clueStage != null) {
sql.append("AND tcm.clue_stage = :clueStage "); 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 "); sql.append("and tc.create_time between :createTimeBegin and :createTimeEnd ");
} }
//拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格) //拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格)
sql.append("ORDER BY tc.create_time desc ,tc.id "); sql.append("ORDER BY tc.create_time desc ,tc.id ");
sql.append("LIMIT :number,:size "); sql.append("LIMIT :number,:size ");
@ -314,17 +321,20 @@ public class ClueJpa {
if (origin != null) { if (origin != null) {
query.setParameter("origin", origin); query.setParameter("origin", origin);
} }
if (clueStage != null){ if (clueStage != null) {
query.setParameter("clueStage", clueStage); query.setParameter("clueStage", clueStage);
} }
if (StringUtils.isNotBlank(name)){ if (StringUtils.isNotBlank(name)) {
query.setParameter("name", "%" + 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 createTimeBegin = this.format.format(createTimeList.get(0));
String createTimeEnd = this.format.format(createTimeList.get(1)); String createTimeEnd = this.format.format(createTimeList.get(1));
query.setParameter("createTimeBegin",createTimeBegin); query.setParameter("createTimeBegin", createTimeBegin);
query.setParameter("createTimeEnd",createTimeEnd); query.setParameter("createTimeEnd", createTimeEnd);
}
if (userIdList != null && userIdList.size() > 0) {
query.setParameter("userIdList", userIdList);
} }
query.setParameter("number", pageable.getPageNumber() * pageable.getPageSize()); query.setParameter("number", pageable.getPageNumber() * pageable.getPageSize());
query.setParameter("size", pageable.getPageSize()); query.setParameter("size", pageable.getPageSize());
@ -352,7 +362,7 @@ public class ClueJpa {
clue.setClueStage((Integer) row.get("clueStage")); clue.setClueStage((Integer) row.get("clueStage"));
clue.setClueCallStatus((Integer) row.get("clueCallStatus")); clue.setClueCallStatus((Integer) row.get("clueCallStatus"));
BigInteger memberId = (BigInteger) row.get("memberId"); BigInteger memberId = (BigInteger) row.get("memberId");
if (memberId != null){ if (memberId != null) {
clue.setMemberId(memberId.longValue()); clue.setMemberId(memberId.longValue());
} }
} }
@ -373,19 +383,19 @@ public class ClueJpa {
if (CollUtil.isNotEmpty(taskIds)) { if (CollUtil.isNotEmpty(taskIds)) {
sql.append("AND cm.task_id IN (:taskId) "); sql.append("AND cm.task_id IN (:taskId) ");
Integer memberStatus = clueQueryCriteria.getMemberStatus(); Integer memberStatus = clueQueryCriteria.getMemberStatus();
if (memberStatus != null && memberStatus == 0){ if (memberStatus != null && memberStatus == 0) {
sql.append("AND cm.member_id is null "); 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 "); sql.append("AND cm.member_id is not null ");
} }
if (StringUtils.isNotBlank(name)){ if (StringUtils.isNotBlank(name)) {
sql.append("and c.name like :name "); sql.append("and c.name like :name ");
} }
if (origin != null) { if (origin != null) {
sql.append("and c.origin = :origin "); 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 "); sql.append("and c.create_time between :createTimeBegin and :createTimeEnd ");
} }
} }
@ -395,14 +405,14 @@ public class ClueJpa {
if (origin != null) { if (origin != null) {
query.setParameter("origin", origin); query.setParameter("origin", origin);
} }
if (StringUtils.isNotBlank(name)){ if (StringUtils.isNotBlank(name)) {
query.setParameter("name", "%" + 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 createTimeBegin = this.format.format(createTimeList.get(0));
String createTimeEnd = this.format.format(createTimeList.get(1)); String createTimeEnd = this.format.format(createTimeList.get(1));
query.setParameter("createTimeBegin",createTimeBegin); query.setParameter("createTimeBegin", createTimeBegin);
query.setParameter("createTimeEnd",createTimeEnd); query.setParameter("createTimeEnd", createTimeEnd);
} }
} }
query.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); query.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
@ -415,4 +425,83 @@ public class ClueJpa {
} }
return count; return count;
} }
/**
* null
*/
public List<PublicCluePoolDto> 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();
}
/**
* Dtokeysqlas
*/
private List<PublicCluePoolDto> getPoolClue(List list) {
List<PublicCluePoolDto> 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;
}
} }

@ -1,5 +1,6 @@
package com.baiye.module.dao; package com.baiye.module.dao;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueMiddle; import com.baiye.module.entity.ClueMiddle;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@ -81,6 +82,7 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
/** /**
* *
*
* @param taskId * @param taskId
* @param organizeId * @param organizeId
* @return * @return
@ -89,6 +91,7 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
/** /**
* *
*
* @param clueId * @param clueId
* @return * @return
*/ */
@ -101,6 +104,7 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
/** /**
* *
*
* @param taskId * @param taskId
* @return * @return
*/ */
@ -116,12 +120,14 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
/** /**
* id * id
*
* @param taskIds * @param taskIds
*/ */
List<ClueMiddle> findByTaskIdIn(Set<Long> taskIds); List<ClueMiddle> findByTaskIdIn(Set<Long> taskIds);
/** /**
* *
*
* @param taskIds * @param taskIds
*/ */
void deleteByTaskIdIn(Set<Long> taskIds); void deleteByTaskIdIn(Set<Long> taskIds);
@ -132,4 +138,42 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
@Query(value = "select clue_id from tb_clue_middle where task_id = ?1", nativeQuery = true) @Query(value = "select clue_id from tb_clue_middle where task_id = ?1", nativeQuery = true)
Set<Long> findByTaskIdReturnClueId(Long taskId); Set<Long> 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<ClueMiddle> queryClueByCondition(String startTime, String endTime, Long memberId, List<Integer> 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<Integer> 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<ClueMiddle> queryClueMiddleByClueStage(Long companyId, String time, List<Integer> clueStage);
} }

@ -12,4 +12,11 @@ import java.util.Set;
public interface ConductRecordRepository extends JpaRepository<ConductRecord, Long>, JpaSpecificationExecutor<ConductRecord> { public interface ConductRecordRepository extends JpaRepository<ConductRecord, Long>, JpaSpecificationExecutor<ConductRecord> {
List<ConductRecord> findByClueIdIn(Set<Long> clueIdList); List<ConductRecord> findByClueIdIn(Set<Long> clueIdList);
/**
* id
* @param createBy
* @return
*/
List<ConductRecord> findConductRecordByCreateBy(Long createBy);
} }

@ -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<PublicCluePool, Long>, JpaSpecificationExecutor<PublicCluePool> {
/**
* 线
* @param status
* @return
*/
List<PublicCluePool> 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);
}

@ -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<PublicPoolConfigure, Long>, JpaSpecificationExecutor<PublicPoolConfigure> {
/**
*
* @param companyId
* @return
*/
PublicPoolConfigure findPublicPoolConfigureByCompanyId(Long companyId);
}

@ -51,4 +51,8 @@ public class Clue extends BaseClue {
@ApiModelProperty(value = "线索分配人名称") @ApiModelProperty(value = "线索分配人名称")
@Transient @Transient
private String distributeUserName; private String distributeUserName;
@ApiModelProperty(value = "标识")
@Transient
private String tag;
} }

@ -30,4 +30,9 @@ public class ClueMiddle extends BaseClueMiddle {
@Column(name = "clue_id") @Column(name = "clue_id")
@NotNull(message = "资源id不能为空") @NotNull(message = "资源id不能为空")
private Long clueId; private Long clueId;
@Transient
private String clueName;
@Transient
private String memberName;
} }

@ -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;
}

@ -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;
}

@ -37,4 +37,7 @@ public class TaskZdyVo {
@ApiModelProperty(value = "金额") @ApiModelProperty(value = "金额")
private String amount; private String amount;
@ExcelProperty(value = "标识", index = 5)
@ApiModelProperty(value = "标识")
private String tag;
} }

@ -45,4 +45,7 @@ public class ZdyVo {
@ApiModelProperty(value = "平台") @ApiModelProperty(value = "平台")
private String platform; private String platform;
@ExcelProperty(value = "标识",index = 7)
@ApiModelProperty(value = "标识")
private String tag;
} }

@ -12,6 +12,7 @@ import com.baiye.module.service.dto.ClueRecordCriteria;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
@ -123,8 +124,10 @@ public interface ClueService {
* @return * @return
*/ */
Set<Long> findMemberIdList(ClueMiddle clueMiddle); Set<Long> findMemberIdList(ClueMiddle clueMiddle);
/** /**
* *
*
* @param clueId * @param clueId
* @return * @return
*/ */
@ -132,6 +135,7 @@ public interface ClueService {
/** /**
* *
*
* @param clueIds * @param clueIds
* @return * @return
*/ */
@ -139,6 +143,7 @@ public interface ClueService {
/** /**
* *
*
* @param memberId * @param memberId
* @return * @return
*/ */
@ -151,12 +156,14 @@ public interface ClueService {
/** /**
* *
*
* @param taskIds * @param taskIds
*/ */
void delClueAll(Set<Long> taskIds); void delClueAll(Set<Long> taskIds);
/** /**
* *
*
* @param clueQueryCriteria * @param clueQueryCriteria
* @param pageable * @param pageable
* @return * @return
@ -165,6 +172,7 @@ public interface ClueService {
/** /**
* , * ,
*
* @param clueIds * @param clueIds
* @return * @return
*/ */
@ -172,9 +180,27 @@ public interface ClueService {
/** /**
* (), * (),
*
* @param clueQueryCriteria * @param clueQueryCriteria
* @param pageable * @param pageable
* @return * @return
*/ */
Object findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable); Object findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable);
/**
* 线
*
* @param startTime
* @param endTime
* @param memberId
* @return
*/
List<ClueMiddle> queryClueByCondition(String startTime, String endTime, Long memberId);
/**
*
* @param memberId
* @return
*/
Integer queryClueByAdmin(Long memberId);
} }

@ -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<String, Object> 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);
}

@ -3,6 +3,7 @@ package com.baiye.module.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -55,7 +56,6 @@ public class ClueServiceImpl implements ClueService {
private final WeChatAddFriendClient weChatAddFriendClient; private final WeChatAddFriendClient weChatAddFriendClient;
private static SimpleDateFormat timeOne = new SimpleDateFormat("yyyyMMddHHmmssSSS"); private static SimpleDateFormat timeOne = new SimpleDateFormat("yyyyMMddHHmmssSSS");
@Override @Override
@ -64,11 +64,11 @@ public class ClueServiceImpl implements ClueService {
if (clueList.size() > 0) { if (clueList.size() > 0) {
try { try {
Iterator<Clue> it = clueList.iterator(); Iterator<Clue> it = clueList.iterator();
while(it.hasNext()){ while (it.hasNext()) {
Clue clue = it.next(); Clue clue = it.next();
if (StringUtils.isNotBlank(clue.getNid())){ if (StringUtils.isNotBlank(clue.getNid())) {
boolean bool = MobileUtil.checkPhone(clue.getNid()); boolean bool = MobileUtil.checkPhone(clue.getNid());
if (!bool){ if (!bool) {
it.remove(); 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<Long> clueIdList = clueDtoList.stream().map(ClueDto::getId).collect(Collectors.toSet()); Set<Long> clueIdList = clueDtoList.stream().map(ClueDto::getId).collect(Collectors.toSet());
List<ConductRecord> conductRecords = conductRecordRepository.findByClueIdIn(clueIdList); List<ConductRecord> conductRecords = conductRecordRepository.findByClueIdIn(clueIdList);
Map<Long, String> map = new HashMap<>(); Map<Long, String> map = new HashMap<>();
if (CollUtil.isNotEmpty(conductRecords)){ if (CollUtil.isNotEmpty(conductRecords)) {
List<ConductRecord> sortConductRecord = conductRecords.stream().sorted(Comparator.comparing(ConductRecord::getCreateTime)).collect(Collectors.toList()); List<ConductRecord> sortConductRecord = conductRecords.stream().sorted(Comparator.comparing(ConductRecord::getCreateTime)).collect(Collectors.toList());
for (ConductRecord conductRecord : sortConductRecord) { for (ConductRecord conductRecord : sortConductRecord) {
map.put(conductRecord.getClueId(),conductRecord.getRecordInfo()); map.put(conductRecord.getClueId(), conductRecord.getRecordInfo());
} }
} }
// 列表中查询标签信息 和 axb请求字段 // 列表中查询标签信息 和 axb请求字段
for (ClueDto clueDto : clueDtoList) { for (ClueDto clueDto : clueDtoList) {
String taskNameKey = "task:name:" + clueDto.getTaskId(); String taskNameKey = "task:name:" + clueDto.getTaskId();
String str = (String) redisUtils.get(taskNameKey); String str = (String) redisUtils.get(taskNameKey);
if (str.equals("null") || StringUtils.isBlank(str)) { if ("null".equals(str) || StringUtils.isBlank(str)) {
//设置空,取值判断空 //设置空,取值判断空
clueDto.setIsRedis(1); clueDto.setIsRedis(1);
Map<String, List<String>> body = organizeClient.getLabel(clueDto).getBody(); Map<String, List<String>> body = organizeClient.getLabel(clueDto).getBody();
str = body.get("taskName").get(0); str = body.get("taskName").get(0);
} }
clueDto.setTaskName(str); 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())); clueDto.setClueRecord(map.get(clueDto.getId()));
} }
} }
@ -213,7 +213,7 @@ public class ClueServiceImpl implements ClueService {
for (ClueDto clueDto : clueDtoList) { for (ClueDto clueDto : clueDtoList) {
//查询分配人的用户名称 //查询分配人的用户名称
Long memberId = clueDto.getMemberId(); Long memberId = clueDto.getMemberId();
if (memberId != null && userNickNameMap.containsKey(memberId)){ if (memberId != null && userNickNameMap.containsKey(memberId)) {
clueDto.setDistributeUserName(userNickNameMap.get(memberId)); clueDto.setDistributeUserName(userNickNameMap.get(memberId));
} }
//循环查库ID查询只一次循环 //循环查库ID查询只一次循环
@ -295,13 +295,14 @@ public class ClueServiceImpl implements ClueService {
if (StringUtils.isNotBlank(clueMiddle.getRemark())) { if (StringUtils.isNotBlank(clueMiddle.getRemark())) {
clueMiddleOne.setRemark(clueMiddle.getRemark()); clueMiddleOne.setRemark(clueMiddle.getRemark());
} }
if (clueMiddle.getClueStage() != null){ if (clueMiddle.getClueStage() != null) {
clueMiddleOne.setClueStage(clueMiddle.getClueStage()); clueMiddleOne.setClueStage(clueMiddle.getClueStage());
clueMiddleOne.setClueStageTime(DateUtil.date());
} }
if (clueMiddle.getClueCallStatus() != null){ if (clueMiddle.getClueCallStatus() != null) {
clueMiddleOne.setClueCallStatus(clueMiddle.getClueCallStatus()); clueMiddleOne.setClueCallStatus(clueMiddle.getClueCallStatus());
} }
if (clueMiddle.getNewestCallTime() != null){ if (clueMiddle.getNewestCallTime() != null) {
clueMiddleOne.setNewestCallTime(clueMiddle.getNewestCallTime()); clueMiddleOne.setNewestCallTime(clueMiddle.getNewestCallTime());
} }
clueMiddleOne.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1); clueMiddleOne.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1);
@ -316,7 +317,7 @@ public class ClueServiceImpl implements ClueService {
public void updateBatchMember(ClueQueryCriteria clueQueryCriteria) { public void updateBatchMember(ClueQueryCriteria clueQueryCriteria) {
List<Long> clueIdList = clueQueryCriteria.getClueIdList(); List<Long> clueIdList = clueQueryCriteria.getClueIdList();
List<Long> userIdList = clueQueryCriteria.getUserIdList(); List<Long> userIdList = clueQueryCriteria.getUserIdList();
if (CollUtil.isEmpty(clueIdList) || CollUtil.isEmpty(userIdList)){ if (CollUtil.isEmpty(clueIdList) || CollUtil.isEmpty(userIdList)) {
throw new BadRequestException("资源和指派人不能为空,请选择后重试"); throw new BadRequestException("资源和指派人不能为空,请选择后重试");
} }
//Map<Long, List<Long>>用户id -> 资源ID集合 //Map<Long, List<Long>>用户id -> 资源ID集合
@ -458,10 +459,10 @@ public class ClueServiceImpl implements ClueService {
List<Long> list = reportClient.getTurnOnIds(clueIds).getData(); List<Long> list = reportClient.getTurnOnIds(clueIds).getData();
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {
//过滤掉打过电话的线索ID //过滤掉打过电话的线索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()); phoneList = clueRepository.findAllById(list).stream().map(BaseClue::getNid).collect(Collectors.toList());
} }
if (CollUtil.isNotEmpty(clueIds)){ if (CollUtil.isNotEmpty(clueIds)) {
List<ClueMiddle> clueList = new ArrayList<>(); List<ClueMiddle> clueList = new ArrayList<>();
List<ClueMiddle> clueAll = clueMiddleRepository.findAllById(clueIds); List<ClueMiddle> clueAll = clueMiddleRepository.findAllById(clueIds);
for (ClueMiddle clueMiddle : clueAll) { for (ClueMiddle clueMiddle : clueAll) {
@ -477,7 +478,7 @@ public class ClueServiceImpl implements ClueService {
clueMiddleRepository.saveAll(clueList); clueMiddleRepository.saveAll(clueList);
} }
} }
if (CollUtil.isNotEmpty(phoneList)){ if (CollUtil.isNotEmpty(phoneList)) {
String str = ""; String str = "";
for (String phone : phoneList) { for (String phone : phoneList) {
str = str + phone + ","; str = str + phone + ",";
@ -498,6 +499,21 @@ public class ClueServiceImpl implements ClueService {
return findClueList(taskQueryCriteria, clueQueryCriteria, pageable); return findClueList(taskQueryCriteria, clueQueryCriteria, pageable);
} }
@Override
public List<ClueMiddle> queryClueByCondition(String startTime, String endTime, Long memberId) {
//有意向的阶段
List<Integer> stages = Arrays.asList(2, 3, 5, 6);
return clueMiddleRepository.queryClueByCondition(startTime, endTime, memberId, stages);
}
@Override
public Integer queryClueByAdmin(Long memberId) {
//有意向的阶段
List<Integer> 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); clue.setTaskName(str);
//查询分配人的用户名称 //查询分配人的用户名称
Long memberId = clue.getMemberId(); Long memberId = clue.getMemberId();
if (memberId != null && userNickNameMap.containsKey(memberId)){ if (memberId != null && userNickNameMap.containsKey(memberId)) {
clue.setDistributeUserName(userNickNameMap.get(memberId)); clue.setDistributeUserName(userNickNameMap.get(memberId));
} }
} }

@ -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<String, Object> queryPublicCluePool(PublicCluePoolQueryCriteria publicCluePoolQueryCriteria, Pageable pageable) {
List<PublicCluePoolDto> 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<Long> memberIds = new HashSet<>();
memberIds.add(clueMiddle.getMemberId());
Map<Long, String> 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<ConductRecord> 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);
}
}

@ -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<PublicCluePool> allByStatus = publicCluePoolRepository.findAllByStatus(false);
//按公司分组
HashMap<Long, List<PublicCluePool>> 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<PublicCluePool> 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<PublicCluePool> 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<Integer> clueStage = Arrays.asList(4, 7);
List<PublicPoolConfigure> 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<ClueMiddle> clueMiddles = clueMiddleRepository.queryClueMiddleByClueStage(companyId, time, clueStage);
if (clueMiddles != null && clueMiddles.size() > 0) {
updateClueMiddle(clueMiddles, companyId);
}
}
}
public void updateClueMiddle(List<ClueMiddle> clueMiddles, Long companyId) {
for (ClueMiddle clueMiddle : clueMiddles) {
//加操作记录
Set<Long> memberIds = new HashSet<>();
memberIds.add(clueMiddle.getMemberId());
Map<Long, String> 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);
}
}
}

@ -34,8 +34,9 @@ public class TestingUtil {
String zdyCollectTime = String.valueOf(list.get(4)); String zdyCollectTime = String.valueOf(list.get(4));
String zdyAddress = String.valueOf(list.get(5)); String zdyAddress = String.valueOf(list.get(5));
String zdyPlatform = String.valueOf(list.get(6)); 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)") 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("======================自定义单内容格式不正确====================="); log.info("======================自定义单内容格式不正确=====================");
return false; return false;
} }
@ -68,8 +69,9 @@ public class TestingUtil {
String taskCollectTime = String.valueOf(list.get(2)); String taskCollectTime = String.valueOf(list.get(2));
String taskPlatform = String.valueOf(list.get(3)); String taskPlatform = String.valueOf(list.get(3));
String taskAmount = String.valueOf(list.get(4)); 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("平台") if (!(taskName.equals("姓名") && taskNid.equals("电话") && taskCollectTime.equals("日期(****/**/** 00:00:00)") && taskPlatform.equals("平台")
&& taskAmount.equals("金额"))) { && taskAmount.equals("金额")&&tag.equals("标识"))) {
log.info("======================动态任务内容格式不正确====================="); log.info("======================动态任务内容格式不正确=====================");
return false; return false;
} }

Loading…
Cancel
Save