xiaochan 1 år sedan
förälder
incheckning
4d76beacf2

+ 33 - 59
src/components/inpatient/XiangMuLuRu.vue

@@ -178,7 +178,8 @@
                 </el-button>
               </div>
               <div class="layout_flex_1-y">
-                <el-table :data="muBanNeiRongData" height="100%" class="eltable"
+                <el-table :data="saveData"
+                          height="100%" class="eltable"
                           highlight-current-row
                           stripe>
                   <el-table-column label="录入信息">
@@ -287,16 +288,15 @@
       </el-collapse-item>
     </el-collapse>
   </el-dialog>
-  <el-dialog v-model="xinZhengXiangMuDialog" :width="1500" title="新增项目">
+  <el-dialog v-model="xinZhengXiangMuDialog"
+             :width="1500"
+             title="新增项目">
     <el-row>
-      <el-alert
-          effect="dark"
-          title="添加项目无需一个个点击保存了,在下拉框中选中添加到表格中,然后在点击保存,会一次性把下面表格中的数据添加,如果有重复的会自动数量加一。"
-          type="warning"/>
-      <br/>
       <el-col :span="24">
         搜索:
-        <el-select v-model="chargePyCode" :remote-method="rmChargePyCode" clearable
+        <el-select v-model="chargePyCode"
+                   :remote-method="rmChargePyCode"
+                   clearable
                    default-first-option
                    style="width: 220px"
                    filterable remote @change="getDanGeXiangMu">
@@ -412,6 +412,8 @@ import RefundForProjectEntry from "@/components/med-tec-mod/RefundForProjectEntr
 import XcComboGrid from "@/components/xiao-chan/combo-grid/XcComboGrid.vue";
 import {xcMessage} from "@/utils/xiaochan-element-plus";
 import {useUserStore} from "@/pinia/user-store";
+import cyRefList from "@/utils/cyRefList";
+import Dig from "@/utils/math";
 
 const emit = defineEmits(['close-xmlr'])
 const userInfo = useUserStore().userInfo
@@ -593,45 +595,33 @@ const xiangMuTuiFeiClick = () => {
 }
 
 //////////////////////////////////// 以上全部是 已录入项目 //////////////////////////////////////////////////////////////////////////////
-/**
- * 获取项目模板详情的数据
- */
-const muBanNeiRongData = ref([])
-
-const muBanCodeComp = computed(() => {
-  let temp = []
-  muBanNeiRongData.value.forEach((item) => {
-    temp.push(item.chargeCodeMx)
-  })
-  return temp
-})
+const [saveData, saveProxy] = cyRefList('chargeCodeMx', (item) => {
+  return `项目${item.chargeCodeName}请勿重复添加。`
+});
 
