yxh
2026-10-18 1446994d504819c367e1ff667360eadb314f9ac6
src/views/ecg/queue/index.vue
@@ -36,7 +36,7 @@
        <el-input v-model="queryParams.roomId" placeholder="请输入诊室编号" clearable @keyup.enter="handleQuery"
          class="!w-240px" />
      </el-form-item>
      <el-form-item label="诊疗床号" prop="bedNo">
      <el-form-item label="诊室工位" prop="bedNo">
        <el-input v-model="queryParams.bedNo" placeholder="请输入诊疗床号" clearable @keyup.enter="handleQuery"
          class="!w-240px" />
      </el-form-item>
@@ -74,58 +74,31 @@
  <!-- 列表 -->
  <ContentWrap>
    <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
              link
              type="primary"
              @click="openAppointmentForm('preview', scope.row.patId, scope.row.bookCheckType)"
              v-hasPermi="['ecg:appointment:preview']"
          >
            查看
          </el-button>-->
          <!--
                    <el-button
                      link
                      type="danger"
                      @click="handleDelete(scope.row.id)"
                      v-hasPermi="['ecg:queue:delete']"
                    >
                      删除
                    </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>
          <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>
        </template>
      </el-table-column>
    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"
      :row-class-name="queueRowClass">
      <!--      <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">
      <el-table-column label="申请单号" align="center" prop="applyNo" min-width="110px" />
      <el-table-column label="检查项目" align="center" prop="bookCheckType" min-width="150px">
        <template #default="scope">
          {{ getCheckTypeName(scope.row.bookCheckType) }}
        </template>
      </el-table-column>
      <el-table-column label="来源" align="center" width="90px">
      <!--
        排队号(本需求):只保留 seq_num 一个号,显示为「检查项目前缀 + 号」。
        原来的「排队序号(bookSeqNum)」列已删除 —— 它和「检查序号(seqNum)」并存正是号混乱的来源。
        号按检查项目各自编号,不同检查项目会出现相同数字,故用前缀区分。
      -->
      <el-table-column label="排队序号" align="center" prop="seqNum">
        <template #default="scope">
          <!-- 优先用预约单平铺值,回退到 patDetails 快照 -->
          <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc ?? scope.row.patDetails?.source ?? 0" />
          {{ getCheckTypeSeqPrefix(scope.row.bookCheckType) }}{{ scope.row.seqNum ?? '-' }}
        </template>
      </el-table-column>
      <!-- <el-table-column label="过号标记" align="center" prop="passed" /> -->
      <el-table-column label="患者编号" align="center" prop="patId" />
      <el-table-column label="姓名" align="center" min-width="200px">
        <template #default="scope">
          {{ scope.row.patName }} <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" />{{ formatAge(scope.row.patBirthday) }}
          <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc" />
        </template>
      </el-table-column>
      <el-table-column label="预约时段" align="center" prop="bookTimeslot" min-width="100px">
@@ -133,12 +106,36 @@
          <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
        </template>
      </el-table-column>
      <el-table-column label="状态" align="center" prop="status">
      <el-table-column label="状态" align="center" prop="status" width="90px">
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="scope.row.status" />
        </template>
      </el-table-column>
      <el-table-column label="多耐药" 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" />
      <!-- VIP:显示「是/否」中文(原先直接显示 0/1)。字典 infra_boolean_string = true/是、false/否 -->
      <el-table-column label="VIP" align="center" width="80px">
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="Number(scope.row.isVip) === 1" />
        </template>
      </el-table-column>
      <el-table-column label="开单医师" align="center" prop="doctor" min-width="100px">
        <template #default="scope">{{ scope.row.doctor || '-' }}</template>
      </el-table-column>
      <!-- 需求1:医嘱号(HIS observationRequest.id.item[root=2.16.156.10011.1.28])。
           该节点在规范中非必须项,历史数据(新增列之前采集的)为空,显示 '-'。 -->
      <el-table-column label="医嘱号" align="center" prop="doctorAdviceNo" min-width="110px">
        <template #default="scope">
          {{ scope.row.doctorAdviceNo || '-' }}
        </template>
      </el-table-column>
      <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="episodeId" min-width="110px" />
      <!-- 本列标签由「就诊卡号」改为「门诊号」(经确认)。原因(详见《部署清单》5.1):
           HIS 在卡号槽位传空,medical_card 全库 159,116 行**无一非空**;
@@ -152,23 +149,6 @@
          </el-tag>
        </template>
      </el-table-column>
      <!-- 需求1:医嘱号(HIS observationRequest.id.item[root=2.16.156.10011.1.28])。
           该节点在规范中非必须项,历史数据(新增列之前采集的)为空,显示 '-'。 -->
      <el-table-column label="医嘱号" align="center" prop="doctorAdviceNo" min-width="110px">
        <template #default="scope">
          {{ scope.row.doctorAdviceNo || '-' }}
        </template>
      </el-table-column>
      <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" min-width="110px">
        <template #default="scope">{{ formatDateOnly(scope.row.patBirthday) }}</template>
      </el-table-column>
      <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" min-width="110px">
        <template #default="scope">{{ scope.row.patWardDesc || scope.row.patDetails?.wardDesc || '-' }}</template>
      </el-table-column>
