Files
his/openhis-ui-vue3/src/views/charge/clinicrefund/index.vue
chenqi dc67c00d20 refactor(ui): 更新组件属性以符合新版本规范
- 将所有组件中的 append-to-body 属性替换为 teleported
- 为 el-radio 和 el-checkbox 组件添加正确的 value 属性
- 移除已弃用的 highlight-current-row 属性
- 为 vxe-table 添加 row-config 配置替代旧的高亮设置
- 更新 el-checkbox 的 true-value 属性值
- 修改 el-button 类型从 text 到 link 以匹配设计系统
2026-06-04 16:04:17 +08:00

401 lines
12 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.

<template>
<div
style="display: flex; justify-content: space-between"
class="app-container"
>
<el-card style="width: 30%">
<template #header>
<span style="vertical-align: middle">患者列表</span>
</template>
<div style="width: 100%">
<el-input
v-model="queryParams.patientName"
placeholder="请输入患者名"
clearable
style="width: 49%; margin-bottom: 10px; margin-right: 10px"
@keyup.enter="getPatientList"
>
<template #append>
<el-button
icon="Search"
@click="getPatientList"
/>
</template>
</el-input>
<el-select
v-model="queryParams.statusEnum"
style="width: 49%; margin-bottom: 10px"
placeholder="收费状态"
@change="getPatientList"
>
<el-option
v-for="item in chargeOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-date-picker
v-model="maxBillDate"
type="daterange"
range-separator="~"
start-placeholder="开始时间"
end-placeholder="结束时间"
placement="bottom"
:clearable="false"
value-format="YYYY-MM-DD"
style="width: 84%; margin-bottom: 10px; margin-right: 10px"
/>
<el-button
type="primary"
style="margin-bottom: 10px"
@click="getPatientList"
>
搜索
</el-button>
<vxe-table
ref="patientListRef"
height="630"
:data="patientList"
:row-config="{ keyField: 'encounterId', keyField: 'encounterId' }"
width=""
@cell-click="clickRow"
>
<vxe-column
title="病历号"
align="center"
field="encounterBusNo"
/>
<vxe-column
title="姓名"
align="center"
field="patientName"
/>
<!-- <vxe-column title="时间" align="center" field="startTime">
<template #default="scope">
{{ formatDate(scope.row.startTime) }}
</template>
</vxe-column> -->
<vxe-column
title="收费状态"
align="center"
field="statusEnum_enumText"
/>
</vxe-table>
</div>
</el-card>
<div style="width: 69%">
<el-card style="margin-bottom: 20px; height: 15%">
<template #header>
<span style="vertical-align: middle">基本信息</span>
</template>
<el-descriptions :column="4">
<el-descriptions-item label="就诊号:">
{{ patientInfo.encounterId }}
</el-descriptions-item>
<el-descriptions-item label="姓名:">
{{ patientInfo.patientName }}
</el-descriptions-item>
<el-descriptions-item label="性别:">
{{ patientInfo.genderEnum_enumText }}
</el-descriptions-item>
<el-descriptions-item label="年龄:">
{{ patientInfo.age }}
</el-descriptions-item>
<!-- <el-descriptions-item label="合同类型:">
{{ patientInfo.categoryEnum_enumText }}
</el-descriptions-item>
<el-descriptions-item label="结算时间:">
{{ patientInfo.billDate ? formatDate(patientInfo.billDate) : '' }}
</el-descriptions-item>
<el-descriptions-item label="账单总额:">
{{ patientInfo.totalAmount ? patientInfo.totalAmount.toFixed(2) + ' 元' : '' }}
</el-descriptions-item>
<el-descriptions-item label="医保支付:">
{{ patientInfo.insurancePrice }}
</el-descriptions-item>
<el-descriptions-item label="自费金额:">
{{ patientInfo.selfAmount ? patientInfo.selfAmount.toFixed(2) + ' 元' : '-' }}
</el-descriptions-item>
<el-descriptions-item label="支付方式:">
{{ patientInfo.typeCode_dictText }}
</el-descriptions-item>
<el-descriptions-item label="发票号:">
{{ patientInfo.idCard }}
</el-descriptions-item> -->
<!-- <el-descriptions-item label="手机号">{{ patientInfo.name }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ patientInfo.name }}</el-descriptions-item> -->
</el-descriptions>
</el-card>
<el-card style="height: 83%">
<template #header>
<span style="vertical-align: middle">退费单据</span>
</template>
<!-- <el-button type="primary" @click="handleRefund()" :disabled="buttonDisabled">
确认退费
</el-button> -->
<vxe-table
ref="chargeListRef"
v-loading="chargeLoading"
height="510"
:data="chargeList"
:span-method="spanMethod"
class="no-hover-table"
border
width=""
>
<!-- <vxe-column type="checkbox" :selectable="checkSelectable" width="55" /> -->
<vxe-column
title="操作"
align="center"
>
<template #default="scope">
<el-button
link
type="primary"
@click="handleRefund(scope.row)"
>
退费
</el-button>
</template>
</vxe-column>
<vxe-column
field="paymentId"
title="支付单据号"
align="center"
/>
<vxe-column
title="项目单据号"
align="center"
field="busNo"
width="150"
/>
<vxe-column
title="项目名称"
align="center"
field="itemName"
/>
<vxe-column
title="收费状态"
align="center"
field="chargeStatus_enumText"
width="100"
/>
<vxe-column
title="数量"
align="center"
width="100"
>
<template #default="scope">
{{ scope.row.quantityValue + ' ' + scope.row.quantityUnit_dictText }}
</template>
</vxe-column>
<vxe-column
title="付款总额"
align="right"
field="totalPrice"
header-align="center"
width="100"
>
<template #default="scope">
{{ scope.row.totalPrice.toFixed(2) + ' 元' }}
</template>
</vxe-column>
<!-- <vxe-column title="处方号" align="center" field="prescriptionNo" /> -->
<vxe-column
title="收款人"
align="center"
field="entererName"
width="120"
/>
</vxe-table>
</el-card>
</div>
<RefundDialog
:open="openDialog"
:total-amount="totalAmount"
:patient-info="patientInfo"
:payment-id="paymentId"
:charge-item-ids="chargeItemIdList"
:details="details"
:medfee_paymtd_code="medfee_paymtd_code"
:fee-type="patientInfo.medfeePaymtdCode"
@close="handleClose"
/>
</div>
</template>
<script setup name="ClinicCharge">
import {getChargeItemIds, getList, getRefundList, getReturnDetail, init, validReturnDrug,} from './components/api';
import {formatDateStr} from '@/utils/index';
import RefundDialog from './components/refundDialog.vue';
const { proxy } = getCurrentInstance();
// 获取费用性质字典
const { medfee_paymtd_code } = proxy.useDict('medfee_paymtd_code');
const queryParams = ref({
pageNum: 1,
pageSize: 50,
statusEnum: 7,
});
const spanMap = ref({});
const patientList = ref([]);
const patientInfo = ref({});
const chargeList = ref([]);
const totalAmount = ref(0);
const chargeOption = ref([]);
const chargeLoading = ref(false);
const openDialog = ref(false);
const chargeItemIdList = ref([]);
const details = ref({});
const encounterId = ref('');
const paymentId = ref('');
const maxBillDate = ref([
formatDateStr(new Date(), 'YYYY-MM-DD'),
formatDateStr(new Date(), 'YYYY-MM-DD'),
]);
getPatientList();
initOptions();
/**
* 患者列表
*/
function getPatientList() {
if (maxBillDate.value.length > 0) {
queryParams.value.maxBillDateSTime = maxBillDate.value[0] + ' 00:00:00';
queryParams.value.maxBillDateETime = maxBillDate.value[1] + ' 23:59:59';
} else {
queryParams.value.maxBillDateSTime = undefined;
queryParams.value.maxBillDateETime = undefined;
}
getList(queryParams.value).then((res) => {
patientList.value = res.data.records;
});
}
function initOptions() {
init().then((res) => {
chargeOption.value = res.data.chargeItemStatusOptions;
});
}
// 生成合并行
const generateSpanMap = () => {
spanMap.value = {};
let currentId = null;
let startIndex = 0;
chargeList.value.forEach((row, index) => {
if (row.paymentId !== currentId) {
if (currentId !== null) {
spanMap.value[currentId] = {
start: startIndex,
count: index - startIndex,
};
}
currentId = row.paymentId;
startIndex = index;
}
});
// 处理最后一个分组
if (currentId !== null) {
spanMap.value[currentId] = {
start: startIndex,
count: chargeList.value.length - startIndex,
};
}
};
// 合并方法同时处理多选列和paymentId列
const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (columnIndex <= 1) {
// 合并前两列
const group = spanMap.value[row.paymentId];
if (!group) return;
if (rowIndex === group.start) {
return { rowspan: group.count, colspan: 1 };
} else {
return { rowspan: 0, colspan: 0 };
}
}
};
/**
* 点击患者列表行 获取处方列表
*/
function clickRow(row) {
patientInfo.value = row;
chargeLoading.value = true;
encounterId.value = row.encounterId;
getRefundList({
encounterId: row.encounterId,
billDateSTime: maxBillDate.value[0] + ' 00:00:00',
billDateETime: maxBillDate.value[1] + ' 23:59:59',
}).then((res) => {
chargeList.value = res.data;
spanMap.value = {};
chargeList.value.sort((a, b) => a.paymentId.localeCompare(b.paymentId));
console.log(chargeList.value);
generateSpanMap();
setTimeout(() => {
chargeLoading.value = false;
}, 100);
});
}
function handleRefund(row) {
// totalAmount.value = chargeList.value
// .filter((item) => {
// return item.paymentId === row.paymentId;
// })
// .reduce((accumulator, currentRow) => {
// return new Decimal(accumulator).add(new Decimal(currentRow.totalPrice || 0));
// }, 0);
getReturnDetail({ id: row.paymentId }).then((res) => {
if (res.data?.length > 0) {
totalAmount.value =
(res.data.find((item) => item.payEnum === 220000)?.amount ?? 0) -
(res.data.find((item) => item.payEnum === 220500)?.amount ?? 0);
}
details.value = res.data?.filter((item) => {
return item.amount > 0;
}) || [];
});
paymentId.value = row.paymentId;
patientInfo.value.patientId = row.patientId;
getChargeItemIds(row.encounterId).then((res) => {
chargeItemIdList.value = res.data;
validReturnDrug(row.chargeItemIds.split(',')).then((res) => {
if (res.code == 200) {
openDialog.value = true;
} else {
proxy.$modal.msgWarning(res.msg);
}
});
});
// refund(
// chargeList.value.map((item) => {
// item.id;
// })
// ).then((res) => {
// if (res.code == 200) {
// proxy.$modal.msgSuccess('操作成功');
// }
// getPatientList();
// });
}
function handleClose(value) {
openDialog.value = false;
if (value == 'success') {
proxy.$modal.msgSuccess('操作成功');
clickRow(patientInfo.value);
}
}
</script>
<style lang="scss" scoped>
:deep(.no-hover-table) .vxe-table--body tr:hover > td {
background: inherit !important;
}
</style>