-const xuanZeXiangMuTable = (param) => {
-  let val = param.val
+const xuanZeXiangMuTable = (val) => {
   for (let i = 0; i < val.length; i++) {
-    let code = val[i].chargeCodeMx
-    if (muBanCodeComp.value.indexOf(code) === -1) {
-      val[i].deptCode = patient.value.zkWard
-      muBanNeiRongData.value.push(val[i])
-    }
+    val[i].deptCode = patient.value.zkWard
   }
+  saveProxy.push(...val)
 }
 
 /**
  * 删除项目
  */
 const shanChuXiangMuClick = (index) => {
-  muBanNeiRongData.value.splice(index, 1)
+  saveProxy.delIndex(index);
 }
+
 /**
  * 获取项目的总价
  */
 const xiangMuZongJia = computed(() => {
   let sum = 0
-  for (let i = 0; i < muBanNeiRongData.value.length; i++) {
-    sum += muBanNeiRongData.value[i].chargeAmount * muBanNeiRongData.value[i].amount
+  for (let i = 0; i < saveData.value.length; i++) {
+    sum += Dig.multiply(saveData.value[i].chargeAmount, saveData.value[i].amount)
   }
-  return sum.toFixed(2)
+  return XEUtils.toFixed(sum, 2);
 })
 
 //以下全部是  新增项目 对话框功能
@@ -683,24 +673,8 @@ const danGeXiangMuBaoCun = () => {
     ElMessage.error('请选择需要添加的项目')
     return
   }
-  let noticeCount = 0;
-
-  function notice() {
-    if (noticeCount === 0) {
-      noticeCount++
-      xcMessage.warning('存在相同项目,数量加一了。')
-    }
-  }
 
-  danGeLuRuXiangMu.value.forEach(item => {
-    let index = muBanCodeComp.value.indexOf(item.chargeCodeMx)
-    if (index > -1) {
-      muBanNeiRongData.value[index].amount += 1
-      notice()
-    } else {
-      muBanNeiRongData.value.push(clone(item))
-    }
-  })
+  saveProxy.push(...danGeLuRuXiangMu.value)
 
   danGeLuRuXiangMu.value = []
   chargePyCode.value = ''
@@ -710,17 +684,17 @@ const danGeXiangMuBaoCun = () => {
 
 // 下面就是上传 项目
 const shangChuanXiangMu = () => {
-  if (muBanNeiRongData.value.length === 0) {
+  if (saveData.value.length === 0) {
     ElMessage.error({
       message: '请先选择需要上传的费用',
       showClose: true,
     })
     return
   }
-  for (let i = 0; i < muBanNeiRongData.value.length; i++) {
-    if (muBanNeiRongData.value[i].deptCode === '') {
+  for (let i = 0; i < saveData.value.length; i++) {
+    if (saveData.value[i].deptCode === '') {
       ElMessage.error({
-        message: '【' + muBanNeiRongData.value[i].chargeName + '】的执行科室为空',
+        message: '【' + saveData.value[i].chargeName + '】的执行科室为空',
         showClose: true,
       })
       return
@@ -734,17 +708,17 @@ const shangChuanXiangMu = () => {
     zySerialNo: patient.value.zySerialNo,
     ward: patient.value.zkWard,
     referPhysician: patient.value.referPhysician,
-    list: muBanNeiRongData.value,
+    list: saveData.value,
     orderNo: 0,
   }
   // 在此处上传
-  ElMessageBox.confirm('共上传【' + muBanNeiRongData.value.length + '】条', '请认真核对', {
+  ElMessageBox.confirm('共上传【' + saveData.value.length + '】条', '请认真核对', {
     cancelButtonText: '取消',
     confirmButtonText: '确定',
   })
       .then(() => {
         xiangMuFeiYongShangChuan(shangChuanFeiYong).then(() => {
-          muBanNeiRongData.value = []
+          saveData.value = []
         })
       })
       .catch(() => {
@@ -766,7 +740,7 @@ const cunMuBanPojo = ref({
 
 const baoCunMuBanDialog = ref(false)
 const baoCunMuBan = () => {
-  if (muBanNeiRongData.value.length === 0) {
+  if (saveData.value.length === 0) {
     ElMessage.error({
       message: '请先选择项目',
       showClose: true,
@@ -780,7 +754,7 @@ const baoCunMuBan = () => {
     })
     return
   }
-  cunMuBanPojo.value.list = clone(muBanNeiRongData.value)
+  cunMuBanPojo.value.list = clone(saveData.value)
   // 开始上传
   shangChuanMuBan(cunMuBanPojo.value).then(() => {
     cunMuBanPojo.value = {}
@@ -834,8 +808,8 @@ onMounted(async () => {
 
 
 const xieGaiZhiXingKeShi = () => {
-  for (let i = 0; i < muBanNeiRongData.value.length; i++) {
-    muBanNeiRongData.value[i].deptCode = zhiXingKeShi.value
+  for (let i = 0; i < saveData.value.length; i++) {
+    saveData.value[i].deptCode = zhiXingKeShi.value
   }
 }
 

+ 1 - 1
src/components/med-tec-mod/HuoQuMuBan.vue

@@ -138,7 +138,7 @@ const muBanXiangQing = ref({
 function confirmTemplate() {
   const data = detailsTableRef.value.getSelectionRows();
   if (data.length > 0) {
-    emit('selectionFeiYong', {val: data})
+    emit('selectionFeiYong', data)
   }
   dialog.value = false
 }

+ 66 - 67
src/components/med-tec-mod/YiJiXiangMuLuRu.vue

@@ -33,15 +33,15 @@
         </el-select>
         手术编码:
         <el-input
-            v-model.number="ssCode"
+            v-model="ssCode"
+            @blur="ssCode = ssCode.trim()"
             clearable
-            type="number"
             placeholder="请输入手术编码"
             style="width: 120px"/>
         <el-tag type="danger"> 项目总价:{{ xiangMuZongJia }}</el-tag>
       </div>
       <div class="layout_flex_1-y">
-        <el-table :data="feiYongShuJu"
+        <el-table :data="saveData"
                   height="100%"
                   highlight-current-row
                   stripe
@@ -193,7 +193,7 @@
   </el-dialog>
 </template>
 
-<script setup>
+<script setup lang="ts">
 import {computed, onMounted, ref, watch} from 'vue'
 import {
   getBingQuDuiYingKeShi,
@@ -209,15 +209,22 @@ import {getRenYuan} from '@/api/public-api'
 import {ElMessage, ElMessageBox} from 'element-plus'
 import {clone} from '@/utils/clone'
 import HuoQuMuBan from './HuoQuMuBan.vue'
-import {stringIsBlank} from "@/utils/blank-utils";
+import {stringIsBlank, stringNotBlank} from "@/utils/blank-utils";
 import {BizException, ExceptionEnum} from "@/utils/BizException";
 import {useUserStore} from "@/pinia/user-store";
+import cyRefList from "@/utils/cyRefList";
+import Dig from "@/utils/math";
+import XEUtils from "xe-utils";
 
-const props = defineProps({
+const props = defineProps<{
   patient: {
-    type: Object,
-  },
-})
+    inpatientNo: string;
+    admissTimes: number;
+    zySerialNo: string;
+    referPhysician: string;
+    ledgerSn: number
+  }
+}>()
 
 const emits = defineEmits(['theUploadIsSuccessful'])
 
@@ -233,35 +240,50 @@ const queryWard = ref('')
 
 const xiaoKeShiList = ref([])
 
+declare type ChargeCodeType = {
+  chargeCodeMx: string;
+  serial: string;
+  chargeName: string
+  deptCode: string;
+  chargeAmount: number
+  amount: number
+}
+
+const [saveData, saveProxy] = cyRefList<ChargeCodeType>((item) => {
+  return item.chargeCodeMx.trim() + "_" + item.serial.trim();
+}, (item) => {
+  return `项目【${item.chargeName}】请勿重复添加`
+});
+
 // 获取选择的数据
-const xuanZeXiangMuTable = ({val: value}) => {
+const xuanZeXiangMuTable = (value) => {
   for (let i = 0; i < value.length; i++) {
     const item = value[i];
-    let key;
-    if (item.serial !== '00') {
-      key = item.chargeCodeMx.trim() + item.serial.trim()
-    } else {
-      key = item.chargeCodeMx.trim()
-    }
-    if (chargeCode.value.indexOf(key) === -1) {
-      chargeCode.value.push(key);
-      item.deptCode = userStore.deptCode;
-      feiYongShuJu.value.push(item);
-    }
+    item.deptCode = userStore.deptCode;
   }
+  saveProxy.push(...value)
 }
 
 const chargeCode = ref([])
 
-const feiYongShuJu = ref([])
-
 const shangChuanXiangMu = () => {
-
-  if (operationRoom() && stringIsBlank(ssCode)) {
+  if (operationRoom() && stringIsBlank(ssCode.value)) {
     BizException(ExceptionEnum.LOGICAL_ERROR, "请填写手术编码。");
   }
 
-  let shangChuanFeiYong = {
+  if (operationRoom() && stringNotBlank(ssCode.value) && !XEUtils.isStringNumber(ssCode.value)) {
+    BizException(ExceptionEnum.LOGICAL_ERROR, "手术编码必须纯数字且中间不得有空格。");
+  }
+
+  if (stringIsBlank(props.patient.inpatientNo)) {
+    BizException(ExceptionEnum.LOGICAL_ERROR, "请先选择患者。");
+  }
+
+  if (saveData.value.length === 0) {
+    BizException(ExceptionEnum.LOGICAL_ERROR, "请先选择上传数据。");
+  }
+
+  const shangChuanFeiYong = {
     // 这里又要反回来 就尼玛坑爹 我也不知道为什么
     dept: queryWard.value,
     ward: queryDept.value,
@@ -270,24 +292,19 @@ const shangChuanXiangMu = () => {
     zySerialNo: props.patient.zySerialNo,
     ssCode: ssCode.value,
     referPhysician: props.patient.referPhysician,
-    list: feiYongShuJu.value,
+    list: saveData.value,
     orderNo: 3,
     ledgerSn: props.patient.ledgerSn,
   };
 
-
-  if (feiYongShuJu.value.length === 0) {
-    return ElMessage.error('请先选择上传数据。')
-  }
-
   //在此处上传
-  ElMessageBox.confirm('共上传【' + feiYongShuJu.value.length + '】条', '请认真核对', {
+  ElMessageBox.confirm('共上传【' + saveData.value.length + '】条', '请认真核对', {
     cancelButtonText: '取消',
     confirmButtonText: '确定',
   })
       .then(() => {
         xiangMuFeiYongShangChuan(shangChuanFeiYong).then(() => {
-          feiYongShuJu.value = []
+          saveData.value = []
           chargeCode.value = []
           emits('theUploadIsSuccessful')
         })
@@ -297,8 +314,7 @@ const shangChuanXiangMu = () => {
 }
 
 const shanChuXiangMuClick = (val) => {
-  feiYongShuJu.value.splice(val, 1)
-  chargeCode.value.splice(val, 1)
+  saveProxy.delIndex(val)
 }
 // 新增项目或者药品
 const xinZhengXiangMuDialog = ref(false)
@@ -324,38 +340,21 @@ const rmChargePyCode = () => {
   }
 }
 
-const danGeXiangMuBaoCun = (val) => {
-  let key
-  if (xiangMuHuoYaoPinFlag.value === 1) {
-    key = val.chargeCodeMx.trim() + val.serial.trim()
-  } else {
-    key = val.chargeCodeMx.trim()
-  }
-
-  if (chargeCode.value.indexOf(key) > -1) {
-    return ElMessage.warning({
-      message: '请勿重复录入',
-      showClose: true,
-    })
-  } else {
-    if (typeof val.deptCode === 'undefined') {
-      val.deptCode = userStore.deptCode
-    }
-    feiYongShuJu.value.push(val)
-    chargeCode.value.push(key)
-    ElMessage.success({
-      message: '添加成功',
-      showClose: true,
-    })
+const danGeXiangMuBaoCun = (val: ChargeCodeType) => {
+  if (stringIsBlank(val.deptCode)) {
+    val.deptCode = userStore.deptCode
   }
+  saveProxy.push(val);
 }
 
 const xiangMuZongJia = computed(() => {
   let sum = 0
-  for (let i = 0; i < feiYongShuJu.value.length; i++) {
-    sum += feiYongShuJu.value[i].chargeAmount * feiYongShuJu.value[i].amount
-  }
-  return sum.toFixed(2)
+
+  saveData.value.forEach((item) => {
+    sum += Dig.multiply(item.chargeAmount, item.amount)
+  })
+
+  return XEUtils.toFixed(sum, 2)
 })
 
 // 以下是保存模板
@@ -382,7 +381,7 @@ const zhuanPinYin = () => {
 }
 
 const baoCunMuBan = () => {
-  if (feiYongShuJu.value.length === 0) {
+  if (saveData.value.length === 0) {
     ElMessage.error({
       message: '请先选择项目',
       showClose: true,
@@ -396,7 +395,7 @@ const baoCunMuBan = () => {
     })
     return
   }
-  cunMuBanPojo.value.list = clone(feiYongShuJu.value)
+  cunMuBanPojo.value.list = clone(saveData.value)
   // 开始上传
   shangChuanMuBan(cunMuBanPojo.value).then(() => {
     cunMuBanPojo.value = {}
@@ -412,8 +411,8 @@ const getBingQuDuiYingKeShiChange = () => {
 const zhiXingKeShi = ref(userStore.deptCode)
 
 const xieGaiZhiXingKeShi = () => {
-  for (let i = 0; i < feiYongShuJu.value.length; i++) {
-    feiYongShuJu.value[i].deptCode = zhiXingKeShi.value
+  for (let i = 0; i < saveData.value.length; i++) {
+    saveData.value[i].deptCode = zhiXingKeShi.value
   }
 }
 

+ 31 - 12
src/utils/cyRefList.ts

@@ -1,13 +1,23 @@
 import {ref, computed, Ref} from 'vue'
 import XEUtils from "xe-utils";
 import {BizException, ExceptionEnum} from "@/utils/BizException";
+import {stringIsBlank} from "@/utils/blank-utils";
 
-function cyRefList<T = any>(code: keyof T, errMsg: string = '请勿重复添加') {
+declare type CodeType<T> = keyof T & string | ((item: T) => string);
+
+function cyRefList<T = any>(code: CodeType<T>, errMsg: (item: T) => string = () => '请勿重复添加') {
     const list: Ref<T[]> = ref([])
     const watchFunc: Function[] = []
 
+    const codeIsFunction = typeof code === 'function'
+
     const codeKey = computed<string[]>(() => {
-        return XEUtils.eachAndReturnList(list.value, (item) => item[code]);
+        return XEUtils.eachAndReturnList(list.value, (item) => {
+            if (codeIsFunction) {
+                return code(item)
+            }
+            return item[code]
+        });
     });
 
     function sendListening(items: any) {
@@ -19,18 +29,30 @@ function cyRefList<T = any>(code: keyof T, errMsg: string = '请勿重复添加'
 
     const listProxy = {
         push: function (...items: T[]) {
+            const msgList: string[] = []
+
             items.forEach((item: T) => {
-                const key = item[code] as string
-                if (!XEUtils.has(item, code as string)) {
-                    throw new Error('对象没有包含key字段')
+                let key: string;
+                if (codeIsFunction) {
+                    key = code(item)
+                } else {
+                    key = item[code] as string
+                }
+                if (stringIsBlank(key)) {
+                    BizException(ExceptionEnum.MESSAGE_ERROR, "没有找到唯一值");
                 }
                 if (codeKey.value.includes(key)) {
-                    BizException(ExceptionEnum.MESSAGE_ERROR, errMsg);
+                    const msg = errMsg(item)
+                    msgList.push(msg)
                 }
             })
-
+            if (msgList.length === 1) {
+                BizException(ExceptionEnum.MESSAGE_ERROR, msgList[0]);
+            } else if (msgList.length > 0) {
+                BizException(ExceptionEnum.MESSAGE_HTML_ERROR, msgList.join("<br/>"));
+            }
             sendListening(items).then(r => {
-            })
+            });
             // @ts-ignore
             return list.value.push(...items)
         },
@@ -69,10 +91,7 @@ function cyRefList<T = any>(code: keyof T, errMsg: string = '请勿重复添加'
     }
 
 
-    return {
-        R: list,
-        P: listProxy
-    }
+    return [list, listProxy]
 }
 
 export default cyRefList

+ 2 - 2
src/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng.ts

@@ -713,9 +713,9 @@ export declare type AddJcParams = {
 }
 
 // 添加检查申请
-export const {R: jcList, P: jcProxy} = cyRefList<AddJcParams>('orderCode')
+export const [jcList, jcProxy] = cyRefList<AddJcParams>('orderCode')
 // 添加检查申请
-export const {R: jyList, P: jyProxy} = cyRefList<{
+export const [jyList, jyProxy] = cyRefList<{
     orderCode: string
 }>('orderCode')