Merge remote-tracking branch 'origin/master'

master
bynt 2 years ago
commit 435a2ce85a

@ -28,7 +28,8 @@ public class EntityExistException extends RuntimeException {
}
private static String generateMessage(String entity, String field, String val) {
return StringUtils.capitalize(entity)
+ " with " + field + " "+ val + " existed";
// return StringUtils.capitalize(entity)
// + " with " + field + " "+ val + " existed";
return val + " 号码已存在";
}
}

@ -0,0 +1,7 @@
package com.baiye.valid;
/**
* valid()
*/
public interface AddGroup {
}

@ -0,0 +1,7 @@
package com.baiye.valid;
/**
* valid()
*/
public interface UpdateGroup {
}

@ -90,4 +90,16 @@ public class ClueDto implements Serializable {
@ApiModelProperty(value = "判断是否需要缓存 0:不需要 1:需要")
private Integer isRedis;
@ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向")
private Integer clueStage;
@ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通")
private Integer clueCallStatus;
@ApiModelProperty(value = "线索分配人名称")
private String distributeUserName;
@ApiModelProperty(value = "线索记录")
private String clueRecord;
}

@ -8,7 +8,6 @@ import java.sql.Timestamp;
import java.util.List;
import java.util.Set;
/**
* clue
* @author wjt
@ -53,4 +52,7 @@ public class ClueQueryCriteria {
@ApiModelProperty(value = "时间段")
private List<Timestamp> createTime;
@ApiModelProperty(value = "用户id")
private Long userId;
}

@ -0,0 +1,71 @@
package com.baiye.model.entity;
import com.baiye.util.JpaConverterListJson;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* Clue
*
* @author yqy
* @date 2021-12-07 10:40:37
*/
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseClueMiddle implements Serializable {
private static final long serialVersionUID = -5485885423091953188L;
@ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向")
@Column(name = "clue_stage")
private Integer clueStage;
@ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通")
@Column(name = "clue_call_status")
private Integer clueCallStatus;
@ApiModelProperty(value = "小组id")
@Column(name = "organize_id")
private Long organizeId;
@ApiModelProperty(value = "所属组员id")
@Column(name = "member_id")
private Long memberId;
@ApiModelProperty(value = "任务id")
@Column(name = "task_id")
private Long taskId;
@ApiModelProperty(value = "组员跟进状态 0无状态 1进行中 2已完成")
@Column(name = "member_status")
private Integer memberStatus;
@Convert(converter = JpaConverterListJson.class)
private List<String> sourceLabel;
@ApiModelProperty(value = "创建时间")
@Column(name = "create_time")
@CreationTimestamp
private Date createTime;
@ApiModelProperty(value = "备注")
@Column(name = "remark")
private String remark;
@ApiModelProperty(value = "版本号")
@NotNull(message = "版本号不能为空")
@Column(name = "optimistic_version")
private Integer optimisticVersion;
}

@ -1,13 +1,16 @@
package com.baiye.feign;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.ClueQueryCriteria;
import com.baiye.model.dto.DistributeResponseDTO;
import com.baiye.model.vo.ResSourceLabel;
import com.baiye.modules.system.domain.Clue;
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.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -63,5 +66,9 @@ public interface SourceClueClient {
@ApiOperation("删除所有关联数据")
@PostMapping(API_PREFIX + "/delClueAll")
ResponseEntity<Object> delClueAll(@RequestBody Set<Long> taskIds);
@ApiOperation("更新资源信息")
@PostMapping(API_PREFIX + "/update")
CommonResponse<Object> update(@RequestBody ClueMiddle clueMiddle);
}

@ -1,11 +1,13 @@
package com.baiye.feign;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.ClueQueryCriteria;
import com.baiye.model.dto.DistributeResponseDTO;
import com.baiye.model.dto.OrganizeQueryCriteria;
import com.baiye.model.vo.ResSourceLabel;
import com.baiye.modules.system.domain.Clue;
import com.baiye.modules.system.service.dto.ClueMiddleTo;
import com.baiye.modules.telemarkting.entity.ClueMiddle;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
@ -66,4 +68,9 @@ public class SourceClueClientFallback implements SourceClueClient {
return null;
}
@Override
public CommonResponse<Object> update(ClueMiddle clueMiddle) {
return null;
}
}

