Files
his/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/indexccu.vue
zhangfei 9c3e603b94 Fix Bug #443: 手术计费:点击签发耗材时异常报错
当手术计费弹窗中点击"签发"耗材时,因耗材的locationId(发放库房)为空导致后端异常。
在DoctorStationAdviceAppServiceImpl.handDevice方法中,当locationId为null时,使用登录用户的科室ID作为默认值,
与NurseBillingAppService中的处理方式保持一致。
2026-05-08 09:14:18 +08:00

587 lines
18 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 class="app-container">
<el-form
:model="queryParams"
ref="queryRef"
:inline="true"
v-show="showSearch"
label-width="90px"
>
<el-form-item label="查询日期:">
<el-date-picker
v-model="queryTime"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 300px; margin-right: 20px"
@change="getValue"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="费用性质:">
<el-select
v-model="contractNo"
placeholder="费用性质"
clearable
@change="getValue"
style="width: 150px; margin-right: 30px"
>
<el-option
v-for="item in contractList"
:key="item.busNo"
:label="item.contractName"
:value="item.busNo"
/>
</el-select>
</el-form-item>
<el-form-item label="经办人:">
<el-select
v-model="entererId"
placeholder="经办人"
clearable
filterable
@change="
(value) => {
if (!value) {
curUserInfo = {};
}
getValue();
}
"
style="width: 150px; margin-right: 30px"
>
<el-option
v-for="item in userList"
:key="item.practitionerId"
:label="item.nickName"
:value="item.practitionerId"
@click="
() => {
curUserInfo = item;
}
"
/>
</el-select>
</el-form-item>
<el-button type="primary" plain icon="Search" @click="getValue">查询</el-button>
<el-button type="primary" plain icon="Printer" @click="print">打印</el-button>
</el-form>
<div v-loading="loading" style="width: 1300px">
<div style="text-align: center">
<h2>门诊收费日结单</h2>
</div>
<el-row
:gutter="5"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="4">
<span class="label">经办人姓名</span>
<span class="value"> {{ curUserInfo.nickName ? curUserInfo.nickName : '全部' }}</span>
</el-col>
<el-col :span="4">
<span class="label">科室</span>
<span class="value">{{ curUserInfo.orgId_dictText }}</span>
</el-col>
<el-col :span="5">
<span class="label">机构</span>
<span class="value">{{ userStore.hospitalName }}</span>
</el-col>
<el-col :span="7">
<span class="label">时间</span>
<span class="value"> {{ queryTime[0] + '~' + queryTime[1] }} </span>
</el-col>
</el-row>
<div class="divider"></div>
<el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col
v-for="(item, index) in fin_type_code"
:span="5"
:key="index"
style="margin-bottom: 15px"
>
<span class="label">{{ item.label + '' }}</span>
<span class="value">{{ formatValue(reportValue[item.value]) }}</span>
</el-col>
</el-row>
<div class="divider"></div>
<el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="5">
<span class="label">总收入</span>
<span class="value">{{ formatValue(reportValue.SUM) }}</span>
</el-col>
<!-- <el-col :span="5">
<span class="label">实际现金收入</span>
<span class="value">
{{
formatValue(
(reportValue['0000cash'] || 0) +
(reportValue['220100cash'] || 0) +
(reportValue['229900cash'] || 0)
)
}}
</span>
</el-col> -->
<!-- <el-col :span="5">
<span class="label">现金</span>
<span class="value">{{ formatValue(reportValue.rmbCashSum) }}</span>
</el-col> -->
<el-col :span="5">
<span class="label">微信</span>
<span class="value">{{ formatValue(reportValue.vxCashSum) }}</span>
</el-col>
<el-col :span="5">
<span class="label">支付宝</span>
<span class="value">{{ formatValue(reportValue.aliCashSum) }}</span>
</el-col>
<el-col :span="5">
<span class="label">网银</span>
<span class="value">{{ formatValue(reportValue.peisCnt) }}</span>
</el-col>
</el-row>
<!-- <el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="5">
<span class="label">统筹支付</span>
<span class="value">{{ formatValue(reportValue.tcSum) }}</span>
</el-col>
<el-col :span="5">
<span class="label">账户支付</span>
<span class="value">{{ formatValue(reportValue.zhSum) }}</span>
</el-col>
<el-col :span="5">
<span class="label">基金支付总额</span>
<span class="value">{{ formatValue(reportValue.fundSum) }}</span>
</el-col>
</el-row> -->
<el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="5">
<span class="label">自费现金总额</span>
<span class="value">{{ formatValue(reportValue['0000cash']) }}</span>
</el-col>
<!-- <el-col :span="5">
<span class="label">医保现金总额</span>
<span class="value">{{ formatValue(reportValue.ybCashSum) }}</span>
</el-col> -->
<el-col :span="5">
<span class="label">自费人次</span>
<span class="value">
{{ reportValue['0000reg'] ? reportValue['0000reg'] + ' 人' : '0 人' }}
</span>
</el-col>
<el-col :span="5">
<span class="label">省医保人次</span>
<span class="value">
{{ reportValue['229900reg'] ? reportValue['229900reg'] + '人' : '0 人' }}
</span>
</el-col>
<el-col :span="5">
<span class="label">市医保人次</span>
<span class="value">
{{ (reportValue['220100reg'] || 0) + (reportValue['220199reg'] || 0) + ' 人' }}
</span>
</el-col>
<!-- <el-col :span="5">
<span class="label">医保人次</span>
<span class="value">{{ reportValue.ybReg + ' 人' }}</span>
</el-col> -->
</el-row>
<el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="5">
<span class="label">省医保现金</span>
<span class="value">{{ formatValue(reportValue['229900cash']) }}</span>
</el-col>
<el-col :span="5">
<span class="label">省医保统筹</span>
<span class="value">{{ formatValue(reportValue['229900tcSum']) }}</span>
</el-col>
<el-col :span="5">
<span class="label">省医保账户</span>
<span class="value">{{ formatValue(reportValue['229900zhSum']) }}</span>
</el-col>
<el-col :span="5">
<span class="label">省医保基金</span>
<span class="value">{{ formatValue(reportValue['229900fundSum']) }}</span>
</el-col>
</el-row>
<el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="5">
<span class="label">市医保现金</span>
<span class="value">{{
formatValue((reportValue['220100cash'] || 0) + (reportValue['220199cash'] || 0))
}}</span>
</el-col>
<el-col :span="5">
<span class="label">市医保统筹</span>
<span class="value">{{
formatValue((reportValue['220100tcSum'] || 0) + (reportValue['220199tcSum'] || 0))
}}</span>
</el-col>
<el-col :span="5">
<span class="label">市医保账户</span>
<span class="value">{{
formatValue((reportValue['220100zhSum'] || 0) + (reportValue['220199zhSum'] || 0))
}}</span>
</el-col>
<el-col :span="5">
<span class="label">市医保基金</span>
<span class="value">{{
formatValue((reportValue['220100fundSum'] || 0) + (reportValue['220199fundSum'] || 0))
}}</span>
</el-col>
</el-row>
<el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="5">
<span class="label">省医保总额</span>
<span class="value">{{
formatValue((reportValue['229900fundSum'] || 0) + (reportValue['229900zhSum'] || 0))
}}</span>
</el-col>
<el-col :span="5">
<span class="label">市医保总额</span>
<span class="value">{{
formatValue((reportValue['220100fundSum'] || 0) + (reportValue['220100zhSum'] || 0))
}}</span>
</el-col>
</el-row>
<el-row
:gutter="10"
outpatientNo="mb8"
style="
margin: 20px 0;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 20px;
"
>
<el-col :span="5">
<span class="label">现金收入总额</span>
<span class="value">
{{
formatValue(
(reportValue['220100cash'] || 0) +
(reportValue['220199cash'] || 0) +
(reportValue['229900cash'] || 0) +
(reportValue['0000cash'] || 0)
)
}}
</span>
</el-col>
<el-col :span="5">
<span class="label">体检人次</span>
<span class="value">
{{ getPhysicalExaminationCount() }}
</span>
</el-col>
</el-row>
</div>
</div>
</template>
<script setup name="dayEnd">
import {getAllUser, getClincReport, getContractList} from './component/api';
import useUserStore from '@/store/modules/user';
import {formatDateStr} from '@/utils/index';
import Decimal from 'decimal.js';
import {hiprint} from 'vue-plugin-hiprint';
import templateJson from './component/template.json';
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
const purchaseinventoryList = ref([]);
const userList = ref([]);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const entererId = ref(undefined);
const contractList = ref(undefined);
const reportValue = ref({});
const curUserInfo = ref({});
const { fin_type_code } = proxy.useDict('fin_type_code');
const queryTime = ref([
formatDateStr(new Date(), 'YYYY-MM-DD'),
formatDateStr(new Date(), 'YYYY-MM-DD'),
]);
const contractNo = ref('0000');
const data = reactive({
queryParams: {
form: {},
pageNo: 1,
pageSize: 10,
searchKey: undefined,
purposeLocationId: undefined,
sourceLocationId: undefined,
supplierId: undefined,
approvalTimeSTime: undefined,
approvalTimeETime: undefined,
},
rules: {},
});
const { queryParams } = toRefs(data);
getValue();
function getValue() {
console.log(fin_type_code.value);
loading.value = true;
getClincReport({
contractNo: contractNo.value,
startTime: queryTime.value[0] + ' 00:00:00',
endTime: queryTime.value[1] + ' 23:59:59',
entererId: entererId.value,
}).then((res) => {
loading.value = false;
reportValue.value = res.data;
let list = processObjectWithFinType(reportValue.value);
console.log(list);
});
}
getContract();
function getContract() {
getContractList().then((response) => {
contractList.value = response.data;
});
getAllUser({ pageSize: 100 }).then((res) => {
userList.value = res.data.records.filter((item) => item.userName != 'admin');
});
}
function getPhysicalExaminationCount() {
if (reportValue.value['9999']) {
return reportValue.value['9999'] / 105 + ' 人';
} else {
return '0 人';
}
}
function processObjectWithFinType(obj) {
return Object.keys(obj).map((key) => {
const matchedItem = fin_type_code.value.find((item) => item.value === key);
if (matchedItem) {
return {
label: matchedItem ? matchedItem.label : key,
value: obj[key],
};
}
});
}
/** 打印门诊日结 */
async function print() {
// const selectedRows = proxy.$refs['tableRef'].getSelectionRows();
console.log(reportValue.value, '==reportValue.value==');
// 计算市医保相关字段
const municipalYbReg =
(reportValue.value['220100reg'] || 0) + (reportValue.value['220199reg'] || 0);
const municipalYbCash =
(reportValue.value['220100cash'] || 0) + (reportValue.value['220199cash'] || 0);
const municipalYbTcSum =
(reportValue.value['220100tcSum'] || 0) + (reportValue.value['220199tcSum'] || 0);
const municipalYbZhSum =
(reportValue.value['220100zhSum'] || 0) + (reportValue.value['220199zhSum'] || 0);
const municipalYbFundSum =
(reportValue.value['220100fundSum'] || 0) + (reportValue.value['220199fundSum'] || 0);
const municipalYbTotal = municipalYbZhSum + municipalYbFundSum;
const totalCash =
municipalYbCash + (reportValue.value['229900cash'] || 0) + (reportValue.value['0000cash'] || 0);
const result = {
data: [
{
...reportValue.value, // 将 reportValue.value 中的所有属性展开到 result 中
nickName: userStore.nickName,
orgName: userStore.orgName,
fixmedinsName: userStore.hospitalName,
createTime: formatDateStr(new Date(), 'YYYY-MM-DD HH:mm:ss'),
scheduler: userStore.nickName,
timeRange: queryTime.value[0] + '~' + queryTime.value[1],
// 计算字段
zfAmount: new Decimal(reportValue.value.zhSum || 0).add(reportValue.value.fundSum || 0),
feeAmount: new Decimal(reportValue.value.DIAGNOSTIC_FEE || 0)
.add(reportValue.value.CHECK_FEE || 0)
.add(reportValue.value.DIAGNOSTIC_TEST_FEE || 0)
.add(reportValue.value.MEDICAL_EXPENSE_FEE || 0)
.add(reportValue.value.WEST_MEDICINE || 0)
.add(reportValue.value.CHINESE_MEDICINE_SLICES_FEE || 0)
.add(reportValue.value.CHINESE_MEDICINE_FEE || 0)
.add(reportValue.value.GENERAL_CONSULTATION_FEE || 0)
.add(reportValue.value.REGISTRATION_FEE || 0)
.add(reportValue.value.OTHER_FEE || 0)
.add(reportValue.value.SANITARY_MATERIALS_FEE || 0),
// 省医保相关
provinceYbTotal:
(reportValue.value['229900fundSum'] || 0) + (reportValue.value['229900zhSum'] || 0),
// 市医保相关220100和220199
municipalYbReg,
municipalYbCash,
municipalYbTcSum,
municipalYbZhSum,
municipalYbFundSum,
municipalYbTotal,
// 现金收入总额
totalCash,
// 体检人次
physicalExaminationCount: getPhysicalExaminationCount(),
},
],
};
console.log(result, '==result.data==');
const printElements = JSON.parse(
JSON.stringify(templateJson).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
const printerList = hiprintTemplate.getPrinterList();
console.log(hiprintTemplate, '打印机列表');
hiprintTemplate.print2(result.data[0], {
title: '打印标题',
});
// 将对象转换为 JSON 字符串
// let jsonString = JSON.stringify(result, null, 2);
// console.log(jsonString, 'jsonstring');
// await CefSharp.BindObjectAsync('boundAsync');
// await boundAsync
// .printReport(getPrintFileName(contractNo.value), jsonString)
// .then((response) => {
// //返回结果是jsonString可判断其调用是否成功
// console.log(response, 'response');
// var res = JSON.parse(response);
// if (!res.IsSuccess) {
// proxy.$modal.msgError('调用打印插件失败:' + res.ErrorMessage);
// }
// })
// .catch((error) => {
// proxy.$modal.msgError('调用打印插件失败:' + error);
// });
}
function getPrintFileName(value) {
switch (value) {
case '0000':
return '门诊日结单(按登录角色查询)自费.grf';
case '229900': // 省医保
return '门诊日结单(按登录角色查询)省医保.grf';
case '220100': // 市医保
return '门诊日结单(按登录角色查询)市医保.grf';
}
}
function formatValue(value) {
return value == null || value == undefined || value == NaN ? '0.00 元' : value.toFixed(2) + ' 元';
}
</script>
<style scoped>
.custom-tree-node {
display: flex;
align-items: center;
}
.title {
font-weight: bold;
font-size: large;
margin-bottom: 10px;
}
.label {
display: inline-block;
width: 120px !important;
}
.value {
float: right;
}
.el-col {
margin-right: 50px;
}
.divider {
height: 3px;
background-color: #000;
margin: 20px 0;
}
</style>