//package com.njcn.advance.handler;
//
//import cn.hutool.core.collection.CollUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.njcn.advance.mapper.RmpEventAdvanceMapper;
//import com.njcn.advance.pojo.dto.waveAnalysis.AnalyWave;
//import com.njcn.advance.pojo.dto.waveAnalysis.AnalyWaveModel;
//import com.njcn.advance.pojo.dto.waveAnalysis.CauseStruct;
//import com.njcn.advance.pojo.dto.waveAnalysis.Rect;
//import com.njcn.advance.utils.JnaCallBalance;
//import com.njcn.advance.utils.JnaCallDllOrSo;
//import com.njcn.common.pojo.exception.BusinessException;
//import com.njcn.event.api.RmpEventDetailFeignClient;
//import com.njcn.event.pojo.po.RmpEventDetailPO;
//import com.njcn.middle.rocket.domain.BaseMessage;
//import com.njcn.middle.rocket.handler.EnhanceConsumerMessageHandler;
//import com.njcn.mq.constant.BusinessTopic;
//import com.njcn.mq.message.AppEventMessage;
//import com.njcn.mq.message.RmpEventDetailMessage;
//import com.njcn.mq.template.RmpEventDetailMessageTemplate;
//import com.njcn.system.api.DicDataFeignClient;
//import com.njcn.system.enums.DicDataTypeEnum;
//import com.njcn.system.pojo.po.DictData;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
//import org.apache.rocketmq.spring.core.RocketMQListener;
//import org.springframework.messaging.Message;
//import org.springframework.stereotype.Component;
//import org.springframework.stereotype.Service;
//
//import java.time.ZoneId;
//import java.util.*;
//import java.util.function.Function;
//import java.util.stream.Collectors;
//
///**
// * pqs
// *
// * @author cdf
// * @date 2023/8/24
// */
//@RocketMQMessageListener(topic = BusinessTopic.RMP_EVENT_DETAIL_TOPIC,
//        consumerGroup = BusinessTopic.RMP_EVENT_DETAIL_TOPIC,
//        enableMsgTrace = true)
//@Slf4j
//@Service
//@RequiredArgsConstructor
//public class RmpEventDetailConsumer extends EnhanceConsumerMessageHandler<RmpEventDetailMessage> implements RocketMQListener<RmpEventDetailMessage> {
//    //波形最大值计算
//    private final int MAXLENGTH = 128 * 3000;
//
//    private final RmpEventAdvanceMapper rmpEventAdvanceMapper;
//
//    private final DicDataFeignClient dicDataFeignClient;
//
//
//
//    @Override
//    protected void handleMessage(RmpEventDetailMessage rmpEventDetailMessage) throws Exception {
//        System.out.println("6666666666666666");
//      /*  if(Objects.nonNull(rmpEventDetailMessage)){
//            List<String> eventIds = rmpEventDetailMessage.getEventIds();
//            if(CollUtil.isNotEmpty(eventIds)){
//                LambdaQueryWrapper<RmpEventDetailPO> queryWrapper = new LambdaQueryWrapper<>();
//                queryWrapper.in(RmpEventDetailPO::getEventId,eventIds);
//                List<RmpEventDetailPO> rmpEventDetailPOList = rmpEventAdvanceMapper.selectList(queryWrapper);
//
//                        for(RmpEventDetailPO rmpEventDetailPO : rmpEventDetailPOList){
//                            if(rmpEventDetailPO.getDealFlag() != 1){
//                                //调用算法文件计算暂降特征值
//
//                                if(rmpEventDetailPO.getFileFlag() == 1){
//                                    //存在录波
//                                    JnaCallDllOrSo jnaCallDllOrSo = new JnaCallBalance("qvvr_dll");
//                                    jnaCallDllOrSo.setPath();
//                                    // 计算暂降类
//                                    Rect rect = new Rect();
//                                    CauseStruct causeStruct = new CauseStruct();
//
//                                    JnaCallBalance.Eventlibrary INSTANTCE = JnaCallBalance.Eventlibrary.INSTANTCE;
//                                    INSTANTCE.qvvr_fun(rect);
//
//                                    byte[] arr = new byte[1024];
//                                    AnalyWave analyWave = new AnalyWave();
//                                    List<List<Float>> pitchList = analyWave.AnalyseComtradeDat(arr,1);
//                                    for (int i = 0; i < pitchList.size(); i++) {
//                                        rect.smp_va[i] = pitchList.get(i).get(1);
//                                        causeStruct.smp_va[i] = pitchList.get(i).get(1);
//
//                                        rect.smp_vb[i] = pitchList.get(i).get(2);
//                                        causeStruct.smp_vb[i] = pitchList.get(i).get(2);
//
//                                        rect.smp_vc[i] = pitchList.get(i).get(3);
//                                        causeStruct.smp_vc[i] = pitchList.get(i).get(3);
//                                    }
//
//                                    rect.smp_len = pitchList.size();
//                                    //超过60s的波形直接抛异常给上面处理
//                                    if (rect.smp_len >= MAXLENGTH) {
//                                        throw new BusinessException("波形超过60S");
//                                    }
//
//                                    rect.smp_rate = 32;
//
//
//
//
//                                    *//**
//                                     * @判断是否调用成功
//                                     * @成功执行更新pqs_eventdetail操作:更新dq持续时间、暂降类型、暂降原因、总分段数目
//                                     *//*
//                                    if (rect.evt_num > 0) {
//                                        RmpEventDetailPO detail = new RmpEventDetailPO();
//                                        detail.setEventId("rmpEventDetailPOQuery.getEventId()");
//                                        detail.setNum(rect.evt_num);
//                                        detail.setDqTime((double) rect.evt_buf[0].hold_time_dq);
//                                        detail.setFirstType((Integer.toString(rect.evt_buf[0].qvvr_cata_type[0])));
//                                        //detail.setFirstTime(waveData.getFirstTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
//                                        //detail.setFirstMs((double)waveData.getFirstMs());
//
//
//                                        // 排序并获取多段中最小的数据
//                                        float[] f = new float[rect.evt_num];
//
//                                        for (int i = 0; i < rect.evt_num; i++) {
//                                            Arrays.parallelSort(rect.evt_buf[i].u3_min, 0, Math.max(rect.evt_buf[i].u_min_num - 1, 0));
//                                            f[i] = rect.evt_buf[i].u3_min[0];
//                                        }
//
//                                        float min = f[0];
//                                        int index = 0;
//
//                                        for (int len = 1; len < f.length; len++) {
//                                            if (min - f[len] > 0) {
//                                                index = len;
//                                                min = f[len];
//                                            }
//                                        }
//
//                                        *//********************************************************************
//                                         * add by sw 返回的分段位置需根据采样率进行恢复
//                                         ********************************************************************//*
//                                        List<AnalyWaveModel.tagOneRate> list = waveData.getRatesCfg().OneRate;
//                                        int rate = (int) waveData.getnOneWaveNum();
//                                        int k = 0;
//                                        int l = 0;
//
//                                        for (int i = 0; i < list.size(); i++) {
//                                            if (i == 0) {
//                                                for (int j = 0; j < rect.evt_buf[0].SEG_T_num; j++) {
//                                                    if (list.get(i).nOneSample >= rate && rect.evt_buf[0].SEG_T_idx[j] < list.get(i).nSampleNum
//                                                            / (list.get(i).nOneSample / rate)) {
//                                                        rect.evt_buf[0].SEG_T_idx[j] = (int) (rect.evt_buf[0].SEG_T_idx[j]
//                                                                * (list.get(i).nOneSample / rate));
//                                                        k++;
//                                                    }
//                                                }
//
//                                                for (int j = 0; j < rect.evt_buf[0].u_min_num; j++) {
//                                                    if (list.get(i).nOneSample >= rate && rect.evt_buf[0].order_min_idx[j] < list.get(i).nSampleNum
//                                                            / (list.get(i).nOneSample / rate)) {
//                                                        rect.evt_buf[0].order_min_idx[j] = (int) (rect.evt_buf[0].order_min_idx[j]
//                                                                * (list.get(i).nOneSample / rate));
//                                                        l++;
//                                                    }
//                                                }
//                                            } else {
//                                                for (int j = k; j < rect.evt_buf[0].SEG_T_num; j++) {
//                                                    int posb = 0;
//                                                    int pose = 0;
//                                                    int pos = 0;
//
//                                                    for (int kk = 0; kk <= i; kk++) {
//                                                        pose += list.get(kk).nSampleNum / list.get(kk).nOneSample * rate;
//
//                                                        if (kk < i) {
//                                                            posb += list.get(kk).nSampleNum / list.get(kk).nOneSample * rate;
//                                                            pos += list.get(kk).nSampleNum;
//                                                        }
//                                                    }
//
//                                                    if (list.get(i).nOneSample >= rate
//                                                            && rect.evt_buf[0].SEG_T_idx[j] > posb
//                                                            && rect.evt_buf[0].SEG_T_idx[j] < pose) {
//                                                        rect.evt_buf[0].SEG_T_idx[j] = (int) ((rect.evt_buf[0].SEG_T_idx[j] - posb) * list.get(i).nOneSample / rate) + pos;
//                                                        k++;
//                                                    }
//                                                }
//
//                                                for (int j = l; j < rect.evt_buf[0].u_min_num; j++) {
//                                                    int posb = 0;
//                                                    int pose = 0;
//                                                    int pos = 0;
//
//                                                    for (int kk = 0; kk <= i; kk++) {
//                                                        pose += list.get(kk).nSampleNum / list.get(kk).nOneSample * rate;
//
//                                                        if (kk < i) {
//                                                            posb += list.get(kk).nSampleNum / list.get(kk).nOneSample * rate;
//                                                            pos += list.get(kk).nSampleNum;
//                                                        }
//                                                    }
//
//                                                    if (list.get(i).nOneSample >= rate
//                                                            && rect.evt_buf[0].order_min_idx[j] > posb
//                                                            && rect.evt_buf[0].order_min_idx[j] < pose) {
//                                                        rect.evt_buf[0].order_min_idx[j] = (int) ((rect.evt_buf[0].order_min_idx[j] - posb) * list.get(i).nSampleNum / rate) + pos;
//                                                        l++;
//                                                    }
//                                                }
//                                            }
//                                        }
//
//
//                                        List<DictData> dicDataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.EVENT_TYPE.getCode()).getData();
//                                        Map<Integer, DictData> eventTypeMap = dicDataList.stream().collect(Collectors.toMap(DictData::getAlgoDescribe, Function.identity()));
//
//                                        Integer tem = rect.evt_buf[index].qvvr_cata_type[0];
//                                        if(eventTypeMap.containsKey(tem)) {
//                                            rmpEventDetailPO.setAdvanceType(eventTypeMap.get(tem).getId());
//                                        }
//                                        rmpEventDetailPO.setDealFlag(1);
//                                        //rmpEventAdvanceMapper.updateById(rmpEventDetailPO);
//                                        //setEntityAdvanceData();
//                                        //WriteData2File();
//                                        //eventDetailMapper.updateDealFlag(1, eventIndex); //计算有结果
//                                    } else if (rect.evt_num == 0) {
//                                        //eventDetailMapper.updateDealFlag(2, eventIndex);//已计算无结果
//                                    }
//
//                                }
//
//
//                                //TODO 如果不存在录波文件情况
//                                //如果不存在录波文件情况
//                            }
//                        }
//            }
//        }*/
//
//
//    }
//
//    @Override
//    protected void handleMaxRetriesExceeded(RmpEventDetailMessage rmpEventDetailMessage) {
//
//    }
//
//    @Override
//    protected boolean isRetry() {
//        return false;
//    }
//
//    @Override
//    protected boolean throwException() {
//        return false;
//    }
//
//    @Override
//    public void onMessage(RmpEventDetailMessage rmpEventDetailMessage) {
//        super.dispatchMessage(rmpEventDetailMessage);
//    }
//
//    /*********************************
//     * 获取最小采样率方法
//     * @param OneRate  cfg中关于采样率参数
//     * @return 返回最小采样率
//     **********************************/
//    private long MinWaveSample(List<AnalyWaveModel.tagOneRate> OneRate) {
//        long nMinOneSample = OneRate.get(0).nOneSample;
//        for (int i = 0; i < OneRate.size(); i++) {
//            if (OneRate.get(i).nOneSample >= 32) {
//                if (nMinOneSample > OneRate.get(i).nOneSample) {
//                    nMinOneSample = OneRate.get(i).nOneSample;
//                }
//            }
//        }
//        return nMinOneSample;
//    }
//}
