Parcourir la source

优化结算单上传

DESKTOP-MINPJAU\Administrator il y a 3 ans
Parent
commit
443186e133

+ 2 - 0
src/App.vue

@@ -198,4 +198,6 @@ table th.star div::before {
   color: #f56c6cff;
   margin-right: 4px;
 }
+
+
 </style>

+ 88 - 0
src/components/SelectStaffCode.vue

@@ -0,0 +1,88 @@
+<template>
+  <el-select v-model="modelObj" :remote-method="methodStaff" :style="{width: props.width}" clearable filterable
+             remote @change="changeStaff" @clear="clear">
+    <el-option v-for="item in staffList" :key="item.code" :label="item.name"
+               :value="{value:item.code,label:item.name}">
+      <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+      <el-divider direction="vertical"></el-divider>
+      <span style="color:#67C23A">{{ item.name }}</span>
+      <el-divider direction="vertical"></el-divider>
+      <span style="color:#E6A23C">{{ item.deptName }}</span>
+      <el-divider direction="vertical"></el-divider>
+      <span style="color:#a5673f">{{ item.empTitName }}</span>
+    </el-option>
+  </el-select>
+</template>
+
+<script name="SelectStaffCode" setup>
+import {getRenYuan} from "@/api/public-api";
+import {onUpdated} from "vue";
+import {stringNotBlank} from "@/utils/blank-utils";
+
+const props = defineProps({
+  modelValue: {
+    type: Object,
+    default: ''
+  },
+  name: {
+    type: Array,
+    default: ['code', 'name']
+  },
+  width: {
+    type: String,
+    default: '220px'
+  }
+})
+
+let staffList = $ref('')
+
+let modelObj = $ref({
+  value: '',
+  label: '',
+})
+
+onMounted(() => {
+  modelChange()
+})
+
+onUpdated(() => {
+  modelChange()
+})
+
+const modelChange = () => {
+  modelObj.value = props.modelValue[props.name[0]]
+  modelObj.label = props.modelValue[props.name[1]]
+  if (stringNotBlank(modelObj.value)) {
+    getRenYuan(modelObj.value).then(res => {
+      staffList = res
+    })
+  }
+}
+
+const methodStaff = (val) => {
+  if (val.length > 1) {
+    getRenYuan(val).then(res => {
+      staffList = res
+    })
+  }
+}
+
+const changeStaff = () => {
+  props.modelValue[props.name[0]] = modelObj.value
+  props.modelValue[props.name[1]] = modelObj.label
+}
+
+const clear = () => {
+  modelObj = {
+    value: '',
+    label: '',
+  }
+  props.modelValue[props.name[0]] = ''
+  props.modelValue[props.name[1]] = ''
+}
+
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 306 - 0
src/components/input-table-query/InputAndTable.vue

@@ -0,0 +1,306 @@
+<template>
+  <el-input ref="tempElInput"
+            v-model="inputData"
+            :clearable="props.clearable"
+            :style="{width: inputWidth + 'px'}"
+            @clear="inputClear"
+            @focus="initData"
+            @input="inputChange"/>
+  <transition name="el-zoom-in-top">
+    <div v-show="inputTable" :style="{width: props.tableWidth + 'px'}" class="input_box">
+      <div class="input_header">
+      <span>
+        <el-button circle icon="el-icon-close" plain type="danger" @click="inputClose"></el-button>
+      </span>
+        <small>
+          <xc-code code="Alt + ↑ / ↓" description="获取行"/>
+          <xc-code code="Alt + ← / →" description="翻页"/>
+          <xc-code code="Enter" description="确定"/>
+        </small>
+        <span class="title">
+          <strong>
+            {{ props.title }}
+          </strong>
+      </span>
+      </div>
+      <div class="input_table">
+        <el-table :data="props.data.data"
+                  :height="410"
+                  :row-class-name="tableRowClassName"
+                  @row-click="rowClick">
+          <el-table-column :width="30" type="index"/>
+          <template v-for="item in props.tableHeader">
+            <el-table-column :label="item.label" :prop="item.prop"
+                             :width="item.width" show-overflow-tooltip/>
+          </template>
+        </el-table>
+        <el-pagination
+            :current-page="props.data.currentPage"
+            :page-size="10"
+            :total="props.data.total"
+            layout="total,  prev, pager, next"
+            @current-change="currentChange"/>
+      </div>
+    </div>
+  </transition>
+  <!--  <el-popover ref="popoverRef"-->
+  <!--              v-model="popover"-->
+  <!--              :width="tableWidth"-->
+  <!--              @hide="popoverHide"-->
+  <!--              @show="show"-->
+  <!--  >-->
+  <!--    <template #reference>-->
+  <!--      <el-input ref="tempElInput"-->
+  <!--                v-model="inputData"-->
+  <!--                :clearable="props.clearable"-->
+  <!--                :style="{width: inputWidth + 'px'}"-->
+  <!--                @blur="inputBlur"-->
+  <!--                @clear="inputClear"-->
+  <!--                @focus="initData"-->
+  <!--                @input="inputChange"-->
+  <!--                @keyup="listener">-->
+  <!--      </el-input>-->
+  <!--    </template>-->
+  <!--    <el-button @click="closePopover">关闭</el-button>-->
+
+  <!--  </el-popover>-->
+</template>
+
+<script name="InputAndTable" setup>
+
+
+import {stringNotBlank} from "@/utils/blank-utils";
+import {debounce} from "@/utils/debounce";
+import XcCode from "@/components/xc/XcCode.vue";
+
+const props = defineProps({
+  modelValue: {
+    type: String,
+    default: ''
+  },
+  inputWidth: {
+    type: Number,
+    default: 120
+  },
+  tableWidth: {
+    type: Number,
+    default: 600
+  },
+  data: {
+    type: Object,
+    default: {
+      data: [
+        {code: '12', name: 'a'},
+        {code: '12', name: 'a'},
+        {code: '12', name: 'a'},
+        {code: '12', name: 'a'},
+        {code: '12', name: 'a'},
+        {code: '12', name: '12'},
+        {code: '12', name: '12'},
+        {code: '12', name: '12'},
+        {code: '12', name: '12'},
+        {code: '12', name: '12'},
+      ],
+      currentPage: 1,
+      total: 0,
+    }
+  },
+  tableHeader: {
+    type: Array,
+  },
+  title: {
+    type: String,
+    default: '数据搜索'
+  },
+  valueId: {
+    type: String,
+  },
+  clearable: {
+    type: Boolean,
+    default: false
+  }
+})
+
+const emit = defineEmits(['currentChange', 'rowClick', 'fetchData', 'update:modelValue'])
+
+let inputData = $ref('')
+let elPage = $ref(null)
+let tempElInput = $ref(null)
+let popover = $ref(false)
+let inputTable = $ref(false)
+
+
+const data = ref({
+  total: 0,
+  currentPage: 1,
+  pageSize: 10,
+  data: []
+})
+// 临时下标用来使用键盘选中的
+let tempIndex = $ref(-1)
+
+const inputChange = debounce(value => {
+  if (value.length > 1) {
+    emit('fetchData', value)
+  }
+}, 400)
+
+
+const initData = () => {
+  if (stringNotBlank(props.modelValue) && props.data.data.length === 0) {
+    inputChange(props.modelValue)
+  }
+  inputTable = true
+  te()
+}
+
+const rowClick = (row, column, event) => {
+  tempIndex = row.index
+  emit('update:modelValue', row[props.valueId])
+  inputData = row[props.valueId]
+  emit('rowClick', row)
+  inputTable = false
+  document.onkeydown = null
+}
+
+const currentChange = (val) => {
+  tempElInput.focus()
+  tempIndex = -1
+  emit('currentChange', inputData, val)
+}
+
+const tableRowClassName = ({row, rowIndex}) => {
+  row.index = rowIndex
+  if (props.modelValue === row[props.valueId]) {
+    return 'input_and_table_row'
+  } else if (rowIndex === tempIndex) {
+    return 'input_and_table_to_be_selected'
+  }
+  return ''
+}
+
+const inputClear = () => {
+  emit('update:modelValue', '')
+  inputData = ''
+  emit('rowClick', '')
+  tempIndex = -1
+}
+
+const inputClose = () => {
+  inputTable = false
+  tempIndex = -1
+  inputData = props.modelValue
+  document.onkeydown = null
+}
+
+
+const enter = () => {
+  if (tempIndex < 0 || tempIndex > props.data.data.length) return
+  rowClick(props.data.data[tempIndex])
+}
+
+const leftOrRight = (val) => {
+  let count = Math.ceil(props.data.total / 10)
+  let currentPage = props.data.currentPage
+  currentPage = val === 'left' ? currentPage - 1 : currentPage + 1
+  if (currentPage < 1) {
+    currentPage = count
+  } else if (currentPage > count) {
+    currentPage = 1
+  }
+  currentChange(currentPage)
+}
+
+const upOrLower = (val) => {
+  let dataLength = props.data.data.length
+  tempIndex = val === 'up' ? tempIndex - 1 : tempIndex + 1
+  if (tempIndex < 0) {
+    tempIndex = dataLength - 1
+  } else if (tempIndex >= dataLength) {
+    tempIndex = 0
+  }
+}
+
+const te = () => {
+  document.onkeydown = function (event) {
+    if (props.data.total > 0) {
+      if (event.altKey && event.keyCode === 37) {
+        event.returnValue = false
+        leftOrRight('left')
+      } else if (event.altKey && event.keyCode === 38) {
+        event.returnValue = false
+        upOrLower('up')
+      } else if (event.altKey && event.keyCode === 39) {
+        event.returnValue = false
+        leftOrRight('right')
+      } else if (event.altKey && event.keyCode === 40) {
+        event.returnValue = false
+        upOrLower('lower')
+      } else if (event.keyCode === 13) {
+        enter();
+      } else if (event.key === 'Escape') {
+        event.returnValue = false
+        inputClose()
+      }
+    }
+  }
+}
+
+
+onUpdated(() => {
+  if (!inputTable) {
+    inputData = props.modelValue
+  }
+})
+
+onMounted(() => {
+  if (inputData !== props.modelValue) {
+    inputData = props.modelValue
+  }
+})
+
+</script>
+
+<style>
+.el-table .input_and_table_row {
+  background: rgba(71, 123, 220, 0.69);
+}
+
+.el-table .input_and_table_to_be_selected {
+  background: #F8CC48A1;
+}
+</style>
+
+<style lang="scss" scoped>
+.input_box {
+  box-shadow: 0 0 12px rgba(0, 0, 0, .12);
+  border-radius: 5px;
+  display: flex;
+  position: absolute;
+  flex-direction: column;
+  z-index: 1000;
+  top: 28px;
+  background-color: white;
+
+  .input_header {
+    height: 40px;
+    border-radius: 5px;
+    line-height: 40px;
+    display: flex;
+    justify-content: space-between;
+    padding: 5px;
+    background-color: #f8f8f8;
+
+    .title {
+      font-size: 20px;
+      text-align: center;
+    }
+  }
+
+  .input_table {
+
+  }
+
+
+}
+</style>

