根因: - Bug #请修复 Bug #591 存在的问题 修复: - ### 变更摘要 - 全链路数据流分析**:录取(弹窗输入)→ 保存(API传入)→ 查询(Mapper返回)→ 修改(Service记录)→ 删除/停止(状态变更)→ 关联(列表展示) - ### 后端变更(4个文件) - 1. `AdviceBatchOpParam.java`** — 停嘱参数添加 `stopTime` 字段 - 新增 `@JsonFormat Date stopTime`,支持前端传入停嘱时间 - 2. `RequestBaseDto.java`** — 查询DTO添加 `stopUserName`、`stopTime` 字段 - 新增 `String stopUserName`(停嘱医生姓名) - 新增 `Date stopTime`(停嘱时间) - 3. `AdviceManageAppServiceImpl.java`** — 停嘱Service增强 - 优先使用前端传入的 `stopTime`,兜底用当前时间 - 通过 `SecurityUtils.getNickName()` 获取当前操作用户昵称,记录到 `updateBy` - 药品和诊疗两个更新入口均已同步修改 - 4. `AdviceManageAppMapper.xml`** — 三个UNION ALL子查询添加字段 - 药品子查询:`T1.effective_dose_end AS stop_time` + `T1.update_by AS stop_user_name` - 耗材子查询:`NULL AS stop_time` + `'' AS stop_user_name` - 诊疗子查询:`T1.occurrence_end_time AS stop_time` + `T1.update_by AS stop_user_name` - ### 前端变更(1个文件) - `order/index.vue`**: - 1. **停嘱时间弹窗** — 点击「停嘱」后弹出 `el-dialog`,内含 `el-date-picker`(datetime类型,默认当前时间),确定后才调用API - 2. **表格列** — 在「皮试」列后面、「诊断」列前面新增两列: - 「停嘱医生」`prop="stopUserName"`,宽度120px - 「停嘱时间」`prop="stopTime"`,宽度170px - 3. **`handleStopAdvice`** — 保留原有校验(未保存/未签发/已停止检查),校验通过后弹出时间选择弹窗而非直接调API - 4. **`confirmStopAdvice`** — 新增确认函数,将 `stopTime` 拼入请求参数后调用 `stopAdvice` API - ### 验证结果 - ✅ 前端 Lint 检查通过(仅1个预存的 `vue/no-dupe-keys` 警告) - ✅ 后端 Maven 编译通过(BUILD SUCCESS)
142 lines
3.1 KiB
Vue
Executable File
142 lines
3.1 KiB
Vue
Executable File
<template>
|
|
<el-input
|
|
:model-value="displayValue"
|
|
:placeholder="placeholder"
|
|
:disabled="disabled"
|
|
:clearable="clearable"
|
|
@input="handleInput"
|
|
@blur="handleBlur"
|
|
@change="handleChange"
|
|
>
|
|
<template
|
|
v-if="suffix"
|
|
#suffix
|
|
>
|
|
{{ suffix }}
|
|
</template>
|
|
</el-input>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {computed} from 'vue';
|
|
|
|
const props = defineProps({
|
|
modelValue: [Number, String],
|
|
placeholder: String,
|
|
disabled: Boolean,
|
|
clearable: {
|
|
type: Boolean,
|
|
default: true,
|
|
},
|
|
suffix: String,
|
|
precision: Number, // 小数位数
|
|
min: Number,
|
|
max: Number,
|
|
});
|
|
|
|
const emit = defineEmits(['update:modelValue', 'blur', 'change']);
|
|
|
|
const displayValue = computed(() => {
|
|
if (props.modelValue === null || props.modelValue === undefined || props.modelValue === '') {
|
|
return '';
|
|
}
|
|
return String(props.modelValue);
|
|
});
|
|
|
|
const handleInput = (value) => {
|
|
// 只允许数字、小数点和负号
|
|
let newValue = value.replace(/[^\d.-]/g, '');
|
|
|
|
// 只允许一个小数点
|
|
const parts = newValue.split('.');
|
|
if (parts.length > 2) {
|
|
newValue = parts[0] + '.' + parts.slice(1).join('');
|
|
}
|
|
|
|
// 只允许一个负号,且必须在开头
|
|
if (newValue.indexOf('-') > 0) {
|
|
newValue = newValue.replace(/-/g, '');
|
|
}
|
|
if (newValue.startsWith('-') && newValue.split('-').length > 2) {
|
|
newValue = '-' + newValue.replace(/-/g, '');
|
|
}
|
|
|
|
// 如果为空,直接返回空字符串
|
|
if (newValue === '' || newValue === '-') {
|
|
emit('update:modelValue', '');
|
|
return;
|
|
}
|
|
|
|
// 转换为数字
|
|
const numValue = parseFloat(newValue);
|
|
if (isNaN(numValue)) {
|
|
emit('update:modelValue', '');
|
|
return;
|
|
}
|
|
|
|
// 限制最小值
|
|
if (props.min !== undefined && numValue < props.min) {
|
|
newValue = String(props.min);
|
|
}
|
|
|
|
// 限制最大值
|
|
if (props.max !== undefined && numValue > props.max) {
|
|
newValue = String(props.max);
|
|
}
|
|
|
|
// 处理精度
|
|
if (props.precision !== undefined && newValue.includes('.')) {
|
|
const parts = newValue.split('.');
|
|
if (parts[1] && parts[1].length > props.precision) {
|
|
parts[1] = parts[1].substring(0, props.precision);
|
|
newValue = parts.join('.');
|
|
}
|
|
}
|
|
|
|
emit('update:modelValue', newValue);
|
|
};
|
|
|
|
const handleBlur = (event) => {
|
|
const value = event.target.value;
|
|
if (value === '' || value === '-') {
|
|
emit('update:modelValue', '');
|
|
emit('blur', event);
|
|
return;
|
|
}
|
|
|
|
const numValue = parseFloat(value);
|
|
if (isNaN(numValue)) {
|
|
emit('update:modelValue', '');
|
|
emit('blur', event);
|
|
return;
|
|
}
|
|
|
|
// 应用精度
|
|
let finalValue = numValue;
|
|
if (props.precision !== undefined) {
|
|
finalValue = parseFloat(numValue.toFixed(props.precision));
|
|
}
|
|
|
|
// 限制范围
|
|
if (props.min !== undefined && finalValue < props.min) {
|
|
finalValue = props.min;
|
|
}
|
|
if (props.max !== undefined && finalValue > props.max) {
|
|
finalValue = props.max;
|
|
}
|
|
|
|
emit('update:modelValue', String(finalValue));
|
|
emit('blur', event);
|
|
};
|
|
|
|
const handleChange = (value) => {
|
|
emit('change', value);
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
:deep(.el-input__inner) {
|
|
text-align: left;
|
|
}
|
|
</style>
|