360 住院护士站-》三测单:体征录入保存失败

This commit is contained in:
Ranyunqiao
2026-04-20 11:44:37 +08:00
parent ed75b148a8
commit 5ab4650c4e
9 changed files with 318 additions and 71 deletions

View File

@@ -36,7 +36,7 @@ public interface IVitalSignsAppService {
* *
* @return 体温单检索结果 * @return 体温单检索结果
*/ */
R<?> searchVitalSigns(String startTime, String endTime); R<?> searchVitalSigns(String startTime, String endTime, String patientId);
/** /**
* 体温单记录删除 * 体温单记录删除

View File

@@ -266,13 +266,14 @@ public class VitalSignsAppServiceImpl implements IVitalSignsAppService {
* *
* @param startTime 开始时间 * @param startTime 开始时间
* @param endTime 结束时间 * @param endTime 结束时间
* @param patientId 患者ID
* @return 检索结果 * @return 检索结果
*/ */
@Override @Override
public R<?> searchVitalSigns(String startTime, String endTime) { public R<?> searchVitalSigns(String startTime, String endTime, String patientId) {
// 基本信息查询 // 基本信息查询
List<VitalSigns> vitalSignsList = vitalSignsAppMapper.searchVitalSigns(startTime, endTime); List<VitalSigns> vitalSignsList = vitalSignsAppMapper.searchVitalSigns(startTime, endTime, patientId);
// 判断查询结果是否为空 // 判断查询结果是否为空
if (vitalSignsList.isEmpty()) { if (vitalSignsList.isEmpty()) {
return R.ok(Collections.emptyList()); return R.ok(Collections.emptyList());

View File

@@ -57,8 +57,8 @@ public class VitalSignsController {
* @return 体温单检索结果 * @return 体温单检索结果
*/ */
@GetMapping("/record-search") @GetMapping("/record-search")
public R<?> searchVitalSigns(String startTime, String endTime) { public R<?> searchVitalSigns(String startTime, String endTime, String patientId) {
return R.ok(vitalSignsAppService.searchVitalSigns(startTime, endTime)); return R.ok(vitalSignsAppService.searchVitalSigns(startTime, endTime, patientId));
} }
/** /**

View File

@@ -1,6 +1,7 @@
package com.openhis.web.inpatientmanage.dto; package com.openhis.web.inpatientmanage.dto;
import com.core.common.core.domain.HisBaseEntity; import com.core.common.core.domain.HisBaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -35,6 +36,7 @@ public class VitalSignsSaveDto extends HisBaseEntity {
/** /**
* 记录日期 * 记录日期
*/ */
@JsonFormat(pattern = "yyyy-MM-dd")
private Date recordingDate; private Date recordingDate;
/** /**

View File

@@ -38,9 +38,10 @@ public interface VitalSignsAppMapper {
* *
* @param startTime 开始时间 * @param startTime 开始时间
* @param endTime 结束时间 * @param endTime 结束时间
* @param patientId 患者ID
* @return 查询记录结果 * @return 查询记录结果
*/ */
List<VitalSigns> searchVitalSigns(@Param("startTime") String startTime, @Param("endTime") String endTime); List<VitalSigns> searchVitalSigns(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("patientId") String patientId);
/** /**
* 删除记录 * 删除记录

View File

@@ -25,6 +25,7 @@
T2.organization_id AS org_id, --科室ID从就诊表取 T2.organization_id AS org_id, --科室ID从就诊表取
T2.id AS encounter_id, --就诊ID T2.id AS encounter_id, --就诊ID
T2.start_time AS admissionDate, --入院日期 T2.start_time AS admissionDate, --入院日期
T3.ward_admission_date AS wardAdmissionDate, --入科日期
T3.location_id AS ward_location_id, --病区 T3.location_id AS ward_location_id, --病区
T4.location_id AS bed_location_id --床号 T4.location_id AS bed_location_id --床号
FROM adm_patient AS T1 FROM adm_patient AS T1

View File

@@ -81,6 +81,9 @@
-- 记录日期 -- 记录日期
T1.recording_date &gt;= #{startTime}::date T1.recording_date &gt;= #{startTime}::date
AND T1.recording_date &lt;= #{endTime}::date AND T1.recording_date &lt;= #{endTime}::date
<if test="patientId != null and patientId != ''">
AND T1.patient_id = #{patientId}::bigint
</if>
AND T1.delete_flag = '0' AND T1.delete_flag = '0'
</where> </where>

View File

@@ -1,11 +1,11 @@
<template> <template>
<el-dialog <el-dialog
title="患者详情" title="患者详情"
v-model="props.open" v-model="dialogVisible"
width="1700px" width="1700px"
append-to-body append-to-body
destroy-on-close :destroy-on-close="false"
@close="close" @close="closeDialog"
> >
<div style="display: flex; justify-content: space-between" class="app-container"> <div style="display: flex; justify-content: space-between" class="app-container">
<div style="width: 50%"> <div style="width: 50%">
@@ -67,45 +67,33 @@
ref="patientListRef" ref="patientListRef"
max-height="650" max-height="650"
:data="patientList" :data="patientList"
row-key="encounterId" row-key="id"
@cell-click="clickRow"
highlight-current-row highlight-current-row
@row-click="handleRowClick"
> >
<el-table-column type="selection" :selectable="checkSelectable" width="55" /> <el-table-column prop="recordingDate" label="日期" width="80" />
<el-table-column prop="busNo" label="体温" width="80" /> <el-table-column prop="timePoint" label="时间" width="60" />
<el-table-column prop="statusEnum_enumText" label="收缩压" min-width="120" /> <el-table-column prop="temperature" label="体温" width="70" />
<el-table-column prop="busNo" label="舒张压" width="80" /> <el-table-column prop="systolicPressure" label="收缩压" width="70" />
<el-table-column prop="statusEnum_enumText" label="心率" min-width="120" /> <el-table-column prop="diastolicPressure" label="舒张压" width="70" />
<el-table-column prop="busNo" label="脉搏" width="80" /> <el-table-column prop="heartRate" label="心率" width="70" />
<el-table-column prop="statusEnum_enumText" label="呼吸" min-width="120" /> <el-table-column prop="pulseRate" label="脉搏" width="70" />
<el-table-column prop="busNo" label="血氧" width="80" /> <el-table-column prop="respirationRate" label="呼吸" width="70" />
<el-table-column prop="statusEnum_enumText" label="动脉压" min-width="120" /> <el-table-column prop="bloodOxygen" label="血氧" width="70" />
<el-table-column prop="busNo" label="血糖" width="80" /> <el-table-column prop="bloodGlucose" label="血糖" width="70" />
<el-table-column prop="statusEnum_enumText" label="物理降温" min-width="120" /> <el-table-column prop="physicalCooling" label="物理降温" width="80" />
<el-table-column prop="busNo" label="左瞳孔(光)" width="80" /> <el-table-column prop="ccuHeartRate" label="CCU心率" width="80" />
<el-table-column prop="statusEnum_enumText" label="右瞳孔(光)" min-width="120" /> <el-table-column prop="newbornsIncubator" label="新生儿箱温" width="90" />
<el-table-column prop="busNo" label="CCU心率" width="280" /> <el-table-column prop="bloodKetone" label="血酮" width="70" />
<el-table-column prop="statusEnum_enumText" label="左瞳孔(大小)" min-width="120" /> <el-table-column prop="height" label="身高" width="70" />
<el-table-column prop="busNo" label="右瞳孔(大小)" width="280" /> <el-table-column prop="waistCircumference" label="腹围" width="70" />
<el-table-column prop="statusEnum_enumText" label="意识" min-width="120" /> <el-table-column prop="stoolFrequency" label="大便次数" width="80" />
<el-table-column prop="busNo" label="新生儿箱温" width="280" /> <el-table-column prop="enemaFrequency" label="灌肠次数" width="80" />
<el-table-column prop="statusEnum_enumText" label="血酮" min-width="120" /> <el-table-column prop="sfAfterEnema" label="灌肠后大便" width="90" />
<el-table-column prop="busNo" label="体重" width="280" /> <el-table-column prop="output" label="出量" width="70" />
<el-table-column prop="statusEnum_enumText" label="身高" min-width="120" /> <el-table-column prop="input" label="入量" width="70" />
<el-table-column prop="busNo" label="腹围" width="280" /> <el-table-column prop="urineVolume" label="尿量" width="70" />
<el-table-column prop="statusEnum_enumText" label="大便次数" min-width="120" /> <el-table-column prop="stoolVolume" label="大便" width="70" />
<el-table-column prop="busNo" label="灌肠次数" width="280" />
<el-table-column prop="statusEnum_enumText" label="灌肠后大便次数" min-width="120" />
<el-table-column prop="busNo" label="出量" width="280" />
<el-table-column prop="statusEnum_enumText" label="入量" min-width="120" />
<el-table-column prop="statusEnum_enumText" label="尿量" min-width="120" />
<el-table-column prop="busNo" label="大便量" width="280" />
<el-table-column label="操作" min-width="150" fixed="right">
<!-- <template #default="scope"> -->
<template>
<el-button link type="primary" size="small">保存</el-button>
</template>
</el-table-column>
</el-table> </el-table>
</div> </div>
</el-card> </el-card>
@@ -204,7 +192,7 @@
<div class="flex-container"> <div class="flex-container">
<el-input <el-input
prop="lowBloodPressure" prop="lowBloodPressure"
v-model="formData.date" v-model="formData.systolicPressure"
style="width: 90px" style="width: 90px"
size="small" size="small"
@keydown="onKeyDown('1', '1', $event)" @keydown="onKeyDown('1', '1', $event)"
@@ -213,7 +201,7 @@
<label>/</label> <label>/</label>
<el-input <el-input
prop="HighBloodPressure" prop="HighBloodPressure"
v-model="formData.times" v-model="formData.diastolicPressure"
style="width: 90px" style="width: 90px"
size="small" size="small"
@keydown="onKeyDown('1', '2', $event)" @keydown="onKeyDown('1', '2', $event)"
@@ -655,20 +643,21 @@
</div> </div>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="close"> </el-button> <el-button @click="closeDialog"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import {ref} from 'vue'; import {ref, watch} from 'vue';
import request from '@/utils/request';
import {addVitalSigns, listPatient} from './api'; import {addVitalSigns, listPatient} from './api';
import moment from "moment"; import moment from "moment";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const props = defineProps({ const props = defineProps({
open: { modelValue: {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
@@ -678,9 +667,21 @@ const props = defineProps({
}, },
patientInfo: { patientInfo: {
type: Object, type: Object,
default: () => {}, default: () => ({}),
}, },
}); });
const emit = defineEmits(['close', 'update:modelValue']);
// 直接使用computed双向绑定更可靠
const dialogVisible = computed({
get() {
return props.modelValue;
},
set(val) {
emit('update:modelValue', val);
}
});
const { method_code, unit_code, rate_code, distribution_category_code } = proxy.useDict( const { method_code, unit_code, rate_code, distribution_category_code } = proxy.useDict(
'method_code', 'method_code',
'unit_code', 'unit_code',
@@ -688,12 +689,14 @@ const { method_code, unit_code, rate_code, distribution_category_code } = proxy.
'distribution_category_code' 'distribution_category_code'
); );
const emit = defineEmits(['close']);
const queryParams = ref({ const queryParams = ref({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
patientId: undefined, // 患者id patientId: undefined, // 患者id
startTime: undefined,
endTime: undefined,
}); });
const patientList = ref([]);
// const patientInfo = ref({ // const patientInfo = ref({
// patientName: '张三', // patientName: '张三',
// }); // });
@@ -758,10 +761,33 @@ const InputOptions = ref([
}, },
]) ])
// 表单数据 // 日期范围 - 体征信息搜索时间
const receptionTime = ref(null);
// 表单数据 - 体征录入
const formData = ref({ const formData = ref({
username: '', timePoint: '',
gender: '', temperature: '',
systolicPressure: '',
diastolicPressure: '',
heartRate: '',
pulseRate: '',
respirationRate: '',
bloodOxygen: '',
bloodGlucose: '',
physicalCooling: '',
ccuHeartRate: '',
newbornsIncubator: '',
bloodKetone: '',
height: '',
waistCircumference: '',
stoolFrequency: '',
enemaFrequency: '',
sfAfterEnema: '',
output: '',
input: '',
urineVolume: '',
stoolVolume: '',
}); });
// 表格列配置数据 // 表格列配置数据
const tableColumns = ref([ const tableColumns = ref([
@@ -790,19 +816,64 @@ const tableColumns = ref([
// 更多列配置... // 更多列配置...
]); ]);
function getPatientList() {} function getPatientList() {
let startTime = null;
let endTime = null;
if (receptionTime.value && receptionTime.value.length === 2) {
startTime = receptionTime.value[0];
endTime = receptionTime.value[1];
}
// 查询体征数据 - 使用正确的API接口
request({
url: '/vital-signs/record-search',
method: 'get',
params: {
startTime,
endTime,
patientId: props.patientId
}
}).then((res) => {
// 判断返回的数据结构
let data = res.data;
if (res.data && res.data.data && typeof res.data.data === 'object') {
// 如果是嵌套结构 {data: {data: Array(3)}}
data = res.data.data;
} else if (res.data && typeof res.data === 'object' && res.data.data !== undefined) {
// 如果是 {code: 200, msg: '操作成功', data: Array(3)}
data = res.data.data;
}
console.log('=== data 长度 ===', data?.length);
if (res.code === 200 && data) {
console.log('=== 准备赋值 patientList.value ===');
patientList.value = data;
console.log('=== patientList.value 赋值后 ===', patientList.value);
console.log('=== patientList.value 长度 ===', patientList.value?.length);
} else {
console.error('=== 查询失败或无数据 ===');
}
}).catch(err => {
console.error('=== 查询报错 ===', err);
});
}
/** /**
* 取得患者信息详细 * 取得患者信息详细
*/ */
function getPatientDetial() { function getPatientDetial() {
console.log('=== getPatientDetial 开始 ===', props.patientInfo);
patientInfo.value = props.patientInfo; patientInfo.value = props.patientInfo;
console.log(props, 'props', props.patientInfo); console.log(props, 'props', props.patientInfo);
reset(); reset();
title.value = ''; title.value = '';
title.value = props.title;
console.log(props, 'props', title.value);
console.log(queryParams.value, 'queryParams.value', props.patientId); console.log(queryParams.value, 'queryParams.value', props.patientId);
queryParams.value.patientId = props.patientId; queryParams.value.patientId = props.patientId;
// 默认查询今天的数据
const today = moment().format('YYYY-MM-DD');
receptionTime.value = [today, today];
// 自动加载数据
getPatientList();
listPatient(queryParams.value).then((res) => { listPatient(queryParams.value).then((res) => {
if (res.data && res.data.records && res.data.records.length > 0) { if (res.data && res.data.records && res.data.records.length > 0) {
form.value = res.data.records[0]; form.value = res.data.records[0];
@@ -823,22 +894,186 @@ function getPatientDetial() {
}); });
} }
function close() { function closeDialog() {
reset(); reset();
dialogVisible.value = false;
emit('close'); emit('close');
} }
// 转换时间格式 HH:MM:SS -> HHMM
function convertTimePoint(timeStr) {
if (!timeStr) return '';
// 如果已经是 HHMM 格式4位数字直接返回
if (/^\d{4}$/.test(timeStr)) {
return timeStr;
}
// 转换 HH:MM:SS -> HHMM
const parts = timeStr.split(':');
if (parts.length >= 2) {
return (parts[0].padStart(2, '0') + parts[1].padStart(2, '0'));
}
return timeStr;
}
// 表格行点击 - 填充表单
function handleRowClick(row) {
formData.value = {
...formData.value,
id: row.id,
timePoint: convertTimePoint(row.timePoint) || '',
temperature: row.temperature || '',
systolicPressure: row.systolicPressure || '',
diastolicPressure: row.diastolicPressure || '',
heartRate: row.heartRate || '',
pulseRate: row.pulseRate || '',
respirationRate: row.respirationRate || '',
bloodOxygen: row.bloodOxygen || '',
bloodGlucose: row.bloodGlucose || '',
physicalCooling: row.physicalCooling || '',
ccuHeartRate: row.ccuHeartRate || '',
newbornsIncubator: row.newbornsIncubator || '',
bloodKetone: row.bloodKetone || '',
height: row.height || '',
waistCircumference: row.waistCircumference || '',
stoolFrequency: row.stoolFrequency || '',
enemaFrequency: row.enemaFrequency || '',
sfAfterEnema: row.sfAfterEnema || '',
output: row.output || '',
input: row.input || '',
urineVolume: row.urineVolume || '',
stoolVolume: row.stoolVolume || '',
};
}
function confirmCharge() { function confirmCharge() {
let params = {} const params = {
params = formData.value ...formData.value,
params.patientId = props.patientInfo.patientId patientId: props.patientInfo.patientId,
params.encounterId = props.patientInfo.encounterId encounterId: props.patientInfo.encounterId,
};
// 收集所有录入的体征数据
const vitalSignsCode = [];
const vitalSignsValues = [];
if (params.temperature) {
vitalSignsCode.push('003');
vitalSignsValues.push(params.temperature);
}
if (params.systolicPressure && params.diastolicPressure) {
vitalSignsCode.push('001', '002');
vitalSignsValues.push(params.systolicPressure, params.diastolicPressure);
}
if (params.heartRate) {
vitalSignsCode.push('004');
vitalSignsValues.push(params.heartRate);
}
if (params.pulseRate) {
vitalSignsCode.push('005');
vitalSignsValues.push(params.pulseRate);
}
if (params.respirationRate) {
vitalSignsCode.push('006');
vitalSignsValues.push(params.respirationRate);
}
if (params.bloodOxygen) {
vitalSignsCode.push('014');
vitalSignsValues.push(params.bloodOxygen);
}
if (params.bloodGlucose) {
vitalSignsCode.push('016');
vitalSignsValues.push(params.bloodGlucose);
}
if (params.physicalCooling) {
vitalSignsCode.push('017');
vitalSignsValues.push(params.physicalCooling);
}
if (params.ccuHeartRate) {
vitalSignsCode.push('041');
vitalSignsValues.push(params.ccuHeartRate);
}
if (params.newbornsIncubator) {
vitalSignsCode.push('061');
vitalSignsValues.push(params.newbornsIncubator);
}
if (params.bloodKetone) {
vitalSignsCode.push('140');
vitalSignsValues.push(params.bloodKetone);
}
if (params.height) {
vitalSignsCode.push('009');
vitalSignsValues.push(params.height);
}
if (params.waistCircumference) {
vitalSignsCode.push('052');
vitalSignsValues.push(params.waistCircumference);
}
if (params.stoolFrequency) {
vitalSignsCode.push('131');
vitalSignsValues.push(params.stoolFrequency);
}
if (params.enemaFrequency) {
vitalSignsCode.push('132');
vitalSignsValues.push(params.enemaFrequency);
}
if (params.sfAfterEnema) {
vitalSignsCode.push('133');
vitalSignsValues.push(params.sfAfterEnema);
}
if (params.output) {
vitalSignsCode.push('112');
vitalSignsValues.push(params.output);
}
if (params.input) {
vitalSignsCode.push('111');
vitalSignsValues.push(params.input);
}
if (params.urineVolume) {
vitalSignsCode.push('115');
vitalSignsValues.push(params.urineVolume);
}
if (params.stoolVolume) {
vitalSignsCode.push('134');
vitalSignsValues.push(params.stoolVolume);
}
params.vitalSignsCode = vitalSignsCode;
params.vitalSignsValues = vitalSignsValues;
params.recordingDate = moment(new Date()).format('YYYY-MM-DD'); params.recordingDate = moment(new Date()).format('YYYY-MM-DD');
params.timePoint = formData.value.timePoint
params.vitalSignsCode = ['003'] addVitalSigns(params).then(res => {
params.vitalSignsValues = ['38'] console.log('保存成功:', res);
addVitalSigns(formData.value).then(res => { if (res.code === 200) {
console.log(res) // 保存成功后刷新列表
}) getPatientList();
// 清空表单
formData.value = {
timePoint: '',
temperature: '',
systolicPressure: '',
diastolicPressure: '',
heartRate: '',
pulseRate: '',
respirationRate: '',
bloodOxygen: '',
bloodGlucose: '',
physicalCooling: '',
ccuHeartRate: '',
newbornsIncubator: '',
bloodKetone: '',
height: '',
waistCircumference: '',
stoolFrequency: '',
enemaFrequency: '',
sfAfterEnema: '',
output: '',
input: '',
urineVolume: '',
stoolVolume: '',
};
// 保存成功后关闭弹窗
closeDialog();
}
});
} }
/** 重置操作表单 */ /** 重置操作表单 */
function reset() { function reset() {
@@ -935,6 +1170,10 @@ defineExpose({
width: 100%; width: 100%;
} }
.input-time-inline .el-select {
width: 150px;
}
.flex-container { .flex-container {
display: flex; display: flex;
align-items: center; /* 垂直居中对齐 */ align-items: center; /* 垂直居中对齐 */

View File

@@ -125,7 +125,7 @@
</div> </div>
<add-tpr-dialog <add-tpr-dialog
ref="addTprDialogRef" ref="addTprDialogRef"
:open="openAddTpr" v-model="openAddTpr"
:patientId="patientId" :patientId="patientId"
:patientInfo="patientData" :patientInfo="patientData"
@close="closePatientDetialDialog" @close="closePatientDetialDialog"