|  | @@ -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
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |