Kaynağa Gözat

Merge branch 'master' into 'master'

新增科室床位维护

See merge request lighter/vue-intergration-platform!121
huangshuhua 11 ay önce
ebeveyn
işleme
6ba1f91269

+ 66 - 0
src/api/dictionary/personnel/bed-dept-dict.js

@@ -0,0 +1,66 @@
+import request from '../../../utils/request'
+
+/**
+ * 查询科室床位信息
+ * @param {*} text 输入内容
+ * @returns
+ */
+export function selectDeptInfoForBed(text) {
+    return request({
+        url: '/bedDict/selectDeptInfoForBed',
+        method: 'get',
+        params: { text },
+    })
+}
+
+/**
+ * 查询具体科室床位详细信息
+ * @param {*} deptCode 科室id
+ * @returns
+ */
+export function selectBedInfoForDept(deptCode) {
+    return request({
+        url: '/bedDict/selectBedInfoForDept',
+        method: 'get',
+        params: { deptCode },
+    })
+}
+
+/**
+ * 查询空调费/床位费项目
+ * @param {*} text 输入内容
+ * @returns
+ */
+export function selectAirItemInfo(text) {
+    return request({
+        url: '/bedDict/selectAirItemInfo',
+        method: 'get',
+        params: { text },
+    })
+}
+
+/**
+ * 更新科室标准床位数
+ * @param {*} data 科室标准床位数
+ * @returns
+ */
+export function updateDeptInfoForBed(data) {
+    return request({
+        url: '/bedDict/updateDeptInfoForBed',
+        method: 'post',
+        data
+    })
+}
+
+/**
+ * 更新科室床位信息
+ * @param {*} data 科室床位信息
+ * @returns
+ */
+export function updateBedInfoForDept(data) {
+    return request({
+        url: '/bedDict/updateBedInfoForDept',
+        method: 'post',
+        data
+    })
+}

+ 330 - 0
src/views/dictionary/personnel/BedDeptDict.vue

