268 lines
7.6 KiB
Markdown
268 lines
7.6 KiB
Markdown
# 文件审批流程调试指南
|
||
|
||
## 问题现象
|
||
普通用户上传公共文件 → 管理员审批通过 → 文件仍显示在"个人文件"列表而非"制度文件"列表
|
||
|
||
## 调试步骤
|
||
|
||
### 步骤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 值
|
||
|
||
全部勾选 ✅ 后,问题应该已经解决!
|