Browse Source

出院结算审核优化。

lighter 3 years ago
parent
commit
e0201bf831

+ 5 - 5
src/App.vue

@@ -2,16 +2,16 @@
   <el-config-provider :locale="locale">
     <router-view v-slot="{ Component }">
       <keep-alive>
-        <component :is="Component"/>
+        <component :is="Component" />
       </keep-alive>
     </router-view>
   </el-config-provider>
 </template>
 
 <script>
-import {defineComponent} from 'vue'
+import { defineComponent } from 'vue'
 import locale from 'element-plus/lib/locale/lang/zh-cn'
-import {useStore} from 'vuex'
+import { useStore } from 'vuex'
 
 export default defineComponent({
   name: 'App',
@@ -38,7 +38,7 @@ export default defineComponent({
 function getWindowSize() {
   const w = window.innerWidth
   const h = window.innerHeight - 96
-  return {w, h}
+  return { w, h }
 }
 </script>
 
@@ -103,7 +103,7 @@ function getWindowSize() {
 }
 
 .axios-loading2 {
-  animation: axiosloading 2s;
+  animation: axiosloading 1s;
   background-image: url('/src/assets/images/loading.gif');
   -webkit-background-image: url('/src/assets/images/loading.gif');
   background-repeat: no-repeat;

+ 11 - 8
src/components/medical-insurance/medfee-analyse/Index.vue

@@ -1,18 +1,18 @@
 <template>
   <el-container>
-    <el-aside width="320px">
+    <el-aside width="360px">
       <div style="display: flex; height: 36px; align-items: center; font-weight: 600; padding: 0 12px">
-        <div style="width: 31%">费用类别</div>
+        <div style="width: 34%">费用类别</div>
         <div style="width: 23%">总金额</div>
-        <div style="width: 23%">政策范围内金额</div>
-        <div style="width: 23%">政策范围外金额</div>
+        <div style="width: 22%">政策范围内金额</div>
+        <div style="width: 21%">政策范围外金额</div>
       </div>
       <div v-for="(val, key) in analyse" :key="key" class="fee-type" :style="currentStyle(key)" @click="handleClickChrgtype(val, key)">
         <div>
-          <div style="width: 31%">{{ val[0] }}</div>
+          <div style="width: 34%">{{ val[0] }}</div>
           <div style="width: 23%">{{ val[1] }}</div>
-          <div style="width: 23%">{{ val[2] }}</div>
-          <div style="width: 23%">{{ val[3] }}</div>
+          <div style="width: 22%">{{ val[2] }}</div>
+          <div style="width: 21%">{{ val[3] }}</div>
         </div>
       </div>
     </el-aside>
@@ -164,8 +164,11 @@ export default {
 </script>
 
 <style scoped>
+* {
+  font-size: 12px !important;
+}
 .fee-type {
-  width: 320px;
+  width: 360px;
   display: flex;
   height: 36px;
   align-items: center;

+ 9 - 9
src/utils/loading.js

@@ -1,19 +1,19 @@
-import {ElLoading} from 'element-plus'
+import { ElLoading } from 'element-plus'
 
 var loading
 
 /*开启遮罩*/
 export function startLoading() {
-    loading = ElLoading.service({
-        customClass: 'axios-loading2',
-        lock: true,
-        background: 'rgba(255,255,255,0.5)',
-    })
+  loading = ElLoading.service({
+    customClass: 'axios-loading2',
+    lock: true,
+    background: 'rgba(255,255,255,0.5)',
+  })
 }
 
 /*关闭遮罩*/
 export function endLoading() {
-    if (loading) {
-        loading.close()
-    }
+  if (loading) {
+    loading.close()
+  }
 }

+ 85 - 87
src/utils/request.js

@@ -1,107 +1,105 @@
 import axios from 'axios'
-import {ElMessage, ElMessageBox} from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
 import Cookies from 'js-cookie'
 import router from '@/router'
 import store from '@/store'
-import {startLoading, endLoading} from './loading'
+import { startLoading, endLoading } from './loading'
 
 const apiUrl = import.meta.env.VITE_BASE_URL
 
 const service = axios.create({
-    baseURL: apiUrl,
-    withCredentials: true,
-    timeout: 0,
+  baseURL: apiUrl,
+  withCredentials: true,
+  timeout: 0,
 })
 
 /*axios请求拦截*/
 service.interceptors.request.use(
-    (config) => {
-        if (typeof config.jdtTitle !== 'undefined') {
-            store.commit('app/setJdt', {title: config.jdtTitle, isOpen: true, closeButton: false})
-        } else {
-            startLoading()
-        }
-        if (store.getters['user/token']) {
-            config.headers['token'] = store.state.user.token
-        }
-        return config
-    },
-    (error) => {
-        endLoading()
-        store.commit('app/closeButton', true)
-        return Promise.reject(error)
+  (config) => {
+    if (typeof config.jdtTitle !== 'undefined') {
+      store.commit('app/setJdt', { title: config.jdtTitle, isOpen: true, closeButton: false })
+    } else {
+      startLoading()
     }
+    if (store.getters['user/token']) {
+      config.headers['token'] = store.state.user.token
+    }
+    return config
+  },
+  (error) => {
+    endLoading()
+    store.commit('app/closeButton', true)
+    return Promise.reject(error)
+  }
 )
 
 service.interceptors.response.use(
-    (response) => {
-        endLoading()
-        store.commit('app/closeButton', true)
-        if (response.data.code === 200 || response.data.code === 0) {
-            return response.data.data
-        }
-        if (response.data.code === 2002) {
-            return response.data
-        }
-        if (response.data.code === 201) {
-            ElMessage({
-                type: 'success',
-                title: '成功',
-                duration: 2800,
-                dangerouslyUseHTMLString: true,
-                message: response.data.message,
-                showClose: true,
-                offset: 130,
-            })
-            return response.data.data
-        }
-        if (response.data.code > 1000 && response.data.code < 2000) {
-            ElMessage({
-                type: 'error',
-                message: response.data.message,
-                duration: 2000,
-                showClose: true,
-            })
-        } else if (response.data.code > 2000 && response.data.code < 3000) {
-            if (response.data.code === 2003) {
-                ElMessageBox.alert(response.data.message, '提示', {
-                    type: 'error',
-                    dangerouslyUseHTMLString: true,
-                    confirmButtonText: '确定',
-                }).then(() => {
-                })
-            } else {
-                ElMessageBox.alert(response.data.message, '提示', {
-                    type: 'error',
-                    confirmButtonText: '确定',
-                }).then(() => {
-                })
-            }
-        } else if (response.data.code > 3000 && response.data.code < 4000) {
-            ElMessageBox.alert(response.data.message, '提示', {
-                type: 'warning',
-                confirmButtonText: '确定',
-            }).then(() => {
-                Cookies.remove('token')
-                router.push('/login')
-            })
-        }
-        if (response.data.data) {
-            return Promise.reject(response.data)
-        }
-        return Promise.reject(response.data.message || '服务器内部错误')
-    },
-    (error) => {
-        endLoading()
-        store.commit('app/closeButton', true)
-        ElMessage({
-            message: error,
-            type: 'error',
-            duration: 2500,
-            showClose: true,
-        })
-        return Promise.reject(error)
+  (response) => {
+    endLoading()
+    store.commit('app/closeButton', true)
+    if (response.data.code === 200 || response.data.code === 0) {
+      return response.data.data
+    }
+    if (response.data.code === 2002) {
+      return response.data
+    }
+    if (response.data.code === 201) {
+      ElMessage({
+        type: 'success',
+        title: '成功',
+        duration: 2800,
+        dangerouslyUseHTMLString: true,
+        message: response.data.message,
+        showClose: true,
+        offset: 130,
+      })
+      return response.data.data
+    }
+    if (response.data.code > 1000 && response.data.code < 2000) {
+      ElMessage({
+        type: 'error',
+        message: response.data.message,
+        duration: 2000,
+        showClose: true,
+      })
+    } else if (response.data.code > 2000 && response.data.code < 3000) {
+      if (response.data.code === 2003) {
+        ElMessageBox.alert(response.data.message, '提示', {
+          type: 'error',
+          dangerouslyUseHTMLString: true,
+          confirmButtonText: '确定',
+        }).then(() => {})
+      } else {
+        ElMessageBox.alert(response.data.message, '提示', {
+          type: 'error',
+          confirmButtonText: '确定',
+        }).then(() => {})
+      }
+    } else if (response.data.code > 3000 && response.data.code < 4000) {
+      ElMessageBox.alert(response.data.message, '提示', {
+        type: 'warning',
+        confirmButtonText: '确定',
+      }).then(() => {
+        Cookies.remove('token')
+        router.push('/login')
+      })
+    }
+    if (response.data.data) {
+      return Promise.reject(response.data)
     }
+    return Promise.reject(response.data.message || '服务器内部错误')
+  },
+  (error) => {
+    endLoading()
+    store.commit('app/closeButton', true)
+    ElMessage({
+      message: error,
+      type: 'error',
+      duration: 2500,
+      showClose: true,
+    })
+    return Promise.reject(error)
+  }
 )
 
 export default service

+ 39 - 9
src/views/medical-insurance/inpatient/DiscSettlement.vue

@@ -378,13 +378,27 @@ export default {
       patient.value.midSetl = midSetl
       selectSettleApply(patient.value).then((res) => {
         if (null === res.status) {
-          settleApply.value.patNo = patient.value.inpatientNo
-          settleApply.value.times = patient.value.admissTimes
-          settleApply.value.ledgerSn = patient.value.ledgerSn
-          settleApply.value.type = midSetl ? 2 : 1
-          settleApply.value.settleDatetime = res.settleDatetime
-          settleApply.value.inputComment = midSetl ? null : '医嘱离院。'
-          showSettleApplyForm.value = true
+          patient.value.sid = store.getters['user/sid']
+          patient.value.zjdzDatetime = getDatetime()
+          dismissCalculate(patient.value)
+            .then(() => {
+              settleApply.value.patNo = patient.value.inpatientNo
+              settleApply.value.times = patient.value.admissTimes
+              settleApply.value.ledgerSn = patient.value.ledgerSn
+              settleApply.value.type = midSetl ? 2 : 1
+              settleApply.value.settleDatetime = res.settleDatetime
+              settleApply.value.inputComment = midSetl ? null : '医嘱离院。'
+              showSettleApplyForm.value = true
+            })
+            .catch((res2) => {
+              if (res2.code && res2.code === 1004) {
+                negativeFees.value = res2.data
+                showNegativeFee.value = true
+                dismissCalMsg.value = res2.message
+              } else {
+                dismissCalMsg.value = res2.toString()
+              }
+            })
         } else {
           switch (res.status) {
             case 0:
@@ -412,8 +426,24 @@ export default {
                 cancelButtonText: '重新提交',
                 showCancelButton: true,
               }).catch(() => {
-                settleApply.value.inputComment = null
-                showSettleApplyForm.value = true
+                patient.value.sid = store.getters['user/sid']
+                patient.value.zjdzDatetime = res.settleDatetime
+                dismissCalculate(patient.value)
+                  .then(() => {
+                    settleApply.value.inputComment = null
+                    settleApply.value.type = res.type
+                    settleApply.value.settleDatetime = res.settleDatetime
+                    showSettleApplyForm.value = true
+                  })
+                  .catch((res) => {
+                    if (res.code && res.code === 1004) {
+                      negativeFees.value = res.data
+                      showNegativeFee.value = true
+                      dismissCalMsg.value = res.message
+                    } else {
+                      dismissCalMsg.value = res.toString()
+                    }
+                  })
               })
               break
           }

+ 8 - 3
src/views/medical-insurance/inpatient/InHospFeeUpload.vue

@@ -91,9 +91,11 @@
     <el-dialog v-model="weiGuiTuiFeiFenXiDialog" title="违规费用分析" :fullscreen="true">
       <wei-gui-fei-yong-fen-xi :init="weiGuiTuiFeiInit" @open="weiGuiTuiFeiOpenDialog" ref="weiGui" :patient="weiGuiJiBenXinXi"></wei-gui-fei-yong-fen-xi>
     </el-dialog>
-    <el-dialog v-model="showFeeDetl" title="医保费用明细" :close-on-click-modal="false" fullscreen>
-      <MedfeeAnalyse type="unsettled" :timestamp="timestamp" :mdtrt-id="patient.mdtrtId" />
-    </el-dialog>
+    <div class="m-component">
+      <el-dialog v-model="showFeeDetl" title="医保费用明细" :close-on-click-modal="false" fullscreen>
+        <MedfeeAnalyse type="unsettled" :timestamp="timestamp" :mdtrt-id="patient.mdtrtId" />
+      </el-dialog>
+    </div>
   </el-container>
 </template>
 
@@ -500,4 +502,7 @@ function initPage() {
   width: 0px;
   vertical-align: middle;
 }
+:deep(.m-component .el-dialog__body) {
+  padding: 0 !important;
+}
 </style>

+ 127 - 28
src/views/medical-insurance/inpatient/MedInsVerification.vue

@@ -8,6 +8,8 @@
         <el-option v-for="item in statusFlags" :key="item.code" :label="item.name" :value="item.code"></el-option>
       </el-select>
       <el-divider direction="vertical"></el-divider>
+      <el-button type="success" icon="el-icon-document" :disabled="currentApply.medType === '42'" @click="feeDtle">医保费用明细</el-button>
+      <el-button type="primary" icon="el-icon-user" @click="checkIdInfo">身份信息</el-button>
       <el-button type="success" icon="el-icon-check" @click="beforeHandleApply(true)">审核通过</el-button>
       <el-button type="danger" icon="el-icon-close" @click="beforeHandleApply(false)">审核不通过</el-button>
     </el-header>
@@ -143,25 +145,31 @@
                 </el-descriptions-item>
               </el-descriptions>
             </div>
-            <div style="height: 8px"></div>
-            <el-tag>医保入院诊断</el-tag>
-            <el-table :data="zyInYbDiags" stripe height="150">
-              <el-table-column prop="diagNo" label="诊断序号"></el-table-column>
-              <el-table-column prop="icdCode" label="诊断编码"></el-table-column>
-              <el-table-column prop="icdText" label="诊断名称"></el-table-column>
-              <el-table-column prop="opDate" label="诊断时间"></el-table-column>
-              <el-table-column prop="operName" label="录入人"></el-table-column>
-            </el-table>
-            <div style="height: 8px"></div>
-            <el-tag>医保出院诊断</el-tag>
-            <el-table :data="zyDisDiags" stripe height="150">
-              <el-table-column prop="disDiagNo" label="诊断序号"></el-table-column>
-              <el-table-column prop="disDiag" label="诊断编码"></el-table-column>
-              <el-table-column prop="disDiagComment" label="诊断名称"></el-table-column>
-              <el-table-column prop="opDiagDate" label="诊断时间"></el-table-column>
-              <el-table-column prop="opName" label="录入人"></el-table-column>
-              <el-table-column prop="ssfz" label="分值"></el-table-column>
-            </el-table>
+
+            <div style="margin-top: 8px; display: flex">
+              <div style="width: 44%">
+                <el-tag>医保入院诊断</el-tag>
+                <el-table :data="zyInYbDiags" stripe height="160">
+                  <el-table-column prop="diagNo" label="序号" width="35"></el-table-column>
+                  <el-table-column prop="icdCode" label="诊断编码" width="120"></el-table-column>
+                  <el-table-column prop="icdText" label="诊断名称"></el-table-column>
+                  <el-table-column prop="opDate" label="诊断时间"></el-table-column>
+                  <el-table-column prop="operName" label="录入人" width="50"></el-table-column>
+                </el-table>
+              </div>
+              <div style="width: 55%; margin-left: 1%">
+                <el-tag>医保出院诊断</el-tag>
+                <el-table :data="zyDisDiags" stripe height="160">
+                  <el-table-column prop="disDiagNo" label="序号" width="35"></el-table-column>
+                  <el-table-column prop="disDiag" label="诊断编码" width="120"></el-table-column>
+                  <el-table-column prop="disDiagComment" label="诊断名称"></el-table-column>
+                  <el-table-column prop="opDiagDate" label="诊断时间"></el-table-column>
+                  <el-table-column prop="opName" label="录入人" width="50"></el-table-column>
+                  <el-table-column prop="ssfz" label="分值"></el-table-column>
+                </el-table>
+              </div>
+            </div>
+
             <div style="height: 8px"></div>
             <el-tag>患者手术记录</el-tag>
             <el-table :data="zySurgeries" stripe height="150">
@@ -172,6 +180,36 @@
               <el-table-column prop="ssysName" label="手术医师"></el-table-column>
             </el-table>
           </div>
+          <div class="m-component">
+            <el-dialog v-model="showFeeDetl" title="医保费用明细" :close-on-click-modal="false" fullscreen>
+              <MedfeeAnalyse type="unsettled" :timestamp="timestamp" :mdtrt-id="currentApply.mdtrtId" />
+            </el-dialog>
+          </div>
+          <div
+            v-show="idCardImgFile"
+            class="affix-container"
+            style="
+              position: absolute;
+              display: flex;
+              justify-content: center;
+              top: 60px;
+              left: 150px;
+              right: 150px;
+              bottom: 60px;
+              border-radius: 8px;
+              overflow-y: scroll;
+              background: rgba(0, 0, 0, 0.7);
+            "
+          >
+            <div style="position: absolute; top: 12px; right: 12px">
+              <el-affix target=".affix-container" :offset="60">
+                <el-button icon="el-icon-plus" @click="zoomInIdCard">放大</el-button>
+                <el-button icon="el-icon-refresh" @click="resetIdCard">还原</el-button>
+                <el-button icon="el-icon-close" @click=";(idCardImgFile = null), resetIdCard()">关闭</el-button>
+              </el-affix>
+            </div>
+            <img id="idCardImg" :style="idCardImgStyle" :src="idCardImgFile" />
+          </div>
         </el-main>
       </el-container>
     </el-main>
@@ -186,7 +224,10 @@ import femaleIcon from '@/assets/female-icon.png'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { selectUnhandledApplies, selectPatientInfo, handleApply } from '../../../api/medical-insurance/si-settle-apply'
 import { statusFlags, trueMedTypes } from '../../../data/index'
+import { getIdCardInfo } from '@/api/yibao/patient'
+import MedfeeAnalyse from '../../../components/medical-insurance/medfee-analyse/Index.vue'
 export default {
+  components: { MedfeeAnalyse },
   setup() {
     const currentApply = ref({})
     const windowSize = store.state.app.windowSize
@@ -195,6 +236,7 @@ export default {
       height: windowSize.h - 50 + 'px',
       overflowY: 'scroll',
     }
+    const showFeeDetl = ref(false)
     const medType = ref('')
     const statusFlag = ref(null)
     const patient = ref({})
@@ -211,6 +253,20 @@ export default {
         }
       })
     })
+    const timestamp = ref(0)
+    const feeDtle = () => {
+      if (!currentApply.value.patNo) {
+        ElMessage({
+          message: '请先选择患者',
+          type: 'warning',
+          duration: 2500,
+          showClose: true,
+        })
+        return
+      }
+      timestamp.value = new Date().getTime()
+      showFeeDetl.value = true
+    }
 
     const currentRow = ref({})
     const handleClickOverview = (row) => {
@@ -273,6 +329,47 @@ export default {
       }
     }
 
+    const idCardImgFile = ref('')
+    const idCardImgStyle = ref({
+      width: '1,114px',
+      height: '600px',
+      borderRadius: '4px',
+      w: 1114,
+      h: 600,
+    })
+    const zoomInIdCard = () => {
+      idCardImgStyle.value.w = idCardImgStyle.value.w * 1.3
+      idCardImgStyle.value.h = idCardImgStyle.value.h * 1.3
+      idCardImgStyle.value.width = idCardImgStyle.value.w + 'px'
+      idCardImgStyle.value.height = idCardImgStyle.value.h + 'px'
+    }
+    const resetIdCard = () => {
+      idCardImgStyle.value.w = 1114
+      idCardImgStyle.value.h = 600
+      idCardImgStyle.value.width = '1114px'
+      idCardImgStyle.value.height = '600px'
+    }
+    const checkIdInfo = () => {
+      if (!currentApply.value.patNo) {
+        ElMessage({
+          message: '请先选择患者',
+          type: 'warning',
+          duration: 2500,
+          showClose: true,
+        })
+      } else {
+        getIdCardInfo(currentApply.value.patNo, currentApply.value.times).then((res) => {
+          if (res.idCard.length > 0) {
+            idCardImgFile.value = 'data:image/png;base64,' + res.idCard[0].fileSfz
+          } else {
+            if (res.scanFile.length > 0) {
+              idCardImgFile.value = 'data:image/png;base64,' + res.scanFile[0].fileSfz
+            }
+          }
+        })
+      }
+    }
+
     onActivated(() => {
       selectUnhandledApplies().then((res) => {
         allApplies.value = res
@@ -281,6 +378,9 @@ export default {
 
     return {
       mainBoxStyle,
+      showFeeDetl,
+      timestamp,
+      idCardImgFile,
       currentApply,
       cptApplies,
       tableHeight,
@@ -297,6 +397,11 @@ export default {
       zySurgeries,
       handleClickOverview,
       beforeHandleApply,
+      feeDtle,
+      checkIdInfo,
+      idCardImgStyle,
+      zoomInIdCard,
+      resetIdCard,
     }
   },
 }
@@ -315,15 +420,9 @@ function getStatusFlag(status, patNo) {
 </script>
 
 <style scoped>
-.remark {
-  padding: 5px 10px;
-}
-
-.mt10 {
-  margin-top: 10px;
+.affix-container {
 }
-
-.yb-tag {
-  padding: 5px 0 0 20px;
+:deep(.m-component .el-dialog__body) {
+  padding: 0 !important;
 }
 </style>