@ -79,7 +79,19 @@ public class ReportController {
@PostMapping("/report/turnOn")
@ApiOperation("统计接通过的线索")
public CommonResponse<Object> getTurnOnIds(@RequestBody List<Long> clueIds) {
public CommonResponse<List<Long>> getTurnOnIds(@RequestBody List<Long> clueIds) {
return queryReportService.getTurnOnIds(clueIds);
}
@GetMapping("/report/details")
@ApiOperation("获取通话记录详情")
public CommonResponse<Object> getCallRecordDetails(@RequestParam(value = "clueId") Long clueId) {
return queryReportService.getCallRecordDetails(clueId);
}
@GetMapping("/download/details")
@ApiOperation("下载通话记录详情")
public void downloadCallRecordDetails(HttpServletResponse response, Long clueId) {
queryReportService.downloadCallRecordDetails(response,clueId);
}
}

@ -0,0 +1,58 @@
package com.baiye.modules.report.entity.dto;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author wujingtao
* @date 2022/05/12
*/
@Data
public class CallRecordDetailsDTO {
/**
* 线id
*/
@ExcelIgnore
private Long clueId;
/**
* 线
*/
@ExcelProperty(value = "线索名称", index = 0)
private String clueName;
/**
* id
*/
@ExcelIgnore
private Long memberId;
/**
*
*/
@ExcelProperty(value = "跟进人", index = 1)
private String memberName;
/**
*
*/
@ExcelProperty(value = "通话时长(秒)", index = 3)
private Integer duration;
/**
*
*/
@ExcelProperty(value = "录音地址", index = 5)
private String recordFileDownloadUrl;
/**
*
*/
@ExcelProperty(value = "呼叫时间", index = 4)
private Date createTime;
/**
*
*/
@ExcelIgnore
private Integer status;
@ExcelProperty(value = "状态", index = 2)
private String statusValue;
}

@ -76,8 +76,24 @@ public interface QueryReportService {
/**
* 线
*
* @param clueIds
* @return
*/
CommonResponse<Object> getTurnOnIds(List<Long> clueIds);
CommonResponse<List<Long>> getTurnOnIds(List<Long> clueIds);
/**
* 线
*
* @param clueId
* @return
*/
CommonResponse<Object> getCallRecordDetails(Long clueId);
/**
* 线
* @param response
* @param clueId
*/
void downloadCallRecordDetails(HttpServletResponse response, Long clueId);
}

@ -2,6 +2,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.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
@ -18,10 +19,12 @@ import com.baiye.modules.report.dao.TaskReportRepository;
import com.baiye.modules.report.dao.UserReportRepository;
import com.baiye.modules.report.entity.TaskReport;
import com.baiye.modules.report.entity.UserReport;
import com.baiye.modules.report.entity.dto.CallRecordDetailsDTO;
import com.baiye.modules.report.entity.dto.StatisticalReportDTO;
import com.baiye.modules.report.entity.dto.UploadTaskDTO;
import com.baiye.modules.report.entity.vo.MemberInfoVO;
import com.baiye.modules.report.service.QueryReportService;
import com.baiye.modules.system.domain.Clue;
import com.baiye.modules.system.domain.Organize;
import com.baiye.modules.system.domain.Task;
import com.baiye.modules.system.domain.User;
@ -29,6 +32,7 @@ import com.baiye.modules.system.repository.OrganizeRepository;
import com.baiye.modules.system.repository.TaskRepository;
import com.baiye.modules.system.repository.UserRepository;
import com.baiye.modules.system.service.CompanyService;
import com.baiye.modules.system.service.UserService;
import com.baiye.modules.telemarkting.dao.AllCallInfoRepository;
import com.baiye.modules.telemarkting.dao.CallClueRepository;
import com.baiye.modules.telemarkting.entity.AllCallInfo;
@ -65,6 +69,7 @@ public class QueryReportServiceImpl implements QueryReportService {
private final UserRepository userRepository;
private final CallClueRepository callClueRepository;
private final ReportSync reportSync;
private final UserService userService;
/**
*
@ -81,6 +86,7 @@ public class QueryReportServiceImpl implements QueryReportService {
MemberInfoVO messageInfo = getMessageInfo(beginOfDay, endOfDay, callClueInfos);
return CommonResponse.createBySuccess(messageInfo);
}
/**
* id
*
@ -459,7 +465,7 @@ public class QueryReportServiceImpl implements QueryReportService {
}
@Override
public CommonResponse<Object> getTurnOnIds(List<Long> clueIds) {
public CommonResponse<List<Long>> getTurnOnIds(List<Long> clueIds) {
List<Long> list = allCallInfoRepository.queryIdsByStatusAndClueId(clueIds, 2);
if (CollUtil.isNotEmpty(list)) {
list = list.stream().distinct().collect(Collectors.toList());
@ -467,6 +473,80 @@ public class QueryReportServiceImpl implements QueryReportService {
return CommonResponse.createBySuccess(list);
}
@Override
public CommonResponse<Object> getCallRecordDetails(Long clueId) {
Map<String, Object> map = new HashMap<>(8);
int usrNum = 0;
int turnOnNum = 0;
int validNum = 0;
//查询线索的所有通话记录
List<AllCallInfo> allByClueId = allCallInfoRepository.findAllByClueId(clueId);
List<CallRecordDetailsDTO> listDto = new ArrayList<>();
if (CollUtil.isNotEmpty(allByClueId)) {
listDto = Convert.toList(CallRecordDetailsDTO.class, allByClueId);
//资源信息
Clue clue = sourceClueClient.queryDetails(clueId).getBody();
String clueName = "";
if (clue != null) {
clueName = clue.getName();
}
Set<Long> memberIds = allByClueId.stream().map(AllCallInfo::getMemberId).collect(Collectors.toSet());
Map<Long, String> memberMap = userService.queryName(memberIds);
for (CallRecordDetailsDTO info : listDto) {
if (memberMap.containsKey(info.getMemberId())) {
info.setMemberName(memberMap.get(info.getMemberId()));
}
info.setClueName(clueName);
//接通
if (info.getStatus() == DefaultNumberConstants.TWO_NUMBER) {
turnOnNum++;
//有效
if (info.getDuration() > DefaultNumberConstants.TEN_NUMBER) {
validNum++;
}
}
}
usrNum = listDto.size();
}
map.put("usrNum", usrNum);
map.put("turnOnNum", turnOnNum);
map.put("validNum", validNum);
map.put("data", listDto);
return CommonResponse.createBySuccess(map);
}
@Override
public void downloadCallRecordDetails(HttpServletResponse response, Long clueId) {
//查询线索的所有通话记录
List<AllCallInfo> allByClueId = allCallInfoRepository.findAllByClueId(clueId);
List<CallRecordDetailsDTO> listDto = new ArrayList<>();
if (CollUtil.isNotEmpty(allByClueId)) {
listDto = Convert.toList(CallRecordDetailsDTO.class, allByClueId);
//资源信息
Clue clue = sourceClueClient.queryDetails(clueId).getBody();
String clueName = "";
if (clue != null) {
clueName = clue.getName();
}
//用户信息
Set<Long> memberIds = allByClueId.stream().map(AllCallInfo::getMemberId).collect(Collectors.toSet());
Map<Long, String> memberMap = userService.queryName(memberIds);
for (CallRecordDetailsDTO info : listDto) {
if (memberMap.containsKey(info.getMemberId())) {
info.setMemberName(memberMap.get(info.getMemberId()));
}
info.setClueName(clueName);
info.setStatusValue(info.getStatus() == 2 ? "接通" : "未接通");
}
}
ExportExcelUtil.downloadEasyExcel(response, CallRecordDetailsDTO.class, listDto);
}
/**
*
*/

@ -148,6 +148,8 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers( "/api/back/cdrUrl").permitAll()
.antMatchers( "/api/back/status").permitAll()
.antMatchers( "/api/roll/cdrUrl").permitAll()
.antMatchers( "/api/report/turnOn").permitAll()
.antMatchers( "/api/users/info/findById").permitAll()
// 支付回调
.antMatchers( "/pay/aliPay/pay-notify").permitAll()
// 自定义匿名访问所有url放行允许匿名和带Token访问细腻化到每个 Request 类型

@ -18,7 +18,6 @@ import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
* @author YQY
* @date 2021-12-10

@ -51,6 +51,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@ -223,6 +224,17 @@ public class UserController {
return userService.findByName(username);
}
/**
*
*
* @return
*/
@PostMapping("/info/findById")
@ApiOperation("用户id查询")
public Map<Long, String> findById(@RequestBody Set<Long> userIds) {
return userService.queryName(userIds);
}
@Inner
@PostMapping("/info/deptIds")
@ApiOperation("查找部门")

@ -211,4 +211,11 @@ public interface UserService {
* @param flag
*/
List<User> findUserByExpirationTime(DateTime date, Boolean flag);
/**
*
* @param userIds
* @return
*/
Map<Long, String> queryName(Set<Long> userIds);
}

@ -1,5 +1,7 @@
package com.baiye.modules.system.service.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@ -8,6 +10,7 @@ import java.io.Serializable;
@Setter
public class DebtDto implements Serializable {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private Long userId;

@ -16,6 +16,8 @@
package com.baiye.modules.system.service.dto;
import com.baiye.model.base.BaseDTO;
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.NoArgsConstructor;
@ -38,6 +40,7 @@ public class FormUserDto extends BaseDTO implements Serializable {
private static final long serialVersionUID = -2035716596706011470L;
@ApiModelProperty(value = "id")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@ApiModelProperty(value = "二维码地址")

@ -232,6 +232,18 @@ public class UserServiceImpl implements UserService {
return userRepository.findUserByTime(date, flag);
}
@Override
public Map<Long, String> queryName(Set<Long> userIds) {
Map<Long, String> map = new HashMap<>();
List<User> userList = userRepository.findAllById(userIds);
if (CollUtil.isNotEmpty(userList)){
for (User user : userList) {
map.put(user.getId(),user.getUsername());
}
}
return map;
}
@Override
public Object queryAll(UserQueryCriteria criteria, Pageable pageable) {

@ -129,11 +129,6 @@ public class TelephoneCallController {
return telephoneCallService.doubleCallStop(telephoneCallStopDTO);
}
@GetMapping("/call/record")
@ApiOperation("获取通话记录和录音地址")
public CommonResponse<Object> getCallRecord(@RequestParam(value = "clueId") Long clueId, @RequestParam(value = "memberId") Long memberId) {
return telephoneCallService.getCallRecord(clueId, memberId);
}
@PostMapping("/roll/cdrUrl")
@ApiOperation("点呼系统回调话单")

@ -29,19 +29,6 @@ public interface AllCallInfoRepository extends JpaRepository<AllCallInfo, Long>,
@Query(value = "update AllCallInfo d set d.status =?1 where d.sessionId = ?2")
void updateByStatus(Integer status, String sessionId);
/**
*
*
* @param clueId
* @param memberId
* @param status
* @param recordFlag
* @return
*/
@Query(value = "select d from AllCallInfo d where d.clueId=?1 and d.memberId=?2 and d.status=?3 and d.recordFlag=?4")
List<AllCallInfo> findByClueIdAndMemberId(Long clueId, Long memberId, Integer status, Integer recordFlag);
/**
* id线
*
@ -81,4 +68,11 @@ public interface AllCallInfoRepository extends JpaRepository<AllCallInfo, Long>,
*/
@Query(value = "select clue_id from tb_call_info where clue_id in ?1 and status = ?2", nativeQuery = true)
List<Long> queryIdsByStatusAndClueId(List<Long> clueIds, Integer status);
/**
* 线
* @param clueId
* @return
*/
List<AllCallInfo> findAllByClueId(Long clueId);
}

@ -84,6 +84,6 @@ public interface CallClueRepository extends JpaRepository<CallClueInfo, Long>, J
* @param id
* @return
*/
@Query(value = "select * from tb_call_clue d where d.create_time >= ?1 and d.create_time< ?2 AND d.member.id = ?3", nativeQuery = true)
@Query(value = "select * from tb_call_clue d where d.create_time >= ?1 and d.create_time< ?2 AND d.member_id = ?3", nativeQuery = true)
List<CallClueInfo> queryAllByTimeAndMemberId(String beginTime, String endTime, Long id);
}

@ -0,0 +1,31 @@
package com.baiye.modules.telemarkting.entity;
import com.baiye.model.entity.BaseClueMiddle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
/**
* ClueMiddle
*
* @author yqy
* @date 2021-12-07 10:40:37
*/
@Data
@Entity
@Table(name = "tb_clue_middle")
@ApiModel(value = "ClueMiddle")
public class ClueMiddle extends BaseClueMiddle {
@Id
@ApiModelProperty(value = "线索id")
@Column(name = "clue_id")
@NotNull(message = "资源id不能为空")
private Long clueId;
}

@ -38,16 +38,6 @@ public interface TelephoneCallService {
*/
CommonResponse<Object> doubleCallStop(TelephoneCallStopDTO telephoneCallStopDTO);
/**
* h
*
* @param clueId
* @param memberId
* @return
*/
CommonResponse<Object> getCallRecord(Long clueId, Long memberId);
/**
* axb
* @param telephoneCallReqDTO

@ -21,6 +21,7 @@ import com.baiye.modules.telemarkting.dao.CallClueRepository;
import com.baiye.modules.telemarkting.dao.ExtensionNumberRepository;
import com.baiye.modules.telemarkting.entity.AllCallInfo;
import com.baiye.modules.telemarkting.entity.CallClueInfo;
import com.baiye.modules.telemarkting.entity.ClueMiddle;
import com.baiye.modules.telemarkting.entity.ExtensionNumber;
import com.baiye.modules.telemarkting.entity.dto.*;
import com.baiye.modules.telemarkting.entity.vo.CallRecordsVO;
@ -129,6 +130,11 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
int status = CallStatusEnum.ANSWER.getValue();
callClueRepository.updateByStatus(status, userDate);
allCallInfoRepository.updateByStatus(status, sessionId);
//更新资源通话状态
updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER);
} else {
//更新资源通话状态
updateSourceCallStatus(userDate,DefaultNumberConstants.ONE_NUMBER);
}
}
@ -140,25 +146,6 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
return CommonResponse.createByError();
}
@Override
public CommonResponse<Object> getCallRecord(Long clueId, Long memberId) {
if (clueId == null || memberId == null) {
log.error("参数不能为空clueId:{} ,memberId:{}", clueId, memberId);
return CommonResponse.createByErrorMessage("参数不能为空");
}
List<AllCallInfo> calls = allCallInfoRepository.findByClueIdAndMemberId(clueId, memberId, DefaultNumberConstants.TWO_NUMBER, DefaultNumberConstants.ONE_NUMBER);
List<CallRecordsVO> list = new ArrayList<>();
if (CollUtil.isNotEmpty(calls)) {
for (AllCallInfo info : calls) {
CallRecordsVO v = new CallRecordsVO();
BeanUtil.copyProperties(info, v);
list.add(v);
}
}
list.sort(Comparator.comparing(CallRecordsVO::getCreateTime));
return CommonResponse.createBySuccess(list);
}
@Override
public CommonResponse<String> axbDialNumber(TelephoneCallReqDTO doubleCallReq, Long companyId) {
long originalNumber = Long.parseLong(doubleCallReq.getUserData());
@ -274,30 +261,17 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
allCallInfo.setRecordFlag(DefaultNumberConstants.ONE_NUMBER);
allCallInfo.setRecordFileDownloadUrl(rollCallBackDTO.getRecord_file_url());
} else {
// if (StrUtil.isBlank(rollCallBackDTO.getCallee_answer_time())) {
// JSONObject object = new JSONObject();
// object.putOpt("code", 500);
// object.putOpt("type", "rollCall_reason");
// if (StrUtil.isBlank(rollCallBackDTO.getCallee_start_time()) || StrUtil.isBlank(rollCallBackDTO.getCallee_ring_time())) {
// log.error("呼叫未送达,session: {}",sessionId);
// object.putOpt("message", "呼叫未送达");
// } else {
// object.putOpt("message", "通话未接听");
// }
// // TODO: 2022/2/28 0028 发送websocket
// webSocketServer.sendMessage(JSONUtil.toJsonStr(object), SecurityUtils.getCurrentUserId());
// } else {
// callClueRepository.updateByStatus(DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueId());
// allCallInfo.setStatus(DefaultNumberConstants.TWO_NUMBER);
// allCallInfo.setDuration(Integer.valueOf(rollCallBackDTO.getDuration()));
// }
//拨打线索号的回调
if (StrUtil.isNotBlank(rollCallBackDTO.getCallee_answer_time())) {
//表示接通
callClueRepository.updateByStatus(DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueId());
allCallInfo.setStatus(DefaultNumberConstants.TWO_NUMBER);
allCallInfo.setDuration(Integer.valueOf(rollCallBackDTO.getDuration()));
//更新资源通话状态
updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.TWO_NUMBER);
}else {
//更新资源通话状态
updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER);
}
}
@ -305,5 +279,17 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
}
}
/**
*
*
* @param clueId ID
* @param status 1 2
*/
private void updateSourceCallStatus(Long clueId, Integer status) {
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(clueId);
clueMiddle.setClueCallStatus(status);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.THREE_NUMBER);
sourceClueClient.update(clueMiddle);
}
}

@ -6,18 +6,18 @@ spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}
server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}
redis:
database: 2
host: 118.178.137.129
host: 8.130.96.163
timeout: 5000
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://118.178.137.129:3306/ad-platform?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
url: jdbc:mysql://8.130.96.163:3306/ad-platform?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
username: root
password: root
password: y7z7noq2
# url: jdbc:mysql://localhost:3306/ad-platform?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
# username: root
# password: 12345678

