package com.njcn.prepare.harmonic.service.mysql.Impl.area;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.harmonic.pojo.po.RMpTargetWarnDPO;
import com.njcn.prepare.harmonic.mapper.mysql.area.RMpTargetWarnDMapper;
import com.njcn.prepare.harmonic.mapper.mysql.day.RStatDataVDMapper;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.pojo.dto.AlarmDetailDayDTO;
import com.njcn.prepare.harmonic.pojo.dto.RMpTargetWarnDDTO;
import com.njcn.prepare.harmonic.service.mysql.area.RMpTargetWarnDService;
import com.njcn.prepare.harmonic.service.mysql.line.AlarmDetailService;
import com.njcn.prepare.harmonic.utils.PublicUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
 * Description:
 * 接口文档访问地址：http://serverIP:port/swagger-ui.html
 * Date: 2022/12/15  11:00【需求编号】
 *
 * @author clam
 * @version V1.0.0
 */
@Service
@DS("master")
@AllArgsConstructor
@Slf4j
public class RMpTargetWarnDServiceImpl extends MppServiceImpl<RMpTargetWarnDMapper, RMpTargetWarnDPO> implements RMpTargetWarnDService {


    private final AlarmDetailService alarmDetailService;

    private final RStatDataVDMapper rStatDataVDMapper;


    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void alarmDay(CalculatedParam calculatedParam) {
        log.info(LocalDateTime.now()+"===>监测点指标告警日统计算法开始");
        List<String> lineIds = calculatedParam.getIdList();
        //以尺寸100分片,查询数据
        List<List<String>> pendingIds =  ListUtils.partition(lineIds,5);
        for (List<String> pendingId : pendingIds) {
            List<RMpTargetWarnDPO> list = getData(calculatedParam.getDataDate(),pendingId);
            if (CollectionUtil.isNotEmpty(list)){
                this.saveOrUpdateBatchByMultiId(list);
            }
        }
    }

