问题修改

dev-scheduling
jinna 2 days ago
parent a47164c66a
commit 32b7fe6a67
  1. 76
      src/utils/tankclac.js
  2. 21
      src/views/basicData/components/addRuleDialog.vue
  3. 10
      src/views/basicData/ruleMaintenance.vue
  4. 53
      src/views/qualityManagement/tankSolutionSystem/components/batchDialog.vue
  5. 2
      src/views/qualityManagement/tankSolutionSystem/inspectionReport.vue

@ -60,11 +60,20 @@ export function calcTank(data,row,equation){
'添加点': self['添加点'], '添加点': self['添加点'],
}; };
console.log('formula--------',formula)
for (const [key, value] of Object.entries(globalReplacements)) { for (const [key, value] of Object.entries(globalReplacements)) {
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
console.log('escapedKey---------------',escapedKey)
// 2. 【新增】清洗和校验 value,确保它是合法数字
let safeValue = Number(value);
// 如果转换后是 NaN,或者原始值本身就是空/非法的,就默认设为 0
if (isNaN(safeValue) || value === '' || value === null) {
safeValue = 0;
}
formula = formula.replace(new RegExp(escapedKey, 'g'), String(value)); formula = formula.replace(new RegExp(escapedKey, 'g'), String(value));
} }
// 5. 转为合法 JS 表达式 // 5. 转为合法 JS 表达式
let expr = formula let expr = formula
.replace(/{/g, '(') .replace(/{/g, '(')
@ -145,15 +154,64 @@ export function calcTank(data,row,equation){
// return jsExpr; // return jsExpr;
} }
// export function safeEval(expr) {
// console.log('expr--------',expr)
// // 只允许数字、括号、+ - * / . 等安全字符
// if (!/^[\d+\-*/().]+$/.test(expr)) {
// throw new Error("公式包含非法字符");
// }
// try {
// // 使用 Function 而非 eval 更安全(无作用域访问)
// return new Function('return (' + expr + ')')();
// } catch (e) {
// throw new Error("公式计算失败: " + e.message);
// }
// }
// export function safeEval(expr, fallback = 0) {
// console.log('expr--------', expr)
// // 只允许数字、括号、+ - * / . 等安全字符
// if (!/^[\d+\-*/().\s]+$/.test(expr)) { // 稍微优化了正则,增加了\s允许空格
// throw new Error("公式包含非法字符");
// }
// try {
// // 使用 Function 进行计算
// const result = new Function('return (' + expr + ')')();
// console.log('result--------',result)
// // 【核心修改】拦截 NaN:如果计算结果是 NaN,就返回兜底值(默认为 0)
// // 这样 (0/0)+5 就会变成 0+5,最终返回 5
// return isNaN(result) ? fallback : result;
// } catch (e) {
// throw new Error("公式计算失败: " + e.message);
// }
// }
export function safeEval(expr) { export function safeEval(expr) {
// 只允许数字、括号、+ - * / . 等安全字符
if (!/^[\d+\-*/().]+$/.test(expr)) {
throw new Error("公式包含非法字符");
}
try { try {
// 使用 Function 而非 eval 更安全(无作用域访问) // 【核心修改】预处理:把公式中所有的 0/0 替换成 0
return new Function('return (' + expr + ')')(); // 正则解释:\b0\/0\b 精确匹配独立的 "0/0",避免误伤 "10/0" 或 "0/05"
} catch (e) { expr = expr.replace(/\b0\/0\b/g, '0');
throw new Error("公式计算失败: " + e.message);
const result = new Function('return (' + expr + ')')();
console.log('result--------',result,result == 0)
// if(result == 0){
// return { success: true, message: 0 };
// }
// 剩下的兜底逻辑:处理 5/0 这种等于 Infinity 的情况
if (!isFinite(result) || isNaN(result)) {
// // 如果你希望 5/0 这种也变成 0 从而算出 5,可以把这里改成 result = 0;
// return "检测到公式中存在除以0或无效运算";
return { success: false, message: "检测到公式中存在除以0或无效运算" };
} }
// return result;
return { success: true, value: result == 0 ? 0 : result };
} catch (e) {
return { success: false, message: "公式语法错误" };
// return "公式语法错误";
} }
}

@ -17,7 +17,17 @@
{{ formError }} {{ formError }}
</div> </div>
<el-table :data="form.tableData" @select="selectChange" border> <el-table :data="form.tableData" @select="selectChange" border>
<el-table-column type="selection" width="55"></el-table-column> <el-table-column type="selection" width="55" align="center"></el-table-column>
<el-table-column align="center" label="顺序" prop="sort">
<template #header>
<span><i style="color: red">*</i>顺序</span>
</template>
<template #default="scope">
<el-form-item :prop="`tableData[${scope.$index}].sort`" :rules="formRules.sort">
<el-input-number v-model="scope.row.sort" placeholder="请输入顺序" controls-position="right"></el-input-number>
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" label="工艺能力" prop="craftAbilityId"> <el-table-column align="center" label="工艺能力" prop="craftAbilityId">
<template #header> <template #header>
<span><i style="color: red">*</i>工艺能力</span> <span><i style="color: red">*</i>工艺能力</span>
@ -75,21 +85,21 @@
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="单件面积下限(dm²)" prop="lowArea"> <el-table-column align="center" label="单件面积下限(dm²)" prop="lowArea" width="150px">
<template #default="scope"> <template #default="scope">
<el-form-item :prop="`tableData[${scope.$index}].lowArea`" :rules="formRules.lowArea"> <el-form-item :prop="`tableData[${scope.$index}].lowArea`" :rules="formRules.lowArea">
<el-input v-model="scope.row.lowArea" placeholder="请输入单件面积下限"></el-input> <el-input v-model="scope.row.lowArea" placeholder="请输入单件面积下限"></el-input>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="单件面积上限(dm²)" prop="upArea"> <el-table-column align="center" label="单件面积上限(dm²)" prop="upArea" width="150px">
<template #default="scope"> <template #default="scope">
<el-form-item :prop="`tableData[${scope.$index}].upArea`" :rules="formRules.upArea"> <el-form-item :prop="`tableData[${scope.$index}].upArea`" :rules="formRules.upArea">
<el-input v-model="scope.row.upArea" placeholder="请输入单件面积上限"></el-input> <el-input v-model="scope.row.upArea" placeholder="请输入单件面积上限"></el-input>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="单批面积下限(dm²)" prop="singleDownArea"> <el-table-column align="center" label="单批面积下限(dm²)" prop="singleDownArea" width="150px">
<template #default="scope"> <template #default="scope">
<el-form-item <el-form-item
:prop="`tableData[${scope.$index}].singleDownArea`" :prop="`tableData[${scope.$index}].singleDownArea`"
@ -102,7 +112,7 @@
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="单批面积上限(dm²)" prop="singleUpArea"> <el-table-column align="center" label="单批面积上限(dm²)" prop="singleUpArea" width="150px">
<template #default="scope"> <template #default="scope">
<el-form-item <el-form-item
:prop="`tableData[${scope.$index}].singleUpArea`" :prop="`tableData[${scope.$index}].singleUpArea`"
@ -276,6 +286,7 @@ export default {
], ],
limitType: [{ required: true, message: '请选择限制类型', trigger: ['change', 'submit'] }], limitType: [{ required: true, message: '请选择限制类型', trigger: ['change', 'submit'] }],
pointType: [{ required: true, message: '请选择指定类型', trigger: ['change', 'submit'] }], pointType: [{ required: true, message: '请选择指定类型', trigger: ['change', 'submit'] }],
sort:[{required: true, message: '请填写顺序', trigger: ['change', 'submit']}]
}, },
capabilityData: [], capabilityData: [],
identificationData: [], identificationData: [],

