fix(#591): 请修复 Bug #591:【住院医生站-临床医嘱】长期医嘱点击停嘱未弹出时间录入弹窗

根因:
- 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)
This commit is contained in:
2026-05-29 00:39:26 +08:00
parent b149cc3f3e
commit 3e7d27ee61
564 changed files with 69505 additions and 23137 deletions

View File

@@ -6,40 +6,69 @@
<template>
<div class="container">
<div class="header">
<h2 class="title">{{ userStore.hospitalName }}</h2>
<h3 class="subtitle">患者护理记录单</h3>
<h2 class="title">
{{ userStore.hospitalName }}
</h2>
<h3 class="subtitle">
患者护理记录单
</h3>
</div>
<el-form :model="state.formData" label-position="top" class="nursing-form">
<el-form
:model="state.formData"
label-position="top"
class="nursing-form"
>
<!-- 患者基本信息 -->
<div class="patient-info">
<el-row :gutter="20">
<el-col :span="2">
<el-form-item label="姓名">
<el-input v-model="state.formData.name" placeholder="请输入姓名"></el-input>
<el-input
v-model="state.formData.name"
placeholder="请输入姓名"
/>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label="年龄">
<el-input v-model="state.formData.age" placeholder="请输入年龄"></el-input>
<el-input
v-model="state.formData.age"
placeholder="请输入年龄"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
<el-select v-model="state.formData.gender" placeholder="请选择性别">
<el-option label="男" value="male"></el-option>
<el-option label="女" value="female"></el-option>
<el-select
v-model="state.formData.gender"
placeholder="请选择性别"
>
<el-option
label="男"
value="male"
/>
<el-option
label="女"
value="female"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="病区">
<el-input v-model="state.formData.ward" placeholder="请输入病区"></el-input>
<el-input
v-model="state.formData.ward"
placeholder="请输入病区"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="床号">
<el-input v-model="state.formData.bedNumber" placeholder="请输入床号"></el-input>
<el-input
v-model="state.formData.bedNumber"
placeholder="请输入床号"
/>
</el-form-item>
</el-col>
<el-col :span="4">
@@ -47,12 +76,15 @@
<el-input
v-model="state.formData.hospitalNumber"
placeholder="请输入住院号"
></el-input>
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="入院诊断">
<el-input v-model="state.formData.diagnosis" placeholder="请输入入院诊断"></el-input>
<el-input
v-model="state.formData.diagnosis"
placeholder="请输入入院诊断"
/>
</el-form-item>
</el-col>
</el-row>
@@ -60,8 +92,15 @@
<!-- 基本信息记录表格 -->
<div class="vital-signs-table">
<el-table :data="state.formData.vitalSigns" border style="width: 100%">
<el-table-column label="日期" width="100">
<el-table
:data="state.formData.vitalSigns"
border
style="width: 100%"
>
<el-table-column
label="日期"
width="100"
>
<template #default="scope">
<el-date-picker
v-model="scope.row.date"
@@ -70,10 +109,13 @@
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
style="width: 100%"
></el-date-picker>
/>
</template>
</el-table-column>
<el-table-column label="时间" width="100">
<el-table-column
label="时间"
width="100"
>
<template #default="scope">
<el-time-picker
v-model="scope.row.time"
@@ -81,133 +123,290 @@
format="HH:mm"
value-format="HH:mm"
style="width: 100%"
></el-time-picker>
/>
</template>
</el-table-column>
<el-table-column label="基本信息">
<el-table-column label="意识" width="80">
<el-table-column
label="意识"
width="80"
>
<template #default="scope">
<el-select v-model="scope.row.consciousness" placeholder="选择">
<el-option label="清醒" value="清醒"></el-option>
<el-option label="嗜睡" value="嗜睡"></el-option>
<el-option label="昏迷" value="昏迷"></el-option>
<el-select
v-model="scope.row.consciousness"
placeholder="选择"
>
<el-option
label="清醒"
value="清醒"
/>
<el-option
label="嗜睡"
value="嗜睡"
/>
<el-option
label="昏迷"
value="昏迷"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="体温℃" width="80">
<el-table-column
label="体温℃"
width="80"
>
<template #default="scope">
<el-input v-model="scope.row.temperature" placeholder="体温"></el-input>
<el-input
v-model="scope.row.temperature"
placeholder="体温"
/>
</template>
</el-table-column>
<el-table-column label="心率次/分" width="100">
<el-table-column
label="心率次/分"
width="100"
>
<template #default="scope">
<el-input v-model="scope.row.heartRate" placeholder="心率"></el-input>
<el-input
v-model="scope.row.heartRate"
placeholder="心率"
/>
</template>
</el-table-column>
<el-table-column label="脉搏次/分" width="100">
<el-table-column
label="脉搏次/分"
width="100"
>
<template #default="scope">
<el-input v-model="scope.row.heartRate" placeholder="心率"></el-input>
<el-input
v-model="scope.row.heartRate"
placeholder="心率"
/>
</template>
</el-table-column>
<el-table-column label="呼吸次/分" width="100">
<el-table-column
label="呼吸次/分"
width="100"
>
<template #default="scope">
<el-input v-model="scope.row.respiratoryRate" placeholder="呼吸"></el-input>
<el-input
v-model="scope.row.respiratoryRate"
placeholder="呼吸"
/>
</template>
</el-table-column>
<el-table-column label="血压mmHg" width="120">
<el-table-column
label="血压mmHg"
width="120"
>
<template #default="scope">
<el-input v-model="scope.row.bloodPressure" placeholder="血压"></el-input>
<el-input
v-model="scope.row.bloodPressure"
placeholder="血压"
/>
</template>
</el-table-column>
<el-table-column label="血氧饱和度" width="120">
<el-table-column
label="血氧饱和度"
width="120"
>
<template #default="scope">
<el-input v-model="scope.row.bloodPressure" placeholder="血压"></el-input>
<el-input
v-model="scope.row.bloodPressure"
placeholder="血压"
/>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="氧疗L/min" width="200">
<el-table-column label="方式" >
<el-table-column
label="氧疗L/min"
width="200"
>
<el-table-column label="方式">
<template #default="scope">
<el-select v-model="scope.row.intake" placeholder="选择">
<el-option label="鼻导管" value="鼻导管"></el-option>
<el-option label="面罩" value="面罩"></el-option>
<el-option label="无" value="无"></el-option>
<el-select
v-model="scope.row.intake"
placeholder="选择"
>
<el-option
label="鼻导管"
value="鼻导管"
/>
<el-option
label="面罩"
value="面罩"
/>
<el-option
label="无"
value="无"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="流量" width="80">
<el-table-column
label="流量"
width="80"
>
<template #default="scope">
<el-input v-model="scope.row.flowRate" placeholder="流量"></el-input>
<el-input
v-model="scope.row.flowRate"
placeholder="流量"
/>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="入量" width="200">
<el-table-column label="名称" >
<el-table-column
label="入量"
width="200"
>
<el-table-column label="名称">
<template #default="scope">
<el-select v-model="scope.row.intake" placeholder="选择">
<el-option label="鼻导管" value="鼻导管"></el-option>
<el-option label="面罩" value="面罩"></el-option>
<el-option label="无" value="无"></el-option>
<el-select
v-model="scope.row.intake"
placeholder="选择"
>
<el-option
label="鼻导管"
value="鼻导管"
/>
<el-option
label="面罩"
value="面罩"
/>
<el-option
label="无"
value="无"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="ml" width="80">
<el-table-column
label="ml"
width="80"
>
<template #default="scope">
<el-input v-model="scope.row.flowRate" placeholder="流量"></el-input>
<el-input
v-model="scope.row.flowRate"
placeholder="流量"
/>
</template>
</el-table-column>
<el-table-column label="途径" width="80">
<el-table-column
label="途径"
width="80"
>
<template #default="scope">
<el-input v-model="scope.row.flowRate" placeholder="流量"></el-input>
<el-input
v-model="scope.row.flowRate"
placeholder="流量"
/>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="出量" width="200">
<el-table-column label="名称" >
<el-table-column
label="出量"
width="200"
>
<el-table-column label="名称">
<template #default="scope">
<el-select v-model="scope.row.intake" placeholder="选择">
<el-option label="鼻导管" value="鼻导管"></el-option>
<el-option label="面罩" value="面罩"></el-option>
<el-option label="无" value="无"></el-option>
<el-select
v-model="scope.row.intake"
placeholder="选择"
>
<el-option
label="鼻导管"
value="鼻导管"
/>
<el-option
label="面罩"
value="面罩"
/>
<el-option
label="无"
value="无"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="ml" width="80">
<el-table-column
label="ml"
width="80"
>
<template #default="scope">
<el-input v-model="scope.row.flowRate" placeholder="流量"></el-input>
<el-input
v-model="scope.row.flowRate"
placeholder="流量"
/>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="皮肤情况" width="80">
<template #default="scope">
<el-input v-model="scope.row.flowRate" placeholder="流量"></el-input>
</template>
</el-table-column>
<el-table-column label="管路护理" width="80">
<template #default="scope">
<el-input v-model="scope.row.flowRate" placeholder="流量"></el-input>
</template>
</el-table-column>
<el-table-column label="病情与措施" width="80">
<template #default="scope">
<el-input v-model="scope.row.flowRate" placeholder="流量"></el-input>
</template>
</el-table-column>
<el-table-column label="护士签名" width="100">
<el-table-column
label="皮肤情况"
width="80"
>
<template #default="scope">
<el-input v-model="scope.row.nurseSignature" placeholder="签名"></el-input>
<el-input
v-model="scope.row.flowRate"
placeholder="流量"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="120" fixed="right">
<el-table-column
label="管路护理"
width="80"
>
<template #default="scope">
<el-button type="danger" size="small" @click="removeVitalSign(scope.$index)"
>删除</el-button
<el-input
v-model="scope.row.flowRate"
placeholder="流量"
/>
</template>
</el-table-column>
<el-table-column
label="病情与措施"
width="80"
>
<template #default="scope">
<el-input
v-model="scope.row.flowRate"
placeholder="流量"
/>
</template>
</el-table-column>
<el-table-column
label="护士签名"
width="100"
>
<template #default="scope">
<el-input
v-model="scope.row.nurseSignature"
placeholder="签名"
/>
</template>
</el-table-column>
<el-table-column
label="操作"
width="120"
fixed="right"
>
<template #default="scope">
<el-button
type="danger"
size="small"
@click="removeVitalSign(scope.$index)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<div class="add-row">
<el-button type="primary" @click="addVitalSign">添加记录</el-button>
<el-button
type="primary"
@click="addVitalSign"
>
添加记录
</el-button>
</div>
</div>
@@ -216,13 +415,13 @@
<div>
意识:①清醒②嗜睡③意识模糊④昏睡⑤谗妄⑥浅昏迷⑦中度昏迷⑧深昏迷⑨全麻未醒⑩镇静
</div>
<div>
<div>
氧疗方式:①鼻导管②面罩③HFNC④HIPPV⑤IMV
</div>
<div>
<div>
皮肤情况:①完好②压疮③出血点④破损⑤水肿⑥瘀斑⑦过敏⑧其他
</div>
<div>
<div>
管路护理:①胃管②尿导管③静脉置管④吸氧管T⑥胸腔引流管⑦腹腔引流管⑧伤口引流管⑨脑室引流管⑩其他
</div>
</div>
@@ -330,7 +529,7 @@ onMounted(() => {
});
const submit = () => {
// ElMessage.success('提交成功');
emits('submitOk', state.formData);
emits('submitOk', state.value.formData);
};
const setFormData = (data) => {
if (data) {