Files
his/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/reconciliationDetails.vue
2025-09-03 15:54:55 +08:00

733 lines
22 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 class="app-container">
<el-row :gutter="10" class="mb8">
<el-form
:model="queryParams"
ref="queryRef"
:inline="true"
label-width="85px"
>
<el-form-item label="结算经办机构:" prop="setlOptins" label-width="110px">
<el-input
v-model="queryParams.setlOptins"
placeholder="请输入结算经办机构"
clearable
style="width: 150px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="结算日期:">
<el-date-picker
v-model="occurrenceTime"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 300px"
></el-date-picker>
</el-form-item>
<el-form-item label="清算类型:" prop="clrType">
<el-select
v-model="queryParams.clrType"
placeholder="请选择清算类型"
clearable
style="width: 150px"
>
<el-option
v-for="categoryCode in clrTypeOptions"
:key="categoryCode.value"
:label="categoryCode.label"
:value="categoryCode.value"
/>
</el-select>
</el-form-item>
<!-- <el-form-item label="医院:" prop="orgId" label-width="70px">
<el-input
v-model="queryParams.orgId"
placeholder="请输入医院id"
clearable
style="width: 150px"
@keyup.enter="handleQuery"
/>
</el-form-item> -->
<el-form-item label="文件查询号:" prop="fileQuryNo" label-width="100px">
<el-input
v-model="queryParams.fileQuryNo"
placeholder="请输入文件查询号"
clearable
style="width: 150px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<!-- <el-form-item label="本地文件路径:" prop="filePath" label-width="110px">
<el-input
v-model="queryParams.filePath"
placeholder="请输入本地文件路径"
clearable
style="width: 566px"
@keyup.enter="handleQuery"
/>
</el-form-item> -->
<el-form-item>
<el-upload
multiple
:action="uploadFileUrl"
:before-upload="handleBeforeUpload"
:file-list="fileList"
limit=1
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:show-file-list="false"
:headers="headers"
class="upload-file-uploader"
ref="fileUpload"
>
<el-button
type="primary"
plain
icon="Edit"
>上传文件</el-button
>
</el-upload>
<div class="el-upload__tip" v-if="showTip">
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
的文件
</div>
</el-form-item>
</el-form>
<!-- <el-row :gutter="10" class="mb8"> -->
<!-- <el-col :span="1.5"> -->
<!-- v-hasPermi="['system:user:import']" -->
<el-button
type="primary"
plain
icon="Edit"
@click="handleQuery"
>统计</el-button
>
<el-button
type="primary"
plain
icon="Edit"
@click="handleExport"
>生成txt文件</el-button
>
<!-- </el-col> -->
<!-- <el-col :span="1.5"> -->
<!-- v-hasPermi="['system:user:export']" -->
<el-button
type="primary"
plain
icon="Edit"
@click="handleReconciliation"
>开始明细对账</el-button
>
<el-button
type="primary"
plain
icon="Edit"
:disabled="ids.length == 0"
@click="handleApplyForLiquidation"
>申请清算</el-button
>
<!-- </el-col> -->
</el-row>
<div style="margin-bottom:5px">结算笔数{{counts}}其中 总费用{{totalPrice1?totalPrice1.toFixed(2):0}} 基金支付金额{{totalPrice2?totalPrice2.toFixed(2):0}} 账户支付金额{{totalPrice3?totalPrice3.toFixed(2):0}}现金支付金额{{totalPrice4?totalPrice4.toFixed(2):0}}</div>
<el-table
v-loading="loading"
:data="purchaseinventoryList"
@selection-change="handleSelectionChange"
@row-click="handleRowClick"
>
<el-table-column type="selection" width="50" align="center" />
<el-table-column
label="个人编码"
align="center"
key="psnNo"
prop="psnNo"
width="190"
:show-overflow-tooltip="true"
/>
<el-table-column
label="患者姓名"
align="center"
key="patientName"
prop="patientName"
width="100"
:show-overflow-tooltip="true"
/>
<el-table-column
label="就诊ID"
align="center"
key="mdtrtId"
prop="mdtrtId"
width="270"
:show-overflow-tooltip="true"
/>
<el-table-column
label="结算ID"
align="center"
key="setlId"
prop="setlId"
width="270"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column
label="姓名"
align="center"
key="locationName"
prop="locationName"
width="140"
:show-overflow-tooltip="true"
/>
<el-table-column
label="医保结算日期"
align="center"
key="productionDate"
prop="productionDate"
width="160"
:show-overflow-tooltip="true"
>
<template #default="scope">
<span>{{ parseTime(scope.row.productionDate) }}</span>
</template>
</el-table-column> -->
<el-table-column
label="总费用"
align="center"
key="medfeeSumamt"
prop="medfeeSumamt"
:show-overflow-tooltip="true"
/>
<el-table-column
label="基金支付金额"
align="center"
key="fundPaySumamt"
prop="fundPaySumamt"
:show-overflow-tooltip="true"
/>
<el-table-column
label="个人账户金额"
align="center"
key="acctPay"
prop="acctPay"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column
label="现金支付金额"
align="center"
key="unitCode_dictText"
prop="unitCode_dictText"
:show-overflow-tooltip="true"
/> -->
<!-- <el-table-column
label="共计支付金额"
align="center"
key="quantity"
prop="quantity"
:show-overflow-tooltip="true"
/> -->
<el-table-column
label="结算时间"
align="center"
key="setlTime"
prop="setlTime"
:show-overflow-tooltip="true"
>
<template #default="scope">
<span>{{ parseTime(scope.row.setlTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="是否退费"
align="center"
key="refdSetlFlag"
prop="refdSetlFlag"
:show-overflow-tooltip="true"
>
<template #default="scope">
<span>{{ scope.row.refdSetlFlag==1?'退费':'' }}</span>
</template>
</el-table-column>
<!-- <el-table-column
label="报销类型"
align="center"
key="minUnitCode_dictText"
prop="minUnitCode_dictText"
:show-overflow-tooltip="true"
/>
<el-table-column
label="身份证"
align="center"
key="minUnitCode_dictText"
prop="minUnitCode_dictText"
:show-overflow-tooltip="true"
/>
<el-table-column
label="收据编号"
align="center"
key="busNo"
prop="busNo"
:show-overflow-tooltip="true"
/> -->
</el-table>
<el-form :inline="true" label-width="90px" style="width: 100%; margin-top: 30px">
<el-form-item label="上传结果:" style="width: 100%">
<el-input
v-model="reconciliationDetail"
:autosize="{ minRows: 4, maxRows: 10 }"
type="textarea"
disabled
placeholder=""
/>
</el-form-item>
</el-form>
<!-- <pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/> -->
<!-- v-if="purchaseinventoryReturnList&&purchaseinventoryReturnList.length>0" -->
<!-- <el-table
v-if="purchaseinventoryList.length>0"
style="height:190px;margin-top:32px;"
v-loading="loadingReturn"
:data="purchaseinventoryReturnList"
@selection-change="handleSelectionChangeReturn"
>
<el-table-column type="selection" width="50" align="center" />
<el-table-column
label="人员ID"
align="center"
key="busNo"
prop="busNo"
width="140"
:show-overflow-tooltip="true"
/>
<el-table-column
label="就诊ID"
align="center"
key="medicineName"
prop="medicineName"
width="140"
:show-overflow-tooltip="true"
/>
<el-table-column
label="结算ID"
align="center"
key="locationName"
prop="locationName"
width="140"
:show-overflow-tooltip="true"
/>
<el-table-column
label="对账结果"
align="center"
key="locationName"
prop="locationName"
width="140"
:show-overflow-tooltip="true"
/>
<el-table-column
label="备注"
align="center"
key="locationName"
prop="locationName"
width="140"
:show-overflow-tooltip="true"
/>
<el-table-column
label="总费用"
align="center"
key="manufacturerText"
prop="manufacturerText"
width="180px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="医疗费总额"
align="center"
key="lotNumber"
prop="lotNumber"
width="120px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="基金支付总额"
align="center"
key="quantityUnit"
prop="quantityUnit"
width="140px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="个人账户支付总额"
align="center"
key="unitCode_dictText"
prop="unitCode_dictText"
:show-overflow-tooltip="true"
/>
<el-table-column
label="发送方报文ID"
align="center"
key="quantity"
prop="quantity"
:show-overflow-tooltip="true"
/>
<el-table-column
label="退费结算标志"
align="center"
key="minUnitCode_dictText"
prop="minUnitCode_dictText"
:show-overflow-tooltip="true"
/>
</el-table> -->
</div>
</template>
<script setup name="reconciliationDetails">
import {
reconcileDetailList,
reconcileDetailTxt,
reconcileGeneral,
getPharmacyCabinetList,
ybRequestFileUp,
applyFinancialClearing
} from "./statisticalManagent";
import { getToken } from "@/utils/auth";
import { formatDate } from '@/utils/index';
const { proxy } = getCurrentInstance();
const purchaseinventoryList = ref([]);
const loading = ref(false);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const reconciliationDetail = ref("")
const occurrenceTime = ref([formatDate(new Date()),formatDate(new Date())]);
const clrTypeOptions = ref([]);
const filePath = ref("")
const purchaseinventoryReturnList = ref([])
const loadingReturn = ref(false)
const selectedRow = ref([])
const counts = ref(0)
const totalPrice1 = ref(0)
const totalPrice2 = ref(0)
const totalPrice3 = ref(0)
const totalPrice4 = ref(0)
const fileSize = ref(10)
const uploadList = ref([]);
const baseUrl = import.meta.env.VITE_APP_BASE_API;
const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/yb-request/file-up"); // 上传文件服务器地址
const headers = ref({ Authorization: "Bearer " + getToken() });
const fileList = ref([]);
const fileType = ref(["zip","txt"]);
const data = reactive({
form: {},
queryParams: {
// pageNo: 1,
// pageSize: 10,
setlOptins: '229900',
filePath: undefined,
orgId:undefined,
clrType: undefined,
fileQuryNo: undefined,
stmtBegnDate:undefined,
stmtEndDate:undefined,
},
rules: {},
});
const { queryParams, form, rules } = toRefs(data);
watch(
() => purchaseinventoryList.value,
(newVlaue) => {
if(newVlaue&&newVlaue.length>0){
handleTotalAmount()
}
},
{ immediate: true }
)
function handleBeforeUpload(file) {
// 校检文件类型
if (fileType.value.length) {
const fileName = file.name.split('.');
const fileExt = fileName[fileName.length - 1];
const isTypeOk = fileType.value.indexOf(fileExt) >= 0;
if (!isTypeOk) {
proxy.$modal.msgError(`文件格式不正确, 请上传${fileType.value.join("/")}格式文件!`);
return false;
}
}
// 校检文件大小
if (fileSize.value) {
const isLt = file.size / 1024 / 1024 < fileSize.value;
if (!isLt) {
proxy.$modal.msgError(`上传文件大小不能超过10MB!`);
return false;
}
}
const formData = new FormData()
formData.append('file', file)
formData.append('filename', file.name)
ybRequestFileUp(formData).then((res) => {
if(res.code==200){
proxy.$modal.msgSuccess("上传成功")
}
})
// proxy.$modal.loading("正在上传文件,请稍候...");
number.value++;
return true;
}
// 文件个数超出
function handleExceed() {
proxy.$modal.msgError(`上传文件数量不能超过 1 个!`);
}
// 上传失败
function handleUploadError(err) {
proxy.$modal.msgError("上传文件失败");
}
// 上传成功回调
function handleUploadSuccess(res, file) {
if (res.code === 200) {
console.log(res,file,"file")
uploadList.value.push({ name: res.fileName, url: res.fileName });
uploadedSuccessfully();
} else {
number.value--;
proxy.$modal.closeLoading();
proxy.$modal.msgError(res.msg);
proxy.$refs.fileUpload.handleRemove(file);
uploadedSuccessfully();
}
}
// function submitFileForm() {
// proxy.$refs['fileUpload'].submit();
// }
// 上传结束处理
function uploadedSuccessfully() {
if (number.value > 0 && uploadList.value.length === number.value) {
fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value);
uploadList.value = [];
number.value = 0;
// proxy.$refs['fileUpload'].submit();
emit("update:modelValue", listToString(fileList.value));
proxy.$modal.closeLoading();
}
}
// 删除文件
function handleDelete(index) {
fileList.value.splice(index, 1);
emit("update:modelValue", listToString(fileList.value));
}
// 获取文件名称
function getFileName(name) {
// 如果是url那么取最后的名字 如果不是直接返回
if (name.lastIndexOf("/") > -1) {
return name.slice(name.lastIndexOf("/") + 1);
} else {
return name;
}
}
// 对象转成指定字符串分隔
function listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
if (list[i].url) {
strs += list[i].url + separator;
}
}
return strs != '' ? strs.substr(0, strs.length - 1) : '';
}
/**计算合计金额 */
function handleTotalAmount() {
counts.value = purchaseinventoryList.value.length
totalPrice1.value = purchaseinventoryList.value.reduce(
(accumulator, currentRow) => {
return (accumulator + (Number(currentRow.medfeeSumamt) || 0))
},
0
);
totalPrice2.value = purchaseinventoryList.value.reduce(
(accumulator, currentRow) => {
return (accumulator + (Number(currentRow.fundPaySumamt) || 0))
},
0
);
totalPrice3.value = purchaseinventoryList.value.reduce(
(accumulator, currentRow) => {
return (accumulator + (Number(currentRow.acctPay) || 0))
},
0
);
// 现金支付金额
// totalPrice4.value = purchaseinventoryList.value.reduce(
// (accumulator, currentRow) => {
// return (accumulator + (Number(currentRow.profitAmount) || 0))
// },
// 0
// );
}
function getPharmacyCabinetLists() {
clrTypeOptions.value = [
{ value: 11, label: '门诊' },
{ value: 21, label: '住院' },
];
}
function handleSelectionChangeReturn(selection) {
idsReturn.value = selection.map((item) => item.id);
singleReturn.value = selection.length != 1;
multipleReturn.value = !selection.length;
}
function getList() {
reconcileDetailList(queryParams.value).then((res) => {
// console.log(res,"res----------------")
// loading.value = false;
// purchaseinventoryList.value = [{psnNo:"123",mdtrtId:"121",setlId:"1213",medfeeSumamt:"122",fundPaySumamt:"12",acctPay:"4.72",insutype:"410",clrType: 11,contractNo:"229900"},{psnNo:"123",mdtrtId:"121",setlId:"1213",medfeeSumamt:"122",fundPaySumamt:"12",acctPay:"7.43",insutype:"410",clrType: 11,contractNo:"229900"},{psnNo:"123",mdtrtId:"121",setlId:"1213",medfeeSumamt:"122",fundPaySumamt:"12",acctPay:"1",insutype:"410",clrType: 11,contractNo:"229900"},{psnNo:"123",mdtrtId:"121",setlId:"1213",medfeeSumamt:"122",fundPaySumamt:"12",acctPay:"-1",insutype:"410",clrType: 11,contractNo:"229900"}]
purchaseinventoryList.value = res.data.record ? res.data.record : res.data;
total.value = res.data.total;
});
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.stmtBegnDate =
occurrenceTime.value && occurrenceTime.value.length == 2
? occurrenceTime.value[0] + " 00:00:00"
: "";
queryParams.value.stmtEndDate =
occurrenceTime.value && occurrenceTime.value.length == 2
? occurrenceTime.value[1] + " 23:59:59"
: "";
// queryParams.value.pageNo = 1;
getList();
}
/** 按钮操作 */
function handleReconciliation() {
// 调用接口返回值
if(selectedRow.value.length==0){
proxy.$message.error('请选择一行数据开始明细对账');
return
}
loading.value = true;
let queryParamsss = {
settlementIdList:ids.value,
filePath:queryParams.value.filePath?queryParams.value.filePath:"",
fileQuryNo:queryParams.value.fileQuryNo?queryParams.value.fileQuryNo:"",
setlOptins:queryParams.value.setlOptins?queryParams.value.setlOptins:"",
clrType:queryParams.value.clrType?queryParams.value.clrType:""
}
reconcileGeneral(queryParamsss).then((res) => {
console.log(res.data, 'res----------------');
loading.value = false;
});
}
function handleApplyForLiquidation () {
if (isAllSelected()) {
let params = {}
params.clrType = queryParams.value.clrType?queryParams.value.clrType:""
params.clrOptins = queryParams.value.setlOptins?queryParams.value.setlOptins:""
params.stmtBegnDate = occurrenceTime.value[0]
params.stmtEndDate = occurrenceTime.value[1]
params.settlementIdList = ids.value
applyFinancialClearing(params).then((res) => {
console.log(res.data,'res----------------');
loading.value = false;
});
} else {
proxy.$message.warning('当前未全选');
}
}
function isAllSelected() {
return selectedRow.value.length === purchaseinventoryList.value.length;
}
function handleExport(){
if(selectedRow.value.length==0){
proxy.$message.error('请选择一行数据进行生成txt文件');
return
}
loading.value = true;
reconcileDetailTxt({settlementIdList:ids.value}).then((res) => {
console.log(res.data,'res----------------');
let fileName = Date.now()+'.txt'; // 默认文件名
// 2. 创建Blob对象
const blob = new Blob([res], { type: 'application/octet-stream;charset=utf-8' });
// 3. 创建临时下载链接
const link = document.createElement('a');
const url = window.URL.createObjectURL(blob);
link.href = url;
link.download = fileName; // 设置下载文件名
// 4. 触发下载
document.body.appendChild(link);
link.click();
// 5. 清理资源
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
loading.value = false;
if(res.data){
queryParams.value.filePath = res.data.split("生成txt文件成功文件路径")?res.data.split("生成txt文件成功文件路径")[1]:""
}
});
}
/** 选择条数 */
function handleSelectionChange(selection) {
selectedRow.value = selection
console.log(selectedRow.value,"selectedRow.value")
ids.value = selection.map((item) => item.setlId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
//点击列表当前行
function handleRowClick(row) {
// editRowTK.value = row
console.log(row,"row")
// if(row.returnStatus==1){
// loadingReturn.value = true
// generatedReturnDetail(row.supplyBusNo).then((response) => {
// purchaseinventoryReturnList.value = response.data
// purchaseinventoryReturnList.value.map(k=>{
// // k.returnStatus_text = k.returnStatus==1?'已退库':''
// k.originalSupplyBusNo = k.originalSupplyBusNo?k.originalSupplyBusNo:row.supplyBusNo
// })
// })
// loadingReturn.value = false
// }
}
getList();
getPharmacyCabinetLists()
</script>
<style scoped>
.custom-tree-node {
display: flex;
align-items: center;
}
.title {
font-weight: bold;
font-size: large;
margin-bottom: 10px;
}
</style>