| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- # 代码调整记录 - 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
- **🔄 状态**: 待重启服务验证
|