需求111

This commit is contained in:
Ranyunqiao
2026-05-09 09:36:24 +08:00
parent 23fe4f207c
commit 5b029270cf
7 changed files with 1301 additions and 521 deletions

View File

@@ -75,11 +75,19 @@ public class NursingRecordAppServiceImpl implements INursingRecordAppService {
public R<?> getPatientInfoPage(NursingSearchParam nursingSearchParam, String searchKey, Integer pageNo, public R<?> getPatientInfoPage(NursingSearchParam nursingSearchParam, String searchKey, Integer pageNo,
Integer pageSize, HttpServletRequest request) { Integer pageSize, HttpServletRequest request) {
// 构建查询条件 // 构建查询条件租户ID
QueryWrapper<NursingSearchParam> queryWrapper = HisQueryUtils.buildQueryWrapper(nursingSearchParam, searchKey, QueryWrapper<NursingSearchParam> queryWrapper = HisQueryUtils.buildQueryWrapper(nursingSearchParam, null, null,
new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientName, CommonConstants.FieldName.PatientBusNo)),
request); request);
// 搜索条件:姓名、病历号、床位号(全部放入一个 and() 块,避免 AND 重复)
if (searchKey != null && !searchKey.isEmpty()) {
queryWrapper.and(wrapper -> {
wrapper.or().like("T5.patient_name", searchKey);
wrapper.or().like("T5.patient_bus_no", searchKey);
wrapper.or().like("T5.bed_location_name", searchKey);
});
}
// 分页查询,查询患者信息 // 分页查询,查询患者信息
IPage<NursingPageDto> NursingInfoPage = nursingRecordAppMapper.getPatientPage(new Page<>(pageNo, pageSize), IPage<NursingPageDto> NursingInfoPage = nursingRecordAppMapper.getPatientPage(new Page<>(pageNo, pageSize),
EncounterClass.IMP.getValue(), LocationForm.BED.getValue(), LocationForm.WARD.getValue(), EncounterClass.IMP.getValue(), LocationForm.BED.getValue(), LocationForm.WARD.getValue(),

View File

@@ -62,7 +62,8 @@ public class NursingPageDto {
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
@Dict(dictTable = "adm_location", dictCode = "id", dictText = "name") @Dict(dictTable = "adm_location", dictCode = "id", dictText = "name")
private Long bedLocationId; private Long bedLocationId;
private String bedLocationId_dictText; /** 床位号名称(用于搜索) */
private String bedLocationName;
/** 病区 */ /** 病区 */
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)

View File

@@ -17,6 +17,9 @@ public class NursingSearchParam {
/** 床位号 */ /** 床位号 */
private Long bedLocationId; private Long bedLocationId;
/** 床位名称(用于模糊搜索) */
private String bedLocationName;
/** 科室ID */ /** 科室ID */
private Long orgId; private Long orgId;

View File

@@ -15,7 +15,8 @@
T5.admissionDate, T5.admissionDate,
T5.wardAdmissionDate, T5.wardAdmissionDate,
T5.ward_location_id, T5.ward_location_id,
T5.bed_location_id T5.bed_location_id,
T5.bed_location_name
FROM (SELECT T1.tenant_id, FROM (SELECT T1.tenant_id,
T1.id AS patient_id, --患者ID T1.id AS patient_id, --患者ID
T1.name AS patient_name, --患者姓名 T1.name AS patient_name, --患者姓名
@@ -27,7 +28,8 @@
T2.start_time AS admissionDate, --入院日期 T2.start_time AS admissionDate, --入院日期
T3.ward_admission_date AS wardAdmissionDate, --入科日期 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, --床号
T4L.name AS bed_location_name --床位号名称(用于搜索)
FROM adm_patient AS T1 FROM adm_patient AS T1
INNER JOIN adm_encounter AS T2 INNER JOIN adm_encounter AS T2
ON T2.patient_id = T1.id ON T2.patient_id = T1.id
@@ -55,13 +57,32 @@
) ranked ) ranked
WHERE rn = 1) AS T3 WHERE rn = 1) AS T3
ON T3.encounter_id = T2.ID ON T3.encounter_id = T2.ID
LEFT JOIN adm_encounter_location AS T4 LEFT JOIN (SELECT encounter_id,
location_id,
form_enum,
delete_flag
FROM (SELECT encounter_id,
location_id,
form_enum,
delete_flag,
ROW_NUMBER() OVER (PARTITION BY encounter_id
ORDER BY
CASE
WHEN update_time IS NULL THEN create_time
ELSE update_time
END DESC) AS rn
FROM adm_encounter_location
WHERE form_enum = #{bed}
AND status_enum = #{active}
AND delete_flag = '0'
) ranked
WHERE rn = 1) AS T4
ON T4.encounter_id = T2.ID ON T4.encounter_id = T2.ID
AND T4.form_enum = #{bed} LEFT JOIN adm_location AS T4L
AND T4.status_enum = #{active} ON T4L.id = T4.location_id
AND T4.delete_flag = '0' AND T4L.delete_flag = '0'
WHERE T1.delete_flag = '0' WHERE T1.delete_flag = '0'
ORDER BY T4.location_id ASC) AS T5 ORDER BY T4.location_id ASC) AS T5
${ew.customSqlSegment} ${ew.customSqlSegment}
</select> </select>
@@ -121,11 +142,27 @@
) ranked ) ranked
WHERE rn = 1) AS T3 WHERE rn = 1) AS T3
ON T3.encounter_id = T2.ID ON T3.encounter_id = T2.ID
LEFT JOIN adm_encounter_location AS T4 LEFT JOIN (SELECT encounter_id,
location_id,
form_enum,
delete_flag
FROM (SELECT encounter_id,
location_id,
form_enum,
delete_flag,
ROW_NUMBER() OVER (PARTITION BY encounter_id
ORDER BY
CASE
WHEN update_time IS NULL THEN create_time
ELSE update_time
END DESC) AS rn
FROM adm_encounter_location
WHERE form_enum = #{bed}
AND status_enum = #{active}
AND delete_flag = '0'
) ranked
WHERE rn = 1) AS T4
ON T4.encounter_id = T2.ID ON T4.encounter_id = T2.ID
AND T4.form_enum = #{bed}
AND T4.status_enum = #{active}
AND T4.delete_flag = '0'
LEFT JOIN doc_emr AS T5 LEFT JOIN doc_emr AS T5
ON T5.patient_id = T1.id ON T5.patient_id = T1.id
AND T5.encounter_id = T2.ID AND T5.encounter_id = T2.ID
@@ -166,4 +203,4 @@
${ew.customSqlSegment} ${ew.customSqlSegment}
</select> </select>
</mapper> </mapper>

