fix(#591): 请修复 Bug #591:【住院医生站-临床医嘱】长期医嘱点击停嘱未弹出时间录入弹窗

根因:
- Bug #请修复 Bug #591 存在的问题

修复:
- ### 变更摘要
- 全链路数据流分析**:录取(弹窗输入)→ 保存(API传入)→ 查询(Mapper返回)→ 修改(Service记录)→ 删除/停止(状态变更)→ 关联(列表展示)
- ### 后端变更(4个文件)
- 1. `AdviceBatchOpParam.java`** — 停嘱参数添加 `stopTime` 字段
- 新增 `@JsonFormat Date stopTime`,支持前端传入停嘱时间
- 2. `RequestBaseDto.java`** — 查询DTO添加 `stopUserName`、`stopTime` 字段
- 新增 `String stopUserName`(停嘱医生姓名)
- 新增 `Date stopTime`(停嘱时间)
- 3. `AdviceManageAppServiceImpl.java`** — 停嘱Service增强
- 优先使用前端传入的 `stopTime`,兜底用当前时间
- 通过 `SecurityUtils.getNickName()` 获取当前操作用户昵称,记录到 `updateBy`
- 药品和诊疗两个更新入口均已同步修改
- 4. `AdviceManageAppMapper.xml`** — 三个UNION ALL子查询添加字段
- 药品子查询:`T1.effective_dose_end AS stop_time` + `T1.update_by AS stop_user_name`
- 耗材子查询:`NULL AS stop_time` + `'' AS stop_user_name`
- 诊疗子查询:`T1.occurrence_end_time AS stop_time` + `T1.update_by AS stop_user_name`
- ### 前端变更(1个文件)
- `order/index.vue`**:
- 1. **停嘱时间弹窗** — 点击「停嘱」后弹出 `el-dialog`,内含 `el-date-picker`(datetime类型,默认当前时间),确定后才调用API
- 2. **表格列** — 在「皮试」列后面、「诊断」列前面新增两列:
- 「停嘱医生」`prop="stopUserName"`,宽度120px
- 「停嘱时间」`prop="stopTime"`,宽度170px
- 3. **`handleStopAdvice`** — 保留原有校验(未保存/未签发/已停止检查),校验通过后弹出时间选择弹窗而非直接调API
- 4. **`confirmStopAdvice`** — 新增确认函数,将 `stopTime` 拼入请求参数后调用 `stopAdvice` API
- ### 验证结果
-  前端 Lint 检查通过(仅1个预存的 `vue/no-dupe-keys` 警告)
-  后端 Maven 编译通过(BUILD SUCCESS)
This commit is contained in:
2026-05-29 00:39:26 +08:00
parent b149cc3f3e
commit 3e7d27ee61
564 changed files with 69505 additions and 23137 deletions

View File

@@ -1,56 +1,100 @@
<template>
<!-- 调试信息如果看到这个注释说明模板已加载 -->
<div class="package-management" @vue:mounted="console.log('PackageManagement 模板已挂载')">
<div
class="package-management"
@vue:mounted="console.log('PackageManagement 模板已挂载')"
>
<!-- 左侧导航栏 -->
<nav class="sidebar" :class="{ active: sidebarActive }">
<div class="sidebar-item" @click="navigateToTab(0)">检验类型</div>
<div class="sidebar-item" @click="navigateToTab(1)">检验项目</div>
<div class="sidebar-item active" @click="navigateToTab(2)">套餐设置</div>
<nav
class="sidebar"
:class="{ active: sidebarActive }"
>
<div
class="sidebar-item"
@click="navigateToTab(0)"
>
检验类型
</div>
<div
class="sidebar-item"
@click="navigateToTab(1)"
>
检验项目
</div>
<div
class="sidebar-item active"
@click="navigateToTab(2)"
>
套餐设置
</div>
</nav>
<!-- 主内容区域 -->
<main class="content">
<!-- 导航切换按钮响应式 -->
<div class="menu-toggle" @click="toggleSidebar">
<i class="fas fa-bars"></i>
<div
class="menu-toggle"
@click="toggleSidebar"
>
<i class="fas fa-bars" />
</div>
<!-- 查询过滤区域 -->
<section class="filter-bar">
<div class="filter-item">
<label>日期</label>
<input type="date" v-model="searchParams.startDate" placeholder="开始日期">
<input
v-model="searchParams.startDate"
type="date"
placeholder="开始日期"
>
<span></span>
<input type="date" v-model="searchParams.endDate" placeholder="结束日期">
<input
v-model="searchParams.endDate"
type="date"
placeholder="结束日期"
>
</div>
<div class="filter-item">
<label>卫生机构</label>
<el-select
v-model="selectedTenantId"
placeholder="请选择机构"
style="width: 150px;"
clearable
@change="handleSearch"
v-model="selectedTenantId"
placeholder="请选择机构"
style="width: 150px;"
clearable
@change="handleSearch"
>
<el-option
v-for="item in tenantOptions"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in tenantOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="filter-item">
<label>套餐名称</label>
<input type="text" v-model="searchParams.packageName" placeholder="套餐名称">
<input
v-model="searchParams.packageName"
type="text"
placeholder="套餐名称"
>
</div>
<div class="filter-item">
<label>套餐级别</label>
<select v-model="searchParams.packageLevel">
<option value="">请选择套餐级别</option>
<option value="全院套餐">全院套餐</option>
<option value="科室套餐">科室套餐</option>
<option value="个人套餐">个人套餐</option>
<option value="">
请选择套餐级别
</option>
<option value="全院套餐">
全院套餐
</option>
<option value="科室套餐">
科室套餐
</option>
<option value="个人套餐">
个人套餐
</option>
</select>
</div>
<div class="filter-item">
@@ -62,20 +106,20 @@
<div class="filter-item filter-item-department">
<label>科室</label>
<el-tree-select
v-model="searchParams.department"
placeholder="请选择科室"
:data="departments"
:props="{
value: 'name',
label: 'name',
children: 'children'
}"
value-key="name"
check-strictly
:expand-on-click-node="false"
clearable
style="width: 200px;"
/>
v-model="searchParams.department"
placeholder="请选择科室"
:data="departments"
:props="{
value: 'name',
label: 'name',
children: 'children'
}"
value-key="name"
check-strictly
:expand-on-click-node="false"
clearable
style="width: 200px;"
/>
</div>
<div class="filter-item">
<label>用户</label>
@@ -102,11 +146,51 @@
<!-- 操作按钮组 -->
<div class="button-group">
<button class="btn btn-search" @click="handleSearch"><i class="fas fa-search" style="margin-right: 6px;"></i>查询</button>
<button class="btn btn-reset" @click="handleReset"><i class="fas fa-redo" style="margin-right: 6px;"></i>重置</button>
<button class="btn btn-primary" @click="handleAdd"><i class="fas fa-plus" style="margin-right: 6px;"></i>新增</button>
<button class="btn btn-export" @click="handleExport"><i class="fas fa-download" style="margin-right: 6px;"></i>导出</button>
<button class="btn btn-copy" @click="returnToPackageSetup"><i class="fas fa-arrow-left" style="margin-right: 6px;"></i>返回</button>
<button
class="btn btn-search"
@click="handleSearch"
>
<i
class="fas fa-search"
style="margin-right: 6px;"
/>查询
</button>
<button
class="btn btn-reset"
@click="handleReset"
>
<i
class="fas fa-redo"
style="margin-right: 6px;"
/>重置
</button>
<button
class="btn btn-primary"
@click="handleAdd"
>
<i
class="fas fa-plus"
style="margin-right: 6px;"
/>新增
</button>
<button
class="btn btn-export"
@click="handleExport"
>
<i
class="fas fa-download"
style="margin-right: 6px;"
/>导出
</button>
<button
class="btn btn-copy"
@click="returnToPackageSetup"
>
<i
class="fas fa-arrow-left"
style="margin-right: 6px;"
/>返回
</button>
</div>
</section>
@@ -123,9 +207,15 @@
<th>套餐级别</th>
<th>科室</th>
<th>用户</th>
<th class="text-right">金额</th>
<th class="text-right">服务费</th>
<th class="text-right">总金额</th>
<th class="text-right">
金额
</th>
<th class="text-right">
服务费
</th>
<th class="text-right">
总金额
</th>
<th>组合套餐</th>
<th>显示套餐名</th>
<th>启用标志</th>
@@ -134,7 +224,10 @@
</tr>
</thead>
<tbody>
<tr v-for="item in filteredData" :key="item.id">
<tr
v-for="item in filteredData"
:key="item.id"
>
<td>{{ item.id }}</td>
<td>{{ item.hospital }}</td>
<td>{{ item.date }}</td>
@@ -143,33 +236,104 @@
<td>{{ item.level }}</td>
<td>{{ item.dept || '-' }}</td>
<td>{{ item.user || '-' }}</td>
<td class="text-right">{{ item.amount.toFixed(2) }}</td>
<td class="text-right">{{ item.fee.toFixed(2) }}</td>
<td class="text-right">{{ item.total.toFixed(2) }}</td>
<td><span class="status-tag" :class="item.combined === '是' ? 'status-no' : 'status-yes'">{{ item.combined }}</span></td>
<td><span class="status-tag" :class="item.display === '是' ? 'status-yes' : 'status-no'">{{ item.display }}</span></td>
<td><span class="status-tag" :class="item.enabled === '是' ? 'status-yes' : 'status-no'">{{ item.enabled }}</span></td>
<td class="text-right">
{{ item.amount.toFixed(2) }}
</td>
<td class="text-right">
{{ item.fee.toFixed(2) }}
</td>
<td class="text-right">
{{ item.total.toFixed(2) }}
</td>
<td>
<span
class="status-tag"
:class="item.combined === '是' ? 'status-no' : 'status-yes'"
>{{ item.combined }}</span>
</td>
<td>
<span
class="status-tag"
:class="item.display === '是' ? 'status-yes' : 'status-no'"
>{{ item.display }}</span>
</td>
<td>
<span
class="status-tag"
:class="item.enabled === '是' ? 'status-yes' : 'status-no'"
>{{ item.enabled }}</span>
</td>
<td>{{ item.operator }}</td>
<td class="action-cell">
<div class="action-btns">
<button class="action-btn edit-btn" @click="handleEdit(item)">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path>
<path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path>
<button
class="action-btn edit-btn"
@click="handleEdit(item)"
>
<svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" />
<path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" />
</svg>
</button>
<button class="action-btn view-btn" @click="handleView(item)">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
<circle cx="12" cy="12" r="3"></circle>
<button
class="action-btn view-btn"
@click="handleView(item)"
>
<svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" />
<circle
cx="12"
cy="12"
r="3"
/>
</svg>
</button>
<button class="action-btn delete-btn" @click="handleDelete(item)">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="3 6 5 6 21 6"></polyline>
<path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path>
<line x1="10" y1="11" x2="10" y2="17"></line>
<line x1="14" y1="11" x2="14" y2="17"></line>
<button
class="action-btn delete-btn"
@click="handleDelete(item)"
>
<svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="none"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="3 6 5 6 21 6" />
<path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
<line
x1="10"
y1="11"
x2="10"
y2="17"
/>
<line
x1="14"
y1="11"
x2="14"
y2="17"
/>
</svg>
</button>
</div>
@@ -185,7 +349,9 @@
class="page-btn"
:disabled="currentPage === 1"
@click="handlePrevPage"
>&lt;</button>
>
&lt;
</button>
<button
v-for="page in pageButtons"
:key="page"
@@ -193,13 +359,19 @@
:class="{ active: page === currentPage }"
:disabled="page === '...'"
@click="handlePageChange(page)"
>{{ page }}</button>
>
{{ page }}
</button>
<button
class="page-btn"
:disabled="currentPage >= totalPages || totalPages <= 1"
@click="handleNextPage"
>&gt;</button>
<div class="total-count">总数{{ total }}</div>
>
&gt;
</button>
<div class="total-count">
总数{{ total }}
</div>
</div>
</main>
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -1,31 +1,83 @@
<template>
<div class="app-container">
<div class="config-header">
<el-button type="primary" @click="handleDefault">默认(M)</el-button>
<el-button type="success" @click="handleSave">保存(S)</el-button>
<el-button type="danger" @click="handleClose">关闭(X)</el-button>
<el-button
type="primary"
@click="handleDefault"
>
默认(M)
</el-button>
<el-button
type="success"
@click="handleSave"
>
保存(S)
</el-button>
<el-button
type="danger"
@click="handleClose"
>
关闭(X)
</el-button>
</div>
<el-tabs v-model="activeTab" class="config-tabs">
<el-tab-pane label="划价收费1" name="tab1">
<div class="tab-content">划价收费1相关配置</div>
<el-tabs
v-model="activeTab"
class="config-tabs"
>
<el-tab-pane
label="划价收费1"
name="tab1"
>
<div class="tab-content">
划价收费1相关配置
</div>
</el-tab-pane>
<el-tab-pane label="划价收费2" name="tab2">
<div class="tab-content">划价收费2相关配置</div>
<el-tab-pane
label="划价收费2"
name="tab2"
>
<div class="tab-content">
划价收费2相关配置
</div>
</el-tab-pane>
<el-tab-pane label="挂号处理" name="tab3">
<el-form ref="formRef" :model="formData" label-width="150px" class="config-form compact-form">
<el-tab-pane
label="挂号处理"
name="tab3"
>
<el-form
ref="formRef"
:model="formData"
label-width="150px"
class="config-form compact-form"
>
<!-- 第一行 -->
<div class="form-row">
<el-form-item label="病历本费用(元)" prop="medicalRecordFee">
<el-input-number v-model="formData.medicalRecordFee" style="width: 150px" :controls-position="'right'" :step="1" :min="0" />
<el-form-item
label="病历本费用(元)"
prop="medicalRecordFee"
>
<el-input-number
v-model="formData.medicalRecordFee"
style="width: 150px"
:controls-position="'right'"
:step="1"
:min="0"
/>
</el-form-item>
<el-form-item label="" prop="medicalRecordFlag" checkbox-label>
<el-form-item
label=""
prop="medicalRecordFlag"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.medicalRecordFlag" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.medicalRecordFlag"
style="margin-right: 8px;"
/>
<span>病历费入账标志</span>
</div>
</template>
@@ -34,13 +86,29 @@
<!-- 第二行 -->
<div class="form-row">
<el-form-item label="就诊卡费(元)" prop="patientCardFee">
<el-input-number v-model="formData.patientCardFee" style="width: 150px" :controls-position="'right'" :step="1" :min="0" />
<el-form-item
label="就诊卡费(元)"
prop="patientCardFee"
>
<el-input-number
v-model="formData.patientCardFee"
style="width: 150px"
:controls-position="'right'"
:step="1"
:min="0"
/>
</el-form-item>
<el-form-item label="" prop="isNightShift" checkbox-label>
<el-form-item
label=""
prop="isNightShift"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.isNightShift" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.isNightShift"
style="margin-right: 8px;"
/>
<span>是否启用晚班</span>
</div>
</template>
@@ -49,33 +117,60 @@
<!-- 第三行 -->
<div class="form-row">
<el-form-item label="" prop="patientCardFlag" checkbox-label>
<el-form-item
label=""
prop="patientCardFlag"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.patientCardFlag" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.patientCardFlag"
style="margin-right: 8px;"
/>
<span>就诊卡记账标志</span>
</div>
</template>
</el-form-item>
<el-form-item label="上午接诊起始时间" prop="morningStartTime">
<el-input v-model="formData.morningStartTime" style="width: 150px" />
<el-form-item
label="上午接诊起始时间"
prop="morningStartTime"
>
<el-input
v-model="formData.morningStartTime"
style="width: 150px"
/>
</el-form-item>
</div>
<!-- 第四行 -->
<div class="form-row">
<el-form-item label="" prop="autoGenerateOutpatientNo" checkbox-label>
<el-form-item
label=""
prop="autoGenerateOutpatientNo"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.autoGenerateOutpatientNo" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.autoGenerateOutpatientNo"
style="margin-right: 8px;"
/>
<span>自动产生门诊号</span>
</div>
</template>
</el-form-item>
<el-form-item label="" prop="allowModifyOutpatientNo" checkbox-label>
<el-form-item
label=""
prop="allowModifyOutpatientNo"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.allowModifyOutpatientNo" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.allowModifyOutpatientNo"
style="margin-right: 8px;"
/>
<span>建档时是否允许修改门诊号</span>
</div>
</template>
@@ -84,49 +179,104 @@
<!-- 第五行 -->
<div class="form-row">
<el-form-item label="下午起始时间" prop="afternoonStartTime">
<el-input v-model="formData.afternoonStartTime" style="width: 150px" />
<el-form-item
label="下午起始时间"
prop="afternoonStartTime"
>
<el-input
v-model="formData.afternoonStartTime"
style="width: 150px"
/>
</el-form-item>
<el-form-item label="晚上起始时间" prop="eveningStartTime" v-if="formData.isNightShift">
<el-input v-model="formData.eveningStartTime" style="width: 150px" />
<el-form-item
v-if="formData.isNightShift"
label="晚上起始时间"
prop="eveningStartTime"
>
<el-input
v-model="formData.eveningStartTime"
style="width: 150px"
/>
</el-form-item>
</div>
<!-- 第六行 -->
<div class="form-row">
<el-form-item label="挂号有效期(天)" prop="registrationValidity">
<el-input-number v-model="formData.registrationValidity" style="width: 150px" :controls-position="'right'" :step="1" :min="0" />
<el-form-item
label="挂号有效期(天)"
prop="registrationValidity"
>
<el-input-number
v-model="formData.registrationValidity"
style="width: 150px"
:controls-position="'right'"
:step="1"
:min="0"
/>
</el-form-item>
<el-form-item label="挂号单据模式" prop="registrationDocumentMode">
<el-select v-model="formData.registrationDocumentMode" style="width: 150px">
<el-option label="使用发票" value="使用发票" />
<el-option label="普通单据" value="其他模式" />
<el-form-item
label="挂号单据模式"
prop="registrationDocumentMode"
>
<el-select
v-model="formData.registrationDocumentMode"
style="width: 150px"
>
<el-option
label="使用发票"
value="使用发票"
/>
<el-option
label="普通单据"
value="其他模式"
/>
</el-select>
</el-form-item>
</div>
<!-- 第七行 -->
<div class="form-row">
<el-form-item label="" prop="exemptFlag" checkbox-label>
<el-form-item
label=""
prop="exemptFlag"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.exemptFlag" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.exemptFlag"
style="margin-right: 8px;"
/>
<span>减免标志</span>
</div>
</template>
</el-form-item>
<el-form-item label="" prop="consultationFlag" checkbox-label>
<el-form-item
label=""
prop="consultationFlag"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.consultationFlag" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.consultationFlag"
style="margin-right: 8px;"
/>
<span>义诊标志</span>
</div>
</template>
</el-form-item>
<el-form-item label="" prop="enableHolidayFeeFloat" checkbox-label>
<el-form-item
label=""
prop="enableHolidayFeeFloat"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.enableHolidayFeeFloat" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.enableHolidayFeeFloat"
style="margin-right: 8px;"
/>
<span>启用法定节假日挂号费浮动</span>
</div>
</template>
@@ -135,13 +285,29 @@
<!-- 第八行 -->
<div class="form-row">
<el-form-item label="监护人规定年龄(岁)" prop="guardianAge">
<el-input-number v-model="formData.guardianAge" style="width: 150px" :controls-position="'right'" :step="1" :min="0" />
<el-form-item
label="监护人规定年龄(岁)"
prop="guardianAge"
>
<el-input-number
v-model="formData.guardianAge"
style="width: 150px"
:controls-position="'right'"
:step="1"
:min="0"
/>
</el-form-item>
<el-form-item label="" prop="enableDoubleScreen" checkbox-label>
<el-form-item
label=""
prop="enableDoubleScreen"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.enableDoubleScreen" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.enableDoubleScreen"
style="margin-right: 8px;"
/>
<span>门诊挂号启用双屏</span>
</div>
</template>
@@ -150,10 +316,17 @@
<!-- 第九行 -->
<div class="form-row">
<el-form-item label="" prop="optionalRegistrationType" checkbox-label>
<el-form-item
label=""
prop="optionalRegistrationType"
checkbox-label
>
<template #label>
<div class="checkbox-label-container">
<el-checkbox v-model="formData.optionalRegistrationType" style="margin-right: 8px;" />
<el-checkbox
v-model="formData.optionalRegistrationType"
style="margin-right: 8px;"
/>
<span>挂号类型可选择</span>
</div>
</template>
@@ -162,20 +335,40 @@
</el-form>
</el-tab-pane>
<el-tab-pane label="挂号预约" name="tab4">
<div class="tab-content">挂号预约相关配置</div>
<el-tab-pane
label="挂号预约"
name="tab4"
>
<div class="tab-content">
挂号预约相关配置
</div>
</el-tab-pane>
<el-tab-pane label="打印设置" name="tab5">
<el-checkbox v-model="formData.isPrint">是否打印挂号单</el-checkbox>
<el-tab-pane
label="打印设置"
name="tab5"
>
<el-checkbox v-model="formData.isPrint">
是否打印挂号单
</el-checkbox>
</el-tab-pane>
<el-tab-pane label="其他选项" name="tab6">
<div class="tab-content">其他选项相关配置</div>
<el-tab-pane
label="其他选项"
name="tab6"
>
<div class="tab-content">
其他选项相关配置
</div>
</el-tab-pane>
<el-tab-pane label="病人账户" name="tab7">
<div class="tab-content">病人账户相关配置</div>
<el-tab-pane
label="病人账户"
name="tab7"
>
<div class="tab-content">
病人账户相关配置
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@@ -2,7 +2,11 @@
<div class="package-management">
<!-- 顶部筛选栏 -->
<div class="filter-section">
<el-form :model="queryParams" :inline="true" label-width="80px">
<el-form
:model="queryParams"
:inline="true"
label-width="80px"
>
<el-form-item label="日期">
<el-date-picker
v-model="dateRange"
@@ -17,7 +21,13 @@
</el-form-item>
<el-form-item label="卫生机构">
<el-select v-model="queryParams.organization" placeholder="请选择机构" style="width: 150px" clearable filterable>
<el-select
v-model="queryParams.organization"
placeholder="请选择机构"
style="width: 150px"
clearable
filterable
>
<el-option
v-for="org in organizationOptions"
:key="org.value"
@@ -37,7 +47,12 @@
</el-form-item>
<el-form-item label="套餐级别">
<el-select v-model="queryParams.packageLevel" placeholder="请选择套餐级别" style="width: 150px" clearable>
<el-select
v-model="queryParams.packageLevel"
placeholder="请选择套餐级别"
style="width: 150px"
clearable
>
<el-option
v-for="item in packageLevelOptions"
:key="item.dictValue"
@@ -48,13 +63,27 @@
</el-form-item>
<el-form-item label="套餐类别">
<el-select v-model="queryParams.packageType" placeholder="请选择套餐类别" style="width: 150px" clearable>
<el-option label="检查套餐" value="检查套餐" />
<el-select
v-model="queryParams.packageType"
placeholder="请选择套餐类别"
style="width: 150px"
clearable
>
<el-option
label="检查套餐"
value="检查套餐"
/>
</el-select>
</el-form-item>
<el-form-item label="科室">
<el-select v-model="queryParams.department" placeholder="请选择科室" style="width: 150px" clearable filterable>
<el-select
v-model="queryParams.department"
placeholder="请选择科室"
style="width: 150px"
clearable
filterable
>
<el-option
v-for="dept in departments"
:key="dept.dictValue"
@@ -74,9 +103,26 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery" icon="Search">查询</el-button>
<el-button @click="handleReset" icon="Refresh">重置</el-button>
<el-button type="success" @click="handleAdd" icon="Plus">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
查询
</el-button>
<el-button
icon="Refresh"
@click="handleReset"
>
重置
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
</div>
@@ -85,101 +131,177 @@
<div class="table-section">
<div class="table-wrapper">
<el-table
v-loading="loading"
:data="tableData"
border
border
style="width: 100%"
v-loading="loading"
:max-height="600"
>
<el-table-column prop="id" label="ID" width="80" align="center" />
<el-table-column prop="organization" label="卫生机构" width="120" align="center" />
<el-table-column prop="maintainDate" label="日期" width="120" align="center" />
<el-table-column prop="packageName" label="套餐名称" min-width="150" show-overflow-tooltip />
<el-table-column prop="packageType" label="套餐类别" width="100" align="center" />
<el-table-column prop="packageLevel" label="套餐级别" width="100" align="center">
<template #default="{ row }">
{{ getLevelLabel(row.packageLevel) }}
</template>
</el-table-column>
<el-table-column prop="department" label="科室" width="150" align="center">
<template #default="{ row }">
<span :title="row.department && /^[A-Z]\d{2}$/.test(row.department.trim()) ? '旧编码格式,建议编辑套餐重新选择科室' : ''">
{{ getDeptName(row.department) }}
</span>
</template>
</el-table-column>
<el-table-column prop="user" label="用户" width="100" align="center" />
<el-table-column prop="packagePrice" label="金额" width="100" align="center">
<template #default="{ row }">
{{ (row.packagePrice || 0).toFixed(2) }}
</template>
</el-table-column>
<el-table-column prop="serviceFee" label="服务费" width="100" align="center">
<template #default="{ row }">
{{ (row.serviceFee || 0).toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="总金额" width="100" align="center">
<template #default="{ row }">
{{ ((row.packagePrice || 0) + (row.serviceFee || 0)).toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="组合套餐" width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.packagePriceEnabled === 1 ? 'success' : 'danger'">
{{ row.packagePriceEnabled === 1 ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="显示套餐名" width="110" align="center">
<template #default="{ row }">
<el-tag :type="row.showPackageName === 1 ? 'success' : 'info'">
{{ row.showPackageName === 1 ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="启用标志" width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.isDisabled === 0 ? 'success' : 'danger'">
{{ row.isDisabled === 0 ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="creator" label="操作人" width="100" align="center" />
<el-table-column label="操作" width="180" align="center" fixed="right">
<template #default="{ row }">
<div class="actions">
<el-button
class="btn btn-edit"
size="small"
circle
@click="handleEdit(row)"
title="编辑"
>
</el-button>
<el-button
class="btn btn-view"
size="small"
circle
@click="handleView(row)"
title="查看"
>
👁
</el-button>
<el-button
class="btn btn-delete"
size="small"
circle
@click="handleDelete(row)"
title="删除"
>
</el-button>
</div>
</template>
</el-table-column>
</el-table>
<el-table-column
prop="id"
label="ID"
width="80"
align="center"
/>
<el-table-column
prop="organization"
label="卫生机构"
width="120"
align="center"
/>
<el-table-column
prop="maintainDate"
label="日期"
width="120"
align="center"
/>
<el-table-column
prop="packageName"
label="套餐名称"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
prop="packageType"
label="套餐类别"
width="100"
align="center"
/>
<el-table-column
prop="packageLevel"
label="套餐级别"
width="100"
align="center"
>
<template #default="{ row }">
{{ getLevelLabel(row.packageLevel) }}
</template>
</el-table-column>
<el-table-column
prop="department"
label="科室"
width="150"
align="center"
>
<template #default="{ row }">
<span :title="row.department && /^[A-Z]\d{2}$/.test(row.department.trim()) ? '旧编码格式,建议编辑套餐重新选择科室' : ''">
{{ getDeptName(row.department) }}
</span>
</template>
</el-table-column>
<el-table-column
prop="user"
label="用户"
width="100"
align="center"
/>
<el-table-column
prop="packagePrice"
label="金额"
width="100"
align="center"
>
<template #default="{ row }">
{{ (row.packagePrice || 0).toFixed(2) }}
</template>
</el-table-column>
<el-table-column
prop="serviceFee"
label="服务费"
width="100"
align="center"
>
<template #default="{ row }">
{{ (row.serviceFee || 0).toFixed(2) }}
</template>
</el-table-column>
<el-table-column
label="总金额"
width="100"
align="center"
>
<template #default="{ row }">
{{ ((row.packagePrice || 0) + (row.serviceFee || 0)).toFixed(2) }}
</template>
</el-table-column>
<el-table-column
label="组合套餐"
width="100"
align="center"
>
<template #default="{ row }">
<el-tag :type="row.packagePriceEnabled === 1 ? 'success' : 'danger'">
{{ row.packagePriceEnabled === 1 ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="显示套餐名"
width="110"
align="center"
>
<template #default="{ row }">
<el-tag :type="row.showPackageName === 1 ? 'success' : 'info'">
{{ row.showPackageName === 1 ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="启用标志"
width="100"
align="center"
>
<template #default="{ row }">
<el-tag :type="row.isDisabled === 0 ? 'success' : 'danger'">
{{ row.isDisabled === 0 ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column
prop="creator"
label="操作人"
width="100"
align="center"
/>
<el-table-column
label="操作"
width="180"
align="center"
fixed="right"
>
<template #default="{ row }">
<div class="actions">
<el-button
class="btn btn-edit"
size="small"
circle
title="编辑"
@click="handleEdit(row)"
>
</el-button>
<el-button
class="btn btn-view"
size="small"
circle
title="查看"
@click="handleView(row)"
>
👁
</el-button>
<el-button
class="btn btn-delete"
size="small"
circle
title="删除"
@click="handleDelete(row)"
>
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>

View File

@@ -2,14 +2,34 @@
<div class="package-settings">
<!-- 顶部操作按钮区 -->
<div class="header-actions">
<el-button type="primary" @click="handlePackageManagement">套餐管理</el-button>
<el-button type="primary" v-if="!isReadOnly" @click="handleRefresh" :loading="loading">刷新</el-button>
<el-button v-if="!isReadOnly" type="success" @click="handleSave">保存</el-button>
<el-button
type="primary"
@click="handlePackageManagement"
>
套餐管理
</el-button>
<el-button
v-if="!isReadOnly"
type="primary"
:loading="loading"
@click="handleRefresh"
>
刷新
</el-button>
<el-button
v-if="!isReadOnly"
type="success"
@click="handleSave"
>
保存
</el-button>
</div>
<!-- 基本信息表单区 -->
<div class="basic-info-section">
<h3 class="section-title">基本信息</h3>
<h3 class="section-title">
基本信息
</h3>
<el-form
ref="basicFormRef"
:model="formData"
@@ -18,22 +38,46 @@
class="basic-form"
>
<el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="套餐类别" prop="packageType">
<el-select v-model="formData.packageType" placeholder="请选择套餐类别" style="width: 100%" :disabled="isReadOnly">
<el-option label="检查套餐" value="检查套餐" />
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item
label="套餐类别"
prop="packageType"
>
<el-select
v-model="formData.packageType"
placeholder="请选择套餐类别"
style="width: 100%"
:disabled="isReadOnly"
>
<el-option
label="检查套餐"
value="检查套餐"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="套餐级别" prop="packageLevel">
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item
label="套餐级别"
prop="packageLevel"
>
<el-select
v-model="formData.packageLevel"
placeholder="请选择套餐级别"
style="width: 100%"
@change="handlePackageLevelChange"
:disabled="isReadOnly"
@change="handlePackageLevelChange"
>
<el-option
v-for="item in packageLevelOptions"
@@ -45,9 +89,23 @@
</el-form-item>
</el-col>
<el-col v-if="formData.packageLevel === '2'" :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="科室选择" prop="department">
<el-select v-model="formData.department" placeholder="请选择科室" style="width: 100%" :disabled="isReadOnly">
<el-col
v-if="formData.packageLevel === '2'"
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item
label="科室选择"
prop="department"
>
<el-select
v-model="formData.department"
placeholder="请选择科室"
style="width: 100%"
:disabled="isReadOnly"
>
<el-option
v-for="dept in departments"
:key="dept.deptCode || dept.dictValue"
@@ -58,23 +116,62 @@
</el-form-item>
</el-col>
<el-col v-if="formData.packageLevel === '3'" :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="用户选择" prop="user">
<el-select v-model="formData.user" placeholder="请选择用户" style="width: 100%" :disabled="isReadOnly">
<el-option label="当前用户" value="当前用户" />
<el-col
v-if="formData.packageLevel === '3'"
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item
label="用户选择"
prop="user"
>
<el-select
v-model="formData.user"
placeholder="请选择用户"
style="width: 100%"
:disabled="isReadOnly"
>
<el-option
label="当前用户"
value="当前用户"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="套餐名称" prop="packageName">
<el-input v-model="formData.packageName" placeholder="请输入套餐名称" :disabled="isReadOnly" />
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item
label="套餐名称"
prop="packageName"
>
<el-input
v-model="formData.packageName"
placeholder="请输入套餐名称"
:disabled="isReadOnly"
/>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="卫生机构">
<el-select v-model="formData.organization" placeholder="请选择卫生机构" style="width: 100%" :disabled="isReadOnly">
<el-select
v-model="formData.organization"
placeholder="请选择卫生机构"
style="width: 100%"
:disabled="isReadOnly"
>
<el-option
v-for="org in organizationOptions"
:key="org.value"
@@ -85,108 +182,217 @@
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="套餐金额">
<el-input v-model="packagePriceDisplay" :disabled="true" placeholder="自动计算">
<template #append></template>
<el-input
v-model="packagePriceDisplay"
:disabled="true"
placeholder="自动计算"
>
<template #append>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="折扣">
<el-input
v-model="formData.discount"
placeholder="请输入折扣"
@input="handleDiscountChange"
:disabled="isReadOnly"
@input="handleDiscountChange"
>
<template #append>%</template>
<template #append>
%
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="制单人">
<el-input v-model="formData.creator" :disabled="true" />
<el-input
v-model="formData.creator"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="是否停用">
<el-radio-group v-model="formData.isDisabled" :disabled="isReadOnly">
<el-radio :value="0">启用</el-radio>
<el-radio :value="1">停用</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="是否停用">
<el-radio-group
v-model="formData.isDisabled"
:disabled="isReadOnly"
>
<el-radio :value="0">
启用
</el-radio>
<el-radio :value="1">
停用
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="显示套餐名">
<el-radio-group v-model="formData.showPackageName" :disabled="isReadOnly">
<el-radio :value="1"></el-radio>
<el-radio :value="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="显示套餐名">
<el-radio-group
v-model="formData.showPackageName"
:disabled="isReadOnly"
>
<el-radio :value="1">
</el-radio>
<el-radio :value="0">
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="生成服务费">
<el-radio-group v-model="formData.generateServiceFee" :disabled="isReadOnly">
<el-radio :value="1"></el-radio>
<el-radio :value="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="生成服务费">
<el-radio-group
v-model="formData.generateServiceFee"
:disabled="isReadOnly"
>
<el-radio :value="1">
</el-radio>
<el-radio :value="0">
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="套餐价格">
<el-radio-group v-model="formData.packagePriceEnabled" :disabled="isReadOnly">
<el-radio :value="1">启用</el-radio>
<el-radio :value="0">不启用</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="套餐价格">
<el-radio-group
v-model="formData.packagePriceEnabled"
:disabled="isReadOnly"
>
<el-radio :value="1">
启用
</el-radio>
<el-radio :value="0">
不启用
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6">
<el-form-item label="服务费">
<el-input-number
v-model="formData.serviceFee"
:precision="2"
:min="0"
placeholder="自动合计"
style="width: 100%"
disabled
/>
</el-form-item>
</el-col>
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
>
<el-form-item label="服务费">
<el-input-number
v-model="formData.serviceFee"
:precision="2"
:min="0"
placeholder="自动合计"
style="width: 100%"
disabled
/>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12">
<el-form-item label="备注">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" :disabled="isReadOnly" />
</el-form-item>
</el-col>
<el-col
:xs="24"
:sm="12"
:md="12"
:lg="12"
>
<el-form-item label="备注">
<el-input
v-model="formData.remark"
type="textarea"
placeholder="请输入备注"
:disabled="isReadOnly"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 套餐明细表格区 -->
<div class="package-detail-section">
<h3 class="section-title">套餐明细</h3>
<h3 class="section-title">
套餐明细
</h3>
<el-table
:data="detailData"
border
style="width: 100%"
:max-height="450"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="code" label="编号" width="120" align="center">
<el-table-column
type="index"
label="序号"
width="60"
align="center"
/>
<el-table-column
prop="code"
label="编号"
width="120"
align="center"
>
<template #default="{ row }">
<el-input v-if="row.editing" v-model="row.code" placeholder="请输入编号" />
<el-input
v-if="row.editing"
v-model="row.code"
placeholder="请输入编号"
/>
<span v-else>{{ row.code }}</span>
</template>
</el-table-column>
<el-table-column prop="itemName" label="项目名称/规格" min-width="200">
<el-table-column
prop="itemName"
label="项目名称/规格"
min-width="200"
>
<template #default="{ row }">
<div v-if="row.editing">
<el-select
@@ -196,10 +402,10 @@
remote
:remote-method="(query) => handleProjectSearch(query, row)"
style="width: 100%"
@change="handleItemSelect(row)"
@focus="initializeSearchList(row)"
:loading="diagnosisTreatmentList.length === 0"
clearable
@change="handleItemSelect(row)"
@focus="initializeSearchList(row)"
>
<el-option
v-for="item in (row.filteredList || diagnosisTreatmentList)"
@@ -218,11 +424,11 @@
<template #empty>
<div style="padding: 10px; text-align: center; color: #999;">
<div v-if="diagnosisTreatmentList.length > 0">
无匹配项目<br/>
无匹配项目<br>
<small>请尝试其他关键词</small>
</div>
<div v-else>
暂无项目数据<br/>
暂无项目数据<br>
<small>请先在【系统管理-目录管理-诊疗项目】中添加项目</small>
</div>
</div>
@@ -232,7 +438,12 @@
<span v-else>{{ row.itemName }}</span>
</template>
</el-table-column>
<el-table-column prop="dose" label="剂量" width="100" align="center">
<el-table-column
prop="dose"
label="剂量"
width="100"
align="center"
>
<template #default="{ row }">
<el-input
v-if="row.editing"
@@ -243,19 +454,42 @@
<span v-else>{{ row.dose || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="method" label="途径" width="80" align="center">
<el-table-column
prop="method"
label="途径"
width="80"
align="center"
>
<template #default="{ row }">
<el-input v-if="row.editing" v-model="row.method" placeholder="-" />
<el-input
v-if="row.editing"
v-model="row.method"
placeholder="-"
/>
<span v-else>{{ row.method || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="frequency" label="频次" width="80" align="center">
<el-table-column
prop="frequency"
label="频次"
width="80"
align="center"
>
<template #default="{ row }">
<el-input v-if="row.editing" v-model="row.frequency" placeholder="-" />
<el-input
v-if="row.editing"
v-model="row.frequency"
placeholder="-"
/>
<span v-else>{{ row.frequency || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="days" label="天数" width="100" align="center">
<el-table-column
prop="days"
label="天数"
width="100"
align="center"
>
<template #default="{ row }">
<el-input
v-if="row.editing"
@@ -266,7 +500,12 @@
<span v-else>{{ row.days || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="quantity" label="数量" width="100" align="center">
<el-table-column
prop="quantity"
label="数量"
width="100"
align="center"
>
<template #default="{ row }">
<el-input-number
v-if="row.editing"
@@ -281,13 +520,23 @@
<span v-else>{{ row.quantity }}</span>
</template>
</el-table-column>
<el-table-column prop="unit" label="单位" width="80" align="center">
<el-table-column
prop="unit"
label="单位"
width="80"
align="center"
>
<template #default="{ row }">
<span v-if="row.editing">{{ row.unit || '-' }}</span>
<span v-else>{{ row.unit || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="unitPrice" label="单价" width="150" align="center">
<el-table-column
prop="unitPrice"
label="单价"
width="150"
align="center"
>
<template #default="{ row }">
<el-input
v-if="row.editing"
@@ -300,12 +549,22 @@
<span v-else>{{ row.unitPrice?.toFixed(6) }}</span>
</template>
</el-table-column>
<el-table-column prop="amount" label="金额" width="100" align="center">
<el-table-column
prop="amount"
label="金额"
width="100"
align="center"
>
<template #default="{ row }">
{{ row.amount?.toFixed(2) || '0.00' }}
</template>
</el-table-column>
<el-table-column prop="serviceCharge" label="服务费" width="100" align="center">
<el-table-column
prop="serviceCharge"
label="服务费"
width="100"
align="center"
>
<template #default="{ row }">
<el-input-number
v-if="row.editing"
@@ -320,18 +579,37 @@
<span v-else>{{ row.serviceCharge?.toFixed(2) || '0.00' }}</span>
</template>
</el-table-column>
<el-table-column prop="total" label="总金额" width="100" align="center">
<el-table-column
prop="total"
label="总金额"
width="100"
align="center"
>
<template #default="{ row }">
{{ row.total?.toFixed(2) || '0.00' }}
</template>
</el-table-column>
<el-table-column prop="origin" label="产地" width="120">
<el-table-column
prop="origin"
label="产地"
width="120"
>
<template #default="{ row }">
<el-input v-if="row.editing" v-model="row.origin" placeholder="-" />
<el-input
v-if="row.editing"
v-model="row.origin"
placeholder="-"
/>
<span v-else>{{ row.origin || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="操作" v-if="!isReadOnly" width="150" align="center" fixed="right">
<el-table-column
v-if="!isReadOnly"
label="操作"
width="150"
align="center"
fixed="right"
>
<template #default="{ row, $index }">
<div class="actions">
<el-button
@@ -339,8 +617,8 @@
class="btn btn-edit"
size="small"
circle
@click="handleEditRow(row)"
title="编辑"
@click="handleEditRow(row)"
>
✏️
</el-button>
@@ -349,8 +627,8 @@
class="btn btn-confirm"
size="small"
circle
@click="handleConfirmRow(row)"
title="保存"
@click="handleConfirmRow(row)"
>
</el-button>
@@ -358,8 +636,8 @@
class="btn btn-add"
size="small"
circle
@click="handleAddRow"
title="添加"
@click="handleAddRow"
>
+
</el-button>
@@ -367,8 +645,8 @@
class="btn btn-delete"
size="small"
circle
@click="handleDeleteRow($index)"
title="删除"
@click="handleDeleteRow($index)"
>
</el-button>

View File

@@ -62,25 +62,47 @@
<div class="header">
<h1>{{ activeMenu }}管理</h1>
<div class="header-actions">
<button class="btn btn-add-new" @click="handleAddNewRow">+
<button
class="btn btn-add-new"
@click="handleAddNewRow"
>
+
</button>
</div>
</div>
<div class="table-container">
<div class="table-container">
<table>
<thead>
<tr>
<th style="width: 50px;"></th>
<th style="width: 100px;">*编码</th>
<th style="width: 150px;">*名称</th>
<th style="width: 150px;">*检查类型</th>
<th style="width: 120px;">选择部位</th>
<th style="width: 150px;">*执行科室</th>
<th style="width: 100px;">序号</th>
<th style="width: 150px;">备注</th>
<th style="width: 120px;">操作</th>
<th style="width: 50px;">
</th>
<th style="width: 100px;">
*编码
</th>
<th style="width: 150px;">
*名称
</th>
<th style="width: 150px;">
*检查类型
</th>
<th style="width: 120px;">
选择部位
</th>
<th style="width: 150px;">
*执行科室
</th>
<th style="width: 100px;">
序号
</th>
<th style="width: 150px;">
备注
</th>
<th style="width: 120px;">
操作
</th>
</tr>
</thead>
<tbody>
@@ -93,7 +115,11 @@
<td>{{ item.row }}</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入编码" v-model="item.code">
<input
v-model="item.code"
type="text"
placeholder="请输入编码"
>
</template>
<template v-else>
{{ item.code }}
@@ -101,7 +127,11 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入名称" v-model="item.name">
<input
v-model="item.name"
type="text"
placeholder="请输入名称"
>
</template>
<template v-else>
{{ item.name }}
@@ -109,8 +139,13 @@
</td>
<td>
<template v-if="item.editing">
<select v-model="item.type" :class="{ 'placeholder-text': !item.type }">
<option value="">选择检查类型</option>
<select
v-model="item.type"
:class="{ 'placeholder-text': !item.type }"
>
<option value="">
选择检查类型
</option>
<option
v-for="opt in checkTypeOptions"
:key="opt.value"
@@ -122,16 +157,28 @@
</template>
<template v-else>
<span v-if="item.type">{{ getCheckTypeLabel(item.type) }}</span>
<span v-else class="placeholder-text">选择检查类型</span>
<span
v-else
class="placeholder-text"
>选择检查类型</span>
</template>
</td>
<td class="checkbox-container">
<input type="checkbox" v-model="item.selected" @click.stop>
<input
v-model="item.selected"
type="checkbox"
@click.stop
>
</td>
<td>
<template v-if="item.editing">
<select v-model="item.department" :class="{ 'placeholder-text': !item.department }">
<option value="">选择执行科室</option>
<select
v-model="item.department"
:class="{ 'placeholder-text': !item.department }"
>
<option value="">
选择执行科室
</option>
<option
v-if="item.department"
:value="item.department"
@@ -149,12 +196,18 @@
</template>
<template v-else>
<span v-if="item.department">{{ item.department }}</span>
<span v-else class="placeholder-text">选择执行科室</span>
<span
v-else
class="placeholder-text"
>选择执行科室</span>
</template>
</td>
<td>
<template v-if="item.editing">
<input type="text" v-model="item.number">
<input
v-model="item.number"
type="text"
>
</template>
<template v-else>
{{ item.number }}
@@ -162,7 +215,11 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入备注" v-model="item.remark">
<input
v-model="item.remark"
type="text"
placeholder="请输入备注"
>
</template>
<template v-else>
{{ item.remark || '' }}
@@ -170,34 +227,50 @@
</td>
<td class="actions">
<template v-if="item.editing">
<button class="btn btn-confirm" @click.stop="handleConfirm(index)" title="保存">
<button
class="btn btn-confirm"
title="保存"
@click.stop="handleConfirm(index)"
>
</button>
<button class="btn btn-cancel" @click.stop="handleCancelEdit(index)" title="取消">
<button
class="btn btn-cancel"
title="取消"
@click.stop="handleCancelEdit(index)"
>
</button>
<button
v-if="!item.parentId"
class="btn btn-add"
@click.stop="handleAdd(index)"
title="添加子项"
@click.stop="handleAdd(index)"
>
+
</button>
</template>
<template v-else>
<button class="btn btn-edit" @click.stop="handleEdit(index)" title="修改">
<button
class="btn btn-edit"
title="修改"
@click.stop="handleEdit(index)"
>
</button>
<button
v-if="!item.parentId"
class="btn btn-add"
@click.stop="handleAdd(index)"
title="添加子项"
@click.stop="handleAdd(index)"
>
+
</button>
<button class="btn btn-delete" @click.stop="handleDelete(index)" title="删除">
<button
class="btn btn-delete"
title="删除"
@click.stop="handleDelete(index)"
>
</button>
</template>
@@ -214,57 +287,108 @@
<h1>{{ activeMenu }}管理</h1>
</div>
<div class="search-bar search-bar-method">
<div class="search-filters">
<div class="search-item">
<label>检查类型</label>
<el-select v-model="searchParamsMethod.checkType" placeholder="选择检查类型" style="width: 150px">
<el-option
v-for="item in checkTypeOptionsForMethodPart"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="search-item">
<label>名称</label>
<el-input placeholder="名称/编码" v-model="searchParamsMethod.name" />
</div>
<div class="search-item">
<label>费用套餐</label>
<el-select v-model="searchParamsMethod.packageName" placeholder="选择使用套餐" style="width: 150px" filterable clearable>
<el-option
v-for="pkg in checkPackages"
:key="pkg.id"
:label="pkg.packageName"
:value="pkg.packageName"
>
</el-option>
</el-select>
</div>
<div class="search-filters">
<div class="search-item">
<label>检查类型</label>
<el-select
v-model="searchParamsMethod.checkType"
placeholder="选择检查类型"
style="width: 150px"
>
<el-option
v-for="item in checkTypeOptionsForMethodPart"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="search-actions">
<el-button type="primary" @mouseenter="hoverAddButton = true" @mouseleave="hoverAddButton = false" @click="handleAddNewRow">新增</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
<el-button type="primary" @click="handleReset">重置</el-button>
<el-button type="success" @click="handleExport">导出表格</el-button>
<div class="search-item">
<label>名称</label>
<el-input
v-model="searchParamsMethod.name"
placeholder="名称/编码"
/>
</div>
<div class="search-item">
<label>费用套餐</label>
<el-select
v-model="searchParamsMethod.packageName"
placeholder="选择使用套餐"
style="width: 150px"
filterable
clearable
>
<el-option
v-for="pkg in checkPackages"
:key="pkg.id"
:label="pkg.packageName"
:value="pkg.packageName"
/>
</el-select>
</div>
</div>
<div class="search-actions">
<el-button
type="primary"
@mouseenter="hoverAddButton = true"
@mouseleave="hoverAddButton = false"
@click="handleAddNewRow"
>
新增
</el-button>
<el-button
type="primary"
@click="handleSearch"
>
查询
</el-button>
<el-button
type="primary"
@click="handleReset"
>
重置
</el-button>
<el-button
type="success"
@click="handleExport"
>
导出表格
</el-button>
</div>
</div>
<div class="table-container">
<table>
<thead>
<tr>
<th style="width: 50px;"></th>
<th style="width: 100px;">代码</th>
<th style="width: 150px;">名称</th>
<th style="width: 150px;">检查类型</th>
<th style="width: 150px;">套餐名称</th>
<th style="width: 100px;">曝光次数</th>
<th style="width: 100px;">序号</th>
<th style="width: 150px;">备注</th>
<th style="width: 120px;">操作</th>
<th style="width: 50px;">
</th>
<th style="width: 100px;">
代码
</th>
<th style="width: 150px;">
名称
</th>
<th style="width: 150px;">
检查类型
</th>
<th style="width: 150px;">
套餐名称
</th>
<th style="width: 100px;">
曝光次数
</th>
<th style="width: 100px;">
序号
</th>
<th style="width: 150px;">
备注
</th>
<th style="width: 120px;">
操作
</th>
</tr>
</thead>
<tbody>
@@ -277,7 +401,11 @@
<td>{{ item.row }}</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入编码" v-model="item.code">
<input
v-model="item.code"
type="text"
placeholder="请输入编码"
>
</template>
<template v-else>
{{ item.code }}
@@ -285,7 +413,11 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入方法名称" v-model="item.name">
<input
v-model="item.name"
type="text"
placeholder="请输入方法名称"
>
</template>
<template v-else>
{{ item.name }}
@@ -293,7 +425,11 @@
</td>
<td>
<template v-if="item.editing">
<el-select v-model="item.checkType" placeholder="选择检查类型" style="width: 100%">
<el-select
v-model="item.checkType"
placeholder="选择检查类型"
style="width: 100%"
>
<el-option
v-for="opt in checkTypeOptionsForMethodPart"
:key="opt.value"
@@ -332,15 +468,21 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" v-model="item.exposureNum">
<input
v-model="item.exposureNum"
type="text"
>
</template>
<template v-else>
{{ item.exposureNum || 0}}
{{ item.exposureNum || 0 }}
</template>
</td>
<td>
<template v-if="item.editing">
<input type="text" v-model="item.orderNum">
<input
v-model="item.orderNum"
type="text"
>
</template>
<template v-else>
{{ item.orderNum || '0' }}
@@ -348,7 +490,11 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入备注" v-model="item.remark">
<input
v-model="item.remark"
type="text"
placeholder="请输入备注"
>
</template>
<template v-else>
{{ item.remark || '' }}
@@ -356,21 +502,41 @@
</td>
<td class="actions">
<template v-if="item.editing">
<button class="btn btn-confirm" @click.stop="handleConfirm(index)" title="保存">
<button
class="btn btn-confirm"
title="保存"
@click.stop="handleConfirm(index)"
>
</button>
<button class="btn btn-cancel" @click.stop="handleCancelEdit(index)" title="取消">
<button
class="btn btn-cancel"
title="取消"
@click.stop="handleCancelEdit(index)"
>
</button>
</template>
<template v-else>
<button class="btn btn-edit" @click.stop="handleEdit(index)" title="编辑">
<button
class="btn btn-edit"
title="编辑"
@click.stop="handleEdit(index)"
>
</button>
<button class="btn btn-confirm" @click.stop="handleConfirm(index)" title="保存">
<button
class="btn btn-confirm"
title="保存"
@click.stop="handleConfirm(index)"
>
</button>
<button class="btn btn-delete" @click.stop="handleDelete(index)" title="删除">
<button
class="btn btn-delete"
title="删除"
@click.stop="handleDelete(index)"
>
</button>
</template>
@@ -387,65 +553,115 @@
<h1>{{ activeMenu }}管理</h1>
</div>
<div class="search-bar search-bar-part">
<div class="search-item">
<label>检查类型</label>
<el-select v-model="searchParamsPart.checkType" placeholder="选择检查类型" style="width: 150px">
<el-option
v-for="item in checkTypeOptionsForMethodPart"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="search-item">
<label>名称</label>
<el-input placeholder="名称/编码" v-model="searchParamsPart.name" />
</div>
<div class="search-item">
<label>费用套餐</label>
<el-select
v-model="searchParamsPart.packageName"
placeholder="选择套餐"
style="width: 150px"
filterable
clearable
:filter-method="filterPackageOptions"
>
<el-option
v-for="pkg in filteredPackageOptions"
:key="pkg.id"
:label="pkg.packageName"
:value="pkg.packageName"
/>
</el-select>
</div>
<div class="search-actions">
<el-button type="primary" @click="handleAddNewRow">新增</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
<el-button type="primary" @click="handleReset">重置</el-button>
<el-button type="success" @click="handleExport">导出表格</el-button>
</div>
<div class="search-item">
<label>检查类型</label>
<el-select
v-model="searchParamsPart.checkType"
placeholder="选择检查类型"
style="width: 150px"
>
<el-option
v-for="item in checkTypeOptionsForMethodPart"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="search-item">
<label>名称</label>
<el-input
v-model="searchParamsPart.name"
placeholder="名称/编码"
/>
</div>
<div class="search-item">
<label>费用套餐</label>
<el-select
v-model="searchParamsPart.packageName"
placeholder="选择套餐"
style="width: 150px"
filterable
clearable
:filter-method="filterPackageOptions"
>
<el-option
v-for="pkg in filteredPackageOptions"
:key="pkg.id"
:label="pkg.packageName"
:value="pkg.packageName"
/>
</el-select>
</div>
<div class="search-actions">
<el-button
type="primary"
@click="handleAddNewRow"
>
新增
</el-button>
<el-button
type="primary"
@click="handleSearch"
>
查询
</el-button>
<el-button
type="primary"
@click="handleReset"
>
重置
</el-button>
<el-button
type="success"
@click="handleExport"
>
导出表格
</el-button>
</div>
</div>
<div class="table-container">
<table>
<thead>
<tr>
<th style="width: 50px;"></th>
<th style="width: 100px;">*编码</th>
<th style="width: 100px;">*名称</th>
<th style="width: 120px;">检查类型</th>
<th style="width: 80px;">曝光次数</th>
<th style="width: 120px;">费用套餐</th>
<th style="width: 100px;">金额</th>
<th style="width: 100px;">序号</th>
<th style="width: 120px;">服务范围</th>
<th style="width: 120px;">下级医技类型</th>
<th style="width: 150px;">备注</th>
<th style="width: 120px;">操作</th>
<th style="width: 50px;">
</th>
<th style="width: 100px;">
*编码
</th>
<th style="width: 100px;">
*名称
</th>
<th style="width: 120px;">
检查类型
</th>
<th style="width: 80px;">
曝光次数
</th>
<th style="width: 120px;">
费用套餐
</th>
<th style="width: 100px;">
金额
</th>
<th style="width: 100px;">
序号
</th>
<th style="width: 120px;">
服务范围
</th>
<th style="width: 120px;">
下级医技类型
</th>
<th style="width: 150px;">
备注
</th>
<th style="width: 120px;">
操作
</th>
</tr>
</thead>
<tbody>
@@ -458,7 +674,11 @@
<td>{{ item.row }}</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入编码" v-model="item.code">
<input
v-model="item.code"
type="text"
placeholder="请输入编码"
>
</template>
<template v-else>
{{ item.code }}
@@ -466,7 +686,11 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入名称" v-model="item.name">
<input
v-model="item.name"
type="text"
placeholder="请输入名称"
>
</template>
<template v-else>
{{ item.name }}
@@ -474,7 +698,11 @@
</td>
<td>
<template v-if="item.editing">
<el-select v-model="item.checkType" placeholder="选择检查类型" style="width: 100%">
<el-select
v-model="item.checkType"
placeholder="选择检查类型"
style="width: 100%"
>
<el-option
v-for="opt in checkTypeOptionsForMethodPart"
:key="opt.value"
@@ -489,7 +717,12 @@
</td>
<td>
<template v-if="item.editing">
<input type="number" min="0" placeholder="请输入曝光次数" v-model="item.exposureNum">
<input
v-model="item.exposureNum"
type="number"
min="0"
placeholder="请输入曝光次数"
>
</template>
<template v-else>
{{ item.exposureNum || '0' }}
@@ -520,7 +753,13 @@
</td>
<td>
<template v-if="item.editing">
<input type="number" step="0.01" min="0" placeholder="请输入金额" v-model="item.price">
<input
v-model="item.price"
type="number"
step="0.01"
min="0"
placeholder="请输入金额"
>
</template>
<template v-else>
{{ item.price || '0.00' }}
@@ -528,7 +767,11 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入序号" v-model="item.number">
<input
v-model="item.number"
type="text"
placeholder="请输入序号"
>
</template>
<template v-else>
{{ item.number || '999999' }}
@@ -536,7 +779,11 @@
</td>
<td>
<template v-if="item.editing">
<el-select v-model="item.serviceScope" placeholder="选择服务范围" style="width: 100%">
<el-select
v-model="item.serviceScope"
placeholder="选择服务范围"
style="width: 100%"
>
<el-option
v-for="opt in serviceScopeDicts"
:key="opt.dictValue"
@@ -551,7 +798,13 @@
</td>
<td>
<template v-if="item.editing">
<el-select v-model="item.subType" placeholder="选择下级医技类型" style="width: 100%" clearable filterable>
<el-select
v-model="item.subType"
placeholder="选择下级医技类型"
style="width: 100%"
clearable
filterable
>
<el-option
v-for="opt in getSubTypeOptions(item.checkType)"
:key="opt.value"
@@ -566,7 +819,11 @@
</td>
<td>
<template v-if="item.editing">
<input type="text" placeholder="请输入备注" v-model="item.remark">
<input
v-model="item.remark"
type="text"
placeholder="请输入备注"
>
</template>
<template v-else>
{{ item.remark || '' }}
@@ -574,21 +831,41 @@
</td>
<td class="actions">
<template v-if="item.editing">
<button class="btn btn-confirm" @click.stop="handleConfirm(index)" title="保存">
<button
class="btn btn-confirm"
title="保存"
@click.stop="handleConfirm(index)"
>
</button>
<button class="btn btn-cancel" @click.stop="handleCancelEdit(index)" title="取消">
<button
class="btn btn-cancel"
title="取消"
@click.stop="handleCancelEdit(index)"
>
</button>
</template>
<template v-else>
<button class="btn btn-edit" @click.stop="handleEdit(index)" title="编辑">
<button
class="btn btn-edit"
title="编辑"
@click.stop="handleEdit(index)"
>
</button>
<button class="btn btn-confirm" @click.stop="handleConfirm(index)" title="保存">
<button
class="btn btn-confirm"
title="保存"
@click.stop="handleConfirm(index)"
>
</button>
<button class="btn btn-delete" @click.stop="handleDelete(index)" title="删除">
<button
class="btn btn-delete"
title="删除"
@click.stop="handleDelete(index)"
>
</button>
</template>
@@ -599,7 +876,10 @@
</div>
</template>
<!-- 分页区域 -->
<div class="pagination" v-if="activeMenu === '检查类型'">
<div
v-if="activeMenu === '检查类型'"
class="pagination"
>
<button
class="pagination-btn"
:disabled="checkTypePagination.currentPage <= 1"
@@ -618,10 +898,17 @@
</button>
</div>
<div class="pagination" v-else>
<button class="pagination-btn"></button>
<div
v-else
class="pagination"
>
<button class="pagination-btn">
</button>
<span>1</span>
<button class="pagination-btn"></button>
<button class="pagination-btn">
</button>
</div>
</div>
</div>

View File

@@ -1,6 +1,5 @@
<template>
<div class="lis-group-maintain">
<!-- 标题区域 -->
<div class="header">
<h2>LIS分组维护</h2>
@@ -10,105 +9,176 @@
<div class="table-container">
<table class="data-table">
<thead>
<tr>
<th style="width: 50px;"></th>
<th style="width: 150px;">卫生机构</th>
<th style="width: 150px;">日期</th>
<th style="width: 200px;">LIS分组名称</th>
<th style="width: 120px;">采血管</th>
<th style="width: 300px;">备注</th>
<th style="width: 150px;">操作</th>
</tr>
<tr>
<th style="width: 50px;">
</th>
<th style="width: 150px;">
卫生机构
</th>
<th style="width: 150px;">
日期
</th>
<th style="width: 200px;">
LIS分组名称
</th>
<th style="width: 120px;">
采血管
</th>
<th style="width: 300px;">
备注
</th>
<th style="width: 150px;">
操作
</th>
</tr>
</thead>
<tbody>
<tr
<tr
v-for="(item, index) in tableData"
:key="item.id || index"
:class="{ 'editing-row': item.editing, 'success-row': item.success, 'deleting-row': item.deleting }"
>
<td>{{ index + 1 }}</td>
<td>
<template v-if="item.editing">
<input
type="text"
>
<td>{{ index + 1 }}</td>
<td>
<template v-if="item.editing">
<input
v-model="item.healthInstitution"
disabled
>
</template>
<template v-else>
{{ item.healthInstitution }}
</template>
</td>
<td>
<template v-if="item.editing">
<input type="text" v-model="item.date" disabled>
</template>
<template v-else>
{{ item.date }}
</template>
</td>
<td>
<template v-if="item.editing">
<input
type="text"
v-model="item.lisGroupName"
placeholder="请输入分组名称"
:class="{ 'error-input': item.errors?.lisGroupName, 'focus-target': item.isNew }"
>
<span v-if="item.errors?.lisGroupName" class="error-message">{{ item.errors.lisGroupName }}</span>
</template>
<template v-else>
{{ item.lisGroupName }}
</template>
</td>
<td>
<template v-if="item.editing">
<select
v-model="item.bloodCollectionTube"
:class="{ 'error-input': item.errors?.bloodCollectionTube }"
>
<option value="">请选择采血管</option>
<option v-for="tube in bloodTubeOptions" :key="tube" :value="tube">
{{ tube }}
</option>
</select>
<span v-if="item.errors?.bloodCollectionTube" class="error-message">{{ item.errors.bloodCollectionTube }}</span>
</template>
<template v-else>
{{ item.bloodCollectionTube }}
</template>
</td>
<td>
<template v-if="item.editing">
<input type="text" v-model="item.remark" placeholder="请输入备注信息">
</template>
<template v-else>
{{ item.remark || '' }}
</template>
</td>
<td>
<div class="actions">
<template v-if="!item.editing">
<button class="btn btn-edit" @click="startEdit(item)"></button>
<button class="btn btn-primary" @click="addRow">+</button>
<button class="btn btn-delete" @click="deleteRow(index)">🗑</button>
disabled
>
</template>
<template v-else>
<button class="btn btn-confirm" @click="confirmEdit(item)"></button>
<button class="btn btn-cancel" @click="cancelEdit(item)">×</button>
{{ item.healthInstitution }}
</template>
</div>
</td>
</tr>
</td>
<td>
<template v-if="item.editing">
<input
v-model="item.date"
type="text"
disabled
>
</template>
<template v-else>
{{ item.date }}
</template>
</td>
<td>
<template v-if="item.editing">
<input
v-model="item.lisGroupName"
type="text"
placeholder="请输入分组名称"
:class="{ 'error-input': item.errors?.lisGroupName, 'focus-target': item.isNew }"
>
<span
v-if="item.errors?.lisGroupName"
class="error-message"
>{{ item.errors.lisGroupName }}</span>
</template>
<template v-else>
{{ item.lisGroupName }}
</template>
</td>
<td>
<template v-if="item.editing">
<select
v-model="item.bloodCollectionTube"
:class="{ 'error-input': item.errors?.bloodCollectionTube }"
>
<option value="">
请选择采血管
</option>
<option
v-for="tube in bloodTubeOptions"
:key="tube"
:value="tube"
>
{{ tube }}
</option>
</select>
<span
v-if="item.errors?.bloodCollectionTube"
class="error-message"
>{{ item.errors.bloodCollectionTube }}</span>
</template>
<template v-else>
{{ item.bloodCollectionTube }}
</template>
</td>
<td>
<template v-if="item.editing">
<input
v-model="item.remark"
type="text"
placeholder="请输入备注信息"
>
</template>
<template v-else>
{{ item.remark || '' }}
</template>
</td>
<td>
<div class="actions">
<template v-if="!item.editing">
<button
class="btn btn-edit"
@click="startEdit(item)"
>
</button>
<button
class="btn btn-primary"
@click="addRow"
>
+
</button>
<button
class="btn btn-delete"
@click="deleteRow(index)"
>
🗑
</button>
</template>
<template v-else>
<button
class="btn btn-confirm"
@click="confirmEdit(item)"
>
</button>
<button
class="btn btn-cancel"
@click="cancelEdit(item)"
>
×
</button>
</template>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页区域 -->
<div class="pagination">
<button class="pagination-btn" @click="prevPage" :disabled="currentPage <= 1"></button>
<button
class="pagination-btn"
:disabled="currentPage <= 1"
@click="prevPage"
>
</button>
<span>{{ currentPage }}</span>
<button class="pagination-btn" @click="nextPage" :disabled="currentPage >= totalPages"></button>
<button
class="pagination-btn"
:disabled="currentPage >= totalPages"
@click="nextPage"
>
</button>
</div>
</div>
</template>