diff --git a/nx/helper/calcAnalysisValue.js b/nx/helper/calcAnalysisValue.js index 99af0c6..32ebc77 100644 --- a/nx/helper/calcAnalysisValue.js +++ b/nx/helper/calcAnalysisValue.js @@ -352,3 +352,53 @@ export function groupByField(list, groupKey = 'groupDictionaryBusinessKey') { // 转为数组 return Array.from(groupMap.values()) } + +export function validateElementRange(fieldIndex, row, conRangeElementAnalysisList) { + if (!conRangeElementAnalysisList?.length) return null + const rangeElementAnalysis = conRangeElementAnalysisList.find( + ele => ele.dictionaryProjectId === row[fieldIndex]?.dicId && row[fieldIndex]['type'] === 'project' + ) + + if (!rangeElementAnalysis) return null + + const val = row[fieldIndex]?.value + + if (val == '' || val == null) return null + const value = Number(val) + + let result = { promptType: '', promptMsg: '' } + + switch (Number(rangeElementAnalysis.rangeType)) { + case 1: + //如果值小于最小警告值或者大于最大警告值,则校验不通过 + if (value < rangeElementAnalysis.minimumWarningValue || value > rangeElementAnalysis.maximumWarningValue) { + result.promptType = 'warning' + result.promptMsg = `警告:值超出范围(${rangeElementAnalysis.minimumWarningValue} ~ ${rangeElementAnalysis.maximumWarningValue})` + } + break + case 2: + //如果值小于最小限制值或者大于最大限制值,则校验不通过 + if (value < rangeElementAnalysis.minimumValue || value > rangeElementAnalysis.maximumValue) { + result.promptType = 'error' + result.promptMsg = `错误:值超出范围(${rangeElementAnalysis.minimumValue} ~ ${rangeElementAnalysis.maximumValue})` + } + break + case 3: + //如果值小于最小限制值或者大于最大限制值,则校验不通过 + if (value < rangeElementAnalysis.minimumValue || value > rangeElementAnalysis.maximumValue) { + result.promptType = 'error' + result.promptMsg = `错误:值超出范围(${rangeElementAnalysis.minimumValue} ~ ${rangeElementAnalysis.maximumValue})` + } else if ( + (rangeElementAnalysis.minimumValue < value && value < rangeElementAnalysis.minimumWarningValue) || + (rangeElementAnalysis.maximumWarningValue < value && value <= rangeElementAnalysis.maximumValue) + ) { + result.promptType = 'warning' + result.promptMsg = `警告:值超出范围(${rangeElementAnalysis.minimumWarningValue} ~ ${rangeElementAnalysis.maximumWarningValue})` + } + break + default: + return null + } + + return result +} diff --git a/pages/analysis/sample/sample-work-detail.vue b/pages/analysis/sample/sample-work-detail.vue index 2ee935a..527c512 100644 --- a/pages/analysis/sample/sample-work-detail.vue +++ b/pages/analysis/sample/sample-work-detail.vue @@ -105,6 +105,18 @@ 确认采集 + + + + + + + @@ -122,39 +134,41 @@ :id="'elId' + groupIndex" :style="{ height: fields.open ? collaHeights[groupIndex] + 'px' : '0' }" > --> - + @@ -211,7 +232,8 @@ import { handleRoundFiveNumber, calcRowAnalysisValue, math, - groupByField + groupByField, + validateElementRange } from '@/nx/helper/calcAnalysisValue' import { number } from 'mathjs' import AuncelSelectPopup from '@/components/sample/auncel-select-popup.vue' @@ -255,7 +277,11 @@ const busSubCSampleId = ref('') let fieldGroup = ref([]) const collaHeights = ref([]) const cupNumKey = '杯号' +const inputValue = ref('') +function handleResetInputValue() { + inputValue.value = '' +} // refs const myKeyboard = ref(null) const auncelSelector = ref(null) @@ -312,7 +338,10 @@ const parameterClassifyChange = v => { } const fieldClick = (field, key) => { - if (!field.isEdit || field.fillingWay === 'input') return + if (!field.isEdit) return + if (field.fillingWay === 'input') { + inputValue.value = field.value + } selectedField.value = field groupFieldIndex.value = key if (myKeyboard.value) { @@ -567,7 +596,27 @@ const checkBh = () => { } return true } - +const checkRange = async () => { + for (const g of fieldGroup.value) { + for (const f of g.fields) { + if (f.validation) { + if (f.validation.promptType === 'error') { + nx.$helper.showToast({ + title: '存在范围校验错误,请修正后再保存!', + icon: 'error', + duration: 2000 + }) + return false + } + if (f.validation.promptType === 'warning') { + const confirm = await tools.showPromiseModal('提示', '检测到范围警告,是否继续保存?') + return confirm + } + } + } + } + return true // 无问题,通过 +} const saveAuncelData = () => { //保存数据 if (!weightDataIsToZero.value) { @@ -625,6 +674,8 @@ const dynamicFormData = {} const saveDetail = async () => { //检查杯号 if (!checkBh()) return + // 检查范围校验 + if (!(await checkRange())) return setValueToSample() let params = { businessAssayTaskId: taskId.value @@ -634,7 +685,7 @@ const saveDetail = async () => { if (activeAssayTypeKey.value === 'kby' || activeAssayTypeKey.value === 'by') { // 处理其他页签的输入变化 const configInfomation = currentAssayType.value.configQCSampleMethodInfo - const row = sampleDataList.value[currentSampleIndex.value] + const row = currentSampleData.value configInfomation.forEach(item => { const sourceKey = item.source const sourceValue = row[sourceKey] @@ -657,7 +708,7 @@ const saveDetail = async () => { analysisType: item.value })) } else { - const datas = sampleDataList.value[currentSampleIndex.value] + const datas = currentSampleData.value params.assayTaskAnalysisDataList = [{ datas: [datas], analysisType: activeAssayTypeKey.value }] } @@ -703,14 +754,14 @@ function setValueToSample() { let fields = fieldGroup.value.flatMap(item => item.fields) fields.forEach(item => { if ( - sampleDataList.value[currentSampleIndex.value].hasOwnProperty(item.fieldIndex) && - nx.$test.object(sampleDataList.value[currentSampleIndex.value][item.fieldIndex]) + currentSampleData.value.hasOwnProperty(item.fieldIndex) && + nx.$test.object(currentSampleData.value[item.fieldIndex]) ) { - sampleDataList.value[currentSampleIndex.value][item.fieldIndex].value = item.value + currentSampleData.value[item.fieldIndex].value = item.value } // 初始化的时候保存杯号到样品中后续自动生成杯号用 if (item.title === cupNumKey && currentSampleIndex.value == 0) { - sampleDataList.value[currentSampleIndex.value].cupNum = item.value + currentSampleData.value.cupNum = item.value } }) } @@ -828,7 +879,7 @@ let assayGroups = ref([]) const activeAssayTypeKey = ref('') const activeAssayTypeIndex = ref(0) //元素结果范围 -let conRangeElementAnalysisList = [] +let conRangeElementAnalysisList = ref([]) const currentAssayType = computed(() => { return assayGroups.value.find(item => item.value === activeAssayTypeKey.value) }) @@ -856,6 +907,21 @@ const currentGroup = computed(() => { return fieldGroup.value.filter(g => g.value === curParameterKey.value) } }) +watch( + () => currentGroup.value, + () => { + fieldGroup.value.forEach(item => { + item.fields.forEach(field => { + const validation = validateElementRange( + field.fieldIndex, + currentSampleData.value, + conRangeElementAnalysisList.value + ) + field.validation = validation + }) + }) + } +) const collapseRef = ref() const activeCollapses = ref([]) function handleAssayTypeChange({ index, value }) { @@ -893,7 +959,7 @@ async function getSampleAnalysisByTaskId() { if (!activeAssayTypeKey.value) { activeAssayTypeKey.value = assayGroups.value.length > 0 ? assayGroups.value[0].value : '' } - conRangeElementAnalysisList = configAssayMethodProjectRangeList || [] + conRangeElementAnalysisList.value = configAssayMethodProjectRangeList || [] } // 设置字段值 function setValueToField() { @@ -905,7 +971,7 @@ function setValueToField() { } } function getFieldValue(field) { - const fieldValue = sampleDataList.value[currentSampleIndex.value][field.fieldIndex]?.value + const fieldValue = currentSampleData.value[field.fieldIndex]?.value if (fieldValue) { return fieldValue } else { @@ -1176,8 +1242,7 @@ onBackPress(() => { .form-item-my { display: flex; align-items: center; - margin-bottom: 10px; - height: 35px; + min-height: 35px; font-size: 13px; border-bottom: 1px solid #dcdcdc; } @@ -1233,6 +1298,12 @@ onBackPress(() => { .content-right-scroll { height: 68vh; } +.valid-warning { + color: orange; +} +.valid-error { + color: red; +} .u-tab-item { display: flex;