Files
his/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/prescriptionList.vue
2025-10-16 17:38:49 +08:00

321 lines
9.7 KiB
Vue
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.

<template>
<div style="height: calc(100vh - 126px)">
<div
style="
height: 51px;
border-bottom: 2px solid #e4e7ed;
display: flex;
align-items: center;
justify-content: space-between;
"
>
<div>
<el-radio-group v-model="type" class="ml20" @change="handleRadioChange">
<el-radio :label="1">全部</el-radio>
<el-radio :label="2">长期</el-radio>
<el-radio :label="3">临时</el-radio>
</el-radio-group>
<el-button class="ml20" type="primary" plain @click="handleGetPrescription">
查询
</el-button>
</div>
<div>
<span class="descriptions-item-label">全选</span>
<el-switch v-model="chooseAll" @change="handelSwicthChange" />
<el-button class="ml20" type="primary" @click="handleCheck"> 核对通过 </el-button>
<el-button class="ml20 mr20" type="danger" @click="handleCancel"> 退回 </el-button>
</div>
</div>
<div
style="padding: 10px; background-color: #eef9fd; height: 100%; overflow-y: auto"
v-loading="loading"
>
<el-collapse
v-model="activeNames"
expand-icon-position="left"
v-if="prescriptionList.length > 0"
style="
border-bottom: 0px;
border-top: 0px;
border-radius: 0px;
overflow-y: auto;
max-height: calc(100vh - 200px);
"
>
<el-collapse-item
v-for="(item, index) in prescriptionList"
:key="index"
:name="item[0].encounterId"
style="
border: 2px solid #e4e7ed;
border-radius: 8px;
margin-bottom: 10px;
overflow: hidden;
"
>
<template #title>
<div style="display: flex; justify-content: space-between; align-items: center">
<div>
<span>{{ item[0].bedName + '【' + item[0].busNo + '】' }}</span>
<span>
{{
item[0].patientName + ' / ' + item[0].genderEnum_enumText + ' / ' + item[0].age
}}
</span>
<el-tag style="margin-left: 10px">{{ item[0].contractName }}</el-tag>
<span style="margin-left: 30px; font-weight: 600">
{{ item[0].conditionNames }}
</span>
</div>
<div
style="
display: flex;
justify-content: space-between;
gap: 20px;
align-items: center;
margin-right: 20px;
"
>
<div style="display: inline-block; margin-right: 10px">
<span class="descriptions-item-label">住院医生</span>
<span>{{ item[0].requesterId_dictText }}</span>
</div>
<div style="display: inline-block; margin-right: 10px">
<div
class="descriptions-item-label"
style="height: 20px; line-height: 20px; text-align: center; margin: 0"
>
预交金额
</div>
<div
style="
height: 20px;
line-height: 20px;
text-align: center;
font-size: 15px;
color: #ec8c43;
"
>
{{ item[0].balanceAmount?.toFixed(2) }}
</div>
</div>
</div>
</div>
</template>
<el-table
:data="item"
border
:ref="'tableRef' + index"
:header-cell-style="{ background: '#eef9fd !important' }"
>
<el-table-column type="selection" align="center" width="50" />
<el-table-column label="类型" align="center" prop="therapyEnum_enumText" width="80">
<template #default="scope">
<span :style="scope.row.therapyEnum == '1' ? 'color: #a6745c' : 'color: #3787a5'">
{{ scope.row.therapyEnum_enumText }}
</span>
</template>
</el-table-column>
<el-table-column label="医嘱内容" prop="adviceName">
<template #default="scope">
<span>
{{ scope.row.adviceName }}
</span>
<template v-if="scope.row.adviceTable == 'med_medication_request'">
<span>
{{ ' 【' + scope.row.volume + '】' }}
</span>
<span style="color: #447c95 !important">
{{
'(' +
scope.row.methodCode_dictText +
' ' +
scope.row.dose +
scope.row.doseUnitCode_dictText +
' ' +
scope.row.rateCode_dictText +
')'
}}
</span>
</template>
</template>
</el-table-column>
<el-table-column label="执行科室" prop="positionName" width="230" />
<el-table-column label="签发时间" prop="requestTime" width="230" />
</el-table>
</el-collapse-item>
</el-collapse>
<el-empty v-else description="点击查询获取患者医嘱信息"></el-empty>
</div>
</div>
</template>
<script setup>
import { getPrescriptionList, adviceVerify, cancel } from './api';
import { patientInfoList } from '../store/patient.js';
import { formatDateStr } from '@/utils/index';
const activeNames = ref([]);
const prescriptionList = ref([]);
const deadline = ref(formatDateStr(new Date(), 'YYYY-MM-DD') + ' 23:59:59');
const type = ref(1);
const { proxy } = getCurrentInstance();
const loading = ref(false);
const chooseAll = ref(false);
const props = defineProps({
requestStatus: {
type: Number,
default: 2,
},
});
function handleRadioChange() {
handleGetPrescription();
}
function handleGetPrescription() {
if (patientInfoList.value.length > 0) {
loading.value = true;
let encounterIds = patientInfoList.value.map((i) => i.encounterId).join(',');
getPrescriptionList({
encounterIds: encounterIds,
requestStatus: props.requestStatus,
pageSize: 10000,
pageNo: 1,
}).then((res) => {
// try {
// 根据encounterId分组
const groupedPrescriptions = res.data.records.reduce((groups, prescription) => {
const encounterId = prescription.encounterId;
if (!groups[encounterId]) {
groups[encounterId] = [];
}
if (!activeNames.value.includes(encounterId)) {
activeNames.value.push(encounterId);
}
groups[encounterId].push(prescription);
return groups;
}, {});
// 将分组结果转换为数组形式
prescriptionList.value = Object.values(groupedPrescriptions);
console.log(prescriptionList.value, '1111');
loading.value = false;
});
chooseAll.value = false;
} else {
proxy.$message.warning('请选择患者');
}
}
/**
* 核对通过
*/
function handleCheck() {
let list = getSelectRows();
if (list.length > 0) {
adviceVerify(list).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess(res.msg);
handleGetPrescription();
}
});
console.log(list, 'list');
} else {
proxy.$message.warning('请先选择医嘱信息');
}
}
/**
* 退回
*/
function handleCancel() {
let list = getSelectRows();
if (list.length > 0) {
cancel(list).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess(res.msg);
handleGetPrescription();
}
});
console.log(list, 'list');
} else {
proxy.$message.warning('请先选择医嘱信息');
}
}
function getSelectRows() {
// 获取选中的医嘱信息
let list = [];
prescriptionList.value.forEach((item, index) => {
list = [...list, ...proxy.$refs['tableRef' + index][0].getSelectionRows()];
});
return list.map((item) => {
return {
requestId: item.requestId,
requestTable: item.adviceTable,
};
});
}
function handelSwicthChange(value) {
prescriptionList.value.forEach((item, index) => {
proxy.$refs['tableRef' + index][0].toggleAllSelection();
});
}
/**
* 计算两个日期之间的所有日期(包含起始和结束日期)
* @param {string|Date} startDate - 开始日期
* @param {string|Date} endDate - 结束日期
* @returns {Array<string>} 格式为MM-DD的日期数组
*/
function getDateRange(startDate, endDate) {
const start = new Date(startDate);
const end = new Date(endDate);
// 重置时间部分,只保留日期
start.setHours(0, 0, 0, 0);
end.setHours(0, 0, 0, 0);
const dates = [];
const current = new Date(start);
// 循环添加日期直到结束日期
while (current <= end) {
// 格式化为MM-DD
const month = String(current.getMonth() + 1).padStart(2, '0');
const day = String(current.getDate()).padStart(2, '0');
dates.push(`${month}-${day}`);
// 移动到下一天
current.setDate(current.getDate() + 1);
}
return dates;
}
// 处理后端返回的时间集合
function handleTime() {}
defineExpose({
handleGetPrescription,
});
</script>
<style scoped>
.el-collapse-icon-position-left :deep(.el-collapse-item__header) {
padding: 10px;
}
:deep(.el-collapse-item__wrap) {
padding: 10px;
}
/* 表头背景色 */
:deep(.prescription-table .el-table__header th) {
background-color: #eef9fd !important;
}
:deep(.el-table__row:hover > td) {
background-color: #eef9fd !important;
}
</style>