442 lines
15 KiB
SQL
442 lines
15 KiB
SQL
# 代码调整记录 - 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
|
||
<!-- 修改前 -->
|
||
<el-select v-model="queryParams.budgetYear" placeholder="请选择预算年度" clearable style="width: 200px">
|
||
<el-option label="全部年度" value="" />
|
||
<el-option label="2024年" value="2024" />
|
||
<el-option label="2025年" value="2025" />
|
||
<el-option label="2026年" value="2026" />
|
||
</el-select>
|
||
|
||
<!-- 修改后 -->
|
||
<el-select v-model="queryParams.budgetYear" placeholder="请选择预算年度" clearable style="width: 200px">
|
||
<el-option label="全部年度" value="" />
|
||
<el-option label="2025年" value="2025" />
|
||
<el-option label="2026年" value="2026" />
|
||
<el-option label="2027年" value="2027" />
|
||
<el-option label="2028年" value="2028" />
|
||
</el-select>
|
||
```
|
||
|
||
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
|
||
**🔄 状态**: 待重启服务验证 |