|  | @@ -43,146 +43,184 @@ const computePrefixExpression = (function() {
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  })();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const getFunctionValue = child => {
 | 
	
		
			
				|  |  | -  let data = {};
 | 
	
		
			
				|  |  | -  data.data = [];
 | 
	
		
			
				|  |  | -  let expression = child.tempExpression;
 | 
	
		
			
				|  |  | -  let first = child.data[0];
 | 
	
		
			
				|  |  | -  let indexArr = child.indexArr;
 | 
	
		
			
				|  |  | -  first.data.forEach(item => {
 | 
	
		
			
				|  |  | -    // firstDevice.device
 | 
	
		
			
				|  |  | -    let resObj = {
 | 
	
		
			
				|  |  | -      [first.device.deviceName]: item,
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    let htime = item.htime;
 | 
	
		
			
				|  |  | -    for (let i = 1; i < child.data.length; i++) {
 | 
	
		
			
				|  |  | -      let element = child.data[i];
 | 
	
		
			
				|  |  | -      // deviceName = element.name
 | 
	
		
			
				|  |  | -      let result = element.data.find(item => item.htime === htime);
 | 
	
		
			
				|  |  | -      if (!result) return;
 | 
	
		
			
				|  |  | -      resObj[element.device.deviceName] = result;
 | 
	
		
			
				|  |  | +export async function getOptions(values, datas, formula, projectId) {
 | 
	
		
			
				|  |  | +  let allDatas = getAllParams(datas, formula);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  let optionsData = getOptionsData(datas, formula, values);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // 请求接口
 | 
	
		
			
				|  |  | +  const { plcData, formData } = await queryData(values, allDatas, projectId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  optionsData = optionsData.map(item => {
 | 
	
		
			
				|  |  | +    const paramsInfo = item.paramsInfo;
 | 
	
		
			
				|  |  | +    let res;
 | 
	
		
			
				|  |  | +    if (paramsInfo.data_type == 0) {
 | 
	
		
			
				|  |  | +      // plc数据
 | 
	
		
			
				|  |  | +      res = findPlcData(paramsInfo, plcData, values.timeType);
 | 
	
		
			
				|  |  | +    } else if (paramsInfo.data_type == 1) {
 | 
	
		
			
				|  |  | +      // form数据
 | 
	
		
			
				|  |  | +      res = findFormData(paramsInfo, formData, values.timeType);
 | 
	
		
			
				|  |  | +    } else if (paramsInfo.data_type == 2) {
 | 
	
		
			
				|  |  | +      // 获取公式的值
 | 
	
		
			
				|  |  | +      res = getFormulaData(item.paramsInfo, plcData, formData, values.timeType);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    Object.keys(resObj).forEach(key => {
 | 
	
		
			
				|  |  | -      var result = indexArr.find(item => key === item.deviceName);
 | 
	
		
			
				|  |  | -      if (result) expression[result.index] = resObj[key].val;
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    // console.log(expression);
 | 
	
		
			
				|  |  | -    data.data.push({
 | 
	
		
			
				|  |  | -      htime: moment(htime).format('YYYY-MM-DD HH:mm:ss'),
 | 
	
		
			
				|  |  | -      val: computePrefixExpression([...expression]),
 | 
	
		
			
				|  |  | +    return { ...item, ...res };
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return {
 | 
	
		
			
				|  |  | +    ...values,
 | 
	
		
			
				|  |  | +    data: optionsData,
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 根据表单的数据项获取请求参数
 | 
	
		
			
				|  |  | +function getFormParams(datas, projectId) {
 | 
	
		
			
				|  |  | +  let params = {};
 | 
	
		
			
				|  |  | +  datas.forEach(item => {
 | 
	
		
			
				|  |  | +    if (!params[item.data_name]) params[item.data_name] = [];
 | 
	
		
			
				|  |  | +    params[item.data_name].push(item.data_title);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return Object.keys(params).map(data_name => ({
 | 
	
		
			
				|  |  | +    formName: data_name,
 | 
	
		
			
				|  |  | +    titles: params[data_name],
 | 
	
		
			
				|  |  | +    projectId,
 | 
	
		
			
				|  |  | +  }));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function queryData(values, datas, projectId) {
 | 
	
		
			
				|  |  | +  let plcDatas = [],
 | 
	
		
			
				|  |  | +    formDatas = [];
 | 
	
		
			
				|  |  | +  datas.forEach(item => {
 | 
	
		
			
				|  |  | +    if (item.data_type == 0) {
 | 
	
		
			
				|  |  | +      plcDatas.push(item);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      formDatas.push(item);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // 根据params获取form的数据
 | 
	
		
			
				|  |  | +  var formData = await getFormData(values, formDatas, projectId);
 | 
	
		
			
				|  |  | +  var plcData = await getPlcData(values, plcDatas);
 | 
	
		
			
				|  |  | +  if (values.timeType) {
 | 
	
		
			
				|  |  | +    // 获得时间轴全集
 | 
	
		
			
				|  |  | +    let times = getTimes(plcData[0]?.data, formData[0]?.data);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 根据时间全集补填数据
 | 
	
		
			
				|  |  | +    formatData(plcData, times);
 | 
	
		
			
				|  |  | +    formatData(formData, times);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return {
 | 
	
		
			
				|  |  | +    plcData,
 | 
	
		
			
				|  |  | +    formData,
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 根据时间进行格式化数据
 | 
	
		
			
				|  |  | +function formatData(datas, times) {
 | 
	
		
			
				|  |  | +  datas.forEach(item => {
 | 
	
		
			
				|  |  | +    // 默认数据
 | 
	
		
			
				|  |  | +    let newItemData = [];
 | 
	
		
			
				|  |  | +    let i = 0;
 | 
	
		
			
				|  |  | +    times.forEach(t => {
 | 
	
		
			
				|  |  | +      if (item.data[i]?.htime != t) {
 | 
	
		
			
				|  |  | +        // 空缺时间要补0
 | 
	
		
			
				|  |  | +        newItemData.push({
 | 
	
		
			
				|  |  | +          htime: t,
 | 
	
		
			
				|  |  | +          val: 0,
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        newItemData.push(item.data[i]);
 | 
	
		
			
				|  |  | +        i++;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    // console.log(indexArr, resObj, expression);
 | 
	
		
			
				|  |  | -    //  indexArr   resObj     expression
 | 
	
		
			
				|  |  | +    // 使用新值
 | 
	
		
			
				|  |  | +    item.data = newItemData;
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +function getTimes(plcTimes = [], formTimes = []) {
 | 
	
		
			
				|  |  | +  let times = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  plcTimes.forEach(item => {
 | 
	
		
			
				|  |  | +    times[item.htime] = true;
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  formTimes.forEach(item => {
 | 
	
		
			
				|  |  | +    times[item.htime] = true;
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  | -  data.name = child.name;
 | 
	
		
			
				|  |  | +  return Object.keys(times).sort((a, b) => new Date(a) - new Date(b));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +async function getFormData(values, datas, projectId) {
 | 
	
		
			
				|  |  | +  let arrtData = values.data || [];
 | 
	
		
			
				|  |  | +  const params = getFormParams(datas, projectId);
 | 
	
		
			
				|  |  | +  if (!values.timeType) {
 | 
	
		
			
				|  |  | +    // 请求最新数据
 | 
	
		
			
				|  |  | +    return await getFormCurrentData(params, values);
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    // 请求历史数据
 | 
	
		
			
				|  |  | +    return await getFormHistoryData(params, values);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +// 请求表单最新数据
 | 
	
		
			
				|  |  | +async function getFormCurrentData(params, values) {
 | 
	
		
			
				|  |  | +  const { timeType, date } = values;
 | 
	
		
			
				|  |  | +  let data = [];
 | 
	
		
			
				|  |  | +  for (let i = 0; i < params.length; i++) {
 | 
	
		
			
				|  |  | +    const resData = await queryFormCurrentData(params[i]);
 | 
	
		
			
				|  |  | +    data = [...data, ...resData];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    return data;
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 请求表单历史数据
 | 
	
		
			
				|  |  | +async function getFormHistoryData(params, values) {
 | 
	
		
			
				|  |  | +  const { timeType, date } = values;
 | 
	
		
			
				|  |  | +  let sTime, eTime;
 | 
	
		
			
				|  |  | +  let data = [];
 | 
	
		
			
				|  |  | +  // -1为自选日期  从date内获取时间
 | 
	
		
			
				|  |  | +  if (timeType == -1) {
 | 
	
		
			
				|  |  | +    let clear = { hour: 0, minute: 0, second: 0, millisecond: 0 };
 | 
	
		
			
				|  |  | +    eTime = moment(date[1])
 | 
	
		
			
				|  |  | +      .set(clear)
 | 
	
		
			
				|  |  | +      .format('YYYY-MM-DD HH:mm:ss');
 | 
	
		
			
				|  |  | +    sTime = moment(date[0])
 | 
	
		
			
				|  |  | +      .set(clear)
 | 
	
		
			
				|  |  | +      .format('YYYY-MM-DD HH:mm:ss');
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    let currentDate = moment();
 | 
	
		
			
				|  |  | +    eTime = currentDate.format('YYYY-MM-DD HH:mm:ss');
 | 
	
		
			
				|  |  | +    sTime = currentDate.add(-1 * timeType, 'hour').format('YYYY-MM-DD HH:mm:ss');
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 获取图表的options
 | 
	
		
			
				|  |  | - * @param {object} values 表单数据
 | 
	
		
			
				|  |  | - * @param {array} datas 数据项
 | 
	
		
			
				|  |  | - * @param {array} formula 数据公式
 | 
	
		
			
				|  |  | - * @returns
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -export async function getPlcOptions(values, datas, formula) {
 | 
	
		
			
				|  |  | +  for (let i = 0; i < params.length; i++) {
 | 
	
		
			
				|  |  | +    const resData = await queryFormHistoryData({ ...params[i], eTime, sTime });
 | 
	
		
			
				|  |  | +    data = [...data, ...resData];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return data;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +async function getPlcData(values, datas) {
 | 
	
		
			
				|  |  |    let arrtData = values.data || [];
 | 
	
		
			
				|  |  |    let params = getSingleData(datas);
 | 
	
		
			
				|  |  | -  let multiParams = getFormula(formula);
 | 
	
		
			
				|  |  |    if (!values.timeType) {
 | 
	
		
			
				|  |  |      let res = await getData(params, values);
 | 
	
		
			
				|  |  | -    for (let i = 0; i < multiParams.length; i++) {
 | 
	
		
			
				|  |  | -      let device = multiParams[i].paramsDevice;
 | 
	
		
			
				|  |  | -      let indexArr = multiParams[i].indexArr;
 | 
	
		
			
				|  |  | -      let tempExpression = [...multiParams[i].expression];
 | 
	
		
			
				|  |  | -      let formulaRes = await getData(device, values);
 | 
	
		
			
				|  |  | -      formulaRes.data.map(res => {
 | 
	
		
			
				|  |  | -        let temp = device.find(child => child.deviceName === res.alias);
 | 
	
		
			
				|  |  | -        console.log(temp);
 | 
	
		
			
				|  |  | -        if (temp) {
 | 
	
		
			
				|  |  | -          var indexObj = indexArr.find(item => item.deviceName === temp.deviceName);
 | 
	
		
			
				|  |  | -          if (indexObj) {
 | 
	
		
			
				|  |  | -            tempExpression[indexObj.index] = res.val;
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -      let tempValue = computePrefixExpression([...tempExpression]);
 | 
	
		
			
				|  |  | -      multiParams[i].formatExpression = tempExpression;
 | 
	
		
			
				|  |  | -      multiParams[i].value = tempValue;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    let resData = res.data.map((item, index) => {
 | 
	
		
			
				|  |  | -      let attrDataItem = arrtData[index + formula.length] || {};
 | 
	
		
			
				|  |  | -      return {
 | 
	
		
			
				|  |  | -        ...attrDataItem,
 | 
	
		
			
				|  |  | -        name: item.alias,
 | 
	
		
			
				|  |  | -        value: item.val * 1,
 | 
	
		
			
				|  |  | -      };
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    let formulaData = multiParams.map((item, index) => {
 | 
	
		
			
				|  |  | -      let attrDataItem = arrtData[index] || {};
 | 
	
		
			
				|  |  | -      return {
 | 
	
		
			
				|  |  | -        ...attrDataItem,
 | 
	
		
			
				|  |  | -        name: item.FormulaName,
 | 
	
		
			
				|  |  | -        value: item.value * 1,
 | 
	
		
			
				|  |  | -      };
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return {
 | 
	
		
			
				|  |  | -      ...values,
 | 
	
		
			
				|  |  | -      data: [...resData, ...formulaData],
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +    return res.data;
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      let singleData = [];
 | 
	
		
			
				|  |  |      for (let i = 0; i < params.length; i++) {
 | 
	
		
			
				|  |  |        const item = params[i];
 | 
	
		
			
				|  |  |        let res = await getData(item, values);
 | 
	
		
			
				|  |  | -      let attrDataItem = arrtData[i + multiParams.length] || {};
 | 
	
		
			
				|  |  |        singleData.push({
 | 
	
		
			
				|  |  | -        ...attrDataItem,
 | 
	
		
			
				|  |  | +        paramsInfo: item,
 | 
	
		
			
				|  |  |          name: item.deviceName,
 | 
	
		
			
				|  |  |          data: (res.data || []).map(item => {
 | 
	
		
			
				|  |  |            return {
 | 
	
		
			
				|  |  | -            val: item.val,
 | 
	
		
			
				|  |  | +            val: Number(item.val),
 | 
	
		
			
				|  |  |              htime: moment(item.htime_at).format('YYYY-MM-DD HH:mm:ss'),
 | 
	
		
			
				|  |  |            };
 | 
	
		
			
				|  |  |          }),
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    let firstHTimeArr = [];
 | 
	
		
			
				|  |  | -    let formulaData = [];
 | 
	
		
			
				|  |  | -    for (let i = 0; i < multiParams.length; i++) {
 | 
	
		
			
				|  |  | -      const element = multiParams[i];
 | 
	
		
			
				|  |  | -      let indexArr = element.indexArr;
 | 
	
		
			
				|  |  | -      let tempExpression = [...element.expression];
 | 
	
		
			
				|  |  | -      let device = element.paramsDevice;
 | 
	
		
			
				|  |  | -      let child = {};
 | 
	
		
			
				|  |  | -      child.tempExpression = tempExpression;
 | 
	
		
			
				|  |  | -      child.name = element.FormulaName;
 | 
	
		
			
				|  |  | -      child.data = [];
 | 
	
		
			
				|  |  | -      child.indexArr = indexArr;
 | 
	
		
			
				|  |  | -      for (let j = 0; j < device.length; j++) {
 | 
	
		
			
				|  |  | -        const tempDevice = device[j];
 | 
	
		
			
				|  |  | -        let res = await getData(tempDevice, values);
 | 
	
		
			
				|  |  | -        child.data.push({
 | 
	
		
			
				|  |  | -          data: res.data,
 | 
	
		
			
				|  |  | -          device: tempDevice,
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      formulaData.push(child);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    let data = [];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    formulaData.map((item, index) => {
 | 
	
		
			
				|  |  | -      let attrDataItem = arrtData[index] || {};
 | 
	
		
			
				|  |  | -      data.push({ ...attrDataItem, ...getFunctionValue(item) });
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    values.data = [...singleData, ...data];
 | 
	
		
			
				|  |  | -    return values;
 | 
	
		
			
				|  |  | +    return singleData;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // 根据数据项获取请求参数
 | 
	
		
			
				|  |  |  function getSingleData(datas) {
 | 
	
		
			
				|  |  |    let params = [];
 | 
	
	
		
			
				|  | @@ -197,29 +235,65 @@ function getSingleData(datas) {
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    return params;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -// 根据公式获得请求参数
 | 
	
		
			
				|  |  | -function getFormula(formula) {
 | 
	
		
			
				|  |  | -  let params = [];
 | 
	
		
			
				|  |  | -  formula.forEach(item => {
 | 
	
		
			
				|  |  | -    let tempItem = item;
 | 
	
		
			
				|  |  | -    let tempDeviceArr = [];
 | 
	
		
			
				|  |  | -    let indexArr = [];
 | 
	
		
			
				|  |  | -    item.Device.map(device => {
 | 
	
		
			
				|  |  | -      if (device.Id && device.ItemAlias && device.ItemName) {
 | 
	
		
			
				|  |  | -        tempDeviceArr.push({
 | 
	
		
			
				|  |  | -          deviceName: device.ItemAlias,
 | 
	
		
			
				|  |  | -          deviceId: String(device.PlcDeviceId),
 | 
	
		
			
				|  |  | -          deviceItems: device.ItemName,
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | +function findPlcData(paramsInfo, plcData, timeType) {
 | 
	
		
			
				|  |  | +  // 实时数据与历史数据结构不一致  需判断
 | 
	
		
			
				|  |  | +  if (timeType) {
 | 
	
		
			
				|  |  | +    return plcData.find(resItem => resItem.paramsInfo.deviceName == paramsInfo.seq);
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    let res = plcData.find(resItem => resItem.alias == paramsInfo.seq);
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      name: res.alias,
 | 
	
		
			
				|  |  | +      value: res.val,
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +function findFormData(paramsInfo, formData, timeType) {
 | 
	
		
			
				|  |  | +  // 实时数据与历史数据结构不一致  需判断
 | 
	
		
			
				|  |  | +  if (timeType) {
 | 
	
		
			
				|  |  | +    return formData.find(resItem => resItem.name == paramsInfo.data_title);
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    let res = formData.find(resItem => resItem.title == paramsInfo.data_title);
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      name: res.title,
 | 
	
		
			
				|  |  | +      value: res.value,
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        indexArr.push({ index: device.index, deviceName: device.ItemAlias });
 | 
	
		
			
				|  |  | +function getAllParams(datas, formula) {
 | 
	
		
			
				|  |  | +  let allDatas = [...datas];
 | 
	
		
			
				|  |  | +  formula.forEach(f => {
 | 
	
		
			
				|  |  | +    f.params.forEach(params => {
 | 
	
		
			
				|  |  | +      if (params.data_type == 0) {
 | 
	
		
			
				|  |  | +        if (!datas.find(item => item.seq == params.seq)) {
 | 
	
		
			
				|  |  | +          allDatas.push(params);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        if (!datas.find(item => item.data_title == params.data_title)) {
 | 
	
		
			
				|  |  | +          allDatas.push(params);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    tempItem.paramsDevice = tempDeviceArr;
 | 
	
		
			
				|  |  | -    tempItem.indexArr = indexArr;
 | 
	
		
			
				|  |  | -    params.push(tempItem);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  | -  return params;
 | 
	
		
			
				|  |  | +  return allDatas;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function getOptionsData(datas, formula, values) {
 | 
	
		
			
				|  |  | +  let valuesData = values.data || [];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  let optionsData = [];
 | 
	
		
			
				|  |  | +  formula.forEach((item, index) => {
 | 
	
		
			
				|  |  | +    var arrData = valuesData[index] || {};
 | 
	
		
			
				|  |  | +    item.data_type = 2;
 | 
	
		
			
				|  |  | +    arrData.paramsInfo = item;
 | 
	
		
			
				|  |  | +    optionsData.push(arrData);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  datas.forEach((data, index) => {
 | 
	
		
			
				|  |  | +    var arrData = valuesData[index + formula.length] || {};
 | 
	
		
			
				|  |  | +    arrData.paramsInfo = data;
 | 
	
		
			
				|  |  | +    optionsData.push(arrData);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return optionsData;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  var DATA_CACHE = {};
 | 
	
	
		
			
				|  | @@ -239,9 +313,7 @@ async function getData(params, values) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (!DATA_CACHE[key]) {
 | 
	
		
			
				|  |  |      if (!timeType) {
 | 
	
		
			
				|  |  | -      DATA_CACHE[key] = await getDeviceRealData({
 | 
	
		
			
				|  |  | -        ...params,
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | +      DATA_CACHE[key] = await getDeviceRealData(params);
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |        if (timeType != -1) {
 | 
	
		
			
				|  |  |          let currentDate = moment();
 | 
	
	
		
			
				|  | @@ -262,84 +334,51 @@ async function getData(params, values) {
 | 
	
		
			
				|  |  |    return DATA_CACHE[key];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// 获取表单的options
 | 
	
		
			
				|  |  | -export async function getFormOptions(values, datas, projectId) {
 | 
	
		
			
				|  |  | -  let arrtData = values.data || [];
 | 
	
		
			
				|  |  | -  const params = getFormParams(datas, projectId);
 | 
	
		
			
				|  |  | -  if (!values.timeType) {
 | 
	
		
			
				|  |  | -    // 请求最新数据
 | 
	
		
			
				|  |  | -    let data = await getFormCurrentData(params, values);
 | 
	
		
			
				|  |  | -    let resData = data.map((item, index) => {
 | 
	
		
			
				|  |  | -      let attrDataItem = arrtData[index] || {};
 | 
	
		
			
				|  |  | +function getFormulaData(formula, plcData, formData, timeType) {
 | 
	
		
			
				|  |  | +  let expression = [...formula.expression];
 | 
	
		
			
				|  |  | +  let resDatas = formula.params.map(params => {
 | 
	
		
			
				|  |  | +    let res;
 | 
	
		
			
				|  |  | +    if (params.data_type == 0) {
 | 
	
		
			
				|  |  | +      res = findPlcData(params, plcData, timeType);
 | 
	
		
			
				|  |  |        return {
 | 
	
		
			
				|  |  | -        ...attrDataItem,
 | 
	
		
			
				|  |  | -        name: item.title,
 | 
	
		
			
				|  |  | -        value: item.value * 1,
 | 
	
		
			
				|  |  | +        ...params,
 | 
	
		
			
				|  |  | +        ...res,
 | 
	
		
			
				|  |  |        };
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    return {
 | 
	
		
			
				|  |  | -      ...values,
 | 
	
		
			
				|  |  | -      data: resData,
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    // 请求历史数据
 | 
	
		
			
				|  |  | -    let data = await getFormHistoryData(params, values);
 | 
	
		
			
				|  |  | -    values.data = data.map((item, i) => {
 | 
	
		
			
				|  |  | -      let attrDataItem = arrtData[i] || {};
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      res = findFormData(params, formData, timeType);
 | 
	
		
			
				|  |  |        return {
 | 
	
		
			
				|  |  | -        ...attrDataItem,
 | 
	
		
			
				|  |  | -        ...item,
 | 
	
		
			
				|  |  | +        ...params,
 | 
	
		
			
				|  |  | +        ...res,
 | 
	
		
			
				|  |  |        };
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return values;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 根据表单的数据项获取请求参数
 | 
	
		
			
				|  |  | -function getFormParams(datas, projectId) {
 | 
	
		
			
				|  |  | -  let params = {};
 | 
	
		
			
				|  |  | -  datas.forEach(item => {
 | 
	
		
			
				|  |  | -    if (!params[item.data_name]) params[item.data_name] = [];
 | 
	
		
			
				|  |  | -    params[item.data_name].push(item.data_title);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  | -  return Object.keys(params).map(data_name => ({
 | 
	
		
			
				|  |  | -    formName: data_name,
 | 
	
		
			
				|  |  | -    titles: params[data_name],
 | 
	
		
			
				|  |  | -    projectId,
 | 
	
		
			
				|  |  | -  }));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// 请求表单最新数据
 | 
	
		
			
				|  |  | -async function getFormCurrentData(params, values) {
 | 
	
		
			
				|  |  | -  const { timeType, date } = values;
 | 
	
		
			
				|  |  | -  let data = [];
 | 
	
		
			
				|  |  | -  for (let i = 0; i < params.length; i++) {
 | 
	
		
			
				|  |  | -    const resData = await queryFormCurrentData(params[i]);
 | 
	
		
			
				|  |  | -    data = [...data, ...resData];
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  return data;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// 请求表单历史数据
 | 
	
		
			
				|  |  | -async function getFormHistoryData(params, values) {
 | 
	
		
			
				|  |  | -  const { timeType, date } = values;
 | 
	
		
			
				|  |  | -  let sTime, eTime;
 | 
	
		
			
				|  |  | -  let data = [];
 | 
	
		
			
				|  |  | -  // -1为自选日期  从date内获取时间
 | 
	
		
			
				|  |  | -  if (timeType == -1) {
 | 
	
		
			
				|  |  | -    let clear = { hour: 0, minute: 0, second: 0, millisecond: 0 };
 | 
	
		
			
				|  |  | -    eTime = moment(date[1]).set(clear) * 1;
 | 
	
		
			
				|  |  | -    sTime = moment(date[0]).set(clear) * 1;
 | 
	
		
			
				|  |  | +  if (timeType) {
 | 
	
		
			
				|  |  | +    let optionsData = [];
 | 
	
		
			
				|  |  | +    // 获取时间
 | 
	
		
			
				|  |  | +    let time = resDatas[0].data.map(item => item.htime);
 | 
	
		
			
				|  |  | +    time.forEach((htime, index) => {
 | 
	
		
			
				|  |  | +      resDatas.forEach(params => {
 | 
	
		
			
				|  |  | +        // 根据index去替换表达式中对应的值
 | 
	
		
			
				|  |  | +        expression[params.index] = params.data[index].val || 0;
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      optionsData.push({
 | 
	
		
			
				|  |  | +        htime: moment(htime).format('YYYY-MM-DD HH:mm:ss'),
 | 
	
		
			
				|  |  | +        val: computePrefixExpression([...expression]),
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      data: optionsData,
 | 
	
		
			
				|  |  | +      name: formula.FormulaName,
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    let currentDate = moment();
 | 
	
		
			
				|  |  | -    eTime = currentDate * 1;
 | 
	
		
			
				|  |  | -    sTime = currentDate.add(-1 * timeType, 'hour') * 1;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  for (let i = 0; i < params.length; i++) {
 | 
	
		
			
				|  |  | -    const resData = await queryFormHistoryData({ ...params[i], eTime, sTime });
 | 
	
		
			
				|  |  | -    data = [...data, ...resData];
 | 
	
		
			
				|  |  | +    resDatas.forEach(params => {
 | 
	
		
			
				|  |  | +      // 根据index去替换表达式中对应的值
 | 
	
		
			
				|  |  | +      expression[params.index] = params.value || 0;
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      value: computePrefixExpression([...expression]),
 | 
	
		
			
				|  |  | +      name: formula.FormulaName,
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  return data;
 | 
	
		
			
				|  |  |  }
 |