Jelajahi Sumber

优化和修复bud

xiaochan 1 tahun lalu
induk
melakukan
7772d80cdc

+ 2 - 0
src/App.vue

@@ -6,6 +6,7 @@
   </router-view>
   <soctet-dialog v-if="socketErrDialog"/>
   <progress-bar/>
+  <JsDialogComp/>
 </template>
 
 <script setup lang="jsx">
@@ -18,6 +19,7 @@ import router from "@/router";
 import ProgressBar from "@/components/xiao-chan/progress-bar/ProgressBar.vue";
 import {formatDateToStr} from '@/utils/moment-utils'
 import {ElLink} from 'element-plus'
+import JsDialogComp from "@/components/js-dialog-comp/JsDialogComp.vue";
 
 const store = useStore()
 

+ 24 - 0
src/components/js-dialog-comp/JsDialogComp.vue

@@ -0,0 +1,24 @@
+<template>
+  <div id="cy-js_dialog_comp">
+    <Component v-for="item in comp" :is="item"/>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {compList} from "@/components/js-dialog-comp/useDialogToJs";
+import {computed} from "vue";
+
+
+const comp = computed(() => {
+  const temp = []
+  for (let key in compList.value) {
+    temp.push(compList.value[key])
+  }
+  return temp
+})
+
+</script>
+
+<style scoped>
+
+</style>

+ 24 - 0
src/components/js-dialog-comp/useDialogToJs.ts

@@ -0,0 +1,24 @@
+import {ref, DefineComponent, h, ExtractPropTypes, ComponentCustomProps} from 'vue';
+
+import {generateRandomString} from "../../utils/getUuid";
+
+
+export const compList = ref<{
+    [key: string]: any
+}>({})
+
+
+export function setDialogToJs<T extends DefineComponent>(comp: T, data: ExtractPropTypes<T> & ComponentCustomProps) {
+    return new Promise<any[]>(resolve => {
+        const id = "cy_" + generateRandomString(5)
+
+        const props = {
+            onClosed: (...val: (any[] | PromiseLike<any[]>)[]) => {
+                delete compList.value[id]
+                resolve(val)
+            },
+            ...data
+        }
+        compList.value[id] = h(comp, props)
+    })
+}

+ 7 - 3
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrTestV2/EmrTestV2.vue

