# 文件审批流程调试指南

## 问题现象
普通用户上传公共文件 → 管理员审批通过 → 文件仍显示在"个人文件"列表而非"制度文件"列表

## 调试步骤

### 步骤1：检查后端是否使用了最新代码

#### 方法A：查看日志输出
在后端控制台（终端/命令行）查找以下日志：

**上传时应出现：**
```
文件上传成功: fileName=test.docx, userId=5, deptId=null, isPublic=0, category=rule, auditStatus=0, path=...
```
注意：`category` 应该是 `rule`（不是 `personal`）

**审批通过时应出现：**
```
审核通过，文件分类已从 personal 更新为 rule: fileId=123
```
或者如果没有触发（因为已经是 rule），则不会出现此日志

#### 方法B：直接查看源码
打开文件并确认以下修改存在：

**文件位置：** `demo/demo/demo/src/main/java/top/tqx/demo_1/service/impl/FileServiceImpl.java`

**检查点1 - 第235-243行（determineFileCategory方法）：**
```java
private String determineFileCategory(Integer userType, Long targetDeptId, Boolean isPublic) {
    if (targetDeptId != null) {
        return "rule";
    }
    if (userType == 3 && Boolean.TRUE.equals(isPublic)) {  // ← 这行必须存在
        return "rule";
    }
    return "personal";
}
```

**检查点2 - 第143行（调用处）：**
```java
String fileCategory = determineFileCategory(userType, targetDeptId, isPublic);  // ← 必须传入isPublic参数
fileEntity.setFileCategory(fileCategory);
```

**检查点3 - 第595-598行（approveFile方法）：**
```java
if ("personal".equals(file.getFileCategory())) {
    file.setFileCategory("rule");  // ← 这段代码必须存在
    log.info("审核通过，文件分类已从 personal 更新为 rule: fileId={}", fileId);
}
```

---

### 步骤2：重新编译部署后端

如果上述代码不存在或不确定，请执行：

```bash
# 1. 进入后端项目目录
cd demo/demo/demo

# 2. 清理并重新编译（跳过测试以加快速度）
mvn clean compile

# 或完整打包
mvn clean package -DskipTests

# 3. 重启后端服务
# 方式A：如果在IDE中运行 → 点击重新启动按钮
# 方式B：如果是jar包运行 → 先停止旧进程，再启动新进程
```

**Windows停止进程：**
```bash
# 查找Java进程
netstat -ano | findstr :8080

# 结束进程（替换PID为实际进程ID）
taskkill /PID <PID> /F

# 重新启动
java -jar target/demo-1.0.0.jar
```

---

### 步骤3：数据库数据验证与修正

连接到MySQL数据库，执行以下查询：

#### 3.1 查看当前文件状态
```sql
-- 查看最近上传的10个文件及其分类
SELECT 
    id,
    file_name,
    file_category,
    is_public,
    audit_status,
    upload_user_id,
    create_time
FROM file 
ORDER BY create_time DESC 
LIMIT 10;
```

**预期结果：**
| 场景 | file_category | is_public | audit_status |
|------|--------------|-----------|--------------|
| 管理员上传公共文件 | rule | 1 | 1 |
| 管理员上传个人文件 | personal | 0 | 1 |
| 普通用户上传公共（待审） | rule | 0 | 0 |
| 普通用户上传公共（已审） | rule | 1 | 1 |
| 普通用户上传个人文件 | personal | 0 | 1 |

#### 3.2 识别问题数据
```sql
-- 查找异常数据：标记为公开但分类为个人的已审批文件
SELECT 
    id,
    file_name,
    file_category,
    is_public,
    audit_status,
    create_time
FROM file 
WHERE is_public = 1 
  AND file_category = 'personal' 
  AND audit_status = 1;
```

如果有结果返回，说明这些是**需要修正的历史数据**。

#### 3.3 修正历史数据
```sql
-- 备份先（可选但推荐）
CREATE TABLE file_backup_20260506 AS SELECT * FROM file;

-- 批量修正
UPDATE file 
SET file_category = 'rule',
    update_time = NOW()
WHERE is_public = 1 
  AND file_category = 'personal' 
  AND audit_status = 1;

-- 验证修正结果
SELECT COUNT(*) as corrected_count 
FROM file 
WHERE is_public = 1 
  AND file_category = 'rule' 
  AND audit_status = 1;
```