+ 102 - 118
src/components/si-sheet-upload/JieSuanDanXiangQing.vue → src/components/si-sheet-upload/jie-suan-dan-xiu-gai/JieSuanDanXiangQing.vue

@@ -233,59 +233,65 @@
       </el-button>
       <el-button @click="pageZhenDuanChaXun((diagnosticQuery.page += 1))">下一页</el-button>
     </el-dialog>
+    <jie-suan-dan-xiu-gai-shou-shu v-if="shouShuDialog"
+                                   :data="formShouShu"
+                                   @addShouShuClick="addShouShuClick"
+                                   @close="shouShuDialog = false"/>
     <!--    这里都是手术的了  -->
-    <el-dialog v-model="shouShuDialog" title="修改或添加手术">
-      <el-form ref="formShouShuRef" :model="formShouShu" :rules="shouShuRules" label-width="100px" size="mini">
-        <el-form-item label="手术名称" prop="ssmc">
-          <el-input v-model="formShouShu.ssmc" @click="queryShouShu('手术编码')"></el-input>
-        </el-form-item>
-        <el-form-item label="手术日期" prop="ssrq">
-          <el-date-picker v-model="formShouShu.ssrq" type="datetime"></el-date-picker>
-        </el-form-item>
-        <el-form-item label="手术级别" prop="ssjb">
-          <el-select v-model="formShouShu.ssjb">
-            <el-option :key="1" :label="1" :value="1"></el-option>
-            <el-option :key="2" :label="2" :value="2"></el-option>
-            <el-option :key="3" :label="3" :value="3"></el-option>
-            <el-option :key="4" :label="4" :value="4"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="手术编码" prop="ssbm">
-          <el-input v-model="formShouShu.ssbm" disabled></el-input>
-        </el-form-item>
-        <el-form-item label="术者" prop="ssysName">
-          <el-input v-model="formShouShu.ssysName" @click="queryShouShu('术者')"></el-input>
-        </el-form-item>
-        <el-form-item label="I助" prop="sszsName1">
-          <el-input v-model="formShouShu.sszsName1" @click="queryShouShu('I助')"></el-input>
-        </el-form-item>
-        <el-form-item label="II助" prop="sszsName2">
-          <el-input v-model="formShouShu.sszsName2" @click="queryShouShu('II助')"></el-input>
-        </el-form-item>
-        <el-form-item label="切口愈合等级" prop="qkName">
-          <el-select v-model="formShouShu.qkName" @change="formQieKou">
-            <el-option v-for="item in qks" :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-form-item>
-        <el-form-item label="麻醉方式" prop="mzff">
-          <el-select v-model="formShouShu.mzff">
-            <el-option v-for="item in maZuiFangShis" :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-form-item>
-        <el-form-item label="麻醉医生" prop="mzys">
-          <el-input v-model="formShouShu.mzysName" @click="queryShouShu('麻醉医生')"></el-input>
-        </el-form-item>
-      </el-form>
-      <el-button @click="addShouShuClick">保存</el-button>
-    </el-dialog>
+    <!--    <el-dialog v-model="shouShuDialog" title="修改或添加手术">-->
+    <!--      <el-form ref="formShouShuRef" :model="formShouShu" :rules="shouShuRules" label-width="100px" size="mini">-->
+    <!--        <el-form-item label="手术名称" prop="ssmc">-->
+    <!--          <InputAndTable/>-->
+    <!--          <el-input v-model="formShouShu.ssmc" @click="queryShouShu()"></el-input>-->
+    <!--        </el-form-item>-->
+    <!--        <el-form-item label="手术日期" prop="ssrq">-->
+    <!--          <el-date-picker v-model="formShouShu.ssrq" type="datetime"></el-date-picker>-->
+    <!--        </el-form-item>-->
+    <!--        <el-form-item label="手术级别" prop="ssjb">-->
+    <!--          <el-select v-model="formShouShu.ssjb">-->
+    <!--            <el-option :key="1" :label="1" :value="1"></el-option>-->
+    <!--            <el-option :key="2" :label="2" :value="2"></el-option>-->
+    <!--            <el-option :key="3" :label="3" :value="3"></el-option>-->
+    <!--            <el-option :key="4" :label="4" :value="4"></el-option>-->
+    <!--          </el-select>-->
+    <!--        </el-form-item>-->
+    <!--        <el-form-item label="手术编码" prop="ssbm">-->
+    <!--          <el-input v-model="formShouShu.ssbm" disabled></el-input>-->
+    <!--        </el-form-item>-->
+    <!--        <el-form-item label="术者" prop="ssysName">-->
+    <!--          <SelectStaffCode v-model="formShouShu" :name="['ssys','ssysName']"></SelectStaffCode>-->
+    <!--        </el-form-item>-->
+    <!--        <el-form-item label="I助" prop="sszsName1">-->
+    <!--          <SelectStaffCode v-model="formShouShu" :name="['sszs1','sszsName1']"></SelectStaffCode>-->
+    <!--        </el-form-item>-->
+    <!--        <el-form-item label="II助" prop="sszsName2">-->
+    <!--          <SelectStaffCode v-model="formShouShu" :name="['sszs2','sszsName2']"></SelectStaffCode>-->
+    <!--        </el-form-item>-->
+    <!--        <el-form-item label="切口愈合等级" prop="qkName">-->
+    <!--          <el-select v-model="formShouShu.qkName" @change="formQieKou">-->
+    <!--            <el-option v-for="item in qks" :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-form-item>-->
+    <!--        <el-form-item label="麻醉方式" prop="mzff">-->
+    <!--          <el-select v-model="formShouShu.mzff">-->
+    <!--            <el-option v-for="item in maZuiFangShis" :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-form-item>-->
+    <!--        <el-form-item label="麻醉医生" prop="mzys">-->
+    <!--          <SelectStaffCode v-model="formShouShu" :name="['mzys','mzysName']"></SelectStaffCode>-->
+    <!--        </el-form-item>-->
+    <!--      </el-form>-->
+    <!--      <el-button @click="addShouShuClick">保存</el-button>-->
+    <!--    </el-dialog>-->
+
     <el-dialog v-model="queryShouShuDialog" :title="queryShouShuCodeName">
       {{ queryShouShuCodeName }} :
       <el-input v-model="queryShouShuCodeData.code" style="width: 120px" @keyup.enter="queryShouShuClick"></el-input>
