| package com.xzx.gc.user.service;  | 
|   | 
| import cn.hutool.core.collection.CollUtil;  | 
| import cn.hutool.core.convert.Convert;  | 
| import cn.hutool.core.date.DateTime;  | 
| import cn.hutool.core.date.DateUtil;  | 
| import cn.hutool.core.util.NumberUtil;  | 
| import cn.hutool.core.util.StrUtil;  | 
| import com.xzx.gc.common.constant.Constants;  | 
| import com.xzx.gc.common.constant.OrderEnum;  | 
| import com.xzx.gc.common.constant.PayEnum;  | 
| import com.xzx.gc.common.utils.BusinessUtil;  | 
| import com.xzx.gc.common.utils.DateUtils;  | 
| import com.xzx.gc.entity.*;  | 
| import com.xzx.gc.model.order.OrderReportDetailDto;  | 
| import com.xzx.gc.model.order.OrderReportDto;  | 
| import com.xzx.gc.user.mapper.AccountMapper;  | 
| import com.xzx.gc.user.mapper.AddressLevelInfoMapper;  | 
| import com.xzx.gc.user.mapper.OrderMapper;  | 
| import com.xzx.gc.user.mapper.PayRequestMapper;  | 
| import lombok.extern.slf4j.Slf4j;  | 
| import org.springframework.beans.factory.annotation.Autowired;  | 
| import org.springframework.stereotype.Service;  | 
| import org.springframework.transaction.annotation.Transactional;  | 
|   | 
| import java.math.BigDecimal;  | 
| import java.util.*;  | 
| import java.util.stream.Collectors;  | 
|   | 
| @Service  | 
| @Transactional  | 
| @Slf4j  | 
| public class OrderReportService {  | 
|   | 
|     @Autowired  | 
|     private OrderMapper orderMapper;  | 
|   | 
|   | 
|     @Autowired  | 
|     private BusinessUtil businessUtil;  | 
|   | 
|     @Autowired  | 
|     private PayRequestMapper payRequestMapper;  | 
|   | 
|     @Autowired  | 
|     private AccountMapper accountMapper;  | 
|       | 
|     @Autowired  | 
|     private AddressLevelInfoMapper addressLevelInfoMapper;  | 
|   | 
|     @Autowired  | 
|     private FenceService fenceService;  | 
|   | 
|     @Autowired  | 
|     private AccountService accountService;  | 
|   | 
|     @Autowired  | 
|     private CityPartnerService cityPartnerService;  | 
|   | 
|     @Autowired  | 
|     private AddressService addressService;  | 
|   | 
|     @Autowired  | 
|     private PartnerGaodeService partnerGaodeService;  | 
|   | 
|   | 
|     /**  | 
|      * 根据合伙人查询  | 
|      * @param partnerId  | 
|      * @return  | 
|      */  | 
|     public OrderReportDto findByPartneId(String partnerId){  | 
|         OrderReportDto orderReportDto = new OrderReportDto();  | 
|         //回收总金额  | 
|         BigDecimal recyleMoney = BigDecimal.ZERO;  | 
|         //今日回收总金额  | 
|         BigDecimal recyleMoneyToday = BigDecimal.ZERO;  | 
|         //昨日回收总金额  | 
|         BigDecimal recyleMoneyYesterday = BigDecimal.ZERO;  | 
|         //今日下单总用户量数  | 
|         int orderUserNumToday = 0;  | 
|         //昨日下单总用户量数  | 
|         int orderUserNumYesterday = 0;  | 
|         //下单总用户量数  | 
|         int orderUserNum = 0;  | 
|         //未提现总额  | 
|         BigDecimal notWithdrawalrecyleMoney = BigDecimal.ZERO;  | 
|         //已提现总额  | 
|         BigDecimal withdrawalrecyleMoney = BigDecimal.ZERO;  | 
|   | 
|   | 
|         //当前时间  | 
|         DateTime nowData = DateUtil.parse(DateUtil.now(), DateUtils.DATE_FORMAT_YMD);  | 
|   | 
|         //已完成订单  | 
|         List<OrderInfo> collect1=new ArrayList<>();  | 
|   | 
|         //所有订单  | 
|         List<OrderInfo> orderInfos = orderMapper.findDetailByPartned(partnerId);  | 
|         if (CollUtil.isNotEmpty(orderInfos)) {  | 
|             List<OrderInfo> collect = removeRepeatUser(orderInfos);  | 
|             orderUserNum =collect.size();  | 
|   | 
|             //去重用户订单列表  | 
|             for (OrderInfo orderInfo : collect) {  | 
|                 String createTime = orderInfo.getCreateTime();  | 
|                 DateTime parse3 = DateUtil.parse(createTime, DateUtils.DATE_FORMAT_YMD);  | 
|   | 
|                 //当天下单用户量  | 
|                 if (DateUtil.isSameDay(parse3, nowData)) {  | 
|                     orderUserNumToday = orderUserNumToday + 1;  | 
|                 }  | 
|   | 
|                 //昨天下单用户量  | 
|                 long l2 = DateUtil.betweenDay(parse3, nowData, true);  | 
|                 if (l2 == 1) {  | 
|                     orderUserNumYesterday = orderUserNumYesterday + 1;  | 
|                 }  | 
|             }  | 
|   | 
|   | 
|             //订单已完成的列表按完成时间升序  | 
|             collect1 = orderInfos.stream().filter(x -> x.getOrderStatus().equals(OrderEnum.完成.getValue())||x.getOrderStatus().equals(OrderEnum.入库中.getValue())||x.getOrderStatus().equals(OrderEnum.待入库.getValue())).collect(Collectors.toList());  | 
|                 List<OrderInfo> collect2 = collect1.stream().sorted(Comparator.comparing(OrderInfo::getCompleteTime)).collect(Collectors.toList());  | 
|   | 
|             //订单已完成的列表  | 
|             for (OrderInfo orderInfo : collect2) {  | 
|                 BigDecimal money = Convert.toBigDecimal(orderInfo.getMoney());  | 
|                 recyleMoney = NumberUtil.add(money, recyleMoney);  | 
|                 String completeTime = orderInfo.getCompleteTime();  | 
|                 DateTime parse = DateUtil.parse(completeTime, DateUtils.DATE_FORMAT_YMD);  | 
|   | 
|                 //今日回收金额  | 
|                 if (DateUtil.isSameDay(parse, nowData)) {  | 
|                     recyleMoneyToday = NumberUtil.add(money, recyleMoneyToday);  | 
|                 }  | 
|                 //昨天回收金额  | 
|                 long l = DateUtil.betweenDay(parse, nowData, true);  | 
|                 if (l == 1) {  | 
|                     recyleMoneyYesterday = NumberUtil.add(money, recyleMoneyYesterday);  | 
|                 }  | 
|             }  | 
|   | 
|         }  | 
|   | 
|         String recyleMoneyTodayAvg = Constants.MONEY_INIT.toString();  | 
|         //回收日均金额  回收总金额/ (当前时间-最早回收时间)  | 
|         recyleMoneyTodayAvg=getMoneyAvg(collect1,nowData);  | 
|   | 
|   | 
|   | 
|   | 
|         //回收日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100%  正值为增长率  负值为下降率  | 
|         String RecyleRatio = getRecyleRatio(recyleMoneyYesterday,recyleMoneyToday);  | 
|   | 
|         //日均下单用户量  | 
|         int orderUserNumTodayAvg=getNumAvg(orderInfos,nowData);  | 
|   | 
|         //下单用户量日环比  | 
|         String orderUserRatio = getOrderUserRatio(orderUserNumYesterday,orderUserNumToday);  | 
|   | 
|         //已提现金额 查询交易记录表  | 
| //        PayRequestInfo payInf = new PayRequestInfo();  | 
| //        payInf.setPayType(PayEnum.提现.getValue());  | 
| //        payInf.setStatus(PayEnum.已审核完成.getValue());  | 
| //        List<PayRequestInfo> select = payRequestMapper.select(payInf);  | 
| //        if (CollUtil.isNotEmpty(select)) {  | 
| //            for (PayRequestInfo payInfo : select) {  | 
| //                withdrawalrecyleMoney = NumberUtil.add(withdrawalrecyleMoney, Convert.toBigDecimal(payInfo.getMoney()));  | 
| //            }  | 
| //        }  | 
| //  | 
| //        //未提现 查询所有账户  | 
| //        Example example = new Example(AccountInfo.class);  | 
| //        Example.Criteria criteria = example.createCriteria();  | 
| //        criteria.andEqualTo("delFlag", 0);  | 
| //        List<AccountInfo> accountInfos = accountMapper.selectByExample(example);  | 
| //        for (AccountInfo accountInfo : accountInfos) {  | 
| //            String money = accountInfo.getMoney();  | 
| //            if (StrUtil.isBlank(money)) {  | 
| //                money = Convert.toStr(Constants.MONEY_INIT);  | 
| //            }  | 
| //            notWithdrawalrecyleMoney = NumberUtil.add(notWithdrawalrecyleMoney, Convert.toBigDecimal(money));  | 
| //        }  | 
|   | 
|   | 
|         //获取合伙人名称  | 
|         String partnerName = cityPartnerService.findById(Convert.toInt(partnerId)).getPartnerName();  | 
|   | 
|   | 
|         //未提现金额  | 
|         List<OrderInfo> accountInfos = findNotWithdraw(partnerId);  | 
|         double sum = accountInfos.stream().mapToDouble(x -> Convert.toDouble(x.getMoney())).sum();  | 
|         notWithdrawalrecyleMoney=businessUtil.changeMul(String.valueOf(sum));  | 
|   | 
|   | 
|         //返回数据  | 
|         orderReportDto.setPartnerName(partnerName);  | 
|         orderReportDto.setOrderUserNumTodayAvg(orderUserNumTodayAvg);  | 
|         orderReportDto.setOrderUserRatio(orderUserRatio);  | 
|         orderReportDto.setRecyleRatio(RecyleRatio);  | 
|         orderReportDto.setRecyleMoneyTodayAvg(recyleMoneyTodayAvg);  | 
|         orderReportDto.setRecyleMoney(businessUtil.changeMoney(Convert.toStr(recyleMoney)));  | 
|         orderReportDto.setRecyleMoneyToday(businessUtil.changeMoney(Convert.toStr(recyleMoneyToday)));  | 
|         orderReportDto.setOrderUserNum(orderUserNum);  | 
|         orderReportDto.setOrderUserNumToday(orderUserNumToday);  | 
|         orderReportDto.setDate(DateUtil.today());  | 
|         orderReportDto.setNotWithdrawalMoney(businessUtil.changeMoney(Convert.toStr(notWithdrawalrecyleMoney)));  | 
|         orderReportDto.setWithDrawalMoney(businessUtil.changeMoney(Convert.toStr(withdrawalrecyleMoney)));  | 
|   | 
|         return orderReportDto;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 获取今日回收完成的列表  | 
|      * @param orderInfos  | 
|      * @return  | 
|      */  | 
|     public List<OrderInfo> getTodayCompleteOrderList(List<OrderInfo> orderInfos){  | 
|         List<OrderInfo> list=new ArrayList<>();  | 
|         //筛选订单已完成的列表  | 
|         List<OrderInfo> collect1 = orderInfos.stream().filter(x -> x.getOrderStatus().equals(OrderEnum.完成.getValue())||x.getOrderStatus().equals(OrderEnum.入库中.getValue())||x.getOrderStatus().equals(OrderEnum.待入库.getValue())).collect(Collectors.toList());  | 
|         //当前时间  | 
|         DateTime nowData = DateUtil.parse(DateUtil.now(), DateUtils.DATE_FORMAT_YMD);  | 
|         //订单已完成的列表  | 
|         for (OrderInfo orderInfo : collect1) {  | 
|             //今日回收金额  | 
|             String completeTime = orderInfo.getCompleteTime();  | 
|             DateTime parse = DateUtil.parse(completeTime, DateUtils.DATE_FORMAT_YMD);  | 
|             if (DateUtil.isSameDay(parse, nowData)) {  | 
|                 list.add(orderInfo);  | 
|             }  | 
|         }  | 
|         return list;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 根据日期筛选订单  | 
|      * 0:今日 1:近3日 2:近10日 3:近1月 4:近3月 5:近6月  | 
|      * @param orderInfos  | 
|      * @param timeType  | 
|      * @return  | 
|      */  | 
|     public List<OrderInfo> getCompleteOrderListByTime(List<OrderInfo> orderInfos,Integer timeType){  | 
|         List<OrderInfo> list=new ArrayList<>();  | 
|         //筛选订单已完成的列表  | 
|         List<OrderInfo> collect1 = orderInfos.stream().filter(x -> x.getOrderStatus().equals(OrderEnum.完成.getValue())||x.getOrderStatus().equals(OrderEnum.入库中.getValue())||x.getOrderStatus().equals(OrderEnum.待入库.getValue())).collect(Collectors.toList());  | 
|         //当前时间  | 
|         DateTime nowData = DateUtil.parse(DateUtil.now(), DateUtils.DATE_FORMAT_YMD);  | 
|   | 
|         if(timeType==null){  | 
|             return collect1;  | 
|         }  | 
|         //订单已完成的列表  | 
|         for (OrderInfo orderInfo : collect1) {  | 
|             //今日回收金额  | 
|             String completeTime = orderInfo.getCompleteTime();  | 
|             DateTime parse = DateUtil.parse(completeTime, DateUtils.DATE_FORMAT_YMD);  | 
|   | 
|             if(timeType==0){  | 
|                 //当天  | 
|                 if (DateUtil.isSameDay(parse, nowData)) {  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==1){  | 
|                 //近3日  | 
|                 if(DateUtil.betweenDay(parse,nowData,true)<=3){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==2){  | 
|                 //近10日  | 
|                 if(DateUtil.betweenDay(parse,nowData,true)<=10){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==3){  | 
|                 //近1月  | 
|                 if(DateUtil.betweenMonth(parse,nowData,true)<=1){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==4){  | 
|                 //近3月  | 
|                 if(DateUtil.betweenMonth(parse,nowData,true)<=3){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==5){  | 
|                 //近6月  | 
|                 if(DateUtil.betweenMonth(parse,nowData,true)<=6){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }  | 
|   | 
|   | 
|   | 
|         }  | 
|         return list;  | 
|     }  | 
|   | 
|     /**  | 
|      * 今日下单用户  | 
|      * @param orderInfos  | 
|      * @return  | 
|      */  | 
|     public List<OrderInfo> getTodayOrderUserList(List<OrderInfo> orderInfos){  | 
|         //当前时间  | 
|         DateTime nowData = DateUtil.parse(DateUtil.now(), DateUtils.DATE_FORMAT_YMD);  | 
|         List<OrderInfo> list=new ArrayList<>();  | 
|         List<OrderInfo> collect = removeRepeatUser(orderInfos);  | 
|         //去重用户订单列表  | 
|         for (OrderInfo orderInfo : collect) {  | 
|             String createTime = orderInfo.getCreateTime();  | 
|             DateTime parse3 = DateUtil.parse(createTime, DateUtils.DATE_FORMAT_YMD);  | 
|   | 
|             //当天下单用户量  | 
|             if (DateUtil.isSameDay(parse3, nowData)) {  | 
|                 list.add(orderInfo);  | 
|             }  | 
|         }  | 
|         return list;  | 
|     }  | 
|   | 
|     public List<OrderInfo> getOrderUserListByTime(List<OrderInfo> orderInfos,Integer timeType){  | 
|         //当前时间  | 
|         DateTime nowData = DateUtil.parse(DateUtil.now(), DateUtils.DATE_FORMAT_YMD);  | 
|         List<OrderInfo> list=new ArrayList<>();  | 
|         List<OrderInfo> collect = removeRepeatUser(orderInfos);  | 
|   | 
|         if(timeType==null){  | 
|             return collect;  | 
|         }  | 
|   | 
|         //去重用户订单列表  | 
|         for (OrderInfo orderInfo : collect) {  | 
|             String createTime = orderInfo.getCreateTime();  | 
|             DateTime parse = DateUtil.parse(createTime, DateUtils.DATE_FORMAT_YMD);  | 
|   | 
|             if(timeType==0){  | 
|                 //当天  | 
|                 if (DateUtil.isSameDay(parse, nowData)) {  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==1){  | 
|                 //近3日  | 
|                 if(DateUtil.betweenDay(parse,nowData,true)<=3){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==2){  | 
|                 //近10日  | 
|                 if(DateUtil.betweenDay(parse,nowData,true)<=10){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==3){  | 
|                 //近1月  | 
|                 if(DateUtil.betweenMonth(parse,nowData,true)<=1){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==4){  | 
|                 //近3月  | 
|                 if(DateUtil.betweenMonth(parse,nowData,true)<=3){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }else if(timeType==5){  | 
|                 //近6月  | 
|                 if(DateUtil.betweenMonth(parse,nowData,true)<=6){  | 
|                     list.add(orderInfo);  | 
|                 }  | 
|             }  | 
|         }  | 
|         return list;  | 
|     }  | 
|   | 
|     /**  | 
|      * 设置金额和数目 以及日均金额 和下单人数  | 
|      * @param list  | 
|      * @param areaName  | 
|      * @param money  | 
|      */  | 
|     public void setMoneyOrNum(List<OrderReportDetailDto> list, String areaName, String areaId, BigDecimal money, int level){  | 
|         //是否存在当前区域标识  | 
|         boolean flag=false;  | 
|         for (OrderReportDetailDto orderReportDetailDto : list) {  | 
|             String areaId1 = orderReportDetailDto.getAreaId();  | 
|             if(areaId1.equals(areaId)){  | 
|                 if(money!=null){  | 
|                     orderReportDetailDto.setMoney(businessUtil.changeMoney(Convert.toStr(NumberUtil.add(money,Convert.toBigDecimal(orderReportDetailDto.getMoney())))));  | 
|                 }  | 
|                 orderReportDetailDto.setNum(1+orderReportDetailDto.getNum());  | 
|                 flag=true;  | 
|                 break;  | 
|             }  | 
|         }  | 
|   | 
|         if(!flag){  | 
|             OrderReportDetailDto orderReportDetailDto=new OrderReportDetailDto();  | 
|             orderReportDetailDto.setAreaName(areaName);  | 
|             orderReportDetailDto.setAreaId(areaId);  | 
|             orderReportDetailDto.setMoney(Convert.toStr(money,Convert.toStr(Constants.MONEY_INIT)));  | 
|             orderReportDetailDto.setNum(1);  | 
|             orderReportDetailDto.setLevel(level);  | 
|             list.add(orderReportDetailDto);  | 
|         }  | 
|     }  | 
|   | 
|   | 
|     public void setMoneyOrNum(List<OrderReportDetailDto> list,String areaId,String areaName,BigDecimal money){  | 
|         //是否存在当前区域标识  | 
|         boolean flag=false;  | 
|         for (OrderReportDetailDto orderReportDetailDto : list) {  | 
|             String areaId1 = orderReportDetailDto.getAreaId();  | 
|             if(areaId1.equals(areaId)){  | 
|                 if(money!=null){  | 
|                     orderReportDetailDto.setMoney(businessUtil.changeMoney(Convert.toStr(NumberUtil.add(money,Convert.toBigDecimal(orderReportDetailDto.getMoney())))));  | 
|                 }  | 
|                 orderReportDetailDto.setNum(1+orderReportDetailDto.getNum());  | 
|                 flag=true;  | 
|                 break;  | 
|             }  | 
|         }  | 
|   | 
|         if(!flag){  | 
|             OrderReportDetailDto orderReportDetailDto=new OrderReportDetailDto();  | 
|             orderReportDetailDto.setAreaName(areaName);  | 
|             orderReportDetailDto.setAreaId(areaId);  | 
|             orderReportDetailDto.setMoney(Convert.toStr(money,Convert.toStr(Constants.MONEY_INIT)));  | 
|             orderReportDetailDto.setNum(1);  | 
|             list.add(orderReportDetailDto);  | 
|         }  | 
|     }  | 
|   | 
|   | 
|   | 
|     /**  | 
|      * 获取省市区报表详情  | 
|      * @param list  | 
|      * @param level  | 
|      * @param areaId  | 
|      * @return  | 
|      */  | 
|     public List<OrderReportDetailDto>  getDetail(List<OrderInfo> list,int level,String areaId){  | 
|         List<OrderReportDetailDto> list2=new ArrayList<>();  | 
|         for (OrderInfo orderInfo : list) {  | 
|             //所在区域  | 
|             String townId = orderInfo.getTownId();  | 
|   | 
|             if(StrUtil.isBlank(townId)){  | 
|                 AddressInfo byUserId = addressService.findByUserId(orderInfo.getUserId());  | 
|                 if(byUserId!=null&&StrUtil.isNotBlank(byUserId.getTownshipId())){  | 
|                     townId=byUserId.getTownshipId();  | 
|                 }  | 
|             }  | 
|   | 
|             BigDecimal money = Convert.toBigDecimal(orderInfo.getMoney());  | 
|             if(StrUtil.isNotBlank(townId)){  | 
|                 AddressLevelInfo addressLevelInfo=new AddressLevelInfo();  | 
|                 addressLevelInfo.setLevel3Id(townId);  | 
|                 AddressLevelInfo addressLevelInfo1 = addressLevelInfoMapper.selectOne(addressLevelInfo);  | 
|                 if(addressLevelInfo1!=null){  | 
|                     String level1Name = addressLevelInfo1.getLevel1Name();  | 
|                     String level1Id = addressLevelInfo1.getLevel1Id();  | 
|                     String level2Name = addressLevelInfo1.getLevel2Name();  | 
|                     String level2Id = addressLevelInfo1.getLevel2Id();  | 
|                     String level3Name = addressLevelInfo1.getLevel3Name();  | 
|                     String level3Id = addressLevelInfo1.getLevel3Id();  | 
|                     if(level==1){  | 
|                         //只需要查询省份  | 
|                         setMoneyOrNum(list2,level1Name,level1Id,money,level);  | 
|                     }else if(level==2){  | 
|                         //查询省下所有市  | 
|                         if(level1Id.equals(areaId)){  | 
|                            setMoneyOrNum(list2,level2Name,level2Id,money,level);  | 
|                         }  | 
|                     } else if(level==3){  | 
|                         //查询市下所有区  | 
|                         if(level2Id.equals(areaId)){  | 
|                            setMoneyOrNum(list2,level3Name,level3Id,money,level);  | 
|                         }  | 
|                     }  | 
|                 }  | 
|             }else {  | 
|                 log.warn("存在省市区id为空的订单:{}", orderInfo.getOrderId());  | 
|             }  | 
|         }  | 
|         return list2;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 根据合伙人查找当前用户未提现的列表  | 
|      * @param partnerId  | 
|      * @return  | 
|      */  | 
|     public List<OrderInfo> findNotWithdraw(String partnerId){  | 
|         //未提现 查询所有账户  | 
|         List<OrderInfo> accountInfos = accountMapper.findArea();  | 
|         for (Iterator<OrderInfo> iterator = accountInfos.iterator(); iterator.hasNext(); ) {  | 
|             OrderInfo accountInfo =  iterator.next();  | 
|             //针对用户将地址删光的情况  | 
|             if(StrUtil.isBlank(accountInfo.getTownId())){  | 
|                 AddressInfo byUserId = addressService.findByUserId(accountInfo.getUserId());  | 
|                 if(byUserId==null||StrUtil.isBlank(byUserId.getTownshipId())){  | 
|                     log.warn("用户:{}出现不可能的地址为空的情况",accountInfo.getUserId());  | 
|                     iterator.remove();  | 
|                     continue;  | 
|                 }  | 
|                 accountInfo.setTownId(byUserId.getTownshipId());  | 
|                 accountInfo.setTownShipName(byUserId.getTownshipName());  | 
|                 accountInfo.setLongitude(byUserId.getLongitude());  | 
|                 accountInfo.setLatitude(byUserId.getLatitude());  | 
|             }  | 
|   | 
|             PartnerGaode byTownId = partnerGaodeService.findByTownId(accountInfo.getTownId());  | 
|             if(byTownId==null||!byTownId.getPartnerId().equals(partnerId)){  | 
|                 iterator.remove();  | 
|             }  | 
|         }  | 
|         return accountInfos;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 获取围栏报表详情  | 
|      * @param list  | 
|      * @return  | 
|      */  | 
|     public List<OrderReportDetailDto>  getDetail(List<OrderInfo> list,int type){  | 
|         List<OrderReportDetailDto> list2=new ArrayList<>();  | 
|         BigDecimal sumMoney=BigDecimal.ZERO;  | 
|         for (OrderInfo orderInfo : list) {  | 
|             //所在围栏  | 
|             String townId = orderInfo.getTownId();  | 
|             if(StrUtil.isBlank(townId)){  | 
|                 townId=Constants.DEFAULT_ID;  | 
|             }  | 
|             String townName=orderInfo.getTownShipName();  | 
|             if(StrUtil.isBlank(townName)){  | 
|                 Fence byId = fenceService.findById(Convert.toInt(townId));  | 
|                 if(byId!=null) {  | 
|                     townName = byId.getFenceName();  | 
|                 }else {  | 
|                     townName="其他";  | 
|                 }  | 
|             }  | 
|             BigDecimal money = Convert.toBigDecimal(orderInfo.getMoney());  | 
|             setMoneyOrNum(list2,townId,townName,money);  | 
|             sumMoney=NumberUtil.add(sumMoney,money);  | 
|         }  | 
|   | 
|         //设置总金额  | 
|         for (OrderReportDetailDto orderReportDetailDto : list2) {  | 
|             orderReportDetailDto.setAllNum(list.size());  | 
|             orderReportDetailDto.setAlloney(sumMoney.toString());  | 
|             orderReportDetailDto.setMoneyDouble(Convert.toDouble(orderReportDetailDto.getMoney()));  | 
|         }  | 
|   | 
|   | 
|         //兼容没数据的围栏显示  | 
| //        if(CollUtil.isEmpty(list2)) {  | 
| //            List<Fence> all = fenceService.findByPartnerId(partnerId);  | 
| //            if (CollUtil.isNotEmpty(all)) {  | 
| //                for (Fence fence : all) {  | 
| //                    Integer id = fence.getId();  | 
| //                    String fenceName = fence.getFenceName();  | 
| //                    OrderReportDetailDto orderReportDetailDto = new OrderReportDetailDto();  | 
| //                    orderReportDetailDto.setAreaName(fenceName);  | 
| //                    orderReportDetailDto.setAreaId(id.toString());  | 
| //                    orderReportDetailDto.setMoney(Constants.MONEY_INIT.toString());  | 
| //                    orderReportDetailDto.setMoneyDouble(Convert.toDouble(orderReportDetailDto.getMoney()));  | 
| //                    orderReportDetailDto.setNum(0);  | 
| //                    orderReportDetailDto.setAlloney(Constants.MONEY_INIT.toString());  | 
| //                    list2.add(orderReportDetailDto);  | 
| //  | 
| //                }  | 
| //            }  | 
| //        }else {  | 
| //            List<Fence> all = fenceService.findByPartnerId(partnerId);  | 
| //            if (CollUtil.isNotEmpty(all)) {  | 
| //                for (Fence fence : all) {  | 
| //                    Integer id = fence.getId();  | 
| //                    String fenceName = fence.getFenceName();  | 
| //                    long count = list2.stream().filter(x -> x.getAreaId().equals(id.toString())).count();  | 
| //                    if(count==0) {  | 
| //                        OrderReportDetailDto orderReportDetailDto = new OrderReportDetailDto();  | 
| //                        orderReportDetailDto.setAreaName(fenceName);  | 
| //                        orderReportDetailDto.setAreaId(id.toString());  | 
| //                        orderReportDetailDto.setMoney(Constants.MONEY_INIT.toString());  | 
| //                        orderReportDetailDto.setMoneyDouble(Convert.toDouble(orderReportDetailDto.getMoney()));  | 
| //                        orderReportDetailDto.setNum(0);  | 
| //                        orderReportDetailDto.setAlloney(Constants.MONEY_INIT.toString());  | 
| //                        list2.add(orderReportDetailDto);  | 
| //                    }  | 
| //  | 
| //                }  | 
| //            }  | 
| //        }  | 
|   | 
| //        list2=CollUtil.sort(list2,Comparator.comparing(OrderReportDetailDto::getAreaId).reversed());  | 
|         if(type==1) {  | 
|             list2 = CollUtil.sort(list2, Comparator.comparingDouble(OrderReportDetailDto::getMoneyDouble).reversed());  | 
|         }else if(type==2){  | 
|             list2 = CollUtil.sort(list2, Comparator.comparing(OrderReportDetailDto::getNum).reversed());  | 
|         }  | 
|         return list2;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 设置日环比  | 
|      * @param list  | 
|      * @param listToday  | 
|      * @param listYesterday  | 
|      * @param type 1:回收金额日环比 2:下单用户日环比  | 
|      */  | 
|     public void setRatio( List<OrderReportDetailDto> list, List<OrderReportDetailDto> listToday,List<OrderReportDetailDto> listYesterday,int type){  | 
|         for (OrderReportDetailDto orderReportDetailDto : listToday) {  | 
|             String money = orderReportDetailDto.getMoney();  | 
|             int num = orderReportDetailDto.getNum();  | 
|             String areaId = orderReportDetailDto.getAreaId();  | 
|             for (OrderReportDetailDto orderReportDetailDto2 : listYesterday){  | 
|                 String money2 = orderReportDetailDto2.getMoney();  | 
|                 int num2 = orderReportDetailDto2.getNum();  | 
|                 String areaId2 = orderReportDetailDto2.getAreaId();  | 
|                 if(areaId2.equals(areaId)){  | 
|                     String recyleRatio = getRecyleRatio(Convert.toBigDecimal(money2), Convert.toBigDecimal(money));  | 
|                     String orderUserRatio = getOrderUserRatio(num2, num);  | 
|                     for (OrderReportDetailDto reportDetailDto : list) {  | 
|                         if(reportDetailDto.getAreaId().equals(areaId)){  | 
|                             if(type==1){  | 
|                                 reportDetailDto.setRatio(recyleRatio);  | 
|                             }else if(type==2){  | 
|                                 reportDetailDto.setRatio(orderUserRatio);  | 
|                             }  | 
|   | 
|                             break;  | 
|                         }  | 
|                     }  | 
|                     break;  | 
|                 }  | 
|             }  | 
|         }  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取回收金额日环比  | 
|      * @param recyleMoneyYesterday  | 
|      * @param recyleMoneyToday  | 
|      * @return  | 
|      */  | 
|     public String getRecyleRatio(BigDecimal recyleMoneyYesterday,BigDecimal  recyleMoneyToday){  | 
|         //回收日环比计算方法: (本日回收金额/昨日回收金额 — 1 )× 100%  正值为增长率  负值为下降率  | 
|         String RecyleRatio = "+0.00%";  | 
|         if (recyleMoneyYesterday.compareTo(BigDecimal.ZERO) != 0) {  | 
|             String s = Convert.toStr(NumberUtil.mul(NumberUtil.sub(NumberUtil.div(recyleMoneyToday, recyleMoneyYesterday), 1), 100));  | 
|             RecyleRatio = businessUtil.changeMoney(s) + "%";  | 
|         } else {  | 
|             RecyleRatio = "+100.00%";  | 
|         }  | 
|         return RecyleRatio;  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取下单用户日环比  | 
|      * @param orderUserNumYesterday  | 
|      * @param orderUserNumToday  | 
|      * @return  | 
|      */  | 
|     public String getOrderUserRatio(int orderUserNumYesterday,int  orderUserNumToday){  | 
|         //下单用户量日环比  | 
|         String orderUserRatio = "+0.00%";  | 
|         if (orderUserNumYesterday != 0) {  | 
|             String s = Convert.toStr(NumberUtil.mul(NumberUtil.sub(NumberUtil.div(orderUserNumToday, orderUserNumYesterday), 1), 100));  | 
|             orderUserRatio = businessUtil.changeMoney(s) + "%";  | 
|         } else {  | 
|             orderUserRatio = "+100.00%";  | 
|         }  | 
|         return orderUserRatio;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 查看这个区域下的所有订单  | 
|      * @param areaId  | 
|      * @param level  | 
|      * @return  | 
|      */  | 
|     public List<OrderInfo> findByAreaAndLevel(List<OrderInfo> collect,String areaId,Integer level){  | 
|         AddressLevelInfo addressLevelInfo=new AddressLevelInfo();  | 
|         if(1==level){  | 
|             addressLevelInfo.setLevel1Id(areaId);  | 
|         }else if(2==level){  | 
|             addressLevelInfo.setLevel2Id(areaId);  | 
|         }else if(3==level){  | 
|             addressLevelInfo.setLevel3Id(areaId);  | 
|         }  | 
|         List<AddressLevelInfo> select = addressLevelInfoMapper.select(addressLevelInfo);  | 
|         if(CollUtil.isNotEmpty(select)){  | 
|             List<String> collect2 = select.stream().map(x -> x.getLevel3Id()).collect(Collectors.toList());  | 
|             List<OrderInfo> collect1 = collect.stream().filter(x -> StrUtil.isNotBlank(x.getTownId()) && collect2.contains(x.getTownId())).collect(Collectors.toList());  | 
|             return collect1;  | 
|         }  | 
|         return null;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 获取回收日均金额  | 
|      * @param collect1  已完成订单  | 
|      * @param nowData  | 
|      * @return  | 
|      */  | 
|     public String getMoneyAvg(  List<OrderInfo> collect1,Date nowData){  | 
|         String recyleMoneyTodayAvg = Constants.MONEY_INIT.toString();  | 
|         if(CollUtil.isNotEmpty(collect1)) {  | 
|             List<OrderInfo> collect2 = collect1.stream().sorted(Comparator.comparing(OrderInfo::getCompleteTime)).collect(Collectors.toList());  | 
|             OrderInfo orderInfo2 = collect2.get(0);  | 
|             BigDecimal recyleMoney = Constants.MONEY_INIT;  | 
|             //订单已完成的列表  | 
|             for (OrderInfo orderInfo : collect2) {  | 
|                 BigDecimal money = Convert.toBigDecimal(orderInfo.getMoney());  | 
|                 recyleMoney = NumberUtil.add(money, recyleMoney);  | 
|             }  | 
|             //回收完成最早时间  | 
|             String recyleEarliestTime = orderInfo2.getCompleteTime();  | 
|             //回收日均金额  回收总金额/ (当前时间-最早回收时间)  | 
|             DateTime parseStart = DateUtil.parse(recyleEarliestTime, DateUtils.DATE_FORMAT_YMD);  | 
|             long l = DateUtil.betweenDay(parseStart, nowData, true);  | 
|             if (l == 0) {  | 
|                 l = 1;  | 
|             }  | 
|             recyleMoneyTodayAvg = businessUtil.changeMoney(Convert.toStr(NumberUtil.div(recyleMoney, l)));  | 
|         }  | 
|         return recyleMoneyTodayAvg;  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取日均下单用户量  | 
|      * @param orderInfos 所有订单  | 
|      * @param nowData  | 
|      * @return  | 
|      */  | 
|     public int getNumAvg(List<OrderInfo> orderInfos,Date nowData){  | 
|         //日均下单用户量  | 
|         int orderUserNumTodayAvg = 0;  | 
|         if(CollUtil.isNotEmpty(orderInfos)) {  | 
|             ArrayList<OrderInfo> collect = orderInfos.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(OrderInfo::getCreateUserId))), ArrayList::new));  | 
|             int orderUserNum = collect.size();  | 
|             //下单最早时间  | 
|             Date orderEarliestTime = getOrderEarliestTime(orderInfos);  | 
|             long l = DateUtil.betweenDay(orderEarliestTime, nowData, true);  | 
|             if (l == 0) {  | 
|                 l = 1;  | 
|             }  | 
|             orderUserNumTodayAvg = Convert.toInt(NumberUtil.div(orderUserNum, l));  | 
|         }  | 
|         return orderUserNumTodayAvg;  | 
|     }  | 
|   | 
|   | 
|   | 
|     /**获取最早下单时间  | 
|      *  | 
|      * @param orderInfos 所有订单  | 
|      * @return  | 
|      */  | 
|     public Date getOrderEarliestTime(List<OrderInfo> orderInfos){  | 
|         Date orderEarliestTime=null;  | 
|         //所有订单  | 
|         for (OrderInfo orderInfo : orderInfos) {  | 
|             //获取最早下单时间  | 
|             String createTime = orderInfo.getCreateTime();  | 
|             DateTime parse3 = DateUtil.parse(createTime, DateUtils.DATE_FORMAT_YMD);  | 
|             if (orderEarliestTime == null) {  | 
|                 orderEarliestTime = parse3;  | 
|             } else {  | 
|                 int compare = DateUtil.compare(orderEarliestTime, parse3);  | 
|                 if (compare > 0) {  | 
|                     orderEarliestTime = parse3;  | 
|                 }  | 
|             }  | 
|         }  | 
|         return orderEarliestTime;  | 
|     }  | 
|   | 
|   | 
|     public List<OrderInfo> removeRepeatUser(List<OrderInfo> list){  | 
| //        ArrayList<OrderInfo> collect = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getCreateUserId() + ";" + DateUtil.parse(o.getCreateTime(), DateUtils.DATE_FORMAT_YMD).toString(DateUtils.DATE_FORMAT_YMD)))), ArrayList::new));  | 
|         return list;  | 
|     }  | 
| }  |