package com.xzx.gc.system.service;  
 | 
  
 | 
import cn.hutool.core.bean.BeanUtil;  
 | 
import cn.hutool.core.collection.CollUtil;  
 | 
import cn.hutool.core.convert.Convert;  
 | 
import cn.hutool.core.date.DateUtil;  
 | 
import cn.hutool.core.lang.Dict;  
 | 
import cn.hutool.core.util.ReflectUtil;  
 | 
import cn.hutool.core.util.StrUtil;  
 | 
import com.xzx.gc.common.constant.CommonEnum;  
 | 
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.common.utils.DateUtils;  
 | 
import com.xzx.gc.common.utils.SpringUtil;  
 | 
import com.xzx.gc.entity.*;  
 | 
import com.xzx.gc.system.mapper.PlatformReportMapper;  
 | 
import com.xzx.gc.util.CollUtils;  
 | 
import lombok.extern.slf4j.Slf4j;  
 | 
import org.springframework.beans.factory.annotation.Autowired;  
 | 
import org.springframework.scheduling.annotation.Async;  
 | 
import org.springframework.scheduling.annotation.Scheduled;  
 | 
import org.springframework.stereotype.Service;  
 | 
import org.springframework.transaction.annotation.Transactional;  
 | 
import tk.mybatis.mapper.entity.Example;  
 | 
  
 | 
import java.math.BigDecimal;  
 | 
import java.util.Date;  
 | 
import java.util.List;  
 | 
import java.util.stream.Collectors;  
 | 
  
 | 
  
 | 
/**  
 | 
 * 平台报表  
 | 
 */  
 | 
@Service  
 | 
@Transactional  
 | 
@Slf4j  
 | 
public class PlatformReportService {  
 | 
  
 | 
    @Autowired  
 | 
    private PlatformReportMapper platformReportMapper;  
 | 
  
 | 
    @Autowired  
 | 
    private UserService userService;  
 | 
  
 | 
    @Autowired  
 | 
    private OrderService orderService;  
 | 
  
 | 
    @Autowired  
 | 
    private AccountService accountService;  
 | 
  
 | 
    @Autowired  
 | 
    private OrderComplaintService orderComplaintService;  
 | 
  
 | 
    @Autowired  
 | 
    private OrderStorageService orderStorageService;  
 | 
  
 | 
    @Autowired  
 | 
    private CityPartnerService cityPartnerService;  
 | 
  
 | 
    @Autowired  
 | 
    private BusinessUtil businessUtil;  
 | 
  
 | 
    @Autowired  
 | 
    private OtherUserService otherUserService;  
 | 
  
