Ver código fonte

Merge branch 'master' into 'master'

报表页面

See merge request lighter/vue-intergration-platform!1
lighter 3 anos atrás
pai
commit
73a6cff7de

+ 9 - 0
src/api/medical-insurance/si-ybkf.js

@@ -0,0 +1,9 @@
+import request from '../../utils/request'
+
+export function selectYbStatInfo(data) {
+  return request({
+    url: '/ybQuery/selectYbStatInfo',
+    method: 'post',
+    data,
+  })
+}

+ 5 - 0
src/router/modules/dashboard.js

@@ -119,6 +119,11 @@ const route = [
         component: createNameComponent(() => import('@/views/medical-insurance/allpatient/LogAnalyse.vue')),
         meta: { title: '日志分析', icon: 'iconfont icon-zhuyuanqingdan' },
       },
+      {
+        path: 'qryManage/insurIncomeAnalysis',
+        component: createNameComponent(() => import('@/views/medical-insurance/allpatient/InsurIncomeAnalysis.vue')),
+        meta: { title: '全院医保收入分析', icon: 'iconfont icon-zhuyuanqingdan' },
+      },
     ],
   },
   {

+ 458 - 0
src/views/medical-insurance/allpatient/InsurIncomeAnalysis.vue

@@ -0,0 +1,458 @@
+<template>
+  <el-container>
+    <el-header style="height: 35px; margin-top: 10px">
+      <el-date-picker v-model="setlCondition.month" :clearable="false" placeholder="请选择" style="width: 110px"
+        type="month"></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="el-icon-search" type="success" @click="fetchSetlinfos">查询</el-button>
+      <el-button icon="el-icon-download" type="primary" @click="exportSetlinfoExcel">导出Excel</el-button>
+    </el-header>
+    <el-main>
+      <el-table :data="setlinfos" :max-height="tableHeight" border highlight-current-row row-key="childKey" show-summary
+        :summary-method="getSummaries1">
+        <el-table-column label="险种类型" prop="insurName" 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-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-main>
+  </el-container>
+</template>
+
+<script>
+import { computed, onMounted, reactive, ref } from 'vue'
+import { formatMonth } from '@/utils/date'
+import { useStore } from 'vuex'
+import {
+  selectYbStatInfo
+} from '@/api/medical-insurance/si-ybkf'
+import { clone } from '@/utils/clone'
+import { Export } from '@/utils/ExportExcel'
+import { ElMessage } from 'element-plus'
+
+export default {
+  components: {
+
+  },
+  setup() {
+    const store = useStore()
+    const windowSize = store.state.app.windowSize
+    const tableHeight = windowSize.h - 55
+
+    const setlCondition = reactive({
+      month: formatMonth(new Date()),
+      setlType: '21',
+      insurType: null,
+      dataInfo: null,
+      options: initInsurOptions(),
+    })
+
+    const setlinfos = ref([])
+    const setldetails = ref([])
+    const showSetldetails = ref(false)
+
+    const admdvsNameStyle = (children, isChildren) => {
+      return {
+        position: 'absolute',
+        top: '6px',
+        left: children || isChildren ? '24px' : '10px',
+        width: '110px',
+      }
+    }
+
+    const fetchSetlinfos = () => {
+      if (!setlCondition.month) {
+        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.month = formatMonth(setlCondition.month)
+      selectYbStatInfo(setlCondition)
+        .then((res) => {
+          setlinfos.value = res
+        })
+        .catch(() => {
+          setlinfos.value = []
+        })
+    }
+
+    const handleChange = (value) => {
+      console.log(value);
+    }
+
+    const getSummaries = () => {
+      let sums = {
+        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 sums) {
+          sums[k] = Number(sums[k]) + Number(itm[k])
+        }
+      })
+      sums.insurName = '合计'
+      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 getSummaries1 = (param) => {
+      const { columns, data } = param
+      const sums = []
+      // 住院人次下标
+      let psnCountIndex = 0
+      // 住院天数下标
+      let inDaysIndex = 0
+      // 总费用下标
+      let zfyIndex = 0
+      // 药品费下标
+      let ypfIndex = 0
+      // 材料费下标
+      let clfIndex = 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
+        }
+        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 (!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 = () => {
+      if (setlinfos.value.length === 0) {
+        ElMessage({
+          message: '没有可以导出的数据!',
+          type: 'warning',
+          duration: 2500,
+          showClose: true,
+        })
+      } else {
+        const data = clone(setlinfos.value)
+        data.push(getSummaries())
+        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, `【${setlCondition.month}】【${setlTypeName}】【${insurTypeName}】`)
+      }
+    }
+
+    const pageSize = ref(30)
+    const currentPage = ref(1)
+    const handleSizeChange = (val) => {
+      pageSize.value = val
+    }
+    const handleCurrentChange = (val) => {
+      currentPage.value = val
+    }
+
+    onMounted(() => {
+
+    })
+
+    return {
+      tableHeight,
+      setlCondition,
+      setlinfos,
+      setldetails,
+      showSetldetails,
+      pageSize,
+      currentPage,
+      getSummaries1,
+      exportSetlinfoExcel,
+      handleChange,
+      admdvsNameStyle,
+      handleCurrentChange,
+      handleSizeChange,
+      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;
+}
+</style>