1、修改device修改和增加页面的机制

2、优化rtcm服务里device缓存代码,原代码基站关联的device和device缓存里的device不是同一个对象
3、增加基站按基站采样率推送的功能
This commit is contained in:
weidong 2025-04-28 17:34:50 +08:00
parent 22bb0f656d
commit d3904cd016
30 changed files with 302 additions and 320 deletions

View File

@ -52,4 +52,9 @@ beidou-ehm 9912 健康检查、SIM卡检查
2025-04
1告警参数配置增加一个字段单位
2健康检查增加连续无有效解的时长之和统计
2健康检查增加连续无有效解的时长之和统计
3批量升级
a在设备页面增加勾选框和“准备升级”、“完成升级”按钮
b点击“准备升级”把模式改为“待升级”同时发连接版本服务器指令
c点击“完成升级”把模式改为“正常”

View File

@ -1,6 +1,6 @@
package com.imdroid.sideslope.bd;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.service.Device;
import java.time.LocalDateTime;
import java.util.ArrayList;

View File

@ -3,7 +3,7 @@ package com.imdroid.sideslope.calc;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.imdroid.common.util.NumberUtils;
import com.imdroid.secapi.dto.*;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.service.Device;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -2,7 +2,7 @@ package com.imdroid.sideslope.calc;
import com.imdroid.secapi.dto.GnssGroupCalc;
import com.imdroid.sideslope.message.D341LocationMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.service.Device;
import java.time.LocalDateTime;

View File

@ -5,17 +5,15 @@ import com.imdroid.secapi.dto.*;
import com.imdroid.sideslope.message.BaseMessage;
import com.imdroid.sideslope.message.D341LocationMessage;
import com.imdroid.sideslope.message.D342LocationMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import com.imdroid.sideslope.service.DataPersistService;
import com.imdroid.sideslope.service.GroupParaService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -40,24 +38,11 @@ public class MultiLineGNSSCalcService {
private BeidouClient beidouClient;
@Autowired
DataPersistService dataPersistService;
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired
GnssGroupCalcMapper groupCalcMapper;
List<GnssGroupCalc> groupCalcList;
synchronized GnssGroupCalc getGroupCalc(int groupId){
if(groupCalcList == null){
groupCalcList = groupCalcMapper.selectList(null);
}
if(groupCalcList != null){
for(GnssGroupCalc groupCalc:groupCalcList){
if(groupCalc.getId() == groupId) return groupCalc;
}
}
return null;
}
GroupParaService groupParaService;
public void calc(D342LocationMessage d342Message){
// 如果时间跨度大于1分钟或者不含d341则计算平滑值
@ -79,7 +64,7 @@ public class MultiLineGNSSCalcService {
logger.info(deviceId + " d341 cycle done!");
// 计算上轮结果
Device device = deviceService.findByDeviceId(deviceId);
GnssGroupCalc groupCalc = getGroupCalc(device.getCalcGroupId());
GnssGroupCalc groupCalc = groupParaService.getCalcGroup(device.getCalcGroupId());
calcService.calSingleDone(device, groupCalc, lastD342Time.createTime);
}
}
@ -130,7 +115,7 @@ public class MultiLineGNSSCalcService {
}
// 计算上轮结果
Device device = deviceService.findByDeviceId(deviceId);
GnssGroupCalc groupCalc = getGroupCalc(device.getCalcGroupId());
GnssGroupCalc groupCalc = groupParaService.getCalcGroup(device.getCalcGroupId());
calcService.calSingleDone(device, groupCalc, lastDate);
// 重算最近的
lastDate = gnssCalcFilterService.updateRpos(device,groupCalc,lastDate);
@ -185,10 +170,4 @@ public class MultiLineGNSSCalcService {
}
else return null;
}
public void refreshGroupCalc(){
if(groupCalcList!=null) groupCalcList.clear();
groupCalcList = groupCalcMapper.selectList(null);
logger.info("group paras changed");
}
}

View File