 | 
    @Autowired  
 | 
    private AccountLogService accountLogService;  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 按报表类型和指标类型查询  
 | 
     * @param reportType  
 | 
     * @param indicatorType  
 | 
     * @return  
 | 
     */  
 | 
    public List<PlatformReport> findByType(String reportType,String indicatorType){  
 | 
        Example example=new Example(PlatformReport.class);  
 | 
        Example.Criteria criteria = example.createCriteria();  
 | 
        criteria.andEqualTo("reportType",reportType);  
 | 
        criteria.andEqualTo("indicatorType",indicatorType);  
 | 
        return platformReportMapper.selectByExample(example);  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 根据报表类型 及小于入参时间查询  
 | 
     * @param reportType  
 | 
     * @param time  
 | 
     * @return  
 | 
     */  
 | 
    public List<PlatformReport> findByReportTypeLessThanTime(String reportType,String time){  
 | 
        Example example=new Example(PlatformReport.class);  
 | 
        Example.Criteria criteria = example.createCriteria();  
 | 
        criteria.andEqualTo("reportType",reportType);  
 | 
        criteria.andLessThan("createTime",time);  
 | 
        return platformReportMapper.selectByExample(example);  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 根据类型和时间筛选  
 | 
     * @param reportType  
 | 
     * @param indicatorType  
 | 
     * @param timeType  
 | 
     * @return  
 | 
     */  
 | 
    public List<PlatformReport> findByTypeAndTimeType(String reportType,String indicatorType,String timeType){  
 | 
        Example example=new Example(PlatformReport.class);  
 | 
        Example.Criteria criteria = example.createCriteria();  
 | 
        criteria.andEqualTo("reportType",reportType);  
 | 
        criteria.andEqualTo("indicatorType",indicatorType);  
 | 
        //1:近3天 2 近1个星期 3:近一个月 4:近3个月 5:近6个月  
 | 
        if("1".equals(timeType)){  
 | 
            criteria.andCondition("DATE_FORMAT(create_time,'%Y-%m-%d')>=date_sub(CURRENT_DATE(), interval 3 day)");  
 | 
        } else if ("2".equals(timeType)) {  
 | 
            criteria.andCondition("DATE_FORMAT(create_time,'%Y-%m-%d')>=date_sub(CURRENT_DATE(), interval 7 day)");  
 | 
        }else if ("3".equals(timeType)) {  
 | 
            criteria.andCondition("DATE_FORMAT(create_time,'%Y-%m-%d')>=date_sub(CURRENT_DATE(), interval 1 month)");  
 | 
        }else if ("4".equals(timeType)) {  
 | 
            criteria.andCondition("DATE_FORMAT(create_time,'%Y-%m-%d')>=date_sub(CURRENT_DATE(), interval 3 month)");  
 | 
        }else if ("5".equals(timeType)) {  
 | 
            criteria.andCondition("DATE_FORMAT(create_time,'%Y-%m-%d')>=date_sub(CURRENT_DATE(), interval 6 month)");  
 | 
        }  
 | 
        example.setOrderByClause("create_time asc");  
 | 
        return platformReportMapper.selectByExample(example);  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 根据指标类型查找  
 | 
     * @param indicatorType  
 | 
     * @return  
 | 
     */  
 | 
    public List<PlatformReport> findByIndicatorType(String indicatorType){  
 | 
        Example example=new Example(PlatformReport.class);  
 | 
        Example.Criteria criteria = example.createCriteria();  
 | 
        criteria.andEqualTo("indicatorType",indicatorType);  
 | 
        example.setOrderByClause("create_time desc");  
 | 
        return platformReportMapper.selectByExample(example);  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 根据统计时间查找  
 | 
     * @param time  
 | 
     * @return  
 | 
     */  
 | 
    public int findByTime(String time){  
 | 
        Example example=new Example(PlatformReport.class);  
 | 
        Example.Criteria criteria = example.createCriteria();  
 | 
        criteria.andEqualTo("createTime",time);  
 | 
        return platformReportMapper.selectCountByExample(example);  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 获取 日环比  
 | 
     * @param moneys  
 | 
     * @return  
 | 
     */  
 | 
    public String  getRatio(List<PlatformReport> moneys ){  
 | 
        List<PlatformReport> collect = moneys.stream().filter(x -> DateUtil.offsetDay(new Date(),-2).toDateStr().equals(x.getCreateTime())).collect(Collectors.toList());  
 | 
        double yesterday = collect.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum();  
 | 
        collect = moneys.stream().filter(x -> DateUtil.offsetDay(new Date(),-1).toDateStr().equals(x.getCreateTime())).collect(Collectors.toList());  
 | 
        double today = collect.stream().mapToDouble(x -> Convert.toDouble(x.getIndicator())).sum();  
 | 
        return businessUtil.getRatio(Convert.toBigDecimal(yesterday), Convert.toBigDecimal(today));  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 删除所有报表数据  
 | 
     */  
 | 
    public void deleteAll(){  
 | 
        platformReportMapper.delete(new PlatformReport());  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 批量添加  
 | 
     * @param list  
 | 
     */  
 | 
    public void batchAdd(List<PlatformReport> list){  
 | 
        platformReportMapper.insertList(list);  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 初始化所有数据生成报表  
 | 
     */  
 | 
    public void init(){  
 | 
        List<UserInfo> userInfos = userService.findForBidden();  
 | 
        List<OrderInfo> orderInfos =orderService.findPartnerId();  
 | 
        List<OrderStorageInfo> storageInfos = orderStorageService.findByStorageType(Convert.toShort(OrderEnum.打包站.getValue()));  
 | 
        List<OrderComplaint> complaints = orderComplaintService.findPartner();  
 | 
        List<AccountInfo> accountInfos = accountService.findThanZero();  
 | 
        List<AccountLog> withdraws = accountLogService.findByChannelType(Convert.toShort(CommonEnum.提现操作.getValue()));  
 | 
        init(userInfos,orderInfos,storageInfos,complaints,accountInfos,withdraws,DateUtil.today());  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 同步数据  
 | 
     */  
 | 
    @Scheduled(cron = "${order.report.cron}")  
 | 
    @Async  
 | 
    public void sysnc(){  
 | 
        log.trace("********定时执行平台报表统计任务开始【凌晨12点半执行】*********");  
 | 
        if(!SpringUtil.isCloud()) {  
 | 
            List<UserInfo> userInfos = userService.findForBiddenByTime();  
 | 
            List<OrderInfo> orderInfos = orderService.findPartnerIdByTime();  
 | 
            List<OrderStorageInfo> storageInfos = orderStorageService.findByStorageTypeByTime(Convert.toShort(OrderEnum.打包站.getValue()));  
 | 
            List<OrderComplaint> complaints = orderComplaintService.findPartnerByTime();  
 | 
            List<AccountInfo> accountInfos = accountService.findThanZero();  
 | 
            List<AccountLog> withdraws = accountLogService.findByChannelTypeAndTime(Convert.toShort(CommonEnum.提现操作.getValue()));  
 | 
            init(userInfos, orderInfos, storageInfos, complaints, accountInfos,withdraws, DateUtil.yesterday().toDateStr());  
 | 
        }  
 | 
        log.trace("********定时执行平台报表统计任务结束【凌晨12点半执行】*********");  
 | 
    }  
 | 
  
 | 
  
 | 
    private void init(List<UserInfo> userInfos,List<OrderInfo> orderInfos,List<OrderStorageInfo> storageInfos,List<OrderComplaint> complaints,List<AccountInfo> accountInfos,List<AccountLog> withdraws,String time){  
 | 
  
 | 
        log.debug(businessUtil.repeatService("平台报表统计任务开始"));  
 | 
  
 | 
        if(findByTime(DateUtil.yesterday().toDateStr())>0||findByTime(DateUtil.today())>0){  
 | 
            log.debug("统计已执行");  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        List<PlatformReport> list=CollUtil.newArrayList();  
 | 
        /**  
 | 
         *总用户量  
 | 
         */  
 | 
        //按时间统计  
 | 
        List<List<UserInfo>> userByTime = CollUtils.groupByField(userInfos, "registTime");  
 | 
  
 | 
        if(CollUtil.isNotEmpty(userByTime)) {  
 | 
            for (List<UserInfo> userInfoList : userByTime) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(DateUtils.formatDate(userInfoList.get(0).getRegistTime()));  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.用户量.getValue()));  
 | 
                platformReport.setIndicator(Convert.toStr(userInfoList.size()));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按时间统计.getValue()));  
 | 
                platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.用户量.getValue(),OrderEnum.按时间统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成总用户量按时间统计,统计数目:{}",list.size());  
 | 
  
 | 
        //按合伙人统计  
 | 
        list.clear();  
 | 
  
 | 
        //用户根据合伙人拆分成多个集合  
 | 
        if(CollUtil.isNotEmpty(userInfos)){  
 | 
            Dict dict =groupPartner(userInfos);  
 | 
            for (String s : dict.keySet()) {  
 | 
                List<UserInfo> dictList = (List<UserInfo>) dict.get(s);  
 | 
                staticUser(dictList,list,time);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.用户量.getValue(),OrderEnum.按合伙人统计.getValue());  
 | 
        }  
 | 
  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成总用户量按合伙人统计,统计数目:{}",list.size());  
 | 
  
 | 
  
 | 
        /*  
 | 
         *总订单量  
 | 
         */  
 | 
        //按时间统计  
 | 
        list.clear();  
 | 
        List<List<OrderInfo>> orderByTime = CollUtils.groupByField(orderInfos, "createTime");  
 | 
        if(CollUtil.isNotEmpty(orderByTime)) {  
 | 
            for (List<OrderInfo> orderInfoList : orderByTime) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(DateUtils.formatDate(orderInfoList.get(0).getCreateTime()));  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.总下单量.getValue()));  
 | 
                platformReport.setIndicator(Convert.toStr(orderInfoList.size()));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按时间统计.getValue()));  
 | 
                platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.总下单量.getValue(),OrderEnum.按时间统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成总订单量按时间统计,统计数目:{}",list.size());  
 | 
  
 | 
        //按合伙人统计  
 | 
        list.clear();  
 | 
        List<List<OrderInfo>> orderByPartner = CollUtil.groupByField(orderInfos, "partnerId");  
 | 
        if(CollUtil.isNotEmpty(orderByPartner)) {  
 | 
            for (List<OrderInfo> orderInfoList : orderByPartner) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(time);  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.总下单量.getValue()));  
 | 
                platformReport.setIndicator(Convert.toStr(orderInfoList.size()));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按合伙人统计.getValue()));  
 | 
                String partnterId = StrUtil.isBlank(orderInfoList.get(0).getPartnerId()) ? Constants.DEFAULT_ID : orderInfoList.get(0).getPartnerId();  
 | 
                platformReport.setUserId(partnterId);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.总下单量.getValue(),OrderEnum.按合伙人统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成总订单量按合伙人统计,统计数目:{}",list.size());  
 | 
  
 | 
  
 | 
        /*  
 | 
         *总交易金额  
 | 
         */  
 | 
        //按时间统计  
 | 
        list.clear();  
 | 
        //删除金额为0(订单状态为已取消等)  
 | 
        orderInfos.removeIf(x->StrUtil.isBlank(x.getMoney())||Convert.toBigDecimal(x.getMoney()).compareTo(BigDecimal.ZERO)==0);  
 | 
        orderByTime = CollUtils.groupByField(orderInfos, "createTime");  
 | 
        if(CollUtil.isNotEmpty(orderByTime)) {  
 | 
            for (List<OrderInfo> orderInfoList : orderByTime) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(DateUtils.formatDate(orderInfoList.get(0).getCreateTime()));  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.总交易金额.getValue()));  
 | 
                platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(orderInfoList.stream().mapToDouble(x -> Convert.toDouble(x.getMoney())).sum())));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按时间统计.getValue()));  
 | 
                platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.总交易金额.getValue(),OrderEnum.按时间统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成总交易额按时间统计,统计数目:{}",list.size());  
 | 
  
 | 
        //按合伙人统计  
 | 
        list.clear();  
 | 
        orderByPartner = CollUtil.groupByField(orderInfos, "partnerId");  
 | 
        if(CollUtil.isNotEmpty(orderByPartner)) {  
 | 
            for (List<OrderInfo> orderInfoList : orderByPartner) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(time);  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.总交易金额.getValue()));  
 | 
                platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(orderInfoList.stream().mapToDouble(x -> Convert.toDouble(x.getMoney())).sum())));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按合伙人统计.getValue()));  
 | 
                String partnterId = StrUtil.isBlank(orderInfoList.get(0).getPartnerId()) ? Constants.DEFAULT_ID : orderInfoList.get(0).getPartnerId();  
 | 
                platformReport.setUserId(partnterId);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.总交易金额.getValue(),OrderEnum.按合伙人统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成总交易额按合伙人统计,统计数目:{}",list.size());  
 | 
  
 | 
  
 | 
        /*  
 | 
          打包站回收金额  
 | 
         */  
 | 
        //按时间统计  
 | 
        list.clear();  
 | 
        List<List<OrderStorageInfo>> storageByTime = CollUtils.groupByField(storageInfos, "storageTime");  
 | 
        if(CollUtil.isNotEmpty(storageByTime)) {  
 | 
            for (List<OrderStorageInfo> storageInfoList : storageByTime) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(DateUtils.formatDate(storageInfoList.get(0).getStorageTime()));  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.打包站回收金额.getValue()));  
 | 
                platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(storageInfoList.stream().mapToDouble(x -> Convert.toDouble(x.getStorageMoney(),Convert.toDouble(BigDecimal.ZERO))).sum())));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按时间统计.getValue()));  
 | 
                platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.打包站回收金额.getValue(),OrderEnum.按时间统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成打包站回收金额按时间统计,统计数目:{}",list.size());  
 | 
  
 | 
  
 | 
        //按打包站统计  
 | 
        list.clear();  
 | 
        List<List<OrderStorageInfo>> storageByPartner = CollUtil.groupByField(storageInfos, "sysStorageId");  
 | 
        if(CollUtil.isNotEmpty(storageByPartner)) {  
 | 
            for (List<OrderStorageInfo> storageInfoList : storageByPartner) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(time);  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.打包站回收金额.getValue()));  
 | 
                platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(storageInfoList.stream().mapToDouble(x -> Convert.toDouble(x.getStorageMoney(),Convert.toDouble(BigDecimal.ZERO))).sum())));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按打包站统计.getValue()));  
 | 
                platformReport.setUserId(Convert.toStr(storageInfoList.get(0).getSysStorageId()));  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.打包站回收金额.getValue(),OrderEnum.按打包站统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成打包站回收金额按打包站统计,统计数目:{}",list.size());  
 | 
  
 | 
  
 | 
        /*  
 | 
         * 投诉总量  
 | 
         */  
 | 
        //按时间统计  
 | 
        list.clear();  
 | 
        List<List<OrderComplaint>> complaintByTime = CollUtils.groupByField(complaints, "createTime");  
 | 
        if(CollUtil.isNotEmpty(complaintByTime)) {  
 | 
            for (List<OrderComplaint> complaintList : complaintByTime) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(DateUtils.formatDate(complaintList.get(0).getCreateTime()));  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.投诉总量.getValue()));  
 | 
                platformReport.setIndicator(Convert.toStr(complaintList.size()));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按时间统计.getValue()));  
 | 
                platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.投诉总量.getValue(),OrderEnum.按时间统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成投诉总量按时间统计,统计数目:{}",list.size());  
 | 
  
 | 
        //按合伙人统计  
 | 
        list.clear();  
 | 
        List<List<OrderComplaint>> complaintByPartner = CollUtil.groupByField(complaints, "partnerId");  
 | 
        if(CollUtil.isNotEmpty(complaintByPartner)) {  
 | 
            for (List<OrderComplaint> complaintList : complaintByPartner) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(time);  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.投诉总量.getValue()));  
 | 
                platformReport.setIndicator(Convert.toStr(complaintList.size()));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按合伙人统计.getValue()));  
 | 
                String partnterId = StrUtil.isBlank(complaintList.get(0).getPartnerId()) ? Constants.DEFAULT_ID : complaintList.get(0).getPartnerId();  
 | 
                platformReport.setUserId(partnterId);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.投诉总量.getValue(),OrderEnum.按合伙人统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成投诉总量按打合伙人统计,统计数目:{}",list.size());  
 | 
  
 | 
        /*  
 | 
         * 未提现金额  
 | 
         */  
 | 
        //按时间统计  
 | 
        if(CollUtil.isNotEmpty(accountInfos)) {  
 | 
            PlatformReport platformReport = new PlatformReport();  
 | 
            platformReport.setCreateTime(time);  
 | 
            platformReport.setReportType(Convert.toShort(OrderEnum.未提现总额.getValue()));  
 | 
            platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(accountInfos.stream().mapToDouble(x -> Convert.toDouble(x.getMoney())).sum())));  
 | 
            platformReport.setIndicatorType(Convert.toShort(OrderEnum.按时间统计.getValue()));  
 | 
            platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
            platformReportMapper.insertSelective(platformReport);  
 | 
        }  
 | 
        log.debug("已完成未提现金额按时间统计,统计数目:{}",CollUtil.isNotEmpty(accountInfos)?1:0);  
 | 
        //按合伙人统计  
 | 
        list.clear();  
 | 
  
 | 
        //查询当前账户所属合伙人 打包站的账户归为合伙人  
 | 
        for (AccountInfo accountInfo : accountInfos) {  
 | 
            String partnerId = getPartnerIdByUserId(accountInfo.getUserId());  
 | 
            accountInfo.setPartnerId(partnerId);  
 | 
        }  
 | 
  
 | 
  
 | 
        //账户根据合伙人拆分成多个集合  
 | 
        if(CollUtil.isNotEmpty(accountInfos)){  
 | 
            Dict dict =groupPartner(accountInfos);  
 | 
            for (String s : dict.keySet()) {  
 | 
                List<AccountInfo> dictList = (List<AccountInfo>) dict.get(s);  
 | 
                staticAccount(dictList,list,time);  
 | 
            }  
 | 
        }  
 | 
  
 | 
  
 | 
        if(CollUtil.isNotEmpty(list)) {  
 | 
            platformReportMapper.insertList(list);  
 | 
        }  
 | 
        log.debug("已完成未提现金额按合伙人统计,统计数目:{}",list.size());  
 | 
  
 | 
        /*  
 | 
         *已提现金额  
 | 
         */  
 | 
        //按时间统计  
 | 
        list.clear();  
 | 
        List<List<AccountLog>> withdrawByTime = CollUtils.groupByField(withdraws, "createTime");  
 | 
        if(CollUtil.isNotEmpty(withdrawByTime)) {  
 | 
            for (List<AccountLog> withdrawList : withdrawByTime) {  
 | 
                PlatformReport platformReport = new PlatformReport();  
 | 
                platformReport.setCreateTime(DateUtils.formatDate(withdrawList.get(0).getCreateTime()));  
 | 
                platformReport.setReportType(Convert.toShort(OrderEnum.已提现总额.getValue()));  
 | 
                platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(withdrawList.stream().mapToDouble(x -> Convert.toDouble(x.getMoney())).sum())));  
 | 
                platformReport.setIndicatorType(Convert.toShort(OrderEnum.按时间统计.getValue()));  
 | 
                platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
                list.add(platformReport);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.已提现总额.getValue(),OrderEnum.按时间统计.getValue());  
 | 
        }  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成已提现总额按时间统计,统计数目:{}",list.size());  
 | 
  
 | 
        //按合伙人统计  
 | 
        list.clear();  
 | 
        //查询当前账户所属合伙人 打包站的账户归为合伙人  
 | 
        for (AccountLog withdraw : withdraws) {  
 | 
            String partnerId = getPartnerIdByUserId(withdraw.getUserId());  
 | 
            withdraw.setPartnerId(partnerId);  
 | 
        }  
 | 
  
 | 
  
 | 
        //账户根据合伙人拆分成多个集合  
 | 
        if(CollUtil.isNotEmpty(withdraws)){  
 | 
            Dict dict =groupPartner(withdraws);  
 | 
            for (String s : dict.keySet()) {  
 | 
                List<AccountLog> dictList = (List<AccountLog>) dict.get(s);  
 | 
                staticAccountLog(dictList,list,time);  
 | 
            }  
 | 
        }else {  
 | 
            initForEmptyList(list,time,OrderEnum.已提现总额.getValue(),OrderEnum.按合伙人统计.getValue());  
 | 
        }  
 | 
  
 | 
        platformReportMapper.insertList(list);  
 | 
        log.debug("已完成已提现总额按合伙人统计,统计数目:{}",list.size());  
 | 
  
 | 
  
 | 
        log.debug(businessUtil.repeatService("平台报表统计任务结束"));  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 根据用户ID查找合伙人ID  
 | 
     * @param userId  
 | 
     * @return  
 | 
     */  
 | 
    private String getPartnerIdByUserId(String userId) {  
 | 
        String partnerId;  
 | 
        OtherUserInfo byId = otherUserService.findById(userId);  
 | 
        if(byId!=null){  
 | 
            if(CommonEnum.打包员.getValue().equals(byId.getUserType())||CommonEnum.打包站运营员.getValue().equals(byId.getUserType())){  
 | 
                //打包站id转换成合伙人id  
 | 
                partnerId = cityPartnerService.queryById(Convert.toLong(byId.getPartnerId())).getPackingStation();  
 | 
            }else {  
 | 
                partnerId=byId.getPartnerId();  
 | 
            }  
 | 
        }else {  
 | 
            UserInfo byId1 = userService.findById(userId);  
 | 
            if(byId1==null){  
 | 
                partnerId=Constants.DEFAULT_PARTNER_ID;  
 | 
            }else {  
 | 
                partnerId = byId1.getPartnerId();  
 | 
            }  
 | 
        }  
 | 
        return partnerId;  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 按合伙人分组  
 | 
     */  
 | 
    private <T> Dict groupPartner(List<T> list) {  
 | 
        Dict dict = Dict.create();  
 | 
        for (T t : list) {  
 | 
            String partnerIds= (String) ReflectUtil.getFieldValue(t,"partnerId");  
 | 
            if(StrUtil.isNotBlank(partnerIds)){  
 | 
                String[] split = partnerIds.split(",");  
 | 
                if(split.length>1) {  
 | 
                    for (String partnerId : split) {  
 | 
                        Object o = BeanUtil.copyProperties(t, t.getClass());  
 | 
                        ReflectUtil.setFieldValue(o, "singlePartnerId", partnerId);  
 | 
                        groupDict(dict, o, partnerId);  
 | 
                    }  
 | 
                }else {  
 | 
                    ReflectUtil.setFieldValue(t, "singlePartnerId", partnerIds);  
 | 
                    groupDict(dict, t, partnerIds);  
 | 
                }  
 | 
            }else {  
 | 
                String partnerId=Constants.DEFAULT_ID;  
 | 
                ReflectUtil.setFieldValue(t,"singlePartnerId",partnerId);  
 | 
                groupDict(dict,  t, partnerId);  
 | 
            }  
 | 
        }  
 | 
        return dict;  
 | 
    }  
 | 
  
 | 
    private <T> void groupDict(Dict dict, T t, String s) {  
 | 
        if(dict.containsKey(s)){  
 | 
            List<T> dictList = (List<T>) dict.get(s);  
 | 
            dictList.add(t);  
 | 
            dict.put(s,dictList);  
 | 
        }else {  
 | 
            dict.put(s,CollUtil.newArrayList(t));  
 | 
        }  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 用户按合伙人统计  
 | 
     * @param userInfos  
 | 
     * @param list  
 | 
     * @param time  
 | 
     */  
 | 
    private void staticUser(List<UserInfo> userInfos,List<PlatformReport> list,String time){  
 | 
        List<List<UserInfo>> userByPartner = CollUtil.groupByField(userInfos, "singlePartnerId");  
 | 
        for (List<UserInfo> userInfoList : userByPartner) {  
 | 
            PlatformReport platformReport=new PlatformReport();  
 | 
            platformReport.setCreateTime(time);  
 | 
            platformReport.setReportType(Convert.toShort(OrderEnum.用户量.getValue()));  
 | 
            platformReport.setIndicator(Convert.toStr(userInfoList.size()));  
 | 
            platformReport.setIndicatorType(Convert.toShort(OrderEnum.按合伙人统计.getValue()));  
 | 
            String partnterId = StrUtil.isBlank(userInfoList.get(0).getPartnerId()) ? Constants.DEFAULT_ID : userInfoList.get(0).getSinglePartnerId();  
 | 
            platformReport.setUserId(partnterId);  
 | 
            list.add(platformReport);  
 | 
        }  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 账户按合伙人统计  
 | 
     * @param list  
 | 
     * @param time  
 | 
     */  
 | 
    private void staticAccount(List<AccountInfo> accountInfos,List<PlatformReport> list,String time){  
 | 
        List<List<AccountInfo>> accountByPartner = CollUtil.groupByField(accountInfos, "singlePartnerId");  
 | 
        for (List<AccountInfo> accountInfoList : accountByPartner) {  
 | 
            PlatformReport platformReport=new PlatformReport();  
 | 
            platformReport.setCreateTime(time);  
 | 
            platformReport.setReportType(Convert.toShort(OrderEnum.未提现总额.getValue()));  
 | 
            platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(accountInfoList.stream().mapToDouble(x->Convert.toDouble(x.getMoney())).sum())));  
 | 
            platformReport.setIndicatorType(Convert.toShort(OrderEnum.按合伙人统计.getValue()));  
 | 
            String partnterId = StrUtil.isBlank(accountInfoList.get(0).getPartnerId()) ? Constants.DEFAULT_ID : accountInfoList.get(0).getSinglePartnerId();  
 | 
            platformReport.setUserId(partnterId);  
 | 
            list.add(platformReport);  
 | 
        }  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 已提现按合伙人统计  
 | 
     * @param list  
 | 
     * @param time  
 | 
     */  
 | 
    private void staticAccountLog(List<AccountLog> accountInfos,List<PlatformReport> list,String time){  
 | 
        List<List<AccountLog>> accountByPartner = CollUtil.groupByField(accountInfos, "singlePartnerId");  
 | 
        for (List<AccountLog> accountInfoList : accountByPartner) {  
 | 
            PlatformReport platformReport=new PlatformReport();  
 | 
            platformReport.setCreateTime(time);  
 | 
            platformReport.setReportType(Convert.toShort(OrderEnum.已提现总额.getValue()));  
 | 
            platformReport.setIndicator(businessUtil.changeMoney(Convert.toStr(accountInfoList.stream().mapToDouble(x->Convert.toDouble(x.getMoney())).sum())));  
 | 
            platformReport.setIndicatorType(Convert.toShort(OrderEnum.按合伙人统计.getValue()));  
 | 
            String partnterId = StrUtil.isBlank(accountInfoList.get(0).getPartnerId()) ? Constants.DEFAULT_ID : accountInfoList.get(0).getSinglePartnerId();  
 | 
            platformReport.setUserId(partnterId);  
 | 
            list.add(platformReport);  
 | 
        }  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 当查询数据为空的时候初始化  
 | 
     */  
 | 
    private void initForEmptyList( List<PlatformReport> list,String time,String reportType,String indicatorType){  
 | 
        PlatformReport platformReport=new PlatformReport();  
 | 
        platformReport.setCreateTime(time);  
 | 
        platformReport.setReportType(Convert.toShort(reportType));  
 | 
        platformReport.setIndicator(Convert.toStr(0));  
 | 
        platformReport.setIndicatorType(Convert.toShort(indicatorType));  
 | 
        platformReport.setUserId(Constants.DEFAULT_ID);  
 | 
        list.add(platformReport);  
 | 
    }  
 | 
}  
 |