@ -3,4 +3,4 @@ spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}
server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}

@ -0,0 +1,20 @@
package com.baiye.feign;
import com.baiye.feign.fallback.ReportClientFallback;
import com.baiye.http.CommonResponse;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@FeignClient(value = "ad-platform-management",fallback = ReportClientFallback.class)
public interface ReportClient {
String PAY_PREFIX = "/api/";
@PostMapping(PAY_PREFIX + "report/turnOn")
@ApiOperation("统计接通过的线索")
CommonResponse<List<Long>> getTurnOnIds(@RequestBody List<Long> clueIds);
}

@ -0,0 +1,25 @@
package com.baiye.feign;
import com.baiye.feign.fallback.UserClientFallback;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Map;
import java.util.Set;
@FeignClient(value = "ad-platform-management", fallback = UserClientFallback.class)
public interface UserClient {
String PAY_PREFIX = "/api/users";
/**
*
*
* @return
*/
@PostMapping(PAY_PREFIX + "/info/findById")
@ApiOperation("用户id查询")
Map<Long, String> findById(@RequestBody Set<Long> userIds);
}

@ -0,0 +1,15 @@
package com.baiye.feign.fallback;
import com.baiye.feign.ReportClient;
import com.baiye.http.CommonResponse;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class ReportClientFallback implements ReportClient {
@Override
public CommonResponse<List<Long>> getTurnOnIds(List<Long> clueIds) {
return null;
}
}

