1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102 |
- <template>
- <el-container>
- <el-header style="height: 35px; margin-top: 5px; padding: 0 5px">
- <el-date-picker v-model="dateRange" type="monthrange" range-separator="至" start-placeholder="开始月份"
- end-placeholder="结束月份" style="width: 220px">
- </el-date-picker>
- <el-cascader v-model="setlCondition.dataInfo" :options="setlCondition.options" :props="{ expandTrigger: 'hover' }"
- @change="handleChange" :clearable="true" :filterable="true" placeholder="请选择险种">
- </el-cascader>
- <el-divider direction="vertical"></el-divider>
- <el-button icon="Search" type="success" @click="fetchSetlinfos">查询</el-button>
- <el-button icon="Download" type="primary" @click="exportSetlinfoExcel">导出Excel</el-button>
- <el-button type="primary" @click="selectChart">分析图</el-button>
- </el-header>
- <el-main>
- <el-tabs type="border-card" v-model="setlCondition.selectType" @tab-click="handleClick">
- <el-tab-pane label="数据" name="first">
- <el-table :data="setlinfos" :height="tableHeight" border highlight-current-row row-key="childKey" show-summary
- :summary-method="getSummaries1" stripe @row-dblclick="fetchSetldetails">
- <el-table-column label="险种类型" prop="insurName" fixed header-align="center"></el-table-column>
- <el-table-column label="住院人次" prop="psnCount" align="center" header-align="center"></el-table-column>
- <el-table-column label="住院天数" prop="inDays" align="center" header-align="center"></el-table-column>
- <el-table-column label="平均住院日" prop="avgInDays" align="right" header-align="center"></el-table-column>
- <el-table-column label="总费用" prop="totalFee" align="right" header-align="center"></el-table-column>
- <el-table-column label="药品费用" prop="drugFee" align="right" header-align="center"></el-table-column>
- <el-table-column label="药品占比(%)" prop="drugFeeRatio" align="right" header-align="center"></el-table-column>
- <el-table-column label="耗材费用" prop="matFee" align="right" header-align="center"></el-table-column>
- <el-table-column label="耗材占比(%)" prop="matFeeRatio" align="right" header-align="center"></el-table-column>
- <el-table-column label="基本医疗统筹金额" prop="fundPooling" align="right" header-align="center"></el-table-column>
- <el-table-column label="大病基金" prop="bigIllFundPooling" align="right" header-align="center">
- </el-table-column>
- <el-table-column label="公务员基金支付" prop="civilServiceFund" align="right" header-align="center">
- </el-table-column>
- <el-table-column label="其他基金" prop="otherFunds" align="right" header-align="center"></el-table-column>
- <el-table-column label="全部基金" prop="allFunds" align="right" header-align="center"></el-table-column>
- </el-table>
- <el-dialog v-model="showSetldetails" :close-on-click-modal="false" :close-on-press-escape="false"
- :title="filterDialogTitle" width="70%">
- <div style="width: 130px; height: 36px; position: absolute; top: 16px; right: 60px">
- <el-button icon="Download" type="primary" @click="exportYbDetailExcel">导出Excel</el-button>
- </div>
- <el-table :data="setldetails.slice(pageSize * (currentPage - 1), pageSize * currentPage)" height="560"
- highlight-current-row stripe @row-dblclick="openSetlinfoComponent">
- <el-table-column fixed label="序号" type="index" width="40"></el-table-column>
- <el-table-column fixed label="姓名" prop="psnName" width="60"></el-table-column>
- <el-table-column label="住院号" prop="patNo" width="70"></el-table-column>
- <el-table-column label="次数" prop="times" width="40"></el-table-column>
- <el-table-column label="性别" prop="gendName" width="50"></el-table-column>
- <el-table-column label="出生日期" prop="brdy"></el-table-column>
- <el-table-column label="身份证" prop="certno"></el-table-column>
- <el-table-column label="参保地区" prop="insuplcAdmdvsName"></el-table-column>
- <el-table-column label="险种类型" prop="insutypeName"></el-table-column>
- <el-table-column label="人员类别" prop="psnTypeName"></el-table-column>
- <el-table-column label="就诊ID" prop="mdtrtId"></el-table-column>
- <el-table-column label="结算ID" prop="setlId"></el-table-column>
- <el-table-column label="入院时间" prop="begntime"></el-table-column>
- <el-table-column label="出院时间" prop="endtime"></el-table-column>
- <el-table-column label="结算时间" prop="setlTime"></el-table-column>
- <el-table-column label="医疗类别" prop="medTypeName"></el-table-column>
- <el-table-column label="总费用" prop="medfeeSumamt"></el-table-column>
- <el-table-column label="报销金额" prop="fundPaySumamt"></el-table-column>
- <el-table-column label="医疗救助" prop="mafPay"></el-table-column>
- <el-table-column label="个人账户支出" prop="acctPay"></el-table-column>
- <el-table-column label="个人现金支出" prop="psnCashPay"></el-table-column>
- <el-table-column label="大病支出" prop="hifmiPay"></el-table-column>
- <el-table-column label="西药费" prop="chargeWesternMedicine"></el-table-column>
- <el-table-column label="中成药费" prop="chargePatentMedicine"></el-table-column>
- <el-table-column label="中药饮片费" prop="chargeHerbal"></el-table-column>
- <el-table-column label="耗材费" prop="chargeSanitaryMaterial"></el-table-column>
- </el-table>
- <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[15, 30, 45, 60]"
- :total="setldetails.length" layout="total, sizes, prev, pager, next, jumper" style="margin-top: 5px"
- @size-change="handleSizeChange" @current-change="handleCurrentChange"></el-pagination>
- </el-dialog>
- <el-dialog v-model="showSetlinfoComponent" :close-on-click-modal="false" title="结算信息" width="70%">
- <Setlinfo :setlinfo="currentSetldetail" />
- </el-dialog>
- </el-tab-pane>
- <el-tab-pane label="同比" name="second">
- <el-table :data="setlinfos" :height="tableHeight" border highlight-current-row row-key="childKey" show-summary
- :summary-method="getSummaries1">
- <el-table-column label="月份" prop="month" fixed align="center" header-align="center"></el-table-column>
- <el-table-column label="总费用" prop="zfy" header-align="center">
- <el-table-column label="今年" prop="zfy_jn" align="right" header-align="center"></el-table-column>
- <el-table-column label="去年" prop="zfy_qn" align="right" header-align="center"></el-table-column>
- <el-table-column label="同比" prop="zfy_tb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- <el-table-column label="全部基金" prop="zjj" header-align="center">
- <el-table-column label="今年" prop="zjj_jn" align="right" header-align="center"></el-table-column>
- <el-table-column label="去年" prop="zjj_qn" align="right" header-align="center"></el-table-column>
- <el-table-column label="同比" prop="zjj_tb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- <el-table-column label="药品费用" prop="ypf" header-align="center">
- <el-table-column label="今年" prop="ypf_jn" align="right" header-align="center"></el-table-column>
- <el-table-column label="去年" prop="ypf_qn" align="right" header-align="center"></el-table-column>
- <el-table-column label="同比" prop="ypf_tb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- <el-table-column label="耗材费用" prop="clf" header-align="center">
- <el-table-column label="今年" prop="clf_jn" align="right" header-align="center"></el-table-column>
- <el-table-column label="去年" prop="clf_qn" align="right" header-align="center"></el-table-column>
- <el-table-column label="同比" prop="clf_tb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- <el-tab-pane label="环比" name="third">
- <el-table :data="setlinfos" :height="tableHeight" border highlight-current-row row-key="childKey" show-summary
- :summary-method="getSummaries1">
- <el-table-column label="月份" prop="month" align="center" fixed header-align="center"></el-table-column>
- <el-table-column label="总费用" prop="zfys" header-align="center">
- <el-table-column label="费用" prop="zfy" align="right" header-align="center"></el-table-column>
- <el-table-column label="环比" prop="zfy_hb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- <el-table-column label="全部基金" prop="zjjs" header-align="center">
- <el-table-column label="费用" prop="zjj" align="right" header-align="center"></el-table-column>
- <el-table-column label="环比" prop="zjj_hb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- <el-table-column label="药品费用" prop="ypfs" header-align="center">
- <el-table-column label="费用" prop="ypf" align="right" header-align="center"></el-table-column>
- <el-table-column label="环比" prop="ypf_hb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- <el-table-column label="耗材费用" prop="clfs" header-align="center">
- <el-table-column label="费用" prop="clf" align="right" header-align="center"></el-table-column>
- <el-table-column label="环比" prop="clf_hb" align="right" header-align="center"></el-table-column>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- </el-tabs>
- </el-main>
- <el-drawer :title="titleChart" v-model="qxtDrawer" size="80%">
- <!-- <div style="width: 100%; height: 90%" id="ybChart"></div> -->
- <el-main>
- <el-row :gutter="10">
- <el-col :span="6">
- <div style="width: 100%; height: 400px" id="zfyDst"></div>
- </el-col>
- <el-col :span="6">
- <div style="width: 100%; height: 400px" id="zjjDst"></div>
- </el-col>
- <el-col :span="6">
- <div style="width: 100%; height: 400px" id="ypfDst"></div>
- </el-col>
- <el-col :span="6">
- <div style="width: 100%; height: 400px" id="clfDst"></div>
- </el-col>
- </el-row>
- <el-row :gutter="10">
- <!-- <el-form-item label="汇总项">
- <el-select v-model="pieChartData.selectPie" class="m-2" placeholder="请选择">
- <el-option label="住院人次" value="1"></el-option>
- <el-option label="住院天数" value="2"></el-option>
- <el-option label="总费用" value="3"></el-option>
- </el-select>
- </el-form-item> -->
- <el-col :span="8">
- <div style="width: 100%; height: 400px" id="rcpie"></div>
- </el-col>
- <el-col :span="8">
- <div style="width: 100%; height: 400px" id="zytsPie"></div>
- </el-col>
- <el-col :span="8">
- <div style="width: 100%; height: 400px" id="zfyPie"></div>
- </el-col>
- </el-row>
- </el-main>
- </el-drawer>
- </el-container>
- </template>
- <script>
- import { computed, onMounted, reactive, ref, watch } from 'vue'
- import { useStore } from 'vuex'
- import store from '@/store'
- import { getDateRangeFormatDate, formatDatetime } from '@/utils/date'
- import {
- selectYbStatInfo, selectYbStatRatio, selectYbChart, selectYbStatDetail, querySettlementInfo
- } from '@/api/medical-insurance/si-ybkf'
- import { clone } from '@/utils/clone'
- import { Export } from '@/utils/ExportExcel'
- import { ElMessage, ElMessageBox } from 'element-plus'
- import { downloadExcel } from '@/utils/excel'
- import { pieUtilsOne, barUtilsTwo } from '@/utils/echarts-utils'
- import Setlinfo from '../../../components/medical-insurance/setlinfo/Index.vue'
- export default {
- components: {
- Setlinfo,
- },
- setup() {
- const storeU = useStore()
- const windowSize = storeU.state.app.windowSize
- const tableHeight = windowSize.h - 120
- const dateRange = ref([])
- const dateS = getDateRangeFormatDate(dateRange.value)
- const setlinfos = ref([])
- const qxtDrawer = ref(false)
- const titleChart = ref('图形')
- const chartData = ref([])
- const pieChartData = reactive({
- selectPie: '1'
- })
- const setldetails = ref([])
- const showSetldetails = ref(false)
- const setlCondition = reactive({
- startTime: dateS.startTime,
- endTime: dateS.endTime,
- setlType: '21',
- selectType: 'first',
- insurType: null,
- dataInfo: null,
- options: initInsurOptions(),
- })
- const fetchSetldetails = (row) => {
- let selectInfo = clone(setlCondition)
- selectInfo.insurType = row.insurType
- selectYbStatDetail(selectInfo)
- .then((res) => {
- setldetails.value = res
- showSetldetails.value = true
- })
- .catch(() => {
- setldetails.value = []
- })
- }
- const filterDialogTitle = computed(() => {
- let yearL = setlCondition.startTime.substr(0, 4)
- const setlTypeName = filterSetlTypeName()
- return yearL + setlTypeName + '结算明细'
- })
- const showSetlinfoComponent = ref(false)
- const currentSetldetail = ref({})
- const openSetlinfoComponent = (row) => {
- const param = {
- psnNo: row.psnNo,
- mdtrtId: row.mdtrtId,
- }
- querySettlementInfo(param).then((res) => {
- currentSetldetail.value = res
- showSetlinfoComponent.value = true
- })
- }
- const fetchSetlinfos = () => {
- if (!dateRange.value) {
- ElMessage({
- message: '请选择时间范围!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- if (!setlCondition.dataInfo) {
- ElMessage({
- message: '请选择险种!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- setlCondition.setlType = setlCondition.dataInfo[0]
- setlCondition.insurType = setlCondition.dataInfo[1]
- setlCondition.startTime = formatDatetime(dateRange.value[0])
- setlCondition.endTime = formatDatetime(dateRange.value[1])
- let yearL = setlCondition.startTime.substr(0, 4)
- let yearR = setlCondition.endTime.substr(0, 4)
- if (yearL != yearR) {
- ElMessage({
- message: '请选择同一年份!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- if (setlCondition.selectType === "first") {
- selectYbStatInfo(setlCondition)
- .then((res) => {
- setlinfos.value = res
- })
- .catch(() => {
- setlinfos.value = []
- })
- } else {
- selectYbStatRatio(setlCondition)
- .then((res) => {
- setlinfos.value = res
- })
- .catch(() => {
- setlinfos.value = []
- })
- }
- }
- const exportYbDetailExcel = () => {
- if (setldetails.value.length === 0) {
- ElMessage({
- message: '没有可以导出的数据!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- } else {
- const title = {
- patNo: '住院号',
- times: '住院次数',
- psnName: '姓名',
- gendName: '性别',
- brdy: '出生日期',
- certno: '身份证',
- insuplcAdmdvsName: '参保地名称',
- insutypeName: '险种类型',
- medTypeName: '医疗类别',
- psnTypeName: '人员类别',
- mdtrtId: '就诊ID',
- setlId: '结算ID',
- begntime: '入院时间',
- endtime: '出院时间',
- setlTime: '结算时间',
- medfeeSumamt: '总费用',
- fundPaySumamt: '报销金额',
- mafPay: '医疗救助',
- acctPay: '个人账户支出',
- psnCashPay: '个人现金支出',
- hifmiPay: '大病支出',
- medfeeSumamt: '西药费',
- medfeeSumamt: '中成药费',
- medfeeSumamt: '中药饮片费',
- medfeeSumamt: '总耗材费费用',
- }
- Export(setldetails.value, title, filterDialogTitle.value)
- }
- }
- const handleChange = (value) => {
- }
- const pageSize = ref(30)
- const currentPage = ref(1)
- const handleSizeChange = (val) => {
- pageSize.value = val
- }
- const handleCurrentChange = (val) => {
- currentPage.value = val
- }
- const selectChart = async () => {
- if (!dateRange.value) {
- ElMessage({
- message: '请选择时间范围!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- if (!setlCondition.dataInfo) {
- ElMessage({
- message: '请选择险种!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- setlCondition.setlType = setlCondition.dataInfo[0]
- setlCondition.insurType = setlCondition.dataInfo[1]
- setlCondition.startTime = formatDatetime(dateRange.value[0])
- setlCondition.endTime = formatDatetime(dateRange.value[1])
- let yearL = setlCondition.startTime.substr(0, 4)
- let yearR = setlCondition.endTime.substr(0, 4)
- if (yearL != yearR) {
- ElMessage({
- message: '请选择同一年份!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- qxtDrawer.value = true
- titleChart.value = yearL + '年医保收入分析图'
- let data = []
- data = await selectYbChart(setlCondition)
- let setlCondition1 = clone(setlCondition)
- setlCondition1.selectType = 'first'
- data = data.concat(await selectYbStatInfo(setlCondition1))
- chartData.value = data
- }
- watch(chartData, (orlData, newData) => {
- let nameText
- let barTitles = ['总费用', '全部基金', '药品费', '耗材费']
- if (setlCondition.setlType === '21') {
- nameText = '住院'
- } else {
- nameText = '门诊'
- }
- nameText = titleChart.value + '(' + nameText + ')-'
- let yAxisName = '单位:百万元'
- let tipUnit = '元'
- let echartsXdata = []
- let zfy = []
- let zjj = []
- let ypf = []
- let clf = []
- let pieRc = []
- let pieZyts = []
- let pieZfy = []
- chartData.value.forEach((item) => {
- if (item.month) {
- zfy.push(item.zfy_jn)
- zjj.push(item.zjj_jn)
- if (item.ypf_jn > 0.00) {
- ypf.push(item.ypf_jn)
- }
- if (item.clf_jn > 0.00) {
- clf.push(item.clf_jn)
- }
- echartsXdata.push(item.month)
- } else {
- let dataRc = {}
- let dataZyts = {}
- let dataZfy = {}
- dataRc.value = item.psnCount
- dataRc.name = item.insurName
- dataRc.unit = '人'
- pieRc.push(dataRc)
- dataZyts.value = item.inDays
- dataZyts.name = item.insurName
- dataZyts.unit = '天'
- pieZyts.push(dataZyts)
- dataZfy.value = item.totalFee
- dataZfy.name = item.insurName
- dataZfy.unit = '元'
- pieZfy.push(dataZfy)
- }
- })
- barUtilsTwo(zfyDst, nameText + barTitles[0], echartsXdata, zfy, barTitles[0], yAxisName, tipUnit)
- barUtilsTwo(zjjDst, nameText + barTitles[1], echartsXdata, zjj, barTitles[1], yAxisName, tipUnit)
- barUtilsTwo(ypfDst, nameText + barTitles[2], echartsXdata, ypf, barTitles[2], yAxisName, tipUnit)
- barUtilsTwo(clfDst, nameText + barTitles[3], echartsXdata, clf, barTitles[3], yAxisName, tipUnit)
- pieUtilsOne(rcpie, '住院人次', pieRc)
- pieUtilsOne(zytsPie, '住院天数', pieZyts)
- pieUtilsOne(zfyPie, '总费用', pieZfy)
- })
- const handleClick = (tab, event) => {
- if (!dateRange.value) {
- ElMessage({
- message: '请选择时间范围!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- if (!setlCondition.dataInfo) {
- ElMessage({
- message: '请选择险种!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- return
- }
- setlCondition.setlType = setlCondition.dataInfo[0]
- setlCondition.insurType = setlCondition.dataInfo[1]
- setlCondition.startTime = formatDatetime(dateRange.value[0])
- setlCondition.endTime = formatDatetime(dateRange.value[1])
- // 查询哪个tab页面
- setlCondition.selectType = tab.props.name
- if (setlCondition.selectType === "first") {
- selectYbStatInfo(setlCondition)
- .then((res) => {
- setlinfos.value = res
- })
- .catch(() => {
- setlinfos.value = []
- })
- } else {
- selectYbStatRatio(setlCondition)
- .then((res) => {
- setlinfos.value = res
- })
- .catch(() => {
- setlinfos.value = []
- })
- }
- }
- const getSummaries = () => {
- if (setlCondition.selectType === 'first') {
- let sums1 = {
- psnCount: 0,
- inDays: 0,
- avgInDays: 0,
- totalFee: 0,
- drugFee: 0,
- drugFeeRatio: 0,
- matFee: 0,
- matFeeRatio: 0,
- fundPooling: 0,
- bigIllFundPooling: 0,
- civilServiceFund: 0,
- otherFunds: 0,
- allFunds: 0,
- }
- setlinfos.value.forEach((itm) => {
- for (let k in sums1) {
- sums1[k] = Number(sums1[k]) + Number(itm[k])
- }
- })
- sums1.insurName = '合计'
- sums1.avgInDays = (sums1.inDays / sums1.psnCount).toFixed(2)
- sums1.drugFeeRatio = (sums1.drugFee / sums1.totalFee * 100).toFixed(2)
- sums1.matFeeRatio = (sums1.matFee / sums1.totalFee * 100).toFixed(2)
- return sums1
- } else if (setlCondition.selectType === 'second') {
- let sums2 = {
- zfy_jn: 0,
- zfy_qn: 0,
- zfy_tb: 0,
- zjj_jn: 0,
- zjj_qn: 0,
- zjj_tb: 0,
- ypf_jn: 0,
- ypf_qn: 0,
- ypf_tb: 0,
- clf_jn: 0,
- clf_qn: 0,
- clf_tb: 0,
- }
- setlinfos.value.forEach((itm) => {
- for (let k in sums2) {
- sums2[k] = Number(sums2[k]) + Number(itm[k])
- }
- })
- sums2.month = '合计'
- sums2.zfy_tb = ((sums2.zfy_jn - sums2.zfy_qn) / sums2.zfy_qn * 100).toFixed(2) + '%'
- sums2.zjj_tb = ((sums2.zjj_jn - sums2.zjj_qn) / sums2.zjj_qn * 100).toFixed(2) + '%'
- sums2.ypf_tb = ((sums2.ypf_jn - sums2.ypf_qn) / sums2.ypf_qn * 100).toFixed(2) + '%'
- sums2.clf_tb = ((sums2.clf_jn - sums2.clf_qn) / sums2.clf_qn * 100).toFixed(2) + '%'
- return sums2
- } else {
- let sums3 = {
- zfy: 0,
- zfy_hb: 0,
- zjj: 0,
- zjj_hb: 0,
- ypf: 0,
- ypf_hb: 0,
- clf: 0,
- clf_hb: 0,
- }
- setlinfos.value.forEach((itm) => {
- for (let k in sums3) {
- sums3[k] = Number(sums3[k]) + Number(itm[k])
- }
- })
- sums3.month = '合计'
- sums3.zfy_hb = ''
- sums3.zjj_hb = ''
- sums3.ypf_hb = ''
- sums3.clf_hb = ''
- return sums3
- }
- }
- const getSummaries1 = (param) => {
- const { columns, data } = param
- const sums = []
- // 住院人次下标
- let psnCountIndex = 0
- // 住院天数下标
- let inDaysIndex = 0
- // 总费用下标
- let zfyIndex = 0
- // 药品费下标
- let ypfIndex = 0
- // 材料费下标
- let clfIndex = 0
- // 今年总费用下标
- let jn_zfy = 0
- // 去年总费用下标
- let qn_zfy = 0
- // 今年总基金下标
- let jn_zjj = 0
- // 去年总基金下标
- let qn_zjj = 0
- // 今年药品费下标
- let jn_ypf = 0
- // 去年药品费下标
- let qn_ypf = 0
- // 今年耗材费下标
- let jn_clf = 0
- // 去年耗材费下标
- let qn_clf = 0
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = '合计'
- return
- }
- if (column.property === 'psnCount') {
- psnCountIndex = index
- }
- if (column.property === 'inDays') {
- inDaysIndex = index
- }
- if (column.property === 'totalFee') {
- zfyIndex = index
- }
- if (column.property === 'drugFee') {
- ypfIndex = index
- }
- if (column.property === 'matFee') {
- clfIndex = index
- }
- if (column.property === 'jn_zfy') {
- jn_zfy = index
- }
- if (column.property === 'qn_zfy') {
- qn_zfy = index
- }
- if (column.property === 'jn_zjj') {
- jn_zjj = index
- }
- if (column.property === 'qn_zjj') {
- qn_zjj = index
- }
- if (column.property === 'jn_ypf') {
- jn_ypf = index
- }
- if (column.property === 'qn_ypf') {
- qn_ypf = index
- }
- if (column.property === 'jn_clf') {
- jn_clf = index
- }
- if (column.property === 'qn_clf') {
- qn_clf = index
- }
- const values = data.map(item => Number(item[column.property]))
- if (column.property === 'avgInDays') {
- sums[index] = (sums[inDaysIndex] / sums[psnCountIndex]).toFixed(2)
- } else if (column.property === 'drugFeeRatio') {
- if (sums[zfyIndex] > 0) {
- sums[index] = (sums[ypfIndex] / sums[zfyIndex] * 100).toFixed(2)
- } else {
- sums[index] = 0.00
- }
- } else if (column.property === 'matFeeRatio') {
- if (sums[zfyIndex] > 0) {
- sums[index] = (sums[clfIndex] / sums[zfyIndex] * 100).toFixed(2)
- } else {
- sums[index] = 0.00
- }
- } else if (column.property === 'zfy_tb') {
- if (sums[qn_zfy] > 0) {
- sums[index] = ((sums[jn_zfy] - sums[qn_zfy]) / sums[qn_zfy] * 100).toFixed(2) + '%'
- } else {
- sums[index] = 0.00 + '%'
- }
- } else if (column.property === 'zjj_tb') {
- if (sums[qn_zjj] > 0) {
- sums[index] = ((sums[jn_zjj] - sums[qn_zjj]) / sums[qn_zjj] * 100).toFixed(2) + '%'
- } else {
- sums[index] = 0.00 + '%'
- }
- } else if (column.property === 'ypf_tb') {
- if (sums[qn_ypf] > 0) {
- sums[index] = ((sums[jn_ypf] - sums[qn_ypf]) / sums[qn_ypf] * 100).toFixed(2) + '%'
- } else {
- sums[index] = 0.00 + '%'
- }
- } else if (column.property === 'clf_tb') {
- if (sums[qn_clf] > 0) {
- sums[index] = ((sums[jn_clf] - sums[qn_clf]) / sums[qn_clf] * 100).toFixed(2) + '%'
- } else {
- sums[index] = 0.00 + '%'
- }
- } else if (column.property === 'zfy_hb') {
- sums[index] = ''
- } else if (column.property === 'zjj_hb') {
- sums[index] = ''
- } else if (column.property === 'ypf_hb') {
- sums[index] = ''
- } else if (column.property === 'clf_hb') {
- sums[index] = ''
- } else if (!values.every(value => isNaN(value))) {
- sums[index] = values.reduce((prev, curr) => {
- const value = Number(curr)
- if (!isNaN(value)) {
- return prev + curr
- } else {
- return prev
- }
- }, 0)
- //合计特殊处理
- if (column.property === 'psnCount' || column.property === 'inDays') {
- sums[index] = sums[index].toFixed(0)
- } else {
- sums[index] = sums[index].toFixed(2)
- }
- } else {
- sums[index] = 0
- }
- })
- sums.avgInDays = (sums.inDays / sums.psnCount).toFixed(2)
- sums.drugFeeRatio = (sums.drugFee / sums.totalFee * 100).toFixed(2)
- sums.matFeeRatio = (sums.matFee / sums.totalFee * 100).toFixed(2)
- return sums
- }
- const filterSetlTypeName = () => {
- if ("21" === setlCondition.setlType) {
- return setlCondition.options[0].label
- } else {
- return setlCondition.options[1].label
- }
- return ''
- }
- const filterInsurTypeName = () => {
- if ("21" === setlCondition.setlType) {
- for (let i = 0; i < setlCondition.options[0].children.length; i++) {
- if (setlCondition.options[0].children[i].value === setlCondition.insurType) {
- return setlCondition.options[0].children[i].label
- }
- }
- } else {
- for (let i = 0; i < setlCondition.options[1].children.length; i++) {
- if (setlCondition.options[1].children[i].value === setlCondition.insurType) {
- return setlCondition.options[1].children[i].label
- }
- }
- }
- return ''
- }
- const exportSetlinfoExcel = () => {
- let year = setlCondition.startTime.substr(0, 4) + '年'
- if (setlinfos.value.length === 0) {
- ElMessage({
- message: '没有可以导出的数据!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- } else {
- const data = clone(setlinfos.value)
- data.push(getSummaries())
- // 增加导出正在进行中状态
- store.commit('app/setLoading', true)
- if (setlCondition.selectType === 'first') {
- const title = {
- insurName: '险种类型',
- psnCount: '住院人次',
- inDays: '住院天数',
- avgInDays: '平均住院日',
- totalFee: '总费用',
- drugFee: '药品费用',
- drugFeeRatio: '药品占比(%)',
- matFee: '耗材费用',
- matFeeRatio: '耗材占比(%)',
- fundPooling: '基本医疗统筹金额',
- bigIllFundPooling: '大病基金',
- civilServiceFund: '公务员基金支付',
- otherFunds: '其他基金',
- allFunds: '全部基金',
- }
- const setlTypeName = filterSetlTypeName()
- const insurTypeName = filterInsurTypeName()
- Export(data, title, `【${year}】【${setlTypeName}】【${insurTypeName}】`)
- } else if (setlCondition.selectType === 'second') {
- const setlTypeName = filterSetlTypeName()
- const exportName = year + setlTypeName + "同比"
- if (setlinfos.value.length <= 0) {
- ElMessage({
- message: '没有可以导出的数据!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- }
- ElMessageBox.prompt('导出文件名字', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- inputPattern: /\S/,
- inputErrorMessage: '文件名不能为空 (∩•̀ω•́)⊃-*⋆',
- })
- .then(({ value }) => {
- const data = {
- param: {
- startTime: setlCondition.startTime,
- endTime: setlCondition.endTime,
- setlType: setlCondition.setlType,
- insurType: setlCondition.insurType,
- selectType: setlCondition.selectType,
- exportName: exportName,
- },
- url: '/ybQuery/exportYbStatRatioExcel',
- fileName: value + '.xlsx',
- }
- setTimeout(() => {
- downloadExcel(data)
- }, 500)
- })
- .catch(() => {
- })
- } else {
- const setlTypeName = filterSetlTypeName()
- const exportName = year + setlTypeName + "环比"
- if (setlinfos.value.length <= 0) {
- ElMessage({
- message: '没有可以导出的数据!',
- type: 'warning',
- duration: 2500,
- showClose: true,
- })
- }
- ElMessageBox.prompt('导出文件名字', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- inputPattern: /\S/,
- inputErrorMessage: '文件名不能为空 (∩•̀ω•́)⊃-*⋆',
- })
- .then(({ value }) => {
- const data = {
- param: {
- startTime: setlCondition.startTime,
- endTime: setlCondition.endTime,
- setlType: setlCondition.setlType,
- insurType: setlCondition.insurType,
- selectType: setlCondition.selectType,
- exportName: exportName,
- },
- url: '/ybQuery/exportYbStatRatioExcel',
- fileName: value + '.xlsx',
- }
- setTimeout(() => {
- downloadExcel(data)
- }, 500)
- })
- .catch(() => {
- })
- }
- }
- }
- const handleClose = (done) => {
- if (this.loading) {
- return;
- }
- this.$confirm('确定要提交表单吗?')
- .then(_ => {
- this.loading = true;
- this.timer = setTimeout(() => {
- done();
- // 动画关闭需要一定的时间
- setTimeout(() => {
- this.loading = false;
- }, 400);
- }, 2000);
- })
- .catch(_ => { });
- }
- const cancelForm = () => {
- this.loading = false;
- this.dialog = false;
- clearTimeout(this.timer);
- }
- onMounted(() => {
- // 初始化数据
- setlCondition.selectType = 'first'
- })
- return {
- tableHeight,
- dateRange,
- setlCondition,
- setlinfos,
- qxtDrawer,
- titleChart,
- chartData,
- pieChartData,
- pageSize,
- currentPage,
- filterDialogTitle,
- setldetails,
- showSetldetails,
- showSetlinfoComponent,
- currentSetldetail,
- handleCurrentChange,
- handleSizeChange,
- fetchSetldetails,
- selectChart,
- handleClose,
- cancelForm,
- getSummaries1,
- exportSetlinfoExcel,
- exportYbDetailExcel,
- handleChange,
- handleClick,
- openSetlinfoComponent,
- fetchSetlinfos,
- }
- },
- }
- function initInsurOptions() {
- return [
- {
- value: '21',
- label: '住院',
- children: [
- {
- value: 99,
- label: '全部',
- },
- {
- value: 43010031001,
- label: '长沙市城职',
- },
- {
- value: 43010039001,
- label: '长沙市城居',
- },
- {
- value: 43010034001,
- label: '长沙市离休',
- },
- {
- value: 43010051052,
- label: '长沙市生育',
- },
- {
- value: 43012131001,
- label: '长沙县城职',
- },
- {
- value: 43012139001,
- label: '长沙县城居',
- },
- {
- value: 43012134001,
- label: '长沙县离休',
- },
- {
- value: 43012151052,
- label: '长沙县生育',
- },
- {
- value: 43018131001,
- label: '浏阳市城职',
- },
- {
- value: 43018139001,
- label: '浏阳市城居',
- },
- {
- value: 43018134001,
- label: '浏阳市离休',
- },
- {
- value: 43018151052,
- label: '浏阳市生育',
- },
- {
- value: 43990031001,
- label: '湖南省城职',
- },
- {
- value: 43990034001,
- label: '湖南省离休',
- },
- {
- value: 43990051052,
- label: '湖南省生育',
- },
- {
- value: 43990001,
- label: '省内异地',
- },
- {
- value: 43990002,
- label: '省外异地',
- },
- {
- value: 4301002102,
- label: '市单病种',
- },
- {
- value: 4399002102,
- label: '省单病种',
- },
- {
- value: 4399012102,
- label: '省内单病种',
- },
- ]
- },
- {
- value: '11',
- label: '门诊',
- children: [
- {
- value: 99,
- label: '全部',
- },
- {
- value: 11,
- label: '普通门诊',
- },
- {
- value: 14,
- label: '特殊门诊',
- },
- {
- value: 3,
- label: '工伤门诊',
- },
- {
- value: 51,
- label: '生育门诊',
- },
- ]
- },
- ]
- }
- </script>
- <style scoped>
- :deep(.el-table .children-row) {
- background: rgba(145, 247, 145, 0.5);
- }
- :deep(.el-table--border td:first-child .cell, .el-table--border th:first-child .cell) {
- padding-left: 4px;
- }
- :deep(.el-table) {
- --el-table-row-hover-background-color: #85dbfd7a;
- }
- :deep(.el-table__footer-wrapper tbody td) {
- background: #df4a25;
- color: white;
- font-weight: bold;
- }
- :deep(.el-main) {
- padding: 0 5px;
- }
- </style>
|