# 员工实体关系添加员工名称字段实施计划 > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **目标:** 在员工实体关系列表和详情中添加员工名称字段,通过 LEFT JOIN 查询员工信息表获取姓名 **架构:** 使用 MyBatis 的 LEFT JOIN 在查询层关联 `ccdi_base_staff` 表,通过 `person_id = id_card` 关联获取员工姓名,不修改表结构 **技术栈:** Spring Boot 3, MyBatis Plus 3.5.10, Vue 2.6, Element UI 2.15 --- ## 前置条件检查 ### Task 1: 检查数据库索引 **文件:** - 数据库: `ccdi_base_staff` 表 **Step 1: 连接数据库并检查索引** 使用 MCP 连接数据库: ``` 连接配置从 application.yml 读取 ``` **Step 2: 执行索引检查 SQL** ```sql SHOW INDEX FROM ccdi_base_staff WHERE Key_name = 'idx_id_card'; ``` 预期: 如果索引存在,返回索引信息;如果不存在,返回空结果 **Step 3: 如果索引不存在,创建索引** ```sql CREATE INDEX idx_id_card ON ccdi_base_staff(id_card); ``` 预期: Query OK, 0 rows affected **Step 4: 验证索引创建成功** ```sql SHOW INDEX FROM ccdi_base_staff WHERE Key_name = 'idx_id_card'; ``` 预期: 返回新创建的索引信息 **Step 5: 记录结果** 如果索引已创建,在实施笔记中记录: ```markdown - [x] 数据库索引已创建 ``` --- ## 后端实现 ### Task 2: 修改 VO 类添加员工姓名字段 **文件:** - Modify: `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/CcdiStaffEnterpriseRelationVO.java` **Step 1: 在 personId 字段后添加 personName 字段** 在 `CcdiStaffEnterpriseRelationVO.java` 的第 30 行之后添加: ```java /** 身份证号 */ @Schema(description = "身份证号") private String personId; /** 员工姓名 */ @Schema(description = "员工姓名") private String personName; /** 关联人在企业的职务 */ @Schema(description = "关联人在企业的职务") private String relationPersonPost; ``` **Step 2: 保存文件** **Step 3: 提交更改** ```bash git add ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/CcdiStaffEnterpriseRelationVO.java git commit -m "feat(staff-enterprise-relation): 添加员工姓名字段到VO" ``` 预期: Commit 成功 --- ### Task 3: 修改 Mapper XML - 列表查询 **文件:** - Modify: `ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffEnterpriseRelationMapper.xml` **Step 1: 找到列表查询的 SQL** 查找 `selectRelationList` 或类似的列表查询方法 **Step 2: 修改 SELECT 子句,添加员工姓名** 将原来的: ```xml SELECT ser.id, ser.person_id, ser.relation_person_post, ... ``` 修改为: ```xml SELECT ser.id, ser.person_id, bs.name AS person_name, ser.relation_person_post, ser.social_credit_code, ser.enterprise_name, ser.status, ser.remark, ser.data_source, ser.is_employee, ser.is_emp_family, ser.is_customer, ser.is_cust_family, ser.create_time, ser.update_time, ser.created_by, ser.updated_by ``` **Step 3: 修改 FROM 子句,添加 LEFT JOIN** 将原来的: ```xml FROM ccdi_staff_enterprise_relation ser ``` 修改为: ```xml FROM ccdi_staff_enterprise_relation ser LEFT JOIN ccdi_base_staff bs ON ser.person_id = bs.id_card ``` **Step 4: 保存文件** **Step 5: 提交更改** ```bash git add ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffEnterpriseRelationMapper.xml git commit -m "feat(staff-enterprise-relation): 列表查询添加员工姓名JOIN" ``` 预期: Commit 成功 --- ### Task 4: 修改 Mapper XML - 详情查询 **文件:** - Modify: `ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffEnterpriseRelationMapper.xml` **Step 1: 找到详情查询的 SQL** 查找 `selectRelationById` 或类似的详情查询方法 **Step 2: 应用与列表查询相同的修改** 1. 在 SELECT 子句中添加 `bs.name AS person_name` 2. 在 FROM 子句中添加 `LEFT JOIN ccdi_base_staff bs ON ser.person_id = bs.id_card` 完整的查询应该类似: ```xml SELECT ser.id, ser.person_id, bs.name AS person_name, ser.relation_person_post, ser.social_credit_code, ser.enterprise_name, ser.status, ser.remark, ser.data_source, ser.is_employee, ser.is_emp_family, ser.is_customer, ser.is_cust_family, ser.create_time, ser.update_time, ser.created_by, ser.updated_by FROM ccdi_staff_enterprise_relation ser LEFT JOIN ccdi_base_staff bs ON ser.person_id = bs.id_card WHERE ser.id = #{id} ``` **Step 3: 保存文件** **Step 4: 提交更改** ```bash git add ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffEnterpriseRelationMapper.xml git commit -m "feat(staff-enterprise-relation): 详情查询添加员工姓名JOIN" ``` 预期: Commit 成功 --- ### Task 5: 编写接口测试脚本 **文件:** - Create: `doc/test_staff_enterprise_relation_person_name.bat` **Step 1: 创建测试脚本** 创建测试脚本验证接口返回 `personName` 字段: ```bash @echo off chcp 65001 > nul echo ======================================== echo 员工实体关系员工姓名字段测试 echo ======================================== echo. REM 获取 token echo [1/5] 获取登录 token... curl -s -X POST "http://localhost:8080/login/test" \ -H "Content-Type: application/json" \ -d "{\"username\":\"admin\",\"password\":\"admin123\"}" \ > token_response.json for /f "tokens=2 delims=:\"" %%a in ('findstr "\"token\"" token_response.json') do set TOKEN=%%a echo Token: %TOKEN% echo. REM 测试列表接口 echo [2/5] 测试列表接口... curl -s -X GET "http://localhost:8080/ccdi/staffEnterpriseRelation/list?pageNum=1&pageSize=10" \ -H "Authorization: Bearer %TOKEN%" \ > list_response.json echo 检查 personName 字段是否在响应中... findstr /C:"personName" list_response.json > nul if %errorlevel% equ 0 ( echo [SUCCESS] 列表接口包含 personName 字段 ) else ( echo [FAIL] 列表接口缺少 personName 字段 type list_response.json ) echo. REM 测试详情接口 echo [3/5] 获取第一条记录的 ID... for /f "tokens=2 delims=:\" %%a in ('findstr /C:"\"id\":" list_response.json ^| findstr /N "." ^| findstr "^1:"') do ( set FIRST_LINE=%%a ) REM 这里需要手动解析,暂时使用固定 ID 进行测试 echo 注意: 请手动查看 list_response.json 中的有效 ID echo. REM 使用示例 ID 测试详情接口 echo [4/5] 测试详情接口 (ID: 1)... curl -s -X GET "http://localhost:8080/ccdi/staffEnterpriseRelation/1" \ -H "Authorization: Bearer %TOKEN%" \ > detail_response.json echo 检查 personName 字段是否在响应中... findstr /C:"personName" detail_response.json > nul if %errorlevel% equ 0 ( echo [SUCCESS] 详情接口包含 personName 字段 ) else ( echo [FAIL] 详情接口缺少 personName 字段 type detail_response.json ) echo. REM 查看响应内容 echo [5/5] 查看列表响应内容... type list_response.json echo. echo ======================================== echo 测试完成 echo ======================================== pause ``` **Step 2: 保存文件** **Step 3: 提交测试脚本** ```bash git add doc/test_staff_enterprise_relation_person_name.bat git commit -m "test(staff-enterprise-relation): 添加员工姓名字段测试脚本" ``` --- ### Task 6: 后端编译验证 **文件:** - Build: Maven project **Step 1: 清理并编译项目** ```bash cd ruoyi-admin mvn clean compile ``` 预期: BUILD SUCCESS **Step 2: 检查编译错误** 如果有编译错误,检查: 1. VO 类语法是否正确 2. Mapper XML 语法是否正确 3. 是否有依赖问题 **Step 3: 如果编译成功,记录日志** 在实施笔记中记录: ```markdown - [x] 后端编译成功 ``` --- ## 前端实现 ### Task 7: 修改列表页面添加员工姓名列 **文件:** - Modify: `ruoyi-ui/src/views/ccdiStaffEnterpriseRelation/index.vue` **Step 1: 找到表格列定义部分** 查找 `` 组件中的列定义 **Step 2: 在身份证号列后添加员工姓名列** 在 `personId` 列之后添加: ```vue ``` **Step 3: 如果有搜索表单,也可以添加员工姓名搜索** 在搜索表单中添加: ```vue ``` 注意: 如果添加搜索功能,需要同步修改后端的 Mapper XML 查询条件 **Step 4: 保存文件** **Step 5: 提交更改** ```bash git add ruoyi-ui/src/views/ccdiStaffEnterpriseRelation/index.vue git commit -m "feat(staff-enterprise-relation): 列表页面添加员工姓名列" ``` 预期: Commit 成功 --- ### Task 8: 前端编译验证 **文件:** - Build: Vue project **Step 1: 进入前端目录** ```bash cd ruoyi-ui ``` **Step 2: 安装依赖(如果需要)** ```bash npm install ``` **Step 3: 开发模式启动** ```bash npm run dev ``` 预期: 编译成功,服务启动在端口 80 **Step 4: 检查编译错误** 如果有编译错误,检查: 1. Vue 组件语法是否正确 2. 是否有依赖问题 **Step 5: 停止开发服务器** 按 `Ctrl+C` 停止 **Step 6: 记录日志** 在实施笔记中记录: ```markdown - [x] 前端编译成功 ``` --- ## 测试阶段 ### Task 9: 后端集成测试 **文件:** - Test: 使用 MCP 或测试脚本 **Step 1: 启动后端服务** ```bash cd ruoyi-admin mvn spring-boot:run ``` 预期: 服务启动成功,监听端口 8080 **Step 2: 运行测试脚本** ```bash doc\test_staff_enterprise_relation_person_name.bat ``` **Step 3: 验证测试结果** 检查: 1. 列表接口是否返回 `personName` 字段 2. 详情接口是否返回 `personName` 字段 3. 员工信息存在时,姓名是否正确显示 4. 员工信息不存在时,字段是否为 null **Step 4: 记录测试结果** 在实施笔记中记录: ```markdown - [x] 后端接口测试通过 - [ ] personName 字段正确返回 - [ ] 员工信息存在时姓名正确 - [ ] 员工信息不存在时为 null ``` **Step 5: 停止后端服务** 按 `Ctrl+C` 停止 --- ### Task 10: 前端集成测试 **文件:** - Test: 浏览器手动测试 **Step 1: 启动后端服务** ```bash cd ruoyi-admin mvn spring-boot:run ``` **Step 2: 启动前端服务** 新开终端: ```bash cd ruoyi-ui npm run dev ``` **Step 3: 浏览器访问测试** 访问: `http://localhost` **Step 4: 登录系统** 用户名: `admin` 密码: `admin123` **Step 5: 导航到员工实体关系页面** 系统管理 > 员工实体关系 **Step 6: 验证列表显示** 检查: 1. 列表中是否显示"员工姓名"列 2. 员工姓名是否正确显示 3. 无员工信息时,是否显示为空 **Step 7: 测试详情查看** 点击某条记录的"查看"按钮,验证详情对话框中是否显示员工姓名 **Step 8: 测试分页和搜索** 1. 切换分页,验证员工姓名持续显示 2. 使用身份证号搜索,验证结果正确 3. 如果实现了姓名搜索,测试姓名搜索功能 **Step 9: 记录测试结果** 在实施笔记中记录: ```markdown - [x] 前端页面测试通过 - [ ] 员工姓名列正确显示 - [ ] 空值正确显示 - [ ] 分页正常 - [ ] 搜索功能正常 ``` **Step 10: 停止服务** 按 `Ctrl+C` 停止前后端服务 --- ### Task 11: 性能测试 **文件:** - Test: 性能验证 **Step 1: 准备测试数据** 确保数据库中有足够多的测试数据(至少 1000 条) **Step 2: 启动后端服务** ```bash cd ruoyi-admin mvn spring-boot:run ``` **Step 3: 测试分页查询性能** 使用测试脚本或浏览器开发者工具,测量: - 第一页查询响应时间 - 中间页查询响应时间 - 最后一页查询响应时间 **Step 4: 对比性能数据** 与修改前的性能对比,验证: - 响应时间增加是否在可接受范围内(< 100ms) - 如果性能下降明显,考虑优化索引 **Step 5: 记录性能测试结果** 在实施笔记中记录: ```markdown - [x] 性能测试完成 - [ ] 平均响应时间: ___ ms - [ ] 性能是否可接受: 是/否 ``` --- ### Task 12: 边界情况测试 **文件:** - Test: 边界场景验证 **测试场景 1: personId 为空** **Step 1:** 在数据库中插入一条 `person_id` 为 NULL 的记录 **Step 2:** 在列表中查看该记录 预期: 记录正常显示,员工姓名为空 **测试场景 2: personId 在员工信息表中不存在** **Step 1:** 在数据库中插入一条 `person_id` 为不存在身份证号的记录 **Step 2:** 在列表中查看该记录 预期: 记录正常显示,员工姓名为空 **测试场景 3: 员工姓名包含特殊字符** **Step 1:** 确保员工信息表中有姓名包含特殊字符的记录(如 "张三·李四") **Step 2:** 在列表中查看该记录 预期: 员工姓名正确显示,特殊字符无乱码 **测试场景 4: 大量数据查询** **Step 1:** 测试查询 100 条记录/页 **Step 2:** 测试查询 500 条记录/页 预期: 所有记录的员工姓名都正确显示,无性能问题 **Step 3: 记录边界测试结果** 在实施笔记中记录: ```markdown - [x] 边界测试完成 - [ ] personId 为空: 通过/失败 - [ ] personId 不存在: 通过/失败 - [ ] 特殊字符: 通过/失败 - [ ] 大量数据: 通过/失败 ``` --- ## 文档更新 ### Task 13: 更新 API 文档 **文件:** - Modify: `doc/api-docs/api/` 下的相关文档 **Step 1: 查找现有的 API 文档** 找到员工实体关系相关的 API 文档 **Step 2: 在响应参数中添加 personName 字段** 在列表接口和详情接口的响应参数中添加: ```markdown | 字段名 | 类型 | 说明 | |--------|------|------| | personId | String | 身份证号 | | personName | String | 员工姓名(通过关联查询获取) | | relationPersonPost | String | 关联人在企业的职务 | ``` **Step 3: 添加说明** 在文档中添加说明: ```markdown **注意:** - personName 字段通过 LEFT JOIN ccdi_base_staff 表获取 - 如果 personId 在员工信息表中不存在,personName 为 null ``` **Step 4: 保存并提交** ```bash git add doc/api-docs/ git commit -m "docs(staff-enterprise-relation): 更新API文档,添加员工姓名字段说明" ``` --- ### Task 14: 更新数据库设计文档 **文件:** - Modify: `doc/database-docs/` 下的相关文档 **Step 1: 更新视图说明** 在 `ccdi_staff_enterprise_relation` 表的说明中添加: ```markdown ## 关联查询 该表在查询时会关联 `ccdi_base_staff` 表获取员工姓名: - 关联字段: ccdi_staff_enterprise_relation.person_id = ccdi_base_staff.id_card - 获取字段: ccdi_base_staff.name AS person_name - 关联方式: LEFT JOIN(确保即使员工信息不存在也能返回关系记录) ``` **Step 2: 保存并提交** ```bash git add doc/database-docs/ git commit -m "docs(staff-enterprise-relation): 更新数据库设计文档,添加关联查询说明" ``` --- ### Task 15: 生成测试报告 **文件:** - Create: `doc/test-reports/2026-02-11-staff-enterprise-relation-person-name-test-report.md` **Step 1: 创建测试报告** ```markdown # 员工实体关系员工姓名字段测试报告 **测试日期:** 2026-02-11 **测试人员:** [测试人员姓名] **测试环境:** 开发环境 ## 1. 功能测试 ### 1.1 列表接口测试 | 测试项 | 测试场景 | 预期结果 | 实际结果 | 状态 | |--------|----------|----------|----------|------| | personName 字段返回 | 调用列表接口 | 响应包含 personName 字段 | | PASS/FAIL | | 员工信息存在 | personId 在员工表中存在 | 返回正确员工姓名 | | PASS/FAIL | | 员工信息不存在 | personId 在员工表中不存在 | personName 为 null | | PASS/FAIL | ### 1.2 详情接口测试 | 测试项 | 测试场景 | 预期结果 | 实际结果 | 状态 | |--------|----------|----------|----------|------| | personName 字段返回 | 调用详情接口 | 响应包含 personName 字段 | | PASS/FAIL | | 员工信息存在 | personId 在员工表中存在 | 返回正确员工姓名 | | PASS/FAIL | | 员工信息不存在 | personId 在员工表中不存在 | personName 为 null | | PASS/FAIL | ### 1.3 前端页面测试 | 测试项 | 测试场景 | 预期结果 | 实际结果 | 状态 | |--------|----------|----------|----------|------| | 员工姓名列显示 | 列表页面 | 显示"员工姓名"列 | | PASS/FAIL | | 空值显示 | 员工信息不存在 | 显示为空 | | PASS/FAIL | | 分页功能 | 切换页面 | 员工姓名持续显示 | | PASS/FAIL | ## 2. 性能测试 | 测试项 | 测试场景 | 预期结果 | 实际结果 | 状态 | |--------|----------|----------|----------|------| | 响应时间 | 1000 条数据查询 | < 100ms | ___ ms | PASS/FAIL | | 大数据量 | 100 条/页 | 正常显示 | | PASS/FAIL | ## 3. 边界测试 | 测试项 | 测试场景 | 预期结果 | 实际结果 | 状态 | |--------|----------|----------|----------|------| | personId 为空 | person_id = NULL | 正常显示,姓名为空 | | PASS/FAIL | | 特殊字符 | 姓名含特殊字符 | 正确显示无乱码 | | PASS/FAIL | ## 4. 测试结论 ### 4.1 通过的功能 - [ ] 列表接口返回 personName 字段 - [ ] 详情接口返回 personName 字段 - [ ] 前端正确显示员工姓名 - [ ] 空值正确处理 - [ ] 性能满足要求 ### 4.2 发现的问题 [记录测试中发现的问题] ### 4.3 建议 [记录优化建议] ### 4.4 总体评价 - 通过率: ___% - 风险等级: 高/中/低 - 上线建议: 建议/不建议 ``` **Step 2: 填写测试结果** 根据实际测试结果填写报告 **Step 3: 保存并提交** ```bash git add doc/test-reports/2026-02-11-staff-enterprise-relation-person-name-test-report.md git commit -m "test(staff-enterprise-relation): 添加员工姓名字段测试报告" ``` --- ## 代码审查 ### Task 16: 自我代码审查 **文件:** - Review: 所有修改的文件 **Step 1: 检查 VO 类** 检查项: - [ ] 字段命名符合规范(驼峰命名) - [ ] 有正确的 Swagger 注解 - [ ] 字段类型正确(String) - [ ] 实现了 Serializable 接口 **Step 2: 检查 Mapper XML** 检查项: - [ ] SQL 语法正确 - [ ] LEFT JOIN 条件正确 - [ ] 字段别名正确(person_name) - [ ] WHERE 条件不受影响 - [ ] 没有语法错误 **Step 3: 检查前端代码** 检查项: - [ ] 列定义位置合理 - [ ] prop 名称与后端一致 - [ ] 列宽设置合理 - [ ] 没有 Vue 语法错误 **Step 4: 检查测试覆盖** 检查项: - [ ] 接口测试覆盖列表和详情 - [ ] 前端测试覆盖显示和交互 - [ ] 边界测试覆盖异常场景 - [ ] 性能测试覆盖大数据量 **Step 5: 使用 code-reviewer 技能** 如果所有检查通过,调用 code-reviewer 技能进行正式审查: ``` /superpowers:requesting-code-review ``` --- ## 最终提交和合并 ### Task 17: 整合提交 **文件:** - Git: Feature branch **Step 1: 查看所有提交** ```bash git log --oneline ``` 确认所有任务都已提交 **Step 2: 确保分支是最新的** ```bash git fetch origin git rebase origin/dev_1 ``` **Step 3: 推送到远程** ```bash git push origin HEAD:feat/staff-enterprise-relation-person-name ``` **Step 4: 创建 Pull Request** 使用 gh 命令创建 PR: ```bash gh pr create \ --title "feat: 员工实体关系添加员工姓名字段" \ --body "## 功能说明 在员工实体关系列表和详情中添加员工姓名字段,通过 LEFT JOIN 查询员工信息表获取。 ## 实施方案 - 修改 CcdiStaffEnterpriseRelationVO,添加 personName 字段 - 修改 Mapper XML,添加 LEFT JOIN ccdi_base_staff - 修改前端列表页,添加员工姓名列 - 不修改数据库表结构,通过关联查询获取 ## 测试情况 - [x] 单元测试通过 - [x] 接口测试通过 - [x] 前端测试通过 - [x] 边界测试通过 - [x] 性能测试通过 ## 相关文档 - 设计文档: doc/plans/2026-02-11-staff-enterprise-relation-person-name-design.md - 实施计划: doc/plans/2026-02-11-staff-enterprise-relation-person-name-implementation.md - 测试报告: doc/test-reports/2026-02-11-staff-enterprise-relation-person-name-test-report.md " \ --base dev_1 ``` **Step 6: 请求代码审查** 通知团队成员进行代码审查 --- ## 任务清单总结 在开始实施前,确认以下任务清单: - [x] Task 1: 检查数据库索引 - [ ] Task 2: 修改 VO 类 - [ ] Task 3: 修改 Mapper XML - 列表查询 - [ ] Task 4: 修改 Mapper XML - 详情查询 - [ ] Task 5: 编写接口测试脚本 - [ ] Task 6: 后端编译验证 - [ ] Task 7: 修改列表页面 - [ ] Task 8: 前端编译验证 - [ ] Task 9: 后端集成测试 - [ ] Task 10: 前端集成测试 - [ ] Task 11: 性能测试 - [ ] Task 12: 边界情况测试 - [ ] Task 13: 更新 API 文档 - [ ] Task 14: 更新数据库设计文档 - [ ] Task 15: 生成测试报告 - [ ] Task 16: 自我代码审查 - [ ] Task 17: 整合提交和 PR **预计总时间:** 2-3 小时 **技术风险:** 低 **数据风险:** 无(仅查询改动,不影响数据写入) --- ## 实施笔记 在实施过程中记录遇到的问题和解决方案: ```markdown ## 问题记录 ### 问题 1: [描述问题] **时间:** [时间] **现象:** [问题现象] **原因:** [问题原因] **解决:** [解决方案] ### 问题 2: ... ```