注射时间、成像时间输入添加限制
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
9500842628
commit
a83349387a
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue