1、修改了数据推送功能,推送失败和要推送的补传记录,单独一个表

2、推送历史记录的时间在推送当前记录成功5分钟后执行
3、增加项目2ID
This commit is contained in:
weidong 2024-02-05 12:44:03 +08:00
parent 2e3348fa5c
commit a3b16829a2
21 changed files with 477 additions and 163 deletions

View File

@ -15,20 +15,17 @@ import java.time.LocalDateTime;
@Data @Data
@TableName(value = "fwdrecords") @TableName(value = "fwdrecords")
public class FwdRecord { public class FwdRecord {
public static final short STATE_READY = 1; public static final short RESULT_OK = 1;
public static final short STATE_UPLOADING = 2; public static final short RESULT_FAILED = 0;
public static final short STATE_UPLOAD_DONE = 3;
public static final short STATE_FWD_DONE = 0;
public static final short STATE_FWD_FAILED = -1;
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
Long id; Long id;
Integer tenantid; Integer tenantid;
String deviceid; String deviceid;
String project_id; String projectid;
Short devicenum; Short devicenum;
LocalDateTime starttime; LocalDateTime createtime;
LocalDateTime endtime; LocalDateTime recordtime;
Short state; Short result;
String fwd_group_id; String fwd_group_id;
} }

View File

@ -37,6 +37,7 @@ public class GnssDevice {
private Integer devicetype; private Integer devicetype;
private String tenantname; private String tenantname;
private String project_id; private String project_id;
private String project2_id;
private Integer group_id = 1; //组参数缓存自动下发 private Integer group_id = 1; //组参数缓存自动下发
private Integer calc_group_id = 1; private Integer calc_group_id = 1;
private String fwd_group_id; private String fwd_group_id;

View File

@ -0,0 +1,28 @@
package com.imdroid.secapi.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
* GNSS收发统计消息每个工作周期结束的时候统计一次
*
* @author LiGang
*/
@Data
@TableName(value = "resendrecords")
public class ResendRecord {
@TableId(value = "id", type = IdType.AUTO)
Long id;
Integer tenantid;
String deviceid;
String projectid;
LocalDateTime createtime;
LocalDateTime starttime;
LocalDateTime endtime;
String fwd_group_id;
}

View File

@ -0,0 +1,8 @@
package com.imdroid.secapi.dto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ResendRecordMapper extends BaseMapper<ResendRecord> {
}

View File

@ -11,14 +11,16 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class Forwarder { public class Forwarder {
String name; String fwdGroupId;
String description; String description;
Integer tenantId; Integer tenantId;
boolean useFwdId; boolean useFwdId;
int totalSendNum = 0; int totalSendNum = 0;
boolean fwdFailed = false;
int fwdCycleMinutes = 30;
static boolean isFwdTableInit = false; static boolean isFwdTableInit = false;
@Autowired @Autowired
@ -29,28 +31,39 @@ public class Forwarder {
@Autowired @Autowired
private FwdRecordMapper fwdRecordsMapper; private FwdRecordMapper fwdRecordsMapper;
@Autowired
private ResendRecordMapper resendRecordMapper;
@Autowired @Autowired
GnssGroupFwdMapper fwdMapper; GnssGroupFwdMapper fwdMapper;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
void init(String name, String desc, Integer tenantId, boolean useFwdId){ /***
this.name = name; *
* @param fwdGroupId,推送组名
* @param desc推送组描述
* @param tenantId租户Id
* @param useFwdId是否使用转发名如果不使用则用deviceId
* @param cycle发送周期
*/
void init(String fwdGroupId, String desc, Integer tenantId, boolean useFwdId, int cycle){
this.fwdGroupId = fwdGroupId;
this.description = desc; this.description = desc;
this.tenantId = tenantId; this.tenantId = tenantId;
this.useFwdId = useFwdId; this.useFwdId = useFwdId;
this.fwdCycleMinutes = cycle;
if(!isFwdTableInit){ if(!isFwdTableInit){
isFwdTableInit = true; isFwdTableInit = true;
fwdMapper.delete(null); fwdMapper.delete(null);
} }
QueryWrapper<GnssGroupFwd> queryWrapper = new QueryWrapper<>(); QueryWrapper<GnssGroupFwd> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name",name); queryWrapper.eq("name",fwdGroupId);
GnssGroupFwd gnssGroupFwd = fwdMapper.selectOne(queryWrapper); GnssGroupFwd gnssGroupFwd = fwdMapper.selectOne(queryWrapper);
if(gnssGroupFwd == null){ if(gnssGroupFwd == null){
gnssGroupFwd = new GnssGroupFwd(); gnssGroupFwd = new GnssGroupFwd();
gnssGroupFwd.setName(name); gnssGroupFwd.setName(fwdGroupId);
gnssGroupFwd.setDescription(description); gnssGroupFwd.setDescription(description);
gnssGroupFwd.setDevice_num(0); gnssGroupFwd.setDevice_num(0);
fwdMapper.insert(gnssGroupFwd); fwdMapper.insert(gnssGroupFwd);
@ -62,14 +75,13 @@ public class Forwarder {
} }
/*** /***
* 推送指定推送组设备ID时间的GNSS记录查找指定时间前半小时的有效数据推送 * 推送指定企业设备ID时间的GNSS记录查找指定时间前cycle分钟的有效数据推送
* @param fwdGroupId推送组
* @param deviceId设备ID如果没有指定则推送全部
* @param sendTime要推送的记录的时间 * @param sendTime要推送的记录的时间
* @param deviceId设备ID如果没有指定则推送全部
*/ */
void forwardGnssRecords(String fwdGroupId, String deviceId, LocalDateTime sendTime) { boolean forwardGnssRecords(LocalDateTime sendTime, String deviceId) {
String endTime = sendTime.format(formatter); String endTime = sendTime.format(formatter);
String beginTime = sendTime.minusMinutes(30).format(formatter); String beginTime = sendTime.minusMinutes(fwdCycleMinutes).format(formatter);
// 查找属于指定推送组的设备列表 // 查找属于指定推送组的设备列表
QueryWrapper<GnssDevice> queryWrapper = new QueryWrapper<>(); QueryWrapper<GnssDevice> queryWrapper = new QueryWrapper<>();
@ -98,6 +110,13 @@ public class Forwarder {
for(GnssDevice device:gnssDeviceList){ for(GnssDevice device:gnssDeviceList){
if(device.getOpmode() != GnssDevice.OP_MODE_USE) continue; if(device.getOpmode() != GnssDevice.OP_MODE_USE) continue;
String projectId = device.getProject_id(); String projectId = device.getProject_id();
if(device.getProject2_id()!=null) {
// 推送组2用项目2的id号
String fwdGroupId2 = device.getFwd_group_id2();
if (fwdGroupId2 != null && fwdGroupId2.equals(fwdGroupId)) {
projectId = device.getProject2_id();
}
}
if(projectId == null) continue; if(projectId == null) continue;
List<GnssCalcData> recordsToSend = projects.get(projectId); List<GnssCalcData> recordsToSend = projects.get(projectId);
@ -126,8 +145,7 @@ public class Forwarder {
// 按项目打包推送 // 按项目打包推送
totalSendNum = 0; totalSendNum = 0;
fwdFailed = false; boolean fwdResult = true;
List<FwdRecord> fwdRecordList = new ArrayList<>();
for (Map.Entry<String, List<GnssCalcData>> entry: projects.entrySet()){ for (Map.Entry<String, List<GnssCalcData>> entry: projects.entrySet()){
String projectId = entry.getKey(); String projectId = entry.getKey();
List<GnssCalcData> records = entry.getValue(); List<GnssCalcData> records = entry.getValue();
@ -135,45 +153,70 @@ public class Forwarder {
int sendNum = send(projectId, records, sendTime); int sendNum = send(projectId, records, sendTime);
// 记录推送
FwdRecord fwdRecord = new FwdRecord(); FwdRecord fwdRecord = new FwdRecord();
fwdRecord.setProject_id(projectId); fwdRecord.setProjectid(projectId);
fwdRecord.setTenantid(tenantId); fwdRecord.setTenantid(tenantId);
fwdRecord.setDevicenum((short) records.size()); fwdRecord.setDevicenum((short) records.size());
fwdRecord.setStarttime(sendTime); fwdRecord.setRecordtime(sendTime);
fwdRecord.setEndtime(sendTime); fwdRecord.setCreatetime(LocalDateTime.now());
fwdRecord.setFwd_group_id(fwdGroupId); fwdRecord.setFwd_group_id(fwdGroupId);
if(sendNum > 0) { if(sendNum > 0) {
totalSendNum += sendNum; totalSendNum += sendNum;
// 记录推送 fwdRecord.setResult(FwdRecord.RESULT_OK);
fwdRecord.setState(FwdRecord.STATE_FWD_DONE);
} }
else{ else{
fwdRecord.setState(FwdRecord.STATE_FWD_FAILED); fwdResult = false;
fwdFailed = true; fwdRecord.setResult(FwdRecord.RESULT_FAILED);
// 新增重发记录
ResendRecord resendRecord = new ResendRecord();
resendRecord.setProjectid(projectId);
resendRecord.setTenantid(tenantId);
resendRecord.setCreatetime(LocalDateTime.now());
resendRecord.setStarttime(sendTime);
resendRecord.setEndtime(sendTime.plusMinutes(10));
resendRecord.setFwd_group_id(fwdGroupId);
resendRecordMapper.insert(resendRecord);
} }
fwdRecordList.add(fwdRecord); fwdRecordsMapper.insert(fwdRecord);
} }
// 更新推送信息 // 更新推送记录
ThreadManager.getFixedThreadPool().submit(() -> {
for(FwdRecord record:fwdRecordList){
fwdRecordsMapper.insert(record);
}
if(totalSendNum>0) updateFwd(totalSendNum, true); if(totalSendNum>0) updateFwd(totalSendNum, true);
else if(fwdFailed) updateFwd(totalSendNum, false); else if(!fwdResult) updateFwd(totalSendNum, false);
});
return fwdResult;
} }
void forwardCurrentGnss(String fwdGroupId) { void forwardCurrentGnss() {
forwardGnssRecords(fwdGroupId,null,LocalDateTime.now()); if(forwardGnssRecords(LocalDateTime.now(),null)) {
// 推送失败记录补发记录
ThreadManager.getScheduledThreadPool().schedule(() -> {
forwardHistoryGnss();
},300, TimeUnit.SECONDS);
}
} }
void forwardBatchGnssRecords(String fwdGroupId, String deviceId, LocalDateTime beginTime, LocalDateTime endTime) { void forwardHistoryGnss() {
// 1.从转发记录表里检索待补传记录时间表含设备Id时间段
QueryWrapper<ResendRecord> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("fwd_group_id",fwdGroupId);
List<ResendRecord> resendRecordsList = resendRecordMapper.selectList(queryWrapper);
// 2.检索这个这个时间段的解算结果如果有数据则单个终端转发标志记录为已补传
List<Long> ids = new ArrayList<>();
for(ResendRecord record:resendRecordsList){
ids.add(record.getId());
forwardBatchGnssRecords(
record.getStarttime(), record.getEndtime(), record.getDeviceid());
}
resendRecordMapper.deleteBatchIds(ids);
}
void forwardBatchGnssRecords(LocalDateTime beginTime, LocalDateTime endTime, String deviceId) {
LocalDateTime sendTime = beginTime; LocalDateTime sendTime = beginTime;
while(sendTime.isBefore(endTime)){ while(sendTime.isBefore(endTime)){
forwardGnssRecords(fwdGroupId,deviceId,sendTime); forwardGnssRecords(sendTime,deviceId);
sendTime = sendTime.plusMinutes(30); sendTime = sendTime.plusMinutes(fwdCycleMinutes);
try { try {
Thread.sleep(500); Thread.sleep(500);
} }
@ -183,28 +226,13 @@ public class Forwarder {
} }
} }
void forwardHistoryGnss(String fwdGroupId) {
// 1.从转发记录表里检索待补传记录时间表含设备Id时间段
QueryWrapper<FwdRecord> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("fwd_group_id",fwdGroupId);
queryWrapper.eq("state",FwdRecord.STATE_UPLOAD_DONE);
List<FwdRecord> fwdRecordsList = fwdRecordsMapper.selectList(queryWrapper);
// 2.检索这个这个时间段的解算结果如果有数据则单个终端转发标志记录为已补传
for(FwdRecord fwdRecord:fwdRecordsList){
forwardBatchGnssRecords(fwdRecord.getFwd_group_id(), fwdRecord.getDeviceid(),
fwdRecord.getStarttime(), fwdRecord.getEndtime());
fwdRecord.setState(FwdRecord.STATE_FWD_DONE);
fwdRecordsMapper.updateById(fwdRecord);
}
}
int send(String projectId, List<GnssCalcData> records, LocalDateTime sentTime) { int send(String projectId, List<GnssCalcData> records, LocalDateTime sentTime) {
return 0; return 0;
} }
void updateFwd(int fwd_num, boolean isFwdOK){ void updateFwd(int fwd_num, boolean isFwdOK){
QueryWrapper<GnssGroupFwd> queryWrapper = new QueryWrapper<>(); QueryWrapper<GnssGroupFwd> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name",name); queryWrapper.eq("name",fwdGroupId);
GnssGroupFwd gnssGroupFwd = fwdMapper.selectOne(queryWrapper); GnssGroupFwd gnssGroupFwd = fwdMapper.selectOne(queryWrapper);
if(gnssGroupFwd != null){ if(gnssGroupFwd != null){
gnssGroupFwd.setFwd_device_num(fwd_num); gnssGroupFwd.setFwd_device_num(fwd_num);

View File

@ -38,7 +38,7 @@ public class GXXfzForwarder extends Forwarder{
@PostConstruct @PostConstruct
void registerMe(){ void registerMe(){
init(FORWARDER_NAME, "TCP "+host+":"+port,1,false); init(FORWARDER_NAME, "TCP "+host+":"+port,1,false,30);
xfzTcpClient = new TCPClient(); xfzTcpClient = new TCPClient();
xfzTcpClient.init(host, port); xfzTcpClient.init(host, port);
xfzTcpClient.start(); xfzTcpClient.start();
@ -50,13 +50,7 @@ public class GXXfzForwarder extends Forwarder{
@Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次
private void forwardGnss() { private void forwardGnss() {
logger.info("xfz forwardGnss"); logger.info("xfz forwardGnss");
forwardCurrentGnss(FORWARDER_NAME); forwardCurrentGnss();
}
@Scheduled(cron = "0 40 * * * ?") // 每小时的40分钟执行一次
//@Scheduled(cron = "0 0/20 * * * ?") // 每20分钟执行一次
private void forwardHistoryGnss() {
forwardHistoryGnss(FORWARDER_NAME);
} }
@Override @Override

View File

@ -34,7 +34,7 @@ public class GZYForwarder extends Forwarder{
@PostConstruct @PostConstruct
void registerMe(){ void registerMe(){
init(FORWARDER_NAME, "UDP "+host+":"+port,2,true); init(FORWARDER_NAME, "UDP "+host+":"+port,2,true,30);
udpClient = new UDPClient(); udpClient = new UDPClient();
udpClient.init(host, port); udpClient.init(host, port);
} }
@ -44,13 +44,7 @@ public class GZYForwarder extends Forwarder{
@Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次
private void forwardGnss() { private void forwardGnss() {
logger.info("gzy UDP forwardGnss"); logger.info("gzy UDP forwardGnss");
forwardCurrentGnss(FORWARDER_NAME); forwardCurrentGnss();
}
@Scheduled(cron = "0 40 * * * ?") // 每小时的40分钟执行一次
//@Scheduled(cron = "0 0/20 * * * ?") // 每20分钟执行一次
private void forwardHistoryGnss() {
forwardHistoryGnss(FORWARDER_NAME);
} }
@Override @Override

View File

@ -42,7 +42,7 @@ public class GZYMQTTForwarder extends Forwarder {
@PostConstruct @PostConstruct
void registerMe() throws MqttException { void registerMe() throws MqttException {
init(FORWARDER_NAME, "MQTT "+brokerUrl,2,true); init(FORWARDER_NAME, "MQTT "+brokerUrl,2,true,30);
mqttClient = new MQTTClient(brokerUrl, username, password,clientid,topic); mqttClient = new MQTTClient(brokerUrl, username, password,clientid,topic);
mqttClient.connect(); mqttClient.connect();
} }
@ -53,13 +53,7 @@ public class GZYMQTTForwarder extends Forwarder {
@Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次
private void forwardGnss() { private void forwardGnss() {
logger.info("gzy mqtt forwardGnss"); logger.info("gzy mqtt forwardGnss");
forwardCurrentGnss(FORWARDER_NAME); forwardCurrentGnss();
}
@Scheduled(cron = "0 40 * * * ?") // 每小时的40分钟执行一次
//@Scheduled(cron = "0 0/20 * * * ?") // 每20分钟执行一次
private void forwardHistoryGnss() {
forwardHistoryGnss(FORWARDER_NAME);
} }
@Override @Override

View File

@ -44,7 +44,7 @@ public class KingMaForwarder extends Forwarder{
@PostConstruct @PostConstruct
void registerMe(){ void registerMe(){
init(FORWARDER_NAME, data_host,3,true); init(FORWARDER_NAME, data_host,3,true,60);
} }
/** /**
* 每半小时转发GNSS解算结果 * 每半小时转发GNSS解算结果
@ -52,13 +52,7 @@ public class KingMaForwarder extends Forwarder{
@Scheduled(cron = "0 0 0/1 * * ?") // 每小时执行一次 @Scheduled(cron = "0 0 0/1 * * ?") // 每小时执行一次
private void forwardGnss() { private void forwardGnss() {
logger.info("kingma forwardGnss"); logger.info("kingma forwardGnss");
forwardCurrentGnss(FORWARDER_NAME); forwardCurrentGnss();
}
@Scheduled(cron = "0 40 * * * ?") // 每小时的40分钟执行一次
//@Scheduled(cron = "0 0/20 * * * ?") // 每20分钟执行一次
private void forwardHistoryGnss() {
forwardHistoryGnss(FORWARDER_NAME);
} }
boolean updateToken() throws Exception{ boolean updateToken() throws Exception{

View File

@ -33,7 +33,7 @@ public class ZNYForwarder extends Forwarder{
@PostConstruct @PostConstruct
void registerMe(){ void registerMe(){
init(FORWARDER_NAME, data_host,4,true); init(FORWARDER_NAME, data_host,4,true,30);
} }
/** /**
* 每半小时转发GNSS解算结果 * 每半小时转发GNSS解算结果
@ -41,13 +41,7 @@ public class ZNYForwarder extends Forwarder{
@Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次
private void forwardGnss() { private void forwardGnss() {
logger.info("zny forwardGnss"); logger.info("zny forwardGnss");
forwardCurrentGnss(FORWARDER_NAME); forwardCurrentGnss();
}
@Scheduled(cron = "0 40 * * * ?") // 每小时的40分钟执行一次
//@Scheduled(cron = "0 0/20 * * * ?") // 每20分钟执行一次
private void forwardHistoryGnss() {
forwardHistoryGnss(FORWARDER_NAME);
} }
@Override @Override

View File

@ -24,14 +24,14 @@ public class MultiLineGNSSCalcService {
} }
private static final Logger logger = LoggerFactory.getLogger(SingleLineGNSSCalcService.class); private static final Logger logger = LoggerFactory.getLogger(SingleLineGNSSCalcService.class);
private static final Map<String, D342Time> deviceMap = new ConcurrentHashMap<>(); private static final Map<String, D342Time> deviceMap = new ConcurrentHashMap<>();
private static final Map<String, FwdRecord> fwdRecordMap = new ConcurrentHashMap<>(); private static final Map<String, ResendRecord> fwdRecordMap = new ConcurrentHashMap<>();
@Autowired @Autowired
SingleLineGNSSCalcService calcService; SingleLineGNSSCalcService calcService;
@Autowired @Autowired
GNSSCalcFilterService gnssCalcFilterService; GNSSCalcFilterService gnssCalcFilterService;
@Autowired @Autowired
private FwdRecordMapper fwdRecordMapper; private ResendRecordMapper resendRecordMapper;
@Autowired @Autowired
private BeidouClient beidouClient; private BeidouClient beidouClient;
@Autowired @Autowired
@ -98,11 +98,10 @@ public class MultiLineGNSSCalcService {
// 重算最近的 // 重算最近的
lastDate = gnssCalcFilterService.updateRpos(deviceId,lastDate); lastDate = gnssCalcFilterService.updateRpos(deviceId,lastDate);
// 记录转发表更新为upload done // 记录转发表更新为upload done
FwdRecord fwdRecord = fwdRecordMap.get(deviceId); ResendRecord fwdRecord = fwdRecordMap.get(deviceId);
if(fwdRecord != null){ if(fwdRecord != null){
fwdRecord.setEndtime(lastDate); fwdRecord.setEndtime(lastDate);
fwdRecord.setState(FwdRecord.STATE_UPLOAD_DONE); resendRecordMapper.insert(fwdRecord);
fwdRecordMapper.insert(fwdRecord);
fwdRecordMap.remove(deviceId); fwdRecordMap.remove(deviceId);
} }
// 移除记录发完成指示更新设备状态 // 移除记录发完成指示更新设备状态
@ -122,13 +121,12 @@ public class MultiLineGNSSCalcService {
d342Message.getFwdId().length() ==0 || d342Message.getFwdId().length() ==0 ||
d342Message.getFwdId().equals(GnssGroupFwd.FWD_TYPE_NONE)) return; d342Message.getFwdId().equals(GnssGroupFwd.FWD_TYPE_NONE)) return;
FwdRecord fwdRecord = new FwdRecord(); ResendRecord fwdRecord = new ResendRecord();
fwdRecord.setDeviceid(deviceId); fwdRecord.setDeviceid(deviceId);
fwdRecord.setTenantid(d342Message.getTenantId()); fwdRecord.setTenantid(d342Message.getTenantId());
fwdRecord.setProject_id(d342Message.getProjectId()); fwdRecord.setProjectid(d342Message.getProjectId());
fwdRecord.setState(FwdRecord.STATE_UPLOADING); fwdRecord.setCreatetime(LocalDateTime.now());
fwdRecord.setStarttime(d342Message.getOriginalTime()); fwdRecord.setStarttime(d342Message.getOriginalTime());
fwdRecord.setDevicenum((short) 1);
fwdRecord.setFwd_group_id(d342Message.getFwdId()); fwdRecord.setFwd_group_id(d342Message.getFwdId());
fwdRecordMap.put(deviceId, fwdRecord); fwdRecordMap.put(deviceId, fwdRecord);
} }

View File

@ -99,6 +99,7 @@ public class GnssDeviceController extends BasicController{
if(tenantId != null && tenantId != Tenant.SAAS_PROVIDER_ID) { if(tenantId != null && tenantId != Tenant.SAAS_PROVIDER_ID) {
queryWrapper.eq("tenantid", tenantId); queryWrapper.eq("tenantid", tenantId);
} }
queryWrapper.orderByAsc("deviceid");
// 条件查询 // 条件查询
if(searchParams != null) { if(searchParams != null) {

View File

@ -1,11 +1,10 @@
package com.imdroid.beidou.controller; package com.imdroid.beidou.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.imdroid.beidou.auth.SessionUtils; import com.imdroid.beidou.service.CommonExcelService;
import com.imdroid.beidou.entity.Tenant;
import com.imdroid.secapi.dto.*; import com.imdroid.secapi.dto.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
@ -13,9 +12,10 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.util.List;
@Controller @Controller
public class GnssFwdController extends BasicController{ public class GnssFwdController extends BasicController implements CommonExcelService<FwdRecord, FwdRecord> {
@Autowired @Autowired
GnssGroupFwdMapper gnssGroupFwdMapper; GnssGroupFwdMapper gnssGroupFwdMapper;
@Autowired @Autowired
@ -31,10 +31,14 @@ public class GnssFwdController extends BasicController{
@RequestMapping("/page/fwd_records") @RequestMapping("/page/fwd_records")
public String fwdRecords(Model m, HttpSession session) { public String fwdRecords(Model m, HttpSession session) {
initModel(m, session); initModel(m, session);
//以下用于下拉框数据
List<GnssGroupFwd> gnssGroupFwds = gnssGroupFwdMapper.selectList(null);
m.addAttribute("gnss_group_fwd_list", gnssGroupFwds);
return "/page/fwd_records"; return "/page/fwd_records";
} }
/********* 基本参数组 *********/ /********* 推送数据 *********/
@RequestMapping("/fwd/agents") @RequestMapping("/fwd/agents")
@ResponseBody @ResponseBody
public JSONObject listAgents(int page, int limit) { public JSONObject listAgents(int page, int limit) {
@ -51,21 +55,27 @@ public class GnssFwdController extends BasicController{
@RequestMapping("/fwd/records") @RequestMapping("/fwd/records")
@ResponseBody @ResponseBody
public JSONObject listRecords(HttpSession session, int page, int limit) { public JSONObject listRecords(HttpSession session, Integer page, Integer limit, String searchParams) {
Page<FwdRecord> pageable = new Page<>(page, limit); return this.pageList(session, page, limit, searchParams);
QueryWrapper<FwdRecord> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("starttime");
Integer tenantId = (Integer) session.getAttribute(SessionUtils.SESSION_TENANT_ID);
if (tenantId != null && tenantId != Tenant.SAAS_PROVIDER_ID) {
queryWrapper.eq("tenantid", tenantId);
} }
IPage<FwdRecord> cs = fwdRecordMapper.selectPage(pageable, queryWrapper);
JSONObject jsonObject = new JSONObject(); /**
jsonObject.put("code", 0); * 获取实体类的class
jsonObject.put("msg", ""); *
jsonObject.put("count", cs.getTotal()); * @return 实体类的class
jsonObject.put("data", cs.getRecords()); */
return jsonObject; @Override
public Class<FwdRecord> getEntityClass() {
return FwdRecord.class;
}
/**
* 获取实体类对应的mybatis mapper
*
* @return 实体类对应的mybatis mapper
*/
@Override
public BaseMapper<FwdRecord> getMapper() {
return fwdRecordMapper;
} }
} }

View File

@ -0,0 +1,60 @@
package com.imdroid.beidou.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.imdroid.beidou.service.CommonExcelService;
import com.imdroid.secapi.dto.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpSession;
import java.util.List;
@Controller
public class GnssResendController extends BasicController implements CommonExcelService<ResendRecord, ResendRecord> {
@Autowired
GnssGroupFwdMapper gnssGroupFwdMapper;
@Autowired
ResendRecordMapper resendRecordMapper;
/********* 推送页面 *********/
@RequestMapping("/page/resend_records")
public String fwdRecords(Model m, HttpSession session) {
initModel(m, session);
//以下用于下拉框数据
List<GnssGroupFwd> gnssGroupFwds = gnssGroupFwdMapper.selectList(null);
m.addAttribute("gnss_group_fwd_list", gnssGroupFwds);
return "/page/resend_records";
}
/********* 推送数据 *********/
@RequestMapping("/fwd/resend_records")
@ResponseBody
public JSONObject listRecords(HttpSession session, Integer page, Integer limit, String searchParams) {
return this.pageList(session, page, limit, searchParams);
}
/**
* 获取实体类的class
*
* @return 实体类的class
*/
@Override
public Class<ResendRecord> getEntityClass() {
return ResendRecord.class;
}
/**
* 获取实体类对应的mybatis mapper
*
* @return 实体类对应的mybatis mapper
*/
@Override
public BaseMapper<ResendRecord> getMapper() {
return resendRecordMapper;
}
}

View File

@ -49,6 +49,7 @@ CREATE TABLE IF NOT EXISTS `gnssdevices` (
`devicetype` smallint DEFAULT 0, `devicetype` smallint DEFAULT 0,
`tenantname` varchar(100) NOT NULL, `tenantname` varchar(100) NOT NULL,
`project_id` varchar(64) DEFAULT NULL COMMENT '项目id', `project_id` varchar(64) DEFAULT NULL COMMENT '项目id',
`project2_id` varchar(64) DEFAULT NULL COMMENT '项目2id',
`group_id` int DEFAULT 1, `group_id` int DEFAULT 1,
`calc_group_id` int DEFAULT 1, `calc_group_id` int DEFAULT 1,
`fwd_group_id` varchar(64) DEFAULT NULL, `fwd_group_id` varchar(64) DEFAULT NULL,
@ -246,16 +247,27 @@ CREATE TABLE IF NOT EXISTS `warningcfg` (
CREATE TABLE IF NOT EXISTS `fwdrecords` ( CREATE TABLE IF NOT EXISTS `fwdrecords` (
`id` bigint AUTO_INCREMENT, `id` bigint AUTO_INCREMENT,
`tenantid` int NOT NULL, `tenantid` int NOT NULL,
`project_id` varchar(64) DEFAULT NULL COMMENT '项目id', `projectid` varchar(64) DEFAULT NULL COMMENT '项目id',
`devicenum` smallint NOT NULL, `devicenum` smallint NOT NULL,
`deviceid` varchar(20) DEFAULT NULL, `deviceid` varchar(20) DEFAULT NULL,
`starttime` datetime DEFAULT NULL, `createtime` datetime DEFAULT NULL,
`endtime` datetime DEFAULT NULL, `recordtime` datetime DEFAULT NULL,
`state` smallint DEFAULT 0, `result` smallint DEFAULT 0,
`fwd_group_id` varchar(64) DEFAULT NULL, `fwd_group_id` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `resendrecords` (
`id` bigint AUTO_INCREMENT,
`tenantid` int NOT NULL,
`projectid` varchar(64) DEFAULT NULL COMMENT '项目id',
`deviceid` varchar(20) DEFAULT NULL,
`createtime` datetime DEFAULT NULL,
`starttime` datetime DEFAULT NULL,
`endtime` datetime DEFAULT NULL,
`fwd_group_id` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*** /***
*/ */

View File

@ -122,6 +122,12 @@
"href": "page/fwd_records", "href": "page/fwd_records",
"icon": "fa fa-minus", "icon": "fa fa-minus",
"target": "_self" "target": "_self"
},
{
"title": "等待推送",
"href": "page/resend_records",
"icon": "fa fa-minus",
"target": "_self"
} }
] ]
} }

View File

@ -34,7 +34,7 @@
{field: 'description', title: '描述'}, {field: 'description', title: '描述'},
{field: 'updatetime', title: '更新时间', templet: "<div>{{layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}</div>"}, {field: 'updatetime', title: '更新时间', templet: "<div>{{layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'fwd_device_num', title: '推送设备数'}, {field: 'fwd_device_num', title: '推送设备数'},
{field: 'result', title: '推送结果',templet: '#resultTrans'} {field: 'result', title: '推送结果',templet: "<div>{{d.result==1?'成功':'失败'}}</div>"}
]], ]],
limit: 10, limit: 10,
page: true, page: true,
@ -44,13 +44,6 @@
}); });
</script> </script>
<script type="text/html" id="resultTrans">
{{# if(d.syn == 0){ }}
<span class="layui-badge layui-bg-orange">失败</span>
{{# } else { }}
<span class="layui-badge layui-bg-green">成功</span>
{{# } }}
</script>
</body> </body>
</html> </html>

View File

@ -12,6 +12,56 @@
<body> <body>
<div class="layuimini-container"> <div class="layuimini-container">
<div class="layuimini-main"> <div class="layuimini-main">
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="" id="searchFrm">
<div class="layui-form-item">
<div class="layui-inline" th:if="${tenant_id==0}">
<label class="layui-form-label">推送组</label>
<div class="layui-input-inline">
<select name="sl_fwd_group_id" id="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>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">推送时间</label>
<div class="layui-input-inline">
<input type="text" name="dgt_createtime" autocomplete="off" id="ID-laydate-start-date1" class="layui-input" placeholder="开始日期">
</div>
<div class="layui-input-inline">
<input type="text" name="dlt_createtime" autocomplete="off" id="ID-laydate-end-date1" class="layui-input" placeholder="结束日期">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">数据时间</label>
<div class="layui-input-inline">
<input type="text" name="dgt_recordtime" autocomplete="off" id="ID-laydate-start-date2" class="layui-input" placeholder="开始日期">
</div>
<div class="layui-input-inline">
<input type="text" name="dlt_recordtime" autocomplete="off" id="ID-laydate-end-date2" class="layui-input" placeholder="结束日期">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">推送结果</label>
<div class="layui-input-inline">
<select name="n_result" id="result" lay-search="">
<option value="">全部</option>
<option value="1">成功</option>
<option value="0">失败</option>
</select>
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button>
</div>
</div>
</form>
</div>
</fieldset>
<table class="layui-hide" id="forwardParaTableId" lay-filter="forwardParaTableFilter"></table> <table class="layui-hide" id="forwardParaTableId" lay-filter="forwardParaTableFilter"></table>
</div> </div>
@ -21,8 +71,25 @@
layui.use(['form', 'table'], function () { layui.use(['form', 'table'], function () {
var $ = layui.$, var $ = layui.$,
form = layui.form, form = layui.form,
table = layui.table; table = layui.table,
laydate = layui.laydate;
laydate.render({
elem: '#ID-laydate-start-date1',
type: 'datetime'
});
laydate.render({
elem: '#ID-laydate-end-date1',
type: 'datetime'
});
laydate.render({
elem: '#ID-laydate-start-date2',
type: 'datetime'
});
laydate.render({
elem: '#ID-laydate-end-date2',
type: 'datetime'
});
/** /**
** 推送参数组 ** 推送参数组
**/ **/
@ -35,32 +102,35 @@
{field: 'project_id', title: '项目号', sort: true}, {field: 'project_id', title: '项目号', sort: true},
{field: 'devicenum', title: '推送设备数'}, {field: 'devicenum', title: '推送设备数'},
{field: 'deviceid', title: '设备号'}, {field: 'deviceid', title: '设备号'},
{field: 'starttime', title: '起始时间', templet: "<div>{{layui.util.toDateString(d.starttime, 'yyyy-MM-dd HH:mm:ss')}}</div>"}, {field: 'createtime', title: '推送时间', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'endtime', title: '结束时间', templet: "<div>{{layui.util.toDateString(d.endtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"}, {field: 'recordtime', title: '数据时间', templet: "<div>{{layui.util.toDateString(d.recordtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'fwd_group_id', title: '推送组'}, {field: 'fwd_group_id', title: '推送组'},
{field: 'state', title: '状态',templet: '#stateTrans'} {field: 'result', title: '状态',templet: "<div>{{d.result==1?'成功':'失败'}}</div>"}
]], ]],
limit: 10, limit: 10,
page: true, page: true,
skin: 'line' skin: 'line'
}); });
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
var result = JSON.stringify(data.field);
//执行搜索重载
table.reload('forwardParaTableId', {
page: {
curr: 1
}
, where: {
searchParams: result
}
}, 'data');
return false;
});
}); });
</script> </script>
<script type="text/html" id="stateTrans">
{{# if(d.state == 0){ }}
<span>推送完成</span>
{{# } else if(d.state == 2){ }}
<span>补传中</span>
{{# } else if(d.state == 3){ }}
<span>补传完成</span>
{{# } else if(d.state == -1){ }}
<span>推送失败</span>
{{# } else { }}
<span >等待</span>
{{# } }}
</script>
</body> </body>
</html> </html>

View File

@ -88,11 +88,11 @@
{field: 'deviceid', title: '设备号', sort: true}, {field: 'deviceid', title: '设备号', sort: true},
{field: 'name', title: '设备名称'}, {field: 'name', title: '设备名称'},
{field: 'devicetype', title: '类型',templet: '#typeTrans'}, {field: 'devicetype', title: '类型',templet: '#typeTrans'},
{field: 'parentid', title: '父设备号'}, {field: 'parentid', title: '父设备号', sort: true},
{field: 'tenantname', title: '所属组织'}, {field: 'tenantname', title: '所属组织'},
{field: 'project_id', title: '项目号'}, {field: 'project_id', title: '项目号', sort: true},
{field: 'group_id', title: '基本参数组'}, {field: 'group_id', title: '基本参数组', sort: true},
{field: 'calc_group_id', title: '解算参数组'}, {field: 'calc_group_id', title: '解算参数组', sort: true},
{field: 'fwd_group_id', title: '推送组'}, {field: 'fwd_group_id', title: '推送组'},
{field: 'fwd_group_id2', title: '推送2'}, {field: 'fwd_group_id2', title: '推送2'},
{field: 'opmode', title: '使用状态',templet: '#modeTrans'}, {field: 'opmode', title: '使用状态',templet: '#modeTrans'},

View File

@ -0,0 +1,125 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>等待推送</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="../lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="" id="searchFrm">
<div class="layui-form-item">
<div class="layui-inline" th:if="${tenant_id==0}">
<label class="layui-form-label">推送组</label>
<div class="layui-input-inline">
<select name="sl_fwd_group_id" id="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>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">创建时间</label>
<div class="layui-input-inline">
<input type="text" name="dgt_createtime" autocomplete="off" id="ID-laydate-start-date1" class="layui-input" placeholder="开始日期">
</div>
<div class="layui-input-inline">
<input type="text" name="dlt_createtime" autocomplete="off" id="ID-laydate-end-date1" class="layui-input" placeholder="结束日期">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">数据时间</label>
<div class="layui-input-inline">
<input type="text" name="dgt_begintime" autocomplete="off" id="ID-laydate-start-date2" class="layui-input" placeholder="开始日期">
</div>
<div class="layui-input-inline">
<input type="text" name="dgt_begintime" autocomplete="off" id="ID-laydate-end-date2" class="layui-input" placeholder="结束日期">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button>
</div>
</div>
</form>
</div>
</fieldset>
<table class="layui-hide" id="forwardParaTableId" lay-filter="forwardParaTableFilter"></table>
</div>
</div>
<script src="../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script th:inline="none">
layui.use(['form', 'table'], function () {
var $ = layui.$,
form = layui.form,
table = layui.table,
laydate = layui.laydate;
laydate.render({
elem: '#ID-laydate-start-date1',
type: 'datetime'
});
laydate.render({
elem: '#ID-laydate-end-date1',
type: 'datetime'
});
laydate.render({
elem: '#ID-laydate-start-date2',
type: 'datetime'
});
laydate.render({
elem: '#ID-laydate-end-date2',
type: 'datetime'
});
/**
** 推送参数组
**/
table.render({
elem: '#forwardParaTableId',
url: '/fwd/resend_records',
toolbar: '#toolbarTable',
defaultToolbar: ['filter'],
cols: [[
{field: 'project_id', title: '项目号', sort: true},
{field: 'deviceid', title: '设备号'},
{field: 'createtime', title: '推送时间', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'starttime', title: '开始时间', templet: "<div>{{layui.util.toDateString(d.starttime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'endtime', title: '结束时间', templet: "<div>{{layui.util.toDateString(d.endtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'fwd_group_id', title: '推送组'}
]],
limit: 10,
page: true,
skin: 'line'
});
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
var result = JSON.stringify(data.field);
//执行搜索重载
table.reload('forwardParaTableId', {
page: {
curr: 1
}
, where: {
searchParams: result
}
}, 'data');
return false;
});
});
</script>
</body>
</html>

View File

@ -83,6 +83,12 @@
<input type="text" name="project_id" id="project_id" placeholder="请输入项目编号" value="" class="layui-input"> <input type="text" name="project_id" id="project_id" placeholder="请输入项目编号" value="" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-inline">
<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">
</div>
</div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-inline"> <div class="layui-inline">
@ -216,6 +222,7 @@
$('#parentid').val(data.parentid); $('#parentid').val(data.parentid);
$('#tenantname').val(data.tenantname); $('#tenantname').val(data.tenantname);
$('#project_id').val(data.project_id); $('#project_id').val(data.project_id);
$('#project2_id').val(data.project2_id);
$('#group_id').val(data.group_id); $('#group_id').val(data.group_id);
$('#calc_group_id').val(data.calc_group_id); $('#calc_group_id').val(data.calc_group_id);
$('#fwd_group_id').val(data.fwd_group_id); $('#fwd_group_id').val(data.fwd_group_id);