注射时间、成像时间输入添加限制
continuous-integration/drone/push Build is passing Details

main
caiyiling 2026-05-07 17:23:53 +08:00
parent 9500842628
commit a83349387a
2 changed files with 165 additions and 24 deletions

View File

@ -327,14 +327,22 @@
<el-input v-model.number="formData.RadionuclideHalfLife" :placeholder="$t('trials:halfLife:eg')"
style="width: 100%" :disabled="!isEdit"></el-input>
</el-form-item>
<!-- 注射时间s Unix 相对秒-->
<!-- 注射时间 HHMMSS-->
<el-form-item :label="$t('trials:ptData:label:injectTime')" prop="RadiopharmaceuticalStartTime">
<el-input v-model.number="formData.RadiopharmaceuticalStartTime" :placeholder="$t('trials:injectTime:eg')"
<el-input
v-model.trim="formData.RadiopharmaceuticalStartTime"
:placeholder="$t('trials:injectTime:eg')"
@blur="handleTimeBlur('RadiopharmaceuticalStartTime')"
maxlength="6"
style="width: 100%" @input="computeTimeRelation" :disabled="!isEdit"></el-input>
</el-form-item>
<!-- 成像时间s Unix 相对秒-->
<!-- 成像时间 HHMMSS-->
<el-form-item :label="$t('trials:ptData:label:acquisitionTime')" prop="AcquisitionTime">
<el-input v-model.number="formData.AcquisitionTime" :placeholder="$t('trials:injectTime:eg')"
<el-input
v-model.trim="formData.AcquisitionTime"
@blur="handleTimeBlur('AcquisitionTime')"
maxlength="6"
:placeholder="$t('trials:injectTime:eg')"
style="width: 100%" @input="computeTimeRelation" :disabled="!isEdit"></el-input>
</el-form-item>
<!-- 时间一致性检查 -->
@ -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

View File

@ -277,23 +277,27 @@
</el-form-item>
</div>
<div class="form-row">
<!-- 注射时间s Unix 相对秒-->
<!-- 注射时间 HHMMSS-->
<el-form-item class="form-item-half" :label="$t('trials:ptData:label:injectTime')" prop="RadiopharmaceuticalStartTime">
<el-input
v-model.number="formData.RadiopharmaceuticalStartTime"
v-model.trim="formData.RadiopharmaceuticalStartTime"
:placeholder="$t('trials:injectTime:eg')"
style="width: 100%"
@input="computeTimeRelation"
@blur="handleTimeBlur('RadiopharmaceuticalStartTime')"
maxlength="6"
:disabled="!isPatientFormCanEdit"
></el-input>
</el-form-item>
<!-- 成像时间s Unix 相对秒-->
<!-- 成像时间 HHMMSS-->
<el-form-item class="form-item-half" :label="$t('trials:ptData:label:acquisitionTime')" prop="AcquisitionTime">
<el-input
v-model.number="formData.AcquisitionTime"
v-model.trim="formData.AcquisitionTime"
:placeholder="$t('trials:injectTime:eg')"
style="width: 100%"
@input="computeTimeRelation"
@blur="handleTimeBlur('AcquisitionTime')"
maxlength="6"
:disabled="!isPatientFormCanEdit"
></el-input>
</el-form-item>
@ -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