|
|
@ -0,0 +1,221 @@
|
|
|
|
|
|
|
|
package com.baiye.modules.distribute.service.impl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUnit;
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
|
|
|
import cn.hutool.core.io.IoUtil;
|
|
|
|
|
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
|
|
|
|
|
import cn.hutool.poi.excel.ExcelUtil;
|
|
|
|
|
|
|
|
import cn.hutool.poi.excel.ExcelWriter;
|
|
|
|
|
|
|
|
import com.baiye.enums.ChannelTypeEnum;
|
|
|
|
|
|
|
|
import com.baiye.exception.BadRequestException;
|
|
|
|
|
|
|
|
import com.baiye.modules.distribute.dto.HomePageDTO;
|
|
|
|
|
|
|
|
import com.baiye.modules.distribute.mapper.ClueMapper;
|
|
|
|
|
|
|
|
import com.baiye.modules.distribute.mapper.CustomMapper;
|
|
|
|
|
|
|
|
import com.baiye.modules.distribute.qo.HomePageQo;
|
|
|
|
|
|
|
|
import com.baiye.modules.distribute.service.HomepageService;
|
|
|
|
|
|
|
|
import com.baiye.modules.distribute.vo.ChannelAssignedClueExportVo;
|
|
|
|
|
|
|
|
import com.baiye.modules.distribute.vo.ChannelEnterClueExportVO;
|
|
|
|
|
|
|
|
import com.baiye.security.util.SecurityUtils;
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import javax.servlet.ServletOutputStream;
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @author wjt
|
|
|
|
|
|
|
|
* @date 2023/12/6
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
|
|
|
public class HomepageServiceImpl implements HomepageService {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final ClueMapper clueMapper;
|
|
|
|
|
|
|
|
private final CustomMapper customMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Map<String, Object> baseCount() {
|
|
|
|
|
|
|
|
//进线
|
|
|
|
|
|
|
|
List<Integer> list = customMapper.addCount(DateUtil.format(DateUtil.date(), "yyyy-MM-dd"), SecurityUtils.getCurrentUserId());
|
|
|
|
|
|
|
|
//分发
|
|
|
|
|
|
|
|
Integer assignedNum = clueMapper.addCount(DateUtil.format(DateUtil.date(), "yyyy-MM-dd"), SecurityUtils.getCurrentUserId());
|
|
|
|
|
|
|
|
//进线数
|
|
|
|
|
|
|
|
Integer enterNum = 0;
|
|
|
|
|
|
|
|
//分发率
|
|
|
|
|
|
|
|
double assignedRate = 0.0;
|
|
|
|
|
|
|
|
//重审数
|
|
|
|
|
|
|
|
int reviewNum = 0;
|
|
|
|
|
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
|
|
|
|
|
enterNum = list.size();
|
|
|
|
|
|
|
|
assignedRate = NumberUtil.div(assignedNum, enterNum).doubleValue();
|
|
|
|
|
|
|
|
reviewNum = (int) list.stream().filter(type -> type == 3).count();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>(16);
|
|
|
|
|
|
|
|
map.put("enterNum", enterNum);
|
|
|
|
|
|
|
|
map.put("assignedNum", assignedNum);
|
|
|
|
|
|
|
|
map.put("reviewNum", reviewNum);
|
|
|
|
|
|
|
|
map.put("assignedRate", assignedRate);
|
|
|
|
|
|
|
|
return map;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Map<String, Map<String, Integer>> channelEnterClue(HomePageQo homePageQo) {
|
|
|
|
|
|
|
|
Long currentUserId = SecurityUtils.getCurrentUserId();
|
|
|
|
|
|
|
|
homePageQo.setCompanyId(currentUserId);
|
|
|
|
|
|
|
|
List<HomePageDTO> homePageDTO = customMapper.selectByCompanyIdAndTime(homePageQo);
|
|
|
|
|
|
|
|
if (CollUtil.isEmpty(homePageDTO)) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//按录入员分组
|
|
|
|
|
|
|
|
Map<String, List<HomePageDTO>> homePageByChannelType = homePageDTO.stream()
|
|
|
|
|
|
|
|
.collect(Collectors.groupingBy(HomePageDTO::getEnterName));
|
|
|
|
|
|
|
|
return dealDateSource(homePageByChannelType, homePageQo);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void channelClueExport(HttpServletResponse response, HomePageQo homePageQo) {
|
|
|
|
|
|
|
|
Long currentUserId = SecurityUtils.getCurrentUserId();
|
|
|
|
|
|
|
|
homePageQo.setCompanyId(currentUserId);
|
|
|
|
|
|
|
|
if (homePageQo.getType() == 1) {
|
|
|
|
|
|
|
|
channelEnterClueExport(response, homePageQo);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
channelAssignedClueExport(response, homePageQo);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void channelEnterClueExport(HttpServletResponse response, HomePageQo homePageQo) {
|
|
|
|
|
|
|
|
List<HomePageDTO> homePageDTO = customMapper.selectByCompanyIdAndTime(homePageQo);
|
|
|
|
|
|
|
|
if (CollUtil.isEmpty(homePageDTO)) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//渠道商
|
|
|
|
|
|
|
|
String channelType = ChannelTypeEnum.find(homePageQo.getChannelType());
|
|
|
|
|
|
|
|
List<ChannelEnterClueExportVO> list = new ArrayList<>();
|
|
|
|
|
|
|
|
//按录入员分组
|
|
|
|
|
|
|
|
Map<String, List<HomePageDTO>> homePageByChannelType = homePageDTO.stream()
|
|
|
|
|
|
|
|
.collect(Collectors.groupingBy(HomePageDTO::getEnterName));
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<HomePageDTO>> entry : homePageByChannelType.entrySet()) {
|
|
|
|
|
|
|
|
//录入员
|
|
|
|
|
|
|
|
String key = entry.getKey();
|
|
|
|
|
|
|
|
List<HomePageDTO> value = entry.getValue();
|
|
|
|
|
|
|
|
//按时间分组
|
|
|
|
|
|
|
|
Map<String, List<HomePageDTO>> collect = value.stream().collect(Collectors.groupingBy(HomePageDTO::getCreateTime));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<HomePageDTO>> map : collect.entrySet()) {
|
|
|
|
|
|
|
|
String time = map.getKey();
|
|
|
|
|
|
|
|
int size = map.getValue().size();
|
|
|
|
|
|
|
|
ChannelEnterClueExportVO channelEnterClueExportVO = new ChannelEnterClueExportVO();
|
|
|
|
|
|
|
|
channelEnterClueExportVO.setChannelType(channelType);
|
|
|
|
|
|
|
|
channelEnterClueExportVO.setEnterBy(key);
|
|
|
|
|
|
|
|
channelEnterClueExportVO.setDate(time);
|
|
|
|
|
|
|
|
channelEnterClueExportVO.setNum(size);
|
|
|
|
|
|
|
|
list.add(channelEnterClueExportVO);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//导出
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
ExcelWriter writer = ExcelUtil.getWriter();
|
|
|
|
|
|
|
|
writer.write(list, true);
|
|
|
|
|
|
|
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
|
|
|
|
|
|
|
|
response.setHeader("Content-Disposition", "attachment;filename=export.xlsx");
|
|
|
|
|
|
|
|
ServletOutputStream out = response.getOutputStream();
|
|
|
|
|
|
|
|
writer.flush(out, true);
|
|
|
|
|
|
|
|
writer.close();
|
|
|
|
|
|
|
|
IoUtil.close(out);
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
throw new BadRequestException("导出失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Map<String, Map<String, Integer>> channelAssignedClue(HomePageQo homePageQo) {
|
|
|
|
|
|
|
|
Long currentUserId = SecurityUtils.getCurrentUserId();
|
|
|
|
|
|
|
|
homePageQo.setCompanyId(currentUserId);
|
|
|
|
|
|
|
|
List<HomePageDTO> homePageDTO = clueMapper.selectDetailByChannelAndAssigned(homePageQo);
|
|
|
|
|
|
|
|
if (CollUtil.isEmpty(homePageDTO)) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//按分配人分组
|
|
|
|
|
|
|
|
Map<String, List<HomePageDTO>> homePageByAssigned = homePageDTO.stream()
|
|
|
|
|
|
|
|
.collect(Collectors.groupingBy(HomePageDTO::getAssignedName));
|
|
|
|
|
|
|
|
return dealDateSource(homePageByAssigned, homePageQo);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void channelAssignedClueExport(HttpServletResponse response, HomePageQo homePageQo) {
|
|
|
|
|
|
|
|
List<HomePageDTO> homePageDTO = clueMapper.selectDetailByChannelAndAssigned(homePageQo);
|
|
|
|
|
|
|
|
if (CollUtil.isEmpty(homePageDTO)) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//渠道商
|
|
|
|
|
|
|
|
String channelType = ChannelTypeEnum.find(homePageQo.getChannelType());
|
|
|
|
|
|
|
|
List<ChannelAssignedClueExportVo> list = new ArrayList<>();
|
|
|
|
|
|
|
|
//按分配人分组
|
|
|
|
|
|
|
|
Map<String, List<HomePageDTO>> homePageByAssigned = homePageDTO.stream()
|
|
|
|
|
|
|
|
.collect(Collectors.groupingBy(HomePageDTO::getAssignedName));
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<HomePageDTO>> entry : homePageByAssigned.entrySet()) {
|
|
|
|
|
|
|
|
//分配员
|
|
|
|
|
|
|
|
String key = entry.getKey();
|
|
|
|
|
|
|
|
List<HomePageDTO> value = entry.getValue();
|
|
|
|
|
|
|
|
//按时间分组
|
|
|
|
|
|
|
|
Map<String, List<HomePageDTO>> collect = value.stream().collect(Collectors.groupingBy(HomePageDTO::getCreateTime));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<HomePageDTO>> map : collect.entrySet()) {
|
|
|
|
|
|
|
|
String time = map.getKey();
|
|
|
|
|
|
|
|
int size = map.getValue().size();
|
|
|
|
|
|
|
|
ChannelAssignedClueExportVo channelAssignedClueExportVo = new ChannelAssignedClueExportVo();
|
|
|
|
|
|
|
|
channelAssignedClueExportVo.setChannelType(channelType);
|
|
|
|
|
|
|
|
channelAssignedClueExportVo.setAssignedBy(key);
|
|
|
|
|
|
|
|
channelAssignedClueExportVo.setDate(time);
|
|
|
|
|
|
|
|
channelAssignedClueExportVo.setNum(size);
|
|
|
|
|
|
|
|
list.add(channelAssignedClueExportVo);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//导出
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
ExcelWriter writer = ExcelUtil.getWriter();
|
|
|
|
|
|
|
|
writer.write(list, true);
|
|
|
|
|
|
|
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
|
|
|
|
|
|
|
|
response.setHeader("Content-Disposition", "attachment;filename=export.xlsx");
|
|
|
|
|
|
|
|
ServletOutputStream out = response.getOutputStream();
|
|
|
|
|
|
|
|
writer.flush(out, true);
|
|
|
|
|
|
|
|
writer.close();
|
|
|
|
|
|
|
|
IoUtil.close(out);
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
throw new BadRequestException("导出失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Map<String, Map<String, Integer>> dealDateSource(Map<String, List<HomePageDTO>> homePageList, HomePageQo homePageQo) {
|
|
|
|
|
|
|
|
//返回统计值 结构如 {0:{"2023-12-6":100}}
|
|
|
|
|
|
|
|
Map<String, Map<String, Integer>> mapChannelType = new HashMap<>(16);
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<HomePageDTO>> entry : homePageList.entrySet()) {
|
|
|
|
|
|
|
|
//录入员名称
|
|
|
|
|
|
|
|
String key = entry.getKey();
|
|
|
|
|
|
|
|
List<HomePageDTO> value = entry.getValue();
|
|
|
|
|
|
|
|
//按时间分组
|
|
|
|
|
|
|
|
Map<String, List<HomePageDTO>> homePageByTime = value.stream()
|
|
|
|
|
|
|
|
.collect(Collectors.groupingBy(HomePageDTO::getCreateTime));
|
|
|
|
|
|
|
|
long betweenDay = DateUtil.between(DateUtil.parseDate(homePageQo.getCreateStartTime()), DateUtil.parseDate(homePageQo.getCreateEndTime()), DateUnit.DAY);
|
|
|
|
|
|
|
|
//返回日期值 如{"2023-12-6":100}
|
|
|
|
|
|
|
|
Map<String, Integer> mapNum = new LinkedHashMap<>(16);
|
|
|
|
|
|
|
|
for (int i = 0; i <= betweenDay; i++) {
|
|
|
|
|
|
|
|
String time = DateUtil.format(DateUtil.offsetDay(DateUtil.parseDate(homePageQo.getCreateStartTime()), i), "yyyy-MM-dd");
|
|
|
|
|
|
|
|
if (homePageByTime.containsKey(time)) {
|
|
|
|
|
|
|
|
List<HomePageDTO> homePageS = homePageByTime.get(time);
|
|
|
|
|
|
|
|
mapNum.put(time, homePageS.size());
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
mapNum.put(time, 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
mapChannelType.put(key, mapNum);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return mapChannelType;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|