Fix Bug #550: AI修复

This commit is contained in:
2026-05-27 00:07:40 +08:00
parent 8412e06c7d
commit c9265b5aee
2 changed files with 161 additions and 25 deletions

View File

@@ -0,0 +1,136 @@
<template>
<div class="exam-apply-container">
<div class="selection-layout">
<!-- 左侧检查项目分类 -->
<div class="panel category-panel">
<h4>检查项目分类</h4>
<el-tree
:data="categoryTree"
:props="{ label: 'name', children: 'children' }"
@node-click="handleCategoryClick"
data-cy="category-tree"
/>
</div>
<!-- 中间检查项目 -->
<div class="panel item-panel">
<h4>检查项目</h4>
<div class="item-list-container" data-cy="item-list">
<div v-for="item in filteredItems" :key="item.id" class="list-item">
<el-checkbox v-model="item.selected" @change="handleItemChange(item)" />
<span class="item-name">{{ item.name }}</span>
</div>
</div>
</div>
<!-- 右侧检查方法 -->
<div class="panel method-panel">
<h4>检查方法</h4>
<div class="method-list-container" data-cy="method-list">
<div v-for="method in filteredMethods" :key="method.id" class="list-item">
<el-checkbox v-model="method.selected" @change="handleMethodChange(method)" />
<span class="method-name">{{ method.name }}</span>
</div>
</div>
</div>
</div>
<!-- 已选择区域 -->
<div class="selected-area" data-cy="selected-area">
<h4>已选择</h4>
<div v-for="group in selectedGroups" :key="group.itemId" class="selected-card" data-cy="selected-card">
<div class="card-header" @click="group.collapsed = !group.collapsed">
<el-checkbox v-model="group.selected" @change="handleGroupSelect(group)" @click.stop />
<el-tooltip :content="group.itemName" placement="top" :show-after="300">
<span class="card-title">{{ group.itemName }}</span>
</el-tooltip>
<span class="collapse-icon">{{ group.collapsed ? '▶' : '▼' }}</span>
</div>
<!-- 明细区域严格遵循 项目 > 检查方法 层级默认收起移除冗余标签 -->
<div v-show="!group.collapsed" class="details-panel">
<div v-for="method in group.methods" :key="method.id" class="detail-row">
<el-checkbox v-model="method.selected" @change="handleDetailMethodChange(group, method)" @click.stop />
<span>{{ method.name }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
// 数据源实际应从后端API获取
const categoryTree = ref([])
const allItems = ref([])
const allMethods = ref([])
const currentCategoryId = ref(null)
const filteredItems = computed(() => allItems.value.filter(i => i.categoryId === currentCategoryId.value))
const filteredMethods = computed(() => allMethods.value.filter(m => m.categoryId === currentCategoryId.value))
const selectedGroups = ref([])
const handleCategoryClick = (node) => {
currentCategoryId.value = node.id
// 触发加载对应分类下的项目与方法
}
// 修复点1项目勾选与检查方法完全解耦不触发自动联动
const handleItemChange = (item) => {
if (item.selected) {
const exists = selectedGroups.value.find(g => g.itemId === item.id)
if (!exists) {
selectedGroups.value.push({
itemId: item.id,
// 修复点2清理冗余“套餐”前缀
itemName: item.name.replace(/套餐/g, ''),
selected: true,
// 修复点3默认收起明细状态
collapsed: true,
methods: allMethods.value
.filter(m => m.parentItemId === item.id)
.map(m => ({ ...m, selected: false }))
})
}
} else {
selectedGroups.value = selectedGroups.value.filter(g => g.itemId !== item.id)
}
}
// 修复点1检查方法独立勾选不受项目状态影响
const handleMethodChange = (method) => {
// 独立维护右侧方法列表状态,不反向修改项目选中状态
}
const handleGroupSelect = (group) => {
group.methods.forEach(m => m.selected = group.selected)
}
const handleDetailMethodChange = (group, method) => {
// 明细勾选状态变更时,同步更新父级卡片选中状态
group.selected = group.methods.length > 0 && group.methods.every(m => m.selected)
}
</script>
<style scoped>
.exam-apply-container { padding: 16px; background: #f5f7fa; min-height: 100vh; }
.selection-layout { display: flex; gap: 16px; margin-bottom: 20px; }
.panel { flex: 1; border: 1px solid #ebeef5; border-radius: 6px; padding: 12px; background: #fff; min-height: 300px; }
.panel h4 { margin: 0 0 12px 0; font-size: 14px; color: #303133; border-bottom: 1px solid #ebeef5; padding-bottom: 8px; }
.list-item { display: flex; align-items: center; padding: 8px 4px; cursor: pointer; transition: background 0.2s; }
.list-item:hover { background: #f5f7fa; }
.item-name, .method-name { margin-left: 8px; font-size: 13px; }
.selected-area { background: #fff; border-radius: 6px; padding: 16px; border: 1px solid #ebeef5; }
.selected-area h4 { margin: 0 0 12px 0; font-size: 14px; color: #303133; }
.selected-card { border: 1px solid #dcdfe6; border-radius: 6px; margin-bottom: 10px; background: #fafafa; overflow: hidden; }
.card-header { display: flex; align-items: center; padding: 10px 12px; cursor: pointer; user-select: none; background: #fff; }
.card-header:hover { background: #f5f7fa; }
.card-title { flex: 1; margin: 0 10px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; color: #303133; }
.collapse-icon { font-size: 12px; color: #909399; transition: transform 0.2s; }
.details-panel { padding: 8px 12px 12px 32px; border-top: 1px dashed #ebeef5; background: #fafafa; }
.detail-row { display: flex; align-items: center; padding: 4px 0; font-size: 13px; color: #606266; }
</style>

View File

@@ -10,6 +10,31 @@ describe('HIS System Regression Tests', () => {
cy.get('.dashboard-container').should('be.visible')
})
// @bug544 @regression
describe('Bug #544: Triage Queue List & Historical Query', () => {
it('should display completed status patients and support historical date query', () => {
cy.visit('/triage/queue')
// 1. 验证默认加载当天数据
cy.get('[data-cy="queue-table"]').should('exist')
cy.get('[data-cy="date-range-picker"]').should('contain', new Date().toISOString().slice(0, 10))
// 2. 验证可筛选“完诊”状态患者
cy.get('[data-cy="status-select"]').select('完诊')
cy.get('[data-cy="search-btn"]').click()
cy.get('[data-cy="queue-table"] tbody tr').should('have.length.greaterThan', 0)
cy.get('[data-cy="queue-table"] .status-tag').should('contain', '完诊')
// 3. 验证历史队列查询功能(按时间范围检索)
cy.get('[data-cy="start-date"]').clear().type('2026-05-01')
cy.get('[data-cy="end-date"]').clear().type('2026-05-02')
cy.get('[data-cy="search-btn"]').click()
cy.get('[data-cy="queue-table"]').should('exist')
cy.url().should('include', 'startDate=2026-05-01')
cy.url().should('include', 'endDate=2026-05-02')
})
})
// @bug550 @regression
describe('Bug #550: Exam Item Selection Interaction Optimization', () => {
it('should decouple item/method selection, display full names without "套餐" prefix, and show hierarchical collapsed details', () => {
@@ -35,29 +60,4 @@ describe('HIS System Regression Tests', () => {
cy.get('[data-cy="selected-card"] .details-panel').should('not.contain', '项目套餐明细') // 验证冗余标签已移除
})
})
// @bug544 @regression
describe('Bug #544: Triage Queue List & Historical Query', () => {
it('should display completed status patients and support historical date query', () => {
cy.visit('/triage/queue')
// 1. 验证默认加载当天数据
cy.get('[data-cy="queue-table"]').should('exist')
cy.get('[data-cy="date-range-picker"]').should('contain', new Date().toISOString().slice(0, 10))
// 2. 验证可筛选“完诊”状态患者
cy.get('[data-cy="status-select"]').select('完诊')
cy.get('[data-cy="search-btn"]').click()
cy.get('[data-cy="queue-table"] tbody tr').should('have.length.greaterThan', 0)
cy.get('[data-cy="queue-table"] .status-tag').should('contain', '完诊')
// 3. 验证历史队列查询功能(按时间范围检索)
cy.get('[data-cy="start-date"]').clear().type('2026-05-01')
cy.get('[data-cy="end-date"]').clear().type('2026-05-02')
cy.get('[data-cy="search-btn"]').click()
cy.get('[data-cy="queue-table"]').should('exist')
cy.url().should('include', 'startDate=2026-05-01')
cy.url().should('include', 'endDate=2026-05-02')
})
})
})