menu-fix-duplicate.sql 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. # 代码调整记录 - 2025-01-18 - wuzhen
  2. ## 2025-01-18 17:35:00 - 优化预算申报统计分析模块初始化逻辑
  3. ### 🎯 优化目标
  4. 优化预算申报统计分析模块的初始化逻辑,界面打开时默认查询所有年份的申报数据,并将预算年度选项从2025年开始。
  5. ### 🔍 原有实现问题
  6. **原逻辑**:
  7. 1. ❌ 界面打开时默认查询2024年的数据
  8. 2. ❌ 年度选择下拉框包含2024年选项
  9. 3. ❌ 用户需要手动选择"全部年度"才能看到完整数据
  10. **问题影响**:
  11. - 用户体验不佳,需要额外操作才能看到全量数据
  12. - 年度选项包含过时的2024年,不符合当前业务需求
  13. ### 🚀 优化方案
  14. **新逻辑**:
  15. 1. ✅ 界面打开时默认查询所有年份的申报数据(budgetYear = '')
  16. 2. ✅ 年度选择从2025年开始,移除2024年选项
  17. 3. ✅ 增加更多年份选项(2025-2028年)
  18. 4. ✅ 重置功能保持一致,重置后也是查询所有年份
  19. ### 🔧 技术实现
  20. #### 修改文件
  21. **文件路径**:`web/src/views/cw/statistics/index.vue`
  22. #### 核心变更内容
  23. 1. **修改默认查询参数**(第244行)
  24. ```javascript
  25. // 修改前
  26. queryParams: {
  27. pageNum: 1,
  28. pageSize: 10,
  29. budgetYear: '2024' // 设置默认年度为2024
  30. },
  31. // 修改后
  32. queryParams: {
  33. pageNum: 1,
  34. pageSize: 10,
  35. budgetYear: '' // 设置默认为空,查询所有年份数据
  36. },
  37. ```
  38. 2. **更新年度选择选项**(第7-12行)
  39. ```html
  40. <!-- 修改前 -->
  41. <el-select v-model="queryParams.budgetYear" placeholder="请选择预算年度" clearable style="width: 200px">
  42. <el-option label="全部年度" value="" />
  43. <el-option label="2024年" value="2024" />
  44. <el-option label="2025年" value="2025" />
  45. <el-option label="2026年" value="2026" />
  46. </el-select>
  47. <!-- 修改后 -->
  48. <el-select v-model="queryParams.budgetYear" placeholder="请选择预算年度" clearable style="width: 200px">
  49. <el-option label="全部年度" value="" />
  50. <el-option label="2025年" value="2025" />
  51. <el-option label="2026年" value="2026" />
  52. <el-option label="2027年" value="2027" />
  53. <el-option label="2028年" value="2028" />
  54. </el-select>
  55. ```
  56. 3. **重置逻辑验证**(第438-440行)
  57. ```javascript
  58. /** 重置按钮操作 */
  59. resetQuery() {
  60. this.queryParams.budgetYear = '' // ✅ 重置为空,查询所有年份
  61. this.handleQuery()
  62. }
  63. ```
  64. ### 📊 预期效果
  65. - ✅ **用户体验优化**:界面打开即可看到所有年份的完整统计数据
  66. - ✅ **数据展示完整**:默认展示全量数据,避免数据遗漏
  67. - ✅ **年度选项更新**:移除过时的2024年,从2025年开始
  68. - ✅ **操作一致性**:重置功能与初始化逻辑保持一致
  69. - ✅ **前瞻性设计**:增加未来年份选项,便于长期使用
  70. ### 🚨 后续操作要求
  71. 1. **无需重新编译**:仅前端静态资源修改,刷新页面即可生效
  72. 2. **功能测试验证**:
  73. - 打开预算申报统计分析页面,验证默认显示所有年份数据
  74. - 测试年度筛选功能,确认2025-2028年选项正常
  75. - 测试重置功能,确认重置后显示全部年度数据
  76. - 验证各个统计图表和数据表格正常加载
  77. ### 💡 技术要点
  78. - **前端状态管理**:通过修改data中的默认值实现初始化优化
  79. - **用户界面优化**:年度选项从当前年度开始,提升用户体验
  80. - **数据查询逻辑**:空字符串作为查询参数时,后端返回所有年份数据
  81. - **一致性保证**:初始化、重置、查询逻辑保持统一
  82. ---
  83. ## 2025-01-18 17:20:00 - 优化财务审批院领导选择逻辑(基于权限角色)
  84. ### 🎯 优化目标
  85. 将财务审批模块中选择院领导的逻辑从"按部门查找"优化为"按权限角色查找",确保选择的用户具有实际的院领导审批权限。
  86. ### 🔍 原有实现问题
  87. **原逻辑**:查询部门名称包含"院领导"的部门,返回该部门下的所有正常状态用户
  88. **问题分析**:
  89. 1. ❌ 依赖部门名称,不够灵活
  90. 2. ❌ 可能包含非审批人员(部门内其他用户)
  91. 3. ❌ 没有权限验证,可能选择到无权限用户
  92. 4. ❌ 不符合RBAC权限模型设计理念
  93. ### 🚀 优化方案
  94. **新逻辑**:基于权限角色查找具有 `cw:approval:leader` 权限的所有用户
  95. **优势**:
  96. - ✅ 权限导向,确保选择的用户有审批权限
  97. - ✅ 不依赖部门结构,更灵活
  98. - ✅ 符合RBAC权限模型
  99. - ✅ 便于后续权限管理
  100. - ✅ 保留部门查询作为备选方案
  101. ### 🔧 技术实现
  102. #### 修改文件
  103. **文件路径**:`backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java`
  104. **修改方法**:`getAvailableApprovers(Long applicationId)` (第1126行)
  105. #### 核心变更内容
  106. 1. **添加JdbcTemplate依赖**
  107. ```java
  108. @Autowired
  109. private JdbcTemplate jdbcTemplate;
  110. ```
  111. 2. **权限查询SQL**
  112. ```sql
  113. SELECT DISTINCT
  114. u.user_id, u.user_name, u.nick_name,
  115. COALESCE(d.dept_name, '未分配部门') as dept_name,
  116. COALESCE(d.dept_id, 0) as dept_id
  117. FROM sys_user u
  118. LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
  119. INNER JOIN sys_user_role ur ON u.user_id = ur.user_id
  120. INNER JOIN sys_role r ON ur.role_id = r.role_id
  121. INNER JOIN sys_role_menu rm ON r.role_id = rm.role_id
  122. INNER JOIN sys_menu m ON rm.menu_id = m.menu_id
  123. WHERE m.perms = 'cw:approval:leader'
  124. AND u.status = '0'
  125. AND u.del_flag = '0'
  126. AND r.status = '0'
  127. ORDER BY u.user_name
  128. ```
  129. 3. **双重保障机制**
  130. - **主方案**:基于权限查询具有 `cw:approval:leader` 权限的用户
  131. - **备选方案**:如果权限查询无结果,使用原有的部门查询逻辑
  132. #### 实现逻辑流程
  133. ```
  134. 1. 执行权限查询SQL → 查找具有cw:approval:leader权限的用户
  135. 2. 转换查询结果 → 组装返回Map格式数据
  136. 3. 结果检查 → 如果权限查询为空,启用部门查询备选方案
  137. 4. 返回结果 → 具有审批权限的院领导列表
  138. ```
  139. ### 📊 预期效果
  140. - ✅ **精确权限控制**:只返回真正具有院领导审批权限的用户
  141. - ✅ **系统一致性**:与RBAC权限模型保持一致
  142. - ✅ **灵活性提升**:不依赖特定部门名称
  143. - ✅ **向后兼容**:保留部门查询作为备选,确保系统稳定
  144. - ✅ **日志完善**:详细的查询过程日志,便于问题排查
  145. ### 🚨 后续操作要求
  146. 1. **重新编译后端服务**:`mvn clean compile`
  147. 2. **重启Spring Boot应用**
  148. 3. **功能测试验证**:
  149. - 财务人员审批时选择院领导功能
  150. - 验证只显示具有 `cw:approval:leader` 权限的用户
  151. - 测试备选方案是否正常工作
  152. ### 💡 技术要点
  153. - **权限查询**:通过多表关联查询用户权限
  154. - **NULL值处理**:使用COALESCE处理部门信息为空的情况
  155. - **异常处理**:查询失败时返回空列表,不影响主流程
  156. - **日志记录**:完整的查询过程日志,便于调试和监控
  157. ---
  158. ## 2025-01-18 16:45:00 - 修复财务和院领导审批"我已审批"查询问题
  159. ### 🚨 问题描述
  160. 财务审批和院领导审批模块的"我已审批"功能无法查询到已审批的记录,用户反馈看不到自己审批过的内容。
  161. ### 🔍 问题分析
  162. 通过深度分析发现两个核心问题:
  163. 1. **财务已审批查询状态不匹配**:
  164. - 审批时更新状态为:`approved/rejected`
  165. - 查询时使用状态为:`completed/rejected`
  166. - 导致状态不匹配,查询不到记录
  167. 2. **院领导已审批查询状态不匹配**:
  168. - 审批时更新状态为:`approved/rejected`
  169. - 查询时使用状态为:`complete`
  170. - 导致状态不匹配,查询不到记录
  171. ### 🔧 修复方案
  172. **方案一:修正查询状态(已采用)**
  173. #### 修复内容1:财务已审批查询
  174. **文件**:`backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/CwApprovalRecordMapper.xml`
  175. **位置**:第146行
  176. ```xml
  177. <!-- 修复前 -->
  178. and ar.node_status in ('completed', 'rejected')
  179. <!-- 修复后 -->
  180. and ar.node_status in ('approved', 'rejected')
  181. ```
  182. #### 修复内容2:院领导已审批查询
  183. **文件**:`backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java`
  184. **位置**:第467行
  185. ```java
  186. // 修复前
  187. return baseMapper.selectByApproverAndNode(currentUserId, "leader_approve", "complete");
  188. // 修复后
  189. return baseMapper.selectByApproverAndNode(currentUserId, "leader_approve", "approved");
  190. ```
  191. ### 📊 修复效果预期
  192. - ✅ 财务人员能在"财务已审批"中看到自己审批的记录
  193. - ✅ 院领导能在"院领导已审批"中看到自己审批的记录
  194. - ✅ 通用"我已审批"功能正常工作(之前已修复approverId问题)
  195. - ✅ 三个查询功能相互独立,互不影响
  196. ### 🚨 后续操作要求
  197. 1. **重新编译后端服务**:`mvn clean compile`
  198. 2. **重启Spring Boot应用**
  199. 3. **功能测试验证**:用财务和院领导账号分别测试审批和查询功能
  200. ---
  201. ## 📋 本次变更概述
  202. **变更时间**: 2025-01-18 15:30:00
  203. **变更人员**: wuzhen
  204. **变更类型**: 🔧 审批流程状态统一修复
  205. **影响范围**: 财务预算申报审批流程
  206. ## 🎯 问题背景
  207. 发现审批流程中存在**状态不统一**和**逻辑错误**问题:
  208. ### 原有问题
  209. 1. **节点状态不统一**:
  210. - 部门审批通过:`"approved"`
  211. - 财务审批通过:`"completed"`
  212. - 分管领导审批通过:`"completed"`
  213. 2. **分管领导审批逻辑错误**:
  214. - 审批通过后状态设为 `"finance_approving"`
  215. - 应该是最终完成状态 `"approved"`
  216. 3. **"我已审批"查询逻辑不准确**:
  217. - 使用排除法 `.notIn("waiting", "pending")`
  218. - 可能包含错误状态
  219. ## 🔧 修改内容
  220. ### 1. 统一财务审批节点状态
  221. **文件**: `CwApprovalRecordServiceImpl.java`
  222. **位置**: 第1302行
  223. **修改**: `"completed"` → `"approved"`
  224. ```java
  225. // 修改前
  226. updateRecord.setNodeStatus("approve".equals(approveAction) ? "completed" : "rejected");
  227. // 修改后
  228. updateRecord.setNodeStatus("approve".equals(approveAction) ? "approved" : "rejected");
  229. ```
  230. ### 2. 统一分管领导审批节点状态
  231. **文件**: `CwApprovalRecordServiceImpl.java`
  232. **位置**: 第1202行
  233. **修改**: `"completed"` → `"approved"`
  234. ```java
  235. // 修改前
  236. updateRecord.setNodeStatus("approve".equals(approveAction) ? "completed" : "rejected");
  237. // 修改后
  238. updateRecord.setNodeStatus("approve".equals(approveAction) ? "approved" : "rejected");
  239. ```
  240. ### 3. 修正分管领导审批的申报状态逻辑
  241. **文件**: `CwApprovalRecordServiceImpl.java`
  242. **位置**: 第1224-1229行
  243. **修改**: `"finance_approving"` → `"approved"`
  244. ```java
  245. // 修改前
  246. if ("approve".equals(approveAction)) {
  247. // 审批通过,状态改为财务审批中
  248. newStatus = "finance_approving";
  249. log.info("✅ 分管领导审批通过,提交财务审批:applicationId={}", applicationId);
  250. // TODO: 这里可以添加创建财务审批记录的逻辑
  251. // 修改后
  252. if ("approve".equals(approveAction)) {
  253. // 分管领导审批通过,整个审批流程完成
  254. newStatus = "approved";
  255. log.info("✅ 分管领导审批通过,整个审批流程完成:applicationId={}", applicationId);
  256. ```
  257. ### 4. 修正"我已审批"查询逻辑
  258. **文件**: `CwApprovalRecordServiceImpl.java`
  259. **位置**: 第381行
  260. **修改**: 排除法 → 精确匹配法
  261. ```java
  262. // 修改前
  263. queryWrapper.eq(CwApprovalRecord::getApproverId, currentUserId)
  264. .notIn(CwApprovalRecord::getNodeStatus, Arrays.asList("waiting", "pending"))
  265. .orderByDesc(CwApprovalRecord::getEndTime);
  266. // 修改后
  267. queryWrapper.eq(CwApprovalRecord::getApproverId, currentUserId)
  268. .in(CwApprovalRecord::getNodeStatus, Arrays.asList("approved", "rejected", "returned"))
  269. .orderByDesc(CwApprovalRecord::getEndTime);
  270. ```
  271. ## 📊 修改后的状态体系
  272. ### 双层状态管理
  273. 1. **申报级别状态** (`CwProjectApplication.approval_status`):
  274. - `"approved"` = 整个流程完成 ✅
  275. - `"approving"` = 审批进行中 ⏳
  276. - `"rejected"` = 审批被拒绝 ❌
  277. - `"returned"` = 被退回修改 🔄
  278. 2. **审批节点状态** (`CwApprovalRecord.node_status`):
  279. - `"approved"` = 节点通过(统一标准)
  280. - `"rejected"` = 节点拒绝
  281. - `"returned"` = 节点退回
  282. - `"waiting"` = 等待审批
  283. ### 正确的流程逻辑
  284. ```
  285. 提交申报 → approval_status = "submitted"
  286. ↓
  287. 部门审批 → node_status = "approved" + approval_status = "approving"
  288. ↓
  289. 财务审批 → node_status = "approved" + approval_status = "approving"
  290. ↓
  291. 分管领导审批 → node_status = "approved" + approval_status = "approved" ✅最终完成
  292. ```
  293. ## 🎯 预期效果
  294. 1. **状态统一**:所有审批节点通过状态统一为 `"approved"`
  295. 2. **流程正确**:分管领导审批通过后,整个流程完成
  296. 3. **用户体验**:通过 `approval_status` 清晰知道审批进度
  297. 4. **功能修复**:"我已审批"功能能正确显示审批记录
  298. ## ⚠️ 注意事项
  299. 1. **需要重新编译和启动服务**以生效
  300. 2. **现有数据兼容性**:历史数据中的 `"completed"` 状态需要考虑兼容
  301. 3. **前端显示**:确保前端能正确显示新的状态逻辑
  302. 4. **测试验证**:需要完整测试审批流程的各个环节
  303. ## 📝 后续工作
  304. 1. 重启后端服务
  305. 2. 测试完整的审批流程
  306. 3. 验证"我已审批"功能
  307. 4. 检查前端状态显示是否正确
  308. 5. 考虑是否需要数据迁移脚本处理历史数据
  309. ---
  310. ## 🔧 财务审批"我已审批"功能修复 - 2025-01-18 22:30:00
  311. ### 🚨 **问题描述**
  312. - **问题现象**: 财务审批通过后,该申请在"我已审批"列表中看不到
  313. - **具体案例**: YS202508049627申请财务审批通过后,在财务人员的"我已审批"中不显示
  314. - **影响范围**: 所有财务审批通过的记录都无法在"我已审批"中查看
  315. ### 🔍 **根本原因**
  316. 财务审批方法(`financeApproval`)中缺少关键的`approverId`字段更新:
  317. **问题代码**:
  318. ```java
  319. // 财务审批时只更新了状态,但没有更新实际审批人ID
  320. updateRecord.setNodeStatus("approved");
  321. updateRecord.setApproveAction("approve");
  322. // ❌ 缺少:updateRecord.setApproverId(currentUserId);
  323. ```
  324. **"我已审批"查询逻辑**:
  325. ```java
  326. // 根据approverId查询,如果approverId不匹配就查不到
  327. queryWrapper.eq(CwApprovalRecord::getApproverId, currentUserId)
  328. ```
  329. ### ✅ **修复方案**
  330. 在`CwApprovalRecordServiceImpl.financeApproval()`方法中添加缺失的审批人信息更新:
  331. ```java
  332. // 🔧 修复:更新实际审批人信息(解决"我已审批"查询不到的问题)
  333. updateRecord.setApproverId(currentUserId);
  334. // 更新审批人姓名(保持数据一致性)
  335. SysUserVo currentUser = sysUserService.selectUserById(currentUserId);
  336. if (currentUser != null) {
  337. updateRecord.setApproverName(currentUser.getNickName());
  338. }
  339. ```
  340. ### 📁 **修改文件**
  341. - `backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java`
  342. - 修改位置:第1304行后
  343. - 修改内容:添加approverId和approverName字段更新
  344. ### 🎯 **预期效果**
  345. 修复后:
  346. - ✅ 财务审批通过的记录能在"我已审批"中正确显示
  347. - ✅ 显示正确的审批人信息
  348. - ✅ 与分管领导审批记录保持一致的数据结构
  349. - ✅ 历史数据需要手动修复(如果需要)
  350. ### 🔄 **后续操作**
  351. 1. 重启后端服务
  352. 2. 测试财务审批功能
  353. 3. 验证"我已审批"显示是否正常
  354. ---
  355. **✅ 修改完成时间**: 2025-01-18 15:45:00
  356. **🔄 状态**: 待重启服务验证