detached
王宇航 2024-01-29 10:09:05 +08:00
parent 9f26dbb992
commit 02c7b0d6cb
4 changed files with 245 additions and 316 deletions

View File

@ -1,7 +1,6 @@
package com.ruoyi.web.controller.system;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.domain.entity.*;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
@ -13,7 +12,6 @@ import com.ruoyi.common.utils.bean.ModbusResponse;
import com.ruoyi.system.service.ISysIdentifierService;
import com.ruoyi.system.service.ISysRadarService;
import com.ruoyi.system.service.PrimaryRadarDataService;
import com.ruoyi.common.config.RadarStatusWebSocket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
@ -29,7 +27,6 @@ import java.sql.SQLException;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
/**
@ -39,29 +36,12 @@ import java.util.stream.Collectors;
*/
@Controller
@RequestMapping("/system/radarstatus")
public class RadarStatusController implements InitializingBean {
public class RadarStatusController {
private static final Logger log = LoggerFactory.getLogger(RadarStatusController.class);
@Autowired
private ISysRadarService service;
@Autowired
private PrimaryRadarDataService primaryRadarDataService;
@Autowired
private ISysIdentifierService identifierService;
private Timer timer = new Timer();
public static CopyOnWriteArrayList<SocketModel> allRadar = new CopyOnWriteArrayList<>();
public static Integer count = 0 ;
private Integer consecutiveZeros = 0;
private Map<String, List<Integer>> pulse4Number = new HashMap<>();
private String prefix = "system/radarstatus";
/**
@ -94,7 +74,6 @@ public class RadarStatusController implements InitializingBean {
rspData.setRows(radarList.subList(pageNum, pageSize));
rspData.setTotal(radarList.size());
// RadarStatusWebSocket.sendToAll(rspData);
return rspData;
}
@ -144,302 +123,12 @@ public class RadarStatusController implements InitializingBean {
}
}
private void asyncWebSocket(List<SysRadar> radarList) {
CompletableFuture.runAsync(() -> {
buildAllRadar(radarList);
// TimerTask task = new TimerTask() {
// @Override
// public void run() {
// allRadar.forEach(socketModel -> {
// asyncReadRadar(socketModel);
// });
// }
// };
// timer.scheduleAtFixedRate(task, 1, 100);
});
}
public void buildAllRadar(List<SysRadar> radarList) {
for (SysRadar radar : radarList) {
try {
Socket socket = new Socket(radar.getRadarIp(), 23);
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
while (true) {
// long start = System.currentTimeMillis();
task(radar, socket);
System.out.println("雷达ip =====" + radar.getRadarIp());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// System.out.println("耗时时间: " + (System.currentTimeMillis() - start) );
}
}
};
CompletableFuture.runAsync(() -> {
timerTask.run();
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void task(SysRadar radar, Socket socket) {
try {
long start = System.currentTimeMillis();
List<SysDiscern> discernList = new ArrayList<>();
// socket连接成功返回数据
DataResponse data = SocketUtil.getData(socket, radar.getRadarLocation(), radar.getRadarIp());
// 天线号字符串转集合
List<String> numberList = convertStringToList(radar.getRadarNum());
for (String number : numberList) {
if (!pulse4Number.containsKey(number)) {
pulse4Number.put(number, new ArrayList<>());
}
List<Integer> pulse4Values = pulse4Number.get(number);
if (data.getData().get(7) == 0){
consecutiveZeros ++;
if (consecutiveZeros >= 10) {
// 10个0连续说明该天线没有数据 从pulse4Number中删除该天线
pulse4Number.remove(number);
// 从radarList中删除该天线
// 数据记录结束计算最大pulse4值
double maxPulse4 = pulse4Values.stream().mapToDouble(Integer::doubleValue).max().orElse(0);
System.out.println("天线 " + number + " 的最大pulse4值为: " + maxPulse4);
// 为下一次数据记录重置
pulse4Values.clear();
consecutiveZeros = 0;
}
}else {
count ++;
pulse4Values.add(data.getData().get(7));
}
}
SysDiscern sysDiscern = copyDataToDiscern(data);
System.out.println(radar.getRadarIp() + ": " + data);
// 雷达数据返回封装类赋值
ModbusResponse modbusResponse = getModbusResponse(data);
String tag = modbusResponse.getTagId();
// 雷达原始数据对象
PrimaryRadarData primaryRadarData = new PrimaryRadarData();
// 标识器对象
SysIdentifier sysIdentifier = new SysIdentifier();
// 拷贝封装类属性到雷达原始数据对象
BeanUtils.copyProperties(modbusResponse, primaryRadarData);
//判断读取数据中是否携带标签
if (!"0".equals(modbusResponse.getTagId())) {
// 根据标签去数据库查询标签列表
sysIdentifier = identifierService.selectIdentifierByTag(tag);
//判断数据库查询结果是否有数据
if (sysIdentifier != null) {
// 有数据将查询到的标识器配置属性放进原始数据对象
primaryRadarData.setLadleNumber(sysIdentifier.getLadleNumber());
primaryRadarData.setRadarLocation(radar.getRadarLocation());
primaryRadarData.setRadarIp(radar.getRadarIp());
if (modbusResponse.getValue4() != 0){
// 给雷达识别报表赋值
sysDiscern.setType(sysIdentifier.getType());
sysDiscern.setRadarLocation(radar.getRadarLocation());
sysDiscern.setLadleNumber(sysIdentifier.getLadleNumber());
sysDiscern.setCreateTime(new Date());
}
}
} else {
// 没有配置过将铁包号置空
primaryRadarData.setLadleNumber(null);
primaryRadarData.setRadarLocation(null);
primaryRadarData.setRadarIp(radar.getRadarIp());
}
if (modbusResponse.getValue4() != null && modbusResponse.getValue4() != 0) {
// primaryRadarDataService.insertPrimaryRadarData(primaryRadarData);
} else {
}
System.out.println("耗时时间: " + (System.currentTimeMillis() - start) );
} catch (Exception e) {
}
}
public static void addRadar(List<SysRadar> radarList) {
List<Long> idList = allRadar.stream().map(SocketModel::getId).collect(Collectors.toList());
List<SysRadar> filterList = radarList.stream().filter(item -> !idList.contains(item.getId())).collect(Collectors.toList());
// buildAllRadar(filterList);
}
public static void delRadar(Long id) {
allRadar.removeIf(item -> item.getId().equals(id));
}
// private void asyncReadRadar(SocketModel socketModel) {
// CompletableFuture.runAsync(() -> {
// try {
// List<SysDiscern> discernList = new ArrayList<>();
// // socket连接成功返回数据
// DataResponse data = SocketUtil.getData(socketModel);
// // 天线号字符串转集合
// List<String> numberList = convertStringToList(socketModel.getNumber());
// for (String number : numberList) {
// if (!pulse4Number.containsKey(number)) {
// pulse4Number.put(number, new ArrayList<>());
// }
// List<Integer> pulse4Values = pulse4Number.get(number);
// if (data.getData().get(7) == 0){
// consecutiveZeros ++;
// if (consecutiveZeros >= 10) {
// // 10个0连续说明该天线没有数据 从pulse4Number中删除该天线
// pulse4Number.remove(number);
// // 从radarList中删除该天线
// allRadar.remove(socketModel);
//
// // 数据记录结束计算最大pulse4值
// double maxPulse4 = pulse4Values.stream().mapToDouble(Integer::doubleValue).max().orElse(0);
// System.out.println("天线 " + number + " 的最大pulse4值为: " + maxPulse4);
// // 为下一次数据记录重置
// pulse4Values.clear();
// consecutiveZeros = 0;
// }
// }else {
// count ++;
// pulse4Values.add(data.getData().get(7));
// }
// }
//
// SysDiscern sysDiscern = copyDataToDiscern(data);
//
// System.out.println(socketModel.getRadarIp() + ": " + data);
// // 雷达数据返回封装类赋值
// ModbusResponse modbusResponse = getModbusResponse(data);
//
//
//
// String tag = modbusResponse.getTagId();
// // 雷达原始数据对象
// PrimaryRadarData primaryRadarData = new PrimaryRadarData();
// // 标识器对象
// SysIdentifier sysIdentifier = new SysIdentifier();
// // 拷贝封装类属性到雷达原始数据对象
// BeanUtils.copyProperties(modbusResponse, primaryRadarData);
//
// //判断读取数据中是否携带标签
// if (!"0".equals(modbusResponse.getTagId())) {
// // 根据标签去数据库查询标签列表
// sysIdentifier = identifierService.selectIdentifierByTag(tag);
// //判断数据库查询结果是否有数据
// if (sysIdentifier != null) {
// // 有数据将查询到的标识器配置属性放进原始数据对象
// primaryRadarData.setLadleNumber(sysIdentifier.getLadleNumber());
// primaryRadarData.setRadarLocation(socketModel.getRadarLocation());
// primaryRadarData.setRadarIp(socketModel.getRadarIp());
//
// if (modbusResponse.getValue4() != 0){
// // 给雷达识别报表赋值
// sysDiscern.setType(sysIdentifier.getType());
// sysDiscern.setRadarLocation(socketModel.getRadarLocation());
// sysDiscern.setLadleNumber(sysIdentifier.getLadleNumber());
// sysDiscern.setCreateTime(new Date());
// }
// }
// } else {
// // 没有配置过将铁包号置空
// primaryRadarData.setLadleNumber(null);
// primaryRadarData.setRadarLocation(null);
// primaryRadarData.setRadarIp(socketModel.getRadarIp());
// }
// if (modbusResponse.getValue4() != null && modbusResponse.getValue4() != 0) {
// primaryRadarDataService.insertPrimaryRadarData(primaryRadarData);
// } else {
//
// }
//
// } catch (Exception e) {
// }
// });
// }
/**
*
*
* @param data
* @return ModbusResponse
*/
private static SysDiscern copyDataToDiscern(DataResponse data) {
SysDiscern discern = new SysDiscern();
discern.setTagId(data.getData().get(3).toString());
discern.setValue4(data.getData().get(7));
discern.setNumber(data.getData().get(11));
return discern;
}
/**
*
*
* @param data
* @return ModbusResponse
*/
public static ModbusResponse getModbusResponse(DataResponse data) {
ModbusResponse modbusResponse = new ModbusResponse();
modbusResponse.setRadarNum(data.getData().get(0).toString());
modbusResponse.setTagId(data.getData().get(3).toString());
modbusResponse.setValue1(data.getData().get(4));
modbusResponse.setValue2(data.getData().get(5));
modbusResponse.setValue3(data.getData().get(6));
modbusResponse.setValue4(data.getData().get(7));
modbusResponse.setValue5(data.getData().get(8));
modbusResponse.setBaseLine(data.getData().get(9));
modbusResponse.setQueryFre(data.getData().get(10));
modbusResponse.setNumber(data.getData().get(11));
return modbusResponse;
}
@Override
public void afterPropertiesSet() throws Exception {
List<SysRadar> radarList = service.selectRadarList(new SysRadar());
asyncWebSocket(radarList);
}
public static List<String> convertStringToList(String input) {
List<String> list = new ArrayList<>();
if (input.contains(",")) {
String[] array = input.split(",");
list.addAll(Arrays.asList(array));
} else {
list.add(input);
}
return list;
}
class ConnectionStatus {
boolean connected = false;
}
}

View File

@ -42,6 +42,9 @@ public class SysRadarController extends BaseController {
@Autowired
private ISysRadarService radarService;
@Autowired
private RadarRealTimeDataService radarRealTimeDataService;
@GetMapping()
public String user() {
return prefix + "/radar";
@ -74,7 +77,7 @@ public class SysRadarController extends BaseController {
radar.setCreateBy(getLoginName());
int result = radarService.insertRadar(radar);
List<SysRadar> sysRadars = radarService.selectRadarList(new SysRadar());
radarRealTimeDataService.addRadar(sysRadars);
return toAjax(result);
}
@ -99,7 +102,6 @@ public class SysRadarController extends BaseController {
radar.setUpdateBy(getLoginName());
int result = radarService.updateUser(radar);
// RadarStatusController.buildAllRadar(radarService.selectRadarList(new SysRadar()));
return toAjax(result);
}
@ -107,7 +109,7 @@ public class SysRadarController extends BaseController {
@ResponseBody
public AjaxResult remove(String ids) {
int result = radarService.deleteRadarByIds(ids);
RadarStatusController.delRadar(Long.valueOf(ids));
radarRealTimeDataService.delRadar(Long.valueOf(ids));
return toAjax(result);
}
@ -141,7 +143,7 @@ public class SysRadarController extends BaseController {
ExcelUtil<RadarExcel> util = new ExcelUtil<RadarExcel>(RadarExcel.class);
List<RadarExcel> radarList = util.importExcel(file.getInputStream());
String message = radarService.importData(radarList, updateSupport);
// RadarStatusController.buildAllRadar(radarService.selectRadarList(new SysRadar()));
radarRealTimeDataService.addRadar(radarService.selectRadarList(new SysRadar()));
return AjaxResult.success(message);
}

View File

@ -0,0 +1,13 @@
package com.ruoyi.system.service;
import com.ruoyi.common.core.domain.entity.SysRadar;
import java.util.List;
public interface RadarRealTimeDataService {
void addRadar(List<SysRadar> radarList);
void delRadar(Long id);
}

View File

@ -0,0 +1,225 @@
package com.ruoyi.system.service.impl;
import com.ruoyi.common.core.domain.entity.*;
import com.ruoyi.common.utils.SocketModel;
import com.ruoyi.common.utils.SocketUtil;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.bean.ModbusResponse;
import com.ruoyi.system.service.ISysIdentifierService;
import com.ruoyi.system.service.ISysRadarService;
import com.ruoyi.system.service.PrimaryRadarDataService;
import com.ruoyi.system.service.RadarRealTimeDataService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.net.Socket;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
@Service
public class RadarRealTimeDataServiceImpl implements RadarRealTimeDataService, InitializingBean {
@Autowired
private PrimaryRadarDataService primaryRadarDataService;
@Autowired
private ISysIdentifierService identifierService;
@Autowired
private ISysRadarService service;
public static CopyOnWriteArrayList<String> allRadar = new CopyOnWriteArrayList<>();
public static Integer count = 0 ;
private Integer consecutiveZeros = 0;
private Map<String, List<Integer>> pulse4Number = new HashMap<>();
private Map<Long,String> radarDelMap = new HashMap<>();
@Override
public void afterPropertiesSet() {
List<SysRadar> radarList = service.selectRadarList(new SysRadar());
CompletableFuture.runAsync(() -> {
radarWebSocket(radarList);
});
}
private void radarWebSocket(List<SysRadar> radarList) {
for (SysRadar radar : radarList) {
try {
Socket socket = new Socket(radar.getRadarIp(), 23);
allRadar.add(radar.getRadarIp());
radarDelMap.put(radar.getId(), "0");
CompletableFuture.runAsync(() -> {
while (StringUtils.equals("0",radarDelMap.get(radar.getId()))) {
// long start = System.currentTimeMillis();
task(radar, socket);
System.out.println("雷达ip =====" + radar.getRadarIp());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// System.out.println("耗时时间: " + (System.currentTimeMillis() - start) );
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void task(SysRadar radar, Socket socket) {
try {
long start = System.currentTimeMillis();
List<SysDiscern> discernList = new ArrayList<>();
// socket连接成功返回数据
DataResponse data = SocketUtil.getData(socket, radar.getRadarLocation(), radar.getRadarIp());
// 天线号字符串转集合
List<String> numberList = convertStringToList(radar.getRadarNum());
for (String number : numberList) {
if (!pulse4Number.containsKey(number)) {
pulse4Number.put(number, new ArrayList<>());
}
List<Integer> pulse4Values = pulse4Number.get(number);
if (data.getData().get(7) == 0){
consecutiveZeros ++;
if (consecutiveZeros >= 10) {
// 10个0连续说明该天线没有数据 从pulse4Number中删除该天线
pulse4Number.remove(number);
// 从radarList中删除该天线
// 数据记录结束计算最大pulse4值
double maxPulse4 = pulse4Values.stream().mapToDouble(Integer::doubleValue).max().orElse(0);
System.out.println("天线 " + number + " 的最大pulse4值为: " + maxPulse4);
// 为下一次数据记录重置
pulse4Values.clear();
consecutiveZeros = 0;
}
}else {
count ++;
pulse4Values.add(data.getData().get(7));
}
}
SysDiscern sysDiscern = copyDataToDiscern(data);
System.out.println(radar.getRadarIp() + ": " + data);
// 雷达数据返回封装类赋值
ModbusResponse modbusResponse = getModbusResponse(data);
String tag = modbusResponse.getTagId();
// 雷达原始数据对象
PrimaryRadarData primaryRadarData = new PrimaryRadarData();
// 标识器对象
SysIdentifier sysIdentifier = new SysIdentifier();
// 拷贝封装类属性到雷达原始数据对象
BeanUtils.copyProperties(modbusResponse, primaryRadarData);
//判断读取数据中是否携带标签
if (!"0".equals(modbusResponse.getTagId())) {
// 根据标签去数据库查询标签列表
sysIdentifier = identifierService.selectIdentifierByTag(tag);
//判断数据库查询结果是否有数据
if (sysIdentifier != null) {
// 有数据将查询到的标识器配置属性放进原始数据对象
primaryRadarData.setLadleNumber(sysIdentifier.getLadleNumber());
primaryRadarData.setRadarLocation(radar.getRadarLocation());
primaryRadarData.setRadarIp(radar.getRadarIp());
if (modbusResponse.getValue4() != 0){
// 给雷达识别报表赋值
sysDiscern.setType(sysIdentifier.getType());
sysDiscern.setRadarLocation(radar.getRadarLocation());
sysDiscern.setLadleNumber(sysIdentifier.getLadleNumber());
sysDiscern.setCreateTime(new Date());
}
}
} else {
// 没有配置过将铁包号置空
primaryRadarData.setLadleNumber(null);
primaryRadarData.setRadarLocation(null);
primaryRadarData.setRadarIp(radar.getRadarIp());
}
if (modbusResponse.getValue4() != null && modbusResponse.getValue4() != 0) {
// primaryRadarDataService.insertPrimaryRadarData(primaryRadarData);
} else {
}
System.out.println("耗时时间: " + (System.currentTimeMillis() - start) );
} catch (Exception e) {
}
}
@Override
public void addRadar(List<SysRadar> radarList) {
List<SysRadar> filterDataList = radarList.stream().filter(item -> !allRadar.contains(item.getRadarIp())).collect(Collectors.toList());
radarWebSocket(filterDataList);
}
@Override
public void delRadar(Long id) {
radarDelMap.put(id,"1");
}
public static List<String> convertStringToList(String input) {
List<String> list = new ArrayList<>();
if (input.contains(",")) {
String[] array = input.split(",");
list.addAll(Arrays.asList(array));
} else {
list.add(input);
}
return list;
}
/**
*
*
* @param data
* @return ModbusResponse
*/
private static SysDiscern copyDataToDiscern(DataResponse data) {
SysDiscern discern = new SysDiscern();
discern.setTagId(data.getData().get(3).toString());
discern.setValue4(data.getData().get(7));
discern.setNumber(data.getData().get(11));
return discern;
}
/**
*
*
* @param data
* @return ModbusResponse
*/
public static ModbusResponse getModbusResponse(DataResponse data) {
ModbusResponse modbusResponse = new ModbusResponse();
modbusResponse.setRadarNum(data.getData().get(0).toString());
modbusResponse.setTagId(data.getData().get(3).toString());
modbusResponse.setValue1(data.getData().get(4));
modbusResponse.setValue2(data.getData().get(5));
modbusResponse.setValue3(data.getData().get(6));
modbusResponse.setValue4(data.getData().get(7));
modbusResponse.setValue5(data.getData().get(8));
modbusResponse.setBaseLine(data.getData().get(9));
modbusResponse.setQueryFre(data.getData().get(10));
modbusResponse.setNumber(data.getData().get(11));
return modbusResponse;
}
}