package com.whyc.service;
|
|
import com.whyc.dto.AlarmDaoFactory;
|
import com.whyc.dto.Response;
|
import com.whyc.mapper.BattalarmDataMapper;
|
import com.whyc.mapper.DevalarmDataMapper;
|
import com.whyc.pojo.*;
|
import com.whyc.util.ActionUtil;
|
import com.whyc.util.CommonUtil;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.annotation.Lazy;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import javax.servlet.ServletContext;
|
import javax.servlet.http.HttpSession;
|
import java.io.File;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
import static org.assertj.core.util.Maps.format;
|
|
/**
|
* 告警:电池/设备/电源告警的统一接口
|
*/
|
@Service
|
public class AlarmDataService {
|
|
@Autowired
|
private BattalarmDataService battAlarmDataService;
|
|
@Autowired
|
private DeviceAlarmDataService deviceAlarmDataService;
|
|
@Autowired
|
private DevalarmDataService devAlarmDataService;
|
|
@Autowired
|
private PwrdevAlarmService pwrdevAlarmService;
|
|
@Autowired
|
@Lazy
|
private MSTTSSpeechService service;
|
|
|
public Map<String, Object> getAlarmLevel1ListMap() {
|
Long userId = ActionUtil.getUser().getUId();
|
List<BattalarmData> battAlarmList = battAlarmDataService.getList(userId,1);
|
battAlarmList = battAlarmList.stream().filter(alarm->alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
|
|
for (BattalarmData adata : battAlarmList) {
|
adata.setAlmSignalIdName(AlarmDaoFactory.getAlarmName(adata.getAlmSignalId()));
|
adata.setAlmLevelName(AlarmDaoFactory.getAlarmType(adata.getAlmLevel()));
|
}
|
|
List<DevalarmData> devAlarmList = devAlarmDataService.getList(userId,1);
|
devAlarmList = devAlarmList.stream().filter(alarm->alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
|
|
|
List<PwrdevAlarm> powerAlarmList = pwrdevAlarmService.getList(userId,1);
|
powerAlarmList = powerAlarmList.stream().filter(alarm->alarm.getAlmLevel().equals(1)).collect(Collectors.toList());
|
|
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();
|
List<WorkflowAlarm> deviceAlarmList =deviceAlarmDataService.getAlarmList();
|
battAlarmList.addAll(deviceAlarmList);
|
return battAlarmList;
|
}
|
|
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);
|
}
|
}
|
|
/**
|
* 分为
|
* 电池告警信息: 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();
|
File file = new File(dirPath);
|
if(!file.exists()){
|
file.mkdirs();
|
}
|
for (BattalarmData alarm : battAlarmList) {
|
StringBuilder alarmMsgBuilder = new StringBuilder();
|
String alarmName = AlarmDaoFactory.getAllAlarmName(alarm.getAlmSignalId());
|
String alarmStartTime = format.format(alarm.getAlmStartTime());
|
String stationName = alarm.getStationName();
|
String district = stationName.split("-")[2];
|
String stationNameUnion = stationName.substring(stationName.indexOf(district));
|
|
//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()+"_"+alarm.getBattGroupId()+"_"+ alarm.getAlmSignalId()+"_"+currentTimeMillis+".wav");
|
|
}
|
for (DevalarmData alarm : devAlarmList) {
|
StringBuilder alarmMsgBuilder = new StringBuilder();
|
String alarmName = AlarmDaoFactory.getAllAlarmName(alarm.getAlmType());
|
String alarmStartTime = format.format(alarm.getAlmStartTime());
|
String stationName = alarm.getStationName();
|
String district = stationName.split("-")[2];
|
String stationNameUnion = stationName.substring(stationName.indexOf(district));
|
//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()+"_"+ alarm.getAlmType()+"_"+currentTimeMillis+".wav");
|
|
}
|
for (PwrdevAlarm alarm : powerAlarmList) {
|
StringBuilder alarmMsgBuilder = new StringBuilder();
|
String alarmName = AlarmDaoFactory.getAllAlarmName(alarm.getAlmType());
|
String alarmStartTime = format.format(alarm.getAlmStartTime());
|
String stationName = alarm.getStationName();
|
String district = stationName.split("-")[2];
|
String stationNameUnion = stationName.substring(stationName.indexOf(district));
|
//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()+"_"+ alarm.getAlmType()+"_"+currentTimeMillis+".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);
|
}
|
}
|
if(battGroupFileNameList.size()!=0){
|
//查询电池告警是否消除
|
List<BattalarmData> list = battAlarmDataService.getList(user.getUId(), 0);
|
for (String battGroupFileName : battGroupFileNameList){
|
boolean exist = false;
|
for(BattalarmData temp : list){
|
String[] fileNameSplit = battGroupFileName.split("_");
|
long battGroupId = Long.parseLong(fileNameSplit[3]);
|
long alarmType = Long.parseLong(fileNameSplit[4]);
|
if(battGroupId == temp.getBattGroupId() && alarmType == temp.getAlmSignalId()){
|
exist = true;
|
break;
|
}
|
}
|
//如果存在,说明告警未消除
|
if(!exist){ //不存在,告警消除,删除告警文件
|
File deleteFile = new File(readDirPath + battGroupFileName);
|
deleteFile.delete();
|
}
|
}
|
}
|
|
if(deviceFileNameList.size()!=0){
|
//查询告警是否消除
|
List<DevalarmData> list = devAlarmDataService.getList(user.getUId(), 0);
|
for (String deviceFileName : deviceFileNameList){
|
boolean exist = false;
|
for(DevalarmData temp : list){
|
String[] fileNameSplit = deviceFileName.split("_");
|
long deviceId = Long.parseLong(fileNameSplit[3]);
|
long alarmType = Long.parseLong(fileNameSplit[4]);
|
if(deviceId == temp.getDevId() && alarmType == temp.getAlmType()){
|
exist = true;
|
break;
|
}
|
}
|
//如果存在,说明告警未消除
|
if(!exist){ //不存在,告警消除,删除告警文件
|
File deleteFile = new File(readDirPath + deviceFileName);
|
deleteFile.delete();
|
}
|
}
|
}
|
|
if(powerDeviceFileNameList.size()!=0){
|
//查询告警是否消除
|
List<PwrdevAlarm> list = pwrdevAlarmService.getList(user.getUId(), 0);
|
for (String powerDeviceFileName : powerDeviceFileNameList){
|
boolean exist = false;
|
for(PwrdevAlarm temp : list){
|
String[] fileNameSplit = powerDeviceFileName.split("_");
|
long powerDeviceId = Long.parseLong(fileNameSplit[3]);
|
long alarmType = Long.parseLong(fileNameSplit[4]);
|
if(powerDeviceId == temp.getPowerDeviceId() && alarmType == temp.getAlmType()){
|
exist = true;
|
break;
|
}
|
}
|
//如果存在,说明告警未消除
|
if(!exist){ //不存在,告警消除,删除告警文件
|
File deleteFile = new File(readDirPath + powerDeviceFileName);
|
deleteFile.delete();
|
}
|
}
|
}
|
|
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);
|
}
|
}
|
}
|