@@ -179,35 +159,47 @@
          {{ scope.row.patBedNo || scope.row.patDetails?.bedNo || '-' }}
        </template>
      </el-table-column>
      <el-table-column label="出生日期" align="center" min-width="110px">
        <template #default="scope">{{ formatDateOnly(scope.row.patBirthday) }}</template>
      </el-table-column>
      <el-table-column label="患者电话" align="center" min-width="120px">
        <template #default="scope">
          {{ scope.row.patMobile || scope.row.patPhone || scope.row.patDetails?.mobile || '-' }}
        </template>
      </el-table-column>
      <el-table-column label="登记时间" align="center" min-width="150px">
        <template #default="scope">{{ formatDateTime(scope.row.registerDate) }}</template>
      </el-table-column>
      </el-table-column>
      <el-table-column label="开单日期" align="center" min-width="150px">
        <template #default="scope">{{ formatDateTime(scope.row.doctorTime) }}</template>
      </el-table-column>
      <el-table-column label="距今天数" align="center" width="90px">
        <template #default="scope">{{ formatDaysFromOrder(scope.row.doctorTime) }}</template>
      </el-table-column>
      <el-table-column label="开单医师" align="center" prop="doctor" min-width="100px">
        <template #default="scope">{{ scope.row.doctor || '-' }}</template>
      <el-table-column label="过期标记" align="center" prop="expired" />
      <el-table-column label="登记时间" align="center" min-width="150px">
        <template #default="scope">{{ formatDateTime(scope.row.registerDate) }}</template>
      </el-table-column>
      <el-table-column label="多耐药" width="150" align="center" prop="tolerance">
      <el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
      <!-- 操作列:固定在列表最后位置(fixed="right" 保证始终贴在最右侧)
           按钮配色与「预约记录」模块的操作列保持一致:
             加急 / 过号 → 同该模块「编辑」按钮(type=primary plain)
             召回        → 同该模块「删除」按钮(type=danger  plain) -->
      <el-table-column label="操作" fixed="right" align="center" width="180px">
        <template #default="scope">
          <!-- 需求6:多耐走字典;NULL 按"无"显示(Q12) -->
          <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" />
          <el-button type="primary" plain size="small" @click="handleJump(scope.row)" v-if="scope.row.status === 10"
            v-hasPermi="['ecg:queue:jump']">
            {{ scope.row.jumpFlag === 0 ? "加急" : "取消加急" }}
          </el-button>
          <el-button type="primary" plain size="small" @click="passWaitingPatient(scope.row)"
            v-if="scope.row.status === 10" v-hasPermi="['ecg:queue:pass']">
            过号
          </el-button>
          <el-button type="danger" plain size="small" @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>
        </template>
      </el-table-column>
      <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>
    <!-- 分页 -->
    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@@ -230,7 +222,7 @@
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 { getCheckTypeName, getCheckTypeSeqPrefix } from "../../../utils/checkTypeFormatter";
// 需求1:患者信息 18 项的公共格式化(年龄、距今天数等)
import { formatAge, formatDaysFromOrder, formatDateTime, formatDateOnly, resolveCardNo } from '@/utils/patientInfo'
@@ -385,4 +377,42 @@
  console.info("queue onActivated...")
  handleQuery()
})
/**
 * 队列行样式:把「已过号」的记录整行标红,方便医生一眼识别。
 *
 * 为什么按行高亮而不是只给状态标签上色:
 *   · 字典 ecg_queue_status 里 13 个状态**都没有配 color_type**,
 *     所以 dict-tag 渲染出来全是默认灰色标签,彼此没有区分度;
 *   · 过号是最需要被注意的状态(患者错过了叫号),整行标色比小标签更醒目。
 *
 * 已过号状态值(字典 ecg_queue_status):
 *   3 = 已过号-排队、5 = 已过号、7 = 已过号-安装
 */
const PASSED_STATUSES = [3, 5, 7]
const queueRowClass = ({ row }: { row: QueueVO }) => {
  return PASSED_STATUSES.includes(Number(row.status)) ? 'queue-row-passed' : ''
}
</script>
<style scoped lang="scss">
/* 已过号:整行浅红底 + 左侧红色竖条,扫一眼就能定位 */
:deep(.el-table .queue-row-passed) {
  /* el-table 的行背景取自该变量,覆写它可让行底色整体变红 */
  --el-table-tr-bg-color: var(--el-color-danger-light-9);
  td.el-table__cell {
    background-color: var(--el-color-danger-light-9);
  }
  /* 左侧竖条用 border-left 而非 box-shadow:与 el-table 的单元格边框模型更兼容 */
  td.el-table__cell:first-child {
    border-left: 4px solid var(--el-color-danger);
  }
  /* 鼠标悬停时保持红色基调,避免被 el-table 的 hover 背景覆盖 */
  &:hover>td.el-table__cell {
    background-color: var(--el-color-danger-light-8) !important;
  }
}
</style>