const util = require("../util/common"); let dataBase = require("../util/dmDB"); const moment = require('moment-timezone'); var { PlanePoint, entityHJ, entityEvent, 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 = moment(starttime).add(t, 'seconds'); } t = Math.round(jl / dmjjsdwh); mzsk = moment(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 = moment(starttime).add(t, 'seconds'); } t = Math.round(jl / dmjjsdyt); mzsk = moment(starttime).add(t, 'seconds'); } } } else { if (ts == "尾后") { if (dmjjsdwh <= 0) { } else { zdsk = starttime; t = Math.round(jl / dmjjsdwh); mzsk = moment(starttime).add(t, 'seconds'); } } else { if (dmjjsdyt <= 0) { } else { zdsk = starttime; t = Math.round(jl / dmjjsdyt); mzsk = moment(starttime).add(t, 'seconds'); } } } if (!mzsk) { endtime = moment(starttime).add(10, 'seconds'); } else { endtime = mzsk; } } } else { endtime = moment(starttime).add(10, 'seconds'); } var startms = starttime.diff(zerotime, 'ms'); var endms = endtime.diff(zerotime, '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 = jhsk.diff(zerotime, 'ms'); csmap["制导结束时刻"] = jhms + 1; csmap["攻击开始时刻"] = startms; csmap["结束时刻"] = endms; } var num = kkddhj.size; endtime = moment(starttime).add(num * 10, 'ms'); //导弹航迹精度为10ms endms = endtime.diff(zerotime, 'ms'); sjmap["结束时间"] = endms; } csmap["标识"] = qcdh + fsbh; csmap["攻击信息"] = gjxx; csmap["命中状态"] = mzyxx; csmap["发射机号"] = FS_JH; sjmap["参数"] = csmap; //传入Gis的事件 array.push(sjmap); let eventMap = entityEvent.get(bdid); if (!eventMap) { eventMap = new Map(); } { let event = {}; event["事件"] = "空空攻击事件"; event["类型"] = "开始"; event["参数"] = csmap; eventMap.set(startms, event); } { let event = {}; event["事件"] = "空空攻击事件"; event["类型"] = "结束"; event["参数"] = csmap; eventMap.set(endms, event); } entityEvent.set(bdid, eventMap); 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); 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'); points.set(PlanePoint.get('iRelTime'), pt); } 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 = starttime.diff(zerotime, 'ms'); var endms = endtime.diff(zerotime, '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); let eventMap = entityEvent.get(bdid); if (!eventMap) { eventMap = new Map(); } { let event = {}; event["事件"] = "空地攻击事件"; event["类型"] = "开始"; event["参数"] = csmap; eventMap.set(startms, event); } { let event = {}; event["事件"] = "空地攻击事件"; event["类型"] = "结束"; event["参数"] = csmap; eventMap.set(endms, event); } entityEvent.set(bdid, eventMap); 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 = moment(grsd).add(30, 'seconds'); } var grSec = grsd.diff(zerotime, 'ms'); var grjsSec = grjs.diff(zerotime, '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); let eventMap = entityEvent.get(bdid); if (!eventMap) { eventMap = new Map(); } var eventType; if (grlx == "红外弹") { eventType = "红外弹干扰事件"; } else if (grlx == "箔条弹") { eventType = "箔条弹干扰事件"; } else if (grlx == "有源干扰") { eventType = "有源干扰事件"; } else if (grlx == "机载雷达") { eventType = "机载雷达事件"; } { let event = {}; event["事件"] = eventType; event["类型"] = "开始"; event["参数"] = csMap; eventMap.set(grSec, event); } { let event = {}; event["事件"] = eventType; event["类型"] = "结束"; event["参数"] = csMap; eventMap.set(grjsSec, event); } entityEvent.set(bdid, eventMap); 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); 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'); points.set(PlanePoint.get('iRelTime'), pt); } 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)); }); };