@ -18,11 +18,11 @@
:permission="permissionList" :permission="permissionList"
> >
<template #singleArea="{ row }"> <template #singleArea="{ row }">
<span v-if="row.lowArea==0&&row.upArea==0">-</span> <span v-if="(row.lowArea==0 || row.lowArea==-1)&& (row.upArea==0 || row.upArea== -1)">-</span>
<span v-else>{{ row.lowArea + '~' + row.upArea }}</span> <span v-else>{{ row.lowArea + '~' + row.upArea }}</span>
</template> </template>
<template #batchArea="{ row }"> <template #batchArea="{ row }">
<span v-if="row.singleDownArea==0&&row.singleUpArea==0">-</span> <span v-if="(row.singleDownArea==0 || row.singleDownArea == -1) && (row.singleUpArea==0 || row.singleUpArea == -1)">-</span>
<span v-else>{{ row.singleDownArea + '~' + row.singleUpArea }}</span> <span v-else>{{ row.singleDownArea + '~' + row.singleUpArea }}</span>
</template> </template>
@ -138,6 +138,12 @@ export default {
editBtnIcon: ' ', editBtnIcon: ' ',
align: 'center', align: 'center',
column: [ column: [
{
label:"顺序",
prop:"sort",
span:12,
sortable: 'custom',
},
{ {
label: '工艺能力', label: '工艺能力',
prop: 'craftAbilityId', prop: 'craftAbilityId',

@ -514,30 +514,59 @@ export default {
} else { } else {
row.qualified = 2; // row.qualified = 2; //
} }
this.data.map(item =>{
let formula = calcTank(this.data,item,item.addFormulaContent)
let theoryFormula = calcTank(this.data,item,item.afterFormulaContent)
console.log('safeEval(theoryFormula)------------',safeEval(theoryFormula).success)
console.log('safeEval(formula)------------',safeEval(formula))
if(safeEval(formula).success){
item.needAddValue = parseFloat(safeEval(formula).value) <= 0 ? 0 : parseFloat(safeEval(formula).value.toFixed(5))
}else{
this.$message.error(safeEval(formula).message)
}
if(safeEval(theoryFormula).success){
console.log('11111111111')
item.afterAddTheoryValue = parseFloat(safeEval(theoryFormula).value) < 0 ? 0 : parseFloat(safeEval(theoryFormula).value.toFixed(5))
}else{
console.log('222222222222')
this.$message.error(safeEval(theoryFormula).message)
}
// item.needAddValue = parseFloat(safeEval(formula).toFixed(5)) < 0 ? 0 : parseFloat(safeEval(formula).toFixed(5))
// console.log('theoryFormula----------',theoryFormula)
// item.afterAddTheoryValue = parseFloat(safeEval(theoryFormula).toFixed(5))
// console.log('afterAddTheoryValue------------',item.afterAddTheoryValue)
})
// >,/=0;= // >,/=0;=
if(testValue > fillingLocation){ if(testValue > fillingLocation){
row.needAddValue = 0 row.needAddValue = 0
row.actualAddValue = 0 row.actualAddValue = 0
row.afterAddTheoryValue = testValue row.afterAddTheoryValue = testValue
} }
this.data.map(item =>{
let formula = calcTank(this.data,item,item.addFormulaContent)
let theoryFormula = calcTank(this.data,item,item.afterFormulaContent)
item.needAddValue = parseFloat(safeEval(formula).toFixed(5))
item.afterAddTheoryValue = parseFloat(safeEval(theoryFormula).toFixed(5))
})
console.log('data------------',this.data) console.log('data------------',this.data)
}, },
changeActualValue(row,index){ changeActualValue(row,index){
let formula = calcTank(this.data,row,row.addFormulaContent) let formula = calcTank(this.data,row,row.addFormulaContent)
let theoryFormula = calcTank(this.data,row,row.afterFormulaContent) let theoryFormula = calcTank(this.data,row,row.afterFormulaContent)
console.log('row',row)
console.log('formula',formula) if(safeEval(formula).success){
console.log('theoryFormula',theoryFormula) row.needAddValue = parseFloat(safeEval(formula).value) <= 0 ? 0 : parseFloat(safeEval(formula).value.toFixed(5))
row.needAddValue = parseFloat(safeEval(formula).toFixed(5)) }else{
row.afterAddTheoryValue = parseFloat(safeEval(theoryFormula).toFixed(5)) this.$message.error(safeEval(formula).message)
}
if(safeEval(theoryFormula).success){
row.afterAddTheoryValue = parseFloat(safeEval(theoryFormula).value) < 0 ? 0 : parseFloat(safeEval(theoryFormula).value.toFixed(5))
}else{
this.$message.error(safeEval(theoryFormula).message)
}
// row.needAddValue = parseFloat(safeEval(formula).toFixed(5)) < 0 ? 0 : parseFloat(safeEval(formula).toFixed(5))
// row.afterAddTheoryValue = parseFloat(safeEval(theoryFormula).toFixed(5))
}, },
// //
handleSave(){ handleSave(){

@ -617,6 +617,7 @@ export default {
}) })
}, },
createLine() { createLine() {
this.loading = true
// workCenterId workTankId liquidTankId testElement createTimeStart createTimeEnd // workCenterId workTankId liquidTankId testElement createTimeStart createTimeEnd
console.log('lineForm--------',this.lineForm) console.log('lineForm--------',this.lineForm)
this.$refs.linesForm.validate(valid =>{ this.$refs.linesForm.validate(valid =>{
@ -638,6 +639,7 @@ export default {
} }
}) })
this.loading = false
console.log('this.reportData===============',this.reportData) console.log('this.reportData===============',this.reportData)
}) })
} }

Loading…
Cancel
Save