@ -0,0 +1,15 @@
package com.baiye.feign.fallback;
import com.baiye.feign.UserClient;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Set;
@Component
public class UserClientFallback implements UserClient {
@Override
public Map<Long, String> findById(Set<Long> clueIds) {
return null;
}
}

@ -145,10 +145,22 @@ public class ClueController {
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("分页查询资源公海")
@ApiOperation("分页查询动态任务下资源")
@GetMapping("/queryCluePool")
public ResponseEntity<Map<String, Object>> queryCluePool(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
return new ResponseEntity<>(clueService.queryCluePool(clueQueryCriteria, pageable), HttpStatus.OK);
}
@ApiOperation("撤回动态资源")
@PostMapping("/withdrawSource")
public ResponseEntity<Object> withdrawSource(@RequestBody List<Long> clueIds) {
return new ResponseEntity<>(clueService.withdrawSource(clueIds), HttpStatus.OK);
}
@ApiOperation("查询管理员下(本公司内)所有资源,资源公海")
@GetMapping("/findCompanyClue")
public ResponseEntity<Object> findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable){
return new ResponseEntity<>(clueService.findCompanyClue(clueQueryCriteria, pageable), HttpStatus.OK);
}
}

@ -0,0 +1,45 @@
package com.baiye.module.controller;
import com.baiye.http.CommonResponse;
import com.baiye.module.entity.ConductRecord;
import com.baiye.module.service.ConductRecordService;
import com.baiye.module.service.dto.ConductRecordQueryCriteria;
import com.baiye.valid.AddGroup;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor
@RestController
@Api(tags = "资源跟进记录管理")
@RequestMapping("/source/conductRecord")
@Slf4j
public class ConductRecordController {
private final ConductRecordService conductRecordService;
@ApiOperation("新增记录")
@PostMapping("/saveRecord")
public CommonResponse<Object> saveRecord(@Validated({AddGroup.class}) @RequestBody ConductRecord conductRecord){
conductRecordService.saveRecord(conductRecord);
return CommonResponse.createBySuccess();
}
@ApiOperation("删除记录")
@GetMapping("/del")
public CommonResponse<Object> delRecord(@RequestParam(value = "id") Long id) {
conductRecordService.delRecord(id);
return CommonResponse.createBySuccess();
}
@ApiOperation("查询记录列表")
@GetMapping("/query")
public ResponseEntity<Object> query(ConductRecordQueryCriteria conductRecordQueryCriteria){
return new ResponseEntity<>(conductRecordService.query(conductRecordQueryCriteria), HttpStatus.OK);
}
}

