package com.huike.report.service.impl; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.Stream; import com.baomidou.mybatisplus.extension.api.R; import com.huike.clues.utils.JobUtils; import com.huike.common.utils.StringUtils; import com.huike.report.domain.vo.*; import lombok.SneakyThrows; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.huike.business.mapper.TbBusinessMapper; import com.huike.clues.domain.TbActivity; import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.domain.TbClue; import com.huike.clues.domain.vo.IndexStatisticsVo; import com.huike.clues.mapper.SysDeptMapper; import com.huike.clues.mapper.SysDictDataMapper; import com.huike.clues.mapper.TbActivityMapper; import com.huike.clues.mapper.TbAssignRecordMapper; import com.huike.clues.mapper.TbClueMapper; import com.huike.common.core.domain.entity.SysDept; import com.huike.common.utils.SecurityUtils; import com.huike.contract.domain.TbContract; import com.huike.contract.mapper.TbContractMapper; import com.huike.report.mapper.ReportMapper; import com.huike.report.service.IReportService; @Service public class ReportServiceImpl implements IReportService { @Autowired private TbContractMapper contractMapper; @Autowired private SysDictDataMapper sysDictDataMapper; @Autowired private TbClueMapper clueMapper; @Autowired private TbActivityMapper activityMapper; @Autowired private TbBusinessMapper businessMapper; @Autowired private SysDeptMapper deptMapper; @Autowired private TbAssignRecordMapper assignRecordMapper; @Autowired private ReportMapper reportMpper; @Override public LineChartVO contractStatistics(String beginCreateTime, String endCreateTime) { LineChartVO lineChartVo =new LineChartVO(); try { List timeList= findDates(beginCreateTime,endCreateTime); lineChartVo.setxAxis(timeList); List series = new ArrayList<>(); List> statistics = contractMapper.contractStatistics(beginCreateTime,endCreateTime); LineSeriesVO lineSeriesDTO1=new LineSeriesVO(); lineSeriesDTO1.setName("新增客户数"); LineSeriesVO lineSeriesDTO2=new LineSeriesVO(); lineSeriesDTO2.setName("客户总数"); int sum = 0; for (String s : timeList) { Optional optional= statistics.stream().filter(d->d.get("dd").equals(s)).findFirst(); if(optional.isPresent()){ Map cuurentData= (Map)optional.get(); lineSeriesDTO1.getData().add(cuurentData.get("num")); sum += Integer.parseInt(cuurentData.get("num").toString()); }else{ lineSeriesDTO1.getData().add(0); } lineSeriesDTO2.getData().add(sum); } series.add(lineSeriesDTO1); series.add(lineSeriesDTO2); lineChartVo.setSeries(series); } catch (ParseException e) { // e.printStackTrace(); } return lineChartVo; } @Override public LineChartVO salesStatistics(String beginCreateTime, String endCreateTime) { LineChartVO lineChartVo =new LineChartVO(); try { List timeList= findDates(beginCreateTime,endCreateTime); lineChartVo.setxAxis(timeList); List series = new ArrayList<>(); List> statistics = contractMapper.salesStatistics(beginCreateTime,endCreateTime); LineSeriesVO lineSeriesVo=new LineSeriesVO(); lineSeriesVo.setName("销售统计"); int sum=0; for (String s : timeList) { Optional optional= statistics.stream().filter(d->d.get("dd").equals(s)).findFirst(); if(optional.isPresent()){ Map cuurentData= (Map)optional.get(); lineSeriesVo.getData().add(cuurentData.get("sales")); }else{ lineSeriesVo.getData().add(0); } } series.add(lineSeriesVo); lineChartVo.setSeries(series); } catch (ParseException e) { // e.printStackTrace(); } return lineChartVo; } /** * 渠道统计 */ @Override public List> chanelStatistics(String beginCreateTime, String endCreateTime) { List> data= contractMapper.chanelStatistics(beginCreateTime,endCreateTime); for (Map datum : data) { String subjectValue= (String) datum.get("channel"); String lable= sysDictDataMapper.selectDictLabel("clues_item",subjectValue); datum.put("channel",lable); } return data; } @Override public List contractReportList(TbContract tbContract) { return contractMapper.selectTbContractList(tbContract); } @Override public List> activityStatistics(String beginCreateTime, String endCreateTime) { List> data= contractMapper.activityStatistics(beginCreateTime,endCreateTime); for (Map datum : data) { Long activityId= (Long) datum.get("activity_id"); TbActivity tbActivity = activityMapper.selectTbActivityById(activityId); if(tbActivity==null){ datum.put("activity", "其他"); }else{ datum.put("activity", tbActivity.getName()); } } return data; } /** * 按照部门统计销售 * @param beginCreateTime * @param endCreateTime * @return */ @Override public List> deptStatisticsList(String beginCreateTime, String endCreateTime) { List> data= contractMapper.deptStatistics(beginCreateTime,endCreateTime); for (Map datum : data) { Long deptId= (Long) datum.get("dept_id"); if(deptId!=null){ SysDept dept= deptMapper.selectDeptById(deptId); datum.put("deptName", dept.getDeptName()); } } return data; } /** * 按照渠道统计销售 * @param beginCreateTime * @param endCreateTime * @return */ @Override public List> channelStatisticsList(String beginCreateTime, String endCreateTime) { List> data= contractMapper.channelStatistics(beginCreateTime,endCreateTime); for (Map datum : data) { String subjectValue= (String) datum.get("channel"); if(subjectValue!=null){ String lable= sysDictDataMapper.selectDictLabel("clues_item",subjectValue); datum.put("channel",lable); } } return data; } /** * 按照归属人统计销售 * @param beginCreateTime * @param endCreateTime * @return */ @Override public List> ownerShipStatisticsList(String beginCreateTime, String endCreateTime) { return contractMapper.ownerShipStatistics(beginCreateTime,endCreateTime); } @Override public List cluesStatisticsList(TbClue clue) { return clueMapper.selectTbClueForReport(clue); } @Override public List activityStatisticsList(TbActivity query) { query.setStatus("2"); List activities= activityMapper.selectTbActivityList(query); Map timeMap = query.getParams(); List list=new ArrayList<>(); for (TbActivity activity : activities) { ActivityStatisticsVo dto = new ActivityStatisticsVo(); BeanUtils.copyProperties(activity, dto); TbClue tbClue = new TbClue(); tbClue.setActivityId(activity.getId()); tbClue.setChannel(activity.getChannel()); tbClue.setParams(timeMap); Map clueCount = clueMapper.countByActivity(tbClue); if (clueCount != null) { dto.setCluesNum(Integer.parseInt(clueCount.get("total").toString())); if(clueCount.get("falseClues")!=null){ dto.setFalseCluesNum(Integer.parseInt(clueCount.get("falseClues").toString())); } if (clueCount.get("toBusiness") != null) { dto.setBusinessNum(Integer.parseInt(clueCount.get("toBusiness").toString())); } } TbContract tbContract = new TbContract(); tbContract.setChannel(activity.getChannel()); tbContract.setActivityId(activity.getId()); tbContract.setParams(timeMap); Map contractCount = contractMapper.countByActivity(tbContract); if (contractCount != null) { dto.setCustomersNum(Integer.parseInt(contractCount.get("customersNum").toString())); if(contractCount.get("amount")==null) { dto.setAmount(0d); }else { dto.setAmount((Double) contractCount.get("amount")); } if(contractCount.get("cost")==null) { dto.setCost(0d); }else { dto.setCost((Double) contractCount.get("cost")); } } list.add(dto); } return list; } /** * *************看我看我************** * 传入两个时间范围,返回这两个时间范围内的所有时间,并保存在一个集合中 * @param beginTime * @param endTime * @return * @throws ParseException */ public static List findDates(String beginTime, String endTime) throws ParseException { List allDate = new ArrayList(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date dBegin = sdf.parse(beginTime); Date dEnd = sdf.parse(endTime); allDate.add(sdf.format(dBegin)); Calendar calBegin = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calBegin.setTime(dBegin); Calendar calEnd = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calEnd.setTime(dEnd); // 测试此日期是否在指定日期之后 while (dEnd.after(calBegin.getTime())) { // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.DAY_OF_MONTH, 1); allDate.add(sdf.format(calBegin.getTime())); } System.out.println("时间==" + allDate); return allDate; } @Override public IndexVo getIndex(IndexStatisticsVo request) { Long deptId= request.getDeptId(); TbAssignRecord tbAssignRecord=new TbAssignRecord(); tbAssignRecord.setLatest("1"); assignRecordMapper.selectAssignRecordList(tbAssignRecord); return null; } @Override public List> salesStatisticsForIndex(IndexStatisticsVo request) { List> list= contractMapper.contractStatisticsByUser(request); for (Map datum : list) { Long deptId= (Long) datum.get("dept_id"); if(deptId!=null){ SysDept dept= deptMapper.selectDeptById(deptId); datum.put("deptName", dept.getDeptName()); } } return list; } /** * ************看我看我*********** * 用我能少走很多路 * 我是用来机选百分比的方法 * @param all * @param num * @return */ private BigDecimal getRadio(Integer all,Long num) { if(all.intValue()==0){ return new BigDecimal(0); } BigDecimal numBigDecimal = new BigDecimal(num); BigDecimal allBigDecimal = new BigDecimal(all); BigDecimal divide = numBigDecimal.divide(allBigDecimal,4,BigDecimal.ROUND_HALF_UP); return divide.multiply(new BigDecimal(100)); } /** * 获取首页基本数据 * @param beginCreateTime * @param endCreateTime * @return */ @Override public IndexBaseInfoVO getBaseInfo(String beginCreateTime, String endCreateTime) { //1)构建一个空的结果集对象 IndexBaseInfoVO result = new IndexBaseInfoVO(); //2 封装结果集属性 // 2.1 由于查询需要用到用户名 调用工具类获取用户名 String username = SecurityUtils.getUsername(); try { //3 封装结果集对象 result.setCluesNum(reportMpper.getCluesNum(beginCreateTime, endCreateTime, username)); result.setBusinessNum(reportMpper.getBusinessNum(beginCreateTime, endCreateTime, username)); result.setContractNum(reportMpper.getContractNum(beginCreateTime, endCreateTime, username)); result.setSalesAmount(reportMpper.getSalesAmount(beginCreateTime, endCreateTime, username)); }catch (Exception e) { e.printStackTrace(); return null; } //4 返回结果集对象 return result; } /** * 今日简报 * @return */ @Override public Map getTodayInfo() { IndexVo indexVo = new IndexVo(); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); Date start = calendar.getTime(); calendar.add(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.SECOND, -1); Date end = calendar.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String start1 = sdf.format(start); String end1 = sdf.format(end); Map map = new HashMap<>(); String username = SecurityUtils.getUsername(); map.put("todayCluesNum",reportMpper.getTodayCluesNum(start1,end1,username)); map.put("todayBusinessNum",reportMpper.getTodayBusinessNum(start1,end1,username)); map.put("todayContractNum",reportMpper.getTodayContractNum(start1,end1,username)); map.put("todaySalesAmount",reportMpper.getTodaySalesAmount(start1,end1,username)); return map; } /** * 特办事项 * @param beginCreateTime * @param endCreateTime * @return */ @Override public Map getTodoInfo(String beginCreateTime, String endCreateTime) { String username = SecurityUtils.getUsername(); Map map = new HashMap<>(); map.put("tofollowedCluesNum",reportMpper.getTofollowedCluesNum(beginCreateTime,endCreateTime,username)); map.put("tofollowedBusinessNum",reportMpper.getTofollowedBusinessNum(beginCreateTime,endCreateTime,username)); map.put("toallocatedCluesNum",reportMpper.getToallocatedCluesNum(beginCreateTime,endCreateTime,username)); map.put("toallocatedBusinessNum",reportMpper.getToallocatedBusinessNum(beginCreateTime,endCreateTime,username)); return map; } /** * 饼图 * @param beginCreateTime * @param endCreateTime */ @Override public List> subjectStatistics(String beginCreateTime, String endCreateTime) { return reportMpper.subjectStatistics(beginCreateTime,endCreateTime); } /** * 折线图 * @param beginCreateTime * @param endCreateTime * @return */ @SneakyThrows @Override public LineChartVO cluesStatistics(String beginCreateTime, String endCreateTime) { List dates = ReportServiceImpl.findDates(beginCreateTime, endCreateTime); LineChartVO lineChartVO = new LineChartVO(); lineChartVO.setxAxis(dates); List> list = reportMpper.cluesStatistics(beginCreateTime, endCreateTime); ArrayList lt = new ArrayList<>(); LineSeriesVO lineSeriesVO1 = new LineSeriesVO(); LineSeriesVO lineSeriesVO2 = new LineSeriesVO(); lineSeriesVO1.setName("新增线索数量"); lineSeriesVO2.setName("线索总数量"); List list1 = new ArrayList<>(); List list2 = new ArrayList<>(); int sum=0; for (int i = 0; i < list.size(); i++) { for (int j = 0; j < dates.size(); j++) { if (dates.get(j).equals(list.get(i).get("t"))){ list1.add(list.get(i).get("n")); sum+=Integer.parseInt(list.get(i).get("n").toString()); }else { list1.add(0); } list2.add(sum); } } lineSeriesVO1.setData(list1); lineSeriesVO2.setData(list2); lt.add(lineSeriesVO1); lt.add(lineSeriesVO2); lineChartVO.setSeries(lt); return lineChartVO; } }