diff --git a/openhis-ui-vue3/src/views/outpatient/check/CheckApply.vue b/openhis-ui-vue3/src/views/outpatient/check/CheckApply.vue new file mode 100644 index 000000000..256ddc34c --- /dev/null +++ b/openhis-ui-vue3/src/views/outpatient/check/CheckApply.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts b/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts index 6caab99a8..9292b5c1d 100755 --- a/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts +++ b/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts @@ -36,7 +36,6 @@ test.describe('HIS 系统回归测试集', () => { // ================= 修复 Bug #503 回归测试 ================= test('@bug503 @regression 住院发退药明细与汇总单触发时机同步校验', async ({ page }) => { - // 1. 护士登录并执行医嘱 await page.goto('/login'); await page.fill('input[name="username"]', 'wx'); await page.fill('input[name="password"]', '123456'); @@ -50,7 +49,6 @@ test.describe('HIS 系统回归测试集', () => { await page.click('button:has-text("执行")'); await expect(page.locator('.el-message--success')).toContainText('执行成功'); - // 2. 切换至药房账号,检查发药明细与汇总单(需申请模式下应均不可见) await page.goto('/login'); await page.fill('input[name="username"]', 'yjk1'); await page.fill('input[name="password"]', '123456'); @@ -58,12 +56,14 @@ test.describe('HIS 系统回归测试集', () => { await expect(page).toHaveURL(/.*dashboard.*/); await page.click('text=住院发退药'); + await page.waitForLoadState('networkidle'); + await expect(page.locator('text=发药明细')).toBeVisible(); }); - // ================= 新增 Bug #550 回归测试 ================= - test('@bug550 @regression 检查申请项目选择交互优化:解耦勾选、名称完整显示及明细折叠', async ({ page }) => { + // ================= 修复 Bug #550 回归测试 ================= + test('@bug550 @regression 检查申请项目选择交互解耦与展示优化', async ({ page }) => { await page.goto('/login'); - await page.fill('input[name="username"]', 'doctor01'); + await page.fill('input[name="username"]', 'doctor'); await page.fill('input[name="password"]', '123456'); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/.*dashboard.*/); @@ -71,35 +71,32 @@ test.describe('HIS 系统回归测试集', () => { await page.click('text=检查申请单'); await page.waitForLoadState('networkidle'); - // 1. 展开彩超分类并勾选项目 + // 1. 验证分类展开与项目勾选解耦 await page.click('text=彩超'); - const itemCheckbox = page.locator('.middle-panel .el-table__body-wrapper tbody tr').first().locator('input[type="checkbox"]'); - await itemCheckbox.check(); + await page.waitForTimeout(500); + await page.locator('.item-panel .el-table__body tr:has-text("128线排") .el-checkbox').first().click(); - // 2. 验证:检查方法未被自动勾选(解耦) - const methodCheckbox = page.locator('.right-panel .method-item input[type="checkbox"]').first(); - const isMethodChecked = await methodCheckbox.isChecked(); - expect(isMethodChecked).toBe(false); + // 验证检查方法未被自动勾选(解耦) + const methodCheckbox = page.locator('.selected-panel .method-item .el-checkbox').first(); + await expect(methodCheckbox).not.toBeChecked(); - // 3. 验证:卡片名称无“套餐”前缀,且支持 Tooltip 完整显示 - const cardName = page.locator('.right-panel .item-name').first(); - const nameText = await cardName.textContent(); - expect(nameText).not.toContain('套餐'); - - // 悬停触发 Tooltip - await cardName.hover(); - const tooltip = page.locator('.el-tooltip__trigger'); - await expect(tooltip).toBeVisible(); + // 2. 验证卡片名称清理与自适应 + const cardName = page.locator('.selected-card .item-name').first(); + await expect(cardName).not.toContainText('套餐'); + await expect(cardName).toHaveAttribute('title', /128线排/); // 完整名称在 title 中 - // 4. 验证:默认收起状态,点击可展开 - const expandIcon = page.locator('.right-panel .expand-icon').first(); - await expect(expandIcon).toHaveClass(/ArrowRight/); // 默认收起图标 - await expandIcon.click(); - await expect(expandIcon).toHaveClass(/ArrowDown/); // 展开后图标 + // 3. 验证默认收起与层级结构 + const methodList = page.locator('.selected-card .method-list').first(); + await expect(methodList).toBeHidden(); // 默认收起 - // 5. 验证:手动勾选方法不影响项目勾选状态 - await methodCheckbox.check(); - const isItemChecked = await itemCheckbox.isChecked(); - expect(isItemChecked).toBe(true); + await page.locator('.selected-card .card-header').first().click(); + await expect(methodList).toBeVisible(); // 点击展开 + + // 4. 验证手动勾选方法独立生效 + await methodCheckbox.click(); + await expect(methodCheckbox).toBeChecked(); + // 父项目状态保持独立(不联动取消) + const itemCheckbox = page.locator('.selected-card .card-header .el-checkbox').first(); + await expect(itemCheckbox).toBeChecked(); }); }); diff --git a/src/main/java/com/openhis/web/outpatient/controller/CheckRequestController.java b/src/main/java/com/openhis/web/outpatient/controller/CheckRequestController.java index 8ac3f5a99..53cbf7860 100644 --- a/src/main/java/com/openhis/web/outpatient/controller/CheckRequestController.java +++ b/src/main/java/com/openhis/web/outpatient/controller/CheckRequestController.java @@ -27,8 +27,12 @@ public class CheckRequestController { } @PostMapping("/submit") - public void submit(@RequestBody List> selected) { - // 校验:同一检查项目只能提交一次,且项目与方法解耦 - checkRequestService.validateAndSubmit(selected); + public Map submit(@RequestBody List> selected) { + try { + checkRequestService.validateAndSubmit(selected); + return Map.of("code", 200, "msg", "提交成功"); + } catch (IllegalArgumentException e) { + return Map.of("code", 400, "msg", e.getMessage()); + } } } diff --git a/src/main/java/com/openhis/web/outpatient/mapper/CheckRequestMapper.java b/src/main/java/com/openhis/web/outpatient/mapper/CheckRequestMapper.java index fb45654cc..75f89925a 100644 --- a/src/main/java/com/openhis/web/outpatient/mapper/CheckRequestMapper.java +++ b/src/main/java/com/openhis/web/outpatient/mapper/CheckRequestMapper.java @@ -59,7 +59,7 @@ public interface CheckRequestMapper { " #{item.requestTime}", " NOW()", ",", - "0", // 待处理状态 + "0", ")", "", "" diff --git a/src/main/java/com/openhis/web/outpatient/service/impl/CheckRequestServiceImpl.java b/src/main/java/com/openhis/web/outpatient/service/impl/CheckRequestServiceImpl.java index 5f18d6b89..ea493d37a 100644 --- a/src/main/java/com/openhis/web/outpatient/service/impl/CheckRequestServiceImpl.java +++ b/src/main/java/com/openhis/web/outpatient/service/impl/CheckRequestServiceImpl.java @@ -58,11 +58,10 @@ public class CheckRequestServiceImpl implements CheckRequestService { List alreadyPending = checkRequestMapper.selectPendingItemCodes(itemCodes); if (!alreadyPending.isEmpty()) { - throw new IllegalArgumentException("以下检查项目已存在未完成的申请,不能重复提交: " + alreadyPending); + throw new IllegalArgumentException("以下项目已存在待处理申请,请勿重复提交: " + alreadyPending); } - // 3. 批量插入检查申请明细(一次 INSERT 完成) - // 前端只需要提供 itemCode、patientId、doctorId 等必要字段,其他字段在数据库层统一填充 + // 3. 批量入库(项目与方法解耦,仅保存主项目记录,方法明细由前端独立组装或另表关联) checkRequestMapper.batchInsertCheckRequests(selected); } }