/** * 数据获取管理 */ 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); // } 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分钟,每次获取结束时间自动调整为开始时间的0.5分钟后 fetchFun = fetchThirdPartyData; interval = 30 * 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 };