7.7 KiB
7.7 KiB
员工实体关系模块代码审查报告
审查时间
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-option的value使用了字符串"1"和"0"- 但后端返回的
status是数字类型1和0 - 类型不匹配导致无法匹配,显示原始数字值
修复方案:
<!-- 正确代码 -->
<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
- 代码可维护性差
- 违反类型安全原则
建议: 统一使用数字类型 1 和 0
🟠 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个
核心问题
- 类型不匹配导致状态反显失败(用户报告的bug)
- 代码逻辑不一致导致维护困难
- 缺少统一规范导致代码质量参差不齐
改进建议
- 建立《前端开发规范手册》
- 建立《后端开发规范手册》
- 引入代码审查流程
- 添加单元测试覆盖
- 使用 ESLint 和 SonarQube 等工具自动检查代码质量
审查人
Claude Code
审查日期
2026-02-09