@@ -214,9 +214,13 @@ onMounted(async () => {
             <br/>
             <el-button-group>
               <el-button @click="query" type="primary">查询</el-button>
-              <el-button @click="appendCopy" type="info">复制</el-button>
-              <el-button @click="copyAndPaste(false)" type="success">确认复制</el-button>
-              <el-button v-if="props.isEmr" @click="copyAndPaste(true)" type="success">复制粘贴</el-button>
+              <el-button @click="appendCopy" type="info" v-title="'复制追加内容'">追加</el-button>
+              <el-button @click="copyAndPaste(false)" type="success" v-title="'复制追加的检验数据,请勿使用文本粘贴'">
+                复制
+              </el-button>
+              <el-button v-if="props.isEmr" @click="copyAndPaste(true)" type="primary"
+                         v-title="'和复制功能一样,只是多一步直接粘贴'">粘贴
+              </el-button>
             </el-button-group>
           </div>
           <xc-table :local-data="sidebarData"

+ 31 - 42
src/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/report-of-infectious-diseases/DialogDiseases.vue

@@ -527,9 +527,8 @@
 </template>
 
 <script setup name='DialogDiseases'>
-import {getAllDictionary, getSheetInfo} from "@/api/case-front-sheet";
-import {operations, sexes} from "@/data";
-import {autopsies, haveOrNot, yesOrNo} from "@/views/hospitalization/case-front-sheet/common";
+import {getSheetInfo} from "@/api/case-front-sheet";
+import {sexes} from "@/data";
 import {
   cardReportingType, classA, classB, classC, diagnosticBasis, getClassName, gyByfx, gyLcfx,
   medicalRecordClassification1, medicalRecordClassification2,
@@ -556,55 +555,50 @@ const props = defineProps({
   times: {
     type: Number,
     default: 1
-  },
-  ward: {
-    type: String,
-    default: '8000001'
   }
 })
 
 const emits = defineEmits(['confirm'])
 
 let userData = store.state.user.info
-let sheetData = reactive({})
-let dics = reactive({})
-let patInfo = reactive({})
+const sheetData = ref({})
+let patInfo = {}
 const infectiousDiseasesList = ref([])
 
 const setDefault = async () => {
   let date = await getServerDateApi()
-  sheetData.name = patInfo.name
-  sheetData.socialNo = patInfo.socialNo
-  sheetData.sex = patInfo.sex
-  sheetData.birthDate = patInfo.birthDate
-  sheetData.age = patInfo.age
-  sheetData.corporation = patInfo.unitName
-  sheetData.relationTel = patInfo.phone
-  sheetData.occupationCode = patInfo.occupation
-  sheetData.currentDistrict = patInfo.livePlaceCombo
-  sheetData.reportDate = date
-  sheetData.inputDt = date
-  sheetData.patientId = props.patNo
-  sheetData.times = props.times
-  sheetData.ageUnit = '岁'
-  sheetData.reportDept = props.ward
-  sheetData.reportHospital = '长沙泰和医院'
+  sheetData.value.name = patInfo.name
+  sheetData.value.socialNo = patInfo.socialNo
+  sheetData.value.sex = patInfo.sex
+  sheetData.value.birthDate = patInfo.birthDate
+  sheetData.value.age = patInfo.age
+  sheetData.value.corporation = patInfo.unitName
+  sheetData.value.relationTel = patInfo.phone
+  sheetData.value.occupationCode = patInfo.occupation
+  sheetData.value.currentDistrict = patInfo.livePlaceCombo
+  sheetData.value.reportDate = date
+  sheetData.value.inputDt = date
+  sheetData.value.patientId = props.patNo
+  sheetData.value.times = props.times
+  sheetData.value.ageUnit = '岁'
+  sheetData.value.reportDept = patInfo.admissWardCode
+  sheetData.value.reportHospital = '长沙泰和医院'
 }
 
 const changesInInfectiousDiseases = (val) => {
   let temp = ['contagion', 'contagion2', 'contagion3', 'contagionQt']
   temp.forEach(item => {
     if (item !== val) {
-      sheetData[item] = null
+      sheetData.value[item] = null
     }
   })
 }
 
 const contagionFunc = (rule, value, callback) => {
-  if (stringIsBlank(sheetData.contagion)
-      && stringIsBlank(sheetData.contagion2)
-      && stringIsBlank(sheetData.contagion3)
-      && stringIsBlank(sheetData.contagionQt)) {
+  if (stringIsBlank(sheetData.value.contagion)
+      && stringIsBlank(sheetData.value.contagion2)
+      && stringIsBlank(sheetData.value.contagion3)
+      && stringIsBlank(sheetData.value.contagionQt)) {
     callback(new Error('至少选择一项'));
   } else {
     callback()
@@ -612,7 +606,7 @@ const contagionFunc = (rule, value, callback) => {
 }
 
 const vaccinateFunc = (rule, value, callback) => {
-  if (stringIsBlank(sheetData.vaccinate) && stringIsBlank(sheetData.vaccinate2)) {
+  if (stringIsBlank(sheetData.value.vaccinate) && stringIsBlank(sheetData.value.vaccinate2)) {
     callback(new Error('至少选择一项'));
   } else {
     callback()
@@ -639,11 +633,11 @@ const rules = reactive({
 })
 
 const rowClick = ({row}) => {
-  sheetData = row
+  sheetData.value = row
 }
 
 const newlyAddedClick = async () => {
-  sheetData = {}
+  sheetData.value = {}
   await setDefault()
 }
 
@@ -659,11 +653,6 @@ onMounted(async () => {
     inOutFlag: 1
   })
   await setDefault()
-  dics = await getAllDictionary()
-  dics.getOperations = operations
-  dics.getYesOrNo = yesOrNo
-  dics.getHaveOrNot = haveOrNot
-  dics.getAutopsies = autopsies
 })
 
 const formRef = ref(null)
@@ -671,10 +660,10 @@ const formRef = ref(null)
 const confirm = async () => {
   try {
     await formRef.value.validate();
-    if (stringIsBlank(sheetData.cardNo)) {
-      await confirmCrb(sheetData)
+    if (stringIsBlank(sheetData.value.cardNo)) {
+      await confirmCrb(sheetData.value)
     } else {
-      await updateCrb(sheetData)
+      await updateCrb(sheetData.value)
     }
     await query()
     await newlyAddedClick()

+ 17 - 27
src/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/report-of-infectious-diseases/ReportOfInfectiousDiseases.vue

@@ -1,43 +1,33 @@
 <template>
-  <xc-dialog-v2 v-model="dialog"
-                title="传染病上报"
-                maximize
-                @closed="emits('closed')"
-                destroy-on-close>
+  <el-dialog v-model="dialog"
+             title="传染病上报"
+             fullscreen
+             @closed="emits('closed')">
     <dialog-diseases :pat-no="props.patNo"
                      :times="props.times"
-                     :ward="props.ward"
                      ref="dialogRef"/>
-
     <template #footer>
       <el-button @click="emits('closed')" type="danger">取消</el-button>
       <el-button v-el-btn="confirm" type="primary">确认</el-button>
     </template>
-  </xc-dialog-v2>
+  </el-dialog>
+
 </template>
 
-<script setup name='ReportOfInfectiousDiseases'>
+<script setup lang="ts">
 import DialogDiseases from "./DialogDiseases.vue";
-import XcDialogV2 from "@/components/xiao-chan/dialog/XcDialogV2.vue";
-
-const props = defineProps({
-  patNo: {
-    type: String,
-    default: null
-  },
-  times: {
-    type: Number,
-    default: 1
-  },
-  ward: {
-    type: String,
-    default: '8000001'
-  }
-})
-
-const emits = defineEmits(['closed'])
+import {ref} from 'vue'
+
+export declare type  PropsType = {
+  patNo: string,
+  times: number
+}
 
+const props = defineProps<PropsType>()
 
+const emits = defineEmits<{
+  (e: "closed"): void
+}>()
 const dialog = ref(true)
 const dialogRef = ref(null)
 

+ 1 - 2
src/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/yz-header/YzQueryCondition.vue

@@ -232,8 +232,7 @@
       v-if="crb"
       @closed="crb = false"
       :pat-no="huanZheXinXi.inpatientNo"
-      :times="huanZheXinXi.admissTimes"
-      :ward="huanZheXinXi.admissWard"/>
+      :times="huanZheXinXi.admissTimes"/>
 
   <!--  门诊预约 -->
   <outpatient-appointments v-if="outPatientDialog"

+ 3 - 1
src/main.js

@@ -19,6 +19,7 @@ import VElBtn from "@/directives/v-el-btn";
 import VTitle from "@/directives/v-title";
 import "driver.js/dist/driver.css";
 import DomZIndex from 'dom-zindex'
+import {addVxeTableFormats} from "@/utils/vxe-formatter";
 
 DomZIndex.getNext = () => {
     return useZIndex().nextZIndex()
@@ -29,8 +30,9 @@ DomZIndex.getCurrent = () => {
 }
 
 addRoutes()
+addVxeTableFormats()
 
-const app = createApp(App)
+export const app = createApp(App)
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
     app.component(key, component)
 }

+ 0 - 29
src/utils/copmToJs/useCompToJs.ts

@@ -1,29 +0,0 @@
-import {createVNode, render, Component, DefineComponent} from 'vue';
-import {app} from '../../main.js'
-
-type PropsType<T> = T extends DefineComponent<infer P, infer E> ? E : Record<string, any>;
-
-
-/**
- * 这个只适用 el-dialog 且必须发出 closed 事件
- * @param comp 组件
- * @param compData 组件props
- */
-const useCompToJs = <T extends Component>(comp: T, compData: PropsType<T>) => {
-    return new Promise<any>(resolve => {
-        const div = document.createElement('div')
-        document.body.appendChild(div)
-
-        const data = {
-            onClosed: (...val) => {
-                div.remove()
-                resolve(val)
-            },
-            ...compData
-        }
-        const vNode = createVNode(comp, data, null)
-        render(vNode, div)
-    })
-}
-
-export default useCompToJs

+ 21 - 17
src/utils/vxe-formatter.ts

@@ -1,23 +1,27 @@
 import {VXETable} from 'vxe-table'
 import XEUtils from "xe-utils";
 
-VXETable.formats.add('formatDate', {
-    cellFormatMethod({cellValue}, format: string = 'yy-MM-dd HH:mm') {
-        return XEUtils.toDateString(cellValue, format)
-    }
-})
+export function addVxeTableFormats() {
+    VXETable.formats.add('formatDate', {
+        cellFormatMethod({cellValue}, format: string = 'yy-MM-dd HH:mm') {
+            return XEUtils.toDateString(cellValue, format)
+        }
+    })
 
-VXETable.formats.add('formatSex', {
-    cellFormatMethod({cellValue}) {
-        if (cellValue) {
-            if (cellValue == 1) {
-                return '男'
-            }
-            if (cellValue == 2) {
-                return '女'
+    VXETable.formats.add('formatSex', {
+        cellFormatMethod({cellValue}) {
+            if (cellValue) {
+                if (cellValue == 1) {
+                    return '男'
+                }
+                if (cellValue == 2) {
+                    return '女'
+                }
+                return '其他'
             }
-            return '其他'
+            return ''
         }
-        return ''
-    }
-})
+    })
+}
+
+

+ 1 - 1
src/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/YiZhuLuRu.vue

@@ -80,9 +80,9 @@ import YzTableV2 from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/table/YzTable
 import FeeTable from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/FeeTable.vue";
 import {applicationForRevocation} from "@/api/zhu-yuan-yi-sheng/qrder-quash";
 import XEUtils from 'xe-utils'
-import {isDev} from "@/utils/public";
 import {ref, onMounted, onActivated, nextTick} from 'vue'
 import {CyMessageBox} from "@/components/cy/message-box";
+import DoctorSOrderFee from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/DoctorSOrderFee.vue";
 
 let allergen = ref({
   dialog: false,

+ 85 - 67
src/views/med-tec-mod/YiJiFeiYongLuRu.vue

@@ -10,77 +10,82 @@
     <el-tag effect="dark" size="small" type="warning">医保身份: {{ patient.responceTypeName }}</el-tag>
     <el-tag effect="dark" size="small">总费用: {{ patient.totalCharge }}</el-tag>
   </div>
-  <div>
-    住院号:
-    <el-input style="width: 80px" v-model="queryTerm.inpatientNo"
-              @keyup.enter="getHuanZheXinXiClick"></el-input>
-    <span v-show="queryTerm.zaiHuanChuYuan === 1">
+  <div style="overflow: auto">
+
+    <div style="width: max-content">
+      住院号:
+      <el-input style="width: 80px" v-model="queryTerm.inpatientNo"
+                @keyup.enter="getHuanZheXinXiClick"></el-input>
+      <span v-show="queryTerm.zaiHuanChuYuan === 1">
         住院次数:<el-input-number :min="0" :precision="0" style="width: 60px" v-model="queryTerm.admissTimes"
                                   :controls="false"></el-input-number>
       </span>
-    <el-divider direction="vertical"></el-divider>
-    <el-switch active-color="#ff4949" inactive-color="#13ce66" active-text="出院" inactive-text="在院"
-               :active-value="1"
-               :inactive-value="0" v-model="queryTerm.zaiHuanChuYuan">
-    </el-switch>
-    <el-divider direction="vertical"></el-divider>
-    项目名称:
-    <el-select v-model="queryTerm.chargeCode" remote filterable clearable
-               :remote-method="remoteMethodChargeCode">
-      <el-option v-for="item in chargeCodeNameData" :key="item.code" :label="item.name"
-                 :value="item.code">
-        <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
-        <el-divider direction="vertical"></el-divider>
-        <span>{{ item.name }}</span>
-      </el-option>
-    </el-select>
-    录入日期:
-    <el-date-picker
-        type="daterange"
-        v-model="queryTerm.dateRange"
-        placeholder="选择日期"
-        style="width: 200px"
-        range-separator="至"
-        start-placeholder="开始日期"
-        end-placeholder="结束日期"
-        :shortcuts="shortcuts"
-    ></el-date-picker>
-    <el-button
-        @click="queryTerm.riQiPaiXu === 'DESC' ? (queryTerm.riQiPaiXu = 'ASC') : (queryTerm.riQiPaiXu = 'DESC')"
-        type="success"
-        :icon="queryTerm.riQiPaiXu === 'DESC' ? 'CaretBottom' : 'CaretTop'"
-    >{{ queryTerm.riQiPaiXu === 'DESC' ? '降序' : '升序' }}
-    </el-button>
-    <el-select style="width: 70px" v-model="queryTerm.feiYongLeiXingCode">
-      <el-option v-for="item in feiYongLeiXing" :key="item.code" :label="item.name"
-                 :value="item.code">
-        <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
-        <el-divider direction="vertical"></el-divider>
-        <span>{{ item.name }}</span>
-      </el-option>
-    </el-select>
-    <el-select v-model="queryTerm.orderNo" style="width: 70px" @change="queryHuanZheFeiYong">
-      <el-option v-for="item in yiZhuTuiFeiLeiXing" :key="item.code" :label="item.name"
-                 :value="item.code">
-        <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
-        <el-divider direction="vertical"></el-divider>
-        <span>{{ item.name }}</span>
-      </el-option>
-    </el-select>
-    <el-select v-model="queryTerm.tuiFeiFlag" style="width: 70px" @change="queryHuanZheFeiYong">
-      <el-option v-for="item in tuiFeiLeiXin" :key="item.code" :label="item.name" :value="item.code">
-        <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
-        <el-divider direction="vertical"></el-divider>
-        <span>{{ item.name }}</span>
-      </el-option>
-    </el-select>
+      <el-divider direction="vertical"></el-divider>
+      <el-switch active-color="#ff4949" inactive-color="#13ce66" active-text="出院" inactive-text="在院"
+                 :active-value="1"
+                 :inactive-value="0" v-model="queryTerm.zaiHuanChuYuan">
+      </el-switch>
+      <el-divider direction="vertical"></el-divider>
+      项目名称:
+      <el-select v-model="queryTerm.chargeCode" remote filterable clearable
+                 :remote-method="remoteMethodChargeCode">
+        <el-option v-for="item in chargeCodeNameData" :key="item.code" :label="item.name"
+                   :value="item.code">
+          <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      录入日期:
+      <el-date-picker
+          type="daterange"
+          v-model="queryTerm.dateRange"
+          placeholder="选择日期"
+          style="width: 200px"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :shortcuts="shortcuts"
+      ></el-date-picker>
+      <el-button
+          @click="queryTerm.riQiPaiXu === 'DESC' ? (queryTerm.riQiPaiXu = 'ASC') : (queryTerm.riQiPaiXu = 'DESC')"
+          type="success"
+          :icon="queryTerm.riQiPaiXu === 'DESC' ? 'CaretBottom' : 'CaretTop'"
+      >{{ queryTerm.riQiPaiXu === 'DESC' ? '降序' : '升序' }}
+      </el-button>
+      <el-select style="width: 70px" v-model="queryTerm.feiYongLeiXingCode">
+        <el-option v-for="item in feiYongLeiXing" :key="item.code" :label="item.name"
+                   :value="item.code">
+          <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-select v-model="queryTerm.orderNo" style="width: 70px" @change="queryHuanZheFeiYong">
+        <el-option v-for="item in yiZhuTuiFeiLeiXing" :key="item.code" :label="item.name"
+                   :value="item.code">
+          <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-select v-model="queryTerm.tuiFeiFlag" style="width: 70px" @change="queryHuanZheFeiYong">
+        <el-option v-for="item in tuiFeiLeiXin" :key="item.code" :label="item.name" :value="item.code">
+          <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
 
-    <el-select v-model="queryTerm.dept" style="width: 100px">
-      <el-option v-for="(value,key) in deptList"
-                 :value="key" :label="value"/>
-    </el-select>
-    <el-button type="primary" @click="getHuanZheXinXiClick">查询</el-button>
+      <el-select v-model="queryTerm.dept" style="width: 100px">
+        <el-option v-for="(value,key) in deptList"
+                   :value="key" :label="value"/>
+      </el-select>
+      <el-button type="primary" @click="getHuanZheXinXiClick">查询</el-button>
+      <el-button type="success" icon="RefreshRight" @click="rcvrcalcost">费用接收重算</el-button>
+    </div>
   </div>
+
   <div>
     <el-tabs v-model="elTabPane">
       <ElTabPane label="已录入费用" name="ylrfy">
@@ -118,7 +123,9 @@ import {downloadExcel} from '@/utils/excel'
 import {getServerDateApi} from "@/api/public-api";
 import {userInfoStore} from "@/utils/store-public";
 import router from "@/router";
-import {stringIsBlank, stringNotBlank} from "@/utils/blank-utils";
+import {stringNotBlank} from "@/utils/blank-utils";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
+import {receiveAndRecalculateCost} from "@/api/inpatient/patient";
 
 const dangQianShiJian = new Date()
 const deptList = userInfoStore.value.partTimeDeptMap
@@ -265,6 +272,17 @@ const theUploadIsSuccessful = async () => {
   queryHuanZheFeiYong()
 }
 
+function rcvrcalcost() {
+  if (!patient.value.inpatientNo) {
+    return xcMessage.error('请先查询出病人信息')
+  }
+
+  receiveAndRecalculateCost(patient.value).then(res => {
+    getHuanZheXinXiClick()
+  })
+
+}
+
 onMounted(() => {
   const temp = router.currentRoute.value.query.patNo
   if (stringNotBlank(temp)) {