feat:样品分析计算
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,如果取小数的最后一位为5,5前为奇数进位,为偶不进,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一
|
||||
|
||||
Reference in New Issue
Block a user