@@ -302,6 +308,7 @@
       <el-pagination :total="queryShouShuCodeData.total" layout="total,  prev, pager, next"
                      @current-change="shouShuCurrentPage"></el-pagination>
     </el-dialog>
+
     <shen-he-xin-xi v-if="shenHeRef" :data="props.data.shenHeXinXi" @close="shenHeRef = false"></shen-he-xin-xi>
     <ShuJuDuiBi
         v-if="shuJuDuiBiDialogRef"
@@ -318,28 +325,21 @@
 import store from '@/store'
 import {cptSex} from '@/utils/computed'
 import {searchYbDiag} from '@/api/yibao/dictionary'
-import {decTypes, operations} from '../../data'
+import {decTypes, operations} from '../../../data'
 import {clone} from '@/utils/clone'
 import {ElMessage, ElMessageBox} from 'element-plus'
 import {getRenYuan} from '@/api/public-api'
 import {setlUploadAudit, shouShuBianMa, upldSetlList} from '@/api/medical-insurance/si-setl-upload'
 import {formatDatetime} from '@/utils/date'
 import {listIsBlank, stringIsBlank, stringNotBlank} from '@/utils/blank-utils'
-import {
-  getAdmissCond,
-  getsiDiagTypeName,
-  maZuiFangShis,
-  maZuiName,
-  qieKouName,
-  qks,
-  shenHeQuanXian
-} from './jieSuanDanXiuGai'
-import ShenHeXinXi from './ShenHeXinXi.vue'
-import KeShiFeiYong from './KeShiFeiYong.vue'
-import BeiZhu from './BeiZhu.vue'
+import {getAdmissCond, getsiDiagTypeName, maZuiName, qieKouName, shenHeQuanXian} from '../jieSuanDanXiuGai'
+import ShenHeXinXi from '../ShenHeXinXi.vue'
+import KeShiFeiYong from '../KeShiFeiYong.vue'
+import BeiZhu from '../BeiZhu.vue'
 import Sortable from 'sortablejs'
