yxh
2026-10-03 d553a4be94d4f6ee162cc353a28b220403909cfc
src/views/ecg/queue/index.vue
@@ -1,108 +1,53 @@
<template>
  <ContentWrap>
    <!-- 搜索工作栏 -->
    <el-form
      class="-mb-15px"
      :model="queryParams"
      ref="queryFormRef"
      :inline="true"
      label-width="68px"
    >
    <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
      <el-form-item label="患者编号" prop="patId">
        <el-input
          v-model="queryParams.patId"
          placeholder="请输入患者编号"
          clearable
          @keyup.enter="handleQuery"
          class="!w-240px"
        />
        <el-input v-model="queryParams.patId" placeholder="请输入患者编号" clearable @keyup.enter="handleQuery"
          class="!w-240px" />
      </el-form-item>
      <el-form-item label="患者姓名" prop="patName">
        <el-input
          v-model="queryParams.patName"
          placeholder="请输入患者姓名"
          clearable
          @keyup.enter="handleQuery"
          class="!w-240px"
        />
        <el-input v-model="queryParams.patName" placeholder="请输入患者姓名" clearable @keyup.enter="handleQuery"
          class="!w-240px" />
      </el-form-item>
      <el-form-item label="预约时段" prop="bookTimeslot">
        <el-select
          v-model="queryParams.bookTimeslot"
          placeholder="请输入预约时段"
          clearable
          class="!w-240px"
        >
          <el-option
            v-for="dict in getIntDictOptions(DICT_TYPE.ECG_BOOK_TIMESLOT)"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        <el-select v-model="queryParams.bookTimeslot" placeholder="请输入预约时段" clearable class="!w-240px">
          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.ECG_BOOK_TIMESLOT)" :key="dict.value"
            :label="dict.label" :value="dict.value" />
        </el-select>
      </el-form-item>
      <el-form-item label="检查类型" prop="bookCheckType">
        <el-select
          v-model="queryParams.bookCheckType"
          placeholder="请选择检查类型"
          clearable
          class="!w-240px"
        >
          <el-option
            v-for="dict in checkTypeStore.getCheckTypeOptions()"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
      <el-form-item label="检查项目" prop="bookCheckType">
        <el-select v-model="queryParams.bookCheckType" placeholder="请选择检查项目" clearable class="!w-240px">
          <el-option v-for="dict in checkTypeStore.getCheckTypeOptions()" :key="dict.value" :label="dict.label"
            :value="dict.value" />
        </el-select>
      </el-form-item>
      <el-form-item label="排队序号" prop="seqNum">
        <el-input
          v-model="queryParams.seqNum"
          placeholder="请输入排队序号"
          clearable
          @keyup.enter="handleQuery"
          class="!w-240px"
        />
        <el-input v-model="queryParams.seqNum" placeholder="请输入排队序号" clearable @keyup.enter="handleQuery"
          class="!w-240px" />
      </el-form-item>
      <el-form-item label="排队状态" prop="status">
        <el-select
          multiple
          v-model="queryParams.status"
          placeholder="请选择排队状态"
          clearable
          class="!w-240px"
        >
          <el-option
            v-for="dict in getIntDictOptions(DICT_TYPE.ECG_QUEUE_STATUS)"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        <el-select multiple v-model="queryParams.status" placeholder="请选择排队状态" clearable class="!w-240px">
          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.ECG_QUEUE_STATUS)" :key="dict.value" :label="dict.label"
            :value="dict.value" />
        </el-select>
      </el-form-item>
      <el-form-item label="诊室编号" prop="roomId">
        <el-input
          v-model="queryParams.roomId"
          placeholder="请输入诊室编号"
          clearable
          @keyup.enter="handleQuery"
          class="!w-240px"
        />
        <el-input v-model="queryParams.roomId" placeholder="请输入诊室编号" clearable @keyup.enter="handleQuery"
          class="!w-240px" />
      </el-form-item>
      <el-form-item label="诊疗床号" prop="bedNo">
        <el-input
          v-model="queryParams.bedNo"
          placeholder="请输入诊疗床号"
          clearable
          @keyup.enter="handleQuery"
          class="!w-240px"
        />
        <el-input v-model="queryParams.bedNo" placeholder="请输入诊疗床号" clearable @keyup.enter="handleQuery"
          class="!w-240px" />
      </el-form-item>
      <el-form-item>
        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<!--
        <el-button @click="handleQuery">
          <Icon icon="ep:search" class="mr-5px" /> 搜索
        </el-button>
        <el-button @click="resetQuery">
          <Icon icon="ep:refresh" class="mr-5px" /> 重置
        </el-button>
        <!--
        <el-button
          type="primary"
          plain
