审核管理:新增当前用户待办统计接口(按模块聚合)

- GET /api/gxmu/review-list/pending-summary:status=0 且 user_id=当前登录人,
  按 module 聚合并回填注册表标题,供「待办审核」左侧模块导航显示待办数
- 不拿分页结果当计数:避免 limit 上限后数字失真
- 附 sql/20261111_spec58_review_menu.sql:三个子菜单收敛为
  待办审核(14359)/ 审批规则(14355),删除「审核流分配管理」(14356)
This commit is contained in:
agent
2026-11-04 00:53:01 +08:00
parent ce8dd3e08a
commit 66cd596a02
5 changed files with 129 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
-- 审核管理:三个子菜单收敛成两个(变体 A「按模块的工作台」落地)
--
-- 之前:审核流配置 / 审核流分配管理 / 审核列表 —— 三个页面各自对应一张表,
-- 用户要在脑子里 join 才能回答「这条申报现在谁在审」。
-- 之后:待办审核(原审核列表页,改造成工作台)/ 审批规则(原审核流配置页,
-- 按模块一行展示生效的审批链,可直接换链、编辑链)。
-- 「审核流分配管理」删除:模块与审批链的绑定并入审批规则页。
--
-- 依赖:先跑 20261110_spec58_approval_chain.sql(模块注册表)。
UPDATE sys_menu SET title = '待办审核', sort_number = 10
WHERE menu_id = 14359 AND deleted = 0;
UPDATE sys_menu SET title = '审批规则', sort_number = 20
WHERE menu_id = 14355 AND deleted = 0;
DELETE FROM sys_role_menu WHERE menu_id = 14356;
UPDATE sys_menu SET deleted = 1
WHERE menu_id = 14356 AND deleted = 0;
-- 校验:期望只剩「待办审核」「审批规则」两条子菜单
SELECT menu_id, parent_id, title, path, sort_number, deleted
FROM sys_menu
WHERE parent_id = 14358
ORDER BY sort_number;
@@ -8,6 +8,8 @@ import com.gxwebsoft.gxmu.service.ReviewFlowStarterService;
import com.gxwebsoft.gxmu.service.DeclareGuardService;
import com.gxwebsoft.gxmu.service.ReviewListService;
import com.gxwebsoft.gxmu.entity.ReviewList;
import com.gxwebsoft.gxmu.model.ReviewPendingSummary;
import com.gxwebsoft.gxmu.module.service.ModuleRegistryService;
import com.gxwebsoft.gxmu.param.ReviewListParam;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.PageResult;
@@ -21,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* 审核列表控制器
@@ -42,6 +45,8 @@ public class ReviewListController extends BaseController {
private DeclareGuardService declareGuardService;
@Resource
private ReviewFlowStarterService reviewFlowStarterService;
@Resource
private ModuleRegistryService moduleRegistryService;
@ApiOperation("分页查询审核列表")
@GetMapping("/page")
@@ -67,6 +72,24 @@ public class ReviewListController extends BaseController {
return success(reviewListService.pageRel(param));
}
@ApiOperation("当前用户的待办统计(按模块)")
@GetMapping("/pending-summary")
public ApiResult<ReviewPendingSummary> pendingSummary() {
Map<String, Long> counts = reviewListService.countPendingByModule(getLoginUserId());
Map<String, String> titles = moduleRegistryService.titleMap();
ReviewPendingSummary summary = new ReviewPendingSummary();
counts.entrySet().stream()
// 数量倒序、同数量按模块名,保证前端导航顺序稳定
.sorted(Map.Entry.<String, Long>comparingByValue().reversed()
.thenComparing(Map.Entry.comparingByKey()))
.forEach(entry -> summary.getModules().add(new ReviewPendingSummary.Item(
entry.getKey(),
ModuleRegistryService.titleOf(titles, entry.getKey()),
entry.getValue())));
summary.setTotal(counts.values().stream().mapToLong(Long::longValue).sum());
return success(summary);
}
@ApiOperation("查询全部审核列表")
@GetMapping()
public ApiResult<List<ReviewList>> list(ReviewListParam param) {
@@ -0,0 +1,53 @@
package com.gxwebsoft.gxmu.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 当前用户的待办统计(按模块聚合)。
*
* <p>「待办审核」页左侧模块导航的数字来自这里:一次请求拿全,避免前端为每个模块
* 各发一次分页查询、也避免把分页结果当计数用。
*
* @author LX
*/
@Data
@ApiModel("待办统计")
public class ReviewPendingSummary implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("待办总数")
private long total;
@ApiModelProperty("按模块分组的待办数,按数量倒序")
private List<Item> modules = new ArrayList<>();
@Data
@ApiModel("模块待办数")
public static class Item implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("模块标识")
private String module;
@ApiModelProperty("模块标题")
private String moduleName;
@ApiModelProperty("待办数")
private long count;
public Item() {
}
public Item(String module, String moduleName, long count) {
this.module = module;
this.moduleName = moduleName;
this.count = count;
}
}
}
@@ -48,4 +48,12 @@ public interface ReviewListService extends IService<ReviewList> {
ReviewList getByIdRel(Integer id);
List<ReviewList> listByModuleNPK(String module, Integer pk);
/**
* 统计某个用户的待办(status=0)按模块的分布。
*
* @param userId 审批人用户id,null 表示不按人过滤
* @return module -> 待办数,按数量倒序由调用方决定
*/
java.util.Map<String, Long> countPendingByModule(Integer userId);
}
@@ -3,6 +3,7 @@ package com.gxwebsoft.gxmu.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxwebsoft.common.system.service.UserService;
import com.gxwebsoft.gxmu.constant.ReviewStatus;
import com.gxwebsoft.gxmu.mapper.ReviewListMapper;
import com.gxwebsoft.gxmu.service.ReviewListService;
import com.gxwebsoft.gxmu.entity.ReviewList;
@@ -13,6 +14,7 @@ import com.gxwebsoft.common.core.web.PageResult;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -90,6 +92,24 @@ public class ReviewListServiceImpl extends ServiceImpl<ReviewListMapper, ReviewL
}
}
@Override
public Map<String, Long> countPendingByModule(Integer userId) {
List<ReviewList> pending = list(
new LambdaQueryWrapper<ReviewList>()
.eq(ReviewList::getDeleted, 0)
.eq(ReviewList::getStatus, ReviewStatus.PENDING)
.eq(userId != null, ReviewList::getUserId, userId)
);
Map<String, Long> counts = new HashMap<>();
for (ReviewList item : pending) {
if (item.getModule() == null) {
continue;
}
counts.merge(item.getModule(), 1L, Long::sum);
}
return counts;
}
@Override
public List<ReviewList> listByModuleNPK(String module, Integer pk){
return list(