diff --git a/src/components/Dicom/DicomViewer.vue b/src/components/Dicom/DicomViewer.vue index 450c643f..f14b1961 100644 --- a/src/components/Dicom/DicomViewer.vue +++ b/src/components/Dicom/DicomViewer.vue @@ -327,14 +327,22 @@ - + - - + - @@ -447,8 +455,8 @@ export default { PatientWeight: null, RadionuclideTotalDose: null, RadionuclideHalfLife: null, - RadiopharmaceuticalStartTime: null, - AcquisitionTime: null, + RadiopharmaceuticalStartTime: '', + AcquisitionTime: '', TimeCheck: '' }, rules: { @@ -469,11 +477,11 @@ export default { ], RadiopharmaceuticalStartTime: [ { required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, - { type: 'number', message: this.$t('trials:ptData:ruleMessage:number2'), trigger: 'blur' }//请输入数字 + { validator: this.validateDicomTime, trigger: 'blur' } ], AcquisitionTime: [ { required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, - { type: 'number', message: this.$t('trials:ptData:ruleMessage:number2'), trigger: 'blur' },//请输入数字 + { validator: this.validateDicomTime, trigger: 'blur' }, // 自定义校验:确保成像时间不早于注射时间 { validator: this.validateTime, trigger: 'blur' } ] @@ -1055,12 +1063,68 @@ export default { // 时间一致性校验 validateTime(rule, value, callback) { const { RadiopharmaceuticalStartTime } = this.formData - if (value && RadiopharmaceuticalStartTime !== null && value < RadiopharmaceuticalStartTime) { + const acquireSeconds = this.timeToSeconds(value) + const startSeconds = this.timeToSeconds(RadiopharmaceuticalStartTime) + if (acquireSeconds !== null && startSeconds !== null && acquireSeconds < startSeconds) { callback(new Error(this.$t('trials:ptData:ruleMessage:number3')))//成像时间不能早于注射时间 } else { callback() } }, + validateDicomTime(rule, value, callback) { + if (value === undefined || value === null || value === '') { + callback() + return + } + const raw = String(value).trim() + if (!/^\d{1,6}$/.test(raw)) { + callback(new Error(this.$t('trials:ptData:ruleMessage:number2'))) + return + } + const normalized = this.normalizeClinicalTime(raw) + if (!this.isValidDicomTime(normalized)) { + callback(new Error(this.$t('trials:ptData:ruleMessage:number4')))//请输入有效时间(HHMMSS) + return + } + callback() + }, + normalizeClinicalTime(value) { + if (value === undefined || value === null || value === '') return '' + const digits = String(value).trim().replace(/[^\d]/g, '') + if (!digits) return '' + return digits.slice(0, 6).padStart(6, '0') + }, + isValidDicomTime(value) { + if (!/^\d{6}$/.test(String(value || ''))) return false + const normalized = String(value) + const hh = Number(normalized.slice(0, 2)) + const mm = Number(normalized.slice(2, 4)) + const ss = Number(normalized.slice(4, 6)) + return hh >= 0 && hh <= 23 && mm >= 0 && mm <= 59 && ss >= 0 && ss <= 59 + }, + timeToSeconds(value) { + const normalized = this.normalizeClinicalTime(value) + if (!this.isValidDicomTime(normalized)) return null + const hh = Number(normalized.slice(0, 2)) + const mm = Number(normalized.slice(2, 4)) + const ss = Number(normalized.slice(4, 6)) + return hh * 3600 + mm * 60 + ss + }, + handleTimeBlur(field) { + const value = this.formData[field] + if (value === undefined || value === null || value === '') return + this.formData[field] = this.normalizeClinicalTime(value) + this.computeTimeRelation() + }, + normalizeTimeFields() { + this.formData.RadiopharmaceuticalStartTime = this.normalizeClinicalTime( + this.formData.RadiopharmaceuticalStartTime + ) + this.formData.AcquisitionTime = this.normalizeClinicalTime( + this.formData.AcquisitionTime + ) + this.computeTimeRelation() + }, computeTimeRelation() { const startTime = this.formData.RadiopharmaceuticalStartTime const acquireTime = this.formData.AcquisitionTime @@ -1070,7 +1134,14 @@ export default { return } - if (startTime <= acquireTime) { + const startSeconds = this.timeToSeconds(startTime) + const acquireSeconds = this.timeToSeconds(acquireTime) + if (startSeconds === null || acquireSeconds === null) { + this.formData.TimeCheck = '' + return + } + + if (startSeconds <= acquireSeconds) { this.formData.TimeCheck = this.$t('trials:ptData:timeCheck:val1') //注射时间 ≤ 成像时间 } else { this.formData.TimeCheck = this.$t('trials:ptData:timeCheck:val2') //注射时间 > 成像时间 @@ -1087,8 +1158,8 @@ export default { PatientWeight: parseFloat(res.Result.PatientWeight) || null, RadionuclideTotalDose: parseFloat(res.Result.RadionuclideTotalDose) || null, RadionuclideHalfLife: parseFloat(res.Result.RadionuclideHalfLife) || null, - RadiopharmaceuticalStartTime: parseFloat(res.Result.RadiopharmaceuticalStartTime) || '', - AcquisitionTime: parseFloat(res.Result.AcquisitionTime) || '', + RadiopharmaceuticalStartTime: this.normalizeClinicalTime(res.Result.RadiopharmaceuticalStartTime), + AcquisitionTime: this.normalizeClinicalTime(res.Result.AcquisitionTime), TimeCheck: '' } this.computeTimeRelation() @@ -1178,6 +1249,7 @@ export default { try { let valid = await this.$refs.patientForm.validate() if (!valid) return + this.normalizeTimeFields() this.formLoading = true let res = await editPatientInfo(this.formData) this.formLoading = false diff --git a/src/store/modules/reading.js b/src/store/modules/reading.js index 37dd90f0..1a861ca1 100644 --- a/src/store/modules/reading.js +++ b/src/store/modules/reading.js @@ -79,7 +79,7 @@ function getQuestions(questions) { answerObj.angle = angle answerObj.saveTypeEnum = isNaN(parseFloat(angle)) ? 1 : 2 } - } else if (criterionType === 21) { + } else if (criterionType === 21 || criterionType === 22) { // MRI-PDFF let isMeasurable = getQuestionAnswer(item.TableQuestions.Questions, 1105, answerObj) answerObj.isMeasurable = isMeasurable @@ -699,7 +699,7 @@ const actions = { var measureData = state.visitTaskList[index].MeasureData // var idx = measureData.findIndex(item => item.MeasureData.uuid === obj.data.MeasureData.data.uuid) - if (criterionType === 21) { + if (criterionType === 21 || criterionType === 22) { let i = measureData.findIndex(i => i.TableQuestionId === obj.data.TableQuestionId) if (i > -1) { for (const k in state.visitTaskList[index].MeasureData[i]) { @@ -821,7 +821,7 @@ const actions = { var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId) var measureData = state.visitTaskList[index].MeasureData const criterionType = parseInt(localStorage.getItem('CriterionType')) - if (criterionType === 21) { + if (criterionType === 21 || criterionType === 22) { const i = measureData.findIndex(item => item.QuestionId === obj.questionId && item.OrderMarkName === obj.orderMarkName) if (i > -1) { if (measureData[i].FristAddTaskId) { diff --git a/src/views/trials/trials-panel/reading/reading-tracking/index.vue b/src/views/trials/trials-panel/reading/reading-tracking/index.vue index 00d83f18..141df13d 100644 --- a/src/views/trials/trials-panel/reading/reading-tracking/index.vue +++ b/src/views/trials/trials-panel/reading/reading-tracking/index.vue @@ -784,7 +784,7 @@ - + @@ -894,7 +894,7 @@ import BaseContainer from '@/components/BaseContainer' import Pagination from '@/components/Pagination' import RefereeRules from './components/RefereeRules.vue' import ReviewResults from './components/ReviewResults' -import ClinicalData from '../../subject/reading-period/components/ClinicalData' +import ClinicalData from '../../subject/reading-period/components/ClinicalData' import RecordList from './components/RecordList.vue' import TargetSection from "@/views/trials/trials-panel/reading/reading-task/components/TargetSection" const searchDataDefault = () => { diff --git a/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue b/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue index 97d6ea6e..a65446d7 100644 --- a/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue +++ b/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue @@ -145,7 +145,7 @@ " @click="handleDelete(scope.row)" /> + :data="currentData" :showUpdateStatusBtn="currentData.ModuleType === 3" @getList="getList" />
- + - + @@ -469,8 +473,8 @@ export default { PatientWeight: null, RadionuclideTotalDose: null, RadionuclideHalfLife: null, - RadiopharmaceuticalStartTime: null, - AcquisitionTime: null, + RadiopharmaceuticalStartTime: '', + AcquisitionTime: '', TimeCheck: '', Reason: '' }, @@ -492,11 +496,11 @@ export default { ], RadiopharmaceuticalStartTime: [ { required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, - { type: 'number', message: this.$t('trials:ptData:ruleMessage:number2'), trigger: 'blur' }//请输入数字 + { validator: this.validateDicomTime, trigger: 'blur' } ], AcquisitionTime: [ { required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, - { type: 'number', message: this.$t('trials:ptData:ruleMessage:number2'), trigger: 'blur' },//请输入数字 + { validator: this.validateDicomTime, trigger: 'blur' }, // 自定义校验:确保成像时间不早于注射时间 { validator: this.validateTime, trigger: 'blur' } ], @@ -814,12 +818,68 @@ export default { // 时间一致性校验 validateTime(rule, value, callback) { const { RadiopharmaceuticalStartTime } = this.formData - if (value && RadiopharmaceuticalStartTime !== null && value < RadiopharmaceuticalStartTime) { + const acquireSeconds = this.timeToSeconds(value) + const startSeconds = this.timeToSeconds(RadiopharmaceuticalStartTime) + if (acquireSeconds !== null && startSeconds !== null && acquireSeconds < startSeconds) { callback(new Error(this.$t('trials:ptData:ruleMessage:number3')))//成像时间不能早于注射时间 } else { callback() } }, + validateDicomTime(rule, value, callback) { + if (value === undefined || value === null || value === '') { + callback() + return + } + const raw = String(value).trim() + if (!/^\d{1,6}$/.test(raw)) { + callback(new Error(this.$t('trials:ptData:ruleMessage:number2'))) + return + } + const normalized = this.normalizeClinicalTime(raw) + if (!this.isValidDicomTime(normalized)) { + callback(new Error(this.$t('trials:ptData:ruleMessage:number4')))//请输入有效时间(HHMMSS) + return + } + callback() + }, + normalizeClinicalTime(value) { + if (value === undefined || value === null || value === '') return '' + const digits = String(value).trim().replace(/[^\d]/g, '') + if (!digits) return '' + return digits.slice(0, 6).padStart(6, '0') + }, + isValidDicomTime(value) { + if (!/^\d{6}$/.test(String(value || ''))) return false + const normalized = String(value) + const hh = Number(normalized.slice(0, 2)) + const mm = Number(normalized.slice(2, 4)) + const ss = Number(normalized.slice(4, 6)) + return hh >= 0 && hh <= 23 && mm >= 0 && mm <= 59 && ss >= 0 && ss <= 59 + }, + timeToSeconds(value) { + const normalized = this.normalizeClinicalTime(value) + if (!this.isValidDicomTime(normalized)) return null + const hh = Number(normalized.slice(0, 2)) + const mm = Number(normalized.slice(2, 4)) + const ss = Number(normalized.slice(4, 6)) + return hh * 3600 + mm * 60 + ss + }, + handleTimeBlur(field) { + const value = this.formData[field] + if (value === undefined || value === null || value === '') return + this.formData[field] = this.normalizeClinicalTime(value) + this.computeTimeRelation() + }, + normalizeTimeFields() { + this.formData.RadiopharmaceuticalStartTime = this.normalizeClinicalTime( + this.formData.RadiopharmaceuticalStartTime + ) + this.formData.AcquisitionTime = this.normalizeClinicalTime( + this.formData.AcquisitionTime + ) + this.computeTimeRelation() + }, computeTimeRelation() { const startTime = this.formData.RadiopharmaceuticalStartTime const acquireTime = this.formData.AcquisitionTime @@ -829,7 +889,14 @@ export default { return } - if (startTime <= acquireTime) { + const startSeconds = this.timeToSeconds(startTime) + const acquireSeconds = this.timeToSeconds(acquireTime) + if (startSeconds === null || acquireSeconds === null) { + this.formData.TimeCheck = '' + return + } + + if (startSeconds <= acquireSeconds) { this.formData.TimeCheck = this.$t('trials:ptData:timeCheck:val1') //注射时间 ≤ 成像时间 } else { this.formData.TimeCheck = this.$t('trials:ptData:timeCheck:val2') //注射时间 > 成像时间 @@ -847,8 +914,8 @@ export default { PatientWeight: parseFloat(res.Result.PatientWeight) || null, RadionuclideTotalDose: parseFloat(res.Result.RadionuclideTotalDose) || null, RadionuclideHalfLife: parseFloat(res.Result.RadionuclideHalfLife) || null, - RadiopharmaceuticalStartTime: parseFloat(res.Result.RadiopharmaceuticalStartTime) || '', - AcquisitionTime: parseFloat(res.Result.AcquisitionTime) || '', + RadiopharmaceuticalStartTime: this.normalizeClinicalTime(res.Result.RadiopharmaceuticalStartTime), + AcquisitionTime: this.normalizeClinicalTime(res.Result.AcquisitionTime), TimeCheck: '', Reason: res.Result.Reason } @@ -865,10 +932,12 @@ export default { let valid = await this.$refs.patientForm.validate() if (!valid) return if (this.isAudit) { + this.normalizeTimeFields() const { CorrectImageExaminationInformation } = const_.processSignature this.signCode = CorrectImageExaminationInformation this.signVisible = true } else { + this.normalizeTimeFields() this.formLoading = true let res = await editPatientInfo(this.formData) this.formLoading = false