Przeglądaj źródła

Merge branch 'master' into 淮海科技

# Conflicts:
#	src/views/medical-insurance/inpatient/SettleVerification.vue
lighter 4 dni temu
rodzic
commit
4b700add2b

+ 17 - 0
src/api/inspections/yj-req.js

@@ -0,0 +1,17 @@
+import request from '../../utils/request'
+
+export function queryYjReqIndex(data) {
+  return request({
+    url: '/yjReq/queryYjReqIndex',
+    method: 'post',
+    data,
+  })
+}
+
+export function uploadYjPdf(data) {
+  return request({
+    url: '/yjReq/uploadYjPdf',
+    method: 'post',
+    data,
+  })
+}

+ 19 - 6
src/components/medical-insurance/medfee-analyse/Index.vue

@@ -1,7 +1,11 @@
 <template>
   <div class="component-box-wrapper__fullscreen layout_container" :style="{zIndex}">
-    <div style="font-size: 18px !important; margin-bottom: 20px">医保费用明细</div>
-    <div style="position: fixed; top: 12px; right: 20px; width: 100%; text-align: right">
+    <div style="display: flex; margin-bottom: 20px">
+      <div style="font-size: 18px !important;">
+        医保费用明细
+      </div>
+    </div>
+    <div style="position: fixed; top: 12px; right: 20px; width: 120px; text-align: right">
       <el-button circle icon="Download" title="导出Excel" type="primary" @click="exportExcel"></el-button>
       <el-button circle icon="Close" title="关闭" type="danger" @click="close"></el-button>
     </div>
@@ -88,14 +92,18 @@ import {useZIndex} from "element-plus";
 import {Export} from "@/utils/ExportExcel";
 
 const props = defineProps({
-  type: {
+  setlStatus: {
     type: String,
     default: 'settled',
   },
   mdtrtId: {
     type: String,
     required: true,
-  }
+  },
+  setlType: {
+    type: String,
+    default: '21',
+  },
 })
 
 const emits = defineEmits(['close'])
