diff --git a/src/components/Dicom/DicomViewer.vue b/src/components/Dicom/DicomViewer.vue index 583b303a..82482896 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' } ] @@ -1017,12 +1025,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 @@ -1032,7 +1096,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') //注射时间 > 成像时间 @@ -1049,8 +1120,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() @@ -1140,6 +1211,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/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue index ed6a8c8d..662cb2e7 100644 --- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue +++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue @@ -277,23 +277,27 @@
- + - + @@ -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