master
wjt 10 months ago
parent e046ac1b4e
commit f9c520a5f8

@ -0,0 +1,50 @@
package com.baiye.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wjt
* @date 2023/12/7
*/
@Getter
@AllArgsConstructor
public enum ChannelTypeEnum {
/**
*
*/
MANUAL_CREATE(1, "手动创建"),
/**
*
*/
FILE_UPLOAD(2, "文件上传"),
/**
*
*/
FEI_YU(3, "飞鱼回传"),
/**
*
*/
FORM(4, "话单回传"),
/**
* api
*/
API(5, "api回传"),
;
private final Integer key;
private final String name;
public static String find(Integer key) {
for (ChannelTypeEnum channelTypeEnum : ChannelTypeEnum.values()) {
if (channelTypeEnum.key.equals(key)) {
return channelTypeEnum.name;
}
}
return null;
}
}

@ -0,0 +1,50 @@
package com.baiye.modules.distribute.controller;
import com.baiye.modules.distribute.qo.HomePageQo;
import com.baiye.modules.distribute.service.HomepageService;
import com.baiye.result.R;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
* @author wjt
* @date 2023/12/6
*
*/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/homePage")
public class HomepageController {
private final HomepageService homepageService;
@GetMapping("/base")
@Operation(description = "今日实时")
public R<Object> baseCount() {
return R.ok(homepageService.baseCount());
}
@PostMapping("/enter")
@Operation(description = "渠道录入")
public R<Object> channelEnterClue(@RequestBody HomePageQo homePageQo) {
return R.ok(homepageService.channelEnterClue(homePageQo));
}
@PostMapping("/assigned")
@Operation(description = "渠道分发")
public R<Object> channelAssignedClue(@RequestBody HomePageQo homePageQo) {
return R.ok(homepageService.channelAssignedClue(homePageQo));
}
@PostMapping("/export")
@Operation(summary = "导出")
public void channelClueExport(HttpServletResponse response, @RequestBody HomePageQo homePageQo) {
homepageService.channelClueExport(response, homePageQo);
}
}

@ -0,0 +1,21 @@
package com.baiye.modules.distribute.dto;
import lombok.Data;
/**
* @author wjt
* @date 2023/12/6
*/
@Data
public class HomePageDTO {
private String createTime;
private Long assignedBy;
private String assignedName;
private Long createBy;
private String enterName;
}

@ -4,9 +4,11 @@ import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.conditions.query.LambdaAliasQueryWrapperX;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.dto.HomePageDTO;
import com.baiye.modules.distribute.entity.ClueEntity;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.modules.distribute.qo.ClueQo;
import com.baiye.modules.distribute.qo.HomePageQo;
import com.baiye.modules.distribute.vo.ClueVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -41,4 +43,8 @@ public interface ClueMapper extends ExtendMapper<ClueEntity> {
IPage<ClueVO> selectByPage(IPage<ClueVO> page, @Param(Constants.WRAPPER) Wrapper<ClueEntity> wrapper);
List<HomePageDTO> selectDetailByChannelAndAssigned(@Param("qo") HomePageQo homePageQo);
Integer addCount(@Param("date") String date, @Param("companyId") Long companyId);
}