@@ -144,7 +152,8 @@ const handleClickChrgLv = (key, level) => {
 const fetchFeedtle = () => {
   const param = {
     mdtrtId: props.mdtrtId,
-    type: props.type,
+    setlStatus: props.setlStatus,
+    setlType: props.setlType,
   }
   queryFeeDetails(param).then((res) => {
     psninfo.value = res.psninfo
@@ -182,8 +191,12 @@ const close = () => {
 const zIndex = ref(0)
 onMounted(() => {
   zIndex.value = useZIndex().nextZIndex()
-  fetchFeedtle()
+  if (props.mdtrtId) {
+    fetchFeedtle()
+  }
 })
+
+defineExpose({fetchFeedtle})
 </script>
 
 <style scoped>

+ 13 - 0
src/utils/emr/emr-init-v2.ts

@@ -281,3 +281,16 @@ export enum RevisionShowMode {
   卡片,
   嵌入,
 }
+
+export function getBusiness(editor: EditType) {
+  const tmp = editor.getDataElements("business", true);
+
+  const data = {};
+  for (const key in tmp) {
+    const item = tmp[key];
+    if (key !== item.id) {
+      data[key] = item;
+    }
+  }
+  return data;
+}

+ 2 - 1
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/EmrMain.vue

@@ -158,6 +158,7 @@ import { EmrEditCreateLimit } from "@/views/hospitalization/zhu-yuan-yi-sheng/el
 import { DataElements, EditorMode, EditType, Runtime } from "@/utils/emr/edit";
 import {
   getBcjlUserInfo,
+  getBusiness,
   parsingFragmentDataElements,
   RevisionShowMode,
   useEmrInit,
@@ -624,7 +625,7 @@ const clickSaveData = async () => {
   };
 
   if (!isCourse()) {
-    data.emrDataElement = editor.getDataElements("business", false, true);
+    data.emrDataElement = getBusiness(editor);
   }
 
   const saveErrorMsg = await triggerScript(

+ 5 - 0
src/views/hospitalization/zhu-yuan-yi-sheng/jian-cha-jian-yan-shen-qing/components/public/JcJyTemplate.vue

@@ -99,6 +99,11 @@ const selectAll = data => {
       show-overflow
     >
       <vxe-column type="checkbox" title="名称" />
+      <vxe-column title="部位/标本">
+        <template #default="{ row }">
+          {{ row.inspectPartName }}{{ row.inspectStuffName }}
+        </template>
+      </vxe-column>
     </vxe-table>
 
     <template #footer>

+ 153 - 0
src/views/med-tec-mod/JcReportUpload.vue

@@ -0,0 +1,153 @@
+<template>
+  <div class="layout_container">
+    <header class="round-header">
+      <el-date-picker
+          type="daterange"
+          v-model="daterange"
+          :shortcuts="shortcuts"
+          style="width: 200px"
+          :clearable="false"
+      />
+      <el-input
+          v-model="inquiry.patNo"
+          clearable
+          placeholder="住院号/门诊ID"
+          style="width: 100px;margin-left: 12px"
+      />
+      <el-divider direction="vertical" />
+      <el-button
+        type="primary"
+        @click="getYjReq"
+      >
+        查询医技申请
+      </el-button>
+    </header>
+    <div class="layout_container layout-horizontal">
+      <aside class="layout_el-table">
+        <el-table
+          :data="yjReqList"
+          stripe
+          highlight-current-row
+          @row-click="handleClickRow"
+        >
+          <el-table-column prop="patNo" :label="patNoType" width="70"/>
+          <el-table-column prop="patName" label="患者姓名" width="70" />
+          <el-table-column prop="reqNo" label="申请号" width="90" />
+          <el-table-column prop="groupName" label="申请内容" width="140" />
+          <el-table-column prop="reqDate" label="申请时间" width="130" />
+        </el-table>
+      </aside>
+      <div class="layout_main">
+        <div>
+          报告文件:请上传报告pdf文件
+          <el-upload
+              class="upload-demo"
+              ref="upload"
+              :action="apiUrl + '/yjReq/uploadYjPdf'"
+              :headers="header"
+              :file-list="fileList"
+              :limit="1"
+              :data="currentReq"
+              :on-exceed="fileSizeOutLimit"
+              :on-success="uploadSuccess"
+              :on-error="uploadError"
+              :auto-upload="false"
+              accept=".pdf"
+          >
+            <template #trigger>
+              <el-button type="primary" icon="Picture">选取文件</el-button>
+            </template>
+            <el-button
+                style="margin-left: 10px"
+                type="success"
+                icon="Upload"
+                @click="submitUpload"
+            >上传到服务器
+            </el-button>
+            <template #tip>
+              <div class="el-upload__tip">
+                只能上传 pdf 文件
+              </div>
+            </template>
+          </el-upload>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import {queryYjReqIndex,uploadYjPdf} from "@/api/inspections/yj-req.js";
+import {shortcuts} from "@/data/shortcuts.js";
+import {getDateRangeFormatDate, getOneMonthOffset} from "@/utils/date.js";
+import { isDev } from "@/utils/public";
+import env from "@/utils/setting";
+import {ref} from "vue";
+import {ElMessage} from "element-plus";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
+
+const daterange = ref([])
+const inquiry = reactive({
+  patNo: '',
+  start: '',
+  end: ''
+})
+
+const patNoType = computed(() => {
+  if (yjReqList.value.length === 0) {
+    return ''
+  }
+  let req = yjReqList.value[0]
+  return req.patientType === 'INPATIENT' ? '住院号' : '门诊ID'
+})
+const yjReqList = ref([])
+function getYjReq() {
+  const m = getDateRangeFormatDate(daterange.value)
+  inquiry.start = m.startTime
+  inquiry.end = m.endTime
+  queryYjReqIndex(inquiry).then(res => {
+    console.log(res)
+    yjReqList.value = res
+  })
+}
+
+const upload = ref(null);
+const currentReq = ref({})
+const apiUrl = env.VITE_BASE_URL;
+const header = {
+  token: localStorage.token,
+};
+
+function handleClickRow(row) {
+  currentReq.value = row
+}
+
+const fileList = ref([]);
+const submitUpload = () => {
+  if (!currentReq.value.reqNo) {
+    xcMessage.warning('请先选择一条医技申请!')
+    return;
+  }
+  upload.value.submit();
+};
+const fileSizeOutLimit = () => {
+  ElMessage.error("已经选取报告文件,如须更换请先移除已选取的文件!");
+};
+const uploadSuccess = () => {
+  ElMessage.success("上传成功!");
+  fileList.value = [];
+};
+const uploadError = () => {
+  ElMessage.error("上传失败!");
+};
+
+onMounted(() => {
+  const m = getOneMonthOffset()
+  daterange.value[0] = m.start
+  daterange.value[1] = m.end
+  if (isDev) {
+    daterange.value[0] = '2025-06-01'
+    inquiry.patNo = '317452-0'
+  }
+})
+</script>

+ 58 - 23
src/views/medical-insurance/allpatient/SiSettleDetailList.vue

@@ -61,12 +61,19 @@
     <div v-if="showOperatePane" style="margin-left: 30px; padding: 20px 0">
       <div>
         <div style="display: inline-block; width: 70px">患者类别:</div>
-        <el-radio v-model="outParam.type" :label="21" @change="setlTypeChange"
-          >住院</el-radio
-        >
-        <el-radio v-model="outParam.type" :label="11" @change="setlTypeChange"
-          >门诊</el-radio
-        >
+        <el-radio
+            v-model="outParam.type"
+            :label="21"
+            @change="setlTypeChange"
+          >
+          住院
+        </el-radio>
+        <el-radio
+            v-model="outParam.type"
+            :label="11"
+            @change="setlTypeChange">
+          门诊
+        </el-radio>
       </div>
       <div style="margin-top: 8px">
         <el-input
@@ -80,21 +87,20 @@
           v-model="outParam.label"
           @focus="getTimesList"
           placeholder="结算条目"
-          style="width: 230px"
         >
           <el-option
             v-for="item in timesList"
             :key="item.setlId"
             :value="item.label"
           >
-            <span style="color: #8492a6; font-size: 12px">{{
-              item.times
-            }}</span>
+            <span style="color: #8492a6; font-size: 12px">
+              {{item.times }}
+            </span>
             <el-divider direction="vertical"></el-divider>
             <span v-show="outParam.type === 21">
-              <span style="color: #8492a6; font-size: 12px">{{
-                item.ledgerSn
-              }}</span>
+              <span style="color: #8492a6; font-size: 12px">
+                {{item.ledgerSn }}
+              </span>
               <el-divider direction="vertical"></el-divider>
             </span>
             <span>{{ item.endtime }}</span>
@@ -102,10 +108,26 @@
         </el-select>
       </div>
       <div style="width: 100%; text-align: right; margin-top: 8px">
-        <el-button icon="Printer" @click="siPrint">打印</el-button>
-        <el-button type="primary" icon="Search" @click="executeQrySetlinfo">
-          查找</el-button
+        <el-button
+            type="primary"
+            icon="Search"
+            @click="executeQrySetlinfo"
         >
+          查询
+        </el-button>
+        <el-button
+          icon="Document"
+          type="primary"
+          @click="displayFeeDetl"
+        >
+          费用明细
+        </el-button>
+        <el-button
+            icon="Printer"
+            @click="siPrint"
+        >
+          打印
+        </el-button>
       </div>
       <div
         style="
@@ -121,13 +143,19 @@
     <div v-else style="position: fixed; top: 6px; right: 30px">
       <el-button type="danger" icon="Printer" @click="siPrint">打印</el-button>
     </div>
+    <MedfeeAnalyse
+        v-if="showFeeDetl"
+        setl-status="settled"
+        :mdtrt-id="setlinfo.mdtrtId"
+        :setl-type="outParam.type"
+        @close="showFeeDetl = false"
+    />
   </div>
 </template>
 
 <script setup>
 import { initLodop, getLodop } from "@/utils/c-lodop";
 import { computed, onMounted, reactive, ref } from "vue";
-import { ElMessage } from "element-plus";
 import router from "@/router";
 import {
   querySiSetlList,
@@ -138,6 +166,8 @@ import InpatientSetlList from "@/components/medical-insurance/settle-detail-list
 import OtherOutpatientSetlList from "@/components/medical-insurance/settle-detail-list/OtherOutpatientSetlList.vue";
 import EmployeeOutpatientSetlList from "@/components/medical-insurance/settle-detail-list/EmployeeOutpatientSetlList.vue";
 import env from "../../../utils/setting";
+import MedfeeAnalyse from "@/components/medical-insurance/medfee-analyse/Index.vue";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
 
 const path = router.currentRoute.value.fullPath;
 const showOperatePane = path === "/medins/qryManage/siSettleDetailList";
@@ -229,12 +259,7 @@ const executeQrySetlinfo = () => {
 
 const siPrint = () => {
   if (!setlinfo.value.mdtrtId) {
-    ElMessage({
-      message: "无法打印空白的结算清单!",
-      type: "warning",
-      duration: 2000,
-      showClose: true,
-    });
+    xcMessage.warning("无法打印空白的结算清单!")
     return;
   }
   const prntStyle =
@@ -267,6 +292,16 @@ onMounted(() => {
     executeQrySetlinfo();
   }
 });
+
+const showFeeDetl = ref(false);
+
+function displayFeeDetl() {
+  if (!setlinfo.value.mdtrtId) {
+    xcMessage.warning('请先查询结算单!')
+    return;
+  }
+  showFeeDetl.value = true
+}
 </script>
 
 <style scoped>

+ 1 - 1
src/views/medical-insurance/inpatient/InHospFeeUpload.vue

@@ -199,7 +199,7 @@
   </el-dialog>
   <MedfeeAnalyse
     v-if="showFeeDetl"
-    type="unsettled"
+    setl-status="unsettled"
     :mdtrt-id="patient.mdtrtId"
     @close="showFeeDetl = false"
   />

+ 2 - 3
src/views/mz-emr/emr-v2/index.tsx

@@ -10,6 +10,7 @@ import {
 } from "@/api/mz-emr/mz-emr";
 import { EditType, Runtime } from "@/utils/emr/edit";
 import {
+  getBusiness,
   getCurrentPersonnelInformation,
   UseEmrInitReturn,
 } from "@/utils/emr/emr-init-v2";
@@ -410,9 +411,7 @@ export const useMzEmrStore = () => {
           type: "success",
         });
         const tmpSaveParams = {
-          emrDataElement: JSON.stringify(
-            editor.getDataElements("business", false, true)
-          ),
+          emrDataElement: JSON.stringify(getBusiness(editor)),
           emrDocumentId: id,
           document: { document: editor!.getDocument() },
         };