@ -6,11 +6,12 @@ import com.imdroid.common.util.ThreadManager;
import com.imdroid.secapi.dto.*;
import com.imdroid.sideslope.bd.*;
import com.imdroid.sideslope.message.D341LocationMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import com.imdroid.sideslope.server.DeviceChannel;
import com.imdroid.sideslope.server.OnlineChannels;
import com.imdroid.sideslope.service.GnssSingleBufferService;
import com.imdroid.sideslope.service.GroupParaService;
import com.imdroid.sideslope.service.WarningService;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@ -18,8 +19,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
@ -46,31 +45,17 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
@Autowired
GNSSCalcFilterService gnssCalcFilterService;
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired
GnssGroupCalcMapper groupCalcMapper;
GroupParaService groupParaService;
@Autowired
GnssCalcDataMapper dataMapper;
@Autowired
private GnssSingleBufferService gnssSingleDataService;
// 非线程安全需加同步保护
List<GnssGroupCalc> groupCalcList;
synchronized GnssGroupCalc getGroupCalc(int groupId){
if(groupCalcList == null){
groupCalcList = groupCalcMapper.selectList(null);
}
if(groupCalcList != null){
for(GnssGroupCalc groupCalc:groupCalcList){
if(groupCalc.getId() == groupId) return groupCalc;
}
}
return null;
}
/***
* 处理本轮的固定解求出重心位置多线程调用访问成员变量要考虑多线程安全
@ -83,7 +68,7 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
String deviceId = message.getId();
Device device = deviceService.findByDeviceId(deviceId);
if(device == null) return;
GnssGroupCalc groupCalc = getGroupCalc(device.getCalcGroupId());
GnssGroupCalc groupCalc = groupParaService.getCalcGroup(device.getCalcGroupId());
if(groupCalc==null) return;
device.setB562AsCalc(groupCalc.getVer()!=3);
@ -182,7 +167,7 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
future = null;
}
if(null == groupCalc){
groupCalc = getGroupCalc(device.getCalcGroupId());
groupCalc = groupParaService.getCalcGroup(device.getCalcGroupId());
if(groupCalc == null) return;
}
calCycleResult(device, groupCalc, resultTime);
@ -353,13 +338,6 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
focusCalculator.reset();
}
public void refreshGroupCalc(){
if(groupCalcList!=null) groupCalcList.clear();
groupCalcList = groupCalcMapper.selectList(null);
calculatorMap.clear();
logger.info("group paras changed");
}
public void refreshDeviceCalc(String deviceId){
Device device = deviceService.findByDeviceId(deviceId);
if(device == null) return;

View File

@ -3,13 +3,11 @@ package com.imdroid.sideslope.executor;
import com.imdroid.common.util.ByteUtil;
import com.imdroid.secapi.client.BeidouClient;
import com.imdroid.sideslope.message.D31xConfigAckMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author Layton
* @date 2023/2/2 20:40
@ -18,7 +16,7 @@ import javax.annotation.Resource;
public class D31xConfigAckMessageExecutor implements Executor<D31xConfigAckMessage, Void> {
@Autowired
private BeidouClient beidouClient;
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Override

View File

@ -8,8 +8,8 @@ import com.imdroid.common.util.ByteUtil;
import com.imdroid.sideslope.bd.Gga;
import com.imdroid.sideslope.message.D331RtcmMessage;
import com.imdroid.sideslope.ntrip.UdpNtripServer;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import com.imdroid.sideslope.server.DeviceChannel;
import com.imdroid.sideslope.server.OnlineChannels;
import com.imdroid.sideslope.service.DataPersistService;
@ -21,8 +21,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
@ -37,7 +35,7 @@ public class D331RtcmMessageExecutor implements Executor<D331RtcmMessage, Void>
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired
private BeidouClient beidouClient;
@ -62,6 +60,7 @@ public class D331RtcmMessageExecutor implements Executor<D331RtcmMessage, Void>
DeviceChannel deviceChannel = null;
for (Device device : deviceList) {
if (device.getOpMode() != GnssDevice.OP_MODE_USE) continue;
if ((deviceBs.getD3xxCount()%device.getGnssSampleRate()) != 0) continue;
String deviceId = device.getDeviceId();
if(device.getDataChannelType() == Device.CHANNEL_TYPE_UDP) {
deviceChannel = OnlineChannels.INSTANCE.getDataChannel(deviceId);

View File

@ -7,15 +7,13 @@ import com.imdroid.secapi.dto.GnssDevice;
import com.imdroid.sideslope.bd.Gga;
import com.imdroid.sideslope.calc.GNSSDataCalcService;
import com.imdroid.sideslope.message.D341LocationMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import com.imdroid.sideslope.service.DataPersistService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
@ -29,7 +27,7 @@ public class D341LocationMessageExecutor implements Executor<D341LocationMessage
@Autowired
private GNSSDataCalcService gnssCalcService;
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired
private BeidouClient beidouClient;

View File

@ -3,14 +3,12 @@ package com.imdroid.sideslope.executor;
import com.imdroid.common.util.ThreadManager;
import com.imdroid.sideslope.calc.MultiLineGNSSCalcService;
import com.imdroid.sideslope.message.D342LocationMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import com.imdroid.sideslope.service.DataPersistService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author Layton
* @date 2023/2/2 20:50
@ -20,7 +18,7 @@ public class D342LocationMessageExecutor implements Executor<D342LocationMessage
@Autowired
private MultiLineGNSSCalcService gnssCalcService;
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired
private DataPersistService dataPersistService;

View File

@ -6,16 +6,15 @@ import com.imdroid.common.util.ThreadManager;
import com.imdroid.secapi.client.BeidouClient;
import com.imdroid.secapi.dto.*;
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import com.imdroid.sideslope.service.DataPersistService;
import com.imdroid.sideslope.service.GroupParaService;
import com.imdroid.sideslope.web.ApiController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Timer;
import java.util.TimerTask;
@ -46,10 +45,12 @@ public class D3F0SelfCheckMessageExecutor implements Executor<D3F0SelfCheckMessa
@Autowired
private BeidouClient beidouClient;
// 由于消息数据大从缓存查询设备信息效率更高
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired
ApiController rtcmClient;
@Autowired
GroupParaService groupParaService;
@Override
public Void execute(D3F0SelfCheckMessage message) {
@ -64,6 +65,11 @@ public class D3F0SelfCheckMessageExecutor implements Executor<D3F0SelfCheckMessa
sendD3F1Ack(device);
//更新统计
device.updateRx(message.getHeader(),message.getLen(),1);
//更新采样率
GnssGroup group = groupParaService.getBasicGroup(device.getBasicGroupId());
if(group!=null) {
device.setGnssSampleRate(group.getGnss_sample_s());
}
ThreadManager.getFixedThreadPool().submit(() -> {
// 检查是否需要对设备的F9P进行冷启动操作

View File

@ -7,8 +7,8 @@ import com.imdroid.secapi.dto.GnssTrxMsg;
import com.imdroid.sideslope.calc.GNSSDataCalcService;
import com.imdroid.sideslope.calc.MultiLineGNSSCalcService;
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import com.imdroid.sideslope.service.DataPersistService;
import com.imdroid.sideslope.service.GnssSingleBufferServiceImpl;
import org.slf4j.Logger;
@ -16,7 +16,6 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
@ -34,7 +33,7 @@ public class D3F2StopIndicationMessageExecutor implements Executor<D3F2StopIndic
@Autowired
private DataPersistService dataPersistService;
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired
private BeidouClient beidouClient;

View File

@ -1,77 +0,0 @@
package com.imdroid.sideslope.sal;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.imdroid.secapi.dto.GnssDevice;
import com.imdroid.secapi.dto.GnssDeviceMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 描述
*
* @author LiGang
*/
@Component(value = "db")
public class DbDeviceServiceImpl implements DeviceService {
@Autowired
private GnssDeviceMapper gnssDeviceRepository;
@Override
public Device findByDeviceId(String deviceId) {
GnssDevice gnssDevice = gnssDeviceRepository.queryByDeviceId(deviceId);
if (gnssDevice == null) {
return null;
}
Device device = new Device();
device.setTenantId(gnssDevice.getTenantid());
device.setDeviceId(gnssDevice.getDeviceid());
device.setDeviceType(gnssDevice.getDevicetype());
device.setModel(gnssDevice.getModel());
device.setParentId(gnssDevice.getParentid());
device.setName(gnssDevice.getName());
device.setProjectId(gnssDevice.getProject_id());
device.setCalcGroupId(gnssDevice.getCalc_group_id());
device.setOpMode(gnssDevice.getOpmode());
device.setFwdId(gnssDevice.getFwd_group_id());
device.setIPose(gnssDevice.getIpose());
device.setIPosn(gnssDevice.getIposn());
device.setIPosd(gnssDevice.getIposd());
device.setEcefx(gnssDevice.getEcefx());
device.setEcefy(gnssDevice.getEcefy());
device.setEcefz(gnssDevice.getEcefz());
device.setLoggingmode(gnssDevice.getLoggingmode());
return device;
}
@Override
public List<Device> findByParentId(String parentId) {
QueryWrapper<GnssDevice> query = new QueryWrapper();
query.eq("parentid", parentId);
List<GnssDevice> gnssDeviceList = gnssDeviceRepository.selectList(query);
List<Device> deviceList = new ArrayList<>(gnssDeviceList.size());
for (GnssDevice gnssDevice : gnssDeviceList) {
Device device = new Device();
device.setDeviceId(gnssDevice.getDeviceid());
device.setDeviceType(gnssDevice.getDevicetype());
device.setParentId(gnssDevice.getParentid());
device.setName(gnssDevice.getName());
device.setProjectId(gnssDevice.getProject_id());
device.setCalcGroupId(gnssDevice.getCalc_group_id());
device.setOpMode(gnssDevice.getOpmode());
device.setFwdId(gnssDevice.getFwd_group_id());
device.setIPose(gnssDevice.getIpose());
device.setIPosn(gnssDevice.getIposn());
device.setIPosd(gnssDevice.getIposd());
device.setEcefx(gnssDevice.getEcefx());
device.setEcefy(gnssDevice.getEcefy());
device.setEcefz(gnssDevice.getEcefz());
deviceList.add(device);
}
return deviceList;
}
}

