get获取数据已完成
This commit is contained in:
commit
5433cf3323
54
app.js
Normal file
54
app.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
var createError = require('http-errors');
|
||||||
|
var express = require('express');
|
||||||
|
var path = require('path');
|
||||||
|
var cookieParser = require('cookie-parser');
|
||||||
|
var logger = require('morgan');
|
||||||
|
|
||||||
|
var missionRouter = require('./routes/Mission');
|
||||||
|
var simuRouter = require('./routes/simu');
|
||||||
|
|
||||||
|
let dataBase = require("./util/dmDB");
|
||||||
|
dataBase.initDB();
|
||||||
|
|
||||||
|
var createServer = require('./controller/socket')
|
||||||
|
|
||||||
|
var app = express();
|
||||||
|
|
||||||
|
// view engine setup
|
||||||
|
app.set('views', path.join(__dirname, 'views'));
|
||||||
|
app.set('view engine', 'jade');
|
||||||
|
|
||||||
|
app.use(logger('dev'));
|
||||||
|
app.use(express.json());
|
||||||
|
app.use(express.urlencoded({ extended: false }));
|
||||||
|
app.use(cookieParser());
|
||||||
|
app.use(express.static(path.join(__dirname, 'public')));
|
||||||
|
|
||||||
|
//设置允许跨域访问该服务.
|
||||||
|
//设置跨域访问
|
||||||
|
app.all('*', function (req, res, next) {
|
||||||
|
res.header("Access-Control-Allow-Origin", "*");
|
||||||
|
res.header("Access-Control-Allow-Headers", "*");
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use('/Mission', missionRouter);
|
||||||
|
app.use('/Simu', simuRouter);
|
||||||
|
|
||||||
|
// catch 404 and forward to error handler
|
||||||
|
app.use(function (req, res, next) {
|
||||||
|
next(createError(404));
|
||||||
|
});
|
||||||
|
|
||||||
|
// error handler
|
||||||
|
app.use(function (err, req, res, next) {
|
||||||
|
// set locals, only providing error in development
|
||||||
|
res.locals.message = err.message;
|
||||||
|
res.locals.error = req.app.get('env') === 'development' ? err : {};
|
||||||
|
|
||||||
|
// render the error page
|
||||||
|
res.status(err.status || 500);
|
||||||
|
res.render('error');
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = app;
|
90
bin/www
Normal file
90
bin/www
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var app = require('../app');
|
||||||
|
var debug = require('debug')('dmserve:server');
|
||||||
|
var http = require('http');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get port from environment and store in Express.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var port = normalizePort(process.env.PORT || '3000');
|
||||||
|
app.set('port', port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create HTTP server.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var server = http.createServer(app);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen on provided port, on all network interfaces.
|
||||||
|
*/
|
||||||
|
|
||||||
|
server.listen(port);
|
||||||
|
server.on('error', onError);
|
||||||
|
server.on('listening', onListening);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize a port into a number, string, or false.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function normalizePort(val) {
|
||||||
|
var port = parseInt(val, 10);
|
||||||
|
|
||||||
|
if (isNaN(port)) {
|
||||||
|
// named pipe
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port >= 0) {
|
||||||
|
// port number
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "error" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onError(error) {
|
||||||
|
if (error.syscall !== 'listen') {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bind = typeof port === 'string'
|
||||||
|
? 'Pipe ' + port
|
||||||
|
: 'Port ' + port;
|
||||||
|
|
||||||
|
// handle specific listen errors with friendly messages
|
||||||
|
switch (error.code) {
|
||||||
|
case 'EACCES':
|
||||||
|
console.error(bind + ' requires elevated privileges');
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
case 'EADDRINUSE':
|
||||||
|
console.error(bind + ' is already in use');
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "listening" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onListening() {
|
||||||
|
var addr = server.address();
|
||||||
|
var bind = typeof addr === 'string'
|
||||||
|
? 'pipe ' + addr
|
||||||
|
: 'port ' + addr.port;
|
||||||
|
debug('Listening on ' + bind);
|
||||||
|
}
|
8
config/db.json
Normal file
8
config/db.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"db_config":{
|
||||||
|
"host" : "192.168.0.105",
|
||||||
|
"port" : "30236",
|
||||||
|
"username" : "SYSDBA",
|
||||||
|
"password" : "SYSDBA_dm001"
|
||||||
|
}
|
||||||
|
}
|
673
controller/Mission.js
Normal file
673
controller/Mission.js
Normal file
@ -0,0 +1,673 @@
|
|||||||
|
const util = require("../util/common");
|
||||||
|
let dataBase = require("../util/dmDB");
|
||||||
|
const moment = require('moment-timezone');
|
||||||
|
var { PlanePoint, entityHJ, simuStatus } = require("../util/variable");
|
||||||
|
|
||||||
|
//加载航空兵数据
|
||||||
|
exports.loadHKBData = (req, res, next) => {
|
||||||
|
simuStatus["参考时间"] = req.query.RQ;
|
||||||
|
|
||||||
|
var params = ["bdid", "jx", "jh", "qc_dh", "zy", "dwjc", "dwdm", "fxsj_ly", "hc_dm", "hc_xm", "txbg_sk", "rwlx"];
|
||||||
|
var whereSql = "RWBS = '" + req.query.RWBS + "' and RQ = '" + req.query.RQ + "' and BC = " + req.query.BC;
|
||||||
|
dataBase.queryTable("kzdk.RW_FXJC", params, whereSql).then(async (data) => {
|
||||||
|
var array = [];
|
||||||
|
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
console.log(result);
|
||||||
|
|
||||||
|
var bdid = result[0];
|
||||||
|
var zy = result[4];
|
||||||
|
var qcdh = result[3];
|
||||||
|
let obj = {};
|
||||||
|
obj["BDID"] = bdid;
|
||||||
|
obj["型号"] = result[1];
|
||||||
|
obj["机号"] = result[2];
|
||||||
|
obj["编号"] = qcdh;
|
||||||
|
obj["阵营"] = zy;
|
||||||
|
obj["单位简称"] = result[5];
|
||||||
|
obj["单位代码"] = result[6];
|
||||||
|
obj["数据来源"] = result[7];
|
||||||
|
obj["后舱代号"] = result[8];
|
||||||
|
obj["后舱姓名"] = result[9];
|
||||||
|
obj["体系摧毁时刻"] = result[10];
|
||||||
|
obj["装备类别"] = "飞机";
|
||||||
|
obj["执行任务"] = result[11];
|
||||||
|
obj["体系摧毁文本信息"] = "体系摧毁时间为:" + moment(result[10]).format('HH:mm:ss');
|
||||||
|
obj["体系摧毁文本颜色"] = "255,0,0,255";
|
||||||
|
|
||||||
|
var hj = await getHjFromDb(obj, bdid, "航迹", 1000, 1, "飞机");
|
||||||
|
if (!hj) {
|
||||||
|
hj = await getHjFromDb(obj, bdid, "航迹", 1000, 0, "飞机");
|
||||||
|
}
|
||||||
|
|
||||||
|
//存入空空攻击事件map
|
||||||
|
var kksjlist = await getKkwqsyList(bdid, "有效", qcdh, zy, req.query.RQ, req.query.RWBS);
|
||||||
|
|
||||||
|
//存入空地攻击事件map
|
||||||
|
var kdsjlist = await getKdwqsyList(bdid, "有效", req.query.RQ);
|
||||||
|
|
||||||
|
//红外弹事件
|
||||||
|
var hwdList = await getGrqkList(bdid, "红外弹", qcdh, req.query.RQ);
|
||||||
|
|
||||||
|
//箔条弹事件
|
||||||
|
var hwdList = await getGrqkList(bdid, "箔条弹", qcdh, req.query.RQ);
|
||||||
|
|
||||||
|
//有源干扰事件
|
||||||
|
var yyList = await getGrqkList(bdid, "有源干扰", qcdh, req.query.RQ);
|
||||||
|
|
||||||
|
//机载雷达事件
|
||||||
|
var ldList = await getGrqkList(bdid, "机载雷达", qcdh, req.query.RQ);
|
||||||
|
|
||||||
|
array.push(obj);
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(util.getReturnData(1, '查询成功', array));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//加载飞机航迹
|
||||||
|
getHjFromDb = async (obj, bdid, sjlx, sjjd, zsj, zblb) => {
|
||||||
|
var params = ["nr"];
|
||||||
|
var whereSql = "jcid = '" + bdid + "' and sjlx = '" + sjlx + "' and sjjd = " + sjjd + " and zsj = " + zsj;
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_fj_sj", params, whereSql);
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
if (result) {
|
||||||
|
var lob = result[0];
|
||||||
|
var buffer = await dataBase.readLob(lob);
|
||||||
|
await lob.close();
|
||||||
|
|
||||||
|
var points = new Map();
|
||||||
|
var size = PlanePoint.length();
|
||||||
|
var count = buffer.length / size;
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
var offset = i * size;
|
||||||
|
const byte = buffer.subarray(offset, offset + size);
|
||||||
|
PlanePoint.setBuffer(byte);
|
||||||
|
|
||||||
|
let pt = {};
|
||||||
|
pt["iNum"] = PlanePoint.get('iNum');
|
||||||
|
pt["iRelTime"] = PlanePoint.get('iRelTime');
|
||||||
|
pt["空速"] = PlanePoint.get('dAirspeed');
|
||||||
|
pt["升降率"] = PlanePoint.get('dSjl');
|
||||||
|
pt["过载"] = PlanePoint.get('dOverload');
|
||||||
|
pt["马赫数"] = PlanePoint.get('dMach');
|
||||||
|
pt["经度"] = PlanePoint.get('dLongitude');
|
||||||
|
pt["纬度"] = PlanePoint.get('dLatitude');
|
||||||
|
pt["海拔"] = PlanePoint.get('dAlitidude');
|
||||||
|
pt["航向角"] = PlanePoint.get('dHxj');
|
||||||
|
pt["俯仰角"] = PlanePoint.get('dFyj');
|
||||||
|
pt["倾斜角"] = PlanePoint.get('dQxj');
|
||||||
|
|
||||||
|
if (zblb == "飞机") {
|
||||||
|
if (i == 0) {
|
||||||
|
obj["经度"] = PlanePoint.get('dLongitude');
|
||||||
|
obj["纬度"] = PlanePoint.get('dLatitude');
|
||||||
|
obj["海拔"] = PlanePoint.get('dAlitidude');
|
||||||
|
obj["航向角"] = PlanePoint.get('dHxj');
|
||||||
|
obj["俯仰角"] = PlanePoint.get('dFyj');
|
||||||
|
obj["倾斜角"] = PlanePoint.get('dQxj');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
points.set(PlanePoint.get('iRelTime'), pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortMap = new Map([...points].sort((a, b) => a[0] - b[0]));
|
||||||
|
|
||||||
|
if (sortMap.size > 0) {
|
||||||
|
var startSimu = simuStatus["开始时间"];
|
||||||
|
var endSimu = simuStatus["结束时间"];
|
||||||
|
const keysArray = [...sortMap.keys()];
|
||||||
|
var start = keysArray[0];
|
||||||
|
var end = keysArray[keysArray.length - 1];
|
||||||
|
if (startSimu < 0.0) {
|
||||||
|
startSimu = start;
|
||||||
|
}
|
||||||
|
if (start < startSimu) {
|
||||||
|
startSimu = start;
|
||||||
|
}
|
||||||
|
if (end > endSimu) {
|
||||||
|
endSimu = end;
|
||||||
|
}
|
||||||
|
simuStatus["开始时间"] = startSimu;
|
||||||
|
simuStatus["当前时间"] = startSimu;
|
||||||
|
simuStatus["结束时间"] = endSimu;
|
||||||
|
}
|
||||||
|
|
||||||
|
entityHJ.set(bdid, sortMap);
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//空空攻击事件
|
||||||
|
getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => {
|
||||||
|
//查询空空武器攻击事件
|
||||||
|
var params = ["dx", "fsbh", "GJ_JL", "GJ_FW", "gj_sk", "GJTS", "DMZYSK", "ZD_JSSK", "gjxg_qrmb", "MZYXX", "FS_JH"];
|
||||||
|
var whereSql = "sjlx = '空空' and gjxg_qrxg = '" + qrxg + "' and bdid = '" + bdid + "'";
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_fxjc_wqsy", params, whereSql);
|
||||||
|
var array = [];
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
let sjmap = {};
|
||||||
|
var zerotime = moment(rq);
|
||||||
|
var starttime = moment(result[4]);
|
||||||
|
var endtime = moment(result[6]);
|
||||||
|
var jhsk = moment(result[7]);
|
||||||
|
var dx = result[0];
|
||||||
|
var mzyxx = result[9];
|
||||||
|
var fsbh = result[1];
|
||||||
|
var mbdh = result[8];
|
||||||
|
var ddbh = "/" + fsbh + " " + dx + "->" + mbdh;
|
||||||
|
var gjxx = qcdh + ddbh;
|
||||||
|
var strNewBH = bdid + "-" + fsbh;
|
||||||
|
//添加引导发射飞机信息
|
||||||
|
var FS_JH = result[10];
|
||||||
|
var ts = result[5];
|
||||||
|
var jl = result[2];
|
||||||
|
|
||||||
|
if (mzyxx == "命中") {
|
||||||
|
//没有结束时间进行简易弹道计算
|
||||||
|
if (!endtime) {
|
||||||
|
var zdsk, mzsk;
|
||||||
|
var obj = await getDxInfoFromDb(dx, rwbs);
|
||||||
|
var lb = obj["lb"];
|
||||||
|
var mzdjlyt = obj["MZDJL_YT"];
|
||||||
|
var mzdjlwh = obj["MZDJL_WH"];
|
||||||
|
var dmjjsdyt = obj["DMJJSD_YT"];
|
||||||
|
var dmjjsdwh = obj["DMJJSD_WH"];
|
||||||
|
var t = 0;
|
||||||
|
if (lb == "中距") {
|
||||||
|
if (ts == "尾后") {
|
||||||
|
if (dmjjsdwh <= 0) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var x = jl - mzdjlyt;
|
||||||
|
if (x < 0) {
|
||||||
|
zdsk = starttime;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
t = Math.round(x / dmjjsdwh);
|
||||||
|
zdsk = starttime.add(t, 'seconds');
|
||||||
|
}
|
||||||
|
t = Math.round(jl / dmjjsdwh);
|
||||||
|
mzsk = starttime.add(t, 'seconds');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (dmjjsdyt <= 0) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var x = jl - mzdjlyt;
|
||||||
|
if (x < 0) {
|
||||||
|
zdsk = starttime;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
t = Math.round(x / dmjjsdyt);
|
||||||
|
zdsk = starttime.add(t, 'seconds');
|
||||||
|
}
|
||||||
|
t = Math.round(jl / dmjjsdyt);
|
||||||
|
mzsk = starttime.add(t, 'seconds');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (ts == "尾后") {
|
||||||
|
if (dmjjsdwh <= 0) {
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
zdsk = starttime;
|
||||||
|
t = Math.round(jl / dmjjsdwh);
|
||||||
|
mzsk = starttime.add(t, 'seconds');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (dmjjsdyt <= 0) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
zdsk = starttime;
|
||||||
|
t = Math.round(jl / dmjjsdyt);
|
||||||
|
mzsk = starttime.add(t, 'seconds');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
endtime = starttime.add(10, 'seconds');
|
||||||
|
}
|
||||||
|
|
||||||
|
var startms = zerotime.diff(starttime, 'ms');
|
||||||
|
var endms = zerotime.diff(endtime, 'ms');
|
||||||
|
|
||||||
|
sjmap["开始时间"] = startms;
|
||||||
|
sjmap["结束时间"] = endms;
|
||||||
|
sjmap["被攻击目标"] = mbdh;
|
||||||
|
|
||||||
|
//事件附加参数
|
||||||
|
let csmap = {};
|
||||||
|
var kkddhj = await getKkddFromDb(bdid, fsbh);
|
||||||
|
if (kkddhj) {
|
||||||
|
csmap["型号"] = dx;
|
||||||
|
csmap["编号"] = strNewBH;
|
||||||
|
csmap["阵营"] = zy;
|
||||||
|
csmap["攻击目标"] = mbdh;
|
||||||
|
csmap["装备类别"] = "空空弹";
|
||||||
|
csmap["航迹"] = kkddhj;
|
||||||
|
if (jhsk) {
|
||||||
|
var jhms = zerotime.diff(jhsk, 'ms');
|
||||||
|
|
||||||
|
csmap["制导结束时刻"] = jhms + 1;
|
||||||
|
csmap["攻击开始时刻"] = startms;
|
||||||
|
csmap["结束时刻"] = endms;
|
||||||
|
}
|
||||||
|
|
||||||
|
var num = kkddhj.size;
|
||||||
|
endtime = starttime.add(num * 10, 'ms'); //导弹航迹精度为10ms
|
||||||
|
var endms = zerotime.diff(endtime, 'ms');
|
||||||
|
sjmap["结束时间"] = endms;
|
||||||
|
}
|
||||||
|
csmap["标识"] = qcdh + fsbh;
|
||||||
|
csmap["攻击信息"] = gjxx;
|
||||||
|
csmap["命中状态"] = mzyxx;
|
||||||
|
csmap["发射机号"] = FS_JH;
|
||||||
|
|
||||||
|
sjmap["参数"] = csmap;
|
||||||
|
//传入Gis的事件
|
||||||
|
array.push(sjmap);
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
//导弹类型信息
|
||||||
|
getDxInfoFromDb = async (dx, rwbs) => {
|
||||||
|
var params = ["lb", "MZDJL_YT", "MZDJL_WH", "DMJJSD_YT", "DMJJSD_WH"];
|
||||||
|
var whereSql = "rwbs = '" + rwbs + "' and dx = '" + dx + "'";
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_pggz_kkdcs", params, whereSql);
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
var obj = {};
|
||||||
|
obj["lb"] = result[0];
|
||||||
|
obj["MZDJL_YT"] = result[1];
|
||||||
|
obj["MZDJL_WH"] = result[2];
|
||||||
|
obj["DMJJSD_YT"] = result[3];
|
||||||
|
obj["DMJJSD_WH"] = result[4];
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
//空空导弹航迹
|
||||||
|
getKkddFromDb = async (bdid, gjcx) => {
|
||||||
|
var params = ["ddsj"];
|
||||||
|
var whereSql = "jcid = '" + bdid + "' and gjcx = '" + gjcx + "'";
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_kzdd_sj", params, whereSql);
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
if (result) {
|
||||||
|
var lob = result[0];
|
||||||
|
var buffer = await dataBase.readLob(lob);
|
||||||
|
await lob.close();
|
||||||
|
|
||||||
|
var points = new Map();
|
||||||
|
var size = PlanePoint.length();
|
||||||
|
var count = buffer.length / size;
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
var offset = i * size;
|
||||||
|
const byte = buffer.subarray(offset, offset + size);
|
||||||
|
PlanePoint.setBuffer(byte);
|
||||||
|
|
||||||
|
points.set(PlanePoint.get('iRelTime'), PlanePoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortMap = new Map([...points].sort((a, b) => a[0] - b[0]));
|
||||||
|
return sortMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//空地攻击事件
|
||||||
|
getKdwqsyList = async (bdid, qrxg, rq) => {
|
||||||
|
//查询空地武器攻击事件
|
||||||
|
var params = ["gj_sk", "DMZYSK", "gjxg_qrmb", "dx", "fsbh"];
|
||||||
|
var whereSql = "sjlx = '空地' and gjxg_qrxg = '" + qrxg + "' and bdid = '" + bdid + "'";
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_fxjc_wqsy", params, whereSql);
|
||||||
|
var array = [];
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
let sjmap = {};
|
||||||
|
|
||||||
|
var zerotime = moment(rq);
|
||||||
|
var starttime = moment(result[0]);
|
||||||
|
var endtime = moment(result[1]);
|
||||||
|
var fsbh = result[4];
|
||||||
|
var startms = zerotime.diff(starttime, 'ms');
|
||||||
|
var endms = zerotime.diff(endtime, 'ms');
|
||||||
|
|
||||||
|
if (startms <= endms || endms == 0) {
|
||||||
|
endms = startms + 10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
sjmap["开始时间"] = startms;
|
||||||
|
sjmap["结束时间"] = endms;
|
||||||
|
sjmap["被攻击目标"] = result[2];
|
||||||
|
|
||||||
|
//事件附加参数
|
||||||
|
let csmap = {};
|
||||||
|
csmap["弹型"] = result[3];
|
||||||
|
csmap["攻击信息"] = bdid + fsbh;
|
||||||
|
csmap["事件标识"] = bdid + fsbh;
|
||||||
|
sjmap["参数"] = csmap;
|
||||||
|
|
||||||
|
//传入Gis的事件
|
||||||
|
array.push(sjmap);
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
//干扰事件
|
||||||
|
getGrqkList = async (bdid, grlx, qcdh, rq) => {
|
||||||
|
var params = [];
|
||||||
|
var whereSql = "grlx = '" + grlx + "' and bdid = '" + bdid + "'";
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_fxjc_grqk", params, whereSql);
|
||||||
|
|
||||||
|
var zerotime = moment(rq);
|
||||||
|
|
||||||
|
var array = [];
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
var grsd = moment(result[1]);
|
||||||
|
var grjs = moment(result[4]);
|
||||||
|
if (grjs < grsd) {
|
||||||
|
grjs = grsd.add(30, 'seconds');
|
||||||
|
}
|
||||||
|
|
||||||
|
var grSec = zerotime.diff(grsd, 'ms');
|
||||||
|
var grjsSec = zerotime.diff(grjs, 'ms');
|
||||||
|
var grfx = result[5];
|
||||||
|
var tfsl = result[3];
|
||||||
|
|
||||||
|
let map = {};
|
||||||
|
map["干扰时刻"] = grSec;
|
||||||
|
if (grlx != "有源干扰" && !grjs) {
|
||||||
|
grjsSec = grSec + 10 * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
map["干扰结束时刻"] = grjsSec;
|
||||||
|
|
||||||
|
let csMap = {};
|
||||||
|
csMap["干扰方向"] = grfx;
|
||||||
|
csMap["干扰类型"] = grlx;
|
||||||
|
csMap["事件标识"] = qcdh + "-" + grSec + grlx + tfsl;
|
||||||
|
csMap["编号"] = qcdh;
|
||||||
|
map["参数"] = csMap;
|
||||||
|
array.push(map);
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
//加载地导部队数据和地导攻击事件
|
||||||
|
exports.loadDDData = (req, res, next) => {
|
||||||
|
var params = ["bdid", "dwjc", "zy", "wqxh", "zdzb_jd", "zdzb_wd", "zdzb_hb", "DYLB", "txbg_sk"];
|
||||||
|
var whereSql = "RWBS = '" + req.query.RWBS + "' and RQ = '" + req.query.RQ + "' and BC = " + req.query.BC;
|
||||||
|
dataBase.queryTable("kzdk.RW_DD_KJJL", params, whereSql).then(async (data) => {
|
||||||
|
var array = [];
|
||||||
|
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
console.log(result);
|
||||||
|
|
||||||
|
var bdid = result[0];
|
||||||
|
var dwjc = result[1];
|
||||||
|
var zy = result[2];
|
||||||
|
var wqxh = result[3];
|
||||||
|
var dylb = result[7];
|
||||||
|
|
||||||
|
let obj = {};
|
||||||
|
obj["BDID"] = bdid;
|
||||||
|
obj["型号"] = dwjc;
|
||||||
|
obj["编号"] = dwjc;
|
||||||
|
obj["阵营"] = zy;
|
||||||
|
obj["经度"] = result[4];
|
||||||
|
obj["纬度"] = result[5];
|
||||||
|
obj["海拔"] = result[6];
|
||||||
|
obj["装备类别"] = "地导阵地";
|
||||||
|
obj["武器型号"] = wqxh;
|
||||||
|
obj["名称"] = "地导阵地";
|
||||||
|
obj["体系摧毁时刻"] = result[8];
|
||||||
|
obj["体系摧毁文本信息"] = "体系摧毁时间为:" + moment(result[8]).format('HH:mm:ss');
|
||||||
|
obj["体系摧毁文本颜色"] = "255,0,0,255";
|
||||||
|
//obj["参数"] = "255,0,0,255";
|
||||||
|
|
||||||
|
if (dylb == "舰艇") {
|
||||||
|
var hj = await getHjFromDb(obj, bdid, "航迹", 100, 1, "地导阵地");
|
||||||
|
if (!hj) {
|
||||||
|
hj = await getHjFromDb(obj, bdid, "航迹", 100, 0, "地导阵地");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//当前地导阵地所有地空攻击事件
|
||||||
|
var dksjlist = await getDkwqsyList(bdid, zy, dwjc, req.query.RQ);
|
||||||
|
|
||||||
|
array.push(obj);
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(util.getReturnData(1, '查询成功', array));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//查询地空武器攻击事件
|
||||||
|
//地导武器发射
|
||||||
|
getDkwqsyList = async (bdid, zy, dwjc, rq) => {
|
||||||
|
var params = ["gjcx", "gjd", "qrxg_mbxh", "qrxg_qrmb", "sk", "qrxg_ywx", "ddbh"];
|
||||||
|
var whereSql = "jd = '发射' and bdid = '" + bdid + "'";
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_dd_wqgj", params, whereSql);
|
||||||
|
var array = [];
|
||||||
|
|
||||||
|
var zerotime = moment(rq);
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
var starttime = moment(result[4]);
|
||||||
|
var gjcx = result[0];
|
||||||
|
var gjd = result[1];
|
||||||
|
var qrxg_mbxh = result[2];
|
||||||
|
var qrxg_qrmb = result[3];
|
||||||
|
var qrxg_ywx = result[5];
|
||||||
|
var ddbh = result[6];
|
||||||
|
if (qrxg_ywx == "有效") {
|
||||||
|
var endtime = await getDdwqzyList(bdid, gjcx, ddbh, gjd);
|
||||||
|
if (endtime) {
|
||||||
|
let sjmap = {};
|
||||||
|
|
||||||
|
var startms = zerotime.diff(starttime, 'ms');
|
||||||
|
var endms = zerotime.diff(endtime, 'ms');
|
||||||
|
if (endms == 0 || endms <= startms) {
|
||||||
|
endms = startms + 10000;
|
||||||
|
}
|
||||||
|
//事件附加参数
|
||||||
|
let csmap = {};
|
||||||
|
var Dkddhj = await getDkddFromDb(bdid, gjcx, ddbh);
|
||||||
|
if (Dkddhj) {
|
||||||
|
var wqxh = await getWqXhFromDb(bdid);
|
||||||
|
if (wqxh) {
|
||||||
|
csmap["型号"] = wqxh;
|
||||||
|
}
|
||||||
|
csmap["编号"] = bdid + "-" + gjcx + "-" + ddbh;
|
||||||
|
csmap["阵营"] = zy;
|
||||||
|
csmap["攻击目标"] = qrxg_qrmb;
|
||||||
|
csmap["装备类别"] = "地空弹";
|
||||||
|
csmap["航迹"] = Dkddhj;
|
||||||
|
}
|
||||||
|
csmap["攻击信息"] = wqxh + "/" + dwjc + "-" + qrxg_qrmb + "-" + gjcx + "-" + ddbh;
|
||||||
|
csmap["命中状态"] = "命中";
|
||||||
|
csmap["事件标识"] = bdid + gjcx + ddbh;
|
||||||
|
|
||||||
|
sjmap["开始时间"] = startms;
|
||||||
|
sjmap["结束时间"] = endms;
|
||||||
|
sjmap["被攻击目标"] = qrxg_qrmb;
|
||||||
|
sjmap["参数"] = csmap;
|
||||||
|
|
||||||
|
//传入Gis的事件
|
||||||
|
array.push(sjmap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
//地导武器遭遇
|
||||||
|
getDdwqzyList = async (bdid, gjcx, ddbh, gjd) => {
|
||||||
|
var params = ["sk", "qrxg_ywx"];
|
||||||
|
var whereSql = "jd = '遭遇' and bdid = '" + bdid + "' and gjcx = " + gjcx + " and ddbh = " + ddbh + " and gjd = " + gjd;
|
||||||
|
var data = await dataBase.queryTable("kzdk.rw_dd_wqgj", params, whereSql);
|
||||||
|
var array = [];
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
var sk = moment(result[0]);
|
||||||
|
var qrxg_ywx = result[1];
|
||||||
|
if (qrxg_ywx == "有效") {
|
||||||
|
return sk;
|
||||||
|
}
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//地空导弹轨迹
|
||||||
|
getDkddFromDb = async (bdid, gjcx, ddbh) => {
|
||||||
|
var params = ["ddsj"];
|
||||||
|
var whereSql = "bdid = '" + bdid + "' and gjcx = " + gjcx + " and ddbh = " + ddbh;
|
||||||
|
var data = await dataBase.queryTable("kzdk.RW_DDDD_SJ", params, whereSql);
|
||||||
|
var array = [];
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
if (result) {
|
||||||
|
var lob = result[0];
|
||||||
|
var buffer = await dataBase.readLob(lob);
|
||||||
|
await lob.close();
|
||||||
|
|
||||||
|
var points = new Map();
|
||||||
|
var size = PlanePoint.length();
|
||||||
|
var count = buffer.length / size;
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
var offset = i * size;
|
||||||
|
const byte = buffer.subarray(offset, offset + size);
|
||||||
|
PlanePoint.setBuffer(byte);
|
||||||
|
|
||||||
|
points.set(PlanePoint.get('iRelTime'), PlanePoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortMap = new Map([...points].sort((a, b) => a[0] - b[0]));
|
||||||
|
return sortMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//查询地导武器型号
|
||||||
|
getWqXhFromDb = async (bdid) => {
|
||||||
|
var params = ["WQXH"];
|
||||||
|
var whereSql = "bdid = '" + bdid + "'";
|
||||||
|
var data = await dataBase.queryTable("kzdk.RW_DD_KJJL", params, whereSql);
|
||||||
|
var array = [];
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
if (result) {
|
||||||
|
var WQXH = result[0];
|
||||||
|
return WQXH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//加载地面目标名称和坐标(包含机动目标和打击目标)
|
||||||
|
// exports.loadDMMBData = async (req, res, next) => {
|
||||||
|
// await loadDJMBData(req, res, next);
|
||||||
|
// await loadJDMBData(req, res, next);
|
||||||
|
// }
|
||||||
|
|
||||||
|
//加载打击目标数据
|
||||||
|
exports.loadDJMBData = (req, res, next) => {
|
||||||
|
var params = ["mbmc", "mbbh", "mbjd", "mbwd", "mbgd", "ssdw", "mblx"];
|
||||||
|
var whereSql = "rwbs = '" + req.query.RWBS + "'";
|
||||||
|
dataBase.queryTable("kzdk.rw_djmb", params, whereSql).then(async (data) => {
|
||||||
|
var array = [];
|
||||||
|
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
console.log(result);
|
||||||
|
|
||||||
|
var dwjc = result[0];
|
||||||
|
var zy = result[5];
|
||||||
|
|
||||||
|
let obj = {};
|
||||||
|
obj["型号"] = dwjc;
|
||||||
|
obj["编号"] = result[1];
|
||||||
|
obj["阵营"] = zy;
|
||||||
|
obj["经度"] = result[2];
|
||||||
|
obj["纬度"] = result[3];
|
||||||
|
obj["海拔"] = result[4];
|
||||||
|
obj["装备类别"] = "打击目标";
|
||||||
|
//obj["参数"] = "255,0,0,255";
|
||||||
|
|
||||||
|
array.push(obj);
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(util.getReturnData(1, '查询成功', array));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
//加载机动目标数据
|
||||||
|
exports.loadJDMBData = (req, res, next) => {
|
||||||
|
var params = ["mbmc", "mbbh", "mbjd", "mbwd", "mbgd", "ssdw", "mblx", "ckqx"];
|
||||||
|
var whereSql = "rwbs = '" + req.query.RWBS + "' and rwrq = '" + req.query.RQ + "' and bc = " + req.query.BC;
|
||||||
|
dataBase.queryTable("kzdk.rw_jdmb", params, whereSql).then(async (data) => {
|
||||||
|
var array = [];
|
||||||
|
|
||||||
|
// 从结果集中获取一行
|
||||||
|
var result = await data.getRow();
|
||||||
|
while (result) {
|
||||||
|
console.log(result);
|
||||||
|
|
||||||
|
var dwjc = result[0];
|
||||||
|
var zy = result[5];
|
||||||
|
|
||||||
|
let obj = {};
|
||||||
|
obj["型号"] = dwjc;
|
||||||
|
obj["编号"] = result[1];
|
||||||
|
obj["阵营"] = zy;
|
||||||
|
obj["经度"] = result[2];
|
||||||
|
obj["纬度"] = result[3];
|
||||||
|
obj["海拔"] = result[4];
|
||||||
|
obj["装备类别"] = "机动目标";
|
||||||
|
//obj["参数"] = "255,0,0,255";
|
||||||
|
|
||||||
|
array.push(obj);
|
||||||
|
|
||||||
|
result = await data.getRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(util.getReturnData(1, '查询成功', array));
|
||||||
|
});
|
||||||
|
};
|
123
controller/socket.js
Normal file
123
controller/socket.js
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
const WebSocket = require('ws');
|
||||||
|
const util = require("../util/common");
|
||||||
|
var { entityHJ, simuStatus } = require("../util/variable");
|
||||||
|
|
||||||
|
const deltaT = 1000;
|
||||||
|
|
||||||
|
const createServer = () => {
|
||||||
|
// 创建WebSocket服务器
|
||||||
|
const wss = new WebSocket.Server({ port: 9000 });
|
||||||
|
|
||||||
|
wss.on('connection', function connection(ws) {
|
||||||
|
console.log('新客户端已连接');
|
||||||
|
|
||||||
|
// 定时发送消息
|
||||||
|
const intervalId = setInterval(() => {
|
||||||
|
var simType = simuStatus["运行状态"];
|
||||||
|
if (simType == 1) {
|
||||||
|
var currRadio = simuStatus["仿真倍速"];
|
||||||
|
var currTime = simuStatus["当前时间"];
|
||||||
|
if (entityHJ.size > 0) {
|
||||||
|
var array = [];
|
||||||
|
for (const [key, value] of entityHJ) {
|
||||||
|
const keysArray = [...value.keys()];
|
||||||
|
var indexKey = util.lower_bound(keysArray, currTime);
|
||||||
|
if (indexKey < keysArray.length) {
|
||||||
|
let point = {};
|
||||||
|
var second = keysArray[indexKey];
|
||||||
|
if (indexKey == 0) {
|
||||||
|
point = value.get(second);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var first = keysArray[indexKey - 1];
|
||||||
|
var delta_time = second - first;
|
||||||
|
if (delta_time == 0.0) {
|
||||||
|
point = value.get(first);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var pointfirst = value.get(first);
|
||||||
|
var pointsecond = value.get(second);
|
||||||
|
|
||||||
|
point["空速"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["空速"],
|
||||||
|
pointsecond["空速"]);
|
||||||
|
|
||||||
|
point["升降率"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["升降率"],
|
||||||
|
pointsecond["升降率"]);
|
||||||
|
|
||||||
|
point["过载"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["过载"],
|
||||||
|
pointsecond["过载"]);
|
||||||
|
|
||||||
|
point["马赫数"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["马赫数"],
|
||||||
|
pointsecond["马赫数"]);
|
||||||
|
|
||||||
|
point["经度"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["经度"],
|
||||||
|
pointsecond["经度"]);
|
||||||
|
|
||||||
|
point["纬度"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["纬度"],
|
||||||
|
pointsecond["纬度"]);
|
||||||
|
|
||||||
|
point["海拔"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["海拔"],
|
||||||
|
pointsecond["海拔"]);
|
||||||
|
|
||||||
|
point["航向角"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["航向角"],
|
||||||
|
pointsecond["航向角"]);
|
||||||
|
|
||||||
|
point["俯仰角"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["俯仰角"],
|
||||||
|
pointsecond["俯仰角"]);
|
||||||
|
|
||||||
|
point["倾斜角"] = util.interpolate(
|
||||||
|
(currTime - first) / delta_time,
|
||||||
|
pointfirst["倾斜角"],
|
||||||
|
pointsecond["倾斜角"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
point["BDID"] = key;
|
||||||
|
array.push(point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const message = {
|
||||||
|
time: currTime,
|
||||||
|
data: array
|
||||||
|
};
|
||||||
|
ws.send(JSON.stringify(message)); // 发送JSON格式的消息
|
||||||
|
}
|
||||||
|
|
||||||
|
var accTime = deltaT * currRadio;
|
||||||
|
currTime += accTime;
|
||||||
|
|
||||||
|
simuStatus["当前时间"] = currTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
}, deltaT); // 每5秒发送一次消息
|
||||||
|
|
||||||
|
// 可以在这里添加更多的逻辑,例如当客户端关闭连接时清除定时器等
|
||||||
|
ws.on('close', () => {
|
||||||
|
clearInterval(intervalId); // 清除定时器,防止内存泄漏
|
||||||
|
console.log('客户端已断开连接');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('WebSocket服务器正在运行在ws://localhost:9000');
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = createServer()
|
1249
package-lock.json
generated
Normal file
1249
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
package.json
Normal file
20
package.json
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "dmserve",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "node ./bin/www"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"cookie-parser": "~1.4.4",
|
||||||
|
"debug": "~2.6.9",
|
||||||
|
"dmdb": "^1.0.33801",
|
||||||
|
"express": "~4.16.1",
|
||||||
|
"http-errors": "~1.6.3",
|
||||||
|
"jade": "~1.11.0",
|
||||||
|
"moment-timezone": "^0.5.47",
|
||||||
|
"morgan": "~1.9.1",
|
||||||
|
"struct": "^0.0.12",
|
||||||
|
"ws": "^8.18.1"
|
||||||
|
}
|
||||||
|
}
|
8
public/stylesheets/style.css
Normal file
8
public/stylesheets/style.css
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
body {
|
||||||
|
padding: 50px;
|
||||||
|
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #00B7FF;
|
||||||
|
}
|
21
routes/Mission.js
Normal file
21
routes/Mission.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
|
||||||
|
var { loadHKBData, loadDDData, loadDJMBData, loadJDMBData } = require('../controller/Mission');
|
||||||
|
|
||||||
|
//航空兵数据
|
||||||
|
router.get('/HKBData', loadHKBData);
|
||||||
|
|
||||||
|
//地导部队数据
|
||||||
|
router.get('/DDData', loadDDData);
|
||||||
|
|
||||||
|
//地面目标数据
|
||||||
|
// router.get('/DMMBData', loadDMMBData);
|
||||||
|
|
||||||
|
//打击目标数据
|
||||||
|
router.get('/DJMBData', loadDJMBData);
|
||||||
|
|
||||||
|
//机动目标数据
|
||||||
|
router.get('/JDMBData', loadJDMBData);
|
||||||
|
|
||||||
|
module.exports = router;
|
24
routes/simu.js
Normal file
24
routes/simu.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
const util = require("../util/common");
|
||||||
|
var { simuStatus } = require("../util/variable");
|
||||||
|
|
||||||
|
router.post('/SimuType', function (req, res, next) {
|
||||||
|
const simuType = req.body.simuType;
|
||||||
|
simuStatus["运行状态"] = simuType;
|
||||||
|
res.json(util.getReturnData(1, '修改运行状态成功'));
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/SimuRadio', function (req, res, next) {
|
||||||
|
const simuRadio = req.body.simuRadio;
|
||||||
|
simuStatus["仿真倍速"] = simuRadio;
|
||||||
|
res.json(util.getReturnData(1, '修改仿真倍速成功'));
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/SimuTime', function (req, res, next) {
|
||||||
|
const simuTime = req.body.simuTime;
|
||||||
|
simuStatus["当前时间"] = simuTime;
|
||||||
|
res.json(util.getReturnData(1, '修改仿真当前时间成功'));
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
70
util/common.js
Normal file
70
util/common.js
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
let util = {};
|
||||||
|
util.getReturnData = (code, message = '', data = []) => {
|
||||||
|
//保证数据格式
|
||||||
|
if (!data) {
|
||||||
|
data = [];
|
||||||
|
}
|
||||||
|
return { code: code, message: message, data: data };
|
||||||
|
}
|
||||||
|
|
||||||
|
//转换为格式化时间
|
||||||
|
util.getLocalDate = (t) => {
|
||||||
|
let date = new Date(parseInt(t));
|
||||||
|
return date.getFullYear() + "-" + (parseInt(date.getMonth()) + 1) + "-" +
|
||||||
|
date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" +
|
||||||
|
date.getSeconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 寻找>=target的最小下标
|
||||||
|
* @param {number[]} nums
|
||||||
|
* @param {number} target
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
util.lower_bound = (nums, target) => {
|
||||||
|
let first = 0;
|
||||||
|
let len = nums.length;
|
||||||
|
|
||||||
|
while (len > 0) {
|
||||||
|
let half = len >> 1;
|
||||||
|
let middle = first + half;
|
||||||
|
if (nums[middle] < target) {
|
||||||
|
first = middle + 1;
|
||||||
|
len = len - half - 1;
|
||||||
|
} else {
|
||||||
|
len = half;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 寻找>target的最小下标
|
||||||
|
* @param {number[]} nums
|
||||||
|
* @param {number} target
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
util.upper_bound = (nums, target) => {
|
||||||
|
let first = 0;
|
||||||
|
let len = nums.length;
|
||||||
|
|
||||||
|
while (len > 0) {
|
||||||
|
let half = len >> 1;
|
||||||
|
let middle = first + half;
|
||||||
|
if (nums[middle] > target) {
|
||||||
|
len = half;
|
||||||
|
} else {
|
||||||
|
first = middle + 1;
|
||||||
|
len = len - half - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
|
util.interpolate = (ratio, first, second) => {
|
||||||
|
let one_minus_ratio = 1.0 - ratio;
|
||||||
|
let data = first * one_minus_ratio + second * ratio;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = util;
|
102
util/dmDB.js
Normal file
102
util/dmDB.js
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
//引入 dmdb 包
|
||||||
|
var db = require('dmdb');
|
||||||
|
var fs = require('fs');
|
||||||
|
const dbConfig = require("../config/db.json").db_config;
|
||||||
|
var pool, conn;
|
||||||
|
let dataBase = {};
|
||||||
|
|
||||||
|
//创建连接池
|
||||||
|
async function createPool() {
|
||||||
|
try {
|
||||||
|
var connect = "dm://" + dbConfig.username + ":" + dbConfig.password + "\@" + dbConfig.host + ":" + dbConfig.port + "?autoCommit=false&loginEncrypt=false";
|
||||||
|
console.log(connect);
|
||||||
|
|
||||||
|
return db.createPool({
|
||||||
|
connectString: connect,
|
||||||
|
poolMax: 10,
|
||||||
|
poolMin: 1
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error("createPool error: " + err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取数据库连接
|
||||||
|
async function getConnection() {
|
||||||
|
try {
|
||||||
|
return pool.getConnection();
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error("getConnection error: " + err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//读取数据库返回的 Lob 对象
|
||||||
|
dataBase.readLob = (lob) => {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
var blobData = Buffer.alloc(0);
|
||||||
|
var totalLength = 0;
|
||||||
|
lob.on('data', function (chunk) {
|
||||||
|
totalLength += chunk.length;
|
||||||
|
blobData = Buffer.concat([blobData, chunk], totalLength);
|
||||||
|
});
|
||||||
|
lob.on('error', function (err) {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
lob.on('end', function () {
|
||||||
|
resolve(blobData);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
dataBase.initDB = async () => {
|
||||||
|
pool = await createPool();
|
||||||
|
conn = await getConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
dataBase.closeDB = async () => {
|
||||||
|
try {
|
||||||
|
await conn.close();
|
||||||
|
await pool.close();
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error("closeDB error: " + err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询表中字段
|
||||||
|
* @param tableName 数据库表名
|
||||||
|
* @param params 需要查询的字段
|
||||||
|
* @param whereSql 查询条件
|
||||||
|
*/
|
||||||
|
dataBase.queryTable = async (tableName, params, whereSql) => {
|
||||||
|
try {
|
||||||
|
var sql = "";
|
||||||
|
if (params != "") {
|
||||||
|
for (let index in params) {
|
||||||
|
if (sql != "") {
|
||||||
|
sql += ", ";
|
||||||
|
}
|
||||||
|
sql += params[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sql = "*";
|
||||||
|
}
|
||||||
|
|
||||||
|
var sql = "SELECT " + sql + " FROM " + tableName;
|
||||||
|
|
||||||
|
if (whereSql != "") {
|
||||||
|
sql += " WHERE " + whereSql;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(sql);
|
||||||
|
|
||||||
|
var result = await conn.execute(sql, [], { resultSet: true });
|
||||||
|
var resultSet = result.resultSet;
|
||||||
|
return resultSet;
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error("queryTable error: " + err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = dataBase;
|
30
util/variable.js
Normal file
30
util/variable.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
var Struct = require('struct');
|
||||||
|
|
||||||
|
exports.PlanePoint = Struct()
|
||||||
|
.word32Sle('iNum')
|
||||||
|
.word32Sle('iRelTime')
|
||||||
|
.doublele('dTimestamp')
|
||||||
|
.doublele('dLongitude')
|
||||||
|
.doublele('dLatitude')
|
||||||
|
.doublele('dHxj')
|
||||||
|
.doublele('dFyj')
|
||||||
|
.doublele('dQxj')
|
||||||
|
.doublele('dAlitidude')
|
||||||
|
.doublele('dAirspeed')
|
||||||
|
.doublele('dSjl')
|
||||||
|
.doublele('dOverload')
|
||||||
|
.doublele('dMach');
|
||||||
|
|
||||||
|
exports.entityHJ = new Map();
|
||||||
|
|
||||||
|
exports.entityEvent = new Map();
|
||||||
|
|
||||||
|
exports.simuStatus = {
|
||||||
|
"运行状态": 0,
|
||||||
|
"开始时间": -1,
|
||||||
|
"结束时间": -1,
|
||||||
|
"参考时间": "",
|
||||||
|
"当前时间": 0,
|
||||||
|
"仿真倍速": 1
|
||||||
|
}
|
||||||
|
|
6
views/error.jade
Normal file
6
views/error.jade
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
extends layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
h1= message
|
||||||
|
h2= error.status
|
||||||
|
pre #{error.stack}
|
5
views/index.jade
Normal file
5
views/index.jade
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
extends layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
h1= title
|
||||||
|
p Welcome to #{title}
|
7
views/layout.jade
Normal file
7
views/layout.jade
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
doctype html
|
||||||
|
html
|
||||||
|
head
|
||||||
|
title= title
|
||||||
|
link(rel='stylesheet', href='/stylesheets/style.css')
|
||||||
|
body
|
||||||
|
block content
|
112
说明.txt
Normal file
112
说明.txt
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
WebSocket监听端口为9000
|
||||||
|
http 监听端口为3000
|
||||||
|
|
||||||
|
get
|
||||||
|
http://localhost:3000/Mission/HKBData?RWBS=测试2019&RQ=2019-11-04&BC=1 //航空兵数据(后面3个参数是从界面选择的)
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"message": "查询成功",
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"BDID": "{8D08C120-CE62-452F-AD52-3DB88EED97CE}",
|
||||||
|
"型号": "F-14",
|
||||||
|
"机号": "69165",
|
||||||
|
"编号": "8505",
|
||||||
|
"阵营": "红军",
|
||||||
|
"单位简称": "K85L",
|
||||||
|
"单位代码": "10085",
|
||||||
|
"数据来源": null,
|
||||||
|
"后舱代号": "8512",
|
||||||
|
"后舱姓名": "李 勇",
|
||||||
|
"体系摧毁时刻": "2019-11-04T09:18:35.000Z",
|
||||||
|
"装备类别": "飞机",
|
||||||
|
"执行任务": "对地突击",
|
||||||
|
"体系摧毁文本信息": "体系摧毁时间为:17:18:35",
|
||||||
|
"体系摧毁文本颜色": "255,0,0,255",
|
||||||
|
"经度": 106.004173,
|
||||||
|
"纬度": 38.466488,
|
||||||
|
"海拔": 1117,
|
||||||
|
"航向角": 99.99,
|
||||||
|
"俯仰角": -1.47,
|
||||||
|
"倾斜角": -1.38
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
http://localhost:3000/Mission/DDData?RWBS=测试2019&RQ=2019-11-04&BC=1 //地导部队数据
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"message": "查询成功",
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"BDID": "{96B781E2-E633-4176-82C2-6EF0750C1A0B}",
|
||||||
|
"型号": "D7",
|
||||||
|
"编号": "D7",
|
||||||
|
"阵营": "红军",
|
||||||
|
"经度": 104.1703,
|
||||||
|
"纬度": 40.1789,
|
||||||
|
"海拔": 1426,
|
||||||
|
"装备类别": "地导阵地",
|
||||||
|
"武器型号": "BZ3",
|
||||||
|
"名称": "地导阵地",
|
||||||
|
"体系摧毁时刻": null,
|
||||||
|
"体系摧毁文本信息": "体系摧毁时间为:Invalid date",
|
||||||
|
"体系摧毁文本颜色": "255,0,0,255"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
http://localhost:3000/Mission/DJMBData?RWBS=测试2019&RQ=2019-11-04&BC=1 //打击目标数据
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"message": "查询成功",
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"型号": "桥梁目标",
|
||||||
|
"编号": "桥梁目标",
|
||||||
|
"阵营": "蓝军",
|
||||||
|
"经度": 100.6858,
|
||||||
|
"纬度": 40.6932,
|
||||||
|
"海拔": 0,
|
||||||
|
"装备类别": "打击目标"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
http://localhost:3000/Mission/JDMBData?RWBS=测试2019&RQ=2019-11-04&BC=1 //机动目标数据
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"message": "查询成功",
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"型号": "假阵地1",
|
||||||
|
"编号": "假阵地1",
|
||||||
|
"阵营": "蓝军",
|
||||||
|
"经度": 100.604,
|
||||||
|
"纬度": 40.7526,
|
||||||
|
"海拔": null,
|
||||||
|
"装备类别": "机动目标"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
post
|
||||||
|
//运行状态
|
||||||
|
http://localhost:3000/Simu/SimuType
|
||||||
|
{
|
||||||
|
"simuType":1 (1:开始; 0:其他)
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置当前仿真时间
|
||||||
|
http://localhost:3000/Simu/SimuTime
|
||||||
|
{
|
||||||
|
"simuTime":1
|
||||||
|
}
|
||||||
|
|
||||||
|
//仿真倍速
|
||||||
|
http://localhost:3000/Simu/SimuRadio
|
||||||
|
{
|
||||||
|
"simuRadio":1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user