@@ -112,7 +57,7 @@
          <Icon icon="ep:plus" class="mr-5px" /> 新增
        </el-button>
-->
<!--
        <!--
        <el-button
          type="success"
          plain
@@ -132,7 +77,7 @@
    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
      <el-table-column label="操作" align="center" min-width="120px">
        <template #default="scope">
<!--          <el-button
          <!--          <el-button
              link
              type="primary"
              @click="openAppointmentForm('preview', scope.row.patId, scope.row.bookCheckType)"
@@ -150,41 +95,51 @@
                      删除
                    </el-button>
          -->
          <el-button
              link
              type="danger"
              @click="handleJump(scope.row)"
              v-if="scope.row.status === 10"
              v-hasPermi="['ecg:queue:jump']"
          >
            {{scope.row.jumpFlag === 0? "加急" : "取消加急"}}
          <el-button link type="danger" @click="handleJump(scope.row)" v-if="scope.row.status === 10"
            v-hasPermi="['ecg:queue:jump']">
            {{ scope.row.jumpFlag === 0 ? "加急" : "取消加急" }}
          </el-button>
          <el-button
              link
              type="danger"
              @click="recall(scope.row)"
              v-if="scope.row.status === 3 || scope.row.status === 5 || scope.row.status === 7"
              v-hasPermi="['ecg:queue:recall']"
          >
          <el-button link type="danger" @click="recall(scope.row)"
            v-if="scope.row.status === 3 || scope.row.status === 5 || scope.row.status === 7"
            v-hasPermi="['ecg:queue:recall']">
            召回
          </el-button>
          <el-button
              link
              type="danger"
              @click="passWaitingPatient(scope.row)"
              v-if="scope.row.status === 10"
              v-hasPermi="['ecg:queue:pass']"
          >
          <el-button link type="danger" @click="passWaitingPatient(scope.row)" v-if="scope.row.status === 10"
            v-hasPermi="['ecg:queue:pass']">
            过号
          </el-button>
        </template>
      </el-table-column>
<!--      <el-table-column label="id" align="center" prop="id" />-->
      <el-table-column label="就诊流水号" align="center" prop="episodeId" min-width="110px"/>
      <el-table-column label="申请号" align="center" prop="applyNo" min-width="110px"/>
      <!--      <el-table-column label="id" align="center" prop="id" />-->
      <el-table-column label="申请单号" align="center" prop="applyNo" min-width="110px" />
      <el-table-column label="排队序号" align="center" prop="seqNum" />
      <el-table-column label="预约号" align="center" prop="bookSeqNum" />
      <el-table-column label="过号标记" align="center" prop="passed" />
      <el-table-column label="患者编号" align="center" prop="patId" />
      <el-table-column label="患者姓名" align="center" prop="patName" min-width="90px" /><el-table-column label="检查项目"
        align="center" prop="bookCheckType" min-width="100px">
        <template #default="scope">
          {{ getCheckTypeName(scope.row.bookCheckType) }}
        </template>
      </el-table-column>
      <el-table-column label="来源" align="center" width="90px">
        <template #default="scope">
          <!-- 优先用预约单平铺值,回退到 patDetails 快照 -->
          <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc ?? scope.row.patDetails?.source ?? 0" />
        </template>
      </el-table-column>
      <el-table-column label="预约时段" align="center" prop="bookTimeslot" min-width="100px">
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
        </template>
      </el-table-column>
      <el-table-column label="状态" align="center" prop="status">
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="scope.row.status" />
        </template>
      </el-table-column>
      <el-table-column label="VIP" align="center" prop="isVip" />
      <el-table-column label="就诊号" align="center" prop="episodeId" min-width="110px" />
      <!-- 本列标签由「就诊卡号」改为「门诊号」(经确认)。原因(详见《部署清单》5.1):
           HIS 在卡号槽位传空,medical_card 全库 159,116 行**无一非空**;
           实测该列 99.9% 显示的是 outpatient_no(65% 形如身份证、35% 为门诊号)。
