From cc0f9053dd9ba5f0180a43b53c33487860d1aaa3 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Mon, 17 Nov 2025 14:55:04 +0800 Subject: [PATCH] fix: hide redundant region_name tag for district-level departments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题 顺德区服务部门显示额外的"顺德区"标签,而其他区没有,造成显示不一致。 ## 根因 数据库中顺德区服务部门的region_id字段被设置,其他区为NULL,导致region_name显示不一致。 ## 解决 修改前端渲染逻辑,对于二级节点(Level 1),如果节点名称已包含"区"字,则智能隐藏region_name标签,避免冗余显示。 ## 修改 - static/super_admin.html: 在渲染元数据时添加智能隐藏逻辑 - 添加详细的修复说明文档和测试脚本 ## 效果 所有区级服务部门(如禅城区、南海区、顺德区等)现在都统一不显示冗余的区域标签,保持显示一致性。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- REGION_NAME_FIX.md | 138 ++++++++++++++++++++++++++++++++++++++++ static/super_admin.html | 3 +- test_region_name_fix.py | 96 ++++++++++++++++++++++++++++ 3 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 REGION_NAME_FIX.md create mode 100644 test_region_name_fix.py diff --git a/REGION_NAME_FIX.md b/REGION_NAME_FIX.md new file mode 100644 index 0000000..32a2c36 --- /dev/null +++ b/REGION_NAME_FIX.md @@ -0,0 +1,138 @@ +# 修复"顺德区服务部门"显示冗余标签问题 + +## 问题描述 + +用户发现"顺德区服务部门"下面显示了一个"顺德区"tag标签,而其他区(如禅城区、南海区等)没有这个标签,造成了显示不一致的问题。 + +## 问题分析 + +### 根本原因 + +通过代码分析发现,问题出在数据库层面: + +1. **数据结构**: + - `service_departments` 表有 `region_id` 字段 + - 通过 LEFT JOIN `regions` 表获取 `region_name` 字段 + - SQL: `r.name AS region_name FROM service_departments sd LEFT JOIN regions r ON r.id = sd.region_id` + +2. **数据不一致**: + - 顺德区服务部门的 `region_id` 字段被设置了值 + - 其他区级服务部门的 `region_id` 字段为 `NULL` + - 导致顺德区显示了额外的 `region_name` 标签 + +3. **业务逻辑**: + - 区级服务部门(如"禅城区服务部门"、"顺德区服务部门"等)的名称本身就包含了区域信息 + - 额外的 `region_name` 标签是冗余的 + +## 解决方案 + +### 方案选择 + +**方案A**: 修改数据库,清除顺德区的region_id +- 优点:数据层面解决 +- 缺点:需要数据库操作,可能影响其他功能 + +**方案B**: 修改前端渲染逻辑,隐藏冗余标签 +- 优点:不影响数据,前端智能隐藏 +- 缺点:治标不治本 + +**最终选择:方案B + 优化逻辑** + +修改前端渲染逻辑,对于二级节点(Level 1),如果节点名称已经包含"区"字,则不显示 `region_name` 标签。 + +### 代码实现 + +**文件**: `static/super_admin.html` + +**修改位置**: 第1346-1352行 + +**修改前**: +```javascript +if (node.region_name) { + const regionSpan = document.createElement('span'); + regionSpan.className = 'node-region'; + regionSpan.textContent = node.region_name; + metaRow.appendChild(regionSpan); +} +``` + +**修改后**: +```javascript +// 对于二级节点,如果名称已包含区域信息(如"XX区服务部门"),则不显示region_name标签 +if (node.region_name && !(level === 1 && node.name && node.name.includes('区'))) { + const regionSpan = document.createElement('span'); + regionSpan.className = 'node-region'; + regionSpan.textContent = node.region_name; + metaRow.appendChild(regionSpan); +} +``` + +### 逻辑说明 + +1. 首先检查 `node.region_name` 是否存在 +2. 对于二级节点(`level === 1`): + - 如果节点名称包含"区"字,则不显示 `region_name` 标签 + - 如果节点名称不包含"区"字,则正常显示 `region_name` 标签 +3. 对于其他层级: + - 正常显示 `region_name` 标签(如果存在) + +## 效果验证 + +### 修复前 +``` +✅ 禅城区服务部门 + [无region_name标签] + +✅ 南海区服务部门 + [无region_name标签] + +❌ 顺德区服务部门 + [显示"顺德区"标签] ← 冗余! + +✅ 三水区服务部门 + [无region_name标签] +``` + +### 修复后 +``` +✅ 禅城区服务部门 + [无region_name标签] + +✅ 南海区服务部门 + [无region_name标签] + +✅ 顺德区服务部门 + [无region_name标签] ← 已修复! + +✅ 三水区服务部门 + [无region_name标签] +``` + +## 优势 + +1. **智能隐藏**:前端自动识别并隐藏冗余标签 +2. **不破坏数据**:数据库保持原样,不影响其他功能 +3. **向前兼容**:如果未来有需要显示 `region_name` 的二级节点(名称不包含"区"),仍然可以正常显示 +4. **一致性**:所有区级服务部门的显示效果保持一致 + +## 测试建议 + +1. **功能测试**: + - 验证所有二级节点都不显示冗余的区名标签 + - 确认三级节点的 `region_name` 标签正常显示(如果有) + +2. **边界测试**: + - 如果有名称不包含"区"字的二级节点,确认其 `region_name` 标签正常显示 + +3. **视觉测试**: + - 确认组织架构界面整体布局和样式正常 + +## 文件变更 + +- `static/super_admin.html`: 修改渲染逻辑 +- `test_region_name_fix.py`: 添加测试脚本 +- `REGION_NAME_FIX.md`: 本文档 + +## 总结 + +通过在前端智能隐藏冗余标签,我们解决了顺德区服务部门显示不一致的问题,同时保持了代码的简洁性和可维护性。这种方案既解决了当前问题,又为未来可能的扩展留出了空间。 diff --git a/static/super_admin.html b/static/super_admin.html index ffccb62..984cd2c 100644 --- a/static/super_admin.html +++ b/static/super_admin.html @@ -1343,7 +1343,8 @@ function renderOrgListNode(node, level) { codeSpan.textContent = node.code; metaRow.appendChild(codeSpan); } - if (node.region_name) { + // 对于二级节点,如果名称已包含区域信息(如"XX区服务部门"),则不显示region_name标签 + if (node.region_name && !(level === 1 && node.name && node.name.includes('区'))) { const regionSpan = document.createElement('span'); regionSpan.className = 'node-region'; regionSpan.textContent = node.region_name; diff --git a/test_region_name_fix.py b/test_region_name_fix.py new file mode 100644 index 0000000..603dfde --- /dev/null +++ b/test_region_name_fix.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +验证二级节点region_name标签隐藏逻辑 +""" + +from playwright.sync_api import sync_playwright +import time + +def test_region_name_hiding(): + with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + page = browser.new_page() + + try: + # 访问超级管理员页面 + print("正在访问超级管理员页面...") + page.goto('http://127.0.0.1:8000/static/super_admin.html', wait_until='networkidle', timeout=30000) + time.sleep(2) + + # 切换到组织架构标签页 + print("切换到组织架构标签页...") + org_tab = page.locator('button.tab-button[data-tab="org-chart-tab"]') + if org_tab.is_visible(): + org_tab.click() + time.sleep(3) + + # 检查是否有数据加载 + loading_text = page.locator('.loading') + if loading_text.is_visible(): + print("加载中...") + # 等待数据加载完成 + time.sleep(5) + + print("\n=== 检查二级节点标签显示情况 ===") + + # 查找所有二级节点 + level1_nodes = page.locator('.org-node[data-level="1"]').all() + print(f"找到 {len(level1_nodes)} 个二级节点") + + for i, node in enumerate(level1_nodes): + node_name = node.locator('.node-name').text_content() + region_tags = node.locator('.node-region').all() + has_region_tag = len(region_tags) > 0 + + # 检查名称是否包含"区"字 + has_district_char = '区' in node_name + + status = "隐藏" if (has_district_char and not has_region_tag) else "显示" + expected = "隐藏" if has_district_char else "显示" + + print(f"\n{i+1}. {node_name}:") + print(f" - 名称包含'区'字: {has_district_char}") + print(f" - region_name标签: {status}") + print(f" - 预期: {expected}") + + if status == expected: + print(f" [OK] 符合预期") + else: + print(f" [ERROR] 不符合预期!") + + # 检查顺德区节点 + print("\n=== 重点检查顺德区服务部门 ===") + shunde_node = None + for node in level1_nodes: + if '顺德' in node.locator('.node-name').text_content(): + shunde_node = node + break + + if shunde_node: + node_name = shunde_node.locator('.node-name').text_content() + region_tags = shunde_node.locator('.node-region').all() + has_region_tag = len(region_tags) > 0 + + print(f"节点名称: {node_name}") + print(f"是否显示'顺德区'标签: {has_region_tag}") + + if not has_region_tag: + print("[OK] 顺德区服务部门不再显示冗余的'顺德区'标签!") + else: + print("[ERROR] 顺德区服务部门仍显示冗余标签!") + + # 截图查看效果 + page.screenshot(path='/tmp/org_chart_fixed.png', full_page=True) + print("\n截图已保存到 /tmp/org_chart_fixed.png") + + except Exception as e: + print(f"测试过程中出现错误: {e}") + import traceback + traceback.print_exc() + + finally: + browser.close() + +if __name__ == '__main__': + test_region_name_hiding()