@@ -0,0 +1,330 @@
+<template>
+  <div class="layout_container">
+    <div class="layout_main layout_container layout-horizontal">
+      <aside style="width: 460px;">
+        <div class="layout_container">
+          <header>
+            <vxe-input v-model="text" style="width: 320px;" placeholder="输入关键词搜索" @change="queryDeptInfoForBed"/>
+            <vxe-button status="primary" @click="saveDeptInfoForBed">保存标准床位</vxe-button>
+          </header>
+          <div class="layout_main layout_card">
+            <vxe-table ref="gridRefDept" :data="deptInfo" border stripe highlight-current-row @cell-click="cellClickEvent"
+              keep-source :edit-config="{mode: 'row', trigger: 'click', showStatus: true}">
+              <vxe-column type="seq" width="50"></vxe-column>
+              <vxe-column field="wardName" title="科室名称" width="140" />
+              <vxe-column field="openBedNum" title="标准床位" width="100" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-input v-model="row.openBedNum"></vxe-input>
+                </template>
+              </vxe-column>
+              <vxe-column field="deptName" title="病房名称" width="140" />
+            </vxe-table>
+          </div>
+        </div>
+      </aside>
+      <div class="layout_container layout_overflow_auto">
+        <header>
+          <vxe-button status="primary" @click="saveBedInfoForDept">保存科室床位</vxe-button>
+          <vxe-button status="primary" @click="refreshBedInfo">重置科室床位</vxe-button>
+        </header>
+        <div class="layout_main layout_card layout_el-table">
+          <div class="layout_flex_1-y">
+            <vxe-table ref="gridRefBed" :data="bedInfo.slice(pageSize * (currentPage - 1), pageSize * currentPage)" border stripe keep-source
+              height="820px" highlight-current-row :edit-config="{mode: 'row', trigger: 'click', showStatus: true, autoClear: false}">
+              <vxe-column type="seq" width="50"></vxe-column>
+              <vxe-column field="type" title="类别" width="100" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-select v-model="row.type" :options="bedType"></vxe-select>
+                </template>
+                <template #default="{ row }">
+                  <span>{{ formatBedType([row.type]) }}</span>
+                </template>
+              </vxe-column>
+              <vxe-column field="bedStatusName" title="状态" width="50" >
+                <template v-slot="scope">
+                  <div v-if="scope.row.bedStatus === '1'" style="color: #67c23a; font-size: 12px; font-weight: bolder"><span>{{ scope.row.bedStatusName }}</span></div>
+                  <div v-else style="color: #d71345; font-size: 12px; font-weight: bolder"><span>{{ scope.row.bedStatusName }}</span></div>
+                </template>
+              </vxe-column>
+              <vxe-column field="bedNo" title="床号" width="50" />
+              <vxe-column field="roomNo" title="房间号" width="100" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-input v-model="row.roomNo"></vxe-input>
+                </template>
+              </vxe-column>
+              <vxe-column field="sex" title="房间属性" width="100" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-select v-model="row.sex" :options="sexType"></vxe-select>
+                </template>
+                <template #default="{ row }">
+                  <span>{{ formatSex([row.sex]) }}</span>
+                </template>
+              </vxe-column>
+              <vxe-column field="roomRate1" title="床位费" width="90" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-input v-model="row.roomRate1"></vxe-input>
+                </template>
+              </vxe-column>
+              <vxe-column field="chargeCodeBed" title="床位费项目" width="220" :edit-render="{}">
+                <template #edit="scope">
+                  <CyComboGrid v-model="scope.row" value="chargeCodeBed" label="chargeCodeBedName"
+                    placement="bottom" :table-header="tableHeaderBed" :remote-method="selectAirItemInfo" style="width: 100%"/>
+                </template>
+                <template #default="{ row }">
+                  <span>{{ formatChargeCodeBed([row.chargeCodeBed]) }}</span>
+                </template>
+              </vxe-column>
+              <vxe-column field="heatingFee" title="取暖费" width="90" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-input v-model="row.heatingFee"></vxe-input>
+                </template>
+              </vxe-column>
+              <vxe-column field="airConditionFee" title="空调费" width="90" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-input v-model="row.airConditionFee"></vxe-input>
+                </template>
+              </vxe-column>
+              <vxe-column field="chargeCodeAir" title="空调费项目" width="220" :edit-render="{}">
+                <template #edit="scope">
+                  <CyComboGrid v-model="scope.row" value="chargeCodeAir" label="chargeCodeAirName"
+                    placement="bottom" :table-header="tableHeaderBed" :remote-method="selectAirItemInfo" style="width: 100%"/>
+                </template>
+                <template #default="{ row }">
+                  <span>{{ formatChargeCodeBed([row.chargeCodeAir]) }}</span>
+                </template>
+              </vxe-column>
+              <vxe-column field="specialCharge" title="特殊收费" width="100" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-input v-model="row.specialCharge"></vxe-input>
+                </template>
+              </vxe-column>
+              <vxe-column field="roomRate2" title="其他费" width="85" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-input v-model="row.roomRate2"></vxe-input>
+                </template>
+              </vxe-column>
+              <vxe-column field="heatColdFlag" title="生效" width="100" :edit-render="{}">
+                <template #edit="{ row }">
+                  <vxe-select v-model="row.heatColdFlag" :options="heatColdType"></vxe-select>
+                </template>
+                <template #default="{ row }">
+                  <span>{{ formatHeatColdType([row.heatColdFlag]) }}</span>
+                </template>
+              </vxe-column>
+              <vxe-column field="inpatientNo" title="住院号" width="80" />
+              <vxe-column field="admissTimes" title="住院次数" width="80" />
+            </vxe-table>
+          </div>
+          <div>
+            <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[15, 30, 45, 60]"
+                           :total="bedInfo.length" layout="total, sizes, prev, pager, next, jumper" style="margin-top: 5px"
+                           @size-change="handleSizeChange" @current-change="handleCurrentChange">
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup name="BedDeptDict">
+import {ref, onMounted, nextTick} from 'vue'
+import {
+  selectAirItemInfo,
+  selectBedInfoForDept,
+  selectDeptInfoForBed,
+  updateBedInfoForDept,
+  updateDeptInfoForBed
+} from "@/api/dictionary/personnel/bed-dept-dict"
+import CyComboGrid from "@/components/cy/combo-grid/src/CyComboGrid.vue";
+import {ElMessage} from "element-plus";
+
+const pageSize = ref(30)
+const currentPage = ref(1)
+const handleSizeChange = (val) => {
+  pageSize.value = val
+}
+const handleCurrentChange = (val) => {
+  currentPage.value = val
+}
+// 搜索关键字
+const text = ref('')
+// 科室信息(下拉选)
+const deptInfo = ref([])
+// 床位信息
+const bedInfo = ref([])
+// 床位类别
+const bedType = ref([{ value: '1', label: '普通' }, { value: '2', label: '加床' }, { value: '4', label: '家庭病床' }, { value: '9', label: '临时' }])
+const formatBedType = (bedTypeList) => {
+  if (bedTypeList) {
+    return bedTypeList.map(type => {
+      const item = bedType.value.find(item => item.value === type)
+      return item ? item.label : type
+    }).join(',')
+  }
+  return ''
+}
+// 房间属性
+const sexType = ref([{ value: '1', label: '男' }, { value: '2', label: '女' }])
+const formatSex = (sexList) => {
+  if (sexList) {
+    return sexList.map(sex => {
+      const item = sexType.value.find(item => item.value === sex)
+      return item ? item.label : sex
+    }).join(',')
+  }
+  return ''
+}
+// 生效(空调状态)
+const heatColdType = ref([{ value: '1', label: '停止' }, { value: '2', label: '取暖' }, { value: '3', label: '空调' }])
+const formatHeatColdType = (heatColdList) => {
+  if (heatColdList) {
+    return heatColdList.map(heatCold => {
+      const item = heatColdType.value.find(item => item.value === heatCold)
+      return item ? item.label : heatCold
+    }).join(',')
+  }
+  return ''
+}
+
+onMounted(() => {
+  nextTick(async () => {
+    // 查询科室床位信息
+    queryDeptInfoForBed('')
+    queryBedProjectOptions('')
+  })
+
+})
+
+const queryDeptInfoForBed = () => {
+  selectDeptInfoForBed(text.value).then((res) => {
+    deptInfo.value = res
+  })
+}
+
+// 单选行事件
+const clickDept = ref('')
+const cellClickEvent = ({ row, column }) => {
+  if(column.field === 'openBedNum'){
+    return
+  }
+  clickDept.value = row.deptCode
+  queryBedInfoForDept(clickDept.value)
+}
+
+// 查询科室具体床位信息
+const queryBedInfoForDept = (deptCode) => {
+  selectBedInfoForDept(deptCode).then((res) => {
+    bedInfo.value = res
+  })
+}
+
+// 空调费/床位费项目信息
+const collapseTags = ref(false)
+const airItems = ref([])
+const tableHeaderBed = ref([
+    {name: '项目编码', code: 'value', width: 80,},
+    {name: '项目名称', code: 'label', width: 220},
+    {name: '单价', code: 'price', width: 100},
+    {name: '贵重', code: 'separateFlag', width: 50},
+    {name: '自费', code: 'selfFlag', width: 50},
+    {name: '执行科室', code: 'execName', width: 120},
+    {name: '拼音码', code: 'pyCode', width: 90},
+    {name: '五笔码', code: 'dCode', width: 90},
+    {name: '院内码', code: 'nCode', width: 80}
+  ]
+)
+const queryBedProjectOptions = (code) => {
+  selectAirItemInfo(code).then((res) => {
+    airItems.value = res
+  })
+}
+const formatChargeCodeBed = (chargeCodeBedList) => {
+  if (chargeCodeBedList) {
+    return chargeCodeBedList.map(e => {
+      const item = airItems.value.find(item => item.value === e)
+      return item ? item.label : e
+    }).join(',')
+  }
+  return ''
+}
+
+// 更新科室标准床位数
+let deptInfoList = ref([])
+const gridRefDept = ref()
+const saveDeptInfoForBed = () => {
+  // 获取需要更新的床位数信息
+  let data = gridRefDept.value.getUpdateRecords()
+  for(let d in data){
+    let uD = {deptCode:'',wardCode: '', openBedNum: ''}
+    uD.deptCode = data[d].deptCode
+    uD.wardCode = data[d].wardCode
+    uD.openBedNum = data[d].openBedNum
+    deptInfoList.value.push(uD)
+  }
+  updateDeptInfoForBed(deptInfoList.value).then((res) => {
+    if(res){
+      ElMessage({
+        type: "success",
+        message: res.cg,
+        duration: 2500,
+        showClose: true,
+      });
+      queryDeptInfoForBed()
+    }
+  })
+}
+
+let bedInfoList = ref([])
+const gridRefBed = ref()
+const saveBedInfoForDept = () => {
+  let bedList = gridRefBed.value.getUpdateRecords()
+  if(bedList.length > 0) {
+    bedList.forEach(e => {
+      let bed = {type: '', bedNo: '', roomNo: '', sex: '', roomRate1: '',chargeCodeBed: '',
+        heatingFee: '', airConditionFee: '', chargeCodeAir: '', specialCharge: '', roomRate2: '',
+        heatColdFlag: '', deptCode: '', wardCode: ''}
+      bed.deptCode = e.deptCode
+      bed.wardCode = e.wardCode
+      bed.type = e.type
+      bed.bedStatus = e.bedStatus
+      bed.bedNo = e.bedNo
+      bed.roomNo = e.roomNo
+      bed.sex = e.sex
+      bed.roomRate1 = e.roomRate1
+      bed.chargeCodeBed = e.chargeCodeBed
+      bed.heatingFee = e.heatingFee
+      bed.airConditionFee = e.airConditionFee
+      bed.chargeCodeAir = e.chargeCodeAir
+      bed.specialCharge = e.specialCharge
+      bed.roomRate2 = e.roomRate2
+      bed.heatColdFlag = e.heatColdFlag
+      bedInfoList.value.push(bed)
+    })
+    updateBedInfoForDept(bedInfoList.value).then((res) => {
+      if(res){
+        ElMessage({
+          type: "success",
+          message: res.cg,
+          duration: 2500,
+          showClose: true,
+        });
+        queryBedInfoForDept(clickDept.value)
+      }
+    })
+  } else {
+    ElMessage({
+      type: "info",
+      message: "没有更新床位信息的数据,请确认!",
+      duration: 2500,
+      showClose: true,
+    });
+  }
+}
+
+// 重置床位信息
+const refreshBedInfo = () => {
+  if(clickDept.value){
+    queryBedInfoForDept(clickDept.value)
+  }
+}
+</script>