fixbug326,329,334,368: 门诊医生站检验申请模块多项缺陷修复
Bug #326: 检验申请单套餐项目回充数据不完整 - 后端回充时查询 LabActivityDefinition 补全套餐信 - DTO 新增 activityId、feePackageId、isPackage、sampleType、unit 字段 - 前端实现套餐项目树形展开,懒加载套餐明细 Bug #329: 检验申请执行科室默认值设置错误 - 后端移除默认执行科室逻辑,添加未匹配科室警告日志 - 前端从 Organization 表获取执行科室,自动根据检验类型设置默认值 Bug #334: 检验申请界面顶部操作栏占用空间过大 - 隐藏顶部操作栏,保存/新增按钮移至卡片头部 Bug #368: 门诊医生站待写病历标签页功能冗余 - 屏蔽待写病历标签页(左侧导航栏已有独立菜单)
This commit is contained in:
@@ -1,7 +1,5 @@
|
||||
<template>
|
||||
<el-container class="inspection-application-container">
|
||||
|
||||
<!-- 顶部操作按钮区 - Bug#334: 优化垂直空间利用率 -->
|
||||
<el-header class="top-action-bar" height="48px">
|
||||
<el-row class="action-buttons" type="flex" justify="end" :gutter="8">
|
||||
<el-button type="primary" size="default" @click="handleSave" class="save-btn" :loading="saving">
|
||||
@@ -19,10 +17,22 @@
|
||||
<el-main class="inspection-section" style="width: 100%; max-width: 100%">
|
||||
<el-card class="table-card" style="width: 100%">
|
||||
<template #header>
|
||||
<el-row class="card-header" type="flex" align="middle">
|
||||
<el-icon><DocumentChecked /></el-icon>
|
||||
<span>检验信息</span>
|
||||
</el-row>
|
||||
<div class="card-header-flex">
|
||||
<div class="header-title">
|
||||
<el-icon><DocumentChecked /></el-icon>
|
||||
<span>检验信息</span>
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<el-button type="primary" size="default" @click="handleSave" class="save-btn" :loading="saving">
|
||||
<el-icon><Document /></el-icon>
|
||||
保存
|
||||
</el-button>
|
||||
<el-button type="primary" size="default" @click="handleNewApplication" class="new-btn">
|
||||
<el-icon><Plus /></el-icon>
|
||||
新增
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<el-table
|
||||
ref="inspectionTableRef"
|
||||
@@ -41,7 +51,6 @@
|
||||
@current-change="handleRowClick"
|
||||
@cell-click="handleCellClick"
|
||||
>
|
||||
<!-- Bug #326: 添加展开列 -->
|
||||
<el-table-column type="expand" width="50" align="center" header-align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.children && scope.row.children.length > 0" class="expand-content">
|
||||
@@ -114,7 +123,7 @@
|
||||
<template #default="scope">
|
||||
<el-row type="flex" align="middle" justify="center" :gutter="8">
|
||||
<el-button link size="default" @click="handlePrint(scope.row)" :icon="Printer" title="打印" style="font-size: 16px"></el-button>
|
||||
<el-button link size="default" @click="handleDelete(scope.row)" :icon="Delete" style="color: #f56c6c; font-size: 16px" title="删除"></el-button>
|
||||
<el-button link size="default" @click.stop="handleDelete(scope.row)" :icon="Delete" style="color: #f56c6c; font-size: 16px" title="删除"></el-button>
|
||||
</el-row>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -406,7 +415,6 @@
|
||||
<template #header>
|
||||
<h4 style="margin: 0; font-weight: bold">检验信息详情</h4>
|
||||
</template>
|
||||
<!-- Bug #326: 添加树形展开功能,支持套餐明细展示 -->
|
||||
<el-table
|
||||
:data="selectedInspectionItems"
|
||||
border
|
||||
@@ -414,12 +422,12 @@
|
||||
style="width: 100%; min-width: 100%"
|
||||
max-height="250"
|
||||
row-key="itemId"
|
||||
lazy
|
||||
:load="loadPackageDetailsForTable"
|
||||
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
|
||||
default-expand-all
|
||||
>
|
||||
<el-table-column label="项目名称" prop="itemName" min-width="180">
|
||||
<template #default="scope">
|
||||
<!-- BugFix#326: 套餐项目添加标识和加粗显示 -->
|
||||
<el-tag v-if="scope.row.isPackage" size="small" type="warning" style="margin-right: 4px">套餐</el-tag>
|
||||
<span :style="{ fontWeight: scope.row.isPackage ? 'bold' : 'normal' }">
|
||||
{{ scope.row.itemName }}
|
||||
@@ -538,16 +546,15 @@
|
||||
@change="toggleInspectionItem(item)"
|
||||
@click.stop
|
||||
/>
|
||||
<!-- BugFix#326: 套餐项目添加标识 -->
|
||||
<el-tag v-if="item.isPackage" size="small" type="warning" style="margin-right: 4px">套餐</el-tag>
|
||||
<span class="item-itemName">{{ item.itemName }}</span>
|
||||
<span class="item-price">¥{{ item.itemPrice }}</span>
|
||||
</div>
|
||||
<!-- 加载更多 -->
|
||||
<div v-if="category.hasMore && category.items.length > 0" class="load-more">
|
||||
<el-button
|
||||
link
|
||||
size="small"
|
||||
<el-button
|
||||
link
|
||||
size="small"
|
||||
:loading="category.loading"
|
||||
@click.stop="loadMoreItems(category.key)"
|
||||
>
|
||||
@@ -659,7 +666,7 @@ import { debounce } from 'lodash-es'
|
||||
|
||||
// 获取当前组件实例和字典
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { inspection_lab_dept } = proxy.useDict('inspection_lab_dept')
|
||||
// Bug #329: 移除 inspection_lab_dept 字典,执行科室数据从 Organization 表获取
|
||||
|
||||
// 动态获取的检验类型缓存(用于缓存不在 inspectionCategories 中的检验类型)
|
||||
const dynamicInspectionTypesCache = ref([])
|
||||
@@ -785,9 +792,123 @@ const loading = ref(false)
|
||||
const saving = ref(false) // 保存状态
|
||||
const total = ref(0)
|
||||
const leftActiveTab = ref('application')
|
||||
// Bug #326: 展开的行
|
||||
const expandedRowKeys = ref([])
|
||||
|
||||
const isExpanded = (applicationId) => {
|
||||
return expandedRowKeys.value.includes(applicationId)
|
||||
}
|
||||
|
||||
const toggleExpand = async (row) => {
|
||||
const applicationId = row.applicationId
|
||||
const isCurrentlyExpanded = isExpanded(applicationId)
|
||||
|
||||
if (isCurrentlyExpanded) {
|
||||
// 收起
|
||||
expandedRowKeys.value = expandedRowKeys.value.filter(id => id !== applicationId)
|
||||
} else {
|
||||
// 展开 - 先检查是否需要加载明细数据
|
||||
if (row.hasChildren && (!row.children || row.children.length === 0)) {
|
||||
// 加载套餐明细
|
||||
await loadPackageDetails(row)
|
||||
}
|
||||
expandedRowKeys.value = [...expandedRowKeys.value, applicationId]
|
||||
}
|
||||
}
|
||||
|
||||
const handleExpandChange = (row, expandedRows) => {
|
||||
expandedRowKeys.value = expandedRows.map(r => r.applicationId)
|
||||
}
|
||||
|
||||
const loadPackageDetails = async (row) => {
|
||||
try {
|
||||
const packageId = row.feePackageId || row.packageId
|
||||
if (!packageId) return
|
||||
|
||||
const res = await getInspectionPackageDetails(packageId)
|
||||
if (res.code === 200 && res.data) {
|
||||
row.children = res.data.map(detail => ({
|
||||
itemId: detail.detailId || detail.id || detail.itemId,
|
||||
itemName: detail.itemName || detail.name,
|
||||
sampleType: detail.sampleType || '',
|
||||
unit: detail.unit || '',
|
||||
itemPrice: detail.unitPrice || detail.itemPrice || detail.price || 0,
|
||||
itemQty: detail.quantity || detail.itemQty || detail.qty || 1,
|
||||
itemAmount: (detail.unitPrice || detail.itemPrice || 0) * (detail.quantity || detail.itemQty || 1)
|
||||
}))
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载套餐明细失败:', error)
|
||||
row.children = []
|
||||
}
|
||||
}
|
||||
|
||||
const loadPackageDetailsForTable = async (row, treeNode, resolve) => {
|
||||
if (!row.isPackage) {
|
||||
resolve([])
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const packageId = row.feePackageId || row.packageId
|
||||
if (!packageId) {
|
||||
resolve([])
|
||||
return
|
||||
}
|
||||
|
||||
const res = await getInspectionPackageDetails(packageId)
|
||||
if (res.code === 200 && res.data) {
|
||||
// 构建明细数据结构
|
||||
// BugFix: 后端返回字段为 unitPrice 和 quantity,需正确映射
|
||||
const children = res.data.map(detail => ({
|
||||
itemId: detail.detailId || detail.id || detail.itemId,
|
||||
itemName: detail.itemName || detail.name,
|
||||
sampleType: detail.sampleType || '',
|
||||
unit: detail.unit || '',
|
||||
itemPrice: detail.unitPrice || detail.itemPrice || detail.price || 0,
|
||||
itemQty: detail.quantity || detail.itemQty || detail.qty || 1,
|
||||
itemAmount: (detail.unitPrice || detail.itemPrice || 0) * (detail.quantity || detail.itemQty || 1)
|
||||
}))
|
||||
resolve(children)
|
||||
} else {
|
||||
resolve([])
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载套餐明细失败:', error)
|
||||
resolve([])
|
||||
}
|
||||
}
|
||||
|
||||
const togglePackageExpand = async (item) => {
|
||||
if (!item.isPackage) return
|
||||
|
||||
item.expanded = !item.expanded
|
||||
|
||||
if (item.expanded && (!item.children || item.children.length === 0)) {
|
||||
item.loading = true
|
||||
try {
|
||||
const packageId = item.feePackageId || item.packageId
|
||||
if (packageId) {
|
||||
const res = await getInspectionPackageDetails(packageId)
|
||||
if (res.code === 200 && res.data) {
|
||||
item.children = res.data.map(detail => ({
|
||||
detailId: detail.detailId || detail.id || detail.itemId,
|
||||
itemName: detail.itemName || detail.name,
|
||||
unit: detail.unit || '',
|
||||
quantity: detail.quantity || detail.itemQty || detail.qty || 1,
|
||||
unitPrice: detail.unitPrice || detail.itemPrice || detail.price || 0,
|
||||
itemPrice: detail.unitPrice || detail.itemPrice || detail.price || 0
|
||||
}))
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载套餐明细失败:', error)
|
||||
item.children = []
|
||||
} finally {
|
||||
item.loading = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 申请日期实时更新定时器
|
||||
let applyTimeTimer = null
|
||||
|
||||
@@ -856,6 +977,9 @@ const executeDepartmentOptions = ref([])
|
||||
// 执行科室加载完成标志(BugFix#CodeReview: 防止竞态条件)
|
||||
const isExecuteDepartmentLoaded = ref(false)
|
||||
|
||||
// 删除操作标志,用于避免删除时触发数据填充
|
||||
const isDeleting = ref(false)
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
applyOrganizationId: '',
|
||||
@@ -1061,7 +1185,7 @@ const loadInspectionData = async () => {
|
||||
const loadCategoryItems = async (categoryKey, loadMore = false) => {
|
||||
const category = inspectionCategories.value.find(c => c.key === categoryKey)
|
||||
if (!category) return
|
||||
|
||||
|
||||
// 已加载完成且不是加载更多,或正在加载中,跳过
|
||||
if ((category.loaded && !loadMore) || category.loading) return
|
||||
// 没有更多数据了,跳过
|
||||
@@ -1281,10 +1405,10 @@ const getInspectionList = () => {
|
||||
if (!queryParams.encounterId) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
loading.value = true
|
||||
|
||||
getApplyList({
|
||||
getApplyList({
|
||||
encounterId: queryParams.encounterId,
|
||||
pageNo: queryParams.pageNo,
|
||||
pageSize: queryParams.pageSize
|
||||
@@ -1544,17 +1668,27 @@ const handleSave = () => {
|
||||
|
||||
// 准备保存数据
|
||||
const prepareSaveData = () => {
|
||||
// 将执行科室代码赋值给每个检验项目
|
||||
const labApplyItemList = selectedInspectionItems.value.map(item => ({
|
||||
...item,
|
||||
performDeptCode: formData.executeDepartment // 从字典获取的执行科室代码
|
||||
itemSeq: item.itemSeq || 1,
|
||||
itemCode: item.code || '',
|
||||
itemName: item.itemName || '',
|
||||
itemPrice: item.itemPrice || 0,
|
||||
itemQty: item.itemQty || 1,
|
||||
itemAmount: item.itemAmount || 0,
|
||||
itemStatus: formData.applyStatus || 0,
|
||||
performDeptCode: formData.executeDepartment,
|
||||
// Bug #326修复: 传入 activityId,后端直接使用 ID 关联,避免用名称反查
|
||||
activityId: item.activityId || item.itemId || null,
|
||||
feePackageId: item.feePackageId || null,
|
||||
isPackage: item.isPackage || false,
|
||||
sampleType: item.sampleType || '',
|
||||
unit: item.unit || ''
|
||||
}))
|
||||
return {
|
||||
...formData,
|
||||
labApplyItemList,
|
||||
physicalExamination: formData.physicalExam, // 字段名映射:前端 physicalExam -> 后端 physicalExamination
|
||||
physicalExamination: formData.physicalExam,
|
||||
inspectionItemsText: selectedInspectionItems.value.map(item => item.itemName).join('+')
|
||||
// 金额由后端计算,前端不传递
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1563,6 +1697,7 @@ const handleSave = () => {
|
||||
executeSave(saveData);
|
||||
|
||||
}
|
||||
|
||||
const executeSave = (saveData) => {
|
||||
saveInspectionApplication(saveData).then((res) => {
|
||||
if (res.code === 200) {
|
||||
@@ -1725,6 +1860,8 @@ const handlePrint = (row) => {
|
||||
|
||||
// 删除申请单
|
||||
const handleDelete = (row) => {
|
||||
isDeleting.value = true; // 设置删除标志
|
||||
|
||||
ElMessageBox.confirm(
|
||||
`确定要删除申请单 "${row.applyNo}" 吗?此操作将同时删除对应的医嘱。`,
|
||||
'删除确认',
|
||||
@@ -1740,22 +1877,30 @@ const handleDelete = (row) => {
|
||||
deleteInspectionApplication(row.applyNo).then((res) => {
|
||||
if (res.code === 200) {
|
||||
ElMessage.success('删除成功')
|
||||
resetForm(); // 删除成功后清空表单
|
||||
// 刷新列表
|
||||
getInspectionList()
|
||||
} else {
|
||||
ElMessage.error(res.message || '删除失败')
|
||||
}
|
||||
}).catch((error) => {
|
||||
console.error('删除检验<EFBFBD><EFBFBD>请单异常:', error)
|
||||
console.error('删除检验请单异常:', error)
|
||||
ElMessage.error('删除异常')
|
||||
})
|
||||
}).catch(() => {
|
||||
// 用户取消删除
|
||||
}).finally(() => {
|
||||
isDeleting.value = false; // 重置删除标志
|
||||
})
|
||||
}
|
||||
|
||||
// 单元格点击 - 点击表格行时加载申请单详情
|
||||
const handleCellClick = (row, column) => {
|
||||
// 如果点击的是操作列或展开列,不触发数据填充
|
||||
if (column.property === '操作' || column.label === '操作' ||
|
||||
column.type === 'expand' || column.type === 'selection') {
|
||||
return;
|
||||
}
|
||||
// 点击表格行时,将该申请单的数据加载到表单中
|
||||
// 使用 applyNo 判断是否有效
|
||||
if (row && row.applyNo) {
|
||||
@@ -1766,8 +1911,8 @@ const handleCellClick = (row, column) => {
|
||||
// 行点击事件处理
|
||||
const handleRowClick = (currentRow, oldRow) => {
|
||||
// 点击表格行时,将该申请单的数据加载到表单中
|
||||
// 使用 applyNo 判断是否有效
|
||||
if (currentRow && currentRow.applyNo) {
|
||||
// 使用 applyNo 判断是否有效,同时检查是否处于删除状态
|
||||
if (currentRow && currentRow.applyNo && !isDeleting.value) {
|
||||
loadApplicationToForm(currentRow);
|
||||
}
|
||||
}
|
||||
@@ -1790,7 +1935,6 @@ const loadApplicationToForm = async (row) => {
|
||||
// 根据申请单号获取完整详情
|
||||
try {
|
||||
const res = await getInspectionApplyDetail(row.applyNo)
|
||||
console.log('申请单详情API返回:', res) // 临时调试日志
|
||||
if (res.code === 200 && res.data) {
|
||||
const detail = res.data
|
||||
// 加载完整的表单数据
|
||||
@@ -1831,13 +1975,32 @@ const loadApplicationToForm = async (row) => {
|
||||
// 加载检验项目数据
|
||||
selectedInspectionItems.value = []
|
||||
if (detail.labApplyItemList && detail.labApplyItemList.length > 0) {
|
||||
selectedInspectionItems.value = detail.labApplyItemList.map(item => ({
|
||||
...item,
|
||||
itemId: item.itemId || item.id || Math.random().toString(36).substring(2, 11),
|
||||
itemName: item.itemName || item.name || '',
|
||||
itemPrice: item.itemPrice || item.price || 0,
|
||||
itemAmount: item.itemAmount || item.price || 0,
|
||||
}))
|
||||
// Bug #326修复: 直接使用后端返回的数据,不再从本地缓存查找匹配项
|
||||
// 后端已返回完整关联信息(activityId、feePackageId、inspectionTypeId、sampleType、unit)
|
||||
selectedInspectionItems.value = detail.labApplyItemList.map(item => {
|
||||
const itemId = item.activityId || item.itemId || item.id || Math.random().toString(36).substring(2, 11)
|
||||
const isPackage = item.feePackageId != null || item.itemName?.includes('套餐')
|
||||
|
||||
return {
|
||||
itemId: itemId,
|
||||
itemName: item.itemName || '',
|
||||
itemPrice: item.itemPrice || 0,
|
||||
itemAmount: item.itemAmount || 0,
|
||||
itemQty: item.itemQty || 1,
|
||||
sampleType: item.sampleType || '',
|
||||
unit: item.unit || '',
|
||||
code: item.itemCode || '',
|
||||
isPackage: isPackage,
|
||||
hasChildren: isPackage,
|
||||
feePackageId: item.feePackageId || null,
|
||||
activityId: item.activityId || itemId,
|
||||
inspectionTypeId: item.inspectionTypeId || null,
|
||||
expanded: false,
|
||||
children: [],
|
||||
childrenLoaded: false,
|
||||
loading: false
|
||||
}
|
||||
})
|
||||
} else if (detail.inspectionItem || detail.itemName) {
|
||||
// 如果只有项目名称,尝试从本地分类中查找匹配项
|
||||
const itemNames = (detail.inspectionItem || detail.itemName).split(/[+,]/)
|
||||
@@ -1884,7 +2047,7 @@ watch(() => props.patientInfo, async (newVal) => {
|
||||
|
||||
// 初始化数据
|
||||
await initData();
|
||||
|
||||
|
||||
// 如果encounterId发生变化,重新加载检验申请单列表
|
||||
if (oldEncounterId !== newVal.encounterId) {
|
||||
getInspectionList()
|
||||
@@ -1896,24 +2059,38 @@ watch(() => props.patientInfo, async (newVal) => {
|
||||
}
|
||||
}, { deep: true, immediate: true })
|
||||
|
||||
// 监听已选择的检验项目,自动更新检验项目文本(用+号拼接)
|
||||
watch(() => selectedInspectionItems.value, (newVal) => {
|
||||
// Bug #329: 监听已选择的检验项目,自动更新检验项目文本并设置默认执行科室
|
||||
watch(() => selectedInspectionItems.value, async (newVal) => {
|
||||
if (newVal && newVal.length > 0) {
|
||||
formData.inspectionItemsText = newVal.map(item => item.itemName).join('+')
|
||||
|
||||
// Bug #329: 如果执行科室为空,根据第一个检验项目的检验类型自动设置默认执行科室
|
||||
if (!formData.executeDepartment) {
|
||||
const firstItem = newVal[0]
|
||||
|
||||
// 根据检验项目的 inspectionTypeId 获取默认执行科室
|
||||
if (firstItem.inspectionTypeId) {
|
||||
const defaultDeptCode = await getDefaultPerformDeptCode(firstItem.inspectionTypeId)
|
||||
if (defaultDeptCode) {
|
||||
formData.executeDepartment = defaultDeptCode
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Bug #329: 当项目被清空时,同时清空执行科室(下次选择项目时会重新自动设置)
|
||||
formData.inspectionItemsText = ''
|
||||
formData.executeDepartment = ''
|
||||
}
|
||||
}, { deep: true })
|
||||
|
||||
// 监听执行科室字典数据,设置默认值为第一个选项
|
||||
watch(() => inspection_lab_dept.value, (newVal) => {
|
||||
if (newVal && newVal.length > 0 && !formData.executeDepartment) {
|
||||
formData.executeDepartment = newVal[0].value
|
||||
}
|
||||
}, { immediate: true })
|
||||
// Bug #329: 移除字典数据默认值设置,执行科室应从 Organization 表获取,不应使用字典数据
|
||||
// 原问题:inspection_lab_dept 字典的 value (如 'ORG045') 与 executeDepartmentOptions 的 value (科室编码 busNo) 格式不一致
|
||||
// 导致 el-select 显示原始 value 值而非科室名称
|
||||
|
||||
// 组件挂载时预加载检验项目数据(不依赖patientInfo)
|
||||
// BugFix #329: 先加载执行科室列表,再加载检验类型(确保检验类型的department字段能正确匹配)
|
||||
onMounted(async () => {
|
||||
await loadExecuteDepartmentList()
|
||||
await loadInspectionData()
|
||||
})
|
||||
|
||||
@@ -1947,13 +2124,7 @@ defineExpose({
|
||||
|
||||
/* Bug#334: 顶部操作按钮区 - 优化垂直空间利用率 */
|
||||
.top-action-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
border-bottom: 1px solid var(--el-border-color-light);
|
||||
background: var(--el-bg-color);
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
|
||||
padding: 0 12px;
|
||||
display: none; /* 隐藏原有的顶部操作栏 */
|
||||
}
|
||||
|
||||
.action-buttons {
|
||||
@@ -1998,7 +2169,14 @@ defineExpose({
|
||||
padding-bottom: 6px;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
.card-header-flex {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.header-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
@@ -2006,6 +2184,11 @@ defineExpose({
|
||||
color: var(--el-text-color-primary);
|
||||
}
|
||||
|
||||
.header-actions {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* Bug#334: 底部内容区域 - 优化垂直空间利用率 */
|
||||
.bottom-content-area {
|
||||
padding: 2px 10px;
|
||||
@@ -2066,6 +2249,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
|
||||
|
||||
:deep(.el-pagination) {
|
||||
.el-pager li {
|
||||
border-radius: 4px;
|
||||
@@ -2554,6 +2738,110 @@ defineExpose({
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
/* 套餐明细展开样式 */
|
||||
.selected-tree-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8px 12px;
|
||||
background: #fafafa;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.selected-tree-header .item-itemName {
|
||||
flex: 1;
|
||||
margin-left: 8px;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.selected-tree-header .item-price {
|
||||
color: #e6a23c;
|
||||
font-weight: bold;
|
||||
margin-left: 16px;
|
||||
min-width: 60px;
|
||||
}
|
||||
|
||||
.selected-tree-header:hover {
|
||||
background: #f0f0f0;
|
||||
}
|
||||
|
||||
.selected-tree-header.expanded {
|
||||
background: #e8f4fc;
|
||||
border-left: 3px solid #51A3F3;
|
||||
}
|
||||
|
||||
.selected-tree-icon {
|
||||
width: 20px;
|
||||
text-align: center;
|
||||
color: #51A3F3;
|
||||
font-size: 12px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.is-package .selected-tree-header {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.selected-tree-children {
|
||||
padding: 4px 12px 4px 36px;
|
||||
background: #fff;
|
||||
border-top: 1px dashed #ebeef5;
|
||||
}
|
||||
|
||||
.selected-tree-detail {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 6px 8px;
|
||||
border-bottom: 1px solid #f5f5f5;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.selected-tree-detail:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.selected-tree-detail .detail-name {
|
||||
flex: 1;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.selected-tree-detail .detail-unit {
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.selected-tree-detail .detail-qty {
|
||||
width: 40px;
|
||||
text-align: center;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.selected-tree-detail .detail-price {
|
||||
width: 60px;
|
||||
text-align: right;
|
||||
color: #e6a23c;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.no-detail {
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
color: #909399;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.loading-placeholder {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 15px;
|
||||
color: #909399;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.no-selection {
|
||||
text-align: center;
|
||||
padding: 40px 20px;
|
||||
|
||||
Reference in New Issue
Block a user