View File

@ -1,72 +0,0 @@
package com.imdroid.sideslope.sal;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @author Layton
* @date 2023/2/3 20:46
*/
@Component(value = "local")
public class LocalDeviceServiceImpl implements DeviceService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/*static RemovalListener<String, Device> removalListener = new RemovalListener<String, Device>() {
public void onRemoval(RemovalNotification<String, Device> removal) {
}
};*/
private static final Cache<String, Device> deviceCache = CacheBuilder.newBuilder().
expireAfterAccess(20, TimeUnit.MINUTES).build();
private static final Cache<String, List<Device>> subDeviceCache = CacheBuilder.newBuilder().
expireAfterAccess(10, TimeUnit.MINUTES).build();
@Resource(name = "db")
private DeviceService delegate;
@Override
public Device findByDeviceId(String deviceId) {
Device device = deviceCache.getIfPresent(deviceId);
if (device == null) {
device = delegate.findByDeviceId(deviceId);
if (device != null) {
deviceCache.put(deviceId, device);
}
}
return device;
}
@Override
public List<Device> findByParentId(String parentId) {
List<Device> device = subDeviceCache.getIfPresent(parentId);
if (device == null) {
logger.debug("base station {} refresh: "+parentId);
device = delegate.findByParentId(parentId);
if (device != null) {
subDeviceCache.put(parentId, device);
}
}
return device;
}
public void refresh(String deviceId, String oldParentId){
Device device = deviceCache.getIfPresent(deviceId);
if (device != null) {
if(device.getParentId()!=null) {
subDeviceCache.invalidate(device.getParentId());
if(oldParentId!=null && !oldParentId.equals(device.getParentId())){
subDeviceCache.invalidate(oldParentId);
}
}
deviceCache.invalidate(deviceId);
}
}
}

