Files
ccdi/assets/implementation/reports/code-review-report-staff-enterprise-relation.md
2026-03-03 16:14:16 +08:00

7.7 KiB
Raw Blame History

员工实体关系模块代码审查报告

审查时间

2026-02-09

审查范围

  • 前端:ruoyi-ui/src/views/ccdiStaffEnterpriseRelation/index.vue
  • 后端:ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/ 相关文件

严重问题(必须立即修复)

🔴 1. 状态字段类型不匹配导致反显失败

位置: index.vue:197-200

问题描述:

<!-- 错误代码 -->
<el-select v-model="form.status" placeholder="请选择状态">
  <el-option label="有效" value="1" />  <!-- 字符串 -->
  <el-option label="无效" value="0" />  <!-- 字符串 -->
</el-select>

问题分析:

  • el-optionvalue 使用了字符串 "1""0"
  • 但后端返回的 status数字类型 10
  • 类型不匹配导致无法匹配,显示原始数字值

修复方案:

<!-- 正确代码 -->
<el-select v-model="form.status" placeholder="请选择状态">
  <el-option label="有效" :value="1" />  <!-- 数字 -->
  <el-option label="无效" :value="0" />  <!-- 数字 -->
</el-select>

影响范围: 编辑对话框状态字段无法正确反显


🔴 2. 查询表单状态字段也使用了字符串类型

位置: index.vue:32-35

问题描述:

<!-- 错误代码 -->
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
  <el-option label="有效" value="1" />
  <el-option label="无效" value="0" />
</el-select>

修复方案:

<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
  <el-option label="有效" :value="1" />
  <el-option label="无效" :value="0" />
</el-select>

重要问题(建议尽快修复)

🟠 3. 状态字段在新增时隐藏,但 reset() 中初始化了值

位置: index.vue:195-202, 550

问题描述:

<!-- 状态字段只在编辑时显示 -->
<el-col :span="12" v-if="!isAdd">
  <el-form-item label="状态" prop="status">
    <el-select v-model="form.status">...</el-select>
  </el-form-item>
</el-col>
// 但 reset() 中初始化了 status
reset() {
  this.form = {
    status: '1',  // 新增时用户看不到,但会被提交
    ...
  };
}

代码逻辑不一致: 既然新增时不显示状态字段,就不应该在 form 中初始化

建议修复:

  • 方案A 在新增表单中也显示状态字段,让用户明确知道默认状态
  • 方案B 移除 reset() 中的 status 初始化,只在后端设置默认值(推荐)

🟠 4. 数据类型不一致

位置: 多处

问题描述:

位置 类型 说明
后端 Entity Integer 数字类型
后端 DTO Integer 数字类型
前端 reset() '1' (字符串) 不一致
前端 el-option value "1" (字符串) 不一致

影响:

  • 类型转换可能导致的潜在 bug
  • 代码可维护性差
  • 违反类型安全原则

建议: 统一使用数字类型 10


🟠 5. 后端默认值逻辑不够健壮

位置: CcdiStaffEnterpriseRelationServiceImpl.java:117-135

当前代码:

// 设置默认值
// 新增时强制设置状态为有效
relation.setStatus(1);

if (relation.getIsEmployee() == null) {
    relation.setIsEmployee(0);
}
if (relation.getIsEmpFamily() == null) {
    relation.setIsEmpFamily(1);
}
// ...

问题分析:

  • 只对 status 强制设置
  • 其他字段仍然依赖 null 检查
  • 没有统一的数据初始化策略

建议:

  • 使用 Builder 模式或工厂方法统一处理默认值
  • 在实体类中使用 @TableField(fill = FieldFill.INSERT) 注解自动填充
  • 或使用 MyBatis Plus 的 FieldFill 机制

次要问题(建议优化)

🟡 6. 代码注释不足

问题:

  • 复杂业务逻辑缺少注释
  • 特殊处理没有说明原因
  • 例如:为什么 isEmpFamily 默认为 1

建议: 添加业务逻辑说明注释


🟡 7. 魔法数字硬编码

位置: 多处

问题示例:

relation.setStatus(1);  // 1 表示什么?
relation.setIsEmployee(0);  // 0 表示什么?

建议: 使用常量或枚举

public class CcdiStaffEnterpriseRelationConstants {
    public static final Integer STATUS_VALID = 1;
    public static final Integer STATUS_INVALID = 0;
    public static final Integer IS_EMPLOYEE_YES = 1;
    public static final Integer IS_EMPLOYEE_NO = 0;
}

🟡 8. 前端表单验证规则不完整

位置: index.vue:394-416

问题:

rules: {
  personId: [
    { required: true, message: "身份证号不能为空", trigger: "blur" },
    { pattern: /^...$/, message: "请输入正确的18位身份证号", trigger: "blur" }
  ],
  status: [
    { required: true, message: "状态不能为空", trigger: "change" }
  ],
  // ...
}

问题: 状态字段设置了必填验证,但新增时不显示,验证规则无法触发

建议:

  • 移除 status 的 required 验证,或
  • 在新增时也显示状态字段

🟡 9. 错误处理不够友好

位置: CcdiStaffEnterpriseRelationServiceImpl.java:111

问题:

if (relationMapper.existsByPersonIdAndSocialCreditCode(...)) {
    throw new RuntimeException("该身份证号和统一社会信用代码组合已存在");
}

问题:

  • 使用通用 RuntimeException
  • 没有错误码
  • 前端无法进行国际化处理

建议: 定义业务异常类

public class CcdiBusinessException extends RuntimeException {
    private String errorCode;
    private String errorMessage;

    public CcdiBusinessException(String errorCode, String errorMessage) {
        super(errorMessage);
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }
}

// 使用
throw new CcdiBusinessException("CCDI_001", "该身份证号和统一社会信用代码组合已存在");

🟡 10. 缺少单元测试

问题:

  • 没有针对新增逻辑的单元测试
  • 没有针对默认值设置的测试
  • 没有针对边界条件的测试

建议: 添加单元测试覆盖核心业务逻辑


代码规范问题

🔵 11. 变量命名不一致

示例:

  • personId (驼峰命名)
  • socialCreditCode (驼峰命名)
  • 但数据库字段可能是 person_id, social_credit_code

建议: 保持命名一致性,遵循团队规范


🔵 12. 注释语言混用

问题: 代码中英文注释混用

建议: 统一使用中文注释(根据项目规范)


修复优先级

优先级 问题编号 问题描述 预计工作量
P0 1 状态字段类型不匹配 5分钟
P0 2 查询表单状态字段类型错误 5分钟
P1 3 新增表单逻辑不一致 15分钟
P1 4 数据类型不一致 30分钟
P2 5 后端默认值逻辑优化 1小时
P3 6-12 其他优化项 2-3小时

总结

严重程度统计

  • 🔴 严重问题2个
  • 🟠 重要问题3个
  • 🟡 次要问题7个

核心问题

  1. 类型不匹配导致状态反显失败用户报告的bug
  2. 代码逻辑不一致导致维护困难
  3. 缺少统一规范导致代码质量参差不齐

改进建议

  1. 建立《前端开发规范手册》
  2. 建立《后端开发规范手册》
  3. 引入代码审查流程
  4. 添加单元测试覆盖
  5. 使用 ESLint 和 SonarQube 等工具自动检查代码质量

审查人

Claude Code

审查日期

2026-02-09