package com.xzx.gc.system.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import com.xzx.gc.common.Result; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.constant.OrderEnum; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.entity.CityPartner; import com.xzx.gc.entity.PlatformReport; import com.xzx.gc.model.MapDto; import com.xzx.gc.model.order.*; import com.xzx.gc.system.service.CityPartnerService; import com.xzx.gc.system.service.PlatformReportService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.TreeSet; import java.util.stream.Collectors; @RestController @Api(tags = {"平台报表管理"}) @Validated @Slf4j public class PlatformReportController { @Autowired private PlatformReportService platformReportService; @Autowired private CityPartnerService cityPartnerService; @Autowired private BusinessUtil businessUtil; @PostMapping("/platformReport/find") @ApiOperation(value = "平台总览") public Result> find() { List list = CollUtil.newArrayList(); //按时间统计 List byIndicatorType = platformReportService.findByIndicatorType(OrderEnum.按时间统计.getValue()); /* 用户量 */ //按用户量筛选 List users = byIndicatorType.stream().filter(x -> OrderEnum.用户量.getValue().equals(x.getReportType().toString())).collect(Collectors.toList()); //总数 double sum = users.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); PlatformReportDto platformReportDto = new PlatformReportDto(); platformReportDto.setAllNum(Convert.toStr(Convert.toInt(sum))); //日环比 日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100% 正值为增长率 负值为下降率 platformReportDto.setRatio(platformReportService.getRatio(users)); //类型 platformReportDto.setType(OrderEnum.用户量.getValue()); list.add(platformReportDto); /* 下单量 */ List orderNums = byIndicatorType.stream().filter(x -> OrderEnum.总下单量.getValue().equals(x.getReportType().toString())).collect(Collectors.toList()); //总数 sum = orderNums.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); platformReportDto = new PlatformReportDto(); platformReportDto.setAllNum(Convert.toStr(Convert.toInt(sum))); //日环比 日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100% 正值为增长率 负值为下降率 platformReportDto.setRatio(platformReportService.getRatio(orderNums)); //类型 platformReportDto.setType(OrderEnum.总下单量.getValue()); list.add(platformReportDto); /* 交易金额 */ List orderMoneys = byIndicatorType.stream().filter(x -> OrderEnum.总交易金额.getValue().equals(x.getReportType().toString())).collect(Collectors.toList()); //总数 sum = orderMoneys.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); platformReportDto = new PlatformReportDto(); platformReportDto.setAllNum(businessUtil.changeMoney(Convert.toStr(sum))); //日环比 日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100% 正值为增长率 负值为下降率 platformReportDto.setRatio(platformReportService.getRatio(orderMoneys)); //类型 platformReportDto.setType(OrderEnum.总交易金额.getValue()); list.add(platformReportDto); /* 打包站回收金额 */ List dbzMoneys = byIndicatorType.stream().filter(x -> OrderEnum.打包站回收金额.getValue().equals(x.getReportType().toString())).collect(Collectors.toList()); //总数 sum = dbzMoneys.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); platformReportDto = new PlatformReportDto(); platformReportDto.setAllNum(businessUtil.changeMoney(Convert.toStr(sum))); //日环比 日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100% 正值为增长率 负值为下降率 platformReportDto.setRatio(platformReportService.getRatio(dbzMoneys)); //类型 platformReportDto.setType(OrderEnum.打包站回收金额.getValue()); list.add(platformReportDto); /* 投诉 */ List complaints = byIndicatorType.stream().filter(x -> OrderEnum.投诉总量.getValue().equals(x.getReportType().toString())).collect(Collectors.toList()); //总数 sum = complaints.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); platformReportDto = new PlatformReportDto(); platformReportDto.setAllNum(Convert.toStr(Convert.toInt(sum))); //日环比 日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100% 正值为增长率 负值为下降率 platformReportDto.setRatio(platformReportService.getRatio(complaints)); //类型 platformReportDto.setType(OrderEnum.投诉总量.getValue()); list.add(platformReportDto); /* 未提现 */ List moneys = byIndicatorType.stream().filter(x -> OrderEnum.未提现总额.getValue().equals(x.getReportType().toString())).collect(Collectors.toList()); //总数 if(CollUtil.isNotEmpty(moneys)) { sum = Convert.toDouble(CollUtil.getFirst(moneys).getIndicator()); }else { sum=0; } platformReportDto = new PlatformReportDto(); platformReportDto.setAllNum(businessUtil.changeMoney(Convert.toStr(sum))); //日环比 日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100% 正值为增长率 负值为下降率 platformReportDto.setRatio(platformReportService.getRatio(moneys)); //类型 platformReportDto.setType(OrderEnum.未提现总额.getValue()); list.add(platformReportDto); /* 已提现 */ List withdraws = byIndicatorType.stream().filter(x -> OrderEnum.已提现总额.getValue().equals(x.getReportType().toString())).collect(Collectors.toList()); //总数 sum = withdraws.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); platformReportDto = new PlatformReportDto(); platformReportDto.setAllNum(businessUtil.changeMoney(Convert.toStr(sum))); //日环比 日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100% 正值为增长率 负值为下降率 platformReportDto.setRatio(platformReportService.getRatio(withdraws)); //类型 platformReportDto.setType(OrderEnum.已提现总额.getValue()); list.add(platformReportDto); return Result.success(list); } @PostMapping("/platformReport/detail") @ApiOperation(value = "平台总览详情") public Result findDetail(@RequestBody PlatformReportParamDto platformReportParamDto) { String timeType = platformReportParamDto.getTimeType(); String type = platformReportParamDto.getType(); List list; boolean chanageMoneyFlag=false; if(OrderEnum.用户量.getValue().equals(type)){ list=platformReportService.findByTypeAndTimeType(OrderEnum.用户量.getValue(),OrderEnum.按时间统计.getValue(),timeType); }else if(OrderEnum.总下单量.getValue().equals(type)){ list=platformReportService.findByTypeAndTimeType(OrderEnum.总下单量.getValue(),OrderEnum.按时间统计.getValue(),timeType); }else if(OrderEnum.总交易金额.getValue().equals(type)){ list=platformReportService.findByTypeAndTimeType(OrderEnum.总交易金额.getValue(),OrderEnum.按时间统计.getValue(),timeType); chanageMoneyFlag=true; }else if(OrderEnum.打包站回收金额.getValue().equals(type)){ list=platformReportService.findByTypeAndTimeType(OrderEnum.打包站回收金额.getValue(),OrderEnum.按时间统计.getValue(),timeType); }else if(OrderEnum.投诉总量.getValue().equals(type)){ list=platformReportService.findByTypeAndTimeType(OrderEnum.投诉总量.getValue(),OrderEnum.按时间统计.getValue(),timeType); }else if(OrderEnum.未提现总额.getValue().equals(type)){ list=platformReportService.findByTypeAndTimeType(OrderEnum.未提现总额.getValue(),OrderEnum.按时间统计.getValue(),timeType); chanageMoneyFlag=true; }else if(OrderEnum.已提现总额.getValue().equals(type)){ list=platformReportService.findByTypeAndTimeType(OrderEnum.已提现总额.getValue(),OrderEnum.按时间统计.getValue(),timeType); }else { list=new ArrayList<>(); } PlatformReportDetailDto platformReportDetailDto = new PlatformReportDetailDto(); //波浪图数据 List mapList=CollUtil.newArrayList(); for (PlatformReport platformReport : list) { MapDto mapDto=new MapDto(); mapDto.setKey(platformReport.getCreateTime()); if(chanageMoneyFlag){ mapDto.setValue(businessUtil.changeMoney(platformReport.getIndicator())); }else { mapDto.setValue(platformReport.getIndicator()); } mapList.add(mapDto); } platformReportDetailDto.setList(mapList); //日均数或3天等 double sum = list.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); if(chanageMoneyFlag){ platformReportDetailDto.setAverageNum(businessUtil.changeMoney(Convert.toStr(sum))); }else { platformReportDetailDto.setAverageNum(Convert.toStr(Convert.toInt(sum))); } //最后统计时间 if(CollUtil.isNotEmpty(list)) { platformReportDetailDto.setTime(CollUtil.getLast(list).getCreateTime()); }else { platformReportDetailDto.setTime(DateUtil.yesterday().toDateStr()); } return Result.success(platformReportDetailDto); } @PostMapping("/platformReport/partner/find") @ApiOperation(value = "合伙人总览") public Result> findByPartner(@RequestBody PlatformReportPartnerDto platformReportPartnerDto) { List list = CollUtil.newArrayList(); String type = platformReportPartnerDto.getType(); //按合伙人统计 List byIndicatorType = platformReportService.findByType(type,OrderEnum.按合伙人统计.getValue()); //按合伙人分组 注意-1的情况 List> userIdList = CollUtil.groupByField(byIndicatorType, "userId"); //设置合伙人名称等 List partnerIds=CollUtil.newArrayList(); for (List platformReports : userIdList) { BigDecimal allNum=BigDecimal.ZERO; String userId = platformReports.get(0).getUserId(); PlatformReportPartnerResDto obj=new PlatformReportPartnerResDto(); if(Constants.DEFAULT_ID.equals(userId)){ obj.setName(Constants.DEFAULT_NAME); }else { String partnerName = cityPartnerService.queryById(Convert.toLong(userId)).getPartnerName(); obj.setName(partnerName); } //总数 double sum; if(OrderEnum.未提现总额.getValue().equals(type)){ sum = platformReports.stream().filter(x->DateUtil.yesterday().toDateStr().equals(x.getCreateTime())).mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); }else { sum = platformReports.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum(); } allNum=NumberUtil.add(allNum,sum); obj.setAllNum(Convert.toStr(allNum)); //日环比 String ratio = platformReportService.getRatio(platformReports); obj.setRatio(ratio); list.add(obj); partnerIds.add(platformReports.get(0).getUserId()); } //查询所有合伙人 List noDel; if(OrderEnum.打包站回收金额.getValue().equals(type)){ noDel= cityPartnerService.findByTypeWithDel(OrderEnum.打包站.getValue()); }else { noDel= cityPartnerService.findByTypeWithDel(OrderEnum.合伙人.getValue()); } noDel=noDel.stream().filter(x->!partnerIds.contains(x.getId()+"")).collect(Collectors.toList()); //根据名称去重 noDel= noDel.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getPartnerName()))), ArrayList::new)); for (CityPartner cityPartner : noDel) { PlatformReportPartnerResDto obj=new PlatformReportPartnerResDto(); obj.setName(cityPartner.getPartnerName()); obj.setAllNum("0"); obj.setRatio("+100.00%"); list.add(obj); } //按指标数升序 CollUtil.sort(list, (o1, o2) -> { if(Convert.toBigDecimal(o1.getAllNum()).compareTo(Convert.toBigDecimal(o2.getAllNum()))>0){ return -1; }else if(Convert.toBigDecimal(o1.getAllNum()).compareTo(Convert.toBigDecimal(o2.getAllNum()))==0){ return 0; }else { return 1; } }); return Result.success(list); } }