-import ShuJuDuiBi from './ShuJuDuiBi.vue'
+import ShuJuDuiBi from '../ShuJuDuiBi.vue'
 import {ArrayIsEqual} from "@/utils/list-utlis";
+import JieSuanDanXiuGaiShouShu from "@/components/si-sheet-upload/jie-suan-dan-xiu-gai/JieSuanDanXiuGaiShouShu.vue";
 
 const props = defineProps({
   data: {},
@@ -497,8 +497,6 @@ const formShouShu = ref({
   mzysName: '',
 })
 const formShouShuRef = ref(null)
-const formShouShuCz = ref({})
-formShouShuCz.value = clone(formShouShu.value)
 // 限制
 const shouShuRules = ref({
   ssmc: [{required: true, message: '该项不能为空', trigger: 'blur'}],
@@ -514,7 +512,7 @@ const tianJiaXiuGaiShouShu = (index) => {
   if (index !== -1) {
     formShouShu.value = clone(oprninfo.value[index])
   } else {
-    formShouShu.value = clone(formShouShuCz.value)
+    formShouShu.value = null
   }
   oprninfoIndex.value = index
   shouShuDialog.value = true
@@ -524,15 +522,17 @@ const queryShouShuCodeData = ref({
   code: '',
   page: 1,
   total: 0,
+  data: []
 })
 const queryShouShuCodeName = ref('手术编码')
 const queryShouShuDialog = ref(false)
 const shouShuData = ref([])
-const queryShouShu = (val) => {
-  queryShouShuCodeName.value = val
+const queryShouShu = () => {
   queryShouShuDialog.value = true
   queryShouShuCodeData.value.code = ''
   shouShuData.value = []
+  queryShouShuCodeData.value.page = 1
+  queryShouShuCodeData.value.total = 0
 }
 const queryShouShuClick = () => {
   if (queryShouShuCodeName.value.length < 1) {
@@ -563,59 +563,28 @@ const shouShuCurrentPage = (val) => {
 }
 
 const xuanZheShouShu = (val) => {
-  switch (queryShouShuCodeName.value) {
-    case '手术编码':
-      formShouShu.value.ssbm = val.code
-      formShouShu.value.ssmc = val.name
-      break
-    case '术者':
-      formShouShu.value.ssys = val.code
-      formShouShu.value.ssysName = val.name
-      break
-    case 'I助':
-      formShouShu.value.sszs1 = val.code
-      formShouShu.value.sszsName1 = val.name
-      break
-    case 'II助':
-      formShouShu.value.sszs2 = val.code
-      formShouShu.value.sszsName2 = val.name
-      break
-    case '麻醉医生':
-      formShouShu.value.mzys = val.code
-      formShouShu.value.mzysName = val.name
-      break
-  }
+  formShouShu.value.ssbm = val.code
+  formShouShu.value.ssmc = val.name
   setTimeout(() => {
     queryShouShuDialog.value = false
   }, 400)
 }
 
-const formQieKou = (val) => {
-  formShouShu.value.qkjb = val.split('/')[0]
-  formShouShu.value.yhqk = val.split('/')[1]
-}
-
-const addShouShuClick = async () => {
-  let form = unref(formShouShuRef)
-  if (!form) return
-  try {
-    await form.validate()
-    formShouShu.value.ssrq = formatDatetime(formShouShu.value.ssrq)
-    if (oprninfoIndex.value !== -1) {
-      oprninfo.value[oprninfoIndex.value] = clone(formShouShu.value)
-    } else {
-      // 只有在新增的 时候才需要 加长度
-      formShouShu.value.id = oprninfo.value.length + 1
-      formShouShu.value.ssxh = oprninfo.value.length + 1
-      formShouShu.value.newData = true
-      oprninfo.value.push(clone(formShouShu.value))
-    }
-    shouShuDialog.value = false
-    setTimeout(() => {
-      sortableOprninfo()
-    }, 100)
-  } catch (e) {
+const addShouShuClick = async (val) => {
+  val.ssrq = formatDatetime(val.ssrq)
+  if (oprninfoIndex.value !== -1) {
+    oprninfo.value[oprninfoIndex.value] = clone(val)
+  } else {
+    // 只有在新增的 时候才需要 加长度
+    val.id = oprninfo.value.length + 1
+    val.ssxh = oprninfo.value.length + 1
+    val.newData = true
+    oprninfo.value.push(clone(val))
   }
+  shouShuDialog.value = false
+  setTimeout(() => {
+    sortableOprninfo()
+  }, 100)
 }
 
 const delShouShu = (index) => {
@@ -895,6 +864,21 @@ function sortableOprninfo() {
   Sortable.create(el, ops)
 }
 
+const yiShengShuJu = ref([])
+
+// 搜索医生
+const suoSouYiShen = (val) => {
+  if (val.length > 1) {
+    getRenYuan(val).then(res => {
+      yiShengShuJu.value = res
+    })
+  }
+}
+
+const huoQuXialaKuangMing = () => {
+
+}
+
 onMounted(() => {
   init()
   keFouShenHe.value = !(stringNotBlank(props.data.shenHeXinXi.id) && props.data.shenHeXinXi.auditFlag === 0)

+ 164 - 0
src/components/si-sheet-upload/jie-suan-dan-xiu-gai/JieSuanDanXiuGaiShouShu.vue

@@ -0,0 +1,164 @@
+<template>
+  <el-dialog v-model="shouShuDialog" title="修改或添加手术" @closed="emit('close')">
+    <el-form ref="formShouShuRef" :model="formShouShu" :rules="shouShuRules" label-width="100px" size="mini">
+      <el-form-item label="手术名称" prop="ssmc">
+        <el-input v-model="formShouShu.ssmc" disabled></el-input>
+      </el-form-item>
+      <el-form-item label="手术编码" prop="ssbm">
+        <input-and-table v-model="formShouShu.ssbm"
+                         :data="shouShuData"
+                         :table-header="current"
+                         valueId="code"
+                         @currentChange="shouShuCurrentPage"
+                         @fetchData="queryShouShuClick"
+                         @rowClick="rowClick"
+        />
+      </el-form-item>
+      <el-form-item label="手术日期" prop="ssrq">
+        <el-date-picker v-model="formShouShu.ssrq" type="datetime"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="手术级别" prop="ssjb">
+        <el-select v-model="formShouShu.ssjb">
+          <el-option :key="1" :label="1" :value="1"></el-option>
+          <el-option :key="2" :label="2" :value="2"></el-option>
+          <el-option :key="3" :label="3" :value="3"></el-option>
+          <el-option :key="4" :label="4" :value="4"></el-option>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="术者" prop="ssysName">
+        <SelectStaffCode v-model="formShouShu" :name="['ssys','ssysName']"></SelectStaffCode>
+      </el-form-item>
+      <el-form-item label="I助" prop="sszsName1">
+        <SelectStaffCode v-model="formShouShu" :name="['sszs1','sszsName1']"></SelectStaffCode>
+      </el-form-item>
+      <el-form-item label="II助" prop="sszsName2">
+        <SelectStaffCode v-model="formShouShu" :name="['sszs2','sszsName2']"></SelectStaffCode>
+      </el-form-item>
+      <el-form-item label="切口愈合等级" prop="qkName">
+        <el-select v-model="formShouShu.qkName" @change="formQieKou">
+          <el-option v-for="item in qks" :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-form-item>
+      <el-form-item label="麻醉方式" prop="mzff">
+        <el-select v-model="formShouShu.mzff">
+          <el-option v-for="item in maZuiFangShis" :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-form-item>
+      <el-form-item label="麻醉医生" prop="mzys">
+        <SelectStaffCode v-model="formShouShu" :name="['mzys','mzysName']"></SelectStaffCode>
+      </el-form-item>
+    </el-form>
+    <el-button @click="addShouShuClick">保存</el-button>
+  </el-dialog>
+</template>
+
+<script name="JieSuanDanXiuGaiShouShu" setup>
+import SelectStaffCode from "@/components/SelectStaffCode.vue";
+import {maZuiFangShis, qks,} from '../jieSuanDanXiuGai'
+import InputAndTable from "@/components/input-table-query/InputAndTable.vue";
+import {shouShuBianMa} from "@/api/medical-insurance/si-setl-upload";
+import {current} from "@/data/input-table-header";
+
+const props = defineProps({
+  data: {
+    type: Object,
+  }
+})
+const emit = defineEmits(['addShouShuClick', 'close'])
+
+const shouShuDialog = $ref(true)
+const formShouShuRef = ref(null)
+let formShouShu = $ref({
+  id: 0,
+  ssxh: 0,
+  ssmc: '',
+  ssrq: '',
+  ssjb: '',
+  ssbm: '',
+  ssys: '',
+  ssysName: '',
+  sszs1: '',
+  sszsName1: '',
+  sszs2: '',
+  sszsName2: '',
+  qkjb: '',
+  yhqk: '',
+  qkName: '',
+  mzff: '',
+  mzys: '',
+  mzysName: '',
+})
+
+const shouShuData = $ref({
+  data: [],
+  total: 0,
+  currentPage: 1,
+})
+
+// 限制
+const shouShuRules = ref({
+  ssmc: [{required: true, message: '该项不能为空', trigger: 'blur'}],
+  ssrq: [{required: true, message: '该项不能为空', trigger: 'blur'}],
+  ssjb: [{required: true, message: '该项不能为空', trigger: 'blur'}],
+  ssbm: [{required: true, message: '该项不能为空', trigger: 'blur'}],
+  ssysName: [{required: true, message: '该项不能为空', trigger: 'blur'}],
+  qkName: [{required: true, message: '该项不能为空', trigger: 'blur'}],
+})
+
+const formQieKou = (val) => {
+  formShouShu.qkjb = val.split('/')[0]
+  formShouShu.yhqk = val.split('/')[1]
+}
+
+const shouShuCurrentPage = (inputData, val) => {
+  shouShuData.currentPage = val
+  shouShuBianMa(inputData, val).then((res) => {
+    shouShuData.data = res.records
+    shouShuData.total = res.total
+  })
+}
+
+const queryShouShuClick = (val) => {
+  shouShuBianMa(val, 1).then((res) => {
+    shouShuData.data = res.records
+    shouShuData.total = res.total
+  })
+}
+
+const rowClick = (row) => {
+  formShouShu.ssmc = row.name
+}
+
+const addShouShuClick = async () => {
+  let form = unref(formShouShuRef)
+  if (!form) return
+  try {
+    await form.validate()
+    emit('addShouShuClick', formShouShu)
+    console.log(formShouShu)
+  } catch (e) {
+
+  }
+}
+
+onMounted(() => {
+  if (props.data !== null) {
+    formShouShu = props.data
+  }
+})
+
+
+</script>
+
+<style scoped>
+
+</style>

+ 48 - 0
src/components/xc/XcCode.vue

@@ -0,0 +1,48 @@
+<template>
+  <div>
+      <span class="xc-code">
+        {{ props.code }}
+      </span>
+    <strong>
+      {{ props.description }}
+    </strong>
+  </div>
+
+</template>
+
+<script name="XcCode" setup>
+const props = defineProps({
+  code: {
+    type: String,
+    default: ''
+  },
+  description: {
+    type: String,
+    default: ''
+  }
+})
+
+</script>
+
+<style lang="scss" scoped>
+
+div {
+  display: inline-flex;
+  justify-content: center;
+  align-items: center;
+  line-height: 20px;
+
+  .xc-code {
+    background-color: #000;
+    color: white;
+    padding: 5px;
+    border-radius: 5px;
+    text-align: center;
+    margin: 3px;
+  }
+
+
+}
+
+
+</style>

+ 4 - 0
src/data/input-table-header.js

@@ -0,0 +1,4 @@
+export const current = [
+    {label: '编码', prop: 'code'},
+    {label: '名称', prop: 'name'},
+]

+ 19 - 0
src/utils/debounce.js

@@ -0,0 +1,19 @@
+/**
+ * 防止用户多次输入
+ * @param cb 来源
+ * @param delay 延迟时间
+ * @returns {(function(...[*]): void)|*}
+ */
+export function debounce(cb, delay) {
+    let timer
+    return function (...args) {
+        if (timer) {
+            clearTimeout(timer)
+        }
+        timer = setTimeout(() => {
+            cb.call(this, ...args)
+        }, delay)
+    }
+}
+
+0

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

@@ -669,7 +669,10 @@ function baoCunYiZhu() {
     list: yiZhuList.value,
   }
   // 合理用药校验
-  jiaoYan(data)
+  jiaoYan(data).then((res) => {
+    console.log(res)
+  })
+  return
   ElMessageBox.confirm('您确定要保存这些数据吗?请仔细检查数据。', '提示', {
     type: 'warning',
     closeOnClickModal: false,

+ 4 - 5
src/views/medical-insurance/allpatient/SetSheetUpload.vue

@@ -130,7 +130,6 @@
               </el-select>
             </el-form-item>
           </el-col>
-
           <el-col :span="spanWidth">
             <el-form-item label="医疗类别" prop="medType">
               <el-select v-model="queryTerm.medType" :collapse-tags="true" clearable filterable multiple
@@ -267,7 +266,6 @@
       <el-divider direction="vertical"></el-divider>
       <el-button @click="clickToSaveMedicalCategory">保存</el-button>
     </el-dialog>
-
   </el-container>
 </template>
 
@@ -288,7 +286,7 @@ import {
 } from '@/api/medical-insurance/si-setl-upload'
 import {clrOptinsData, decTypes, getPsnType} from '../../../data'
 import {getDept} from '@/api/yibao/xiang-mu-lu-ru'
-import JieSuanDanXiangQing from '../../../components/si-sheet-upload/JieSuanDanXiangQing.vue'
+import JieSuanDanXiangQing from '../../../components/si-sheet-upload/jie-suan-dan-xiu-gai/JieSuanDanXiangQing.vue'
 import {ElMessage, ElMessageBox} from 'element-plus'
 import Progress from '../../../components/progress/Index.vue'
 import {downloadExcel} from '@/utils/excel'
@@ -302,15 +300,16 @@ import {
 import XianZhiShiJian from '../../../components/si-sheet-upload/XianZhiShiJian.vue'
 import {stringIsBlank, stringNotBlank} from '@/utils/blank-utils'
 import JieSuanDanDaYing from '../../../components/si-sheet-upload/jieSuanDanDaYing.vue'
+import InputAndTable from "@/components/input-table-query/InputAndTable.vue";
 
 export default {
   name: 'SetSheetUpload',
-  components: {JieSuanDanDaYing, XianZhiShiJian, JieSuanDanXiangQing, Progress},
+  components: {InputAndTable, JieSuanDanDaYing, XianZhiShiJian, JieSuanDanXiangQing, Progress},
   setup: function () {
     const queryTerm = ref({
       startTime: '',
       endTime: '',
-      patNo: '',
+      patNo: '0406481',
       referPhysician: shenHeQuanXian() ? '' : store.state.user.info.code,
       insutype: [],
       dateRange: [clockinShortcuts[0].value[0], clockinShortcuts[0].value[1]],