@ -28,6 +28,8 @@ import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.Transactional;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
@ -43,6 +45,7 @@ public class ClueJpa {
@Value("${aes.secret}")
private String secret;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
@ -52,7 +55,7 @@ public class ClueJpa {
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,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.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 " +
"from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 ");
List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, pageable);
return getTradeInfo(confirmReceipt);
@ -188,6 +191,8 @@ public class ClueJpa {
BigInteger memberId = (BigInteger) row.get("memberId");
clueDto.setMemberId(memberId.longValue());
clueDto.setOptimisticVersion((Integer) row.get("optimisticVersion"));
clueDto.setClueStage((Integer) row.get("clueStage"));
clueDto.setClueCallStatus((Integer) row.get("clueCallStatus"));
clueDtoList.add(clueDto);
}
return clueDtoList;
@ -227,16 +232,37 @@ public class ClueJpa {
*
* @param taskIds
* @param pageable
* @param clueQueryCriteria
* @return
*/
public List<Clue> findClue(Set<Long> taskIds, Pageable pageable) {
public List<Clue> findClue(Set<Long> taskIds, Pageable pageable, ClueQueryCriteria clueQueryCriteria) {
String name = clueQueryCriteria.getName();
Integer origin = clueQueryCriteria.getOrigin();
List<Timestamp> createTimeList = clueQueryCriteria.getCreateTime();
StringBuilder sql = new StringBuilder();
sql.append("SELECT tc.id as id,tc.nid as nid,tc.create_time as createTime,tc.name as name,tcm.task_id as taskId FROM tb_clue_middle tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
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 " +
"FROM tb_clue_middle tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
if (CollUtil.isNotEmpty(taskIds)) {
sql.append("AND tcm.task_id IN (:taskId) ");
}
if (pageable != null) {
Integer memberStatus = clueQueryCriteria.getMemberStatus();
if (memberStatus != null && memberStatus == 0){
sql.append("AND tcm.member_id is null ");
}
if (memberStatus != null && memberStatus > 0){
sql.append("AND tcm.member_id is not null ");
}
if (StringUtils.isNotBlank(name)){
sql.append("and tc.name like :name ");
}
if (origin != null) {
sql.append("and tc.origin = :origin ");
}
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 ");
@ -246,6 +272,18 @@ public class ClueJpa {
query.setParameter("taskId", taskIds);
}
if (pageable != null) {
if (origin != null) {
query.setParameter("origin", origin);
}
if (StringUtils.isNotBlank(name)){
query.setParameter("name", "%" + name + "%");
}
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("number", pageable.getPageNumber() * pageable.getPageSize());
query.setParameter("size", pageable.getPageSize());
}
@ -266,6 +304,15 @@ public class ClueJpa {
clue.setNid(nid);
BigInteger taskId = (BigInteger) row.get("taskId");
clue.setTaskId(taskId.longValue());
Integer memberSta = (Integer) row.get("memberStatus");
clue.setMemberStatus(memberSta);
clue.setOrigin((int) row.get("origin"));
clue.setClueStage((Integer) row.get("clueStage"));
clue.setClueCallStatus((Integer) row.get("clueCallStatus"));
BigInteger memberId = (BigInteger) row.get("memberId");
if (memberId != null){
clue.setMemberId(memberId.longValue());
}
}
arrayList.add(clue);
}
@ -276,15 +323,45 @@ public class ClueJpa {
/**
*
*/
public Long getTaskCount(Set<Long> taskIds) {
public Long getTaskCount(Set<Long> taskIds, ClueQueryCriteria clueQueryCriteria) {
String name = clueQueryCriteria.getName();
Integer origin = clueQueryCriteria.getOrigin();
List<Timestamp> createTimeList = clueQueryCriteria.getCreateTime();
StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 ");
if (CollUtil.isNotEmpty(taskIds)) {
sql.append("AND cm.task_id IN (:taskId) ");
Integer memberStatus = clueQueryCriteria.getMemberStatus();
if (memberStatus != null && memberStatus == 0){
sql.append("AND cm.member_id is null ");
}
if (memberStatus != null && memberStatus > 0){
sql.append("AND cm.member_id is not null ");
}
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){
sql.append("and c.create_time between :createTimeBegin and :createTimeEnd ");
}
}
Query query = entityManager.createNativeQuery(sql.toString());
if (CollUtil.isNotEmpty(taskIds)) {
query.setParameter("taskId", taskIds);
if (origin != null) {
query.setParameter("origin", origin);
}
if (StringUtils.isNotBlank(name)){
query.setParameter("name", "%" + name + "%");
}
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.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List confirmReceipt = query.getResultList();

@ -0,0 +1,15 @@
package com.baiye.module.dao;
import com.baiye.module.entity.ConductRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Set;
@Repository
public interface ConductRecordRepository extends JpaRepository<ConductRecord, Long>, JpaSpecificationExecutor<ConductRecord> {
List<ConductRecord> findByClueIdIn(Set<Long> clueIdList);
}

@ -21,14 +21,9 @@ import lombok.Data;
@ApiModel(value = "Clue")
public class Clue extends BaseClue {
/**
* 线id
* nullable : false
* default : null
*/
@Id
@ApiModelProperty(value = "线索表主键id自动递增")
@Column(name = "id", nullable = true)
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ -37,4 +32,24 @@ public class Clue extends BaseClue {
@Transient
private String taskName;
@ApiModelProperty(value = "组员跟进状态 0无状态 1进行中 2已完成")
@Transient
private Integer memberStatus;
@ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向")
@Transient
private Integer clueStage;
@ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通")
@Transient
private Integer clueCallStatus;
@ApiModelProperty(value = "线索分配人")
@Transient
private Long memberId;
@ApiModelProperty(value = "线索分配人名称")
@Transient
private String distributeUserName;
}

@ -1,5 +1,6 @@
package com.baiye.module.entity;
import com.baiye.model.entity.BaseClueMiddle;
import com.baiye.util.JpaConverterListJson;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -8,10 +9,10 @@ import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* ClueMiddle
*
@ -22,44 +23,11 @@ import java.util.List;
@Entity
@Table(name = "tb_clue_middle")
@ApiModel(value = "ClueMiddle")
public class ClueMiddle{
public class ClueMiddle extends BaseClueMiddle {
@Id
@ApiModelProperty(value = "线索id")
@Column(name = "clue_id")
@NotNull(message = "资源id不能为空")
private Long clueId;
@ApiModelProperty(value = "小组id")
@Column(name = "organize_id")
private Long organizeId;
@ApiModelProperty(value = "所属组员id")
@Column(name = "member_id")
private Long memberId;
@ApiModelProperty(value = "任务id")
@Column(name = "task_id")
private Long taskId;
@ApiModelProperty(value = "组员跟进状态 0无状态 1进行中 2已完成")
@Column(name = "member_status")
private Integer memberStatus;
@Convert(converter = JpaConverterListJson.class)
private List<String> sourceLabel;
@ApiModelProperty(value = "创建时间")
@Column(name = "create_time")
@CreationTimestamp
private Date createTime;
@ApiModelProperty(value = "备注")
@Column(name = "remark")
private String remark;
@ApiModelProperty(value = "版本号")
@NotNull(message = "版本号不能为空")
@Column(name = "optimistic_version")
private Integer optimisticVersion;
}

@ -0,0 +1,58 @@
package com.baiye.module.entity;
import com.baiye.valid.AddGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
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;
/**
* ClueMiddle
*
* @author yqy
* @date 2021-12-07 10:40:37
*/
@Data
@Entity
@Table(name = "tb_clue_conduct_record")
@ApiModel(value = "线索跟进记录表")
@EntityListeners(AuditingEntityListener.class)
public class ConductRecord implements Serializable {
private static final long serialVersionUID = 1271571231859316736L;
@Id
@ApiModelProperty(value = "线索跟进记录表主键ID")
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ApiModelProperty(value = "线索id")
@Column(name = "clue_id")
@NotNull(message = "线索id不能为空", groups = {AddGroup.class})
private Long clueId;
@ApiModelProperty(value = "跟进记录信息")
@Column(name = "record_info")
@NotNull(message = "记录信息不能为空", groups = {AddGroup.class})
private String recordInfo;
@ApiModelProperty(value = "跟进人名称")
@Column(name = "name")
private String name;
@ApiModelProperty(value = "创建人id")
@NotNull(message = "创建人不能为空", groups = {AddGroup.class})
private Long createBy;
@ApiModelProperty(value = "创建时间")
@Column(name = "create_time")
@CreationTimestamp
private Date createTime;
}

@ -156,10 +156,25 @@ public interface ClueService {
void delClueAll(Set<Long> taskIds);
/**
*
*
* @param clueQueryCriteria
* @param pageable
* @return
*/
Map<String, Object> queryCluePool(ClueQueryCriteria clueQueryCriteria, Pageable pageable);
/**
*
* @param clueIds
* @return
*/
Object withdrawSource(List<Long> clueIds);
/**
* (),
* @param clueQueryCriteria
* @param pageable
* @return
*/
Object findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable);
}

@ -0,0 +1,27 @@
package com.baiye.module.service;
import com.baiye.module.entity.ConductRecord;
import com.baiye.module.service.dto.ConductRecordQueryCriteria;
public interface ConductRecordService {
/**
*
* @param conductRecord
* @return
*/
void saveRecord(ConductRecord conductRecord);
/**
*
* @param id
*/
void delRecord(Long id);
/**
*
* @param conductRecordQueryCriteria
* @return
*/
Object query(ConductRecordQueryCriteria conductRecordQueryCriteria);
}

@ -18,6 +18,12 @@ public class ClueMiddleDto implements Serializable {
@ApiModelProperty(value = "线索id")
private Long clueId;
@ApiModelProperty(value = "线索阶段0新线索 1待沟通 2有意向 3已加微信 4无意向")
private Integer clueStage;
@ApiModelProperty(value = "线索通话状态0无状态 1未接听 2已接通")
private Integer clueCallStatus;
@ApiModelProperty(value = "小组id")
private Long organizeId;

@ -0,0 +1,35 @@
package com.baiye.module.service.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ConductRecordDto implements Serializable {
@ApiModelProperty(value = "线索跟进记录表主键ID")
private Long id;
@ApiModelProperty(value = "线索id")
private Long clueId;
@ApiModelProperty(value = "跟进记录信息")
private String recordInfo;
@ApiModelProperty(value = "跟进人名称")
private String name;
@ApiModelProperty(value = "创建人id")
private Long createBy;
@ApiModelProperty(value = "创建时间")
private Date createTime;
}

@ -0,0 +1,16 @@
package com.baiye.module.service.dto;
import com.baiye.annotation.Query;
import lombok.Data;
/**
*
*/
@Data
public class ConductRecordQueryCriteria {
@Query
private Long createBy;
@Query
private Long clueId;
}

@ -1,6 +1,7 @@
package com.baiye.module.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
@ -8,17 +9,13 @@ import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.OrganizeClient;
import com.baiye.feign.ReportClient;
import com.baiye.feign.TaskClient;
import com.baiye.feign.UserClient;
import com.baiye.model.dto.*;
import com.baiye.model.vo.ResSourceLabel;
import com.baiye.module.dao.ClueJpa;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueRecordRepository;
import com.baiye.module.dao.ClueRepository;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.ClueRecord;
import com.baiye.module.entity.Task;
import com.baiye.module.dao.*;
import com.baiye.module.entity.*;
import com.baiye.module.entity.vo.BaseExcelVo;
import com.baiye.module.service.ClueService;
import com.baiye.module.service.dto.*;
@ -38,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@ -53,6 +51,9 @@ public class ClueServiceImpl implements ClueService {
private final OrganizeClient organizeClient;
private final RedisUtils redisUtils;
private final TaskClient taskClient;
private final ReportClient reportClient;
private final UserClient userClient;
private final ConductRecordRepository conductRecordRepository;
private static SimpleDateFormat timeOne = new SimpleDateFormat("yyyyMMddHHmmssSSS");
@ -69,6 +70,8 @@ public class ClueServiceImpl implements ClueService {
clueMiddle.setTaskId(taskId);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddleRepository.save(clueMiddle);
}
} catch (Exception e) {
@ -145,7 +148,7 @@ public class ClueServiceImpl implements ClueService {
}
}
}
return new ResponseEntity<>(HttpStatus.OK);
return new ResponseEntity<>(null,HttpStatus.OK);
}
/**
@ -156,6 +159,16 @@ public class ClueServiceImpl implements ClueService {
if (clueQueryCriteria.getMemberId() != null) {
List<ClueDto> clueDtoList = clueJpa.getClueList(clueQueryCriteria, pageable);
Long count = clueJpa.getCount(clueQueryCriteria);
//查询线索记录
Set<Long> clueIdList = clueDtoList.stream().map(ct -> ct.getId()).collect(Collectors.toSet());
List<ConductRecord> conductRecords = conductRecordRepository.findByClueIdIn(clueIdList);
Map<Long, String> map = new HashMap<>();
if (CollUtil.isNotEmpty(conductRecords)){
List<ConductRecord> sortConductRecord = conductRecords.stream().sorted(Comparator.comparing(ConductRecord::getCreateTime)).collect(Collectors.toList());
for (ConductRecord conductRecord : sortConductRecord) {
map.put(conductRecord.getClueId(),conductRecord.getRecordInfo());
}
}
// 列表中查询标签信息 和 axb请求字段
for (ClueDto clueDto : clueDtoList) {
String taskNameKey = "task:name:" + clueDto.getTaskId();
@ -167,6 +180,9 @@ public class ClueServiceImpl implements ClueService {
str = body.get("taskName").get(0);
}
clueDto.setTaskName(str);
if (CollUtil.isNotEmpty(map) && map.containsKey(clueDto.getId())){
clueDto.setClueRecord(map.get(clueDto.getId()));
}
}
return PageUtil.toPage(clueDtoList, count);
}
@ -180,9 +196,16 @@ public class ClueServiceImpl implements ClueService {
public List<ClueDto> query(ClueQueryCriteria clueQueryCriteria) {
if (clueQueryCriteria.getMemberId() != null) {
List<ClueDto> clueDtoList = clueJpa.getClueList(clueQueryCriteria, null);
Set<Long> memberIds = clueDtoList.stream().map(ca -> ca.getMemberId()).collect(Collectors.toSet());
Map<Long, String> userNickNameMap = userClient.findById(memberIds);
// id查询(详情查询)时返回标签信息
if (clueQueryCriteria.getId() != null) {
for (ClueDto clueDto : clueDtoList) {
//查询分配人的用户名称
Long memberId = clueDto.getMemberId();
if (memberId != null && userNickNameMap.containsKey(memberId)){
clueDto.setDistributeUserName(userNickNameMap.get(memberId));
}
//循环查库ID查询只一次循环
clueDto.setIsRedis(0);
Map<String, List<String>> mapList = organizeClient.getLabel(clueDto).getBody();
@ -232,6 +255,8 @@ public class ClueServiceImpl implements ClueService {
@Override
@Transactional(rollbackFor = Exception.class)
public void update(ClueMiddle clueMiddle) {
//更新通话状态时不加锁
if (clueMiddle.getClueCallStatus() == null) {
//乐观锁,不用jpa查询(jpa有缓存这个坑)
if (clueMiddle.getOptimisticVersion() != null) {
Integer version = clueMiddleRepository.lookUpOptimisticVersion(clueMiddle.getClueId());
@ -239,6 +264,7 @@ public class ClueServiceImpl implements ClueService {
throw new BadRequestException("刷新后重试");
}
}
}
ClueMiddle clueMiddleOne = clueMiddleRepository.findById(clueMiddle.getClueId()).orElseGet(ClueMiddle::new);
if (clueMiddle.getSourceLabel() != null) {
List<String> sourceLabelList = clueMiddle.getSourceLabel();
@ -252,6 +278,12 @@ public class ClueServiceImpl implements ClueService {
if (StringUtils.isNotBlank(clueMiddle.getRemark())) {
clueMiddleOne.setRemark(clueMiddle.getRemark());
}
if (clueMiddle.getClueStage() != null){
clueMiddleOne.setClueStage(clueMiddle.getClueStage());
}
if (clueMiddle.getClueCallStatus() != null){
clueMiddleOne.setClueCallStatus(clueMiddle.getClueCallStatus());
}
clueMiddleOne.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1);
clueMiddleRepository.save(clueMiddleOne);
}
@ -264,6 +296,9 @@ public class ClueServiceImpl implements ClueService {
public void updateBatchMember(ClueQueryCriteria clueQueryCriteria) {
List<Long> clueIdList = clueQueryCriteria.getClueIdList();
List<Long> userIdList = clueQueryCriteria.getUserIdList();
if (CollUtil.isEmpty(clueIdList) || CollUtil.isEmpty(userIdList)){
throw new BadRequestException("资源和指派人不能为空,请选择后重试");
}
//Map<Long, List<Long>>用户id -> 资源ID集合
List<Map<Long, List<Long>>> maps = AverageDataUtil.averageData(clueIdList, userIdList);
//批量更新组员信息
@ -377,13 +412,9 @@ public class ClueServiceImpl implements ClueService {
}
}
/**
*
*/
@Override
public Map<String, Object> queryCluePool(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
if (clueQueryCriteria.getMemberId() != null) {
Set<Long> taskSet = new HashSet<>();
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getMemberId());
taskQueryCriteria.setTaskType(1);
@ -394,6 +425,88 @@ public class ClueServiceImpl implements ClueService {
if (clueQueryCriteria.getTaskId() != null) {
taskQueryCriteria.setId(clueQueryCriteria.getTaskId());
}
Map<String, Object> clueList = findClueList(taskQueryCriteria, clueQueryCriteria, pageable);
return clueList;
} else {
log.info("========================用户id为空============================");
throw new BadRequestException("刷新后重试");
}
}
@Override
public Object withdrawSource(List<Long> clueIds) {
if (CollUtil.isNotEmpty(clueIds)) {
// 查询已打过电话的
List<Long> list = reportClient.getTurnOnIds(clueIds).getData();
if (CollUtil.isNotEmpty(list)) {
//过滤掉打过电话的线索ID
clueIds = clueIds.stream().filter(num -> !list.contains(num)) .collect(Collectors.toList());
}
if (CollUtil.isNotEmpty(clueIds)){
List<ClueMiddle> clueList = new ArrayList<>();
List<ClueMiddle> clueAll = clueMiddleRepository.findAllById(clueIds);
for (ClueMiddle clueMiddle : clueAll) {
clueMiddle.setSourceLabel(null);
clueMiddle.setOptimisticVersion(0);
clueMiddle.setRemark(null);
clueMiddle.setMemberStatus(0);
clueMiddle.setMemberId(null);
clueMiddle.setOrganizeId(null);
clueMiddle.setClueStage(0);
clueList.add(clueMiddle);
}
clueMiddleRepository.saveAll(clueList);
}
}
return new ResponseEntity<>(HttpStatus.OK);
}
@Override
public Object findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getUserId());
if (clueQueryCriteria.getTaskName() != null) {
taskQueryCriteria.setBlurry(clueQueryCriteria.getTaskName());
}
Map<String, Object> clueList = findClueList(taskQueryCriteria, clueQueryCriteria, pageable);
return clueList;
}
/**
*
*
* @param clueQueryCriteria
* @param pageable
* @return
*/
private Map<String, Object> findClueList(TaskQueryCriteria taskQueryCriteria, ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
//获取所有任务id
Set<Long> taskIds = findTaskId(taskQueryCriteria);
if (CollUtil.isNotEmpty(taskIds)) {
List<Clue> clueAll = clueJpa.findClue(taskIds, pageable, clueQueryCriteria);
Set<Long> memberIds = clueAll.stream().map(ca -> ca.getMemberId()).collect(Collectors.toSet());
Map<Long, String> userNickNameMap = userClient.findById(memberIds);
for (Clue clue : clueAll) {
//获取缓存中任务名称
String str = findTaskName(clue.getTaskId());
clue.setTaskName(str);
//查询分配人的用户名称
Long memberId = clue.getMemberId();
if (memberId != null && userNickNameMap.containsKey(memberId)){
clue.setDistributeUserName(userNickNameMap.get(memberId));
}
}
Long count = clueJpa.getTaskCount(taskIds, clueQueryCriteria);
return PageUtil.toPage(clueAll, count);
}
return PageUtil.toPage(new ArrayList<>(), 0);
}
/**
* id
*/
private Set<Long> findTaskId(TaskQueryCriteria taskQueryCriteria) {
Set<Long> taskSet = new HashSet<>();
Object body = taskClient.query(taskQueryCriteria).getBody();
JSONArray taskList = JSONUtil.parseArray(body);
if (CollUtil.isNotEmpty(taskList)) {
@ -402,29 +515,24 @@ public class ClueServiceImpl implements ClueService {
long taskId = Long.parseLong(String.valueOf(task.get("id")));
taskSet.add(taskId);
}
List<Clue> clueAll = clueJpa.findClue(taskSet, pageable);
for (Clue clue : clueAll) {
String taskNameKey = "task:name:" + clue.getTaskId();
}
return taskSet;
}
/**
*
*/
private String findTaskName(Long taskId) {
String taskNameKey = "task:name:" + taskId;
String str = (String) redisUtils.get(taskNameKey);
if (str == null || str.equals("null") || StringUtils.isBlank(str)) {
//设置空,取值判断空
ClueDto clueDto = new ClueDto();
clueDto.setIsRedis(1);
clueDto.setTaskId(clue.getTaskId());
clueDto.setTaskId(taskId);
Map<String, List<String>> nameMap = organizeClient.getLabel(clueDto).getBody();
str = nameMap.get("taskName").get(0);
}
clue.setTaskName(str);
}
Long count = clueJpa.getTaskCount(taskSet);
return PageUtil.toPage(clueAll, count);
return str;
}
return PageUtil.toPage(new ArrayList<>(), 0);
} else {
log.info("========================用户id为空============================");
throw new BadRequestException("刷新后重试");
}
}
}

@ -0,0 +1,55 @@
package com.baiye.module.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baiye.feign.UserClient;
import com.baiye.module.dao.ConductRecordRepository;
import com.baiye.module.entity.ConductRecord;
import com.baiye.module.service.ConductRecordService;
import com.baiye.module.service.dto.ConductRecordDto;
import com.baiye.module.service.dto.ConductRecordQueryCriteria;
import com.baiye.module.service.mapstruct.ConductRecordMapper;
import com.baiye.util.QueryHelp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Service
@Slf4j
@RequiredArgsConstructor
public class ConductRecordServiceImpl implements ConductRecordService {
private final ConductRecordRepository conductRecordRepository;
private final ConductRecordMapper conductRecordMapper;
private final UserClient userClient;
@Override
public void saveRecord(ConductRecord conductRecord) {
//查询创建人的用户名称
Long userId = conductRecord.getCreateBy();
Set<Long> userIdSet = new HashSet<>();
userIdSet.add(userId);
Map<Long, String> userNickName = userClient.findById(userIdSet);
if (CollUtil.isNotEmpty(userNickName)){
conductRecord.setName(userNickName.get(userId));
}
conductRecordRepository.save(conductRecord);
}
@Override
public void delRecord(Long id) {
conductRecordRepository.deleteById(id);
}
@Override
public Object query(ConductRecordQueryCriteria conductRecordQueryCriteria) {
List<ConductRecordDto> conductRecordDtoList = conductRecordMapper.toDto(conductRecordRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, conductRecordQueryCriteria, criteriaBuilder)));
return conductRecordDtoList;
}
}