    public List<RMpTargetWarnDPO> getData(String time, List<String> list){
        List<RMpTargetWarnDPO> result = new ArrayList<>();
        List<AlarmDetailDayDTO> rlList = new ArrayList<>(),uclList = new ArrayList<>();
        //基础数据
        String yesterday = PublicUtil.getYesterday(time);
        List<RMpTargetWarnDDTO> todayList = rStatDataVDMapper.getTargetWarnD(time,list);
        List<RMpTargetWarnDDTO> yesterdayList = rStatDataVDMapper.getTargetWarnD(yesterday,list);
        List<RMpTargetWarnDDTO> theDayBeforeYesterday = rStatDataVDMapper.getTargetWarnD(PublicUtil.getYesterday(yesterday),list);
        List<RMpTargetWarnDDTO> threeDaysAgo = rStatDataVDMapper.getTargetWarnD(PublicUtil.getYesterday(PublicUtil.getYesterday(yesterday)),list);
        if (!CollectionUtils.isEmpty(todayList)){
            Map<String,List<RMpTargetWarnDDTO>> map2 = new HashMap<>(),map3 = new HashMap<>(),map4 = new HashMap<>();
            //本年的rm值
            List<AlarmDetailDayDTO> rmList = alarmDetailService.getAvgDiffData(time,list);
            //本年的CL值
            List<AlarmDetailDayDTO> clList = rStatDataVDMapper.getAvgDayData(PublicUtil.getYesterday(time),time,list);
            //本年的RL值
            if (!CollectionUtils.isEmpty(rmList)){
                rlList = rmList.stream().map(item->{
                    AlarmDetailDayDTO alarmDetailDayDTO = new AlarmDetailDayDTO();
                    alarmDetailDayDTO.setLineId(item.getLineId());
                    alarmDetailDayDTO.setVlDev(item.getVlDev()*3.3);
                    alarmDetailDayDTO.setFreqDev(item.getFreqDev()*3.3);
                    alarmDetailDayDTO.setVUnbalance(item.getVUnbalance()*3.3);
                    alarmDetailDayDTO.setVHarmonic(item.getVHarmonic()*3.3);
                    alarmDetailDayDTO.setPlt(item.getPlt()*3.3);
                    alarmDetailDayDTO.setSagTimes(item.getSagTimes()*3.3);
                    alarmDetailDayDTO.setInterruptTimes(item.getInterruptTimes()*3.3);
                    return alarmDetailDayDTO;
                }).collect(Collectors.toList());
            }
            //本年的UCL值
            if (!CollectionUtils.isEmpty(rmList) && !CollectionUtils.isEmpty(clList)){
                uclList = rmList.stream().map(map->clList.stream().filter(m-> Objects.equals(m.getLineId(),map.getLineId())).findFirst().map(m->{
                    AlarmDetailDayDTO alarmDetailDayDTO = new AlarmDetailDayDTO();
                    alarmDetailDayDTO.setLineId(map.getLineId());
                    alarmDetailDayDTO.setVlDev(m.getVlDev()+map.getVlDev()*3);
                    alarmDetailDayDTO.setFreqDev(m.getFreqDev()+map.getFreqDev()*3);
                    alarmDetailDayDTO.setVUnbalance(m.getVUnbalance()+map.getVUnbalance()*3);
                    alarmDetailDayDTO.setVHarmonic(m.getVHarmonic()+map.getVHarmonic()*3);
                    alarmDetailDayDTO.setPlt(m.getPlt()+map.getPlt()*3);
                    alarmDetailDayDTO.setSagTimes(m.getSagTimes()+map.getSagTimes()*3);
                    alarmDetailDayDTO.setInterruptTimes(m.getInterruptTimes()+map.getInterruptTimes()*3);
                    return alarmDetailDayDTO;
                }).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
            }
            //数据处理
            Map<String,List<RMpTargetWarnDDTO>> map1 = todayList.stream().collect(Collectors.groupingBy(RMpTargetWarnDDTO::getLineId));
            if (!CollectionUtils.isEmpty(yesterdayList)){
                map2 = yesterdayList.stream().collect(Collectors.groupingBy(RMpTargetWarnDDTO::getLineId));
            }
            if (!CollectionUtils.isEmpty(theDayBeforeYesterday)){
                map3 = theDayBeforeYesterday.stream().collect(Collectors.groupingBy(RMpTargetWarnDDTO::getLineId));
            }
            if (!CollectionUtils.isEmpty(threeDaysAgo)){
                map4 = threeDaysAgo.stream().collect(Collectors.groupingBy(RMpTargetWarnDDTO::getLineId));
            }
            Map<String,List<AlarmDetailDayDTO>> map5 = rlList.stream().collect(Collectors.groupingBy(AlarmDetailDayDTO::getLineId));
            Map<String,List<AlarmDetailDayDTO>> map6 = uclList.stream().collect(Collectors.groupingBy(AlarmDetailDayDTO::getLineId));
            for (Map.Entry<String, List<RMpTargetWarnDDTO>> entry : map1.entrySet()) {
                RMpTargetWarnDPO rMpTargetWarnDpo = new RMpTargetWarnDPO();
                rMpTargetWarnDpo.setDataDate(entry.getValue().get(0).getTime());
                rMpTargetWarnDpo.setMeasurementPointId(entry.getValue().get(0).getLineId());
                rMpTargetWarnDpo.setIsEffective(entry.getValue().get(0).getIsEffective());
                rMpTargetWarnDpo.setIsHarmonic(entry.getValue().get(0).getIsHarmonic());
                rMpTargetWarnDpo.setIsEvent(entry.getValue().get(0).getIsEvent());
                rMpTargetWarnDpo.setIsWarn(0);
                rMpTargetWarnDpo.setIsVDevWarn(0);
                rMpTargetWarnDpo.setIsFreqWarn(0);
                rMpTargetWarnDpo.setIsUnbalanceWarn(0);
                rMpTargetWarnDpo.setIsVWarn(0);
                rMpTargetWarnDpo.setIsFlickerWarn(0);
                rMpTargetWarnDpo.setIsSagWarn(0);
                rMpTargetWarnDpo.setIsInterruptWarn(0);
                //情况1--》
                if (!CollectionUtils.isEmpty(map2.get(entry.getKey())) && !CollectionUtils.isEmpty(map6.get(entry.getKey()))){
                    //电压偏差告警
                    if (entry.getValue().get(0).getVlDev() > map6.get(entry.getKey()).get(0).getVlDev() && entry.getValue().get(0).getVlDev() > map2.get(entry.getKey()).get(0).getVlDev()){
                        rMpTargetWarnDpo.setIsVDevWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //频率偏差告警
                    if (entry.getValue().get(0).getFreqDev() > map6.get(entry.getKey()).get(0).getFreqDev() && entry.getValue().get(0).getFreqDev() > map2.get(entry.getKey()).get(0).getFreqDev()){
                        rMpTargetWarnDpo.setIsFreqWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //三相电压不平衡告警
                    if (entry.getValue().get(0).getVUnbalance() > map6.get(entry.getKey()).get(0).getVUnbalance() && entry.getValue().get(0).getVUnbalance() > map2.get(entry.getKey()).get(0).getVUnbalance()){
                        rMpTargetWarnDpo.setIsUnbalanceWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //谐波电压告警
                    if (entry.getValue().get(0).getVHarmonic() > map6.get(entry.getKey()).get(0).getVHarmonic() && entry.getValue().get(0).getVHarmonic() > map2.get(entry.getKey()).get(0).getVHarmonic()){
                        rMpTargetWarnDpo.setIsHarmonic(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //长时电压闪变告警
                    if (entry.getValue().get(0).getPlt() > map6.get(entry.getKey()).get(0).getPlt() && entry.getValue().get(0).getPlt() > map2.get(entry.getKey()).get(0).getPlt()){
                        rMpTargetWarnDpo.setIsFlickerWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //电压暂降告警
                    if (entry.getValue().get(0).getSagTimes() > map6.get(entry.getKey()).get(0).getSagTimes() && entry.getValue().get(0).getSagTimes() > map2.get(entry.getKey()).get(0).getSagTimes()){
                        rMpTargetWarnDpo.setIsSagWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //电压短时中断告警
                    if (entry.getValue().get(0).getInterruptTimes() > map6.get(entry.getKey()).get(0).getInterruptTimes() && entry.getValue().get(0).getInterruptTimes() > map2.get(entry.getKey()).get(0).getInterruptTimes()){
                        rMpTargetWarnDpo.setIsInterruptWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                }
                //情况2--》
                if (!CollectionUtils.isEmpty(map2.get(entry.getKey())) && !CollectionUtils.isEmpty(map3.get(entry.getKey())) && !CollectionUtils.isEmpty(map4.get(entry.getKey())) && !CollectionUtils.isEmpty(map5.get(entry.getKey()))){
                    //电压偏差告警
                    if (entry.getValue().get(0).getVlDev() > map2.get(entry.getKey()).get(0).getVlDev() && map2.get(entry.getKey()).get(0).getVlDev() > map3.get(entry.getKey()).get(0).getVlDev() && map3.get(entry.getKey()).get(0).getVlDev() > map4.get(entry.getKey()).get(0).getVlDev() && map4.get(entry.getKey()).get(0).getVlDev() > map5.get(entry.getKey()).get(0).getVlDev()){
                        rMpTargetWarnDpo.setIsVDevWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //频率偏差告警
                    if (entry.getValue().get(0).getFreqDev() > map2.get(entry.getKey()).get(0).getFreqDev() && map2.get(entry.getKey()).get(0).getFreqDev() > map3.get(entry.getKey()).get(0).getFreqDev() && map3.get(entry.getKey()).get(0).getFreqDev() > map4.get(entry.getKey()).get(0).getFreqDev() && map4.get(entry.getKey()).get(0).getFreqDev() > map5.get(entry.getKey()).get(0).getFreqDev()){
                        rMpTargetWarnDpo.setIsFreqWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //三相电压不平衡告警
                    if (entry.getValue().get(0).getVUnbalance() > map2.get(entry.getKey()).get(0).getVUnbalance() && map2.get(entry.getKey()).get(0).getVUnbalance() > map3.get(entry.getKey()).get(0).getVUnbalance() && map3.get(entry.getKey()).get(0).getVUnbalance() > map4.get(entry.getKey()).get(0).getVUnbalance() && map4.get(entry.getKey()).get(0).getVUnbalance() > map5.get(entry.getKey()).get(0).getVUnbalance()){
                        rMpTargetWarnDpo.setIsUnbalanceWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //谐波电压告警
                    if (entry.getValue().get(0).getVHarmonic() > map2.get(entry.getKey()).get(0).getVHarmonic() && map2.get(entry.getKey()).get(0).getVHarmonic() > map3.get(entry.getKey()).get(0).getVHarmonic() && map3.get(entry.getKey()).get(0).getVHarmonic() > map4.get(entry.getKey()).get(0).getVHarmonic() && map4.get(entry.getKey()).get(0).getVHarmonic() > map5.get(entry.getKey()).get(0).getVHarmonic()){
                        rMpTargetWarnDpo.setIsHarmonic(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //长时电压闪变告警
                    if (entry.getValue().get(0).getPlt() > map2.get(entry.getKey()).get(0).getPlt() && map2.get(entry.getKey()).get(0).getPlt() > map3.get(entry.getKey()).get(0).getPlt() && map3.get(entry.getKey()).get(0).getPlt() > map4.get(entry.getKey()).get(0).getPlt() && map4.get(entry.getKey()).get(0).getPlt() > map5.get(entry.getKey()).get(0).getPlt()){
                        rMpTargetWarnDpo.setIsFlickerWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //电压暂降告警
                    if (entry.getValue().get(0).getSagTimes() > map2.get(entry.getKey()).get(0).getSagTimes() && map2.get(entry.getKey()).get(0).getSagTimes() > map3.get(entry.getKey()).get(0).getSagTimes() && map3.get(entry.getKey()).get(0).getSagTimes() > map4.get(entry.getKey()).get(0).getSagTimes() && map4.get(entry.getKey()).get(0).getSagTimes() > map5.get(entry.getKey()).get(0).getSagTimes()){
                        rMpTargetWarnDpo.setIsSagWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                    //电压短时中断告警
                    if (entry.getValue().get(0).getInterruptTimes() > map2.get(entry.getKey()).get(0).getInterruptTimes() && map2.get(entry.getKey()).get(0).getInterruptTimes() > map3.get(entry.getKey()).get(0).getInterruptTimes() && map3.get(entry.getKey()).get(0).getInterruptTimes() > map4.get(entry.getKey()).get(0).getInterruptTimes() && map4.get(entry.getKey()).get(0).getInterruptTimes() > map5.get(entry.getKey()).get(0).getInterruptTimes()){
                        rMpTargetWarnDpo.setIsInterruptWarn(1);
                        rMpTargetWarnDpo.setIsWarn(1);
                    }
                }
                result.add(rMpTargetWarnDpo);
            }
        }
        return result;
    }


}
