拓客统计
parent
3f36dcbf51
commit
519739cdbe
@ -0,0 +1,13 @@
|
||||
package com.baiye.constant;
|
||||
|
||||
/**
|
||||
* @author jt
|
||||
*/
|
||||
public class SourceLabelConstants {
|
||||
|
||||
public static final String INTENTION = "有意向";
|
||||
|
||||
public static final String NOT_INTENTION = "无意向";
|
||||
|
||||
public static final String NOT_TURN_ON = "未接通";
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.baiye.module.controller;
|
||||
|
||||
import com.baiye.module.entity.dto.ReportTokerDTO;
|
||||
import com.baiye.module.service.ReportTokerService;
|
||||
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.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* @author jt
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@Api(tags = "拓客任务的统计")
|
||||
@RequestMapping("/source/report")
|
||||
@Slf4j
|
||||
public class ReportTokerController {
|
||||
|
||||
private final ReportTokerService reportTokerService;
|
||||
|
||||
@ApiOperation("拓客的折线图")
|
||||
@PostMapping("/toker/broken")
|
||||
public ResponseEntity<Object> reportTokerBroken(@RequestBody ReportTokerDTO reportTokerDTO) {
|
||||
return new ResponseEntity<>(reportTokerService.reportTokerBroken(reportTokerDTO), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/toker/download")
|
||||
@ApiOperation("拓客统计导出")
|
||||
public void downloadReportToker(HttpServletResponse response, @RequestBody ReportTokerDTO reportTokerDTO) {
|
||||
reportTokerService.downloadReportToker(response, reportTokerDTO);
|
||||
}
|
||||
|
||||
@ApiOperation("拓客的饼图")
|
||||
@PostMapping("/toker/pie")
|
||||
public ResponseEntity<Object> reportTokerPie(@RequestBody ReportTokerDTO reportTokerDTO) {
|
||||
return new ResponseEntity<>(reportTokerService.reportTokerPie(reportTokerDTO), HttpStatus.OK);
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package com.baiye.module.dao;
|
||||
|
||||
import com.baiye.module.entity.ReportToker;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author jt
|
||||
*/
|
||||
@Repository
|
||||
public interface ReportTokerRepository extends JpaRepository<ReportToker, Long>, JpaSpecificationExecutor<ReportToker> {
|
||||
|
||||
/**
|
||||
* 统计投客任务折线
|
||||
*
|
||||
* @param beginTime
|
||||
* @param endTime
|
||||
* @param taskId
|
||||
* @param memberId
|
||||
* @return
|
||||
*/
|
||||
@Query(value = "select * from tb_report_toker where (create_time between ?1 and ?2) and task_id =?3 and (coalesce (?4,null) is null or member_id = ?4)", nativeQuery = true)
|
||||
List<ReportToker> queryAllByTimeAndTaskId(String beginTime, String endTime, Long taskId, Long memberId);
|
||||
|
||||
/**
|
||||
* 统计投客任务饼图
|
||||
*
|
||||
* @param beginTime
|
||||
* @param endTime
|
||||
* @param taskIds
|
||||
* @return
|
||||
*/
|
||||
@Query(value = "select * from tb_report_toker where (create_time between ?1 and ?2) and task_id in (?3)", nativeQuery = true)
|
||||
List<ReportToker> queryAllByTimeAndTaskIds(String beginTime, String endTime, List<Long> taskIds);
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.baiye.module.entity.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author jt
|
||||
*/
|
||||
@Data
|
||||
public class ReportTokerDTO {
|
||||
|
||||
/**
|
||||
* 开始时间
|
||||
*/
|
||||
private String beginTime;
|
||||
/**
|
||||
* 结束时间
|
||||
*/
|
||||
private String endTime;
|
||||
|
||||
private List<Long> taskIds;
|
||||
/**
|
||||
* 任务id
|
||||
*/
|
||||
private Long taskId;
|
||||
|
||||
private Long memberId;
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.baiye.module.entity.dto;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author jt
|
||||
*/
|
||||
@Data
|
||||
public class UploadTokerDTO {
|
||||
|
||||
@ExcelProperty(value = "时间", index = 0)
|
||||
private String createTime;
|
||||
@ExcelProperty(value = "任务", index = 1)
|
||||
private String taskName;
|
||||
@ExcelProperty(value = "业务员", index = 2)
|
||||
private String userName;
|
||||
@ExcelProperty(value = "有意向", index = 3)
|
||||
private Integer intention;
|
||||
@ExcelProperty(value = "无意向", index = 4)
|
||||
private Integer notIntention;
|
||||
@ExcelProperty(value = "未接通", index = 5)
|
||||
private Integer notTurnOn;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.baiye.module.service;
|
||||
|
||||
import com.baiye.module.entity.dto.ReportTokerDTO;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author jt
|
||||
*/
|
||||
public interface ReportTokerService {
|
||||
Map<String, Object> reportTokerBroken(ReportTokerDTO reportTokerDTO);
|
||||
|
||||
void downloadReportToker(HttpServletResponse response, ReportTokerDTO reportTokerDTO);
|
||||
|
||||
List<HashMap<String, Object>> reportTokerPie(ReportTokerDTO reportTokerDTO);
|
||||
}
|
@ -0,0 +1,199 @@
|
||||
package com.baiye.module.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUnit;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baiye.constant.DefaultNumberConstants;
|
||||
import com.baiye.exception.BadRequestException;
|
||||
import com.baiye.feign.TaskClient;
|
||||
import com.baiye.feign.UserClient;
|
||||
import com.baiye.module.dao.ReportTokerRepository;
|
||||
import com.baiye.module.entity.ReportToker;
|
||||
import com.baiye.module.entity.Task;
|
||||
import com.baiye.module.entity.dto.ReportTokerDTO;
|
||||
import com.baiye.module.entity.dto.UploadTokerDTO;
|
||||
import com.baiye.module.service.ReportTokerService;
|
||||
import com.baiye.task.ReportSync;
|
||||
import com.baiye.util.ExportExcelUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author jt
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class ReportTokerServiceImpl implements ReportTokerService {
|
||||
private final ReportTokerRepository reportTokerRepository;
|
||||
private final TaskClient taskClient;
|
||||
private final UserClient userClient;
|
||||
|
||||
private final ReportSync reportSync;
|
||||
|
||||
@Override
|
||||
public Map<String, Object> reportTokerBroken(ReportTokerDTO reportTokerDTO) {
|
||||
|
||||
dealTime(reportTokerDTO);
|
||||
|
||||
String beginTime = reportTokerDTO.getBeginTime();
|
||||
String endTime = reportTokerDTO.getEndTime();
|
||||
if (reportTokerDTO.getTaskId() == null) {
|
||||
throw new BadRequestException("请选择任务");
|
||||
}
|
||||
List<ReportToker> reportTokers = reportTokerRepository.queryAllByTimeAndTaskId(beginTime, endTime, reportTokerDTO.getTaskId(), reportTokerDTO.getMemberId());
|
||||
|
||||
long between = DateUtil.between(DateUtil.parseDate(endTime), DateUtil.parseDate(DateUtil.today()), DateUnit.DAY);
|
||||
//TODO 需要实时查询当天的统计
|
||||
if (between == DefaultNumberConstants.ZERO_NUMBER) {
|
||||
List<ReportToker> tokers = reportSync.dealData(beginTime, endTime);
|
||||
reportTokers.addAll(tokers);
|
||||
}
|
||||
|
||||
return dealReportData(beginTime, endTime, reportTokerDTO.getTaskId(), reportTokerDTO.getMemberId(), reportTokers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadReportToker(HttpServletResponse response, ReportTokerDTO reportTokerDTO) {
|
||||
dealTime(reportTokerDTO);
|
||||
if (reportTokerDTO.getTaskId() == null) {
|
||||
throw new BadRequestException("请选择任务");
|
||||
}
|
||||
List<ReportToker> reportTokers = reportTokerRepository.queryAllByTimeAndTaskId(reportTokerDTO.getBeginTime(), reportTokerDTO.getEndTime(), reportTokerDTO.getTaskId(), null);
|
||||
List<UploadTokerDTO> list = new ArrayList<>();
|
||||
for (ReportToker reportToker : reportTokers) {
|
||||
UploadTokerDTO uploadTokerDTO = new UploadTokerDTO();
|
||||
uploadTokerDTO.setIntention(reportToker.getIntention());
|
||||
uploadTokerDTO.setNotIntention(reportToker.getNotIntention());
|
||||
uploadTokerDTO.setNotTurnOn(reportToker.getNotTurnOn());
|
||||
uploadTokerDTO.setCreateTime(DateUtil.format(reportToker.getCreateTime(), "yyyy-MM-dd"));
|
||||
uploadTokerDTO.setTaskName(findByTaskId(reportToker.getTaskId()));
|
||||
uploadTokerDTO.setUserName(reportToker.getMemberName());
|
||||
list.add(uploadTokerDTO);
|
||||
}
|
||||
ExportExcelUtil.downloadEasyExcel(response, UploadTokerDTO.class, list);
|
||||
}
|
||||
|
||||
private void dealTime(ReportTokerDTO reportTokerDTO) {
|
||||
String beginTime = reportTokerDTO.getBeginTime();
|
||||
String endTime = reportTokerDTO.getEndTime();
|
||||
if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) {
|
||||
reportTokerDTO.setBeginTime(DateUtil.today());
|
||||
reportTokerDTO.setEndTime(DateUtil.today());
|
||||
} else {
|
||||
reportTokerDTO.setBeginTime(DateUtil.format(DateUtil.parseDate(beginTime), "yyyy-MM-dd"));
|
||||
reportTokerDTO.setEndTime(DateUtil.format(DateUtil.parseDate(endTime), "yyyy-MM-dd"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 只查任务的
|
||||
*
|
||||
* @param beginTime
|
||||
* @param endTime
|
||||
* @param reportTokers
|
||||
* @return
|
||||
*/
|
||||
private Map<String, Object> dealReportData(String beginTime, String endTime, Long taskId, Long memberId, List<ReportToker> reportTokers) {
|
||||
|
||||
Date start = DateUtil.parseDate(beginTime);
|
||||
Date end = DateUtil.parseDate(endTime);
|
||||
int between = (int) DateUtil.between(start, end, DateUnit.DAY);
|
||||
// Map<Date, List<ReportToker>> collect = reportTokers.stream().collect(Collectors.groupingBy(ReportToker::getCreateTime, Collectors.toList()));
|
||||
List<HashMap<String, Object>> list = new ArrayList<>();
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
String userName = null;
|
||||
if (CollUtil.isNotEmpty(reportTokers)) {
|
||||
userName = reportTokers.get(0).getMemberName();
|
||||
}
|
||||
for (int i = 0; i <= between; i++) {
|
||||
Date date = DateUtil.offsetDay(start, i);
|
||||
HashMap<String, Object> dataMap = new HashMap<>();
|
||||
int intention = 0;
|
||||
int notIntention = 0;
|
||||
int notTurnOn = 0;
|
||||
if (CollUtil.isNotEmpty(reportTokers)) {
|
||||
|
||||
for (ReportToker reportToker : reportTokers) {
|
||||
Date time = reportToker.getCreateTime();
|
||||
if (Objects.equals(DateUtil.formatDate(date), DateUtil.formatDate(time))) {
|
||||
intention += reportToker.getIntention();
|
||||
notIntention += reportToker.getNotIntention();
|
||||
notTurnOn += reportToker.getNotTurnOn();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
dataMap.put("time", DateUtil.format(date, "yyyy-MM-dd"));
|
||||
dataMap.put("intention", intention);
|
||||
dataMap.put("notIntention", notIntention);
|
||||
dataMap.put("notTurnOn", notTurnOn);
|
||||
list.add(dataMap);
|
||||
|
||||
}
|
||||
|
||||
if (memberId != null) {
|
||||
if (StrUtil.isBlank(userName)) {
|
||||
Set<Long> set = new HashSet<>();
|
||||
set.add(memberId);
|
||||
Map<Long, String> userNameList = userClient.findById(set);
|
||||
map.put("name", userNameList.get(memberId));
|
||||
} else {
|
||||
map.put("name", userName);
|
||||
}
|
||||
} else {
|
||||
map.put("name", findByTaskId(taskId));
|
||||
}
|
||||
map.put("data", list);
|
||||
return map;
|
||||
}
|
||||
|
||||
@Cacheable(value = "taskName", key = "'task:name:' + #p0")
|
||||
public String findByTaskId(Long taskId) {
|
||||
Task body = taskClient.queryDetails(taskId).getBody();
|
||||
if (ObjectUtil.isNotEmpty(body)) {
|
||||
return body.getTaskName();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<HashMap<String, Object>> reportTokerPie(ReportTokerDTO reportTokerDTO) {
|
||||
dealTime(reportTokerDTO);
|
||||
if (CollUtil.isEmpty(reportTokerDTO.getTaskIds())) {
|
||||
throw new BadRequestException("请选择任务");
|
||||
}
|
||||
List<HashMap<String, Object>> list = new ArrayList<>();
|
||||
List<ReportToker> tokers = reportTokerRepository.queryAllByTimeAndTaskIds(reportTokerDTO.getBeginTime(), reportTokerDTO.getEndTime(), reportTokerDTO.getTaskIds());
|
||||
Map<Long, List<ReportToker>> tokerByTaskId = tokers.stream().collect(Collectors.groupingBy(ReportToker::getTaskId, Collectors.toList()));
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
for (Long taskId : tokerByTaskId.keySet()) {
|
||||
String taskName = findByTaskId(taskId);
|
||||
List<ReportToker> tokerByTaskIdList = tokerByTaskId.get(taskId);
|
||||
int intention = 0;
|
||||
int notIntention = 0;
|
||||
int notTurnOn = 0;
|
||||
for (ReportToker reportToker : tokerByTaskIdList) {
|
||||
intention += reportToker.getIntention();
|
||||
notIntention += reportToker.getNotIntention();
|
||||
notTurnOn += reportToker.getNotTurnOn();
|
||||
}
|
||||
map.put("intention", intention);
|
||||
map.put("notIntention", notIntention);
|
||||
map.put("notTurnOn", notTurnOn);
|
||||
map.put("taskId", taskId);
|
||||
map.put("taskName", taskName);
|
||||
list.add(map);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue