feat:样品分析计算

This commit is contained in:
houjunxiang
2026-01-30 19:39:32 +08:00
parent 9b0834f4c1
commit 6a3d0c7bdd
6 changed files with 182 additions and 68 deletions

View File

@@ -264,7 +264,16 @@ const rollbackAssayTask = data => {
data
})
}
// 手动配料 post 参数与自动下发配料一致
const manualIngredients = data => {
return request({
url: '/qms/bus/sample/analysis/manualIngredients',
method: 'POST',
data: {
...data
}
})
}
/*
* 查询回收率配置*/
const queryConRecoveryRateList = param => {
@@ -311,5 +320,6 @@ export default {
rollbackAssayTask,
submitTask,
taskIngredients,
queryQmsDicSampleProcessCodeList
queryQmsDicSampleProcessCodeList,
manualIngredients
}

View File

@@ -7,7 +7,8 @@ math.config({
export { math }
/*
* 计算当前样品分析值*/
export function calcAnalysisValue(group) {
export function calcAnalysisValue(group, externalFormData, taskIngredientsWay) {
const MAX_ITERATIONS = 5 // 防止无限循环
let iterations = 0
let changed = true
@@ -21,7 +22,6 @@ export function calcAnalysisValue(group) {
let formula = ele.formula
let formulas = formula.split('|')
let formulaVal = ''
console.log(formulas)
formulas.forEach(f => {
let value = ''
if (f.charAt(0) === 'p') {
@@ -38,18 +38,18 @@ export function calcAnalysisValue(group) {
formulaVal += value
})
console.log(formulaVal)
let v
if (formulaVal.startsWith('Get')) {
//计算公式为Get开头的都是执行方法
let v = ''
if (formulaVal.startsWith('Get_')) {
//计算公式为Get开头的都是执行方法,只有人工配料才执行
if (taskIngredientsWay !== 'manual') continue
v = eval(formulaVal)
} else if (formulaVal.startsWith('GetFrom')) {
v = evaluateGetFromFormula(formulaVal, false, externalFormData)
} else {
v = math.evaluate(formulaVal).toString()
v = isFinite(v) ? v.toString() : 0
}
console.log(v)
ele.value = handleRoundFiveNumber(v, ele.decimalPosition)
changed = true
}
@@ -60,9 +60,54 @@ export function calcAnalysisValue(group) {
}
}
// parse: 是否解析公式
export function evaluateGetFromFormula(formula, parse, externalFormData, currentColumn, row, dynamicsColumns) {
let formulaVal = formula
if (parse) {
formulaVal = parseFormula(formulaVal, row, dynamicsColumns)
}
let relFormulaVal = formulaVal.split(':')[1]
for (const [key, value] of Object.entries(externalFormData)) {
if (relFormulaVal.includes(key)) {
relFormulaVal = relFormulaVal.replace(key, value || 0)
}
}
console.log(relFormulaVal)
try {
let v = math.evaluate(relFormulaVal)
v = isFinite(v) ? v : 0
if (parse) {
return handleRoundFiveNumber(v, currentColumn.decimalPosition)
}
return v
} catch (e) {
console.warn('GetFrom formula evaluate error:', relFormulaVal, e)
return 0
}
}
// 解析公式
function parseFormula(formula, row, dynamicsColumns) {
let formulas = formula.split('|')
let formulaVal = ''
formulas.forEach(f => {
if (f.charAt(0) === 'p') {
let o = dynamicsColumns.find(i => 'p' + i.paramNo === f && i.type !== 'project')
const currentColumnData = row[o.fieldIndex]
formulaVal += currentColumnData.value ? currentColumnData.value : 0
} else if (f.charAt(0) === 'e') {
let o = dynamicsColumns.find(i => 'e' + i.paramNo === f)
formulaVal += row[o.fieldIndex]?.value ? row[o.fieldIndex].value : 0
} else {
formulaVal += f
}
})
return formulaVal
}
// 根据样品和配置列计算分析值
export function calcRowAnalysisValue(row, columnObj, dynamicsColumns) {
export function calcRowAnalysisValue(row, columnObj, dynamicsColumns, externalFormData, taskIngredientsWay) {
if (!columnObj.paramNo || !row[columnObj.fieldIndex]) return
for (let i = 0; i < dynamicsColumns.length; i++) {
let curItem = dynamicsColumns[i]
if (curItem.fieldIndex === columnObj.fieldIndex) continue
@@ -70,30 +115,19 @@ export function calcRowAnalysisValue(row, columnObj, dynamicsColumns) {
let param = columnObj.fieldIndex.charAt(0) === 'p' ? 'p' + columnObj.paramNo : 'e' + columnObj.paramNo
if (curItem.formula && curItem.formula.includes(param)) {
let formula = curItem.formula
let formulas = formula.split('|')
let formulaVal = ''
formulas.forEach(f => {
if (f.charAt(0) === 'p') {
let o = dynamicsColumns.find(i => 'p' + i.paramNo === f && i.type !== 'project')
formulaVal += row[o.fieldIndex]?.value ? row[o.fieldIndex].value : 0
} else if (f.charAt(0) === 'e') {
let o = dynamicsColumns.find(i => 'e' + i.paramNo === f)
formulaVal += row[o.fieldIndex]?.value ? row[o.fieldIndex].value : 0
} else {
formulaVal += f
}
})
let formulaVal = parseFormula(formula, row, dynamicsColumns)
let v
if (formulaVal.startsWith('Get')) {
formulaVal = formulaVal.replace(')', ",'" + row.conBaseSampleId + "')")
if (formulaVal.startsWith('Get_')) {
if (taskIngredientsWay !== 'manual') continue
v = eval(formulaVal)
} else if (formulaVal.startsWith('GetFrom')) {
v = evaluateGetFromFormula(formulaVal, false, externalFormData)
} else {
v = math.evaluate(formulaVal).toString()
v = isFinite(v) ? v : 0
}
row[curItem.fieldIndex].value = handleRoundFiveNumber(Number(v), row[curItem.fieldIndex].decimalPosition)
calcRowAnalysisValue(row, curItem, dynamicsColumns)
calcRowAnalysisValue(row, curItem, dynamicsColumns, externalFormData)
}
}
}
@@ -162,6 +196,27 @@ const Get_C_KNO3_bySValue = function (sValue, weight, operator) {
return ''
}
function Get_C_KNO3(sValue, weight, operator) {
//判断sValue是数字
if (sValue === 0 || weight === 0) {
return ''
}
let S = number(sValue)
const W = number(weight)
if (W === 0) return ''
const V = ((W * S) / 100) * 22 - 75
if (operator === '<' && V < 0) {
console.log(math.abs(V / 12))
return math.abs(V / 12)
}
if (operator === '>=' && V >= 0) {
console.log(V / 4)
return V / 4
}
return ''
}
/** 处理数值数据:四舍六入奇进偶不进
* 1如果取小数的最后一位为55前为奇数进位为偶不进,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一