@@ -413,29 +413,33 @@
:key = "idx"
class = "selected-item-card"
>
<!-- Bug # 384 修复 : 项目卡片头部 , 可展开 / 收起 -- >
<!-- Bug # 384 修复 + # 426 修复 : 项目卡片头部 , 可展开 / 收起 -- >
< div class = "card-header" @click ="toggleItemExpand(item)" >
< el -tag v-if = "item.isPackage || item.packageName" size="small" type="warning" style="margin-right: 4px; flex-shrink: 0;" > 套餐 < / el -tag >
< span class = "card-name" > { { item . name } } < / span >
< span class = "card-price" > ¥ { { item . price } } < / span >
<!-- 展开图标 -- >
< el-icon : class = "[' expand-icon', { expanded: item.expanded }] " >
< ArrowDown v-if = "!item.expanded" / >
< ArrowUp v-if = "item.expanded" / >
<!-- 展开/ 收起 图标 -- >
< el-icon class = "expand-icon" : class = " { expanded: item.expanded }" >
< ArrowRight / >
< / el-icon >
<!-- 删除按钮 -- >
< el-button link type = "danger" size = "small" @click.stop ="handleRemoveItem(idx, item)" >
< el -icon > < Close / > < / el-icon >
< / el-button >
< / div >
<!-- Bug # 428 修复 : 展开后显示套餐明细或检查方法 -- >
< div v-if = "item.expanded" >
<!-- Bug # 428 修复 + # 426 修复 : 展开后显示套餐明细或检查方法 -- >
< div v-show = "item.expanded" class="expanded-content" >
< ! - - 显示套餐明细 - - >
< div v-if = "item.packageDetails && item.packageDetails.length > 0" class="package-details-list" >
< div v-if = "(item.isPackage || item.packageName) && item.packageDetails && item.packageDetails.length > 0" class="package-details-list" >
< div class = "detail-row" v-for = "detail in item.packageDetails" :key="detail.id" >
< span class = "detail-name" > { { detail . name } } < / span >
< span class = "detail-info" > 数量 : { { detail . quantity } } 单价 : ¥ { { detail . price } } < / span >
< / div >
< / div >
<!-- 套餐明细加载中 -- >
< div v-else-if = "(item.isPackage || item.packageName) && item.packageDetailsLoading" class="package-loading-hint" >
加载中...
< / div >
< ! - - 显示检查方法 - - >
< div v-else-if = "item.methods && item.methods.length > 0" class="method-list" >
< div v-for = "method in item.methods" :key="method.id" class="method-option" >
@@ -473,7 +477,7 @@
< script setup >
import { ref , reactive , computed , watch , onMounted , nextTick } from 'vue' ;
import { ElMessage , ElMessageBox } from 'element-plus' ;
import { Printer , Delete , ArrowDown , ArrowUp , Close } from '@element-plus/icons-vue' ;
import { Printer , Delete , ArrowDown , ArrowUp , Close , ArrowRight } from '@element-plus/icons-vue' ;
import useUserStore from '@/store/modules/user' ;
import request from '@/utils/request' ;
import { listCheckMethod , searchCheckMethod , listCheckPackage } from '@/api/system/checkType' ;
@@ -592,11 +596,13 @@ async function loadPackageDetails(row, treeNode, resolve) {
}
}
// #428修复: 为已选择项目加载套餐明细( 通过packageId或packageName查询)
// #428修复 + #426修复 : 为已选择项目加载套餐明细( 通过packageId或packageName查询)
async function loadPackageDetailsForItem ( item ) {
if ( ! item . isPackage || ( ! item . packageId && ! item . packageName ) ) {
// 只要有 packageName 就认为是套餐,不强制要求 isPackage 或 packageId
if ( ! item . packageName && ! item . packageId ) {
return ;
}
item . packageDetailsLoading = true ;
try {
let packageId = item . packageId ;
if ( ! packageId && item . packageName ) {
@@ -612,6 +618,10 @@ async function loadPackageDetailsForItem(item) {
}
packageId = packages [ 0 ] . id ;
}
if ( ! packageId ) {
item . packageDetails = [ ] ;
return ;
}
const res = await request ( {
url : ` /system/package/ ${ packageId } /details ` ,
method : 'get'
@@ -630,6 +640,8 @@ async function loadPackageDetailsForItem(item) {
} catch ( err ) {
console . error ( '加载套餐明细失败:' , err ) ;
item . packageDetails = [ ] ;
} finally {
item . packageDetailsLoading = false ;
}
}
const detailTableRef = ref ( null ) ;
@@ -912,7 +924,8 @@ async function loadCategoryList() {
categoryName : t . name ,
// “检查类型管理”里配置的执行科室(图三)
performDeptName : t . department || '' ,
items : [ ]
items : [ ] ,
methods : [ ] // #428修复: 初始化 methods 数组,确保 Vue 响应式追踪
} ) ;
}
const unclassified = [ ] ;
@@ -1255,6 +1268,7 @@ async function handleMethodSelect(checked, method, cat) {
if ( method . packageId ) {
existingItem . isPackage = true ;
existingItem . packageId = method . packageId ;
existingItem . packageName = method . packageName || existingItem . packageName ; // #428修复: 确保 packageName 同步
// 预加载套餐明细
loadPackageDetailsForItem ( existingItem ) ;
}
@@ -1282,12 +1296,13 @@ async function handleMethodSelect(checked, method, cat) {
checkType : cat . typeName ,
nationalCode : targetItem . nationalCode || '' ,
checked : true ,
methods : [ method ] ,
methods : cat . methods || [ method ] , // #428修复: 复制分类下全部方法,允许用户切换
selectedMethod : method ,
expanded : false ,
// 从方法中获取套餐信息(优先级高于项目本身的 packageName)
// 从方法或项目 中获取套餐信息
isPackage : ! ! method . packageId || ! ! targetItem . packageName ,
packageId : method . packageId || targetItem . packageId || null
packageId : method . packageId || targetItem . packageId || null ,
packageName : method . packageName || targetItem . packageName || null // #428修复: 复制 packageName, 确保套餐明细可加载
} ;
selectedItems . value . push ( newItem ) ;
@@ -1396,11 +1411,11 @@ async function handleItemSelect(checked, item, cat) {
// Bug #382 修复:移除自动切换页签逻辑,保持当前页签状态
}
// Bug #384修复: 展开/收起项目卡片
// Bug #384修复 + #426修复 : 展开/收起项目卡片
async function toggleItemExpand ( item ) {
item . expanded = ! item . expanded ;
// 如果是展开且该项目是套餐,加载套餐明细
if ( item . expanded && item . isPackage && ( ! item . packageDetails || item . packageDetails . length === 0 ) ) {
// 如果是展开且该项目是套餐(通过 isPackage 或 packageName 判断) ,加载套餐明细
if ( item . expanded && ( item . isPackage || item . packageName ) && ( ! item . packageDetails || item . packageDetails . length === 0 ) && ! item . packageDetailsLoading ) {
await loadPackageDetailsForItem ( item ) ;
}
}
@@ -1812,10 +1827,24 @@ defineExpose({ getList });
font - size : 12 px ;
color : # 909399 ;
transition : transform 0.2 s ;
transform : rotate ( 0 deg ) ;
}
. expand - icon . expanded {
transform : rotate ( 18 0deg ) ;
transform : rotate ( 9 0deg ) ;
}
/* Bug #426修复: 展开内容容器 */
. expanded - content {
overflow : hidden ;
}
/* Bug #426修复: 套餐明细加载提示 */
. package - loading - hint {
padding : 8 px 10 px ;
font - size : 11 px ;
color : # c0c4cc ;
text - align : center ;
}
/* Bug #428修复: 套餐明细列表样式 */