Files
hzdyjs/docs/设计文档/database/menu-fix-duplicate.sql
T
2025-08-10 00:28:48 +08:00

442 lines
15 KiB
SQL
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.
# 代码调整记录 - 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
**🔄 状态**: 待重启服务验证