Files
ccdi/doc/reviews/2026-02-11-task-2-code-review.md
wkc 1cd87d2695 refactor: 重命名 ruoyi-ccdi 模块为 ruoyi-info-collection
- Maven 模块从 ruoyi-ccdi 重命名为 ruoyi-info-collection
- Java 包名从 com.ruoyi.ccdi 改为 com.ruoyi.info.collection
- MyBatis XML 命名空间同步更新
- 保留数据库表名、API URL、权限标识中的 ccdi 前缀
- 更新项目文档中的模块引用
2026-02-24 17:12:11 +08:00

12 KiB
Raw Blame History

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 查询完全未更新,导致:

  1. 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>
  1. 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>

修复建议:

  1. CcdiStaffEnterpriseRelationVOResult 的 ResultMap 中添加:
<result property="personName" column="person_name"/>
  1. 修改所有 SQL 查询语句,添加表关联:
FROM ccdi_staff_enterprise_relation r
LEFT JOIN ccdi_base_staff s ON r.person_id = s.id_card
  1. 在 SELECT 子句中添加:
s.name as person_name
  1. 支持按姓名搜索(在 <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类添加了字段但缺少以下说明

  1. personName 字段的数据来源:通过 person_id 关联 ccdi_base_staff.id_card 获取 ccdi_base_staff.name
  2. 这是一个计算字段(非持久化字段),仅用于查询展示
  3. 数据库表 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 - 添加单元测试

建议添加单元测试验证:

  1. person_idccdi_base_staff 表中存在时,能正确获取 person_name
  2. 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. 优先级 1: 更新 CcdiStaffEnterpriseRelationMapper.xml

    • 在 ResultMap 中添加 personName 映射
    • 在所有 SELECT 查询中添加 LEFT JOIN ccdi_base_staff
    • 在 SELECT 子句中添加 s.name as person_name
  2. 优先级 2: 更新 CcdiStaffEnterpriseRelationQueryDTO

    • 添加 personName 字段以支持姓名搜索

应该修复 (Important)

  1. ⚠️ 优先级 3: 添加字段注释说明
    • 说明 personName 是关联字段

可选修复 (Optional)

  1. 💡 优先级 4: 添加单元测试
  2. 💡 优先级 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)

理由:

  1. Critical问题: Mapper XML未同步更新功能无法正常工作
  2. Critical问题: 无法实现按姓名搜索的业务需求
  3. ⚠️ 违反了"完整性原则"VO字段必须有对应的数据来源

后续步骤:

  1. 修复 CcdiStaffEnterpriseRelationMapper.xml
  2. 更新 CcdiStaffEnterpriseRelationQueryDTO(如需支持搜索)
  3. 添加字段注释说明关联关系
  4. 编写单元测试验证功能
  5. 重新提交审查

8. 参考资料

8.1 项目内参考实现

  1. 员工亲属关系模块 (正确实现):

    • 文件: ruoyi-info-collection/src/main/resources/mapper/ccdi/CcdiStaffFmyRelationMapper.xml
    • 提交: 历史提交记录
    • 特点: 完整实现personName字段的查询和映射
  2. 员工调动模块 (正确实现):

    • 文件: ruoyi-info-collection/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 编码规范


审查完成时间: 2026-02-11 下次审查: 修复完成后重新提交审查