根因: - 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)
254 lines
6.2 KiB
Vue
Executable File
254 lines
6.2 KiB
Vue
Executable File
<template>
|
|
<el-dialog
|
|
v-model="dialogVisible"
|
|
title="添加频次详情"
|
|
width="520px"
|
|
top="8vh"
|
|
:close-on-click-modal="false"
|
|
@close="resetForm"
|
|
>
|
|
<!-- 表单区域 -->
|
|
<el-form
|
|
ref="form"
|
|
:model="formData"
|
|
label-width="120px"
|
|
class="freq-form"
|
|
>
|
|
<!-- 字典代码 -->
|
|
<el-form-item label="字典代码">
|
|
<el-input
|
|
v-model="formData.rateCode"
|
|
readonly
|
|
class="input-readonly"
|
|
/>
|
|
</el-form-item>
|
|
|
|
<!-- 分割线 -->
|
|
<el-divider content-position="left">
|
|
每日执行
|
|
</el-divider>
|
|
|
|
<el-row :gutter="16">
|
|
<el-col :span="12">
|
|
<el-form-item label="次数">
|
|
<el-input-number
|
|
v-model="formData.dayCount"
|
|
:min="1"
|
|
:max="99"
|
|
controls-position="right"
|
|
/>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<el-form-item label="间隔(天)">
|
|
<el-input-number
|
|
v-model="formData.dayInterval"
|
|
:min="0"
|
|
:max="99"
|
|
controls-position="right"
|
|
/>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
<el-form-item label="时间点">
|
|
<el-select
|
|
v-model="formData.dayTimes"
|
|
multiple
|
|
placeholder="选择时间点"
|
|
>
|
|
<el-option
|
|
v-for="time in timeOptions"
|
|
:key="time"
|
|
:value="time"
|
|
:label="time"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<!-- <!– 分割线 –>-->
|
|
<!-- <el-divider content-position="left">每周执行</el-divider>-->
|
|
|
|
<!-- <el-row :gutter="16">-->
|
|
<!-- <el-col :span="12">-->
|
|
<!-- <el-form-item label="是否启用">-->
|
|
<!-- <el-switch-->
|
|
<!-- v-model="formData.weekCycleFlag"-->
|
|
<!-- :active-value="1"-->
|
|
<!-- :inactive-value="0"-->
|
|
<!-- active-text="是"-->
|
|
<!-- inactive-text="否"-->
|
|
<!-- />-->
|
|
<!-- </el-form-item>-->
|
|
<!-- </el-col>-->
|
|
<!-- <el-col :span="12">-->
|
|
<!-- <el-form-item label="间隔(周)">-->
|
|
<!-- <el-input-number-->
|
|
<!-- v-model="formData.weekInterval"-->
|
|
<!-- :min="1"-->
|
|
<!-- :max="52"-->
|
|
<!-- controls-position="right"-->
|
|
<!-- />-->
|
|
<!-- </el-form-item>-->
|
|
<!-- </el-col>-->
|
|
<!-- </el-row>-->
|
|
|
|
<!-- <el-form-item label="周次数">-->
|
|
<!-- <el-input-number-->
|
|
<!-- v-model="formData.weekTimes"-->
|
|
<!-- :min="1"-->
|
|
<!-- :max="7"-->
|
|
<!-- controls-position="right"-->
|
|
<!-- />-->
|
|
<!-- </el-form-item>-->
|
|
|
|
<!-- 分割线 -->
|
|
<el-divider content-position="left">
|
|
周期与总计
|
|
</el-divider>
|
|
|
|
<el-row :gutter="16">
|
|
<el-col :span="12">
|
|
<el-form-item label="总次数">
|
|
<el-input-number
|
|
v-model="formData.totalExecutionCount"
|
|
:min="1"
|
|
:max="999"
|
|
controls-position="right"
|
|
/>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<el-form-item label="周期长度">
|
|
<el-input-number
|
|
v-model="formData.executionPeriod"
|
|
:min="1"
|
|
:max="999"
|
|
controls-position="right"
|
|
/>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<el-form-item label="周期单位">
|
|
<el-select
|
|
v-model="formData.executionPeriodUnit"
|
|
style="width: 100%"
|
|
>
|
|
<el-option
|
|
label="分钟"
|
|
value="minute"
|
|
/>
|
|
<el-option
|
|
label="天"
|
|
value="day"
|
|
/>
|
|
<el-option
|
|
label="周"
|
|
value="week"
|
|
/>
|
|
<el-option
|
|
label="月"
|
|
value="month"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="备注">
|
|
<el-input
|
|
v-model="formData.memo"
|
|
type="textarea"
|
|
:rows="2"
|
|
maxlength="200"
|
|
show-word-limit
|
|
/>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<!-- 底部按钮 -->
|
|
<template #footer>
|
|
<el-button @click="dialogVisible = false">
|
|
取 消
|
|
</el-button>
|
|
<el-button
|
|
type="primary"
|
|
@click="submitForm"
|
|
>
|
|
确 定
|
|
</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
import {defineEmits, defineProps, ref, watch} from "vue";
|
|
|
|
|
|
const props = defineProps({
|
|
modelValue: { type: Boolean, default: false },
|
|
initialFormData: { type: Object, default: () => ({}) }
|
|
})
|
|
|
|
const emit = defineEmits(['update:modelValue', 'submit'])
|
|
|
|
const formData = ref({
|
|
rateCode: '',
|
|
name: '',
|
|
dayCount: 0,
|
|
dayInterval: 0,
|
|
dayTimes: [],
|
|
weekCycleFlag: 0,
|
|
weekInterval: 0,
|
|
weekTimes: 0,
|
|
continueFlag: 0,
|
|
totalExecutionCount: 0,
|
|
executionPeriod: 0,
|
|
executionPeriodUnit: 'day',
|
|
memo: ''
|
|
});
|
|
|
|
|
|
const generateTimeOptions = () => {
|
|
const options = [];
|
|
for (let hour = 0; hour < 24; hour++) {
|
|
for (let minute = 0; minute <= 59; minute += 30) {
|
|
const time = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`;
|
|
options.push(time);
|
|
}
|
|
}
|
|
return options;
|
|
};
|
|
|
|
const timeOptions = ref(generateTimeOptions());
|
|
// 计算属性:让 el-dialog 直接绑定 v-model
|
|
const dialogVisible = computed({
|
|
get: () => props.modelValue,
|
|
set: (val) => emit('update:modelValue', val)
|
|
})
|
|
|
|
function resetForm() {
|
|
formData.value = { ...props.initialFormData }
|
|
}
|
|
function submitForm() {
|
|
emit('submit', formData.value)
|
|
dialogVisible.value = false // 关闭
|
|
}
|
|
watch(
|
|
() => props.initialFormData,
|
|
(newVal) => { formData.value = { ...newVal }; },
|
|
{ immediate: true }
|
|
);
|
|
</script>
|
|
|
|
<style scoped>
|
|
.freq-form {
|
|
padding: 0 10px;
|
|
}
|
|
.input-readonly {
|
|
background-color: #f5f7fa;
|
|
color: #c0c4cc;
|
|
}
|
|
</style>
|
|
|
|
|