- 新增员工实体关系管理API文档 - 在列表接口和详情接口响应中添加personName字段 - 说明personName通过LEFT JOIN ccdi_base_staff表获取 - 如果personId在员工信息表中不存在,personName为null
12 KiB
Task 2 代码质量审查报告
审查日期: 2026-02-11
审查者: 代码质量审查者子代理
实施者子代理提交: SHA 17edc720
分支: feat/staff-enterprise-relation-person-name
任务: 修改 VO 类添加员工姓名字段
执行摘要
审查结果: ⚠️ 需要修复 (Needs Fixes)
评分: 65/100
关键发现:
- ✅ VO类代码规范符合要求
- ❌ Critical: Mapper XML未同步更新 - ResultMap缺少personName映射
- ❌ Critical: SQL查询未关联ccdi_base_staff表获取员工姓名
- ⚠️ Important: 功能不完整 - 无法实现按姓名搜索的业务需求
1. 优势 (Strengths)
1.1 VO类代码质量 ✅
文件: CcdiStaffEnterpriseRelationVO.java
/** 员工姓名 */
@Schema(description = "员工姓名")
private String personName;
优点:
- ✅ 字段命名规范:使用驼峰命名法
personName - ✅ 注释清晰:中文注释说明字段用途
- ✅ Swagger注解正确:
@Schema(description = "员工姓名")用于API文档 - ✅ 字段类型合理:使用
String类型存储姓名 - ✅ 位置正确:紧跟在
personId字段之后,符合逻辑关联性 - ✅ 符合若依框架规范:与项目中其他VO类风格一致
1.2 Git提交质量 ✅
commit 17edc7208d31ef8c2ac2479c1d04279a6c4a74ab
Author: wkc <978997012@qq.com>
Date: Wed Feb 11 14:40:29 2026 +0800
feat(staff-enterprise-relation): 添加员工姓名字段到VO
优点:
- ✅ 提交信息清晰:准确描述了变更内容
- ✅ 符合 Conventional Commits 规范:使用
feat类型 - ✅ 添加了作用域:
(staff-enterprise-relation) - ✅ 变更粒度合理:单次提交只修改一个文件
- ✅ 影响范围可控:仅修改VO类,4行新增代码
1.3 符合Java编码规范 ✅
- ✅ 符合Java命名规范(驼峰命名)
- ✅ 符合若依框架编码规范
- ✅ 注释风格与项目保持一致
- ✅ 使用Lombok
@Data注解
2. 问题 (Issues)
2.1 Critical - Mapper XML未同步更新 ❌
问题位置: CcdiStaffEnterpriseRelationMapper.xml
问题描述:
VO类添加了 personName 字段,但对应的 ResultMap 和 SQL 查询完全未更新,导致:
- ResultMap缺少映射:
<!-- 当前的 ResultMap (第8-36行) -->
<resultMap type="com.ruoyi.ccdi.domain.vo.CcdiStaffEnterpriseRelationVO" id="CcdiStaffEnterpriseRelationVOResult">
<id property="id" column="id"/>
<result property="personId" column="person_id"/>
<!-- ❌ 缺少 personName 的映射 -->
<result property="relationPersonPost" column="relation_person_post"/>
...
</resultMap>
- SQL查询未关联员工表:
<!-- 当前的查询 (第40-48行) -->
<select id="selectRelationPage" resultMap="CcdiStaffEnterpriseRelationVOResult">
SELECT
id, person_id, relation_person_post, social_credit_code, enterprise_name,
status, remark, data_source, is_employee, is_emp_family, is_customer, is_cust_family,
created_by, create_time, updated_by, update_time
FROM ccdi_staff_enterprise_relation
<!-- ❌ 未 LEFT JOIN ccdi_base_staff 表 -->
<!-- ❌ 未查询 s.name as person_name -->
<where>
...
</select>
影响:
- ❌
personName字段永远为null - ❌ 无法实现按员工姓名搜索的业务需求
- ❌ VO类字段与实际查询结果不匹配
参考正确实现:
项目中 CcdiStaffFmyRelationMapper.xml 的正确实现:
<!-- 员工亲属关系ResultMap (第8-36行) -->
<resultMap type="com.ruoyi.ccdi.domain.vo.CcdiStaffFmyRelationVO" id="CcdiStaffFmyRelationVOResult">
...
<result property="personId" column="person_id"/>
<result property="personName" column="person_name"/> <!-- ✅ 正确映射 -->
...
</resultMap>
<!-- 分页查询员工亲属关系列表 (第39-77行) -->
<select id="selectRelationPage" resultMap="CcdiStaffFmyRelationVOResult">
SELECT
r.id, r.person_id, s.name as person_name, r.relation_type, r.relation_name,
...
FROM ccdi_staff_fmy_relation r
LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card <!-- ✅ 正确关联 -->
<where>
<if test="query.personName != null and query.personName != ''">
AND s.name LIKE CONCAT('%', #{query.personName}, '%') <!-- ✅ 支持姓名搜索 -->
</if>
...
</select>
修复建议:
- 在
CcdiStaffEnterpriseRelationVOResult的 ResultMap 中添加:
<result property="personName" column="person_name"/>
- 修改所有 SQL 查询语句,添加表关联:
FROM ccdi_staff_enterprise_relation r
LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card
- 在 SELECT 子句中添加:
s.name as person_name
- 支持按姓名搜索(在
<where>中添加):
<if test="query.personName != null and query.personName != ''">
AND s.name LIKE CONCAT('%', #{query.personName}, '%')
</if>
2.2 Critical - QueryDTO缺少personName字段 ❌
问题位置: CcdiStaffEnterpriseRelationQueryDTO.java
问题描述: 如果需要支持按员工姓名搜索,QueryDTO 也需要添加对应的字段。
参考正确实现:
CcdiStaffFmyRelationQueryDTO.java:
/** 员工身份证号 */
@Schema(description = "员工身份证号")
private String personId;
/** 员工姓名 */ // ✅ QueryDTO 也有此字段
@Schema(description = "员工姓名")
private String personName;
修复建议:
在 CcdiStaffEnterpriseRelationQueryDTO 中添加:
/** 员工姓名 */
@Schema(description = "员工姓名")
private String personName;
2.3 Important - 缺少数据库表关联说明 ⚠️
问题描述: 虽然VO类添加了字段,但缺少以下说明:
personName字段的数据来源:通过person_id关联ccdi_base_staff.id_card获取ccdi_base_staff.name- 这是一个计算字段(非持久化字段),仅用于查询展示
- 数据库表
ccdi_staff_enterprise_relation不需要添加person_name列
建议: 在VO类字段注释中添加更详细的说明:
/** 员工姓名(关联字段,通过person_id关联ccdi_base_staff表获取) */
@Schema(description = "员工姓名")
private String personName;
3. 建议改进 (Suggestions)
3.1 Optional - 添加字段验证注解
如果需要在QueryDTO中支持姓名搜索,可以添加验证注解:
/** 员工姓名 */
@Schema(description = "员工姓名")
@Size(max = 100, message = "员工姓名长度不能超过100个字符")
private String personName;
3.2 Optional - 考虑添加Excel导出字段
如果需要在Excel导出中显示员工姓名,需要在 CcdiStaffEnterpriseRelationExcel.java 中也添加相应字段。
3.3 Optional - 添加单元测试
建议添加单元测试验证:
- 当
person_id在ccdi_base_staff表中存在时,能正确获取person_name - 当
person_id不存在或为null时,person_name应为null而非抛出异常
4. 对比参考实现
4.1 员工亲属关系模块(正确实现)✅
文件: CcdiStaffFmyRelationMapper.xml
| 方面 | 实现方式 |
|---|---|
| ResultMap | 包含 <result property="personName" column="person_name"/> |
| SQL关联 | LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card |
| 字段查询 | s.name as person_name |
| 搜索支持 | AND s.name LIKE CONCAT('%', #{query.personName}, '%') |
| QueryDTO | 包含 personName 字段 |
4.2 员工调动模块(正确实现)✅
文件: CcdiStaffTransferMapper.xml
| 方面 | 实现方式 |
|---|---|
| ResultMap | 包含 <result property="staffName" column="staff_name"/> |
| SQL关联 | LEFT JOIN ccdi_base_staff s ON t.staff_id = s.staff_id |
| 字段查询 | s.name as staff_name |
| 搜索支持 | AND s.name LIKE CONCAT('%', #{query.staffName}, '%') |
4.3 当前实现(待修复)❌
文件: CcdiStaffEnterpriseRelationMapper.xml
| 方面 | 当前状态 | 应该实现 |
|---|---|---|
| ResultMap | ❌ 缺少personName映射 | ✅ 添加映射 |
| SQL关联 | ❌ 未关联ccdi_base_staff | ✅ LEFT JOIN |
| 字段查询 | ❌ 未查询name字段 | ✅ SELECT s.name |
| 搜索支持 | ❌ 不支持姓名搜索 | ✅ 添加搜索条件 |
| QueryDTO | ❌ 缺少personName | ✅ 添加字段 |
5. 数据库表关系说明
5.1 表结构
主表: ccdi_staff_enterprise_relation
person_id(VARCHAR) - 身份证号,关联外键
关联表: ccdi_base_staff
id_card(VARCHAR) - 身份证号name(VARCHAR) - 员工姓名
5.2 关联关系
ccdi_staff_enterprise_relation.person_id
↓ (关联)
ccdi_base_staff.id_card
↓ (获取)
ccdi_base_staff.name → 映射为 VO.personName
5.3 注意事项
- ⚠️
ccdi_staff_enterprise_relation表不需要添加person_name列 - ⚠️
personName是计算字段,仅用于查询和展示 - ⚠️ 需要通过 MyBatis 的
LEFT JOIN在查询时动态获取
6. 修复优先级
必须修复 (Critical) - 阻塞问题
-
✅ 优先级 1: 更新
CcdiStaffEnterpriseRelationMapper.xml- 在 ResultMap 中添加
personName映射 - 在所有 SELECT 查询中添加
LEFT JOIN ccdi_base_staff - 在 SELECT 子句中添加
s.name as person_name
- 在 ResultMap 中添加
-
✅ 优先级 2: 更新
CcdiStaffEnterpriseRelationQueryDTO- 添加
personName字段以支持姓名搜索
- 添加
应该修复 (Important)
- ⚠️ 优先级 3: 添加字段注释说明
- 说明
personName是关联字段
- 说明
可选修复 (Optional)
- 💡 优先级 4: 添加单元测试
- 💡 优先级 5: 考虑Excel导出字段
7. 审查结论
总体评价
本次代码变更在VO类层面符合规范,但存在严重的实现不完整问题:
- ✅ 代码规范: 符合Java编码规范和若依框架规范
- ✅ 提交质量: Git提交信息清晰,符合最佳实践
- ❌ 功能完整性: 严重不完整,缺少关键的Mapper实现
- ❌ 可测试性: 无法测试,因为personName永远为null
评分细项
| 评估项 | 得分 | 满分 | 说明 |
|---|---|---|---|
| VO类代码规范 | 20 | 20 | 完全符合规范 |
| Git提交质量 | 15 | 15 | 提交清晰规范 |
| Java编码规范 | 10 | 10 | 符合规范 |
| Mapper实现 | 0 | 30 | 未同步更新 |
| 功能完整性 | 5 | 15 | 严重不完整 |
| 文档和注释 | 10 | 10 | 注释清晰 |
| 总分 | 60 | 100 | 不及格 |
审查决定
❌ 需要修复后重新提交 (Needs Fixes)
理由:
- ❌ Critical问题: Mapper XML未同步更新,功能无法正常工作
- ❌ Critical问题: 无法实现按姓名搜索的业务需求
- ⚠️ 违反了"完整性原则":VO字段必须有对应的数据来源
后续步骤:
- ✅ 修复
CcdiStaffEnterpriseRelationMapper.xml - ✅ 更新
CcdiStaffEnterpriseRelationQueryDTO(如需支持搜索) - ✅ 添加字段注释说明关联关系
- ✅ 编写单元测试验证功能
- ✅ 重新提交审查
8. 参考资料
8.1 项目内参考实现
-
员工亲属关系模块 (正确实现):
- 文件:
ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffFmyRelationMapper.xml - 提交: 历史提交记录
- 特点: 完整实现personName字段的查询和映射
- 文件:
-
员工调动模块 (正确实现):
- 文件:
ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffTransferMapper.xml - 特点: 类似的staffName字段实现
- 文件:
8.2 数据库文档
- 文件:
doc/database-docs/ccdi_staff_enterprise_relation.csv - 文件:
doc/database-docs/ccdi_base_staff.csv(推断存在)
8.3 编码规范
- 若依框架编码规范
- MyBatis官方文档: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
- 项目CLAUDE.md中的Java编码规范
审查完成时间: 2026-02-11 下次审查: 修复完成后重新提交审查