View File

@ -4,7 +4,6 @@ import com.imdroid.secapi.dto.GnssStatus;
import com.imdroid.sideslope.message.D342LocationMessage;
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
import com.imdroid.sideslope.sal.Device;
/**
* 设备数据持久化接口保存

View File

@ -5,7 +5,6 @@ import com.imdroid.sideslope.message.BaseMessage;
import com.imdroid.sideslope.message.D342LocationMessage;
import com.imdroid.sideslope.message.D3F0SelfCheckMessage;
import com.imdroid.sideslope.message.D3F2StopIndicationMessage;
import com.imdroid.sideslope.sal.Device;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,4 +1,4 @@
package com.imdroid.sideslope.sal;
package com.imdroid.sideslope.service;
import com.imdroid.secapi.dto.GnssDevice;
import com.imdroid.sideslope.bd.Gga;
@ -45,6 +45,8 @@ public class Device {
private Integer calcGroupId;
private Short opMode;
private boolean b562AsCalc = true;//算法版本
private Integer basicGroupId;
private short gnssSampleRate = 1;
int d3xxCount = 0;
int d3xxbytes = 0;

View File

@ -1,4 +1,4 @@
package com.imdroid.sideslope.sal;
package com.imdroid.sideslope.service;
import java.util.List;

View File

@ -0,0 +1,58 @@
package com.imdroid.sideslope.service;
import com.imdroid.secapi.dto.GnssGroup;
import com.imdroid.secapi.dto.GnssGroupCalc;
import com.imdroid.secapi.dto.GnssGroupCalcMapper;
import com.imdroid.secapi.dto.GnssGroupMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Service
public class GroupParaService {
@Autowired
GnssGroupMapper basicGroupMapper;
@Autowired
GnssGroupCalcMapper calcGroupMapper;
private ConcurrentHashMap<Integer, GnssGroup> basicGroupMap;
private ConcurrentHashMap<Integer, GnssGroupCalc> calcGroupMap;
public GnssGroup getBasicGroup(Integer groupId){
if(basicGroupMap==null){
refreshBasicGroup();
}
return basicGroupMap.get(groupId);
}
public GnssGroupCalc getCalcGroup(Integer groupId){
if(calcGroupMap==null){
refreshCalcGroup();
}
return calcGroupMap.get(groupId);
}
public void refreshGroup(){
refreshBasicGroup();
refreshCalcGroup();
}
void refreshBasicGroup(){
if(basicGroupMap==null){
basicGroupMap = new ConcurrentHashMap<>();
}
basicGroupMap.clear();
List<GnssGroup> gnssGroupList = basicGroupMapper.selectList(null);
for(GnssGroup group:gnssGroupList){
basicGroupMap.put(group.getId(),group);
}
}
void refreshCalcGroup(){
if(calcGroupMap==null){
calcGroupMap = new ConcurrentHashMap<>();
}
calcGroupMap.clear();
List<GnssGroupCalc> gnssGroupList = calcGroupMapper.selectList(null);
for(GnssGroupCalc group:gnssGroupList){
calcGroupMap.put(group.getId(),group);
}
}
}

View File

@ -0,0 +1,104 @@
package com.imdroid.sideslope.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.imdroid.secapi.dto.GnssDevice;
import com.imdroid.secapi.dto.GnssDeviceMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @author Layton
* @date 2023/2/3 20:46
*/
@Component
public class LocalDeviceServiceImpl implements DeviceService {
@Autowired
private GnssDeviceMapper gnssDeviceMapper;
private static final Cache<String, Device> deviceCache = CacheBuilder.newBuilder().
expireAfterAccess(20, TimeUnit.MINUTES).build();
private static final Cache<String, List<Device>> subDeviceCache = CacheBuilder.newBuilder().
expireAfterAccess(10, TimeUnit.MINUTES).build();
Device getDeviceFromDB(String deviceId){
GnssDevice gnssDevice = gnssDeviceMapper.queryByDeviceId(deviceId);
if (gnssDevice == null) {
return null;
}
Device device = new Device();
device.setTenantId(gnssDevice.getTenantid());
device.setDeviceId(gnssDevice.getDeviceid());
device.setDeviceType(gnssDevice.getDevicetype());
device.setModel(gnssDevice.getModel());
device.setParentId(gnssDevice.getParentid());
device.setName(gnssDevice.getName());
device.setProjectId(gnssDevice.getProject_id());
device.setCalcGroupId(gnssDevice.getCalc_group_id());
device.setBasicGroupId(gnssDevice.getGroup_id());
device.setOpMode(gnssDevice.getOpmode());
device.setFwdId(gnssDevice.getFwd_group_id());
device.setIPose(gnssDevice.getIpose());
device.setIPosn(gnssDevice.getIposn());
device.setIPosd(gnssDevice.getIposd());
device.setEcefx(gnssDevice.getEcefx());
device.setEcefy(gnssDevice.getEcefy());
device.setEcefz(gnssDevice.getEcefz());
device.setLoggingmode(gnssDevice.getLoggingmode());
return device;
}
public List<Device> getDeviceListFromDBByParentId(String parentId) {
QueryWrapper<GnssDevice> query = new QueryWrapper();
query.eq("parentid", parentId);
List<GnssDevice> gnssDeviceList = gnssDeviceMapper.selectList(query);
List<Device> deviceList = new ArrayList<>(gnssDeviceList.size());
for (GnssDevice gnssDevice : gnssDeviceList) {
Device device = findByDeviceId(gnssDevice.getDeviceid());
if(device!=null) deviceList.add(device);
}
return deviceList;
}
@Override
public Device findByDeviceId(String deviceId) {
Device device = deviceCache.getIfPresent(deviceId);
if (device == null) {
device = getDeviceFromDB(deviceId);
if (device != null) {
deviceCache.put(deviceId, device);
}
}
return device;
}
@Override
public List<Device> findByParentId(String parentId) {
List<Device> devices = subDeviceCache.getIfPresent(parentId);
if (devices == null) {
devices = getDeviceListFromDBByParentId(parentId);
if (devices != null) {
subDeviceCache.put(parentId, devices);
}
}
return devices;
}
public void refresh(String deviceId, String oldParentId){
Device device = deviceCache.getIfPresent(deviceId);
if (device != null) {
if(device.getParentId()!=null) {
subDeviceCache.invalidate(device.getParentId());
if(oldParentId!=null && !oldParentId.equals(device.getParentId())){
subDeviceCache.invalidate(oldParentId);
}
}
deviceCache.invalidate(deviceId);
}
}
}