@ -0,0 +1,11 @@
package com.baiye.module.service.mapstruct;
import com.baiye.model.base.BaseMapper;
import com.baiye.module.entity.ConductRecord;
import com.baiye.module.service.dto.ConductRecordDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface ConductRecordMapper extends BaseMapper<ConductRecordDto, ConductRecord> {
}

@ -127,7 +127,7 @@ public class FileAnalysisTask {
public void distinctNid(Long taskId) {
Set<Long> taskIds = new HashSet();
taskIds.add(taskId);
List<Clue> clueList = clueJpa.findClue(taskIds, null);
List<Clue> clueList = clueJpa.findClue(taskIds, null, null);
Map<String, List<Clue>> map = clueList.stream().collect(Collectors.groupingBy(Clue::getNid));
Set<String> keySet = map.keySet();
for (String key : keySet) {

@ -3,21 +3,20 @@ spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}
server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}
redis:
database: 2
host: 118.178.137.129
# host: 101.35.109.129
host: 8.130.96.163
timeout: 5000
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://118.178.137.129:3306/ad_platform?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
url: jdbc:mysql://8.130.96.163:3306/ad_platform?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
username: root
password: root
password: y7z7noq2
# 初始连接数
initial-size: 5
# 最小连接数

@ -3,20 +3,20 @@ spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}
server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}
redis:
database: 2
host: 118.178.137.129
host: 8.130.96.163
timeout: 5000
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://118.178.137.129:3306/ad_platform?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
url: jdbc:mysql://8.130.96.163:3306/ad_platform?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
username: root
password: root
password: y7z7noq2
# 初始连接数
initial-size: 5
# 最小连接数
@ -63,8 +63,8 @@ spring:
storage:
url: /usr/local/webapp/source/files/
de_symbol: /
download-template: http://118.178.137.129:8001/source/download/custom.xlsx
download-template-move: http://118.178.137.129:8001/source/download/dynamictemplate.xlsx
download-template: http://8.130.96.163:8001/source/download/custom.xlsx
download-template-move: http://8.130.96.163:8001/source/download/dynamictemplate.xlsx
# 线程池配置
save:

Loading…
Cancel
Save