---

### 步骤4：前端刷新与测试

#### 4.1 清除缓存
- **Chrome/Edge:** `Ctrl + Shift + Delete` → 选择"缓存的图片和文件" → 清除
- **快捷键:** `Ctrl + Shift + R`（强制刷新）

#### 4.2 完整测试流程

**测试场景A：普通用户上传公共文件（全新测试）**
1. 使用普通用户账号登录（userType=3）
2. 点击"上传文件"
3. 选择一个新文件
4. **勾选"公开文件"选项**
5. 点击"上传"
6. 预期提示："文件已进入待审批状态"
7. 切换到管理员账号登录
8. 进入"审批管理"页面
9. 找到刚才上传的文件，点击"通过"
10. 预期提示："文件审批通过"
11. **切换回普通用户账号**
12. 查看"制度文件"标签页
13. ✅ **预期：应该能看到刚上传的文件**

**测试场景B：普通用户上传个人文件**
1-5步同上，但第4步选择"个人文件"
12. 查看"个人文件"标签页
13. ✅ **预期：应该在个人文件列表中看到该文件**

---

### 步骤5：实时监控日志（进阶调试）

如果上述步骤仍未解决问题，开启详细日志：

#### 5.1 修改日志级别
在 `application.yml` 或 `application.properties` 中添加：
```yaml
logging:
  level:
    top.tqx.demo_1.service.impl.FileServiceImpl: DEBUG
```

#### 5.2 关键日志监控点

**上传时关注：**
```
DEBUG [FileServiceImpl] 文件上传成功: fileName=xxx, ..., category=xxx, ...
```
确认 `category` 值是否正确

**审批时关注：**
```
INFO  [FileServiceImpl] 审核通过，文件分类已从 personal 更新为 rule: fileId=xxx
```
确认是否有此日志输出

**数据库查询时关注：**
在 `pageFiles()` 方法中添加临时日志：
```java
log.debug("查询文件列表 - 用户类型: {}, 文件总数: {}", userType, filePage.getTotal());
for (File f : filePage.getRecords()) {
    log.debug("  文件: ID={}, 名称={}, 分类={}, 是否公开={}", 
              f.getId(), f.getFileName(), f.getFileCategory(), f.getIsPublic());
}
```

---

## 常见问题FAQ

### Q1: 为什么我修改了代码但还是不生效？
**A:** 最可能的原因是后端服务没有重启。Java是编译型语言，修改源码后必须重新编译并重启服务才能生效。

### Q2: 数据库修正后还是看不到？
**A:** 可能是前端缓存。请强制刷新浏览器（Ctrl+Shift+R），或在开发者工具中禁用缓存。

### Q3: 新上传的文件正常，但旧的还是不对？
**A:** 这是正常的。旧数据需要手动执行SQL修正（参见步骤3.3）。新上传的文件会使用新的逻辑自动正确处理。

### Q4: 如何确认后端使用的是哪个版本的代码？
**A:** 在 `pom.xml` 中查看版本号，或在启动日志中找到类似：
```
Started DemoApplication in x.xxx seconds
```
确保是在你最后一次修改之后启动的。

### Q5: 审批通过了但文件路径没变？
**A:** 这是正常的。`moveFileToPublic()` 会移动物理文件并更新数据库中的路径字段。你可以检查：
```sql
SELECT file_path FROM file WHERE id = <文件ID>;
```
看路径是否从 `/pending/...` 变成了 `/public/...`

---

## 快速检查清单

- [ ] 后端代码已包含所有3个修复点（determineFileCategory、调用处、approveFile）
- [ ] 后端服务已重新编译并重启
- [ ] 数据库中无异常数据（is_public=1 且 file_category='personal'）
- [ ] 浏览器缓存已清除
- [ ] 使用全新的文件进行测试（非旧数据）
- [ ] 测试了普通用户+公共文件、普通用户+个人文件、管理员+公共文件、管理员+个人文件四种场景
- [ ] 后端日志显示正确的 category 值

全部勾选 ✅ 后，问题应该已经解决！