@@ -204,16 +159,8 @@
          {{ scope.row.doctorAdviceNo || '-' }}
        </template>
      </el-table-column>
      <el-table-column label="患者姓名" align="center" prop="patName" min-width="90px" />
      <el-table-column label="性别" align="center" prop="patGender" width="70px">
        <template #default="scope">{{ genderFormat(scope.row.patGender) }}</template>
      </el-table-column>
      <el-table-column label="来源" align="center" width="90px">
        <template #default="scope">
          <!-- 优先用预约单平铺值,回退到 patDetails 快照 -->
          <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE"
                    :value="scope.row.patSrc ?? scope.row.patDetails?.source ?? 0" />
        </template>
      </el-table-column>
      <el-table-column label="出生日期" align="center" min-width="110px">
        <template #default="scope">{{ formatDateOnly(scope.row.patBirthday) }}</template>
@@ -221,11 +168,7 @@
      <el-table-column label="年龄" align="center" width="80px">
        <template #default="scope">{{ formatAge(scope.row.patBirthday) }}</template>
      </el-table-column>
      <el-table-column label="检查类型" align="center" prop="bookCheckType" min-width="100px">
        <template #default="scope">
          {{getCheckTypeName(scope.row.bookCheckType)}}
        </template>
      </el-table-column>
      <el-table-column label="病区" align="center" min-width="110px">
        <template #default="scope">{{ scope.row.patWardDesc || scope.row.patDetails?.wardDesc || '-' }}</template>
      </el-table-column>
@@ -253,43 +196,22 @@
      <el-table-column label="开单医师" align="center" prop="doctor" min-width="100px">
        <template #default="scope">{{ scope.row.doctor || '-' }}</template>
      </el-table-column>
      <el-table-column label="预约时段" align="center" prop="bookTimeslot" min-width="100px">
      <el-table-column label="多耐药" width="150" align="center" prop="tolerance">
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
        </template>
      </el-table-column>
      <el-table-column label="状态" align="center" prop="status" >
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="scope.row.status" />
        </template>
      </el-table-column>
      <el-table-column label="多耐药" width="150" align="center" prop="tolerance" >
         <template #default="scope">
          <!-- 需求6:多耐走字典;NULL 按"无"显示(Q12) -->
          <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" />
        </template>
      </el-table-column>
      <el-table-column label="VIP" align="center" prop="isVip" />
      <el-table-column label="过号标记" align="center" prop="passed" />
      <el-table-column label="过期标记" align="center" prop="expired" />
      <el-table-column label="诊室编号" align="center" prop="roomId" />
      <el-table-column label="诊室名称" align="center" prop="roomName" />
      <el-table-column label="诊疗床号" align="center" prop="bedNo" />
      <el-table-column
        label="创建时间"
        align="center"
        prop="createTime"
        :formatter="dateFormatter"
        width="180px"
      />
      <el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
    </el-table>
    <!-- 分页 -->
    <Pagination
      :total="total"
      v-model:page="queryParams.pageNo"
      v-model:limit="queryParams.pageSize"
      @pagination="getList"
    />
    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
      @pagination="getList" />
  </ContentWrap>
  <!-- 表单弹窗:添加/修改 -->
@@ -303,12 +225,12 @@
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { QueueApi, QueueVO } from '@/api/ecg/queue'
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import {DoctorApi, PatientVO} from "@/api/ecg/doctor";
import {useCheckTypeStore} from "@/store/modules/checkType";
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { DoctorApi, PatientVO } from "@/api/ecg/doctor";
import { useCheckTypeStore } from "@/store/modules/checkType";
import AppointmentForm from "@/views/ecg/appointment/AppointmentForm.vue";
import {genderFormat} from "@/utils/stringUtil";
import {getCheckTypeName} from "../../../utils/checkTypeFormatter";
import { genderFormat } from "@/utils/stringUtil";
import { getCheckTypeName } from "../../../utils/checkTypeFormatter";
// 需求1:患者信息 18 项的公共格式化(年龄、距今天数等)
import { formatAge, formatDaysFromOrder, formatDateTime, formatDateOnly, resolveCardNo } from '@/utils/patientInfo'
@@ -385,11 +307,11 @@
    message.success(t('common.delSuccess'))
    // 刷新列表
    await getList()
  } catch {}
  } catch { }
}
/** 插队按钮操作 */
const handleJump = async (item: QueueVO ) => {
const handleJump = async (item: QueueVO) => {
  try {
    if (item.jumpFlag === 0)
      item.jumpFlag = 1
@@ -400,7 +322,7 @@
    message.success(data)
    // 刷新列表
    await getList()
  } catch {}
  } catch { }
}
const passWaitingPatient = async (item: QueueVO) => {