From 01a9efd7952e203b9271c7118ffe54b1ad803a43 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Fri, 11 Feb 2022 23:16:59 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=907.1.6=E3=80=91=E3=80=90statistics?= =?UTF-8?q?=E3=80=91=E9=87=8D=E6=9E=84=E8=8E=B7=E5=8F=96=E5=B8=B8=E7=94=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=92=8C=E5=AE=9A=E6=97=B6=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modular/home/service/HomePageService.java | 12 +- .../service/impl/HomePageServiceImpl.java | 107 ++++++++++++------ .../system/modular/menu/entity/SysMenu.java | 6 + 3 files changed, 85 insertions(+), 40 deletions(-) diff --git a/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/HomePageService.java b/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/HomePageService.java index f623c7306..2edb76caf 100644 --- a/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/HomePageService.java +++ b/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/HomePageService.java @@ -41,18 +41,18 @@ public interface HomePageService { HomeCompanyInfo getHomeCompanyInfo(); /** - * 获取常用功能 + * 获取常用功能集合 * - * @author xixiaowei - * @date 2022/2/10 11:19 + * @author fengshuonan + * @date 2022/2/11 22:02 */ List getCommonFunctions(); /** - * 数据统计 + * 将缓存中的访问次数信息保存到数据库 * - * @author xixiaowei - * @date 2022/2/10 12:07 + * @author fengshuonan + * @date 2022/2/11 22:02 */ void saveStatisticsCacheToDb(); } diff --git a/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/impl/HomePageServiceImpl.java b/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/impl/HomePageServiceImpl.java index 3214d62db..e42b32625 100644 --- a/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/impl/HomePageServiceImpl.java +++ b/kernel-s-system/system-business-home/src/main/java/cn/stylefeng/roses/kernel/system/modular/home/service/impl/HomePageServiceImpl.java @@ -1,6 +1,7 @@ package cn.stylefeng.roses.kernel.system.modular.home.service.impl; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; @@ -8,6 +9,7 @@ import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.log.api.LogManagerApi; import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerRequest; import cn.stylefeng.roses.kernel.log.api.pojo.record.LogRecordDTO; +import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; import cn.stylefeng.roses.kernel.system.api.HomePageServiceApi; import cn.stylefeng.roses.kernel.system.api.PositionServiceApi; import cn.stylefeng.roses.kernel.system.api.UserServiceApi; @@ -28,6 +30,7 @@ import cn.stylefeng.roses.kernel.system.modular.statistic.pojo.OnlineUserStat; import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUserOrg; import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserOrgService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.stereotype.Service; @@ -148,51 +151,87 @@ public class HomePageServiceImpl implements HomePageService, HomePageServiceApi @Override public List getCommonFunctions() { - List sysStatisticsCounts = sysStatisticsCountService.list(Wrappers.lambdaQuery().orderByDesc(SysStatisticsCount::getStatCount)); - List statUrlIds = sysStatisticsCounts.stream().map(SysStatisticsCount::getStatUrlId).collect(Collectors.toList()); - // 菜单ID集合 - List statMenuIds = new ArrayList<>(); - for (Long statUrlId : statUrlIds) { - SysStatisticsUrl sysStatisticsUrl = sysStatisticsUrlService.getById(statUrlId); - String statMenuId = sysStatisticsUrl.getStatMenuId(); - statMenuIds.add(statMenuId); - } + // 获取当前用户常用功能,按使用次数排序 + LoginUser loginUser = LoginContext.me().getLoginUser(); + List statList = sysStatisticsCountService.list( + Wrappers.lambdaQuery(SysStatisticsCount.class).eq(SysStatisticsCount::getUserId, loginUser.getUserId()).orderByDesc(SysStatisticsCount::getStatCount)); + List statUrlId = statList.stream().map(SysStatisticsCount::getStatUrlId).collect(Collectors.toList()); - List sysMenuList = new ArrayList<>(); - for (String statMenuId : statMenuIds) { - SysMenu sysMenu = sysMenuService.getOne(Wrappers.lambdaQuery().eq(SysMenu::getMenuId, statMenuId)); - sysMenuList.add(sysMenu); + // 获取系统常驻常用功能 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(SysStatisticsUrl.class) + .eq(SysStatisticsUrl::getAlwaysShow, YesOrNotEnum.Y) + .or() + .in(ObjectUtil.isNotEmpty(statUrlId), SysStatisticsUrl::getStatUrlId, statUrlId) + .select(SysStatisticsUrl::getStatMenuId); + List alwaysShowList = sysStatisticsUrlService.list(wrapper); + + // 获取菜单 + List usualMenuIds = alwaysShowList.stream().map(SysStatisticsUrl::getStatMenuId).collect(Collectors.toList()); + + // 获取菜单对应的图标和名称信息 + LambdaQueryWrapper sysMenuLambdaQueryWrapper = Wrappers.lambdaQuery(SysMenu.class) + .in(SysMenu::getMenuId, usualMenuIds) + .select(SysMenu::getMenuName, SysMenu::getAntdvIcon, SysMenu::getAntdvRouter); + List list = sysMenuService.list(sysMenuLambdaQueryWrapper); + + // 菜单的icon需要转为大写驼峰 + for (SysMenu sysMenu : list) { + if (sysMenu.getAntdvIcon() != null) { + String replace = sysMenu.getAntdvIcon().replace("-", "_"); + sysMenu.setAntdvIcon(StrUtil.upperFirst(StrUtil.toCamelCase(replace))); + } } - return sysMenuList; + return list; } @Override public void saveStatisticsCacheToDb() { // key是用户id,value的key是statUrlId,最后的value是次数 Map> userRequestStats = requestCountCacheApi.getAllKeyValues(); + Set userIds = userRequestStats.keySet(); - List sysStatisticsCountList = new ArrayList<>(); - // 将数据存入DB - for (String userId : userRequestStats.keySet()) { - SysStatisticsCount sysStatisticsCount = new SysStatisticsCount(); - sysStatisticsCount.setUserId(Long.valueOf(userId)); - Map map = userRequestStats.get(userId); - for (Long statUrlId : map.keySet()) { - SysStatisticsCount statisticsCount = sysStatisticsCountService.getOne(Wrappers.lambdaQuery().eq(SysStatisticsCount::getStatUrlId, statUrlId)); - // 判断是否已存在该记录,如果存在更新次数,不存在添加记录 - if (ObjectUtil.isNotNull(statisticsCount)) { - sysStatisticsCount.setStatCountId(statisticsCount.getStatCountId()); - } - sysStatisticsCount.setStatUrlId(statUrlId); - sysStatisticsCount.setStatCount(map.get(statUrlId)); - } - - // 存放到集合中 - sysStatisticsCountList.add(sysStatisticsCount); + // 缓存为空,则不进行更新操作 + if (ObjectUtil.isEmpty(userIds)) { + return; } - // 更新DB - sysStatisticsCountService.saveOrUpdateBatch(sysStatisticsCountList); + // 将缓存的数据合并到库中 + List cacheCountList = new ArrayList<>(); + for (String userId : userIds) { + // 获取用户的访问记录缓存,key是statUrlId,value是次数 + Map userCounts = userRequestStats.get(userId); + for (Map.Entry userCountItem : userCounts.entrySet()) { + Long statUrlId = userCountItem.getKey(); + Integer count = userCountItem.getValue(); + SysStatisticsCount sysStatisticsCount = new SysStatisticsCount(); + sysStatisticsCount.setUserId(Long.valueOf(userId)); + sysStatisticsCount.setStatUrlId(statUrlId); + sysStatisticsCount.setStatCount(count); + cacheCountList.add(sysStatisticsCount); + } + } + + // 查询缓存用户在库中的统计记录 + List sysStatisticsCounts = sysStatisticsCountService.list( + Wrappers.lambdaQuery(SysStatisticsCount.class).in(SysStatisticsCount::getUserId, userIds)); + + for (SysStatisticsCount cacheItem : cacheCountList) { + boolean haveRecord = false; + for (SysStatisticsCount dbItem : sysStatisticsCounts) { + // 如果库里有这次统计数据,则更新这个记录 + if (dbItem.getStatUrlId().equals(cacheItem.getStatUrlId()) && dbItem.getUserId().equals(cacheItem.getUserId())) { + haveRecord = true; + cacheItem.setStatCountId(dbItem.getStatCountId()); + } + } + // 如果库里没有这次的缓存记录,从新生成一个id + if (!haveRecord) { + cacheItem.setStatCountId(IdWorker.getId()); + } + } + + // 将缓存的数据更新或插入到数据库中 + sysStatisticsCountService.saveOrUpdateBatch(cacheCountList); } } diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/entity/SysMenu.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/entity/SysMenu.java index 6e49adf58..66ced2eb2 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/entity/SysMenu.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/entity/SysMenu.java @@ -218,11 +218,17 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode { @Override public String getNodeId() { + if (menuId == null) { + return null; + } return menuId.toString(); } @Override public String getNodeParentId() { + if (menuParentId == null) { + return null; + } return menuParentId.toString(); }