View File

@@ -1,183 +1,295 @@
<template> <template>
<div> <div>
<el-dialog <el-dialog
:title="title" :title="dialogTitle"
v-model="props.open" v-model="props.open"
width="1400px" width="900px"
append-to-body append-to-body
destroy-on-close :close-on-click-modal="false"
@close="close" @close="handleDialogClose"
> >
<div style="display: flex; justify-content: space-between; width: 100%"> <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
<div style="width: 40%"> <!-- 基础信息 -->
<el-row :gutter="24"> <div class="form-section">
<el-col :span="24" :xs="24"> <h4 class="section-title">基础信息</h4>
<el-input <el-row :gutter="20">
v-model="searchKey" <el-col :span="12">
placeholder="模板名称" <el-form-item label="日期" prop="recordDate">
clearable <el-date-picker
style="width: 100%; margin-bottom: 10px" v-model="form.recordDate"
@keyup.enter="getTemplateListInfo" type="date"
> placeholder="选择日期"
<template #append> value-format="YYYY-MM-DD"
<el-button icon="Search" @click="getTemplateListInfo" /> style="width: 100%"
</template> />
</el-input> </el-form-item>
<el-button size="default" type="primary" @click="openTemplateDialog" </el-col>
>新增模板</el-button <el-col :span="12">
> <el-form-item label="时间" prop="recordTime">
<el-button type="danger" plain @click="deleteTemplate()" :disabled="false"> <el-time-picker
删除 v-model="form.recordTime"
</el-button> placeholder="选择时间"
<el-table format="HH:mm"
ref="patientListRef" value-format="HH:mm:ss"
height="680" style="width: 100%"
:data="templateList" />
row-key="id" </el-form-item>
highlight-current-row
@row-click="setTemplate"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="templateName" label="模板名称" width="180" />
<el-table-column prop="contextJson" label="模板内容" width="80" />
<el-table-column prop="useScopeCodeText" label="使用范围" width="80" />
<el-table-column label="操作" min-width="150" fixed="right">
<template #default="scope">
<el-button
link
type="primary"
icon="Edit"
@click="handleEditTemplate(scope.row)"
>编辑</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="templateTotal > 0"
:total="templateTotal"
v-model:page="templateQueryParams.pageNo"
v-model:limit="templateQueryParams.pageSize"
@pagination="getTemplateListInfo"
style="margin-bottom: 20px"
/>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<div
style="display: flex; justify-content: space-between; width: 69%" <!-- 生命体征 -->
class="app-container" <div class="form-section">
> <h4 class="section-title">生命体征</h4>
<el-form ref="formRef" :model="form" label-width="100px"> <el-row :gutter="16">
<el-form-item class="changeMajorFromItem" label-width="100px" label="记录时间:"> <el-col :span="8">
<el-date-picker <el-form-item label="意识" prop="consciousnessCode">
v-model="form.recordingTime" <el-select v-model="form.consciousnessCode" placeholder="请选择" style="width: 100%">
type="datetime" <el-option label="清醒" value="1" />
placeholder="选择日期" <el-option label="嗜睡" value="2" />
style="width: 30%" <el-option label="意识模糊" value="3" />
value-format="YYYY-MM-DD HH:mm:ss" <el-option label="昏睡" value="4" />
/> <el-option label="谵妄" value="5" />
</el-form-item> <el-option label="浅昏迷" value="6" />
<el-form-item label="生命体征:" class="changeMajorFromItem" /> <el-option label="中度昏迷" value="7" />
<el-form-item class="changeMajorFromItem" label-width="10px"> <el-option label="深昏迷" value="8" />
<el-row :span="24"> </el-select>
<!-- 第一个表单项 --> </el-form-item>
<el-col :span="5"> </el-col>
<el-form-item label="体温:" prop="tw" label-width="80px"> <el-col :span="8">
<el-input v-model="form.tw" style="width: 80%" /> <el-form-item label="体温(°C)" prop="temperature">
</el-form-item> <el-input-number
</el-col> v-model="form.temperature"
<!-- 第二个表单项 --> :precision="1"
<el-col :span="5"> :step="0.1"
<el-form-item label="脉搏:" prop="mb" label-width="80px"> :min="35"
<el-input v-model="form.mb" style="width: 80%" /> :max="42"
</el-form-item> style="width: 100%"
</el-col> />
<!-- 第三个表单项 --> </el-form-item>
<el-col :span="5"> </el-col>
<el-form-item label="呼吸:" prop="hx" label-width="80px"> <el-col :span="8">
<el-input v-model="form.hx" style="width: 80%" /> <el-form-item label="脉搏(次/分)" prop="pulseRate">
</el-form-item> <el-input-number v-model="form.pulseRate" :min="0" :max="300" style="width: 100%" />
</el-col> </el-form-item>
<!-- 第四个表单项 --> </el-col>
<el-col :span="9"> <el-col :span="8">
<el-form-item label="血压:" prop="bloodPressure" label-width="80px"> <el-form-item label="心率(次/分)" prop="heartRate">
<div class="xy-container" style="display: flex; align-items: center"> <el-input-number v-model="form.heartRate" :min="0" :max="300" style="width: 100%" />
<el-input v-model="form.systolicBloodPressure" style="width: 25%" /> </el-form-item>
<span>/</span> </el-col>
<el-input v-model="form.diastolicBloodPressure" style="width: 25%" /> <el-col :span="8">
(/)mmHg <el-form-item label="呼吸(次/分)" prop="breathRate">
</div> <el-input-number v-model="form.breathRate" :min="0" :max="100" style="width: 100%" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 第一个表单项 --> <el-col :span="8">
<el-col :span="5" style="margin-top: 10px"> <el-form-item label="血氧饱和度(%)" prop="bloodOxygen">
<el-form-item label="心率:" prop="xl" label-width="80px"> <el-input-number
<el-input v-model="form.xl" style="width: 80%" /> v-model="form.bloodOxygen"
</el-form-item> :min="0"
</el-col> :max="100"
<!-- 第二个表单项 --> style="width: 100%"
<el-col :span="5" style="margin-top: 10px"> />
<el-form-item label="血氧:" prop="xy" label-width="80px"> </el-form-item>
<el-input v-model="form.xy" style="width: 80%" /> </el-col>
</el-form-item> </el-row>
</el-col> <el-row :gutter="16">
<!-- 第五个表单项 --> <el-col :span="12">
<el-col :span="4" style="margin-top: 10px"> <el-form-item label="血压(mmHg)" prop="bloodPressure">
<el-form-item style="margin-left: 20px"> <div style="display: flex; align-items: center; gap: 8px">
<el-checkbox <el-input-number
v-model="form.vitalSignsSyncFlag" v-model="form.systolicBloodPressure"
label="同步到体征表" :min="0"
name="SYP" :max="300"
/> placeholder="收缩压"
<!-- @change="checkTimeValidity" --> style="width: 100px"
</el-form-item> />
</el-col> <span>/</span>
</el-row> <el-input-number
</el-form-item> v-model="form.diastolicBloodPressure"
<el-form-item :min="0"
label="病情观察与护理记录:" :max="200"
label-width="90px" placeholder="舒张压"
class="changeMajorFromItem" style="width: 100px"
prop="column081" />
> <span>mmHg</span>
<el-input </div>
v-model="form.bqgcOther" </el-form-item>
type="textarea" </el-col>
:rows="8" <el-col :span="12">
:autosize="{ minRows: 3, maxRows: 8 }" <el-form-item label="吸氧(升/分)" prop="oxygen">
class="el-textarea" <div style="display: flex; gap: 8px">
style="width: 95%" <el-select v-model="form.oxygenMethod" placeholder="方式" style="width: 120px">
/> <el-option label="鼻导管" value="1" />
</el-form-item> <el-option label="面罩" value="2" />
</el-form> <el-option label="高流量" value="3" />
<el-option label="机械通气" value="4" />
</el-select>
<el-input-number
v-model="form.oxygenFlow"
:min="0"
:max="20"
placeholder="流量"
style="width: 100px"
/>
<span>L</span>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="24">
<el-form-item>
<el-checkbox v-model="form.vitalSignsSyncFlag" label="同步到体征表" />
</el-form-item>
</el-col>
</el-row>
</div> </div>
</div>
<!-- 入量记录 -->
<div class="form-section">
<h4 class="section-title">入量记录</h4>
<el-row :gutter="16">
<el-col :span="10">
<el-form-item label="入量名称" prop="inputName">
<el-input v-model="form.inputName" placeholder="请输入入量名称" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="量(ml)" prop="inputAmount">
<el-input-number v-model="form.inputAmount" :min="0" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="途径" prop="inputRoute">
<el-select v-model="form.inputRoute" placeholder="请选择" style="width: 100%">
<el-option label="口服" value="1" />
<el-option label="静脉" value="2" />
<el-option label="鼻饲" value="3" />
<el-option label="肛门" value="4" />
<el-option label="皮下" value="5" />
<el-option label="其他" value="6" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 出量记录 -->
<div class="form-section">
<h4 class="section-title">出量记录</h4>
<el-row :gutter="16">
<el-col :span="10">
<el-form-item label="出量名称" prop="outputName">
<el-select v-model="form.outputName" placeholder="请选择" style="width: 100%">
<el-option label="尿量" value="尿量" />
<el-option label="大便" value="大便" />
<el-option label="呕吐" value="呕吐" />
<el-option label="引流量" value="引流量" />
<el-option label="出血" value="出血" />
<el-option label="其他" value="其他" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="量(ml)" prop="outputAmount">
<el-input-number v-model="form.outputAmount" :min="0" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 专科护理 -->
<div class="form-section">
<h4 class="section-title">专科护理</h4>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="皮肤情况" prop="skinConditionCode">
<el-select v-model="form.skinConditionCode" placeholder="请选择" style="width: 100%">
<el-option label="完好" value="1" />
<el-option label="压疮" value="2" />
<el-option label="出血点" value="3" />
<el-option label="破损" value="4" />
<el-option label="水肿" value="5" />
<el-option label="瘀斑" value="6" />
<el-option label="过敏" value="7" />
<el-option label="其他" value="8" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="管路护理" prop="pipelineCare">
<el-select v-model="form.pipelineCare" multiple placeholder="请选择" style="width: 100%">
<el-option label="尿管" value="2" />
<el-option label="胃管" value="1" />
<el-option label="引流管" value="5" />
<el-option label="静脉置管" value="3" />
<el-option label="吸氧管" value="4" />
<el-option label="T管" value="5" />
<el-option label="胸腔引流管" value="6" />
<el-option label="腹腔引流管" value="7" />
<el-option label="伤口引流管" value="8" />
<el-option label="脑室引流管" value="9" />
<el-option label="其他" value="10" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 综合描述 -->
<div class="form-section">
<h4 class="section-title">综合描述</h4>
<el-form-item label="病情观察及措施" prop="conditionObservation">
<el-input
v-model="form.conditionObservation"
type="textarea"
:rows="4"
placeholder="请输入病情观察及护理措施..."
style="width: 100%"
/>
</el-form-item>
</div>
<!-- 签章 -->
<div class="form-section">
<h4 class="section-title">签章</h4>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="护士签名" prop="nurseSignature">
<el-select
v-model="form.nurseSignature"
placeholder="请选择或自动获取当前登录人"
style="width: 100%"
:value-key="String"
>
<el-option :label="userStore.nickName || '当前用户'" :value="String(userStore.id)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button type="primary" @click="submit">保存</el-button> <el-button type="primary" @click="submit" :disabled="submitting">保存</el-button>
<el-button @click="close"> </el-button> <el-button @click="handleDialogClose" :disabled="submitting"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<record-template
ref="recordRemplateDialogRef"
:open="openRecordTemplate"
:patientId="patientId"
:editData="editData"
:recordTitle="recordTitle"
@close="closeRecordTemplateDialog"
/>
</div> </div>
</template> </template>
<script setup> <script setup>
import recordTemplate from './recordTemplate.vue'; import moment from 'moment';
import {nextTick, ref} from 'vue'; import useUserStore from '@/store/modules/user';
import {deleteRecordTemplate, getRecordTemplateList, saveRecord, updateRecord} from './api'; import { saveRecord, updateRecord } from './api';
const userStore = useUserStore();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const props = defineProps({ const props = defineProps({
open: { open: {
type: Boolean, type: Boolean,
@@ -200,220 +312,285 @@ const props = defineProps({
default: () => {}, default: () => {},
}, },
}); });
const searchKey = ref('');
const emit = defineEmits(['close']); const emit = defineEmits(['close']);
const templateQueryParams = ref({
pageNum: 1, const formRef = ref(null);
pageSize: 10, const submitting = ref(false); // 防止重复提交
searchKey: undefined, // 患者id const form = ref({
recordDate: '',
recordTime: '',
consciousnessCode: undefined,
temperature: undefined,
pulseRate: undefined,
heartRate: undefined,
breathRate: undefined,
systolicBloodPressure: undefined,
diastolicBloodPressure: undefined,
bloodOxygen: undefined,
oxygenMethod: undefined,
oxygenFlow: undefined,
vitalSignsSyncFlag: false,
inputName: '',
inputAmount: undefined,
inputRoute: undefined,
outputName: undefined,
outputAmount: undefined,
skinConditionCode: undefined,
pipelineCare: [],
conditionObservation: '',
nurseSignature: String(userStore.id),
}); });
const templateTotal = ref(0);
const templateList = ref([]);
const patientInfo = ref({}); const rules = ref({
const form = ref({}); recordDate: [{ required: true, message: '请选择日期', trigger: 'change' }],
const templateIds = ref([]); recordTime: [{ required: true, message: '请选择时间', trigger: 'change' }],
const single = ref(true); });
const multiple = ref(true);
const editData = ref({});
const title = ref(''); const dialogTitle = computed(() => {
return props.title === '新增' ? '护理记录 - 新增' : '护理记录 - 编辑';
const recordTitle = ref(''); });
const openRecordTemplate = ref(false);
/** /**
* 取得患者信息详细 * 显示弹窗
*/ */
function show() { function show() {
patientInfo.value = props.patientInfo;
console.log(props, 'props', props.patientInfo);
reset(); reset();
title.value = ''; if (props.title === '编辑' && props.editData.content) {
title.value = props.title; const content = props.editData.content;
if (title.value === '编辑') { // 从 recordingTime 或 recordTime 中正确提取日期和时间
form.value = props.editData.content; let recordDate = '';
} let recordTime = '';
console.log(props, 'props', title.value);
getTemplateListInfo();
}
/** 选择删除模板条数 */ // 优先使用 recordingTime格式: "YYYY-MM-DD HH:mm:ss"
function handleSelectionChange(selection) { const fullDateTime = content.recordingTime || content.recordTime || '';
console.log(selection, '选择条数'); if (fullDateTime) {
templateIds.value = selection.map((item) => item.id); const parts = fullDateTime.split(' ');
console.log(templateIds.value, '选择条数'); if (parts.length >= 2) {
single.value = selection.length != 1; recordDate = parts[0];
multiple.value = !selection.length; recordTime = parts[1];
} } else if (fullDateTime.includes(':')) {
/** // 纯时间格式
* 模板列表 recordTime = fullDateTime;
*/ } else {
function getTemplateListInfo() { // 纯日期格式
console.log(searchKey.value, '搜索关键字'); recordDate = fullDateTime;
templateQueryParams.value.searchKey = searchKey.value; }
getRecordTemplateList(templateQueryParams.value).then((res) => { }
console.log('模板列表', res);
templateList.value = res.data.records; form.value = {
templateTotal.value = res.data.total; recordDate: recordDate,
}); recordTime: recordTime,
consciousnessCode: content.consciousnessCode,
temperature: content.temperature,
pulseRate: content.pulseRate || content.mb,
heartRate: content.heartRate || content.xl,
breathRate: content.breathRate || content.hx,
systolicBloodPressure: content.systolicBloodPressure,
diastolicBloodPressure: content.diastolicBloodPressure,
bloodOxygen: content.bloodOxygen || content.xy,
oxygenMethod: content.oxygenMethod,
oxygenFlow: content.oxygenFlow,
vitalSignsSyncFlag: content.vitalSignsSyncFlag || false,
inputName: content.inputName || '',
inputAmount: content.inputAmount,
inputRoute: content.inputRoute,
outputName: content.outputName,
outputAmount: content.outputAmount,
skinConditionCode: content.skinConditionCode,
pipelineCare: content.pipelineCare || [],
conditionObservation: content.conditionObservation || content.bqgcOther || '',
nurseSignature: content.nurseSignature || String(userStore.id),
};
} else {
// 默认值 - 新增时自动获取当前日期时间
const now = new Date();
form.value.recordDate = moment(now).format('YYYY-MM-DD');
form.value.recordTime = moment(now).format('HH:mm:ss');
// 其他字段设为空或默认值
form.value.consciousnessCode = undefined;
form.value.temperature = undefined;
form.value.pulseRate = undefined;
form.value.heartRate = undefined;
form.value.breathRate = undefined;
form.value.systolicBloodPressure = undefined;
form.value.diastolicBloodPressure = undefined;
form.value.bloodOxygen = undefined;
form.value.oxygenMethod = undefined;
form.value.oxygenFlow = undefined;
form.value.vitalSignsSyncFlag = false;
form.value.inputName = '';
form.value.inputAmount = undefined;
form.value.inputRoute = undefined;
form.value.outputName = undefined;
form.value.outputAmount = undefined;
form.value.skinConditionCode = undefined;
form.value.pipelineCare = [];
form.value.conditionObservation = '';
form.value.nurseSignature = String(userStore.id);
}
} }
/** /**
* 删除模板 * 重置表单
*
* @param index - 要删除的处方在列表中的索引
*/ */
function deleteTemplate(index) {
console.log(templateIds.value, '删除记录单模板');
if (templateIds.value.length == 0) {
proxy.$modal.msgWarning('请选择要删除的数据信息!');
return;
}
proxy.$modal
.confirm('是否确认删除以上数据!')
.then(function () {
return deleteRecordTemplate(templateIds.value);
})
.then(() => {
getTemplateListInfo();
proxy.$modal.msgSuccess('删除成功');
})
.catch(() => {});
}
function close() {
reset();
emit('close');
}
/** 重置操作表单 */
function reset() { function reset() {
submitting.value = false;
form.value = { form.value = {
tw: undefined, recordDate: '',
mb: undefined, recordTime: '',
hx: undefined, consciousnessCode: undefined,
temperature: undefined,
pulseRate: undefined,
heartRate: undefined,
breathRate: undefined,
systolicBloodPressure: undefined, systolicBloodPressure: undefined,
diastolicBloodPressure: undefined, diastolicBloodPressure: undefined,
xl: undefined, bloodOxygen: undefined,
xy: undefined, oxygenMethod: undefined,
oxygenFlow: undefined,
vitalSignsSyncFlag: false, vitalSignsSyncFlag: false,
bqgc: undefined, inputName: '',
bqgcOther: undefined, inputAmount: undefined,
inputRoute: undefined,
outputName: undefined,
outputAmount: undefined,
skinConditionCode: undefined,
pipelineCare: [],
conditionObservation: '',
nurseSignature: String(userStore.id),
}; };
proxy.resetForm('formRef'); proxy.resetForm('formRef');
} }
/** /**
* 保存记录单 * 关闭弹窗
*/
function close() {
emit('close');
}
/**
* Dialog 关闭回调
*/
function handleDialogClose() {
emit('close');
}
/**
* 提交表单
*/ */
function submit() { function submit() {
if (title.value === '新增') { if (submitting.value) return;
submitting.value = true;
// 验证表单
proxy.$refs['formRef'].validate((valid) => {
if (!valid) {
submitting.value = false;
return;
}
// 组合日期和时间
const recordingTime = `${form.value.recordDate} ${form.value.recordTime}`;
const submitData = {
...form.value,
recordingTime: recordingTime,
// 兼容旧字段
mb: form.value.pulseRate,
xl: form.value.heartRate,
hx: form.value.breathRate,
xy: form.value.bloodOxygen,
bqgcOther: form.value.conditionObservation,
};
console.log('提交数据:', submitData);
if (props.title === '新增') {
const insertParam = { const insertParam = {
encounterId: props.patientInfo.encounterId, encounterId: props.patientInfo.encounterId,
patientId: props.patientInfo.patientId, patientId: props.patientInfo.patientId,
orgId: props.patientInfo.orgId, orgId: props.patientInfo.orgId,
recordingTime: form.value.recordingTime, recordingTime: recordingTime,
vitalSignsSyncFlag: form.value.vitalSignsSyncFlag ? form.value.vitalSignsSyncFlag : false, vitalSignsSyncFlag: form.value.vitalSignsSyncFlag,
contextJson: JSON.stringify(form.value), contextJson: JSON.stringify(submitData),
}; };
console.log(insertParam, 'insertParam'); console.log('新增数据:', insertParam);
saveRecord(insertParam).then((res) => { saveRecord(insertParam).then((res) => {
console.log('保存结果:', res);
submitting.value = false;
if (res.code == 200) { if (res.code == 200) {
emit('close', 'success'); emit('close', 'success');
reset(); } else {
proxy.$modal.msgError(res.msg || '保存失败');
} }
}).catch((err) => {
console.error('保存错误:', err);
submitting.value = false;
}); });
} else { } else {
const updateParamParam = { const updateParam = {
recordId: props.editData.recordId, recordId: props.editData.recordId,
encounterId: props.patientInfo.encounterId, encounterId: props.patientInfo.encounterId,
patientId: props.patientInfo.patientId, patientId: props.patientInfo.patientId,
orgId: props.patientInfo.orgId, orgId: props.patientInfo.orgId,
recordingTime: form.value.recordingTime, recordingTime: recordingTime,
vitalSignsSyncFlag: form.value.vitalSignsSyncFlag ? form.value.vitalSignsSyncFlag : false, vitalSignsSyncFlag: form.value.vitalSignsSyncFlag,
contextJson: JSON.stringify(form.value), contextJson: JSON.stringify(submitData),
}; };
console.log(updateParamParam, 'updateParamParam'); console.log('更新数据:', updateParam);
updateRecord(updateParamParam).then((res) => { updateRecord(updateParam).then((res) => {
console.log('更新结果:', res);
submitting.value = false;
if (res.code == 200) { if (res.code == 200) {
emit('close', 'success'); emit('close', 'success');
reset(); } else {
proxy.$modal.msgError(res.msg || '更新失败');
} }
}).catch((err) => {
console.error('更新错误:', err);
submitting.value = false;
}); });
} }
}
/**
* 设定病情观测
*/
function setTemplate(row) {
console.log(row, '设定病情观测');
form.value.bqgcOther = row.contextJson;
}
/**
* 新增护理模板
*/
function openTemplateDialog() {
recordTitle.value = '新增模板';
openRecordTemplate.value = true;
nextTick(() => {
proxy.$refs['recordRemplateDialogRef'].show();
}); });
} }
/**
* 编辑护理模板
*/
function handleEditTemplate(row) {
recordTitle.value = '编辑模板';
openRecordTemplate.value = true;
editData.value = row;
nextTick(() => {
proxy.$refs['recordRemplateDialogRef'].show();
});
}
/**
* 关闭记录模板对话框
*
* 该函数用于关闭记录模板对话框。
*/
function closeRecordTemplateDialog(str) {
openRecordTemplate.value = false;
getTemplateListInfo();
if (str === 'success') {
proxy.$modal.msgSuccess('操作成功!');
}
}
defineExpose({ defineExpose({
show, show,
}); });
</script> </script>
<style scoped> <style scoped>
:deep(.pagination-container .el-pagination) { .form-section {
right: 20px !important; margin-bottom: 20px;
padding-bottom: 16px;
border-bottom: 1px dashed #ebeef5;
} }
.input-select-container { .form-section:last-child {
display: flex; border-bottom: none;
justify-content: space-between; margin-bottom: 0;
align-items: center;
} }
.input-select-container .el-input__inner, .section-title {
.input-select-container .el-select { margin: 0 0 12px 0;
color: #409eff;
font-weight: 600;
font-size: 14px;
padding-left: 8px;
border-left: 3px solid #409eff;
}
.dialog-footer {
text-align: right;
}
:deep(.el-input-number) {
width: 100%; width: 100%;
} }
.flex-container { :deep(.el-input-number .el-input__inner) {
display: flex; text-align: left;
align-items: center; /* 垂直居中对齐 */
justify-content: flex-start; /* 水平起始对齐 */
gap: 8px; /* 两个输入框之间的间距 */
} }
</style>
.flex-container label {
margin: 0 8px; /* 标签的间距 */
}
</style>

