package com.gyee.generation.service;//package com.gyee.generation.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gyee.common.contant.ContantXk;
import com.gyee.common.model.PointData;
import com.gyee.common.model.StringUtils;
import com.gyee.generation.init.CacheContext;
import com.gyee.generation.model.auto.*;
import com.gyee.generation.model.vo.CompanyType;
import com.gyee.generation.model.vo.Location;
import com.gyee.generation.model.vo.WpType;
import com.gyee.generation.service.auto.IProEconPowerstationInfoDay5Service;
import com.gyee.generation.util.DateUtils;
import com.gyee.generation.util.realtimesource.IEdosUtil;
import com.gyee.generation.util.statisticcs.Initial;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class WindPowerInfo5Service {

    //    private static final Logger logger = LoggerFactory.getLogger(WindPowerInfo1Service.class);
    @Resource
    private IEdosUtil edosUtil;

    @Resource
    private IProEconPowerstationInfoDay5Service proEconPowerstationInfoDay5Service;


    /**
     * 计算区域日信息
     */
    public void calRegionInfoDay(Date recordDate) {

        Calendar c = Calendar.getInstance();
        c.setTime(recordDate);
        if (c.get(Calendar.HOUR_OF_DAY) == 0 && c.get(Calendar.MINUTE) == 0) {
            c.add(Calendar.DAY_OF_MONTH, -1);
        }


        recordDate = DateUtils.truncate(c.getTime());


        QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("record_date", DateUtils.truncate(recordDate)).eq("location", Location.cp.getValue());
        List<ProEconPowerstationInfoDay5> wpinfodayls = proEconPowerstationInfoDay5Service.list(queryWrapper);

        if (!wpinfodayls.isEmpty()) {

            Map<String, Map<String, List<ProEconPowerstationInfoDay5>>> rgmap = new HashMap<>();


            for (ProEconPowerstationInfoDay5 wpinfo : wpinfodayls) {

                if (rgmap.containsKey(wpinfo.getRegionId())) {
                    Map<String, List<ProEconPowerstationInfoDay5>> map = rgmap.get(wpinfo.getRegionId());
                    List<ProEconPowerstationInfoDay5> qbls = map.get(CompanyType.qb.id);
                    List<ProEconPowerstationInfoDay5> fdls = map.get(CompanyType.fd.id);
                    List<ProEconPowerstationInfoDay5> gfls = map.get(CompanyType.gf.id);

                    if (wpinfo.getForeignKeyId().contains("-1")) {
                        fdls.add(wpinfo);
                    } else if (wpinfo.getForeignKeyId().contains("-2")) {
                        gfls.add(wpinfo);
                    } else if (wpinfo.getForeignKeyId().contains("0")) {
                        qbls.add(wpinfo);
                    }

                } else {
                    Map<String, List<ProEconPowerstationInfoDay5>> map = new HashMap<>();

                    List<ProEconPowerstationInfoDay5> qbls = new ArrayList<>();
                    List<ProEconPowerstationInfoDay5> fdls = new ArrayList<>();
                    List<ProEconPowerstationInfoDay5> gfls = new ArrayList<>();

                    if (wpinfo.getForeignKeyId().contains("-1")) {
                        fdls.add(wpinfo);
                    } else if (wpinfo.getForeignKeyId().contains("-2")) {
                        gfls.add(wpinfo);
                    } else if (wpinfo.getForeignKeyId().contains("0")) {
                        qbls.add(wpinfo);
                    }
                    map.put(CompanyType.qb.id, qbls);
                    map.put(CompanyType.fd.id, fdls);
                    map.put(CompanyType.gf.id, gfls);
                    rgmap.put(wpinfo.getRegionId(), map);
                }
            }


            //判断是否有重复记录，先删除重复记录
            QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper2 = new QueryWrapper<>();
            queryWrapper2.eq("record_date", DateUtils.truncate(recordDate)).eq("location", Location.rg.getValue());
            List<String> idls = proEconPowerstationInfoDay5Service.list(queryWrapper2).stream()
                    //                    .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(recordDate)) == 0
                    ////                            && CacheContext.wpmap.containsKey(i.getWindpowerstationId())
                    //                            && i.getLocation().equals(Location.rg.getValue()))
                    .map(ProEconPowerstationInfoDay5::getId)
                    .collect(Collectors.toList());

            if (idls.size() > 0) {

                proEconPowerstationInfoDay5Service.removeByIds(idls);

            }
            for (Map.Entry<String, Map<String, List<ProEconPowerstationInfoDay5>>> entry : rgmap.entrySet()) {
                Map<String, List<ProEconPowerstationInfoDay5>> map = entry.getValue();
                List<ProEconPowerstationInfoDay5> qbls = map.get(CompanyType.qb.id);
                List<ProEconPowerstationInfoDay5> fdls = map.get(CompanyType.fd.id);
                List<ProEconPowerstationInfoDay5> gfls = map.get(CompanyType.gf.id);
                //                if(CacheContext.cpwpmap.size()==qbls.size())
                //                {

                ProEconPowerstationInfoDay5 qb = new ProEconPowerstationInfoDay5();
                ProEconPowerstationInfoDay5 fd = new ProEconPowerstationInfoDay5();
                ProEconPowerstationInfoDay5 gf = new ProEconPowerstationInfoDay5();

                if (CacheContext.rgmap.containsKey(entry.getKey())) {
                    ProBasicRegion cp = CacheContext.rgmap.get(entry.getKey());
                    gf.setRegionId(cp.getId());

                    gf.setRecordDate(DateUtils.truncate(recordDate));
                    gf.setForeignKeyId(cp.getId() + "-2");
                    gf.setLocation(Location.rg.getValue());

                    fd.setRegionId(cp.getId());

                    fd.setRecordDate(DateUtils.truncate(recordDate));
                    fd.setForeignKeyId(cp.getId() + "-1");
                    fd.setLocation(Location.rg.getValue());

                    qb.setRegionId(cp.getId());

                    qb.setRecordDate(DateUtils.truncate(recordDate));
                    qb.setForeignKeyId(cp.getId() + "0");
                    qb.setLocation(Location.rg.getValue());

                    Initial.initial(qb);
                    Initial.initial(fd);
                    Initial.initial(gf);
                    //计算区域级全部
                    calCp(qb, qbls);
                    //计算公司级风电场站
                    calCp(fd, fdls);
                    //计算公司级光电场站
                    calCp(gf, gfls);

                    proEconPowerstationInfoDay5Service.save(qb);
                    proEconPowerstationInfoDay5Service.save(fd);
                    proEconPowerstationInfoDay5Service.save(gf);
                }


                //                }else
                //                {
                //                    logger.debug("公司所属场站数量与保存的场站日信息数量不一致，未进行{0}统计-------结束", entry.getKey());
                //
                //                }


            }
        }

    }

    /**
     * 计算公司日信息
     */
    public void calCompanyInfoDay(Date recordDate) {

        Calendar c = Calendar.getInstance();
        c.setTime(recordDate);
        if (c.get(Calendar.HOUR_OF_DAY) == 0 && c.get(Calendar.MINUTE) == 0) {
            c.add(Calendar.DAY_OF_MONTH, -1);
        }


        recordDate = DateUtils.truncate(c.getTime());


        QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("record_date", DateUtils.truncate(recordDate)).eq("location", Location.wp.getValue());
        List<ProEconPowerstationInfoDay5> wpinfodayls = proEconPowerstationInfoDay5Service.list(queryWrapper);
        //                .stream()
        //                .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(recordDate)) == 0
        ////                        && CacheContext.wpmap.containsKey(i.getWindpowerstationId())
        //                        && i.getLocation().equals(Location.wp.getValue()))
        //                .collect(Collectors.toList());
        if (!wpinfodayls.isEmpty()) {

            Map<String, Map<String, List<ProEconPowerstationInfoDay5>>> cpmap = new HashMap<>();


            for (ProEconPowerstationInfoDay5 wpinfo : wpinfodayls) {

                if (cpmap.containsKey(wpinfo.getCompanyId())) {
                    Map<String, List<ProEconPowerstationInfoDay5>> map = cpmap.get(wpinfo.getCompanyId());
                    List<ProEconPowerstationInfoDay5> qbls = map.get(CompanyType.qb.id);
                    List<ProEconPowerstationInfoDay5> fdls = map.get(CompanyType.fd.id);
                    List<ProEconPowerstationInfoDay5> gfls = map.get(CompanyType.gf.id);

                    if (wpinfo.getWindpowerstationId().contains(WpType.FDC.id)) {
                        fdls.add(wpinfo);
                    } else {
                        gfls.add(wpinfo);
                    }
                    qbls.add(wpinfo);
                } else {
                    Map<String, List<ProEconPowerstationInfoDay5>> map = new HashMap<>();

                    List<ProEconPowerstationInfoDay5> qbls = new ArrayList<>();
                    List<ProEconPowerstationInfoDay5> gfls = new ArrayList<>();
                    List<ProEconPowerstationInfoDay5> fdls = new ArrayList<>();

                    if (wpinfo.getWindpowerstationId().contains(WpType.FDC.id)) {
                        fdls.add(wpinfo);
                    } else {
                        gfls.add(wpinfo);
                    }
                    qbls.add(wpinfo);
                    map.put(CompanyType.qb.id, qbls);
                    map.put(CompanyType.fd.id, fdls);
                    map.put(CompanyType.gf.id, gfls);
                    cpmap.put(wpinfo.getCompanyId(), map);
                }
            }


            //判断是否有重复记录，
            QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper2 = new QueryWrapper<>();
            queryWrapper2.eq("record_date", DateUtils.truncate(recordDate)).eq("location", Location.cp.getValue());
            List<String> idls = proEconPowerstationInfoDay5Service.list(queryWrapper2).stream()
                    //                    .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(recordDate)) == 0
                    ////                            && CacheContext.wpmap.containsKey(i.getWindpowerstationId())
                    //                            && i.getLocation().equals(Location.cp.getValue()))
                    .map(ProEconPowerstationInfoDay5::getId)
                    .collect(Collectors.toList());

            if (idls.size() > 0) {

                proEconPowerstationInfoDay5Service.removeByIds(idls);

            }
            for (Map.Entry<String, Map<String, List<ProEconPowerstationInfoDay5>>> entry : cpmap.entrySet()) {
                Map<String, List<ProEconPowerstationInfoDay5>> map = entry.getValue();
                List<ProEconPowerstationInfoDay5> qbls = map.get(CompanyType.qb.id);
                List<ProEconPowerstationInfoDay5> fdls = map.get(CompanyType.fd.id);
                List<ProEconPowerstationInfoDay5> gfls = map.get(CompanyType.gf.id);
                //                if(CacheContext.cpwpmap.size()==qbls.size())
                //                {

                ProEconPowerstationInfoDay5 qb = new ProEconPowerstationInfoDay5();
                ProEconPowerstationInfoDay5 fd = new ProEconPowerstationInfoDay5();
                ProEconPowerstationInfoDay5 gf = new ProEconPowerstationInfoDay5();

                if (CacheContext.cpmap.containsKey(entry.getKey())) {
                    ProBasicCompany cp = CacheContext.cpmap.get(entry.getKey());
                    gf.setRegionId(cp.getRegionId());
                    gf.setCompanyId(cp.getId());
                    gf.setRecordDate(DateUtils.truncate(recordDate));
                    gf.setForeignKeyId(cp.getId() + "-2");
                    gf.setLocation(Location.cp.getValue());


                    fd.setRegionId(cp.getRegionId());
                    fd.setCompanyId(cp.getId());
                    fd.setRecordDate(DateUtils.truncate(recordDate));
                    fd.setForeignKeyId(cp.getId() + "-1");
                    fd.setLocation(Location.cp.getValue());

                    qb.setRegionId(cp.getRegionId());
                    qb.setCompanyId(cp.getId());
                    qb.setRecordDate(DateUtils.truncate(recordDate));
                    qb.setForeignKeyId(cp.getId() + "0");
                    qb.setLocation(Location.cp.getValue());

                    Initial.initial(qb);
                    Initial.initial(fd);
                    Initial.initial(gf);

                    //计算公司级全部场站
                    calCp(qb, qbls);
                    //计算公司级风电场站
                    calCp(fd, fdls);
                    //计算公司级光电场站
                    calCp(gf, gfls);

                    proEconPowerstationInfoDay5Service.save(qb);
                    proEconPowerstationInfoDay5Service.save(fd);
                    proEconPowerstationInfoDay5Service.save(gf);
                }


                //                }else
                //                {
                //                    logger.debug("公司所属场站数量与保存的场站日信息数量不一致，未进行{0}统计-------结束", entry.getKey());
                //
                //                }


            }
        }

    }

    private void calCp(ProEconPowerstationInfoDay5 pewp, List<ProEconPowerstationInfoDay5> ls) {

        if (!ls.isEmpty()) {


            for (ProEconPowerstationInfoDay5 pepid : ls) {
                //日发电量(升压站)
                pewp.setRfdldb(StringUtils.round(pewp.getRfdldb() + pepid.getRfdldb(), 2));
                //日上网电量
                pewp.setRswdldb(StringUtils.round(pewp.getRswdldb() + pepid.getRswdldb(), 2));
                //日工网购网电量
                pewp.setRgwgwdldb(StringUtils.round(pewp.getRgwgwdldb() + pepid.getRgwgwdldb(), 2));
                //日农网购网电量
                pewp.setRnwgwdldb(StringUtils.round(pewp.getRnwgwdldb() + pepid.getRnwgwdldb(), 2));
                //日综合场用电量(电表)
                pewp.setRzhcydldb(StringUtils.round(pewp.getRzhcydldb() + pepid.getRzhcydldb(), 2));
                //日厂用电量
                pewp.setRfdcydldb(StringUtils.round(pewp.getRfdcydldb() + pepid.getRfdcydldb(), 2));

                //月发电量(升压站)
                pewp.setYfdldb(StringUtils.round(pewp.getYfdldb() + pepid.getYfdldb(), 2));
                //月上网电量
                pewp.setYswdldb(StringUtils.round(pewp.getYswdldb() + pepid.getYswdldb(), 2));
                //月工网购网电量
                pewp.setYgwgwdldb(StringUtils.round(pewp.getYgwgwdldb() + pepid.getYgwgwdldb(), 2));
                //月农网购网电量
                pewp.setYnwgwdldb(StringUtils.round(pewp.getYnwgwdldb() + pepid.getYnwgwdldb(), 2));
                //月综合场用电量(电表)
                pewp.setYzhcydldb(StringUtils.round(pewp.getYzhcydldb() + pepid.getYzhcydldb(), 2));
                //月厂用电量
                pewp.setYfdcydldb(StringUtils.round(pewp.getYfdcydldb() + pepid.getYfdcydldb(), 2));

                //年发电量(升压站)
                pewp.setNfdldb(StringUtils.round(pewp.getNfdldb() + pepid.getNfdldb(), 2));
                //年上网电量
                pewp.setNswdldb(StringUtils.round(pewp.getNswdldb() + pepid.getNswdldb(), 2));
                //年工网购网电量
                pewp.setNgwgwdldb(StringUtils.round(pewp.getNgwgwdldb() + pepid.getNgwgwdldb(), 2));
                //年农网购网电量
                pewp.setNnwgwdldb(StringUtils.round(pewp.getNnwgwdldb() + pepid.getNnwgwdldb(), 2));
                //年综合场用电量(电表)
                pewp.setNzhcydldb(StringUtils.round(pewp.getNzhcydldb() + pepid.getNzhcydldb(), 2));
                //年厂用电量
                pewp.setNfdcydldb(StringUtils.round(pewp.getNfdcydldb() + pepid.getNfdcydldb(), 2));

            }

        }
    }

    /**
     * 计算场站日信息
     */
    public void calWindpowerInfoDay(Date recordDate) throws Exception {
        Calendar c = Calendar.getInstance();
        c.setTime(recordDate);
        if (c.get(Calendar.HOUR_OF_DAY) == 0 && c.get(Calendar.MINUTE) == 0) {
            c.add(Calendar.DAY_OF_MONTH, -1);
        }


        recordDate = DateUtils.truncate(c.getTime());


        List<String> wpls = new ArrayList<>();
        List<ProEconPowerstationInfoDay5> dayls = new ArrayList<>();
        for (ProBasicPowerstation wp : CacheContext.wpls) {
            if (CacheContext.wppointmap.containsKey(wp.getId())) {
                Map<String, ProBasicPowerstationPoint> pointmap = CacheContext.wppointmap.get(wp.getId());

                ProEconPowerstationInfoDay5 pewp = new ProEconPowerstationInfoDay5();
                Initial.initial(pewp);
                pewp.setRegionId(wp.getRegionId());
                pewp.setCompanyId(wp.getCompanyId());
                pewp.setRecordDate(DateUtils.truncate(recordDate));
                pewp.setForeignKeyId(wp.getId());
                pewp.setWindpowerstationId(wp.getId());
                pewp.setLocation(Location.wp.getValue());

                //                //昨日的统计结果
                List<ProEconPowerstationInfoDay5> pepid1ls = new ArrayList<>();
                Calendar cl = Calendar.getInstance();
                cl.setTime(recordDate);
                cl.add(Calendar.DAY_OF_MONTH, -1);
                QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper3 = new QueryWrapper<>();
                queryWrapper3.eq("record_date", DateUtils.truncate(cl.getTime())).eq("location", Location.wp.getValue()).eq("windpowerstation_id", wp.getId());
                pepid1ls = proEconPowerstationInfoDay5Service.list(queryWrapper3);
                //
                //                        .stream()
                //                        .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(cl.getTime())) == 0
                //                                && i.getWindpowerstationId().equals(wp.getId())
                //                                && i.getLocation().equals(Location.wp.getValue()))
                //                        .collect(Collectors.toList());

                ProEconPowerstationInfoDay5 lastday5 = null;
                if (!pepid1ls.isEmpty()) {
                    lastday5 = pepid1ls.get(0);
                }
                extracted(recordDate, pointmap, pewp, lastday5);
                //*******************************************年信息统计*********************************************************/
                //                wpinfodayls.add(pewp);
                dayls.add(pewp);
                // proEconPowerstationInfoDay5Service.save(pewp);

                wpls.add(wp.getId());
            }


        }

        //判断是否有重复记录，先删除重复记录
        QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("record_date", DateUtils.truncate(recordDate))
                .in("windpowerstation_id", wpls)
                .eq("location", Location.wp.getValue());
        List<String> idls = proEconPowerstationInfoDay5Service.list(queryWrapper).stream()
                //                .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(recordDate)) == 0
                //                        && CacheContext.wpmap.containsKey(i.getWindpowerstationId())
                //                        && i.getLocation().equals(Location.wp.getValue()))
                .map(ProEconPowerstationInfoDay5::getId)
                .collect(Collectors.toList());

        if (idls.size() > 0) {

            proEconPowerstationInfoDay5Service.removeByIds(idls);

        }
        List<ProEconPowerstationInfoDay5> templs = new ArrayList<>();
        for (ProEconPowerstationInfoDay5 vo : dayls) {
            templs.add(vo);
            if (templs.size() == 1000) {
                proEconPowerstationInfoDay5Service.saveBatch(templs);
                templs = new ArrayList<>();
            }
        }

        if (!templs.isEmpty()) {
            proEconPowerstationInfoDay5Service.saveBatch(templs);
        }
        //        proEconPowerstationInfoDay5Service.saveBatch(dayls);
    }

    /**
     * 计算项目日信息
     */
    public void calProjectInfoDay(Date recordDate) throws Exception {
        Calendar c = Calendar.getInstance();
        c.setTime(recordDate);
        if (c.get(Calendar.HOUR_OF_DAY) == 0 && c.get(Calendar.MINUTE) == 0) {
            c.add(Calendar.DAY_OF_MONTH, -1);
        }


        recordDate = DateUtils.truncate(c.getTime());
        List<String> pjls = new ArrayList<>();
        List<ProEconPowerstationInfoDay5> dayls = new ArrayList<>();
        for (ProBasicProject pj : CacheContext.pjls) {
            if (CacheContext.propointmap.containsKey(pj.getId())) {
                Map<String, ProBasicPowerstationPoint> pointmap = CacheContext.propointmap.get(pj.getId());

                ProEconPowerstationInfoDay5 pewp = new ProEconPowerstationInfoDay5();
                if (CacheContext.wpmap.containsKey(pj.getWindpowerstationId())) {
                    ProBasicPowerstation wp = CacheContext.wpmap.get(pj.getWindpowerstationId());
                    pewp.setRegionId(wp.getRegionId());
                    pewp.setCompanyId(wp.getCompanyId());
                }
                Initial.initial(pewp);
                pewp.setForeignKeyId(pj.getId());
                pewp.setWindpowerstationId(pj.getWindpowerstationId());
                pewp.setProjectId(pj.getId());
                pewp.setLocation(Location.pj.getValue());
                pewp.setRecordDate(DateUtils.truncate(recordDate));

                //昨日的统计结果
                List<ProEconPowerstationInfoDay5> pepid1ls = new ArrayList<>();
                Calendar cl = Calendar.getInstance();
                cl.setTime(recordDate);
                cl.add(Calendar.DAY_OF_MONTH, -1);
                QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper4 = new QueryWrapper<>();
                queryWrapper4.eq("record_date", DateUtils.truncate(cl.getTime())).eq("location", Location.pj.getValue()).eq("project_id", pj.getId());
                pepid1ls = proEconPowerstationInfoDay5Service.list(queryWrapper4);
                //                        .stream()
                //                        .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(cl.getTime())) == 0
                //                                && i.getProjectId().equals(pj.getId())
                //                                && i.getLocation().equals(Location.pj.getValue()))
                //                        .collect(Collectors.toList());
                ProEconPowerstationInfoDay5 lastday5 = null;
                if (!pepid1ls.isEmpty()) {
                    lastday5 = pepid1ls.get(0);
                }
                extracted(recordDate, pointmap, pewp, lastday5);


                dayls.add(pewp);
                // proEconPowerstationInfoDay5Service.save(pewp);

                pjls.add(pj.getWindpowerstationId());
            }


        }

        //判断是否有重复记录，先删除重复记录
        QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("record_date", DateUtils.truncate(recordDate))
                .in("windpowerstation_id", pjls)
                .eq("location", Location.pj.getValue());
        List<String> idls = proEconPowerstationInfoDay5Service.list(queryWrapper).stream()
                //                .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(recordDate)) == 0
                //                        && CacheContext.pjmap.containsKey(i.getProjectId())
                //                        && i.getLocation().equals(Location.pj.getValue()))
                .map(ProEconPowerstationInfoDay5::getId)
                .collect(Collectors.toList());

        if (idls.size() > 0) {

            proEconPowerstationInfoDay5Service.removeByIds(idls);

        }
        List<ProEconPowerstationInfoDay5> templs = new ArrayList<>();
        for (ProEconPowerstationInfoDay5 vo : dayls) {
            templs.add(vo);
            if (templs.size() == 1000) {
                proEconPowerstationInfoDay5Service.saveBatch(templs);
                templs = new ArrayList<>();
            }
        }

        if (!templs.isEmpty()) {
            proEconPowerstationInfoDay5Service.saveBatch(templs);
        }
        //        proEconPowerstationInfoDay5Service.saveBatch(dayls);
    }

    /**
     * 计算线路日信息
     */
    public void calLineInfoDay(Date recordDate) throws Exception {
        Calendar c = Calendar.getInstance();
        c.setTime(recordDate);
        if (c.get(Calendar.HOUR_OF_DAY) == 0 && c.get(Calendar.MINUTE) == 0) {
            c.add(Calendar.DAY_OF_MONTH, -1);
        }


        recordDate = DateUtils.truncate(c.getTime());
        List<String> lnls = new ArrayList<>();
        List<ProEconPowerstationInfoDay5> dayls = new ArrayList<>();
        for (ProBasicLine ln : CacheContext.lnls) {
            if (CacheContext.linepointmap.containsKey(ln.getId())) {
                Map<String, ProBasicPowerstationPoint> pointmap = CacheContext.linepointmap.get(ln.getId());

                ProEconPowerstationInfoDay5 pewp = new ProEconPowerstationInfoDay5();
                if (CacheContext.pjmap.containsKey(ln.getProjectId())) {
                    ProBasicProject pj = CacheContext.pjmap.get(ln.getProjectId());
                    if (CacheContext.wpmap.containsKey(pj.getWindpowerstationId())) {
                        ProBasicPowerstation wp = CacheContext.wpmap.get(pj.getWindpowerstationId());
                        pewp.setRegionId(wp.getRegionId());
                        pewp.setCompanyId(wp.getCompanyId());
                        pewp.setWindpowerstationId(wp.getId());
                    }

                }
                Initial.initial(pewp);
                pewp.setForeignKeyId(ln.getId());
                pewp.setLineId(ln.getId());
                pewp.setLocation(Location.ln.getValue());
                pewp.setProjectId(ln.getProjectId());
                pewp.setRecordDate(DateUtils.truncate(recordDate));

                //昨日的统计结果

                List<ProEconPowerstationInfoDay5> pepid1ls = new ArrayList<>();
                Calendar cl = Calendar.getInstance();
                cl.setTime(recordDate);
                cl.add(Calendar.DAY_OF_MONTH, -1);
                QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper2 = new QueryWrapper<>();
                queryWrapper2.eq("record_date", DateUtils.truncate(cl.getTime())).eq("location", Location.ln.getValue()).eq("line_id", ln.getId());
                pepid1ls = proEconPowerstationInfoDay5Service.list(queryWrapper2);
                //                        .stream()
                //                        .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(cl.getTime())) == 0
                //                                && i.getLineId().equals(ln.getId())
                //                                && i.getLocation().equals(Location.ln.getValue()))
                //                        .collect(Collectors.toList());
                ProEconPowerstationInfoDay5 lastday5 = null;
                if (!pepid1ls.isEmpty()) {
                    lastday5 = pepid1ls.get(0);
                }

                extracted(recordDate, pointmap, pewp, lastday5);

                dayls.add(pewp);
                // proEconPowerstationInfoDay5Service.save(pewp);

                if (CacheContext.pjmap.containsKey(ln.getProjectId())) {
                    lnls.add(CacheContext.pjmap.get(ln.getProjectId()).getWindpowerstationId());
                }
            }


        }

        //判断是否有重复记录，先删除重复记录
        QueryWrapper<ProEconPowerstationInfoDay5> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("record_date", DateUtils.truncate(recordDate))
                .in("windpowerstation_id", lnls)
                .eq("location", Location.ln.getValue());
        List<String> idls = proEconPowerstationInfoDay5Service.list(queryWrapper).stream()
                //                .filter(i -> i.getRecordDate().compareTo(DateUtils.truncate(recordDate)) == 0
                //                        && CacheContext.lnmap.containsKey(i.getLineId())
                //                        && i.getLocation().equals(Location.ln.getValue()))
                .map(ProEconPowerstationInfoDay5::getId)
                .collect(Collectors.toList());

        if (idls.size() > 0) {

            proEconPowerstationInfoDay5Service.removeByIds(idls);

        }
        List<ProEconPowerstationInfoDay5> templs = new ArrayList<>();
        for (ProEconPowerstationInfoDay5 vo : dayls) {
            templs.add(vo);
            if (templs.size() == 1000) {
                proEconPowerstationInfoDay5Service.saveBatch(templs);
                templs = new ArrayList<>();
            }
        }

        if (!templs.isEmpty()) {
            proEconPowerstationInfoDay5Service.saveBatch(templs);
        }
        //        proEconPowerstationInfoDay5Service.saveBatch(dayls);
    }

    private void extracted(Date recordDate, Map<String, ProBasicPowerstationPoint> pointmap, ProEconPowerstationInfoDay5 pewp, ProEconPowerstationInfoDay5 lastday5) throws Exception {
        //*******************************************日信息统计*********************************************************/

        double rfdlsyz = 0.0;
        double rswdlsyz = 0.0;
        double rgwgwdlsyz = 0.0;
        double rnwgwdlsyz = 0.0;
        if (pointmap.containsKey(ContantXk.RFDLSYZ)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.RFDLSYZ);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            if (StringUtils.notEmp(pointValue)) {
                //日发电量(升压站)
                rfdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setRfdldb(rfdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.RSWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.RSWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            if (StringUtils.notEmp(pointValue)) {
                //日上网电量
                rswdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setRswdldb(rswdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.RGWGWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.RGWGWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            if (StringUtils.notEmp(pointValue)) {
                //日工网购网电量
                rgwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setRgwgwdldb(rgwgwdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.RNWGWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.RNWGWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            if (StringUtils.notEmp(pointValue)) {
                //日农网购网电量
                rnwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setRnwgwdldb(rnwgwdlsyz);

            }
        }

        //日综合场用电量(电表)
        pewp.setRzhcydldb(StringUtils.round(rfdlsyz - rswdlsyz + rgwgwdlsyz + rnwgwdlsyz, 2));


        if (pointmap.containsKey(ContantXk.RCYDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.RCYDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            if (StringUtils.notEmp(pointValue)) {
                //日厂用电量
                pewp.setRfdcydldb(StringUtils.round(pointValue.getPointValueInDouble(), 2));

            }
        }


        //*******************************************日信息统计*********************************************************/

        //*******************************************月信息统计*********************************************************/

        double yfdlsyz = 0.0;
        double yswdlsyz = 0.0;
        double ygwgwdlsyz = 0.0;
        double ynwgwdlsyz = 0.0;
        double ycydl = 0.0;


        if (pointmap.containsKey(ContantXk.YFDLSYZ)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.YFDLSYZ);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //月发电量(升压站)
            //                yfdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setYfdldb(yfdlsyz);
            //
            //            }

            if (StringUtils.notEmp(lastday5)) {
                //月发电量(升压站)
                yfdlsyz = StringUtils.round(lastday5.getYfdldb() + lastday5.getRfdldb(), 2);
                pewp.setYfdldb(yfdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //月发电量(升压站)
                yfdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setYfdldb(yfdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.YSWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.YSWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //月上网电量
            //                yswdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setYswdldb(yswdlsyz);
            //
            //            }
            if (StringUtils.notEmp(lastday5)) {
                //月上网电量
                yswdlsyz = StringUtils.round(lastday5.getYswdldb() + lastday5.getRswdldb(), 2);
                pewp.setYswdldb(yswdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //月上网电量
                yswdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setYswdldb(yswdlsyz);
            }
        }

        if (pointmap.containsKey(ContantXk.YGWGWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.YGWGWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //月工网购网电量
            //                ygwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setYgwgwdldb(ygwgwdlsyz);
            //
            //            }

            if (StringUtils.notEmp(lastday5)) {
                //月工网购网电量
                ygwgwdlsyz = StringUtils.round(lastday5.getYgwgwdldb() + lastday5.getRgwgwdldb(), 2);
                pewp.setYgwgwdldb(ygwgwdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //月工网购网电量
                ygwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setYgwgwdldb(ygwgwdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.YNWGWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.YNWGWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);

            //            if (StringUtils.notEmp(pointValue)) {
            //                //月农网购网电量
            //                ynwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setYnwgwdldb(ynwgwdlsyz);
            //
            //            }
            if (StringUtils.notEmp(lastday5)) {
                //月农网购网电量
                ynwgwdlsyz = StringUtils.round(lastday5.getYnwgwdldb() + lastday5.getRnwgwdldb(), 2);
                pewp.setYnwgwdldb(ynwgwdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //月农网购网电量
                ynwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setYnwgwdldb(ynwgwdlsyz);

            }
        }

        //月综合场用电量(电表)
        pewp.setYzhcydldb(StringUtils.round(yfdlsyz - yswdlsyz + ygwgwdlsyz + ynwgwdlsyz, 2));


        if (pointmap.containsKey(ContantXk.YCYDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.YCYDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //月厂用电量
            //                ycydl=StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setYfdcydldb(ycydl);
            //
            //            }
            if (StringUtils.notEmp(lastday5)) {
                //月厂用电量
                ycydl = StringUtils.round(lastday5.getYfdcydldb() + lastday5.getRfdcydldb(), 2);
                pewp.setYfdcydldb(ycydl);

            } else if (StringUtils.notEmp(pointValue)) {
                //月厂用电量
                ycydl = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setYfdcydldb(ycydl);

            }
        }


        //*******************************************月信息统计*********************************************************/

        //*******************************************年信息统计*********************************************************/
        double nfdlsyz = 0.0;
        double nswdlsyz = 0.0;
        double ngwgwdlsyz = 0.0;
        double nnwgwdlsyz = 0.0;
        double ncydl = 0.0;
        if (pointmap.containsKey(ContantXk.NFDLSYZ)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.NFDLSYZ);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //
            //            if (StringUtils.notEmp(pointValue)) {
            //                //年发电量(升压站)
            //                nfdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setNfdldb(nfdlsyz);
            //
            //            }

            if (StringUtils.notEmp(lastday5)) {
                //年发电量(升压站)
                nfdlsyz = StringUtils.round(lastday5.getNfdldb() + lastday5.getRfdldb(), 2);
                pewp.setNfdldb(nfdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //年发电量(升压站)
                nfdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setNfdldb(nfdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.NSWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.NSWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //年上网电量
            //                nswdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setNswdldb(nswdlsyz);
            //
            //            }
            if (StringUtils.notEmp(lastday5)) {
                //年上网电量
                nswdlsyz = StringUtils.round(lastday5.getNswdldb() + lastday5.getRswdldb(), 2);
                pewp.setNswdldb(nswdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //年上网电量
                nswdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setNswdldb(nswdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.NGWGWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.NGWGWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //年工网购网电量
            //                ngwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setNgwgwdldb(ngwgwdlsyz);
            //
            //            }
            if (StringUtils.notEmp(lastday5)) {
                //年工网购网电量
                ngwgwdlsyz = StringUtils.round(lastday5.getNgwgwdldb() + lastday5.getRgwgwdldb(), 2);
                pewp.setNgwgwdldb(ngwgwdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //年工网购网电量
                ngwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setNgwgwdldb(ngwgwdlsyz);

            }
        }

        if (pointmap.containsKey(ContantXk.NNWGWDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.NNWGWDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //年农网购网电量
            //                nnwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
            //                pewp.setNnwgwdldb(nnwgwdlsyz);
            //
            //            }
            if (StringUtils.notEmp(lastday5)) {
                //年农网购网电量
                nnwgwdlsyz = StringUtils.round(lastday5.getNnwgwdldb() + lastday5.getRnwgwdldb(), 2);
                pewp.setNnwgwdldb(nnwgwdlsyz);

            } else if (StringUtils.notEmp(pointValue)) {
                //年农网购网电量
                nnwgwdlsyz = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setNnwgwdldb(nnwgwdlsyz);

            }
        }

        //年综合场用电量(电表)
        pewp.setNzhcydldb(StringUtils.round(nfdlsyz - nswdlsyz + ngwgwdlsyz + nnwgwdlsyz, 2));


        if (pointmap.containsKey(ContantXk.NCYDL)) {
            ProBasicPowerstationPoint point = pointmap.get(ContantXk.NCYDL);
            PointData pointValue = edosUtil.getHistMatrix(point.getNemCode(), recordDate.getTime() / 1000);
            //            if (StringUtils.notEmp(pointValue)) {
            //                //年厂用电量
            //                pewp.setNfdcydldb(StringUtils.round(pointValue.getPointValueInDouble(), 2));
            //
            //            }
            if (StringUtils.notEmp(lastday5)) {
                //年厂用电量
                ncydl = StringUtils.round(lastday5.getNfdcydldb() + lastday5.getRfdcydldb(), 2);
                pewp.setNfdcydldb(ncydl);

            } else if (StringUtils.notEmp(pointValue)) {
                //年厂用电量
                ncydl = StringUtils.round(pointValue.getPointValueInDouble(), 2);
                pewp.setNfdcydldb(ncydl);

            }
        }
    }


}







