Files
ccdi/assets/implementation/reports/staff-enterprise-relation-status-fix-report.md

191 lines
4.8 KiB
Markdown
Raw Normal View History

2026-02-09 21:27:20 +08:00
# 员工实体关系状态字段修复报告
## 问题描述
员工实体关系新增提交后存在两个问题:
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
1. 新增时默认状态变成"停用"(0),应该是"有效"(1)
2. 前端展示时状态1显示为"无效"0显示为"有效",显示错误
## 根因分析
### 问题1新增默认值错误
**数据流追踪:**
1. **前端表单初始化** (index.vue:543-555):
```javascript
reset() {
this.form = {
status: '1', // 初始化为字符串 '1'
...
};
}
```
2. **关键发现** (index.vue:195-202):
```vue
<el-col :span="12" v-if="!isAdd">
<el-form-item label="状态" prop="status">
<el-select v-model="form.status">
<el-option label="有效" value="1" />
<el-option label="无效" value="0" />
</el-select>
</el-form-item>
</el-col>
```
**状态字段只在编辑时显示 (`v-if="!isAdd"`),新增时隐藏!**
3. **后端处理逻辑** (CcdiStaffEnterpriseRelationServiceImpl.java:118-120):
```java
if (relation.getStatus() == null) {
relation.setStatus(1);
}
```
**只在status为null时设置默认值如果前端传了值(即使是0),就不会覆盖**
**根本原因:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
- 虽然前端初始化了 `status: '1'`,但可能由于某些原因(浏览器缓存、代码版本不一致等),实际运行时可能发送了 `status: 0`
- 后端的默认值逻辑只在 `null` 时生效,无法防御这种情况
### 问题2前端字典映射错误
**数据库字典对比:**
2026-03-03 16:14:16 +08:00
| 字典类型 | dict_value | dict_label | 说明 |
|----------------------|------------|------------|----------|
| sys_normal_disable | 0 | 正常 | 若依系统通用字典 |
| sys_normal_disable | 1 | 停用 | 若依系统通用字典 |
| ccdi_relation_status | 0 | 无效 | CCDI业务字典 |
| ccdi_relation_status | 1 | 有效 | CCDI业务字典 |
2026-02-09 21:27:20 +08:00
**问题:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
- 前端使用了 `sys_normal_disable` 字典0=正常1=停用)
- 而业务定义是 0=无效1=有效
- **完全相反!**
## 修复方案
### 修复1后端强制设置默认状态
2026-03-03 16:14:16 +08:00
**修改文件:
** `ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffEnterpriseRelationServiceImpl.java`
2026-02-09 21:27:20 +08:00
**修改内容:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
```java
// 修改前 (第118-120行):
if (relation.getStatus() == null) {
relation.setStatus(1);
}
// 修改后:
// 新增时强制设置状态为有效
relation.setStatus(1);
```
**修复逻辑:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
- 强制将新增记录的 `status` 设置为 `1`(有效)
- 即使前端传递了其他值,也会被覆盖为有效状态
- 编辑功能不受影响,仍可正常修改状态
### 修复2前端使用正确的字典
**修改文件:** `ruoyi-ui/src/views/ccdiStaffEnterpriseRelation/index.vue`
**修改内容:**
1. **第354行 - 字典声明:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
```javascript
// 修改前:
dicts: ['sys_normal_disable', 'ccdi_data_source'],
// 修改后:
dicts: ['ccdi_relation_status', 'ccdi_data_source'],
```
2. **第98行 - 列表展示:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
```vue
<!-- 修改前: -->
<dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
<!-- 修改后: -->
<dict-tag :options="dict.type.ccdi_relation_status" :value="scope.row.status"/>
```
3. **第228行 - 详情展示:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
```vue
<!-- 修改前: -->
<dict-tag :options="dict.type.sys_normal_disable" :value="relationDetail.status"/>
<!-- 修改后: -->
<dict-tag :options="dict.type.ccdi_relation_status" :value="relationDetail.status"/>
```
## 验证结果
### 后端验证
使用测试脚本 `doc/implementation/test_staff_enterprise_relation_status_fix.bat` 进行验证:
**测试用例1不传status字段**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
- 预期结果status = 1 (有效)
- 实际结果:✅ status = 1
**测试用例2传status=0**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
- 预期结果status = 1 (有效,被强制覆盖)
- 实际结果:✅ status = 1
### 前端验证
**刷新页面后验证:**
2026-03-03 16:14:16 +08:00
2026-02-09 21:27:20 +08:00
- ✅ 状态字段显示为"有效"(绿色标签)
- ✅ 列表展示正确
- ✅ 详情展示正确
## 影响范围
### 修改文件清单
1. `ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffEnterpriseRelationServiceImpl.java`
2026-02-09 21:27:20 +08:00
2. `ruoyi-ui/src/views/ccdiStaffEnterpriseRelation/index.vue`
### 数据库变更
无数据库变更,使用已存在的 `ccdi_relation_status` 字典。
## 部署说明
### 后端部署
1. 重新编译后端项目
2. 重启后端服务
### 前端部署
1. 重新构建前端项目:`npm run build:prod`
2. 刷新浏览器缓存Ctrl+F5
## 注意事项
1. **编辑功能不受影响**:编辑时仍可正常修改状态字段
2. **导入功能不受影响**:批量导入时也会使用新的默认值逻辑
3. **历史数据不受影响**:修改只影响新增操作,已有数据保持不变
## 修复时间
2026-02-09
## 修复人
Claude Code