View File

@ -3,7 +3,6 @@ package com.imdroid.sideslope.service;
import com.imdroid.secapi.dto.GnssCalcData;
import com.imdroid.secapi.dto.GnssStatus;
import com.imdroid.secapi.dto.GnssStatusMsg;
import com.imdroid.sideslope.sal.Device;
public interface WarningService {
void refreshCfg();

View File

@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.imdroid.common.util.NumberUtils;
import com.imdroid.common.util.WarningLogExecutor;
import com.imdroid.secapi.dto.*;
import com.imdroid.sideslope.sal.Device;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -3,8 +3,8 @@ package com.imdroid.sideslope.task;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.imdroid.secapi.dto.*;
import com.imdroid.sideslope.calc.GNSSCalcFilterService;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.DeviceService;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.DeviceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -15,7 +15,6 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
@ -30,7 +29,7 @@ public class AbnormalDeviceProcessor{
private GnssStatusMapper gnssStatusMapper;
@Autowired
GNSSCalcFilterService filterService;
@Resource(name = "local")
@Autowired
private DeviceService deviceService;
@Autowired

View File

@ -4,10 +4,11 @@ import com.imdroid.common.util.DataTypeUtil;
import com.imdroid.secapi.client.HttpResp;
import com.imdroid.sideslope.calc.MultiLineGNSSCalcService;
import com.imdroid.sideslope.calc.SingleLineGNSSCalcService;
import com.imdroid.sideslope.sal.Device;
import com.imdroid.sideslope.sal.LocalDeviceServiceImpl;
import com.imdroid.sideslope.service.Device;
import com.imdroid.sideslope.service.LocalDeviceServiceImpl;
import com.imdroid.sideslope.server.DeviceChannel;
import com.imdroid.sideslope.server.OnlineChannels;
import com.imdroid.sideslope.service.GroupParaService;
import com.imdroid.sideslope.service.WarningService;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@ -41,6 +42,8 @@ public class ApiController {
SingleLineGNSSCalcService calcService;
@Autowired
MultiLineGNSSCalcService multiCalcService;
@Autowired
GroupParaService groupParaService;
@PostMapping(value = "/config")
public HttpResp config(String deviceId, String configuration) {
@ -163,14 +166,12 @@ public class ApiController {
@PostMapping("/group_param_changed")
public HttpResp groupParamChanged(){
calcService.refreshGroupCalc();
multiCalcService.refreshGroupCalc();
groupParaService.refreshGroup();
HttpResp resp = new HttpResp();
resp.setResponseMessage("succeed");
return resp;
}
@PostMapping("/warning_param_changed")
public HttpResp warningParamChanged(){
warningService.refreshCfg();

View File

@ -66,7 +66,7 @@ public class GnssDeviceController extends BasicController{
}
@RequestMapping("/page/table/gnss_add_dev")
public String gnssUpdateDev(Model m, HttpSession session) {
public String gnssAddDev(Model m, HttpSession session) {
initModel(m, session);
//以下用于下拉框数据
List<GnssGroup> gnssGroups = gnssGroupMapper.selectList(null);
@ -86,6 +86,34 @@ public class GnssDeviceController extends BasicController{
m.addAttribute("gnss_group_list", gnssGroups);
m.addAttribute("gnss_group_calc_list", gnssGroupCalcs);
m.addAttribute("gnss_group_fwd_list", gnssGroupFwds);
m.addAttribute("device", new GnssDevice());
return "/page/table/gnss_add_dev";
}
@RequestMapping("/page/table/gnss_edit_dev")
public String gnssEditDev(Model m, HttpSession session, Integer id) {
initModel(m, session);
//以下用于下拉框数据
List<GnssGroup> gnssGroups = gnssGroupMapper.selectList(null);
List<GnssGroupCalc> gnssGroupCalcs = gnssGroupCalcMapper.selectList(null);
List<GnssGroupFwd> gnssGroupFwds = gnssGroupFwdMapper.selectList(null);
List<Tenant> tenants;
if(loginRole.equals(Role.SUPER_ADMIN) || loginRole.equals(Role.ADMIN)) {
tenants = tenantMapper.selectList(null);
}
else{
QueryWrapper<Tenant> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", tenantId);
tenants = tenantMapper.selectList(queryWrapper);
}
GnssDevice device = gnssDeviceMapper.selectById(id);
m.addAttribute("tenant_list", tenants);
m.addAttribute("gnss_group_list", gnssGroups);
m.addAttribute("gnss_group_calc_list", gnssGroupCalcs);
m.addAttribute("gnss_group_fwd_list", gnssGroupFwds);
m.addAttribute("device", device);
return "/page/table/gnss_add_dev";
}

View File

@ -94,6 +94,7 @@ public class GnssGroupController extends BasicController {
} else{
// 更新所有的device同步标志
deviceMapper.setSynFlagByGroupId(group.getId());
rtcmClient.groupParamChanged();
return HttpResult.ok();
}
}
@ -115,7 +116,10 @@ public class GnssGroupController extends BasicController {
group.getName());
if (num == 0) {
return HttpResult.failed();
} else return HttpResult.ok();
} else {
rtcmClient.groupParamChanged();
return HttpResult.ok();
}
}
/********* 解算参数组 *********/

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

View File

@ -142,8 +142,10 @@
var loc_green = new BMapGL.Icon("../images/loc1_green.png", new BMapGL.Size(18, 24));
var loc_red = new BMapGL.Icon("../images/loc1_red.png", new BMapGL.Size(18, 24));
var loc_orange = new BMapGL.Icon("../images/loc1_orange.png", new BMapGL.Size(18, 24));
var loc_blue = new BMapGL.Icon("../images/loc_blue.png", new BMapGL.Size(18, 24));
initialize();
myLocation();
function initialize() {
var point = new BMapGL.Point(116.404, 39.915);
@ -233,7 +235,19 @@
// 启动函数
timer();
}
function myLocation(){
var geolocation = new BMapGL.Geolocation();
geolocation.getCurrentPosition(function(r){
if(this.getStatus() == BMAP_STATUS_SUCCESS){
var mk = new BMapGL.Marker(r.point, {
icon: loc_blue
});
map.addOverlay(mk);
map.panTo(r.point);
}
});
}
function showAll(){
if(marker_state == 2){

View File

@ -219,11 +219,7 @@
maxmin:true,
shadeClose: true,
area: ['100%', '100%'],
content: '../page/table/gnss_add_dev',
success: function(layero, index) {
var iframe = window['layui-layer-iframe' + index];
iframe.setParams(data);
}
content: '../page/table/gnss_edit_dev?id='+data.id
});
$(window).on("resize", function () {
layer.full(index);

View File

@ -16,18 +16,19 @@
</head>
<body>
<div class="layui-form layuimini-form">
<div class="layui-form layuimini-form" th:object="${device}">
<input type="hidden" name="id" id="id" th:field="*{id}">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label required">设备编号</label>
<div class="layui-input-block">
<input type="text" name="deviceid" id="deviceid" lay-verify="required" lay-reqtext="不能为空" placeholder="请输入设备编号" value="" class="layui-input">
<input type="text" name="deviceid" id="deviceid" th:field="*{deviceid}" lay-verify="required" lay-reqtext="不能为空" placeholder="请输入设备编号" value="" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label required">使用状态</label>
<div class="layui-input-inline">
<select name="opmode" id="opmode" lay-verify="required" lay-search="">
<select name="opmode" id="opmode" th:field="*{opmode}" lay-verify="required" lay-search="">
<option value="0">正常</option>
<option value="1">维护</option>
<option value="2">停用</option>
@ -38,7 +39,7 @@
<div class="layui-inline">
<label class="layui-form-label required">日志记录</label>
<div class="layui-input-inline">
<select name="loggingmode" id="loggingmode" lay-verify="required" lay-search="">
<select name="loggingmode" id="loggingmode" th:field="*{loggingmode}" lay-verify="required" lay-search="">
<option value="0">不记录(除了自检和停止消息)</option>
<option value="1">记录</option>
</select>
@ -49,7 +50,7 @@
<div class="layui-inline">
<label class="layui-form-label required">产品型号</label>
<div class="layui-input-inline">
<select name="model" id="model" lay-verify="required" lay-search="" lay-filter="device_model">
<select name="model" id="model" th:field="*{model}" lay-verify="required" lay-search="" lay-filter="device_model">
<option value="0">G505</option>
<option value="1">G510</option>
</select>
@ -69,7 +70,7 @@
<div class="layui-inline">
<label class="layui-form-label required">设备类型</label>
<div class="layui-input-inline">
<select name="devicetype" id="devicetype" lay-verify="required" lay-search="" lay-filter="device_type">
<select name="devicetype" id="devicetype" th:field="*{devicetype}" lay-verify="required" lay-search="" lay-filter="device_type">
<option value="0">监测站</option>
<option value="1">基准站</option>
</select>
@ -78,7 +79,7 @@
<div class="layui-inline">
<label class="layui-form-label">基站编号</label>
<div class="layui-input-block">
<input type="number" name="parentid" id="parentid" placeholder="请输入关联基准站编号" value="" class="layui-input">
<input type="number" name="parentid" id="parentid" th:field="*{parentid}" placeholder="请输入关联基准站编号" value="" class="layui-input">
</div>
</div>
</div>
@ -86,19 +87,19 @@
<div class="layui-inline">
<label class="layui-form-label">ECEF X</label>
<div class="layui-input-block">
<input type="text" name="ecefx" id="ecefx" class="layui-input">
<input type="text" name="ecefx" id="ecefx" th:field="*{ecefx}" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">Y</label>
<div class="layui-input-block">
<input type="text" name="ecefy" id="ecefy" class="layui-input">
<input type="text" name="ecefy" id="ecefy" th:field="*{ecefy}" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">Z</label>
<div class="layui-input-block">
<input type="text" name="ecefz" id="ecefz" class="layui-input">
<input type="text" name="ecefz" id="ecefz" th:field="*{ecefz}" class="layui-input">
</div>
</div>
</div>
@ -106,7 +107,7 @@
<div class="layui-inline">
<label class="layui-form-label required">基本参数组</label>
<div class="layui-input-inline">
<select name="group_id" id="group_id" lay-verify="required" lay-search="">
<select name="group_id" id="group_id" th:field="*{group_id}" lay-verify="required" lay-search="">
<option th:each="item : ${gnss_group_list}" th:text="${item.name}" th:value="${item.id}"></option>
</select>
</div>
@ -114,7 +115,7 @@
<div class="layui-inline">
<label class="layui-form-label required">解算参数组</label>
<div class="layui-input-inline">
<select name="calc_group_id" id="calc_group_id" lay-verify="required" lay-search="">
<select name="calc_group_id" id="calc_group_id" th:field="*{calc_group_id}" lay-verify="required" lay-search="">
<option th:each="item : ${gnss_group_calc_list}" th:text="${item.name}" th:value="${item.id}"></option>
</select>
</div>
@ -126,7 +127,7 @@
<div class="layui-inline">
<label class="layui-form-label required">所属部门</label>
<div class="layui-input-inline">
<select name="tenantname" id="tenantname" lay-verify="required" lay-search="">
<select name="tenantname" id="tenantname" th:field="*{tenantname}" lay-verify="required" lay-search="">
<option th:each="item : ${tenant_list}" th:text="${item.name}" th:value="${item.name}"></option>
</select>
</div>
@ -134,13 +135,13 @@
<div class="layui-inline">
<label class="layui-form-label">项目号</label>
<div class="layui-input-block">
<input type="text" name="project_id" id="project_id" placeholder="请输入项目编号" value="" class="layui-input">
<input type="text" name="project_id" id="project_id" th:field="*{project_id}" placeholder="请输入项目编号" value="" class="layui-input">
</div>
</div>
<div class="layui-inline" th:if="${tenant_id==0}">
<label class="layui-form-label">项目2号</label>
<div class="layui-input-block">
<input type="text" name="project2_id" id="project2_id" placeholder="请输入项目编号" value="" class="layui-input">
<input type="text" name="project2_id" id="project2_id" th:field="*{project2_id}" placeholder="请输入项目编号" value="" class="layui-input">
</div>
</div>
</div>
@ -148,13 +149,13 @@
<div class="layui-inline">
<label class="layui-form-label required">桩号</label>
<div class="layui-input-block">
<input type="text" name="sector" id="sector" value="" class="layui-input">
<input type="text" name="sector" id="sector" th:field="*{sector}" value="" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label required">监测点号</label>
<div class="layui-input-block">
<input type="text" name="name" id="name" value="" class="layui-input">
<input type="text" name="name" id="name" th:field="*{name}" value="" class="layui-input">
</div>
</div>
</div>
@ -164,7 +165,7 @@
<div class="layui-inline">
<label class="layui-form-label">推送至</label>
<div class="layui-input-inline">
<select name="fwd_group_id" id="fwd_group_id" lay-search="">
<select name="fwd_group_id" id="fwd_group_id" th:field="*{fwd_group_id}" lay-search="">
<option value="不推送">不推送</option>
<option th:each="item : ${gnss_group_fwd_list}" th:text="${item.name}" th:value="${item.name}"></option>
</select>
@ -173,7 +174,7 @@
<div class="layui-inline" th:if="${tenant_id==0}">
<label class="layui-form-label">推送2</label>
<div class="layui-input-inline">
<select name="fwd_group_id2" id="fwd_group_id2" lay-search="">
<select name="fwd_group_id2" id="fwd_group_id2" th:field="*{fwd_group_id2}" lay-search="">
<option value="不推送">不推送</option>
<option th:each="item : ${gnss_group_fwd_list}" th:text="${item.name}" th:value="${item.name}"></option>
</select>
@ -182,7 +183,7 @@
<div class="layui-inline">
<label class="layui-form-label">推送名称</label>
<div class="layui-input-block">
<input type="text" name="fwddeviceid" id="fwddeviceid" class="layui-input">
<input type="text" name="fwddeviceid" id="fwddeviceid" th:field="*{fwddeviceid}" class="layui-input">
</div>
</div>
</div>
@ -190,19 +191,19 @@
<div class="layui-inline">
<label class="layui-form-label">初始位置(mm) 东</label>
<div class="layui-input-block">
<input type="text" name="ipose" id="ipose" class="layui-input">
<input type="text" name="ipose" id="ipose" th:field="*{ipose}" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="iposn" id="iposn" class="layui-input">
<input type="text" name="iposn" id="iposn" th:field="*{iposn}" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="iposd" id="iposd" class="layui-input">
<input type="text" name="iposd" id="iposd" th:field="*{iposd}" class="layui-input">
</div>
</div>
</div>
@ -210,13 +211,13 @@
<div class="layui-form-item" th:if="${role=='SUPER_ADMIN'}">
<label class="layui-form-label">ICCID</label>
<div class="layui-input-block">
<input type="text" name="iccid" id="iccid" class="layui-input" placeholder="请输入19-20位的ICCID号码">
<input type="text" name="iccid" id="iccid" th:field="*{iccid}" class="layui-input" placeholder="请输入19-20位的ICCID号码">
</div>
</div>
<div class="layui-form-item" th:if="${role=='SUPER_ADMIN'}">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<input type="text" name="remark" id="remark" class="layui-input">
<input type="text" name="remark" id="remark" th:field="*{remark}" class="layui-input">
</div>
</div>
<hr th:if="${role=='SUPER_ADMIN'}">
@ -298,38 +299,6 @@
}
}
function setParams(data){
var form = layui.form,
$ = layui.$;
var device_id = $('#deviceid');
device_id.val(data.deviceid);
device_id.attr('readonly',true);
$('#name').val(data.name);
$('#devicetype').val(data.devicetype);
$('#parentid').val(data.parentid);
$('#tenantname').val(data.tenantname);
$('#project_id').val(data.project_id);
$('#project2_id').val(data.project2_id);
$('#group_id').val(data.group_id);
$('#calc_group_id').val(data.calc_group_id);
$('#fwd_group_id').val(data.fwd_group_id);
$('#fwd_group_id2').val(data.fwd_group_id2);
$('#opmode').val(data.opmode);
$('#loggingmode').val(data.loggingmode);
$('#fwddeviceid').val(data.fwddeviceid);
$('#ipose').val(data.ipose);
$('#iposn').val(data.iposn);
$('#iposd').val(data.iposd);
$('#ecefx').val(data.ecefx);
$('#ecefy').val(data.ecefy);
$('#ecefz').val(data.ecefz);
$('#model').val(data.model);
$('#sector').val(data.sector);
$('#remark').val(data.remark);
$('#iccid').val(data.iccid);
setEcefEditor();
form.render();
}
</script>
</body>