/**
|
* 数据获取管理
|
*/
|
import '@/lib/jquery.xml2json';
|
import 'jquery.soap';
|
// import '@/lib/jquery.soap';
|
import $ from 'jquery';
|
import moment from 'moment';
|
import monitorDataApi from '@/api/monitorDataApi';
|
import { ElMessage } from 'element-plus';
|
import { parseFloatNAN } from '@/utils/number';
|
|
/**************************--本系统原始走航数据获取--*********************************/
|
/**
|
* 获取历史数据
|
* @param {Object} params
|
* @returns
|
*/
|
function fetchOriginHistoryData(params) {
|
return monitorDataApi.fetchHistroyData(params);
|
}
|
|
/**
|
* 获取实时最新数据
|
* @param {Object} params
|
* @returns
|
*/
|
function fetchOriginRealTimeData(params) {
|
return monitorDataApi.fetchNextData(params);
|
}
|
|
/**************************--第三方申欣环保走航数据获取--*********************************/
|
|
/**
|
* 获取申欣环保走航数据
|
* @date 2024.8.16
|
* @param {Object} params
|
* @returns
|
*/
|
function fetchThirdPartyData(params) {
|
return new Promise((resolve, reject) => {
|
$.soap({
|
// url: 'http://180.169.129.106:9001/WebService.asmx',
|
url: 'http://114.215.109.124:8082/jingan/WebService.asmx',
|
method: 'GetData',
|
appendMethodToURL: false,
|
namespaceURL: 'http://tempuri.org/',
|
SOAPAction: 'http://tempuri.org/GetData',
|
data: params,
|
success: function (soapResponse) {
|
const json = $.xml2json(soapResponse.toString());
|
// console.log(json);
|
// todo 2024.8.16 数据格式转换
|
const res = json.Body.GetDataResponse.GetDataResult;
|
if (res.ReturnCode != '0') {
|
reject(soapResponse);
|
ElMessage({
|
message: res.ReturnMessage,
|
type: 'error'
|
});
|
} else if (typeof res.ListInfo != 'object') {
|
resolve({
|
success: true,
|
message: '请求成功',
|
data: []
|
});
|
// reject(soapResponse);
|
ElMessage({
|
message: '暂无新监测数据',
|
type: 'warning'
|
});
|
} else {
|
// 此处有一个 $.xml2json 方法的一个特性,当字段DataInfo中只有一个值时,此时DataInfo为对象类型,而非数组
|
if (res.ListInfo.DataInfo.length == undefined) {
|
res.ListInfo.DataInfo = [res.ListInfo.DataInfo];
|
}
|
const _res = res.ListInfo.DataInfo.map((value) => {
|
const _time = moment(value.PostTime).format('YYYY-MM-DD HH:mm:ss');
|
return {
|
deviceCode: params.mn,
|
lat: parseFloat(value.Lat),
|
lng: parseFloat(value.Lon),
|
time: _time,
|
values: [
|
{
|
factorId: '19',
|
factorName: 'NO',
|
factorData: parseFloatNAN(value.NO)
|
},
|
{
|
factorId: '1',
|
factorName: 'NO2',
|
factorData: parseFloatNAN(value.NO2)
|
},
|
{
|
factorId: '2',
|
factorName: 'CO',
|
factorData: parseFloatNAN(value.CO) * 1000
|
},
|
{
|
factorId: '6',
|
factorName: 'PM25',
|
factorData: parseFloatNAN(value.PM25)
|
},
|
{
|
factorId: '7',
|
factorName: 'PM10',
|
factorData: parseFloatNAN(value.PM10)
|
},
|
{
|
factorId: '8',
|
factorName: 'TEMPERATURE',
|
factorData: parseFloatNAN(value.Temperature)
|
},
|
{
|
factorId: '14',
|
factorName: 'VELOCITY',
|
factorData: parseFloatNAN(value.Speed)
|
},
|
{
|
factorId: '15',
|
factorName: 'TIME',
|
factorData: moment(_time).valueOf(),
|
statusList: [_time]
|
},
|
{
|
factorId: '16',
|
factorName: 'WIND_SPEED',
|
factorData: parseFloatNAN(value.WindSpeed)
|
},
|
{
|
factorId: '17',
|
factorName: 'WIND_DIRECTION',
|
factorData: parseFloatNAN(value.WindDirection)
|
}
|
]
|
};
|
});
|
resolve({
|
success: true,
|
message: '请求成功',
|
data: _res
|
});
|
}
|
},
|
error: function (SOAPResponse) {
|
// show error
|
reject(SOAPResponse);
|
ElMessage({
|
message: '数据获取失败',
|
type: 'error'
|
});
|
}
|
});
|
});
|
}
|
|
/**************************--对外暴露统一接口--*********************************/
|
/**
|
* 获取历史数据
|
*/
|
function fetchHistoryData(params) {
|
if (import.meta.env.VITE_DATA_MODE == 'jingan') {
|
const _params = {
|
compUser: 'user1',
|
compPassword: 'User1@jingan',
|
mn: params.deviceCode,
|
dtFrom: params.startTime
|
? params.startTime
|
: moment().subtract(6, 'm').format('YYYY-MM-DD HH:mm:ss'),
|
dtTo: params.endTime
|
? params.endTime
|
: moment().format('YYYY-MM-DD HH:mm:ss')
|
};
|
return fetchThirdPartyData(_params);
|
} else {
|
return fetchOriginHistoryData(params);
|
}
|
}
|
|
var fetchingTask;
|
var isFetching;
|
/**
|
* 开启实时数据循环获取
|
* @param {Object} params
|
*/
|
function startLoopFetchRealTimeData(onParam, callback) {
|
// 时间间隔
|
let interval;
|
// 数据获取方法
|
let fetchFun;
|
if (import.meta.env.VITE_DATA_MODE == 'jingan') {
|
// 该数据传输最低间隔为1分钟,每次获取结束时间自动调整为开始时间的1分钟后
|
fetchFun = fetchThirdPartyData;
|
interval = 60 * 1000;
|
} else {
|
fetchFun = fetchOriginRealTimeData;
|
interval = 10 * 1000;
|
}
|
// 开始循环任务
|
clearFetchingTask();
|
fetchingTask = setInterval(() => {
|
if (isFetching) {
|
return;
|
}
|
isFetching = true;
|
// 参数
|
let _params;
|
if (typeof onParam === 'function') {
|
const params = onParam();
|
if (import.meta.env.VITE_DATA_MODE == 'jingan') {
|
_params = {
|
compUser: 'user1',
|
compPassword: 'User1@jingan',
|
mn: params.deviceCode,
|
dtFrom: params.updateTime,
|
dtTo: moment().format('YYYY-MM-DD HH:mm:ss')
|
};
|
} else {
|
_params = params;
|
}
|
}
|
fetchFun(_params)
|
.then((res) => {
|
if (typeof callback === 'function') {
|
callback(res);
|
}
|
})
|
.finally(() => {
|
isFetching = false;
|
});
|
}, interval);
|
}
|
|
/**
|
* 清理历史实时数据获取任务
|
*/
|
function clearFetchingTask() {
|
if (fetchingTask) {
|
clearInterval(fetchingTask);
|
fetchingTask = undefined;
|
isFetching = false;
|
}
|
}
|
|
export { fetchHistoryData, startLoopFetchRealTimeData, clearFetchingTask };
|