Files
aue/调试指南-文件审批流程.md
2026-06-03 13:16:30 +08:00

268 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 文件审批流程调试指南
## 问题现象
普通用户上传公共文件 → 管理员审批通过 → 文件仍显示在"个人文件"列表而非"制度文件"列表
## 调试步骤
### 步骤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 值
全部勾选 ✅ 后,问题应该已经解决!