|
|
|
@ -7,8 +7,15 @@ import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
|
import com.baiye.constant.DefaultNumberConstants;
|
|
|
|
|
import com.baiye.exception.BadRequestException;
|
|
|
|
|
import com.baiye.feign.SourceClueClient;
|
|
|
|
|
import com.baiye.http.CommonResponse;
|
|
|
|
|
import com.baiye.http.DoubleCallResponse;
|
|
|
|
|
import com.baiye.model.enums.ResponseCode;
|
|
|
|
|
import com.baiye.model.vo.ResSourceLabel;
|
|
|
|
|
import com.baiye.modules.report.entity.dto.StatisticalReportDTO;
|
|
|
|
|
import com.baiye.modules.report.entity.dto.UploadTaskDTO;
|
|
|
|
|
import com.baiye.modules.report.entity.vo.MemberInfoVO;
|
|
|
|
@ -27,6 +34,7 @@ import com.baiye.modules.telemarkting.entity.DoubleCallInfo;
|
|
|
|
|
import com.baiye.util.DateTimeUtil;
|
|
|
|
|
import com.baiye.util.ExportExcelUtil;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.springframework.cache.annotation.Cacheable;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
@ -34,6 +42,7 @@ import javax.annotation.Resource;
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author wjt
|
|
|
|
@ -52,6 +61,8 @@ public class ReportServiceImpl implements ReportService {
|
|
|
|
|
private OrganizeRepository organizeRepository;
|
|
|
|
|
@Resource
|
|
|
|
|
private UserRepository userRepository;
|
|
|
|
|
@Resource
|
|
|
|
|
private SourceClueClient sourceClueClient;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResponse<Object> getReportByAll() {
|
|
|
|
@ -80,6 +91,167 @@ public class ReportServiceImpl implements ReportService {
|
|
|
|
|
ExportExcelUtil.downloadEasyExcel(response, UploadTaskDTO.class, mapByTaskUpload);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void downloadSingleTaskReport(HttpServletResponse response, Long id) {
|
|
|
|
|
List<AllCallInfo> allCallInfos = allCallInfoRepository.selectClueByTaskId(id);
|
|
|
|
|
//以线索id分组
|
|
|
|
|
Map<Long, List<AllCallInfo>> map = new HashMap<>(16);
|
|
|
|
|
allCallInfos.stream().collect(Collectors.groupingBy(AllCallInfo::getClueId, Collectors.toList())).forEach(map::put);
|
|
|
|
|
|
|
|
|
|
//提取线索id
|
|
|
|
|
List<Long> clueIds = allCallInfos.stream().map(AllCallInfo::getClueId).collect(Collectors.toList());
|
|
|
|
|
//获取线索信息
|
|
|
|
|
List<ResSourceLabel> clueInfos = sourceClueClient.findSourceLabel(clueIds).getBody();
|
|
|
|
|
Map<Long, ResSourceLabel> clueMap = new HashMap<>();
|
|
|
|
|
if (CollUtil.isNotEmpty(clueInfos) && clueInfos != null) {
|
|
|
|
|
for (ResSourceLabel r : clueInfos) {
|
|
|
|
|
clueMap.put(r.getClueId(), r);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取任务的基础标签
|
|
|
|
|
String taskName = "";
|
|
|
|
|
List<String> baseLabel = new ArrayList<>();
|
|
|
|
|
Task taskInfo = taskRepository.findByIsDistributionAndId(DefaultNumberConstants.ONE_NUMBER, id);
|
|
|
|
|
if (ObjectUtil.isNull(taskInfo)) {
|
|
|
|
|
log.error("未找到符合的任务");
|
|
|
|
|
// throw new BadRequestException("未找到符合的任务");
|
|
|
|
|
} else {
|
|
|
|
|
taskName = taskInfo.getTaskName();
|
|
|
|
|
//任务标签
|
|
|
|
|
baseLabel = taskInfo.getBaseLabel();
|
|
|
|
|
}
|
|
|
|
|
Collections.sort(baseLabel);
|
|
|
|
|
List<LinkedList<Object>> linkedLists = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for (Long key : map.keySet()) {
|
|
|
|
|
List<AllCallInfo> list = map.get(key);
|
|
|
|
|
//获取线索名
|
|
|
|
|
String clueName = null;
|
|
|
|
|
List<String> label = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
if (clueMap.containsKey(key)) {
|
|
|
|
|
ResSourceLabel resSourceLabel = clueMap.get(key);
|
|
|
|
|
clueName = resSourceLabel.getName();
|
|
|
|
|
label = JSONUtil.toList(JSONUtil.parseArray(resSourceLabel.getSourceLabel()), String.class);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LinkedList<Object> linkedList = getDownLoadTaskInfo(clueName, list);
|
|
|
|
|
for (String l : baseLabel) {
|
|
|
|
|
if (label.size() > 0 && label.contains(l)) {
|
|
|
|
|
linkedList.add("√");
|
|
|
|
|
} else {
|
|
|
|
|
linkedList.add("×");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
linkedLists.add(linkedList);
|
|
|
|
|
}
|
|
|
|
|
ExportExcelUtil.dynamicHeadWrite(response, linkedLists, baseLabel, taskName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResponse<Object> reportSingleTaskReport(Long id) {
|
|
|
|
|
List<MemberInfoVO> listVo = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
List<AllCallInfo> allCallInfos = allCallInfoRepository.selectClueByTaskId(id);
|
|
|
|
|
|
|
|
|
|
//以线索id分组
|
|
|
|
|
Map<Long, List<AllCallInfo>> map = new HashMap<>(16);
|
|
|
|
|
allCallInfos.stream().collect(Collectors.groupingBy(AllCallInfo::getClueId, Collectors.toList())).forEach(map::put);
|
|
|
|
|
|
|
|
|
|
//提取线索id
|
|
|
|
|
List<Long> clueIds = allCallInfos.stream().map(AllCallInfo::getClueId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//获取线索信息
|
|
|
|
|
List<ResSourceLabel> clueInfos = sourceClueClient.findSourceLabel(clueIds).getBody();
|
|
|
|
|
Map<Long, ResSourceLabel> clueMap = new HashMap<>();
|
|
|
|
|
if (CollUtil.isNotEmpty(clueInfos) && clueInfos != null) {
|
|
|
|
|
for (ResSourceLabel r : clueInfos) {
|
|
|
|
|
clueMap.put(r.getClueId(), r);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (AllCallInfo info : allCallInfos) {
|
|
|
|
|
String clueName = "";
|
|
|
|
|
if (clueMap.containsKey(info.getClueId())) {
|
|
|
|
|
ResSourceLabel resSourceLabel = clueMap.get(info.getClueId());
|
|
|
|
|
clueName = resSourceLabel.getName();
|
|
|
|
|
}
|
|
|
|
|
MemberInfoVO reportTaskInfo = getReportTaskInfo(info.getClueId(), clueName, map.get(info.getClueId()));
|
|
|
|
|
listVo.add(reportTaskInfo);
|
|
|
|
|
}
|
|
|
|
|
return CommonResponse.createBySuccess(listVo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MemberInfoVO getReportTaskInfo(Long clueId, String clueName, List<AllCallInfo> list) {
|
|
|
|
|
int usrNum = list.size();
|
|
|
|
|
//接通数
|
|
|
|
|
int turnOnNum = 0;
|
|
|
|
|
//外呼总时长
|
|
|
|
|
int breatheTotalDuration = 0;
|
|
|
|
|
double breatheAverageDuration = 0;
|
|
|
|
|
double turnOnRate = 0;
|
|
|
|
|
for (AllCallInfo info : list) {
|
|
|
|
|
//接通
|
|
|
|
|
if (info.getStatus() == DefaultNumberConstants.TWO_NUMBER) {
|
|
|
|
|
turnOnNum++;
|
|
|
|
|
breatheTotalDuration += info.getDuration();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (usrNum != 0) {
|
|
|
|
|
//接通率
|
|
|
|
|
turnOnRate = NumberUtil.div(turnOnNum, usrNum, 2);
|
|
|
|
|
if (turnOnNum != 0) {
|
|
|
|
|
//平均时长
|
|
|
|
|
breatheAverageDuration = NumberUtil.div(breatheTotalDuration, turnOnNum, 2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
MemberInfoVO memberInfoVO = new MemberInfoVO();
|
|
|
|
|
memberInfoVO.setClueId(clueId);
|
|
|
|
|
memberInfoVO.setClueName(clueName);
|
|
|
|
|
memberInfoVO.setUsrNum(usrNum);
|
|
|
|
|
memberInfoVO.setTurnOnNum(turnOnNum);
|
|
|
|
|
memberInfoVO.setTurnOnRate(turnOnRate);
|
|
|
|
|
memberInfoVO.setBreatheTotalDuration(breatheTotalDuration);
|
|
|
|
|
memberInfoVO.setBreatheAverageDuration(breatheAverageDuration);
|
|
|
|
|
|
|
|
|
|
return memberInfoVO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private LinkedList<Object> getDownLoadTaskInfo(String clueName, List<AllCallInfo> list) {
|
|
|
|
|
int usrNum = list.size();
|
|
|
|
|
//接通数
|
|
|
|
|
int turnOnNum = 0;
|
|
|
|
|
//外呼总时长
|
|
|
|
|
int breatheTotalDuration = 0;
|
|
|
|
|
double breatheAverageDuration = 0;
|
|
|
|
|
double turnOnRate = 0;
|
|
|
|
|
for (AllCallInfo info : list) {
|
|
|
|
|
//接通
|
|
|
|
|
if (info.getStatus() == DefaultNumberConstants.TWO_NUMBER) {
|
|
|
|
|
turnOnNum++;
|
|
|
|
|
breatheTotalDuration += info.getDuration();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (usrNum != 0) {
|
|
|
|
|
//接通率
|
|
|
|
|
turnOnRate = NumberUtil.div(turnOnNum, usrNum, 2);
|
|
|
|
|
if (turnOnNum != 0) {
|
|
|
|
|
//平均时长
|
|
|
|
|
breatheAverageDuration = NumberUtil.div(breatheTotalDuration, turnOnNum, 2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
LinkedList<Object> linkedList = new LinkedList<>();
|
|
|
|
|
linkedList.add(clueName);
|
|
|
|
|
linkedList.add(usrNum);
|
|
|
|
|
linkedList.add(turnOnNum);
|
|
|
|
|
linkedList.add(turnOnRate);
|
|
|
|
|
linkedList.add(breatheTotalDuration);
|
|
|
|
|
linkedList.add(breatheAverageDuration);
|
|
|
|
|
|
|
|
|
|
return linkedList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResponse<Object> getReportByOrganize(StatisticalReportDTO s) {
|
|
|
|
|
String beginTime = s.getBeginTime();
|
|
|
|
|