# 代码调整记录 - 2025-01-18 - wuzhen
## 2025-01-18 17:35:00 - 优化预算申报统计分析模块初始化逻辑
### 🎯 优化目标
优化预算申报统计分析模块的初始化逻辑,界面打开时默认查询所有年份的申报数据,并将预算年度选项从2025年开始。
### 🔍 原有实现问题
**原逻辑**:
1. ❌ 界面打开时默认查询2024年的数据
2. ❌ 年度选择下拉框包含2024年选项
3. ❌ 用户需要手动选择"全部年度"才能看到完整数据
**问题影响**:
- 用户体验不佳,需要额外操作才能看到全量数据
- 年度选项包含过时的2024年,不符合当前业务需求
### 🚀 优化方案
**新逻辑**:
1. ✅ 界面打开时默认查询所有年份的申报数据(budgetYear = '')
2. ✅ 年度选择从2025年开始,移除2024年选项
3. ✅ 增加更多年份选项(2025-2028年)
4. ✅ 重置功能保持一致,重置后也是查询所有年份
### 🔧 技术实现
#### 修改文件
**文件路径**:`web/src/views/cw/statistics/index.vue`
#### 核心变更内容
1. **修改默认查询参数**(第244行)
```javascript
// 修改前
queryParams: {
pageNum: 1,
pageSize: 10,
budgetYear: '2024' // 设置默认年度为2024
},
// 修改后
queryParams: {
pageNum: 1,
pageSize: 10,
budgetYear: '' // 设置默认为空,查询所有年份数据
},
```
2. **更新年度选择选项**(第7-12行)
```html
```
3. **重置逻辑验证**(第438-440行)
```javascript
/** 重置按钮操作 */
resetQuery() {
this.queryParams.budgetYear = '' // ✅ 重置为空,查询所有年份
this.handleQuery()
}
```
### 📊 预期效果
- ✅ **用户体验优化**:界面打开即可看到所有年份的完整统计数据
- ✅ **数据展示完整**:默认展示全量数据,避免数据遗漏
- ✅ **年度选项更新**:移除过时的2024年,从2025年开始
- ✅ **操作一致性**:重置功能与初始化逻辑保持一致
- ✅ **前瞻性设计**:增加未来年份选项,便于长期使用
### 🚨 后续操作要求
1. **无需重新编译**:仅前端静态资源修改,刷新页面即可生效
2. **功能测试验证**:
- 打开预算申报统计分析页面,验证默认显示所有年份数据
- 测试年度筛选功能,确认2025-2028年选项正常
- 测试重置功能,确认重置后显示全部年度数据
- 验证各个统计图表和数据表格正常加载
### 💡 技术要点
- **前端状态管理**:通过修改data中的默认值实现初始化优化
- **用户界面优化**:年度选项从当前年度开始,提升用户体验
- **数据查询逻辑**:空字符串作为查询参数时,后端返回所有年份数据
- **一致性保证**:初始化、重置、查询逻辑保持统一
---
## 2025-01-18 17:20:00 - 优化财务审批院领导选择逻辑(基于权限角色)
### 🎯 优化目标
将财务审批模块中选择院领导的逻辑从"按部门查找"优化为"按权限角色查找",确保选择的用户具有实际的院领导审批权限。
### 🔍 原有实现问题
**原逻辑**:查询部门名称包含"院领导"的部门,返回该部门下的所有正常状态用户
**问题分析**:
1. ❌ 依赖部门名称,不够灵活
2. ❌ 可能包含非审批人员(部门内其他用户)
3. ❌ 没有权限验证,可能选择到无权限用户
4. ❌ 不符合RBAC权限模型设计理念
### 🚀 优化方案
**新逻辑**:基于权限角色查找具有 `cw:approval:leader` 权限的所有用户
**优势**:
- ✅ 权限导向,确保选择的用户有审批权限
- ✅ 不依赖部门结构,更灵活
- ✅ 符合RBAC权限模型
- ✅ 便于后续权限管理
- ✅ 保留部门查询作为备选方案
### 🔧 技术实现
#### 修改文件
**文件路径**:`backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java`
**修改方法**:`getAvailableApprovers(Long applicationId)` (第1126行)
#### 核心变更内容
1. **添加JdbcTemplate依赖**
```java
@Autowired
private JdbcTemplate jdbcTemplate;
```
2. **权限查询SQL**
```sql
SELECT DISTINCT
u.user_id, u.user_name, u.nick_name,
COALESCE(d.dept_name, '未分配部门') as dept_name,
COALESCE(d.dept_id, 0) as dept_id
FROM sys_user u
LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
INNER JOIN sys_user_role ur ON u.user_id = ur.user_id
INNER JOIN sys_role r ON ur.role_id = r.role_id
INNER JOIN sys_role_menu rm ON r.role_id = rm.role_id
INNER JOIN sys_menu m ON rm.menu_id = m.menu_id
WHERE m.perms = 'cw:approval:leader'
AND u.status = '0'
AND u.del_flag = '0'
AND r.status = '0'
ORDER BY u.user_name
```
3. **双重保障机制**
- **主方案**:基于权限查询具有 `cw:approval:leader` 权限的用户
- **备选方案**:如果权限查询无结果,使用原有的部门查询逻辑
#### 实现逻辑流程
```
1. 执行权限查询SQL → 查找具有cw:approval:leader权限的用户
2. 转换查询结果 → 组装返回Map格式数据
3. 结果检查 → 如果权限查询为空,启用部门查询备选方案
4. 返回结果 → 具有审批权限的院领导列表
```
### 📊 预期效果
- ✅ **精确权限控制**:只返回真正具有院领导审批权限的用户
- ✅ **系统一致性**:与RBAC权限模型保持一致
- ✅ **灵活性提升**:不依赖特定部门名称
- ✅ **向后兼容**:保留部门查询作为备选,确保系统稳定
- ✅ **日志完善**:详细的查询过程日志,便于问题排查
### 🚨 后续操作要求
1. **重新编译后端服务**:`mvn clean compile`
2. **重启Spring Boot应用**
3. **功能测试验证**:
- 财务人员审批时选择院领导功能
- 验证只显示具有 `cw:approval:leader` 权限的用户
- 测试备选方案是否正常工作
### 💡 技术要点
- **权限查询**:通过多表关联查询用户权限
- **NULL值处理**:使用COALESCE处理部门信息为空的情况
- **异常处理**:查询失败时返回空列表,不影响主流程
- **日志记录**:完整的查询过程日志,便于调试和监控
---
## 2025-01-18 16:45:00 - 修复财务和院领导审批"我已审批"查询问题
### 🚨 问题描述
财务审批和院领导审批模块的"我已审批"功能无法查询到已审批的记录,用户反馈看不到自己审批过的内容。
### 🔍 问题分析
通过深度分析发现两个核心问题:
1. **财务已审批查询状态不匹配**:
- 审批时更新状态为:`approved/rejected`
- 查询时使用状态为:`completed/rejected`
- 导致状态不匹配,查询不到记录
2. **院领导已审批查询状态不匹配**:
- 审批时更新状态为:`approved/rejected`
- 查询时使用状态为:`complete`
- 导致状态不匹配,查询不到记录
### 🔧 修复方案
**方案一:修正查询状态(已采用)**
#### 修复内容1:财务已审批查询
**文件**:`backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/CwApprovalRecordMapper.xml`
**位置**:第146行
```xml
and ar.node_status in ('completed', 'rejected')
and ar.node_status in ('approved', 'rejected')
```
#### 修复内容2:院领导已审批查询
**文件**:`backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java`
**位置**:第467行
```java
// 修复前
return baseMapper.selectByApproverAndNode(currentUserId, "leader_approve", "complete");
// 修复后
return baseMapper.selectByApproverAndNode(currentUserId, "leader_approve", "approved");
```
### 📊 修复效果预期
- ✅ 财务人员能在"财务已审批"中看到自己审批的记录
- ✅ 院领导能在"院领导已审批"中看到自己审批的记录
- ✅ 通用"我已审批"功能正常工作(之前已修复approverId问题)
- ✅ 三个查询功能相互独立,互不影响
### 🚨 后续操作要求
1. **重新编译后端服务**:`mvn clean compile`
2. **重启Spring Boot应用**
3. **功能测试验证**:用财务和院领导账号分别测试审批和查询功能
---
## 📋 本次变更概述
**变更时间**: 2025-01-18 15:30:00
**变更人员**: wuzhen
**变更类型**: 🔧 审批流程状态统一修复
**影响范围**: 财务预算申报审批流程
## 🎯 问题背景
发现审批流程中存在**状态不统一**和**逻辑错误**问题:
### 原有问题
1. **节点状态不统一**:
- 部门审批通过:`"approved"`
- 财务审批通过:`"completed"`
- 分管领导审批通过:`"completed"`
2. **分管领导审批逻辑错误**:
- 审批通过后状态设为 `"finance_approving"`
- 应该是最终完成状态 `"approved"`
3. **"我已审批"查询逻辑不准确**:
- 使用排除法 `.notIn("waiting", "pending")`
- 可能包含错误状态
## 🔧 修改内容
### 1. 统一财务审批节点状态
**文件**: `CwApprovalRecordServiceImpl.java`
**位置**: 第1302行
**修改**: `"completed"` → `"approved"`
```java
// 修改前
updateRecord.setNodeStatus("approve".equals(approveAction) ? "completed" : "rejected");
// 修改后
updateRecord.setNodeStatus("approve".equals(approveAction) ? "approved" : "rejected");
```
### 2. 统一分管领导审批节点状态
**文件**: `CwApprovalRecordServiceImpl.java`
**位置**: 第1202行
**修改**: `"completed"` → `"approved"`
```java
// 修改前
updateRecord.setNodeStatus("approve".equals(approveAction) ? "completed" : "rejected");
// 修改后
updateRecord.setNodeStatus("approve".equals(approveAction) ? "approved" : "rejected");
```
### 3. 修正分管领导审批的申报状态逻辑
**文件**: `CwApprovalRecordServiceImpl.java`
**位置**: 第1224-1229行
**修改**: `"finance_approving"` → `"approved"`
```java
// 修改前
if ("approve".equals(approveAction)) {
// 审批通过,状态改为财务审批中
newStatus = "finance_approving";
log.info("✅ 分管领导审批通过,提交财务审批:applicationId={}", applicationId);
// TODO: 这里可以添加创建财务审批记录的逻辑
// 修改后
if ("approve".equals(approveAction)) {
// 分管领导审批通过,整个审批流程完成
newStatus = "approved";
log.info("✅ 分管领导审批通过,整个审批流程完成:applicationId={}", applicationId);
```
### 4. 修正"我已审批"查询逻辑
**文件**: `CwApprovalRecordServiceImpl.java`
**位置**: 第381行
**修改**: 排除法 → 精确匹配法
```java
// 修改前
queryWrapper.eq(CwApprovalRecord::getApproverId, currentUserId)
.notIn(CwApprovalRecord::getNodeStatus, Arrays.asList("waiting", "pending"))
.orderByDesc(CwApprovalRecord::getEndTime);
// 修改后
queryWrapper.eq(CwApprovalRecord::getApproverId, currentUserId)
.in(CwApprovalRecord::getNodeStatus, Arrays.asList("approved", "rejected", "returned"))
.orderByDesc(CwApprovalRecord::getEndTime);
```
## 📊 修改后的状态体系
### 双层状态管理
1. **申报级别状态** (`CwProjectApplication.approval_status`):
- `"approved"` = 整个流程完成 ✅
- `"approving"` = 审批进行中 ⏳
- `"rejected"` = 审批被拒绝 ❌
- `"returned"` = 被退回修改 🔄
2. **审批节点状态** (`CwApprovalRecord.node_status`):
- `"approved"` = 节点通过(统一标准)
- `"rejected"` = 节点拒绝
- `"returned"` = 节点退回
- `"waiting"` = 等待审批
### 正确的流程逻辑
```
提交申报 → approval_status = "submitted"
↓
部门审批 → node_status = "approved" + approval_status = "approving"
↓
财务审批 → node_status = "approved" + approval_status = "approving"
↓
分管领导审批 → node_status = "approved" + approval_status = "approved" ✅最终完成
```
## 🎯 预期效果
1. **状态统一**:所有审批节点通过状态统一为 `"approved"`
2. **流程正确**:分管领导审批通过后,整个流程完成
3. **用户体验**:通过 `approval_status` 清晰知道审批进度
4. **功能修复**:"我已审批"功能能正确显示审批记录
## ⚠️ 注意事项
1. **需要重新编译和启动服务**以生效
2. **现有数据兼容性**:历史数据中的 `"completed"` 状态需要考虑兼容
3. **前端显示**:确保前端能正确显示新的状态逻辑
4. **测试验证**:需要完整测试审批流程的各个环节
## 📝 后续工作
1. 重启后端服务
2. 测试完整的审批流程
3. 验证"我已审批"功能
4. 检查前端状态显示是否正确
5. 考虑是否需要数据迁移脚本处理历史数据
---
## 🔧 财务审批"我已审批"功能修复 - 2025-01-18 22:30:00
### 🚨 **问题描述**
- **问题现象**: 财务审批通过后,该申请在"我已审批"列表中看不到
- **具体案例**: YS202508049627申请财务审批通过后,在财务人员的"我已审批"中不显示
- **影响范围**: 所有财务审批通过的记录都无法在"我已审批"中查看
### 🔍 **根本原因**
财务审批方法(`financeApproval`)中缺少关键的`approverId`字段更新:
**问题代码**:
```java
// 财务审批时只更新了状态,但没有更新实际审批人ID
updateRecord.setNodeStatus("approved");
updateRecord.setApproveAction("approve");
// ❌ 缺少:updateRecord.setApproverId(currentUserId);
```
**"我已审批"查询逻辑**:
```java
// 根据approverId查询,如果approverId不匹配就查不到
queryWrapper.eq(CwApprovalRecord::getApproverId, currentUserId)
```
### ✅ **修复方案**
在`CwApprovalRecordServiceImpl.financeApproval()`方法中添加缺失的审批人信息更新:
```java
// 🔧 修复:更新实际审批人信息(解决"我已审批"查询不到的问题)
updateRecord.setApproverId(currentUserId);
// 更新审批人姓名(保持数据一致性)
SysUserVo currentUser = sysUserService.selectUserById(currentUserId);
if (currentUser != null) {
updateRecord.setApproverName(currentUser.getNickName());
}
```
### 📁 **修改文件**
- `backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java`
- 修改位置:第1304行后
- 修改内容:添加approverId和approverName字段更新
### 🎯 **预期效果**
修复后:
- ✅ 财务审批通过的记录能在"我已审批"中正确显示
- ✅ 显示正确的审批人信息
- ✅ 与分管领导审批记录保持一致的数据结构
- ✅ 历史数据需要手动修复(如果需要)
### 🔄 **后续操作**
1. 重启后端服务
2. 测试财务审批功能
3. 验证"我已审批"显示是否正常
---
**✅ 修改完成时间**: 2025-01-18 15:45:00
**🔄 状态**: 待重启服务验证