diff --git a/sec-beidou-fwd/pom.xml b/sec-beidou-fwd/pom.xml index a060a409..346565cb 100644 --- a/sec-beidou-fwd/pom.xml +++ b/sec-beidou-fwd/pom.xml @@ -119,11 +119,10 @@ lombok true - - org.ejml - ejml-all - 0.41 + com.alibaba + fastjson + 1.2.76 diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/entity/KingMaData.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/entity/KingMaData.java new file mode 100644 index 00000000..0951d1bf --- /dev/null +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/entity/KingMaData.java @@ -0,0 +1,46 @@ +package com.imdroid.beidou_fwd.entity; + +import lombok.Data; + +/** + * @author Layton + * @date 2023/2/19 9:16 + */ +@Data +public class KingMaData { + String dataTime; + String deviceId; + Integer flag; + String projectId; + + Phys phys; + + @lombok.Data + public static class Data { + private String sign; + + private String unit; + + private Double value; + + public Data(String sign, String unit, Double value) { + this.sign = sign; + this.unit = unit; + this.value = value; + } + } + + @lombok.Data + public static class Phys{ + Data data1; + Data data2; + Data data3; + + public Phys(Double e, Double n, Double d){ + data1 = new Data("data1","mm",e); + data2 = new Data("data2","mm",n); + data3 = new Data("data3","mm",d); + } + } + +} diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/HTTPClient.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/HTTPClient.java deleted file mode 100644 index 7f00b21f..00000000 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/service/HTTPClient.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.imdroid.beidou_fwd.service; - -public class HTTPClient { -} diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java index 51b95377..66bfff4a 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java @@ -1,19 +1,35 @@ package com.imdroid.beidou_fwd.task; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.imdroid.secapi.dto.GnssGroupFwd; -import com.imdroid.secapi.dto.GnssGroupFwdMapper; +import com.imdroid.secapi.dto.*; +import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class Forwarder { String name; String description; + + @Autowired + private GnssDeviceMapper deviceMapper; + + @Autowired + private GnssCalcDataMapper gnssDataMapper; + + @Autowired + private FwdRecordMapper fwdRecordsMapper; + + @Autowired GnssGroupFwdMapper fwdMapper; - void init(String name, String desc, GnssGroupFwdMapper fwdMapper){ + + void init(String name, String desc){ this.name = name; this.description = desc; - this.fwdMapper = fwdMapper; QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name",name); GnssGroupFwd gnssGroupFwd = fwdMapper.selectOne(queryWrapper); @@ -30,6 +46,110 @@ public class Forwarder { } } + void forwardCurrentGnss(String fwdGroupId) { + LocalDateTime nowTime = LocalDateTime.now(); + ConcurrentHashMap> projects = new ConcurrentHashMap<>(); + + // 转发数据 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String sendAfterTime = nowTime.minusMinutes(30).format(formatter); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("fwd_group_id", fwdGroupId); + List gnssDeviceList = deviceMapper.selectList(queryWrapper); + List recordsToSend; + for(GnssDevice device:gnssDeviceList){ + String projectId = device.getProject_id(); + if(projectId == null) continue; + + recordsToSend = projects.get(projectId); + if(recordsToSend == null){ + recordsToSend = new ArrayList<>(); + projects.put(projectId,recordsToSend); + } + QueryWrapper gnssQueryWrapper = new QueryWrapper<>(); + gnssQueryWrapper.eq("deviceid",device.getDeviceid()); + gnssQueryWrapper.ge("createtime",sendAfterTime); + gnssQueryWrapper.orderByDesc("createtime"); + List records = gnssDataMapper.selectList(gnssQueryWrapper); + for(GnssCalcData record:records) { + if (record.getEnabled()) { + recordsToSend.add(record); + break; + } + } + } + + // 按项目打包推送 + int totalSendNum = 0; + for (Map.Entry> entry: projects.entrySet()){ + int sendNum = send(entry.getKey(), entry.getValue()); + + if(sendNum > 0) { + totalSendNum += sendNum; + // 记录推送 + FwdRecord fwdRecord = new FwdRecord(); + fwdRecord.setProject_id(entry.getKey()); + fwdRecord.setTenantid(1); + fwdRecord.setDevicenum((short) entry.getValue().size()); + fwdRecord.setStarttime(nowTime); + fwdRecord.setState(FwdRecord.STATE_FWD_DONE); + fwdRecord.setFwd_group_id(fwdGroupId); + fwdRecordsMapper.insert(fwdRecord); + } + } + + // 更新推送信息 + if(totalSendNum>0) updateFwd(totalSendNum, true); + + } + + void forwardHistoryGnss(String fwdGroupId) { + // 1.从转发记录表里检索待补传记录时间表,含设备Id,时间段 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("fwd_group_id",fwdGroupId); + queryWrapper.eq("state",FwdRecord.STATE_UPLOAD_DONE); + List fwdRecordsList = fwdRecordsMapper.selectList(queryWrapper); + // 2.检索这个这个时间段的解算结果,如果有数据则单个终端转发,标志记录为已补传 + for(FwdRecord fwdRecord:fwdRecordsList){ + QueryWrapper calcDataQueryWrapper = new QueryWrapper<>(); + calcDataQueryWrapper.eq("deviceid", fwdRecord.getDeviceid()); + calcDataQueryWrapper.ge("createtime", fwdRecord.getStarttime()); + calcDataQueryWrapper.le("createtime", fwdRecord.getEndtime()); + calcDataQueryWrapper.orderByAsc("createtime"); + List calcDataList = gnssDataMapper.selectList(calcDataQueryWrapper); + // 推送记录 + sendBatch(fwdRecord.getProject_id(),calcDataList); + // 记录推送结果 + fwdRecord.setState(FwdRecord.STATE_FWD_DONE); + fwdRecordsMapper.updateById(fwdRecord); + } + } + + void sendBatch(String projectId, List records){ + if(records.size() == 0) return; + + LocalDateTime lastTime = records.get(0).getCreatetime(); + + for(GnssCalcData calcData:records){ + if(calcData.getEnabled() && + calcData.getCreatetime().isAfter(lastTime.plusMinutes(28))){ + // 推送 + lastTime = calcData.getCreatetime(); + } + else{ + calcData.setEnabled(false);//借用来表示不推送,不会保存到数据库 + } + } + + send(projectId, records); + + } + + int send(String projectId, List records) { + return 0; + } + void updateFwd(int fwd_num, boolean isFwdOK){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name",name); diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java index 3557dccf..364b45aa 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfzForwarder.java @@ -1,6 +1,5 @@ package com.imdroid.beidou_fwd.task; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.imdroid.beidou_fwd.entity.XFZData; import com.imdroid.beidou_fwd.service.TCPClient; import com.imdroid.common.util.GsonUtil; @@ -16,12 +15,9 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; -import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @Component @Configuration @@ -29,30 +25,20 @@ import java.util.concurrent.ConcurrentHashMap; public class GXXfzForwarder extends Forwarder{ private final Logger logger = LoggerFactory.getLogger(GXXfzForwarder.class); - static final String forwarderName = "广西新发展"; + static final String FORWARDER_NAME = "广西新发展"; @Value("${xfz.server.host}") private String host; @Value("${xfz.server.port}") private int port; - @Autowired - private GnssDeviceMapper deviceMapper; - - @Autowired - private GnssCalcDataMapper gnssDataMapper; private TCPClient xfzTcpClient; - @Autowired - private FwdRecordMapper fwdRecordsMapper; final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - @Autowired - private GnssGroupFwdMapper fwdMapper; - @PostConstruct void registerMe(){ - init(forwarderName, "TCP "+host+":"+port, fwdMapper); + init(FORWARDER_NAME, "TCP "+host+":"+port); } /** * 每半小时转发GNSS解算结果 @@ -66,91 +52,22 @@ public class GXXfzForwarder extends Forwarder{ xfzTcpClient.init(host, port); xfzTcpClient.start(); } - forwardGnssToXFZ(forwarderName); + forwardCurrentGnss(FORWARDER_NAME); } @Scheduled(cron = "0 40 * * * ?") // 每小时的40分钟执行一次 //@Scheduled(cron = "0 0/20 * * * ?") // 每20分钟执行一次 private void forwardHistoryGnss() { - // 1.从转发记录表里检索待补传记录时间表,含设备Id,时间段 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("fwd_group_id",forwarderName); - queryWrapper.eq("state",FwdRecord.STATE_UPLOAD_DONE); - List fwdRecordsList = fwdRecordsMapper.selectList(queryWrapper); - // 2.检索这个这个时间段的解算结果,如果有数据则单个终端转发,标志记录为已补传 - for(FwdRecord fwdRecord:fwdRecordsList){ - QueryWrapper calcDataQueryWrapper = new QueryWrapper<>(); - calcDataQueryWrapper.eq("deviceid", fwdRecord.getDeviceid()); - calcDataQueryWrapper.ge("createtime", fwdRecord.getStarttime()); - calcDataQueryWrapper.le("createtime", fwdRecord.getEndtime()); - calcDataQueryWrapper.orderByAsc("createtime"); - List calcDataList = gnssDataMapper.selectList(calcDataQueryWrapper); - // 推送记录 - BatchToXFZ(fwdRecord.getProject_id(),calcDataList); - // 记录推送结果 - fwdRecord.setState(FwdRecord.STATE_FWD_DONE); - fwdRecordsMapper.updateById(fwdRecord); + if(xfzTcpClient == null){ + xfzTcpClient = new TCPClient(); + xfzTcpClient.init(host, port); + xfzTcpClient.start(); } + forwardHistoryGnss(FORWARDER_NAME); } - private void forwardGnssToXFZ(String fwdGroupId) { - LocalDateTime nowTime = LocalDateTime.now(); - ConcurrentHashMap> projects = new ConcurrentHashMap<>(); - - // 转发新发展数据 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - String sendAfterTime = nowTime.minusMinutes(30).format(formatter); - - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("fwd_group_id", fwdGroupId); - List gnssDeviceList = deviceMapper.selectList(queryWrapper); - List recordsToSend; - for(GnssDevice device:gnssDeviceList){ - String projectId = device.getProject_id(); - if(projectId == null) continue; - - recordsToSend = projects.get(projectId); - if(recordsToSend == null){ - recordsToSend = new ArrayList<>(); - projects.put(projectId,recordsToSend); - } - QueryWrapper gnssQueryWrapper = new QueryWrapper<>(); - gnssQueryWrapper.eq("deviceid",device.getDeviceid()); - gnssQueryWrapper.ge("createtime",sendAfterTime); - gnssQueryWrapper.orderByDesc("createtime"); - List records = gnssDataMapper.selectList(gnssQueryWrapper); - for(GnssCalcData record:records) { - if (record.getEnabled()) { - recordsToSend.add(record); - break; - } - } - } - - // 按项目打包推送 - int totalSendNum = 0; - for (Map.Entry> entry: projects.entrySet()){ - int sendNum = SendToXFZ(entry.getKey(), entry.getValue()); - - if(sendNum > 0) { - totalSendNum += sendNum; - // 记录推送 - FwdRecord fwdRecord = new FwdRecord(); - fwdRecord.setProject_id(entry.getKey()); - fwdRecord.setTenantid(1); - fwdRecord.setDevicenum((short) entry.getValue().size()); - fwdRecord.setStarttime(nowTime); - fwdRecord.setState(FwdRecord.STATE_FWD_DONE); - fwdRecordsMapper.insert(fwdRecord); - } - } - - // 更新推送信息 - if(totalSendNum>0) updateFwd(totalSendNum, true); - - } - - int SendToXFZ(String projectId, List records){ + @Override + int send(String projectId, List records){ int sendNum = 0; if(records.size() == 0) return 0; @@ -181,24 +98,4 @@ public class GXXfzForwarder extends Forwarder{ return sendNum; } - void BatchToXFZ(String projectId, List records){ - if(records.size() == 0) return; - - LocalDateTime lastTime = records.get(0).getCreatetime(); - - for(GnssCalcData calcData:records){ - if(calcData.getEnabled() && - calcData.getCreatetime().isAfter(lastTime.plusMinutes(28))){ - // 推送 - lastTime = calcData.getCreatetime(); - } - else{ - calcData.setEnabled(false);//借用来表示不推送,不会保存到数据库 - } - } - - SendToXFZ(projectId, records); - - } - } diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java new file mode 100644 index 00000000..bedbde84 --- /dev/null +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/KingMaForwarder.java @@ -0,0 +1,122 @@ +package com.imdroid.beidou_fwd.task; + +import com.alibaba.fastjson.JSONObject; +import com.imdroid.beidou_fwd.entity.KingMaData; +import com.imdroid.common.util.GsonUtil; +import com.imdroid.common.util.HttpUtils; +import com.imdroid.secapi.dto.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +@Configuration +@EnableScheduling +public class KingMaForwarder extends Forwarder{ + private final Logger logger = LoggerFactory.getLogger(KingMaForwarder.class); + + static final String FORWARDER_NAME = "KingMa"; + @Value("${kingma.server.login_user}") + private String login_user; + + @Value("${kingma.server.login_pwd}") + private String login_pwd; + + @Value("${kingma.server.login_host}") + private String login_host; + + @Value("${kingma.server.data_host}") + private String data_host; + Map header; + LocalDateTime lastTokenTime = LocalDateTime.now(); + + @PostConstruct + void registerMe(){ + init(FORWARDER_NAME, data_host); + } + /** + * 每半小时转发GNSS解算结果 + */ + @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 + private void forwardGnss() { + forwardCurrentGnss(FORWARDER_NAME); + } + + @Scheduled(cron = "0 40 * * * ?") // 每小时的40分钟执行一次 + //@Scheduled(cron = "0 0/20 * * * ?") // 每20分钟执行一次 + private void forwardHistoryGnss() { + forwardHistoryGnss(FORWARDER_NAME); + } + + boolean updateToken(){ + String jsonLogin = "{\"username\":\""+login_user+"\"," + + "\"password\":\""+login_pwd+"\"}"; + String result = HttpUtils.postJson(login_host, jsonLogin); + if(result == null) return false; + + String token = null; + try { + JSONObject obj = (JSONObject) JSONObject.parse(result); + obj = obj.getJSONObject("data"); + token = obj.getString("token"); + } + catch (Exception e){ + + } + if(token == null) return false; + + if(header == null){ + header = new HashMap<>(); + } + header.put("Authorization", token); + return true; + } + + @Override + int send(String projectId, List records){ + int sendNum = 0; + if(records.size() == 0) return 0; + + // 检查token是否过期 + LocalDateTime nowTime = LocalDateTime.now(); + if(header == null || nowTime.isAfter(lastTokenTime.plusMinutes(59))){ + if(!updateToken()){ + logger.info("update token failed!"); + return 0; + } + lastTokenTime = nowTime; + } + + List dataList = new ArrayList<>(records.size()); + + for(GnssCalcData locationRecord: records) { + if(!locationRecord.getEnabled()) continue; + KingMaData data = new KingMaData(); + data.setDataTime(locationRecord.getCreatetime().toString()); + data.setProjectId(projectId); + data.setDeviceId(locationRecord.getDeviceid()); + data.setFlag(1); + data.setPhys(new KingMaData.Phys(locationRecord.getRb562e(),locationRecord.getRb562n(),locationRecord.getRb562d())); + dataList.add(data); + sendNum++; + } + String json = GsonUtil.toJson(dataList); + String result = HttpUtils.postJson(data_host,header,json); + logger.info("project " + projectId + ": push calculation result to Kingma"); + logger.info(json); + logger.info("result: "+result); + return sendNum; + } + +} diff --git a/sec-beidou-fwd/src/main/resources/application.properties b/sec-beidou-fwd/src/main/resources/application.properties index 3549c813..c5596a33 100644 --- a/sec-beidou-fwd/src/main/resources/application.properties +++ b/sec-beidou-fwd/src/main/resources/application.properties @@ -24,4 +24,9 @@ mybatis-plus.configuration.map-underscore-to-camel-case=false #xfz.server.host = 171.106.48.63 #xfz.server.port = 52000 xfz.server.host = 115.236.153.174 -xfz.server.port = 31035 \ No newline at end of file +xfz.server.port = 31035 + +kingma.server.login_user = ceshi +kingma.server.login_pwd = ceshi!123 +kingma.server.login_host = https://www.everiaction.com/IOT-ADAPTER-CUSTOM/auth/anon/login +kingma.server.data_host = https://www.everiaction.com/IOT-DATA-GATHER/receive/data/formula \ No newline at end of file diff --git a/sec-beidou/src/main/resources/templates/page/fwd_records.html b/sec-beidou/src/main/resources/templates/page/fwd_records.html index c6d8dc45..862a69e3 100644 --- a/sec-beidou/src/main/resources/templates/page/fwd_records.html +++ b/sec-beidou/src/main/resources/templates/page/fwd_records.html @@ -36,9 +36,9 @@ url: '/fwd/records', toolbar: '#toolbarTable', cols: [[ - {field: 'deviceid', title: '设备号', sort: true}, - {field: 'project_id', title: '项目号'}, + {field: 'project_id', title: '项目号', sort: true}, {field: 'devicenum', title: '推送设备数'}, + {field: 'deviceid', title: '设备号'}, {field: 'starttime', title: '起始时间', templet: "
{{layui.util.toDateString(d.starttime, 'yyyy-MM-dd HH:mm:ss')}}
"}, {field: 'endtime', title: '结束时间', templet: "
{{layui.util.toDateString(d.endtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, {field: 'fwd_group_id', title: '推送组'},