get获取数据已完成

This commit is contained in:
pm 2025-03-14 17:04:22 +08:00
commit 5433cf3323
17 changed files with 2602 additions and 0 deletions

54
app.js Normal file
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

20
package.json Normal file
View 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"
}
}

View 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
View 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
View 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
View 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
View 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
View 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
View File

@ -0,0 +1,6 @@
extends layout
block content
h1= message
h2= error.status
pre #{error.stack}

5
views/index.jade Normal file
View File

@ -0,0 +1,5 @@
extends layout
block content
h1= title
p Welcome to #{title}

7
views/layout.jade Normal file
View 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
View 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
}