@ -5,8 +5,10 @@ import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.conditions.query.LambdaAliasQueryWrapperX;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.dto.HomePageDTO;
import com.baiye.modules.distribute.entity.CustomEntity;
import com.baiye.modules.distribute.qo.CustomQo;
import com.baiye.modules.distribute.qo.HomePageQo;
import com.baiye.modules.distribute.vo.CustomVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -14,6 +16,8 @@ import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CustomMapper extends ExtendMapper<CustomEntity> {
default PageResult<CustomVO> queryPage(PageParam pageParam, CustomQo qo) {
IPage<CustomVO> page = this.prodPage(pageParam);
@ -46,5 +50,9 @@ public interface CustomMapper extends ExtendMapper<CustomEntity> {
/**
*
*/
String selectMaxBatchNoByCompanyId(@Param("code") String code,@Param("companyId") Long companyId);
String selectMaxBatchNoByCompanyId(@Param("code") String code, @Param("companyId") Long companyId);
List<HomePageDTO> selectByCompanyIdAndTime(@Param("qo") HomePageQo homePageQo);
List<Integer> addCount(@Param("date") String date, @Param("companyId") Long companyId);
}

@ -0,0 +1,39 @@
package com.baiye.modules.distribute.qo;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springdoc.api.annotations.ParameterObject;
import java.util.List;
/**
* @author wjt
* @date 2023/12/6
*/
@Data
@Schema(title = "首页")
@ParameterObject
public class HomePageQo {
@Parameter(description = "公司id")
private Long companyId;
@Parameter(description = "添加的开始时间")
private String createStartTime;
@Parameter(description = "添加的结束时间")
private String createEndTime;
@Parameter(description = "分配的客户id")
private List<Long> assignedIdList;
@Parameter(description = "录入员id")
private List<Long> enterIdList;
@Parameter(description = "渠道类型(1 手动创建 2文件上传 3飞鱼回传 4话单回传 5 api回传)")
private Integer channelType;
@Parameter(description = "下载类型 1- 录入 2-分发")
private Integer type;
}

@ -0,0 +1,45 @@
package com.baiye.modules.distribute.service;
import com.baiye.modules.distribute.qo.HomePageQo;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @author wjt
* @date 2023/12/6
*/
public interface HomepageService {
/**
*
*
* @return
*/
Map<String, Object> baseCount();
/**
* 线
*
* @param homePageQo
* @return
*/
Map<String, Map<String, Integer>> channelEnterClue(HomePageQo homePageQo);
/**
* 线
*
* @param response
* @param homePageQo
*/
void channelClueExport(HttpServletResponse response, HomePageQo homePageQo);
/**
*
*
* @param homePageQo
* @return
*/
Map<String, Map<String, Integer>> channelAssignedClue(HomePageQo homePageQo);
}

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

@ -0,0 +1,21 @@
package com.baiye.modules.distribute.vo;
import cn.hutool.core.annotation.Alias;
import lombok.Data;
/**
* @author wjt
* @date 2023/12/7
*/
@Data
public class ChannelAssignedClueExportVo {
@Alias(value = "渠道")
private String channelType;
@Alias(value = "分配人")
private String assignedBy;
@Alias(value = "日期")
private String date;
@Alias(value = "录入量")
private Integer num;
}

@ -0,0 +1,20 @@
package com.baiye.modules.distribute.vo;
import cn.hutool.core.annotation.Alias;
import lombok.Data;
/**
* @author wjt
* @date 2023/12/7
*/
@Data
public class ChannelEnterClueExportVO {
@Alias(value = "渠道")
private String channelType;
@Alias(value = "录入员")
private String enterBy;
@Alias(value = "日期")
private String date;
@Alias(value = "录入量")
private Integer num;
}

@ -2,7 +2,10 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.modules.distribute.mapper.ClueMapper">
<sql id="Base_Alias_Column_List">
ce.clue_id,
ce
.
clue_id
,
ce.is_new_clue,
ce.origin_name,
ce.nid,
@ -44,4 +47,26 @@
tb_clue ce
${ew.customSqlSegment}
</select>
<select id="selectDetailByChannelAndAssigned" resultType="com.baiye.modules.distribute.dto.HomePageDTO">
select DATE_FORMAT(create_time, '%Y-%m-%d') as create_time, assigned_by,assigned_name
from tb_clue
where DATE_FORMAT(create_time, '%Y-%m-%d') &gt;= #{qo.createStartTime}
and DATE_FORMAT(create_time, '%Y-%m-%d') &lt;= #{qo.createEndTime}
and company_id = #{qo.companyId}
and channel_type = #{qo.channelType}
<if test="qo.assignedIdList != null and qo.assignedIdList.size > 0">
and assigned_by in
<foreach collection="qo.assignedIdList" open="(" separator="," close=")" item="item">
#{item}
</foreach>
</if>
</select>
<select id="addCount" resultType="java.lang.Integer">
select count(1)
from tb_clue
where DATE_FORMAT(create_time, '%Y-%m-%d') = #{date}
and company_id = #{companyId}
</select>
</mapper>

@ -2,7 +2,10 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.modules.distribute.mapper.CustomMapper">
<sql id="Base_Alias_Column_List">
cm.enter_name,
cm
.
enter_name
,
cm.custom_id,
cm.custom_name,
cm.custom_nid,
@ -34,8 +37,29 @@
select batch_no
from tb_custom
where batch_no like concat(#{code}, '%')
and company_id = #{companyId}
and company_id = #{companyId}
order by custom_id desc LIMIT 1
</select>
<select id="selectByCompanyIdAndTime" resultType="com.baiye.modules.distribute.dto.HomePageDTO">
select DATE_FORMAT(create_time, '%Y-%m-%d') as create_time, create_by,enter_name
from tb_custom
where DATE_FORMAT(create_time, '%Y-%m-%d') &gt;= #{qo.createStartTime}
and DATE_FORMAT(create_time, '%Y-%m-%d') &lt;= #{qo.createEndTime}
and company_id = #{qo.companyId}
and channel_type = #{qo.channelType}
<if test="qo.enterIdList != null and qo.enterIdList.size > 0">
and create_by in
<foreach collection="qo.enterIdList" open="(" separator="," close=")" item="item">
#{item}
</foreach>
</if>
</select>
<select id="addCount" resultType="java.lang.Integer">
select type
from tb_custom
where DATE_FORMAT(create_time, '%Y-%m-%d') = #{date}
and company_id = #{companyId}
</select>
</mapper>

Loading…
Cancel
Save