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.ProBasicEquipment;
import com.gyee.generation.model.auto.ProBasicEquipmentPoint;
import com.gyee.generation.model.auto.ProEconEquipmentInfoDay2;
import com.gyee.generation.service.auto.IProEconEquipmentInfoDay2Service;
import com.gyee.generation.task.thread.EquipmentInfo2Thread;
import com.gyee.generation.util.DateUtils;
import com.gyee.generation.util.realtimesource.IEdosUtil;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;

@Service
public class EquipmentInfo2Service {

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

    @Resource
    private IProEconEquipmentInfoDay2Service proEconEquipmentInfoDay2Service;

    @Resource
    @Qualifier("applicationTaskExecutor")
    private Executor executor;

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

        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 59);
        c.set(Calendar.SECOND, 59);
        Date end = c.getTime();

        Date begin = DateUtils.truncate(c.getTime());

        //        //判断是否有重复记录，先删除重复记录
        //        QueryWrapper<ProEconEquipmentInfoDay2> queryWrapper = new QueryWrapper<>();
        //        queryWrapper.eq("record_date",recordDate);
        //        List<String> idls = proEconEquipmentInfoDay2Service.list(queryWrapper).stream().map(ProEconEquipmentInfoDay2::getId)
        //                .collect(Collectors.toList());
        //
        //        List<String> tempids=new ArrayList<>();
        //
        //        for(int i=0;i<idls.size();i++)
        //        {
        //            tempids.add(idls.get(i));
        //            if(tempids.size()==1000)
        //            {
        //                proEconEquipmentInfoDay2Service.removeByIds(tempids);
        //                tempids=new ArrayList<>();
        //            }
        //        }
        //
        //        if(!tempids.isEmpty())
        //        {
        //            proEconEquipmentInfoDay2Service.removeByIds(tempids);
        //        }

        Map<String, ProEconEquipmentInfoDay2> pep2map = new ConcurrentHashMap<>();
        Calendar cl = Calendar.getInstance();
        cl.setTime(recordDate);
        //
        if (cl.get(Calendar.DAY_OF_MONTH) != 1) {
            cl.add(Calendar.DAY_OF_MONTH, -1);
            QueryWrapper<ProEconEquipmentInfoDay2> queryWrapper2 = new QueryWrapper<>();
            queryWrapper2.eq("record_date", cl.getTime());
            List<ProEconEquipmentInfoDay2> pep2ls = proEconEquipmentInfoDay2Service.list(queryWrapper2);
            if (!pep2ls.isEmpty()) {
                for (ProEconEquipmentInfoDay2 pep : pep2ls) {
                    pep2map.put(pep.getWindturbineId(), pep);
                }
            }

        }

        List<String> wpls = new ArrayList<>();
        List<ProEconEquipmentInfoDay2> dayls = new CopyOnWriteArrayList<>();
        //        final CountDownLatch latch = new CountDownLatch(CacheContext.wtls.size());
        //        for(ProBasicEquipment wt:CacheContext.wtls)
        //        {
        //            if(!wpls.contains(wt.getWindpowerstationId()))
        //            {
        //                wpls.add(wt.getWindpowerstationId());
        //            }
        //
        //
        //            new Thread(new EquipmentInfo2Thread(executor,  wt,  pep2map,
        //                    recordDate,  end,  begin,dayls,
        //                    edosUtil,latch)).start();
        //        }
        //        latch.await();
        //
        //        for (Map.Entry<String, List<ProBasicEquipment>> entry : CacheContext.wpwtmap.entrySet()) {
        //
        //
        //            final CountDownLatch latch = new CountDownLatch(entry.getValue().size());
        //            for (ProBasicEquipment wt : entry.getValue()) {
        //                if (!wpls.contains(wt.getWindpowerstationId())) {
        //                    wpls.add(wt.getWindpowerstationId());
        //                }
        //
        //                new Thread(new EquipmentInfo2Thread(executor,  wt,  pep2map,
        //                    recordDate,  end,  begin,dayls,
        //                    edosUtil,latch)).start();
        //
        //            }
        //            latch.await();
        //        }
        List<ProBasicEquipment> wttemps = new ArrayList<>();

        for (ProBasicEquipment wt : CacheContext.wtls) {

            if (!wpls.contains(wt.getWindpowerstationId())) {
                wpls.add(wt.getWindpowerstationId());
            }
            wttemps.add(wt);
            if (wttemps.size() == 120) {

                final CountDownLatch latch = new CountDownLatch(120);
                for (ProBasicEquipment wt1 : wttemps) {
                    new Thread(new EquipmentInfo2Thread(executor, wt1, pep2map,
                            recordDate, end, begin, dayls,
                            edosUtil, latch)).start();
                }
                latch.await();
                wttemps = new ArrayList<>();
                Thread.sleep(12);
            }

        }

        if (!wttemps.isEmpty()) {
            final CountDownLatch latch = new CountDownLatch(wttemps.size());
            for (ProBasicEquipment wt1 : wttemps) {
                new Thread(new EquipmentInfo2Thread(executor, wt1, pep2map,
                        recordDate, end, begin, dayls,
                        edosUtil, latch)).start();
            }
            latch.await();
        }

        c = Calendar.getInstance();
        c.setTime(recordDate);


        //判断是否有重复记录，先删除重复记录
        QueryWrapper<ProEconEquipmentInfoDay2> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("record_date", recordDate);
        queryWrapper.in("windpowerstation_id", wpls);
        List<String> idls = proEconEquipmentInfoDay2Service.list(queryWrapper).stream().map(ProEconEquipmentInfoDay2::getId)
                .collect(Collectors.toList());

        List<String> tempids = new ArrayList<>();

        for (int i = 0; i < idls.size(); i++) {
            tempids.add(idls.get(i));
            if (tempids.size() == 1000) {
                proEconEquipmentInfoDay2Service.removeByIds(tempids);
                tempids = new ArrayList<>();
            }
        }

        if (!tempids.isEmpty()) {
            proEconEquipmentInfoDay2Service.removeByIds(tempids);
        }


        List<ProEconEquipmentInfoDay2> templs = new ArrayList<>();
        for (ProEconEquipmentInfoDay2 vo : dayls) {
            if (StringUtils.notEmp(vo) && StringUtils.notEmp(vo.getWindturbineId())) {
                templs.add(vo);
                if (templs.size() == 1000) {
                    proEconEquipmentInfoDay2Service.saveBatch(templs);
                    templs = new ArrayList<>();
                }
            }

        }

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

    private void calDetiall(ProEconEquipmentInfoDay2 pewp, Date end, Date begin, ProBasicEquipment wt, List<ProEconEquipmentInfoDay2> pepidls) throws Exception {
        //        //                0	待机
        //                1	手动停机
        //                2	正常发电
        //                3	发电降出力
        //                4	故障
        //                5	故障受累
        //                6	检修
        //                7	检修受累
        //                8	限电降出力
        //                9	限电停机
        //                10	电网受累
        //                11	环境受累
        //                12	通讯中断
        //                13	设备离线

        double lastState;//上一分钟状态

        double djsc = 0;//待机时长
        double sdtjsc = 0;//手动停机时长
        double zcfdsc = 0;//正常发电时长
        double fdjclsc = 0;//发电降出力时长
        double gzsc = 0;//故障时长
        double gzslsc = 0;//故障受累时长
        double jxsc = 0;//检修时长
        double jxslsc = 0;//检修受累时长
        double xdjclsc = 0;//限电降出力时长
        double xdtjsc = 0;//限电停机时长
        double dwslsc = 0;//电网受累时长
        double hjslsc = 0;//环境受累时长
        double txzdsc = 0;//通讯中断时长
        double sblxsc = 0;//设备离线时长

        Map<String, Map<String, ProBasicEquipmentPoint>> wtpAimap = CacheContext.wtpAimap;


        lastState = -1;//上一分钟状态
        Map<String, ProBasicEquipmentPoint> aimap = wtpAimap.get(wt.getId());

        if (aimap.containsKey(ContantXk.MXZT)) {

            ProBasicEquipmentPoint point = aimap.get(ContantXk.MXZT);
            //按照分钟时间进行统计状态快照值
            List<PointData> pointls = edosUtil.getHistoryDatasSnap(point.getNemCode(), begin.getTime() / 1000, end.getTime() / 1000);
            if (!pointls.isEmpty()) {
                for (PointData po : pointls) {

                    if (po.getPointValueInDouble() == 0) {

                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //待机时长加1分钟
                        djsc++;
                    } else if (po.getPointValueInDouble() == 1) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //手动停机时长加1分钟
                        sdtjsc++;
                    } else if (po.getPointValueInDouble() == 2) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //正常发电时长加1分钟
                        zcfdsc++;
                    } else if (po.getPointValueInDouble() == 3) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //发电降出力时长加1分钟
                        fdjclsc++;
                    } else if (po.getPointValueInDouble() == 4) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //故障时长加1分钟
                        gzsc++;
                    } else if (po.getPointValueInDouble() == 5) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //故障受累时长加1分钟
                        gzslsc++;
                    } else if (po.getPointValueInDouble() == 6) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //检修时长加1分钟
                        jxsc++;
                    } else if (po.getPointValueInDouble() == 7) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //检修受累时长加1分钟
                        jxslsc++;
                    } else if (po.getPointValueInDouble() == 8) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //限电降出力时长加1分钟
                        xdjclsc++;
                    } else if (po.getPointValueInDouble() == 9) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //限电停机时长加1分钟
                        xdtjsc++;
                    } else if (po.getPointValueInDouble() == 10) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //电网受累时长加1分钟
                        dwslsc++;
                    } else if (po.getPointValueInDouble() == 11) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //环境受累时长加1分钟
                        hjslsc++;
                    } else if (po.getPointValueInDouble() == 12) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //通讯中断时长加1分钟
                        txzdsc++;
                    } else if (po.getPointValueInDouble() == 13) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //设备离线时长加1分钟
                        sblxsc++;
                    }

                }


            }

        }

        //日合计故障小时（明细）
        pewp.setRgzxsmx(new BigDecimal(gzsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计场内受累故障小时（明细）
        pewp.setRcnslgzxsmx(new BigDecimal(gzslsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计检修小时（明细）
        pewp.setRjxxsmx(new BigDecimal(jxsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计场内受累检修小时（明细）
        pewp.setRcnsljxxsmx(new BigDecimal(jxslsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计待机小时（明细）
        pewp.setRdjxsmx(new BigDecimal(djsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计缺陷降出力小时（明细）
        pewp.setRqxjclxsmx(new BigDecimal(fdjclsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计手动停机小时（明细）
        pewp.setRsdtjxsmx(new BigDecimal(sdtjsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计性能小时（明细）
        pewp.setRbwxsmx(new BigDecimal(zcfdsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计限电停机小时（明细）
        pewp.setRxdtjxsmx(new BigDecimal(xdtjsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计限电降出力小时（明细）
        pewp.setRxdjclxsmx(new BigDecimal(xdjclsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计场外受累电网小时（明细）
        pewp.setRcwsldwxsmx(new BigDecimal(dwslsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计场外受累电网小时（明细）
        pewp.setRcwsltqxsmx(new BigDecimal(hjslsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计通讯中断小时（明细）
        pewp.setRtxzdxsmx(new BigDecimal(txzdsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计离线小时（明细）
        pewp.setRlxxsmx(new BigDecimal(sblxsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());


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

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

        if (pepidls.isEmpty()) {
            setLossHoursMonth(pewp);

        } else {


            ProEconEquipmentInfoDay2 pepid = pepidls.get(0);

            //月合计故障小时（明细）
            pewp.setYgzxsmx(StringUtils.round(pepid.getYgzxsmx() + pewp.getRgzxsmx(), 2));
            //月合计场内受累故障小时（明细）
            pewp.setYcnslgzxsmx(StringUtils.round(pepid.getYcnslgzxsmx() + pewp.getRcnslgzxsmx(), 2));
            //月合计检修小时（明细）
            pewp.setYjxxsmx(StringUtils.round(pepid.getYjxxsmx() + pewp.getRjxxsmx(), 2));
            //月合计场内受累检修小时（明细）
            pewp.setYcnsljxxsmx(StringUtils.round(pepid.getYcnsljxxsmx() + pewp.getRcnsljxxsmx(), 2));
            //月合计待机小时（明细）
            pewp.setYdjxsmx(StringUtils.round(pepid.getYdjxsmx() + pewp.getRdjxsmx(), 2));
            //月合计缺陷降出力小时（明细）
            pewp.setYqxjclxsmx(StringUtils.round(pepid.getYqxjclxsmx() + pewp.getRqxjclxsmx(), 2));
            //月合计手动停机小时（明细）
            pewp.setYsdtjxsmx(StringUtils.round(pepid.getYsdtjxsmx() + pewp.getRsdtjxsmx(), 2));
            //月合计性能小时（明细）
            pewp.setYbwxsmx(StringUtils.round(pepid.getYbwxsmx() + pewp.getRbwxsmx(), 2));
            //月合计限电停机小时（明细）
            pewp.setYxdtjxsmx(StringUtils.round(pepid.getYxdtjxsmx() + pewp.getRxdtjxsmx(), 2));
            //月合计限电降出力小时（明细）
            pewp.setYxdjclxsmx(StringUtils.round(pepid.getYxdjclxsmx() + pewp.getRxdjclxsmx(), 2));
            //月合计场外受累电网小时（明细）
            pewp.setYcwsldwxsmx(StringUtils.round(pepid.getYcwsldwxsmx() + pewp.getRcwsldwxsmx(), 2));
            //月合计场外受累电网小时（明细）
            pewp.setYcwsltqxsmx(StringUtils.round(pepid.getYcwsltqxsmx() + pewp.getRcwsltqxsmx(), 2));
            //月合计通讯中断小时（明细）
            pewp.setYtxzdxsmx(StringUtils.round(pepid.getYtxzdxsmx() + pewp.getRtxzdxsmx(), 2));
            //月合计离线小时（明细）
            pewp.setYlxxsmx(StringUtils.round(pepid.getYlxxsmx() + pewp.getRlxxsmx(), 2));

        }


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

        //*******************************************年信息统计*********************************************************/
        if (pepidls.isEmpty()) {
            setLossHoursYear(pewp);
        } else {

            ProEconEquipmentInfoDay2 pepid = pepidls.get(0);

            //年合计故障小时（明细）
            pewp.setNgzxsmx(StringUtils.round(pepid.getNgzxsmx() + pewp.getRgzxsmx(), 2));
            //年合计场内受累故障小时（明细）
            pewp.setNcnslgzxsmx(StringUtils.round(pepid.getNcnslgzxsmx() + pewp.getRcnslgzxsmx(), 2));
            //年合计检修小时（明细）
            pewp.setNjxxsmx(StringUtils.round(pepid.getNjxxsmx() + pewp.getRjxxsmx(), 2));
            //年合计场内受累检修小时（明细）
            pewp.setNcnsljxxsmx(StringUtils.round(pepid.getNcnsljxxsmx() + pewp.getRcnsljxxsmx(), 2));
            //年合计待机小时（明细）
            pewp.setNdjxsmx(StringUtils.round(pepid.getNdjxsmx() + pewp.getRdjxsmx(), 2));
            //年合计缺陷降出力小时（明细）
            pewp.setNqxjclxsmx(StringUtils.round(pepid.getNqxjclxsmx() + pewp.getRqxjclxsmx(), 2));
            //年合计手动停机小时（明细）
            pewp.setNsdtjxsmx(StringUtils.round(pepid.getNsdtjxsmx() + pewp.getRsdtjxsmx(), 2));
            //年合计性能小时（明细）
            pewp.setNbwxsmx(StringUtils.round(pepid.getNbwxsmx() + pewp.getRbwxsmx(), 2));
            //年合计限电停机小时（明细）
            pewp.setNxdtjxsmx(StringUtils.round(pepid.getNxdtjxsmx() + pewp.getRxdtjxsmx(), 2));
            //年合计限电降出力小时（明细）
            pewp.setNxdjclxsmx(StringUtils.round(pepid.getNxdjclxsmx() + pewp.getRxdjclxsmx(), 2));
            //年合计场外受累电网小时（明细）
            pewp.setNcwsldwxsmx(StringUtils.round(pepid.getNcwsldwxsmx() + pewp.getRcwsldwxsmx(), 2));
            //年合计场外受累电网小时（明细）
            pewp.setNcwsltqxsmx(StringUtils.round(pepid.getNcwsltqxsmx() + pewp.getRcwsltqxsmx(), 2));
            //年合计通讯中断小时（明细）
            pewp.setNtxzdxsmx(StringUtils.round(pepid.getNtxzdxsmx() + pewp.getRtxzdxsmx(), 2));
            //年合计离线小时（明细）
            pewp.setNlxxsmx(StringUtils.round(pepid.getNlxxsmx() + pewp.getRlxxsmx(), 2));

        }


    }

    private static void setLossHoursYear(ProEconEquipmentInfoDay2 pewp) {
        //年合计故障小时（明细）
        pewp.setNgzxsmx(pewp.getRgzxsmx());
        //年合计场内受累故障小时（明细）
        pewp.setNcnslgzxsmx(pewp.getRcnslgzxsmx());
        //年合计检修小时（明细）
        pewp.setNjxxsmx(pewp.getRjxxsmx());
        //年合计场内受累检修小时（明细）
        pewp.setNcnsljxxsmx(pewp.getRcnsljxxsmx());
        //年合计待机小时（明细）
        pewp.setNdjxsmx(pewp.getRdjxsmx());
        //年合计缺陷降出力小时（明细）
        pewp.setNqxjclxsmx(pewp.getRqxjclxsmx());
        //年合计手动停机小时（明细）
        pewp.setNsdtjxsmx(pewp.getRsdtjxsmx());
        //年合计性能小时（明细）
        pewp.setNbwxsmx(pewp.getRbwxsmx());
        //年合计限电停机小时（明细）
        pewp.setNxdtjxsmx(pewp.getRxdtjxsmx());
        //年合计限电降出力小时（明细）
        pewp.setNxdjclxsmx(pewp.getRxdjclxsmx());
        //年合计场外受累电网小时（明细）
        pewp.setNcwsldwxsmx(pewp.getRcwsldwxsmx());
        //年合计场外受累电网小时（明细）
        pewp.setNcwsltqxsmx(pewp.getRcwsltqxsmx());
        //年合计通讯中断小时（明细）
        pewp.setNtxzdxsmx(pewp.getRtxzdxsmx());
        //年合计离线小时（明细）
        pewp.setNlxxsmx(pewp.getRlxxsmx());
    }

    private static void setLossHoursMonth(ProEconEquipmentInfoDay2 pewp) {
        //月合计故障小时（明细）
        pewp.setYgzxsmx(pewp.getRgzxsmx());
        //月合计场内受累故障小时（明细）
        pewp.setYcnslgzxsmx(pewp.getRcnslgzxsmx());
        //月合计检修小时（明细）
        pewp.setYjxxsmx(pewp.getRjxxsmx());
        //月合计场内受累检修小时（明细）
        pewp.setYcnsljxxsmx(pewp.getRcnsljxxsmx());
        //月合计待机小时（明细）
        pewp.setYdjxsmx(pewp.getRdjxsmx());
        //月合计缺陷降出力小时（明细）
        pewp.setYqxjclxsmx(pewp.getRqxjclxsmx());
        //月合计手动停机小时（明细）
        pewp.setYsdtjxsmx(pewp.getRsdtjxsmx());
        //月合计性能小时（明细）
        pewp.setYbwxsmx(pewp.getRbwxsmx());
        //月合计限电停机小时（明细）
        pewp.setYxdtjxsmx(pewp.getRxdtjxsmx());
        //月合计限电降出力小时（明细）
        pewp.setYxdjclxsmx(pewp.getRxdjclxsmx());
        //月合计场外受累电网小时（明细）
        pewp.setYcwsldwxsmx(pewp.getRcwsldwxsmx());
        //月合计场外受累电网小时（明细）
        pewp.setYcwsltqxsmx(pewp.getRcwsltqxsmx());
        //月合计通讯中断小时（明细）
        pewp.setYtxzdxsmx(pewp.getRtxzdxsmx());
        //月合计离线小时（明细）
        pewp.setYlxxsmx(pewp.getRlxxsmx());
    }


    private static void setLossHoursMonthSimple(ProEconEquipmentInfoDay2 pewp) {
        //月合计待机小时
        pewp.setYdjxs(pewp.getRdjxs());
        //月合计维护停机小时
        pewp.setYjxtjxs(pewp.getRjxtjxs());
        // 月合计故障停机小时
        pewp.setYgztjxs(pewp.getRgztjxs());
        //月合计运行小时
        pewp.setYyxxs(pewp.getRyxxs());
        //月合计限电小时
        pewp.setYxdxs(pewp.getRxdxs());
        //月合计通讯中断小时
        pewp.setYtxzdxs(pewp.getRtxzdxs());
        //月合计受累小时
        pewp.setYslxs(pewp.getRslxs());
    }

    private static void setLossHoursYearSimple(ProEconEquipmentInfoDay2 pewp) {
        //年合计待机小时
        pewp.setNdjxs(pewp.getRdjxs());
        //年合计维护停机小时
        pewp.setNjxtjxs(pewp.getRjxtjxs());
        // 年合计故障小时
        pewp.setNgztjxs(pewp.getRgztjxs());
        //年合计运行小时
        pewp.setNyxxs(pewp.getRyxxs());
        //年合计限电小时
        pewp.setNxdxs(pewp.getRxdxs());
        //年合计通讯中断小时
        pewp.setNtxzdxs(pewp.getRtxzdxs());
        //年合计受累小时
        pewp.setNslxs(pewp.getRslxs());
    }

    private void calSimple(ProEconEquipmentInfoDay2 pewp, Date end, Date begin, ProBasicEquipment wt, List<ProEconEquipmentInfoDay2> pepidls) throws Exception {
        //        0	待机
        //        1	运行
        //        2	故障
        //        3	检修
        //        4	限电
        //        5	受累
        //        6	离线
        //*******************************************日信息统计*********************************************************/

        double lastState = -1;//上一分钟状态


        double djsc = 0;//待机时长
        double zcfdsc = 0;//正常发电时长
        double gzsc = 0;//故障时长
        double jxsc = 0;//检修时长
        double xdtjsc = 0;//限电停机时长
        double slsc = 0;//受累时长
        double txzdsc = 0;//通讯中断时长


        Map<String, Map<String, ProBasicEquipmentPoint>> wtpAimap = CacheContext.wtpAimap;


        Map<String, ProBasicEquipmentPoint> aimap = wtpAimap.get(wt.getId());
        if (aimap.containsKey(ContantXk.SBZT)) {

            ProBasicEquipmentPoint point = aimap.get(ContantXk.SBZT);
            //按照分钟时间进行统计状态快照值
            List<PointData> pointls = edosUtil.getHistoryDatasSnap(point.getNemCode(), begin.getTime() / 1000, end.getTime() / 1000);
            if (!pointls.isEmpty()) {
                for (PointData po : pointls) {

                    if (po.getPointValueInDouble() == 0) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //待机时长加1分钟
                        djsc++;
                    } else if (po.getPointValueInDouble() == 1) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //正常发电时长加1分钟
                        zcfdsc++;
                    } else if (po.getPointValueInDouble() == 2) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //故障时长加1分钟
                        gzsc++;
                    } else if (po.getPointValueInDouble() == 3) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //检修时长加1分钟
                        jxsc++;

                    } else if (po.getPointValueInDouble() == 4) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //限电停机时长加1分钟
                        xdtjsc++;
                    } else if (po.getPointValueInDouble() == 5) {
                        if (lastState != po.getPointValueInDouble()) {

                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }

                        //受累时长加1分钟
                        slsc++;

                    } else if (po.getPointValueInDouble() == 6) {
                        if (lastState != po.getPointValueInDouble()) {
                            //将当前状态保存到上一分钟状态
                            lastState = po.getPointValueInDouble();

                        }
                        //通讯中断时长加1分钟
                        txzdsc++;
                    }

                }

            }


        }


        //日合计待机小时
        pewp.setRdjxs(new BigDecimal(gzsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计维护停机小时
        pewp.setRjxtjxs(new BigDecimal(jxsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        // 日合计待机小时
        pewp.setRdjxs(new BigDecimal(djsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计运行小时
        pewp.setRyxxs(new BigDecimal(zcfdsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计限电小时
        pewp.setRxdxs(new BigDecimal(xdtjsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计通讯中断小时
        pewp.setRtxzdxs(new BigDecimal(txzdsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        //日合计受累小时
        pewp.setRslxs(new BigDecimal(slsc).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());


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

        //*******************************************月信息统计*********************************************************/
        if (pepidls.isEmpty()) {
            setLossHoursMonthSimple(pewp);

        } else {

            ProEconEquipmentInfoDay2 pepid = pepidls.get(0);

            //月合计待机小时
            pewp.setYdjxs(StringUtils.round(pepid.getYdjxs() + pewp.getRdjxs(), 2));
            //月合计维护停机小时
            pewp.setYjxtjxs(StringUtils.round(pepid.getYjxtjxs() + pewp.getRjxtjxs(), 2));
            // 月合计故障小时
            pewp.setYgztjxs(StringUtils.round(pepid.getYgztjxs() + pewp.getRgztjxs(), 2));
            //月合计运行小时
            pewp.setYyxxs(StringUtils.round(pepid.getYyxxs() + pewp.getRyxxs(), 2));
            //月合计限电小时
            pewp.setYxdxs(StringUtils.round(pepid.getYxdxs() + pewp.getRxdxs(), 2));
            //月合计通讯中断小时
            pewp.setYtxzdxs(StringUtils.round(pepid.getYtxzdxs() + pewp.getRtxzdxs(), 2));
            //月合计受累小时
            pewp.setYslxs(StringUtils.round(pepid.getYslxs() + pewp.getRslxs(), 2));

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

        //*******************************************年信息统计*********************************************************/
        if (pepidls.isEmpty()) {
            setLossHoursYearSimple(pewp);

        } else {
            ProEconEquipmentInfoDay2 pepid = pepidls.get(0);

            //年合计待机小时
            pewp.setNdjxs(StringUtils.round(pepid.getNdjxs() + pewp.getRdjxs(), 2));
            //年合计维护停机小时
            pewp.setNjxtjxs(StringUtils.round(pepid.getNjxtjxs() + pewp.getRjxtjxs(), 2));
            // 年合计故障小时
            pewp.setNgztjxs(StringUtils.round(pepid.getNgztjxs() + pewp.getRgztjxs(), 2));
            //年合计运行小时
            pewp.setNyxxs(StringUtils.round(pepid.getNyxxs() + pewp.getRyxxs(), 2));
            //年合计限电小时
            pewp.setNxdxs(StringUtils.round(pepid.getNxdxs() + pewp.getRxdxs(), 2));
            //年合计通讯中断小时
            pewp.setNtxzdxs(StringUtils.round(pepid.getNtxzdxs() + pewp.getRtxzdxs(), 2));
            //年合计受累小时
            pewp.setNslxs(StringUtils.round(pepid.getNslxs() + pewp.getRslxs(), 2));

        }
        //*******************************************年信息统计*********************************************************/
    }


}







