Files
ccdi/doc/plans/2026-02-11-staff-enterprise-relation-person-name-implementation.md

950 lines
21 KiB
Markdown
Raw Normal View History

# 员工实体关系添加员工名称字段实施计划
> **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: 找到表格列定义部分**
查找 `<el-table>` 组件中的列定义
**Step 2: 在身份证号列后添加员工姓名列**
`personId` 列之后添加:
```vue
<el-table-column label="身份证号" align="center" prop="personId" width="180" />
<el-table-column label="员工姓名" align="center" prop="personName" width="100" />
<el-table-column label="职务" align="center" prop="relationPersonPost" width="120" />
```
**Step 3: 如果有搜索表单,也可以添加员工姓名搜索**
在搜索表单中添加:
```vue
<el-form-item label="员工姓名" prop="personName">
<el-input
v-model="queryParams.personName"
placeholder="请输入员工姓名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
```
注意: 如果添加搜索功能,需要同步修改后端的 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: ...
```