docs(release-notes): 添加住院护士站划价功能说明和发版记录

- 新增住院护士站划价服务流程说明文档,详细描述了从参数预处理到结果响应的五大阶段流程
- 包含耗材类医嘱和诊疗活动类医嘱的差异化处理逻辑
- 添加完整的发版内容记录,涵盖新增菜单功能和各模块优化点
- 记录了住院相关功能的新增和门诊业务流程的修复
```
This commit is contained in:
2025-12-25 14:13:14 +08:00
parent 85fcb7c2e2
commit abc0674531
920 changed files with 107068 additions and 14495 deletions

View File

@@ -15,93 +15,158 @@
<el-row>
<el-col :span="24">
<div class="patient-info">
<div style="display: flex;align-items: center;margin-bottom: 16px;">
<div style="margin-right: 36px;font-size: 18px;font-weight: 700;">{{ props.pendingInfo.houseName + '-' + props.pendingInfo.bedName }}</div>
<div style="border-radius: 50px;border: 2px solid slategray;padding: 4px 12px;">{{ props.pendingInfo.contractName }}</div>
<div style="display: flex; align-items: center; margin-bottom: 16px">
<div style="margin-right: 36px; font-size: 18px; font-weight: 700">
{{ props.pendingInfo.houseName + '-' + props.pendingInfo.bedName }}
</div>
<div style="border-radius: 50px; border: 2px solid slategray; padding: 4px 12px">
{{ props.pendingInfo.contractName }}
</div>
</div>
<div>
<el-row>
<el-col :span="12">
<div style="margin-bottom: 12px;">
{{ props.pendingInfo.patientName}}
<span style="color: #9f9f9f;">{{ props.pendingInfo.genderEnum_enumText}}/</span>
<span style="color: #9f9f9f;">{{ props.pendingInfo.age}}</span>
<div style="margin-bottom: 12px">
{{ props.pendingInfo.patientName }}
<span style="color: #9f9f9f"
>{{ props.pendingInfo.genderEnum_enumText }}/</span
>
<span style="color: #9f9f9f">{{ props.pendingInfo.age }}</span>
</div>
</el-col>
<el-col :span="12">
<div>
电话{{ pendingInfo.phone }}
</div>
<div>电话{{ pendingInfo.phone }}</div>
</el-col>
<el-col :span="12">
<div>
住院诊断{{ pendingInfo.conditionNames }}
</div>
<div>住院诊断{{ pendingInfo.conditionNames }}</div>
</el-col>
<el-col :span="12">{{ props.pendingInfo.patientId }}</el-col>
</el-row>
</div>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<div class="info-title">
入院体征
</div>
<div class="info-title">入院体征</div>
</el-col>
<el-col :span="8">
<el-form-item label="身高" label-width="50px">
<el-input-number :controls="false" style="width: 160px" clearable v-model="interventionForm.height" placeholder="请输入" :min="0"
:max="999"></el-input-number><span class="unit">cm</span>
<!-- <el-input-number
:controls="false"
style="width: 160px"
clearable
v-model="interventionForm.height"
placeholder="请输入"
:min="0"
:max="999"
></el-input-number
><span class="unit">cm</span> -->
<el-input
class="right-aligned"
style="width: 160px"
clearable
v-model="interventionForm.height"
placeholder="请输入"
:min="0"
:max="999"
></el-input>
<span class="unit">cm</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="体重" label-width="50px">
<el-input-number :controls="false" style="width: 160px" v-model="interventionForm.weight" clearable placeholder="请输入" :min="0"
:max="999"></el-input-number>
<!-- <el-input-number
:controls="false"
style="width: 160px"
v-model="interventionForm.weight"
clearable
placeholder="请输入"
:min="0"
:max="999"
></el-input-number>
<span class="unit">kg</span> -->
<el-input
class="right-aligned"
style="width: 160px"
v-model="interventionForm.weight"
clearable
placeholder="请输入"
></el-input>
<span class="unit">kg</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="体温" label-width="50px">
<el-input-number :controls="false" style="width: 160px" v-model="interventionForm.temperature" clearable placeholder="请输入"
:min="0" :max="99"></el-input-number>
<el-input-number
:controls="false"
style="width: 160px"
v-model="interventionForm.temperature"
clearable
placeholder="请输入"
:min="0"
:max="99"
></el-input-number>
<span class="unit"></span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="心率" label-width="50px">
<el-input-number :controls="false" style="width: 160px" v-model="interventionForm.hertRate" clearable placeholder="请输入" :min="0"
:max="999"></el-input-number>
<el-input-number
:controls="false"
style="width: 160px"
v-model="interventionForm.hertRate"
clearable
placeholder="请输入"
:min="0"
:max="999"
></el-input-number>
<span class="unit">BPM</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="脉搏" label-width="50px">
<el-input-number :controls="false" style="width: 160px" v-model="interventionForm.pulse" clearable placeholder="请输入" :min="0"
:max="999"></el-input-number><span class="unit">P</span>
<el-input-number
:controls="false"
style="width: 160px"
v-model="interventionForm.pulse"
clearable
placeholder="请输入"
:min="0"
:max="999"
></el-input-number
><span class="unit">P</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="血压" label-width="50px">
<el-input-number :controls="false" style="width: 72px" v-model="interventionForm.endBloodPressure" clearable placeholder="请输入"
:min="0" :max="999"></el-input-number>
<el-input-number
:controls="false"
style="width: 72px"
v-model="interventionForm.endBloodPressure"
clearable
placeholder="请输入"
:min="0"
:max="999"
></el-input-number>
<span style="display: inline-block; width: 8px; margin: 0 4px"> ~ </span>
<el-input-number :controls="false" style="width: 72px" v-model="interventionForm.highBloodPressure" clearable placeholder="请输入"
:min="0" :max="999"></el-input-number>
<el-input-number
:controls="false"
style="width: 72px"
v-model="interventionForm.highBloodPressure"
clearable
placeholder="请输入"
:min="0"
:max="999"
></el-input-number>
<span class="unit">mmHg</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<div class="info-title">
入院信息
</div>
<div class="info-title">入院信息</div>
</el-col>
<el-col :span="8">
<el-form-item label="入院科室" label-width="100px">
@@ -150,7 +215,9 @@
v-model="interventionForm.admittingDoctorId"
placeholder="请选择住院医生"
style="width: 240px"
:disabled="props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2"
:disabled="
props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2
"
>
<el-option
v-for="item in doctorInfoOptions"
@@ -167,7 +234,9 @@
v-model="interventionForm.attendingDoctorId"
placeholder="请选择主治医生"
style="width: 240px"
:disabled="props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2"
:disabled="
props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2
"
>
<el-option
v-for="item in doctorInfoOptions"
@@ -184,7 +253,9 @@
v-model="interventionForm.chiefDoctorId"
placeholder="请选择主任医生"
style="width: 240px"
:disabled="props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2"
:disabled="
props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2
"
>
<el-option
v-for="item in doctorInfoOptions"
@@ -213,7 +284,9 @@
v-model="interventionForm.primaryNurseId"
placeholder="请选择责任护士"
style="width: 240px"
:disabled="props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2"
:disabled="
props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2
"
>
<el-option
v-for="item in nurseInfoOptions"
@@ -230,7 +303,9 @@
v-model="interventionForm.priorityEnum"
placeholder="请选择患者病情"
style="width: 240px"
:disabled="props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2"
:disabled="
props.pendingInfo.encounterStatus == 5 && props.pendingInfo.entranceType == 2
"
>
<el-option
v-for="item in props.priorityOptions"
@@ -257,50 +332,57 @@
</el-dialog>
</template>
<script lang="ts" setup>
import { reactive, ref, onMounted, inject, type Ref, watch } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import { dayjs, ElMessage } from 'element-plus'
import { reactive, ref, onMounted, inject, type Ref, watch, nextTick } from 'vue';
import type { FormInstance, FormRules } from 'element-plus';
import { dayjs, ElMessage } from 'element-plus';
// import type { IInPatient } from '@/model/IInPatient'
import { getBedInfo, getDoctorInfo, getNurseInfo, getInit, bedAssignment, getPatientInfo } from './api'
import {
getBedInfo,
getDoctorInfo,
getNurseInfo,
getInit,
bedAssignment,
getPatientInfo,
} from './api';
const props = defineProps({
pendingInfo: {
type: Object,
require: true,
default: () => ({})
default: () => ({}),
},
priorityOptions: {
type: Object,
require: true,
default: () => ({})
default: () => ({}),
},
})
});
const currentInPatient = ref<Partial<IInPatient>>({})
const bedInfoOptions = ref<{ label: string; value: string }[]>([])
const doctorInfoOptions = ref<{ name: string; id: string }[]>([])
const nurseInfoOptions = ref<{ name: string; practitionerId: string }[]>([])
const InitInfoOptions = ref<any>({})
const priorityListOptions = ref<{ info: string; value: string }[]>([])
const pendingInfo = ref<any>({})
const currentInPatient = ref<Partial<IInPatient>>({});
const bedInfoOptions = ref<{ label: string; value: string }[]>([]);
const doctorInfoOptions = ref<{ name: string; id: string }[]>([]);
const nurseInfoOptions = ref<{ name: string; practitionerId: string }[]>([]);
const InitInfoOptions = ref<any>({});
const priorityListOptions = ref<{ info: string; value: string }[]>([]);
const pendingInfo = ref<any>({});
const initCurrentInPatient = () => {
currentInPatient.value = {
feeType: '08',
sexName: '男',
age: '0',
}
}
};
};
/* 入科 */
const interventionForm = ref({
height: undefined,
weight: undefined,
temperature: undefined,
hertRate: undefined,
pulse: undefined,
endBloodPressure: undefined,
highBloodPressure: undefined,
height: '',
weight: '',
temperature: '',
hertRate: '',
pulse: '',
endBloodPressure: '',
highBloodPressure: '',
bedLocationId: '', // 床号
admittingDoctorId: '', // 住院医师
attendingDoctorId: '', // 主治医师
@@ -312,85 +394,129 @@ const interventionForm = ref({
bedName: '',
attendingDocUpdateId: '',
startTime: '', //入院时间
})
});
watch(() => props.pendingInfo, (newVal, oldVal) => {
console.log(newVal)
if(newVal) {
getPatientInfo({encounterId: newVal.encounterId}).then(res => {
pendingInfo.value = res.data
interventionForm.value.admittingDoctorId = res.data.admittingDoctorId
interventionForm.value.attendingDoctorId = res.data.attendingDoctorId
interventionForm.value.chiefDoctorId = res.data.chiefDoctorId
interventionForm.value.primaryNurseId = res.data.primaryNurseId
if(res.data.startTime) {
interventionForm.value.startTime = dayjs(res.data.startTime).format('YYYY-MM-DD HH:mm:ss')
}else {
interventionForm.value.startTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
}
})
interventionForm.value.priorityEnum = newVal.priorityEnum
interventionForm.value.organizationName = newVal.organizationName
interventionForm.value.wardName = newVal.wardName
interventionForm.value.bedName = newVal.bedName
}
},{ deep: true })
watch(
() => props.pendingInfo,
(newVal, oldVal) => {
console.log(newVal);
if (newVal) {
getPatientInfo({ encounterId: newVal.encounterId }).then((res) => {
console.log('res============>', JSON.stringify(res.data));
pendingInfo.value = res.data;
interventionForm.value.admittingDoctorId = res.data.admittingDoctorId;
interventionForm.value.attendingDoctorId = res.data.attendingDoctorId;
if (res.data.chiefDoctorId) {
interventionForm.value.chiefDoctorId = res.data.chiefDoctorId;
}
interventionForm.value.primaryNurseId = res.data.primaryNurseId;
if (res.data.startTime) {
interventionForm.value.startTime = dayjs(res.data.startTime).format(
'YYYY-MM-DD HH:mm:ss'
);
} else {
interventionForm.value.startTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss');
}
interventionForm.value.height = res.data.height;
interventionForm.value.weight = res.data.weight;
interventionForm.value.temperature = res.data.temperature;
interventionForm.value.hertRate = res.data.hertRate;
interventionForm.value.pulse = res.data.pulse;
interventionForm.value.endBloodPressure = res.data.endBloodPressure;
interventionForm.value.highBloodPressure = res.data.highBloodPressure;
});
interventionForm.value.priorityEnum = newVal.priorityEnum;
interventionForm.value.organizationName = newVal.organizationName;
interventionForm.value.wardName = newVal.wardName;
interventionForm.value.bedName = newVal.bedName;
}
},
{ deep: true }
);
/* 初始化数据 */
const init = () => {
initCurrentInPatient()
getInit().then(res => {
InitInfoOptions.value = res.data
// 安全地设置priorityListOptions
if (res.data && res.data.priorityListOptions) {
priorityListOptions.value = res.data.priorityListOptions
}
}).catch(error => {
console.error('获取初始化数据失败:', error)
})
initCurrentInPatient();
getInit()
.then((res) => {
InitInfoOptions.value = res.data;
// 安全地设置priorityListOptions
if (res.data && res.data.priorityListOptions) {
priorityListOptions.value = res.data.priorityListOptions;
}
})
.catch((error) => {
console.error('获取初始化数据失败:', error);
});
if (props.pendingInfo.wardLocationId) {
getBedInfo({wardLocationId: props.pendingInfo.wardLocationId}).then(res => {
bedInfoOptions.value = res.data || []
}).catch(error => {
console.error('获取床位信息失败:', error)
bedInfoOptions.value = []
})
getBedInfo({ wardLocationId: props.pendingInfo.wardLocationId })
.then((res) => {
bedInfoOptions.value = res.data || [];
})
.catch((error) => {
console.error('获取床位信息失败:', error);
bedInfoOptions.value = [];
});
}
if (props.pendingInfo.organizationId) {
getDoctorInfo({organizationId: props.pendingInfo.organizationId}).then(res => {
doctorInfoOptions.value = res.data.records || []
}).catch(error => {
console.error('获取医生信息失败:', error)
doctorInfoOptions.value = []
})
getNurseInfo({organizationId: props.pendingInfo.organizationId}).then(res => {
nurseInfoOptions.value = res.data || []
}).catch(error => {
console.error('获取护士信息失败:', error)
nurseInfoOptions.value = []
})
// 主任医生
getDoctorInfo({ organizationId: props.pendingInfo.organizationId })
.then((res) => {
console.log('doctorInfoOptions======>', JSON.stringify(res.data));
doctorInfoOptions.value = res.data.records || [];
nextTick(() => {
// 如果存在主任医师显示主任,如果没有选择第一个展示
if (doctorInfoOptions.value.length > 0) {
let selectId = '';
doctorInfoOptions.value.forEach((item: any) => {
if (item.drProfttlCode == '231') {
selectId = item.id;
}
});
if (selectId.length > 0) {
interventionForm.value.chiefDoctorId = selectId;
} else {
interventionForm.value.chiefDoctorId = doctorInfoOptions.value[0].id;
}
}
});
})
.catch((error) => {
console.error('获取医生信息失败:', error);
doctorInfoOptions.value = [];
});
getNurseInfo({ organizationId: props.pendingInfo.organizationId })
.then((res) => {
nurseInfoOptions.value = res.data || [];
})
.catch((error) => {
console.error('获取护士信息失败:', error);
nurseInfoOptions.value = [];
});
}
}
};
const rules = reactive<FormRules>({
admittingDoctorId: [{ required: true, message: '请选择住院医生', trigger: ['blur', 'change'] }],
primaryNurseId: [{ required: true, message: '请选择责任护士', trigger: ['blur', 'change'] }],
bedLocationId: [{ required: true, message: '请选择入住床位', trigger: ['blur', 'change'] }],
})
});
const printWristband = ref(false)
const emits = defineEmits(['okAct'])
const visible = defineModel('visible')
const width = '950px'
const printWristband = ref(false);
const emits = defineEmits(['okAct']);
const visible = defineModel('visible');
const width = '950px';
/* 取消 */
const cancelAct = () => {
resetForm()
visible.value = false
}
resetForm();
visible.value = false;
};
const resetForm = () => {
// interventionForm.value = {
@@ -415,74 +541,76 @@ const resetForm = () => {
// 可选:清空校验状态
if (interventionFormRef.value) {
interventionFormRef.value.resetFields()
interventionFormRef.value.resetFields();
}
}
};
/* 入科 */
const interventionFormRef = ref<FormInstance | null>(null)
const interventionFormRef = ref<FormInstance | null>(null);
const handleSubmit = async () => {
// TODO 登记入科
if (!interventionFormRef.value) {
console.error('表单引用不存在')
return
console.error('表单引用不存在');
return;
}
try {
const valid = await interventionFormRef.value.validate()
const valid = await interventionFormRef.value.validate();
if (valid) {
const params = {
const params = {
...pendingInfo.value,
...interventionForm.value,
targetBedId: props.pendingInfo.bedId,
busNo: props.pendingInfo.busNo,
inHosTime: props.pendingInfo.inHosTime,
targetHouseId : props.pendingInfo.targetHouseId,
targetHouseId: props.pendingInfo.targetHouseId,
targetEncounterId: props.pendingInfo.targetEncounterId,
editFlag: props.pendingInfo.entranceType == 1 ? 1 : 0
}
bedAssignment(params).then((res: any) => {
ElMessage({
message: '登记成功!',
type: 'success',
grouping: true,
showClose: true,
editFlag: props.pendingInfo.entranceType == 1 ? 1 : 0,
};
bedAssignment(params)
.then((res: any) => {
ElMessage({
message: '登记成功!',
type: 'success',
grouping: true,
showClose: true,
});
resetForm();
emits('okAct');
visible.value = false; // 关闭对话框
})
resetForm()
emits('okAct')
visible.value = false // 关闭对话框
}).catch((error: any) => {
console.error('登记失败:', error)
ElMessage({
message: '登记失败!',
type: 'error',
grouping: true,
showClose: true,
})
})
.catch((error: any) => {
console.error('登记失败:', error);
ElMessage({
message: '登记失败!',
type: 'error',
grouping: true,
showClose: true,
});
});
}
} catch (error) {
console.log('表单验证失败:', error)
console.log('表单验证失败:', error);
}
}
};
const openAct = () => {
init()
init();
if (props.pendingInfo) {
interventionForm.value.priorityEnum = props.pendingInfo.priorityEnum || ''
interventionForm.value.admittingDoctorId = props.pendingInfo.practitionerId || ''
interventionForm.value.organizationName = props.pendingInfo.organizationName || ''
interventionForm.value.wardName = props.pendingInfo.wardName || ''
interventionForm.value.attendingDocUpdateId = props.pendingInfo.admittingDoctorId || ''
interventionForm.value.priorityEnum = props.pendingInfo.priorityEnum || '';
interventionForm.value.admittingDoctorId = props.pendingInfo.practitionerId || '';
interventionForm.value.organizationName = props.pendingInfo.organizationName || '';
interventionForm.value.wardName = props.pendingInfo.wardName || '';
interventionForm.value.attendingDocUpdateId = props.pendingInfo.admittingDoctorId || '';
}
}
};
const closedAct = () => {
resetForm()
visible.value = false
}
resetForm();
visible.value = false;
};
onMounted(() => {})
onMounted(() => {});
</script>
<style lang="scss" scoped>
.transferIn-container {
@@ -531,4 +659,10 @@ onMounted(() => {})
padding: 5px 10px;
margin-bottom: 16px;
}
</style>
.right-aligned {
:deep(.el-input__inner) {
text-align: center;
}
}
</style>