View File

@@ -0,0 +1,73 @@
<template>
<div class="nursing-code-reference">
<div class="reference-section">
<h5>意识</h5>
<span class="code-item">1.意识清</span>
<span class="code-item">2.嗜睡</span>
<span class="code-item">3.意识模糊</span>
<span class="code-item">4.昏睡</span>
<span class="code-item">5.浅昏迷</span>
<span class="code-item">6.深昏迷</span>
</div>
<div class="reference-section">
<h5>管路</h5>
<span class="code-item">1.尿管</span>
<span class="code-item">2.鼻饲管</span>
<span class="code-item">3.胃肠减压管</span>
<span class="code-item">4.外周静脉置管</span>
<span class="code-item">5.中心静脉置管</span>
<span class="code-item">6.胸腔闭式引流管</span>
<span class="code-item">7.腹腔引流管</span>
<span class="code-item">8.头部引流管</span>
<span class="code-item">9.其他引流管</span>
<span class="code-item">10.其他置管</span>
</div>
<div class="reference-section">
<h5>皮肤</h5>
<span class="code-item">1.完好</span>
<span class="code-item">2.压疮</span>
<span class="code-item">3.出血点</span>
<span class="code-item">4.破损</span>
<span class="code-item">5.水肿</span>
</div>
</div>
</template>
<script setup>
</script>
<style scoped>
.nursing-code-reference {
background: #fafafa;
padding: 12px 16px;
border-radius: 4px;
margin-top: 16px;
display: flex;
flex-wrap: wrap;
gap: 20px;
border: 1px solid #ebeef5;
}
.reference-section {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.reference-section h5 {
margin: 0;
color: #606266;
font-weight: 600;
font-size: 13px;
white-space: nowrap;
}
.code-item {
color: #909399;
font-size: 12px;
padding: 2px 6px;
background: #f4f4f5;
border-radius: 3px;
}
</style>