whyclxw
2025-05-28 e16302f9d475c7cc4dd18c5abf1a23cb5502e362
src/main/java/com/whyc/service/AlarmDataService.java
@@ -1,10 +1,22 @@
package com.whyc.service;
import com.whyc.pojo.WorkflowAlarm;
import com.whyc.dto.AlarmDaoFactory;
import com.whyc.dto.Response;
import com.whyc.pojo.*;
import com.whyc.util.ActionUtil;
import com.whyc.util.CommonUtil;
import com.whyc.util.MessageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
/**
 * 告警:电池/设备/电源告警的统一接口
@@ -18,6 +30,121 @@
    @Autowired
    private DeviceAlarmDataService deviceAlarmDataService;
    @Autowired
    private DevalarmDataService devAlarmDataService;
    @Autowired
    private PwrdevAlarmService pwrdevAlarmService;
    @Autowired
    @Lazy
    private MSTTSSpeechService service;
    @Autowired
    private AlarmVoiceSetService alarmVoiceSetService;
    public Map<String, Object> getAlarmLevel1ListMap() {
        Long userId = ActionUtil.getUser().getUId();
        String lang = ActionUtil.getLang();
        List<BattalarmData> battAlarmList = battAlarmDataService.getList(userId, 1);
        battAlarmList = battAlarmList.stream().filter(alarm -> alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
        //相同设备id+告警类型的语音,只保留一条
        Map<String, List<BattalarmData>> battAlarmListMap = battAlarmList.stream().collect(Collectors.groupingBy(a -> a.getBattGroupId() + "_" + a.getAlmSignalId()));
        Set<String> keySet = battAlarmListMap.keySet();
        battAlarmList.clear();
        for (String key : keySet) {
            battAlarmList.add(battAlarmListMap.get(key).get(0));
        }
        for (BattalarmData adata : battAlarmList) {
            adata.setAlmSignalIdName(MessageUtils.getMessageSocket(AlarmDaoFactory.getAlarmName(adata.getAlmSignalId()), lang));
            adata.setAlmLevelName(MessageUtils.getMessageSocket(AlarmDaoFactory.getAlarmType(adata.getAlmLevel()), lang));
        }
        List<DevalarmData> devAlarmList = devAlarmDataService.getList(userId,1);
        devAlarmList = devAlarmList.stream().filter(alarm->alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
        //相同设备id+告警类型的语音,只保留一条
        Map<String, List<DevalarmData>> devAlarmListMap = devAlarmList.stream().collect(Collectors.groupingBy(a -> a.getDevId() + "_" + a.getAlmType()));
        Set<String> keySet2 = devAlarmListMap.keySet();
        devAlarmList.clear();
        for (String key:keySet2){
            devAlarmList.add(devAlarmListMap.get(key).get(0));
        }
        List<PwrdevAlarm> powerAlarmList = pwrdevAlarmService.getList(userId,1);
        powerAlarmList = powerAlarmList.stream().filter(alarm->alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
        //相同设备id+告警类型的语音,只保留一条
        Map<String, List<PwrdevAlarm>> powerAlarmListMap = powerAlarmList.stream().collect(Collectors.groupingBy(a -> a.getPowerDeviceId() + "_" + a.getAlmType()));
        Set<String> keySet3 = powerAlarmListMap.keySet();
        powerAlarmList.clear();
        for (String key:keySet3){
            powerAlarmList.add(powerAlarmListMap.get(key).get(0));
        }
        for (PwrdevAlarm p : powerAlarmList) {
            p.setAlarmName(AlarmDaoFactory.getAllAlarmName(p.getAlmType()));
            if (p.getAlmIndex() != 0) {
                p.setAlarmName(p.getAlarmName().replace("N",  p.getAlmIndex() + ""));
            }
        }
        Map<String, Object> map = new HashMap<>();
        map.put("battAlarmList", battAlarmList);
        map.put("devAlarmList", devAlarmList);
        map.put("powerAlarmList", powerAlarmList);
        return map;
    }
    public Map<String, Object> getAlarmLevel1ListMap4Socket(Long userId, HttpSession httpSession) {
        //Long userId = ActionUtil.getUser().getUId();
        String lang = ActionUtil.getLang4Socket(httpSession);
        List<BattalarmData> battAlarmList = battAlarmDataService.getList(userId, 1);
        battAlarmList = battAlarmList.stream().filter(alarm -> alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
        //相同设备id+告警类型的语音,只保留一条
        Map<String, List<BattalarmData>> battAlarmListMap = battAlarmList.stream().collect(Collectors.groupingBy(a -> a.getBattGroupId() + "_" + a.getAlmSignalId()));
        Set<String> keySet = battAlarmListMap.keySet();
        battAlarmList.clear();
        for (String key : keySet) {
            battAlarmList.add(battAlarmListMap.get(key).get(0));
        }
        for (BattalarmData adata : battAlarmList) {
            adata.setAlmSignalIdName(MessageUtils.getMessageSocket(AlarmDaoFactory.getAlarmName(adata.getAlmSignalId()), lang));
            adata.setAlmLevelName(MessageUtils.getMessageSocket(AlarmDaoFactory.getAlarmType(adata.getAlmLevel()), lang));
        }
        List<DevalarmData> devAlarmList = devAlarmDataService.getList(userId,1);
        devAlarmList = devAlarmList.stream().filter(alarm->alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
        //相同设备id+告警类型的语音,只保留一条
        Map<String, List<DevalarmData>> devAlarmListMap = devAlarmList.stream().collect(Collectors.groupingBy(a -> a.getDevId() + "_" + a.getAlmType()));
        Set<String> keySet2 = devAlarmListMap.keySet();
        devAlarmList.clear();
        for (String key:keySet2){
            devAlarmList.add(devAlarmListMap.get(key).get(0));
        }
        List<PwrdevAlarm> powerAlarmList = pwrdevAlarmService.getList(userId,1);
        powerAlarmList = powerAlarmList.stream().filter(alarm->alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
        //相同设备id+告警类型的语音,只保留一条
        Map<String, List<PwrdevAlarm>> powerAlarmListMap = powerAlarmList.stream().collect(Collectors.groupingBy(a -> a.getPowerDeviceId() + "_" + a.getAlmType()));
        Set<String> keySet3 = powerAlarmListMap.keySet();
        powerAlarmList.clear();
        for (String key:keySet3){
            powerAlarmList.add(powerAlarmListMap.get(key).get(0));
        }
        for (PwrdevAlarm p : powerAlarmList) {
            p.setAlarmName(AlarmDaoFactory.getAllAlarmName(p.getAlmType()));
            if (p.getAlmIndex() != 0) {
                p.setAlarmName(p.getAlarmName().replace("N",  p.getAlmIndex() + ""));
            }
        }
        Map<String, Object> map = new HashMap<>();
        map.put("battAlarmList", battAlarmList);
        map.put("devAlarmList", devAlarmList);
        map.put("powerAlarmList", powerAlarmList);
        return map;
    }
    public List<WorkflowAlarm> getAlarmList() {
        List<WorkflowAlarm> battAlarmList =battAlarmDataService.getAlarmList();
@@ -29,4 +156,760 @@
    public void updateWorkFlag(List<WorkflowAlarm> deviceAlarmList) {
    }
    public void saveToWav(String unreadDirPath) {
        Long uId = ActionUtil.getUser().getUId();
        ServletContext application = ActionUtil.getApplication();
        //用户
        Map<String,Object> alarmMap = (Map<String, Object>) application.getAttribute("alarmMap_" + uId);
        Map<String, Object> alarmMapNow = getAlarmLevel1ListMap();
        List<BattalarmData> battAlarmListNow = (List<BattalarmData>) alarmMapNow.get("battAlarmList");
        List<DevalarmData> devAlarmListNow = (List<DevalarmData>) alarmMapNow.get("devAlarmList");
        List<PwrdevAlarm> powerAlarmListNow = (List<PwrdevAlarm>) alarmMapNow.get("powerAlarmList");
        if(alarmMap==null){
            //不存在,插入应用内存
            application.setAttribute("alarmMap_" + uId,alarmMapNow);
            //返回内容格式处理,并存为语音
            formatResultAndSaveToWav(unreadDirPath,battAlarmListNow,devAlarmListNow,powerAlarmListNow);
        }else {
            //获取新增的
            List<BattalarmData> battAlarmList = (List<BattalarmData>) alarmMap.get("battAlarmList");
            List<DevalarmData> devAlarmList = (List<DevalarmData>) alarmMap.get("devAlarmList");
            List<PwrdevAlarm> powerAlarmList = (List<PwrdevAlarm>) alarmMap.get("powerAlarmList");
            List<BattalarmData> battAlarmListAdded = new LinkedList<>();
            List<DevalarmData> devAlarmListAdded = new LinkedList<>();
            List<PwrdevAlarm> powerAlarmListAdded = new LinkedList<>();
            //电池组告警增加
            for (BattalarmData now : battAlarmListNow) {
                long num = now.getNum();
                boolean exist = false;
                for (BattalarmData old : battAlarmList) {
                    if (old.getNum() == num) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    battAlarmListAdded.add(now);
                }
            }
            //设备告警增加
            for (DevalarmData now : devAlarmListNow) {
                long num = now.getNum();
                boolean exist = false;
                for (DevalarmData old : devAlarmList) {
                    if (old.getNum() == num) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    devAlarmListAdded.add(now);
                }
            }
            //电源告警增加
            for (PwrdevAlarm now : powerAlarmListNow) {
                long num = now.getNum();
                boolean exist = false;
                for (PwrdevAlarm old : powerAlarmList) {
                    if (old.getNum() == num) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    powerAlarmListAdded.add(now);
                }
            }
            if (battAlarmListAdded.size() != 0
                    || devAlarmListAdded.size() != 0
                    || powerAlarmListAdded.size() != 0
            ) {
                //有任何变动,更新旧的告警列表
                application.setAttribute("alarmMap_" + uId, alarmMapNow);
            }
            formatResultAndSaveToWav(unreadDirPath,battAlarmListAdded, devAlarmListAdded, powerAlarmListAdded);
        }
    }
    /**
     * 监控用户的告警,包含生成,内存信息更新
     * @param readDirPath
     */
    public void monitorAlarm(String readDirPath) {
        Long uId = ActionUtil.getUser().getUId();
        ServletContext application = ActionUtil.getApplication();
        //用户
        Map<String,Object> alarmMap = (Map<String, Object>) application.getAttribute("alarmMap_" + uId);
        Map<String, Object> alarmMapNow = getAlarmLevel1ListMap();
        List<BattalarmData> battAlarmListNow = (List<BattalarmData>) alarmMapNow.get("battAlarmList");
        List<DevalarmData> devAlarmListNow = (List<DevalarmData>) alarmMapNow.get("devAlarmList");
        List<PwrdevAlarm> powerAlarmListNow = (List<PwrdevAlarm>) alarmMapNow.get("powerAlarmList");
        //语音生成
        if(alarmMap==null){
            //不存在,插入应用内存
            application.setAttribute("alarmMap_" + uId,alarmMapNow);
            //返回内容格式处理,并存为语音
            formatResultAndSaveToWav(readDirPath,battAlarmListNow,devAlarmListNow,powerAlarmListNow);
        }else {
            //获取新增的
            List<BattalarmData> battAlarmList = (List<BattalarmData>) alarmMap.get("battAlarmList");
            List<DevalarmData> devAlarmList = (List<DevalarmData>) alarmMap.get("devAlarmList");
            List<PwrdevAlarm> powerAlarmList = (List<PwrdevAlarm>) alarmMap.get("powerAlarmList");
            List<BattalarmData> battAlarmListAdded = new LinkedList<>();
            List<DevalarmData> devAlarmListAdded = new LinkedList<>();
            List<PwrdevAlarm> powerAlarmListAdded = new LinkedList<>();
            //电池组告警增加 (电池组id+告警类型)
            for (BattalarmData now : battAlarmListNow) {
                long battGroupId = now.getBattGroupId();
                Integer almSignalId = now.getAlmSignalId();
                boolean exist = false;
                for (BattalarmData old : battAlarmList) {
                    if (old.getBattGroupId() == battGroupId && old.getAlmSignalId().equals(almSignalId)) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    battAlarmListAdded.add(now);
                }
            }
            //设备告警增加 (设备id+告警类型)
            for (DevalarmData now : devAlarmListNow) {
                Integer devId = now.getDevId();
                Integer almType = now.getAlmType();
                boolean exist = false;
                for (DevalarmData old : devAlarmList) {
                    if (old.getDevId().equals(devId) && old.getAlmType().equals(almType)) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    devAlarmListAdded.add(now);
                }
            }
            //电源告警增加 (电源设备id+告警类型)
            for (PwrdevAlarm now : powerAlarmListNow) {
                Long powerDeviceId = now.getPowerDeviceId();
                Integer almType = now.getAlmType();
                boolean exist = false;
                for (PwrdevAlarm old : powerAlarmList) {
                    if (old.getPowerDeviceId().equals(powerDeviceId) && old.getAlmType().equals(almType)) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    powerAlarmListAdded.add(now);
                }
            }
            if (battAlarmListAdded.size() != 0
                    || devAlarmListAdded.size() != 0
                    || powerAlarmListAdded.size() != 0
            ) {
                //有任何变动,更新旧的告警列表
                application.setAttribute("alarmMap_" + uId, alarmMapNow);
            }
            formatResultAndSaveToWav(readDirPath,battAlarmListAdded, devAlarmListAdded, powerAlarmListAdded);
        }
    }
    /**
     * 监控用户的告警,包含生成,内存信息更新
     *
     * @param readDirPath
     * @param application
     * @param httpSession
     */
    public void monitorAlarm4Socket(String readDirPath, Long uId, ServletContext application, HttpSession httpSession) {
        //获取ServletContext
        //用户
        Map<String,Object> alarmMap = (Map<String, Object>) application.getAttribute("alarmMap_" + uId);
        Map<String, Object> alarmMapNow = getAlarmLevel1ListMap4Socket(uId,httpSession);
        List<BattalarmData> battAlarmListNow = (List<BattalarmData>) alarmMapNow.get("battAlarmList");
        List<DevalarmData> devAlarmListNow = (List<DevalarmData>) alarmMapNow.get("devAlarmList");
        List<PwrdevAlarm> powerAlarmListNow = (List<PwrdevAlarm>) alarmMapNow.get("powerAlarmList");
        //语音生成
        if(alarmMap==null){
            //不存在,插入应用内存
            application.setAttribute("alarmMap_" + uId,alarmMapNow);
            //返回内容格式处理,并存为语音
            formatResultAndSaveToWav(readDirPath,battAlarmListNow,devAlarmListNow,powerAlarmListNow);
        }else {
            //获取新增的
            List<BattalarmData> battAlarmList = (List<BattalarmData>) alarmMap.get("battAlarmList");
            List<DevalarmData> devAlarmList = (List<DevalarmData>) alarmMap.get("devAlarmList");
            List<PwrdevAlarm> powerAlarmList = (List<PwrdevAlarm>) alarmMap.get("powerAlarmList");
            List<BattalarmData> battAlarmListAdded = new LinkedList<>();
            List<DevalarmData> devAlarmListAdded = new LinkedList<>();
            List<PwrdevAlarm> powerAlarmListAdded = new LinkedList<>();
            //电池组告警增加 (电池组id+告警类型)
            for (BattalarmData now : battAlarmListNow) {
                long battGroupId = now.getBattGroupId();
                Integer almSignalId = now.getAlmSignalId();
                boolean exist = false;
                for (BattalarmData old : battAlarmList) {
                    if (old.getBattGroupId() == battGroupId && old.getAlmSignalId().equals(almSignalId)) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    battAlarmListAdded.add(now);
                }
            }
            //设备告警增加 (设备id+告警类型)
            for (DevalarmData now : devAlarmListNow) {
                Integer devId = now.getDevId();
                Integer almType = now.getAlmType();
                boolean exist = false;
                for (DevalarmData old : devAlarmList) {
                    if (old.getDevId().equals(devId) && old.getAlmType().equals(almType)) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    devAlarmListAdded.add(now);
                }
            }
            //电源告警增加 (电源设备id+告警类型)
            for (PwrdevAlarm now : powerAlarmListNow) {
                Long powerDeviceId = now.getPowerDeviceId();
                Integer almType = now.getAlmType();
                boolean exist = false;
                for (PwrdevAlarm old : powerAlarmList) {
                    if (old.getPowerDeviceId().equals(powerDeviceId) && old.getAlmType().equals(almType)) {
                        exist = true;
                        break;
                    }
                }
                if (!exist) {
                    powerAlarmListAdded.add(now);
                }
            }
            if (battAlarmListAdded.size() != 0
                    || devAlarmListAdded.size() != 0
                    || powerAlarmListAdded.size() != 0
            ) {
                //有任何变动,更新旧的告警列表
                application.setAttribute("alarmMap_" + uId, alarmMapNow);
            }
            formatResultAndSaveToWav4Socket(readDirPath,battAlarmListAdded, devAlarmListAdded, powerAlarmListAdded,uId);
        }
    }
    /**
     * 分为
     * 电池告警信息: xx机房xx电池组xx单体在xx时间发生xx告警
     * 设备告警信息: xx机房xx设备在xx时间发生xx告警
     * 电源告警信息: xx机房xx电源在xx时间发生xx告警
     *
     * @param battAlarmList
     * @param devAlarmList
     * @param powerAlarmList
     * @return
     */
    private void formatResultAndSaveToWav(String dirPath,
                                          List<BattalarmData> battAlarmList,
                                          List<DevalarmData> devAlarmList,
                                          List<PwrdevAlarm> powerAlarmList) {
        SimpleDateFormat format = new SimpleDateFormat(ActionUtil.time_yyyyMMddHHmmss);
        long currentTimeMillis = System.currentTimeMillis();
        //查询告警语音设置表的所有记录,并更新下次时间戳到到相关的语音文件中
        Long userId = ActionUtil.getUser().getUId();
        List<AlarmVoiceSet> setList = alarmVoiceSetService.getAllByUserId(userId);
        List<AlarmVoiceSet> setListBatt = setList.stream().filter(set->set.getBattGroupId()!=null).collect(Collectors.toList());
        List<AlarmVoiceSet> setListDevice = setList.stream().filter(set->set.getDeviceId()!=null).collect(Collectors.toList());
        List<AlarmVoiceSet> setListPowerDevice = setList.stream().filter(set->set.getPowerDeviceId()!=null).collect(Collectors.toList());
        File file = new File(dirPath);
        if(!file.exists()){
            file.mkdirs();
        }
        for (BattalarmData alarm : battAlarmList) {
            StringBuilder alarmMsgBuilder = new StringBuilder();
            Integer almSignalId = alarm.getAlmSignalId();
            String alarmName = AlarmDaoFactory.getAllAlarmName(almSignalId);
            String alarmStartTime = format.format(alarm.getAlmStartTime());
            String stationName = alarm.getStationName();
            String district = stationName.split("-")[2];
            String station = stationName.split("-")[3];
            String stationNameUnion = district+"-"+station;
            //查询是否存在 设备id+告警类型 相同的记录
            Integer battGroupId = alarm.getBattGroupId();
            AtomicLong nextTimestamp = new AtomicLong(currentTimeMillis);
            setListBatt.forEach(set->{
                if(set.getBattGroupId().equals(battGroupId) && set.getAlarmType().equals(almSignalId)){
                    nextTimestamp.set(set.getNextTimestamp());
                }
            });
            //alarmMsgBuilder.append(stationNameUnion).append(",电池组编号为").append(alarm.getBattgroupname()).append(",单体为").append(alarm.getMonNum()).append(",在").append(alarmStartTime).append("发生了").append(alarmName).append("告警;");
            alarmMsgBuilder.append(stationNameUnion).append("发生了").append(alarmName).append("告警;");
            //生成语音文件,命名规则 {alarmStartTime}_batt_{num}_{battGroupId}_{almSignalId}_{userId}_{nextTimeInterval}_{voiceTime} ->更改为
            //生成语音文件,命名规则 {alarmStartTime}_batt_{num}_{battGroupId}_{almSignalId}_{readableVoiceTime}
            service.saveToWav(alarmMsgBuilder.toString(), dirPath + File.separator
                + alarm.getAlmStartTime().getTime()+"_batt_"+alarm.getNum()+"_"+ battGroupId +"_"+ almSignalId +"_"+nextTimestamp.get()+".wav");
        }
        for (DevalarmData alarm : devAlarmList) {
            StringBuilder alarmMsgBuilder = new StringBuilder();
            Integer almType = alarm.getAlmType();
            String alarmName = AlarmDaoFactory.getAllAlarmName(almType);
            String alarmStartTime = format.format(alarm.getAlmStartTime());
            String stationName = alarm.getStationName();
            String district = stationName.split("-")[2];
            String station = stationName.split("-")[3];
            String stationNameUnion = district+"-"+station;
            //查询是否存在 设备id+告警类型 相同的记录
            Integer devId = alarm.getDevId();
            AtomicLong nextTimestamp = new AtomicLong(currentTimeMillis);
            setListDevice.forEach(set->{
                if(set.getDeviceId().intValue() == devId && set.getAlarmType().equals(almType)){
                    nextTimestamp.set(set.getNextTimestamp());
                }
            });
            //alarmMsgBuilder.append(stationNameUnion).append(",设备编号为").append(alarm.getDevId()).append(",在").append(alarmStartTime).append("发生了").append(alarmName).append("告警;");
            alarmMsgBuilder.append(stationNameUnion).append("发生了").append(alarmName).append("告警;");
            //生成语音文件,命名规则 {alarmStartTime}_device_{num}_{deviceId}_{almType}_{readableVoiceTime}
            service.saveToWav(alarmMsgBuilder.toString(), dirPath + File.separator
                    + alarm.getAlmStartTime().getTime()+"_device_"+alarm.getNum()+"_"+alarm.getDevId()+"_"+ almType +"_"+nextTimestamp.get()+".wav");
        }
        for (PwrdevAlarm alarm : powerAlarmList) {
            StringBuilder alarmMsgBuilder = new StringBuilder();
            Integer almType = alarm.getAlmType();
            String alarmName = AlarmDaoFactory.getAllAlarmName(almType);
            String alarmStartTime = format.format(alarm.getAlmStartTime());
            String stationName = alarm.getStationName();
            String district = stationName.split("-")[2];
            String station = stationName.split("-")[3];
            String stationNameUnion = district+"-"+station;
            //查询是否存在 设备id+告警类型 相同的记录
            Long powerDeviceId = alarm.getPowerDeviceId();
            AtomicLong nextTimestamp = new AtomicLong(currentTimeMillis);
            setListPowerDevice.forEach(set->{
                if(set.getPowerDeviceId().equals(powerDeviceId) && set.getAlarmType().equals(almType)){
                    nextTimestamp.set(set.getNextTimestamp());
                }
            });
            //alarmMsgBuilder.append(stationNameUnion).append(",电源编号为").append(alarm.getPowerDeviceId()).append(",在").append(alarmStartTime).append("发生了").append(alarmName).append("告警;");
            alarmMsgBuilder.append(stationNameUnion).append("发生了").append(alarmName).append("告警;");
            //生成语音文件,命名规则 {alarmStartTime}_device_{num}_{deviceId}_{almType}_{readableVoiceTime}
            service.saveToWav(alarmMsgBuilder.toString(), dirPath + File.separator
                    + alarm.getAlmStartTime().getTime()+"_power_"+alarm.getNum()+"_"+alarm.getPowerDeviceId()+"_"+ almType +"_"+nextTimestamp.get()+".wav");
        }
        /*if(!alarmMsg.isEmpty()) {
            service.setRate(1);
            service.saveToWav(alarmMsg, dirPath + File.separator + System.currentTimeMillis() + ".wav");
        }*/
    }
    private void formatResultAndSaveToWav4Socket(String dirPath,
                                          List<BattalarmData> battAlarmList,
                                          List<DevalarmData> devAlarmList,
                                          List<PwrdevAlarm> powerAlarmList,Long userId) {
        SimpleDateFormat format = new SimpleDateFormat(ActionUtil.time_yyyyMMddHHmmss);
        long currentTimeMillis = System.currentTimeMillis();
        //查询告警语音设置表的所有记录,并更新下次时间戳到到相关的语音文件中
        //Long userId = ActionUtil.getUser().getUId();
        List<AlarmVoiceSet> setList = alarmVoiceSetService.getAllByUserId(userId);
        List<AlarmVoiceSet> setListBatt = setList.stream().filter(set->set.getBattGroupId()!=null).collect(Collectors.toList());
        List<AlarmVoiceSet> setListDevice = setList.stream().filter(set->set.getDeviceId()!=null).collect(Collectors.toList());
        List<AlarmVoiceSet> setListPowerDevice = setList.stream().filter(set->set.getPowerDeviceId()!=null).collect(Collectors.toList());
        File file = new File(dirPath);
        if(!file.exists()){
            file.mkdirs();
        }
        for (BattalarmData alarm : battAlarmList) {
            StringBuilder alarmMsgBuilder = new StringBuilder();
            Integer almSignalId = alarm.getAlmSignalId();
            String alarmName = AlarmDaoFactory.getAllAlarmName(almSignalId);
            String alarmStartTime = format.format(alarm.getAlmStartTime());
            String stationName = alarm.getStationName();
            String district = stationName.split("-")[2];
            String station = stationName.split("-")[3];
            String stationNameUnion = district+"-"+station;
            //查询是否存在 设备id+告警类型 相同的记录
            Integer battGroupId = alarm.getBattGroupId();
            AtomicLong nextTimestamp = new AtomicLong(currentTimeMillis);
            setListBatt.forEach(set->{
                if(set.getBattGroupId().equals(battGroupId) && set.getAlarmType().equals(almSignalId)){
                    nextTimestamp.set(set.getNextTimestamp());
                }
            });
            //alarmMsgBuilder.append(stationNameUnion).append(",电池组编号为").append(alarm.getBattgroupname()).append(",单体为").append(alarm.getMonNum()).append(",在").append(alarmStartTime).append("发生了").append(alarmName).append("告警;");
            alarmMsgBuilder.append(stationNameUnion).append("发生了").append(alarmName).append("告警;");
            //生成语音文件,命名规则 {alarmStartTime}_batt_{num}_{battGroupId}_{almSignalId}_{userId}_{nextTimeInterval}_{voiceTime} ->更改为
            //生成语音文件,命名规则 {alarmStartTime}_batt_{num}_{battGroupId}_{almSignalId}_{readableVoiceTime}
            service.saveToWav(alarmMsgBuilder.toString(), dirPath + File.separator
                    + alarm.getAlmStartTime().getTime()+"_batt_"+alarm.getNum()+"_"+ battGroupId +"_"+ almSignalId +"_"+nextTimestamp.get()+".wav");
        }
        for (DevalarmData alarm : devAlarmList) {
            StringBuilder alarmMsgBuilder = new StringBuilder();
            Integer almType = alarm.getAlmType();
            String alarmName = AlarmDaoFactory.getAllAlarmName(almType);
            String alarmStartTime = format.format(alarm.getAlmStartTime());
            String stationName = alarm.getStationName();
            String district = stationName.split("-")[2];
            String station = stationName.split("-")[3];
            String stationNameUnion = district+"-"+station;
            //查询是否存在 设备id+告警类型 相同的记录
            Integer devId = alarm.getDevId();
            AtomicLong nextTimestamp = new AtomicLong(currentTimeMillis);
            setListDevice.forEach(set->{
                if(set.getDeviceId().intValue() == devId && set.getAlarmType().equals(almType)){
                    nextTimestamp.set(set.getNextTimestamp());
                }
            });
            //alarmMsgBuilder.append(stationNameUnion).append(",设备编号为").append(alarm.getDevId()).append(",在").append(alarmStartTime).append("发生了").append(alarmName).append("告警;");
            alarmMsgBuilder.append(stationNameUnion).append("发生了").append(alarmName).append("告警;");
            //生成语音文件,命名规则 {alarmStartTime}_device_{num}_{deviceId}_{almType}_{readableVoiceTime}
            service.saveToWav(alarmMsgBuilder.toString(), dirPath + File.separator
                    + alarm.getAlmStartTime().getTime()+"_device_"+alarm.getNum()+"_"+alarm.getDevId()+"_"+ almType +"_"+nextTimestamp.get()+".wav");
        }
        for (PwrdevAlarm alarm : powerAlarmList) {
            StringBuilder alarmMsgBuilder = new StringBuilder();
            Integer almType = alarm.getAlmType();
            String alarmName = AlarmDaoFactory.getAllAlarmName(almType);
            String alarmStartTime = format.format(alarm.getAlmStartTime());
            String stationName = alarm.getStationName();
            String district = stationName.split("-")[2];
            String station = stationName.split("-")[3];
            String stationNameUnion = district+"-"+station;
            //查询是否存在 设备id+告警类型 相同的记录
            Long powerDeviceId = alarm.getPowerDeviceId();
            AtomicLong nextTimestamp = new AtomicLong(currentTimeMillis);
            setListPowerDevice.forEach(set->{
                if(set.getPowerDeviceId().equals(powerDeviceId) && set.getAlarmType().equals(almType)){
                    nextTimestamp.set(set.getNextTimestamp());
                }
            });
            //alarmMsgBuilder.append(stationNameUnion).append(",电源编号为").append(alarm.getPowerDeviceId()).append(",在").append(alarmStartTime).append("发生了").append(alarmName).append("告警;");
            alarmMsgBuilder.append(stationNameUnion).append("发生了").append(alarmName).append("告警;");
            //生成语音文件,命名规则 {alarmStartTime}_device_{num}_{deviceId}_{almType}_{readableVoiceTime}
            service.saveToWav(alarmMsgBuilder.toString(), dirPath + File.separator
                    + alarm.getAlmStartTime().getTime()+"_power_"+alarm.getNum()+"_"+alarm.getPowerDeviceId()+"_"+ almType +"_"+nextTimestamp.get()+".wav");
        }
        /*if(!alarmMsg.isEmpty()) {
            service.setRate(1);
            service.saveToWav(alarmMsg, dirPath + File.separator + System.currentTimeMillis() + ".wav");
        }*/
    }
    public Response getWavRead() {
        UserInf user = ActionUtil.getUser();
        //获取绝对文件夹路径
        String readSuffixPath = "wav" + File.separator + "alarm" + File.separator + user.getUId() + File.separator;
        String readDirPath = CommonUtil.getRootFile() + readSuffixPath;
        File readDir = new File(readDirPath);
        //监控用户的告警,包含生成,内存信息更新
        monitorAlarm(readDirPath);
        if(!readDir.exists()){
            return new Response().set(1,false,"无未读告警语音");
        }else{
            String[] arr = readDir.list();
            if(arr.length==0){
                return new Response().set(1,false,"无未读告警语音");
            }
            //检查这种告警是否消除,消除则删除告警语音
            List<String> battGroupFileNameList = new LinkedList<>();
            List<String> deviceFileNameList = new LinkedList<>();
            List<String> powerDeviceFileNameList = new LinkedList<>();
            for (String fileName : arr) {
                if(fileName.contains("batt")){
                    battGroupFileNameList.add(fileName);
                }else if(fileName.contains("device")){
                    deviceFileNameList.add(fileName);
                }else{
                    powerDeviceFileNameList.add(fileName);
                }
            }
            ServletContext application = ActionUtil.getApplication();
            Map<String,Object> alarmMapNew = new HashMap<>();
            Map<String,Object> alarmMap = (Map<String, Object>) application.getAttribute("alarmMap_" + user.getUId());
            List<BattalarmData> battAlarmList = (List<BattalarmData>) alarmMap.get("battAlarmList");
            List<DevalarmData> devAlarmList = (List<DevalarmData>) alarmMap.get("devAlarmList");
            List<PwrdevAlarm> powerAlarmList = (List<PwrdevAlarm>) alarmMap.get("powerAlarmList");
            if(battGroupFileNameList.size()!=0){
                //查询电池告警是否消除
                List<BattalarmData> list = battAlarmDataService.getList(user.getUId(), 0);
                for (String battGroupFileName : battGroupFileNameList){
                    boolean exist = false;
                    String[] fileNameSplit = battGroupFileName.split("_");
                    long battGroupId = Long.parseLong(fileNameSplit[3]);
                    long alarmType = Long.parseLong(fileNameSplit[4]);
                    for(BattalarmData temp : list){
                        if(battGroupId == temp.getBattGroupId() && alarmType == temp.getAlmSignalId()){
                            exist = true;
                            break;
                        }
                    }
                    //如果存在,说明告警未消除
                    if(!exist){ //不存在,告警消除,删除告警文件,同时消除内存中的记录
                        File deleteFile = new File(readDirPath + battGroupFileName);
                        deleteFile.delete();
                        battAlarmList = battAlarmList.stream().filter(
                                data->!(data.getBattGroupId() == battGroupId && data.getAlmSignalId() == alarmType)
                        ).collect(Collectors.toList());
                    }
                }
            }
            if(deviceFileNameList.size()!=0){
                //查询告警是否消除
                List<DevalarmData> list = devAlarmDataService.getList(user.getUId(), 0);
                for (String deviceFileName : deviceFileNameList){
                    boolean exist = false;
                    String[] fileNameSplit = deviceFileName.split("_");
                    long deviceId = Long.parseLong(fileNameSplit[3]);
                    long alarmType = Long.parseLong(fileNameSplit[4]);
                    for(DevalarmData temp : list){
                        if(deviceId == temp.getDevId() && alarmType == temp.getAlmType()){
                            exist = true;
                            break;
                        }
                    }
                    //如果存在,说明告警未消除
                    if(!exist){ //不存在,告警消除,删除告警文件
                        File deleteFile = new File(readDirPath + deviceFileName);
                        deleteFile.delete();
                        devAlarmList = devAlarmList.stream().filter(
                                data->!(data.getDevId() == deviceId && data.getAlmType() == alarmType)
                        ).collect(Collectors.toList());
                    }
                }
            }
            if(powerDeviceFileNameList.size()!=0){
                //查询告警是否消除
                List<PwrdevAlarm> list = pwrdevAlarmService.getList(user.getUId(), 0);
                for (String powerDeviceFileName : powerDeviceFileNameList){
                    boolean exist = false;
                    String[] fileNameSplit = powerDeviceFileName.split("_");
                    long powerDeviceId = Long.parseLong(fileNameSplit[3]);
                    long alarmType = Long.parseLong(fileNameSplit[4]);
                    for(PwrdevAlarm temp : list){
                        if(powerDeviceId == temp.getPowerDeviceId() && alarmType == temp.getAlmType()){
                            exist = true;
                            break;
                        }
                    }
                    //如果存在,说明告警未消除
                    if(!exist){ //不存在,告警消除,删除告警文件
                        File deleteFile = new File(readDirPath + powerDeviceFileName);
                        deleteFile.delete();
                        powerAlarmList = powerAlarmList.stream().filter(
                                data->!(data.getPowerDeviceId() == powerDeviceId && data.getAlmType() == alarmType)
                        ).collect(Collectors.toList());
                    }
                }
            }
            //更新内存
            alarmMapNew.put("battAlarmList",battAlarmList);
            alarmMapNew.put("devAlarmList",devAlarmList);
            alarmMapNew.put("powerAlarmList",powerAlarmList);
            application.setAttribute("alarmMap_"+user.getUId(),alarmMapNew);
            List<String> fileNameList = new LinkedList<>();
            for (String fileName : arr) {
                long currentTimeMillis = System.currentTimeMillis();
                long readableVoiceTime = Long.parseLong(fileName.substring(fileName.lastIndexOf("_") + 1, fileName.lastIndexOf(".")));
                //可播放时间<当前时间,输出播放
                if(readableVoiceTime<currentTimeMillis) {
                    fileName = "fg_file" + File.separator + readSuffixPath + File.separator + fileName;
                    fileNameList.add(fileName);
                }
            }
            if(fileNameList.size()==0){
                return new Response().set(1,false,"无未读告警语音");
            }
            return new Response().setII(1,true,fileNameList,null);
        }
    }
    public Response getWavRead4Socket(UserInf user, ServletContext application, HttpSession httpSession) {
        //获取绝对文件夹路径
        String readSuffixPath = "wav" + File.separator + "alarm" + File.separator + user.getUId() + File.separator;
        String readDirPath = CommonUtil.getRootFile() + readSuffixPath;
        File readDir = new File(readDirPath);
        //监控用户的告警,包含生成,内存信息更新
        monitorAlarm4Socket(readDirPath,user.getUId(),application,httpSession);
        if(!readDir.exists()){
            return new Response().set(1,false,"无未读告警语音");
        }else{
            String[] arr = readDir.list();
            if(arr.length==0){
                return new Response().set(1,false,"无未读告警语音");
            }
            //检查这种告警是否消除,消除则删除告警语音
            List<String> battGroupFileNameList = new LinkedList<>();
            List<String> deviceFileNameList = new LinkedList<>();
            List<String> powerDeviceFileNameList = new LinkedList<>();
            for (String fileName : arr) {
                if(fileName.contains("batt")){
                    battGroupFileNameList.add(fileName);
                }else if(fileName.contains("device")){
                    deviceFileNameList.add(fileName);
                }else{
                    powerDeviceFileNameList.add(fileName);
                }
            }
            //ServletContext application = ActionUtil.getApplication();
            Map<String,Object> alarmMapNew = new HashMap<>();
            Map<String,Object> alarmMap = (Map<String, Object>) application.getAttribute("alarmMap_" + user.getUId());
            List<BattalarmData> battAlarmList = (List<BattalarmData>) alarmMap.get("battAlarmList");
            List<DevalarmData> devAlarmList = (List<DevalarmData>) alarmMap.get("devAlarmList");
            List<PwrdevAlarm> powerAlarmList = (List<PwrdevAlarm>) alarmMap.get("powerAlarmList");
            if(battGroupFileNameList.size()!=0){
                //查询电池告警是否消除
                List<BattalarmData> list = battAlarmDataService.getList(user.getUId(), 0);
                for (String battGroupFileName : battGroupFileNameList){
                    boolean exist = false;
                    String[] fileNameSplit = battGroupFileName.split("_");
                    long battGroupId = Long.parseLong(fileNameSplit[3]);
                    long alarmType = Long.parseLong(fileNameSplit[4]);
                    for(BattalarmData temp : list){
                        if(battGroupId == temp.getBattGroupId() && alarmType == temp.getAlmSignalId()){
                            exist = true;
                            break;
                        }
                    }
                    //如果存在,说明告警未消除
                    if(!exist){ //不存在,告警消除,删除告警文件,同时消除内存中的记录
                        File deleteFile = new File(readDirPath + battGroupFileName);
                        deleteFile.delete();
                        battAlarmList = battAlarmList.stream().filter(
                                data->!(data.getBattGroupId() == battGroupId && data.getAlmSignalId() == alarmType)
                        ).collect(Collectors.toList());
                    }
                }
            }
            if(deviceFileNameList.size()!=0){
                //查询告警是否消除
                List<DevalarmData> list = devAlarmDataService.getList(user.getUId(), 0);
                for (String deviceFileName : deviceFileNameList){
                    boolean exist = false;
                    String[] fileNameSplit = deviceFileName.split("_");
                    long deviceId = Long.parseLong(fileNameSplit[3]);
                    long alarmType = Long.parseLong(fileNameSplit[4]);
                    for(DevalarmData temp : list){
                        if(deviceId == temp.getDevId() && alarmType == temp.getAlmType()){
                            exist = true;
                            break;
                        }
                    }
                    //如果存在,说明告警未消除
                    if(!exist){ //不存在,告警消除,删除告警文件
                        File deleteFile = new File(readDirPath + deviceFileName);
                        deleteFile.delete();
                        devAlarmList = devAlarmList.stream().filter(
                                data->!(data.getDevId() == deviceId && data.getAlmType() == alarmType)
                        ).collect(Collectors.toList());
                    }
                }
            }
            if(powerDeviceFileNameList.size()!=0){
                //查询告警是否消除
                List<PwrdevAlarm> list = pwrdevAlarmService.getList(user.getUId(), 0);
                for (String powerDeviceFileName : powerDeviceFileNameList){
                    boolean exist = false;
                    String[] fileNameSplit = powerDeviceFileName.split("_");
                    long powerDeviceId = Long.parseLong(fileNameSplit[3]);
                    long alarmType = Long.parseLong(fileNameSplit[4]);
                    for(PwrdevAlarm temp : list){
                        if(powerDeviceId == temp.getPowerDeviceId() && alarmType == temp.getAlmType()){
                            exist = true;
                            break;
                        }
                    }
                    //如果存在,说明告警未消除
                    if(!exist){ //不存在,告警消除,删除告警文件
                        File deleteFile = new File(readDirPath + powerDeviceFileName);
                        deleteFile.delete();
                        powerAlarmList = powerAlarmList.stream().filter(
                                data->!(data.getPowerDeviceId() == powerDeviceId && data.getAlmType() == alarmType)
                        ).collect(Collectors.toList());
                    }
                }
            }
            //更新内存
            alarmMapNew.put("battAlarmList",battAlarmList);
            alarmMapNew.put("devAlarmList",devAlarmList);
            alarmMapNew.put("powerAlarmList",powerAlarmList);
            application.setAttribute("alarmMap_"+user.getUId(),alarmMapNew);
            List<String> fileNameList = new LinkedList<>();
            for (String fileName : arr) {
                long currentTimeMillis = System.currentTimeMillis();
                long readableVoiceTime = Long.parseLong(fileName.substring(fileName.lastIndexOf("_") + 1, fileName.lastIndexOf(".")));
                //可播放时间<当前时间,输出播放
                if(readableVoiceTime<currentTimeMillis) {
                    fileName = "fg_file" + File.separator + readSuffixPath + File.separator + fileName;
                    fileNameList.add(fileName);
                }
            }
            if(fileNameList.size()==0){
                return new Response().set(1,false,"无未读告警语音");
            }
            return new Response().setII(1,true,fileNameList,null);
        }
    }
}