191 lines
4.8 KiB
Markdown
191 lines
4.8 KiB
Markdown
# 员工实体关系状态字段修复报告
|
||
|
||
## 问题描述
|
||
|
||
员工实体关系新增提交后存在两个问题:
|
||
|
||
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),就不会覆盖**
|
||
|
||
**根本原因:**
|
||
|
||
- 虽然前端初始化了 `status: '1'`,但可能由于某些原因(浏览器缓存、代码版本不一致等),实际运行时可能发送了 `status: 0`
|
||
- 后端的默认值逻辑只在 `null` 时生效,无法防御这种情况
|
||
|
||
### 问题2:前端字典映射错误
|
||
|
||
**数据库字典对比:**
|
||
|
||
| 字典类型 | dict_value | dict_label | 说明 |
|
||
|----------------------|------------|------------|----------|
|
||
| sys_normal_disable | 0 | 正常 | 若依系统通用字典 |
|
||
| sys_normal_disable | 1 | 停用 | 若依系统通用字典 |
|
||
| ccdi_relation_status | 0 | 无效 | CCDI业务字典 |
|
||
| ccdi_relation_status | 1 | 有效 | CCDI业务字典 |
|
||
|
||
**问题:**
|
||
|
||
- 前端使用了 `sys_normal_disable` 字典(0=正常,1=停用)
|
||
- 而业务定义是 0=无效,1=有效
|
||
- **完全相反!**
|
||
|
||
## 修复方案
|
||
|
||
### 修复1:后端强制设置默认状态
|
||
|
||
**修改文件:
|
||
** `ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffEnterpriseRelationServiceImpl.java`
|
||
|
||
**修改内容:**
|
||
|
||
```java
|
||
// 修改前 (第118-120行):
|
||
if (relation.getStatus() == null) {
|
||
relation.setStatus(1);
|
||
}
|
||
|
||
// 修改后:
|
||
// 新增时强制设置状态为有效
|
||
relation.setStatus(1);
|
||
```
|
||
|
||
**修复逻辑:**
|
||
|
||
- 强制将新增记录的 `status` 设置为 `1`(有效)
|
||
- 即使前端传递了其他值,也会被覆盖为有效状态
|
||
- 编辑功能不受影响,仍可正常修改状态
|
||
|
||
### 修复2:前端使用正确的字典
|
||
|
||
**修改文件:** `ruoyi-ui/src/views/ccdiStaffEnterpriseRelation/index.vue`
|
||
|
||
**修改内容:**
|
||
|
||
1. **第354行 - 字典声明:**
|
||
|
||
```javascript
|
||
// 修改前:
|
||
dicts: ['sys_normal_disable', 'ccdi_data_source'],
|
||
|
||
// 修改后:
|
||
dicts: ['ccdi_relation_status', 'ccdi_data_source'],
|
||
```
|
||
|
||
2. **第98行 - 列表展示:**
|
||
|
||
```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行 - 详情展示:**
|
||
|
||
```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字段**
|
||
|
||
- 预期结果:status = 1 (有效)
|
||
- 实际结果:✅ status = 1
|
||
|
||
**测试用例2:传status=0**
|
||
|
||
- 预期结果:status = 1 (有效,被强制覆盖)
|
||
- 实际结果:✅ status = 1
|
||
|
||
### 前端验证
|
||
|
||
**刷新页面后验证:**
|
||
|
||
- ✅ 状态字段显示为"有效"(绿色标签)
|
||
- ✅ 列表展示正确
|
||
- ✅ 详情展示正确
|
||
|
||
## 影响范围
|
||
|
||
### 修改文件清单
|
||
|
||
1. `ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffEnterpriseRelationServiceImpl.java`
|
||
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
|