1 // change事件,根据公式计算
2 const changeField = (field, data) => {
3 // change事件 计算公式 徐文龙2023-08-17 晚
4 let specialChars = /[-+*/)(]/; // 正则
5 for (let i = 0; i < person.kpiList.length; i++) {
6 const element = person.kpiList[i];
7 // 找到有计算公式的数据
8 if (!!element["kpiFormula"]) {
9 //按照正则切割字符串
10 let splitted = person.kpiList[i]["kpiFormula"].split(specialChars);
11 // 去重再大到小排序(复杂到简单排序)
12 splitted = uniqueArray(splitted).reverse();
13 let SetData = {};
14 // 遍历数组 将公式中的数据存贮在一个特殊的对象中
15 for (const iterator of splitted) {
16 for (let j = 0; j < person.kpiList.length; j++) {
17 if (person.kpiList[j]["kpiName"] == iterator) {
18 SetData[iterator] = person.kpiList[j]["name"] ? person.kpiList[j]["name"]: "0";
19 break;
20 }
21 }
22 }
23 //取出公式
24 let setkpiFormula = person.kpiList[i]["kpiFormula"];
25 // 遍历公式中的对象 取属性值和属性名
26 for (const key in SetData) {
27 if (SetData.hasOwnProperty.call(SetData, key)) {
28 // 正则替换 全部替换
29 setkpiFormula = setkpiFormula.replace(RegExp(key, "g"), SetData[key]);
30 }
31 }
32 // 计算公式中的数据
33 let result = eval(setkpiFormula);
34 // 特殊情况没有值 或者无穷大和无穷小 规则避免
35 if (!result || result == -Infinity || result == Infinity) {
36 person.kpiList[i]["name"] = "";
37 } else {
38 // 给数据赋值 为字符串格式,并且四舍五入 保留两位小数
39 person.kpiList[i]["name"] = String(Round(Number(result),2));
40 }
41 }
42 }
43 };
1 <el-form-item
2 :label="field.kpiName"
3 v-for="(field, index) in person.kpiList"
4 :key="index"
5 >
6 <!-- :placeholder="field.kpiFormula" -->
7 <el-input
8 clearable
9 class="input_top"
10 v-model.trim="field.name"
11 placeholder=""
12 :disabled="field.disabled"
13 @change="changeField(field)"
14 oninput ="value=value.replace(/[^0-9.]/g,'')"
15 >
16 {{ field.name }}
17 <template #append style="width: 35px">
18 <span>{{ field.kpiUnit }}</span>
19 </template>
20 </el-input>
21 </el-form-item>
1 /**
2 *
3 * @param {any} num
4 * @param {number} dec
5 * @returns
6 * 小数四舍五入
7 */
8 export const Round = (num,dec)=>{
9 let sNum = num + "";
10 let idx = sNum.indexOf(".");
11 if (idx < 0) return num;
12 let n = sNum.length - idx - 1;
13 if (dec < n) {
14 let e = Math.pow(10, dec);
15 return Math.round(num * e) / e;
16 } else {
17 return num;
18 }
19 }
![]()