Files
his/openhis-ui-vue3/src/template/nursingRecordSheet.vue
zhaoyun 3e7d27ee61 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)
2026-05-29 00:39:28 +08:00

593 lines
15 KiB
Vue
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
* @Author: sjjh
* @Date: 2025-10-08 23:33:29
* @Description: 护理记录单
-->
<template>
<div class="container">
<div class="header">
<h2 class="title">
{{ userStore.hospitalName }}
</h2>
<h3 class="subtitle">
患者护理记录单
</h3>
</div>
<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-form-item>
</el-col>
<el-col :span="2">
<el-form-item label="年龄">
<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
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-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="床号">
<el-input
v-model="state.formData.bedNumber"
placeholder="请输入床号"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="住院号">
<el-input
v-model="state.formData.hospitalNumber"
placeholder="请输入住院号"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="入院诊断">
<el-input
v-model="state.formData.diagnosis"
placeholder="请输入入院诊断"
/>
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 基本信息记录表格 -->
<div class="vital-signs-table">
<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"
type="date"
placeholder="选择日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column
label="时间"
width="100"
>
<template #default="scope">
<el-time-picker
v-model="scope.row.time"
placeholder="选择时间"
format="HH:mm"
value-format="HH:mm"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column label="基本信息">
<el-table-column
label="意识"
width="80"
>
<template #default="scope">
<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"
>
<template #default="scope">
<el-input
v-model="scope.row.temperature"
placeholder="体温"
/>
</template>
</el-table-column>
<el-table-column
label="心率次/分"
width="100"
>
<template #default="scope">
<el-input
v-model="scope.row.heartRate"
placeholder="心率"
/>
</template>
</el-table-column>
<el-table-column
label="脉搏次/分"
width="100"
>
<template #default="scope">
<el-input
v-model="scope.row.heartRate"
placeholder="心率"
/>
</template>
</el-table-column>
<el-table-column
label="呼吸次/分"
width="100"
>
<template #default="scope">
<el-input
v-model="scope.row.respiratoryRate"
placeholder="呼吸"
/>
</template>
</el-table-column>
<el-table-column
label="血压mmHg"
width="120"
>
<template #default="scope">
<el-input
v-model="scope.row.bloodPressure"
placeholder="血压"
/>
</template>
</el-table-column>
<el-table-column
label="血氧饱和度"
width="120"
>
<template #default="scope">
<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="方式">
<template #default="scope">
<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"
>
<template #default="scope">
<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="名称">
<template #default="scope">
<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"
>
<template #default="scope">
<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>
<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
label="面罩"
value="面罩"
/>
<el-option
label="无"
value="无"
/>
</el-select>
</template>
</el-table-column>
<el-table-column
label="ml"
width="80"
>
<template #default="scope">
<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="流量"
/>
</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="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>
</div>
</div>
<!-- 表单底部按钮 -->
<div class="form-actions">
<div>
意识:①清醒②嗜睡③意识模糊④昏睡⑤谗妄⑥浅昏迷⑦中度昏迷⑧深昏迷⑨全麻未醒⑩镇静
</div>
<div>
氧疗方式:①鼻导管②面罩③HFNC④HIPPV⑤IMV
</div>
<div>
皮肤情况:①完好②压疮③出血点④破损⑤水肿⑥瘀斑⑦过敏⑧其他
</div>
<div>
管路护理:①胃管②尿导管③静脉置管④吸氧管T⑥胸腔引流管⑦腹腔引流管⑧伤口引流管⑨脑室引流管⑩其他
</div>
</div>
</el-form>
</div>
</template>
<script setup>
defineOptions({
name: 'NursingRecordSheet',
});
import {getCurrentInstance, onBeforeMount, onMounted, ref} from 'vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
const emits = defineEmits([]);
const props = defineProps({
patientId: {
type: String,
default: '',
},
});
// 表单数据
const state = ref({
formData: {
name: '',
age: '',
gender: '',
ward: '',
bedNumber: '',
hospitalNumber: '',
diagnosis: '',
vitalSigns: [
{
date: new Date().toISOString().split('T')[0],
time: new Date().toTimeString().slice(0, 5),
consciousness: '清醒',
temperature: '',
heartRate: '',
respiratoryRate: '',
bloodPressure: '',
intake: '',
flowRate: '',
nurseSignature: '',
},
],
},
});
// 添加生命体征记录
const addVitalSign = () => {
state.value.formData.vitalSigns.push({
date: new Date().toISOString().split('T')[0],
time: new Date().toTimeString().slice(0, 5),
consciousness: '清醒',
temperature: '',
heartRate: '',
respiratoryRate: '',
bloodPressure: '',
intake: '',
flowRate: '',
nurseSignature: '',
});
};
// 删除生命体征记录
const removeVitalSign = (index) => {
state.value.formData.vitalSigns.splice(index, 1);
if (state.value.formData.vitalSigns.length === 0) {
addVitalSign();
}
};
// 重置表单
const resetForm = () => {
state.value.formData = {
name: '',
age: '',
gender: '',
ward: '',
bedNumber: '',
hospitalNumber: '',
diagnosis: '',
vitalSigns:[]
};
};
onBeforeMount(() => {
// 如果有patientId可以在这里加载患者数据
if (props.patientId) {
// 加载患者数据的逻辑
}
});
onMounted(() => {
// 组件挂载后的逻辑
});
const submit = () => {
// ElMessage.success('提交成功');
emits('submitOk', state.value.formData);
};
const setFormData = (data) => {
if (data) {
state.value.formData = data;
}
};
defineExpose({ state, submit, setFormData });
</script>
<style lang="scss" scoped>
.container {
padding: 20px;
background-color: #fff;
}
.header {
text-align: center;
margin-bottom: 20px;
.title {
font-size: 24px;
font-weight: bold;
margin-bottom: 5px;
}
.subtitle {
font-size: 20px;
font-weight: bold;
}
}
.nursing-form {
.patient-info {
padding: 15px;
border: 1px solid #dcdfe6;
border-radius: 4px;
}
.vital-signs-table
{
margin-bottom: 20px;
h4 {
margin-bottom: 10px;
font-size: 16px;
font-weight: bold;
}
.add-row {
margin-top: 10px;
text-align: center;
}
}
.form-actions {
margin-top: 30px;
text-align: left;
}
}
</style>