Просмотр исходного кода

feat(stat): 添加大屏统计功能V2版本- 新增 ScreenStatsV2DTO 数据传输对象,用于封装大屏统计数据- 在 AdminUserInfoMapper 中添加 queryStats 和 queryUserDis 查询方法
- 在 DevInfoMapper 中添加 queryStatInfoV2 查询方法
- 在 TblTenantMapper 和 UserInfoMapper 中分别添加 queryStats 查询方法
- 实现各服务接口及其实现类的 queryStats 和 queryUserDis 方法
- 创建 WebStatsV2Gateway 接口及其实现类 WebStatsV2GatewayImpl- 添加 WebStatsV2Controller 控制器提供首页大屏统计接口
- 实现设备、机构、用户等多维度统计信息的整合与计算逻辑

chejianzheng 1 день назад
Родитель
Сommit
df3fd9c193
16 измененных файлов с 318 добавлено и 1 удалено
  1. 32 0
      portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebStatsV2Controller.java
  2. 50 0
      portal-service-common/src/main/java/com/hfln/portal/common/dto/data/stat/ScreenStatsV2DTO.java
  3. 9 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebStatsV2Gateway.java
  4. 92 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebStatsV2GatewayImpl.java
  5. 32 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/AdminUserInfoMapper.java
  6. 13 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/DevInfoMapper.java
  7. 17 1
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/TblTenantMapper.java
  8. 16 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/UserInfoMapper.java
  9. 6 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/AdminUserService.java
  10. 2 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/DevInfoService.java
  11. 4 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblTenantService.java
  12. 5 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/UserService.java
  13. 14 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/AdminUserServiceImpl.java
  14. 8 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/DevInfoServiceImpl.java
  15. 9 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblTenantServiceImpl.java
  16. 9 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/UserServiceImpl.java

+ 32 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebStatsV2Controller.java

@@ -0,0 +1,32 @@
+
+package com.hfln.portal.application.controller.web;
+
+
+import cn.hfln.framework.catchlog.CatchAndLog;
+import cn.hfln.framework.dto.ApiResult;
+import com.hfln.portal.common.dto.data.stat.ScreenStatsV2DTO;
+import com.hfln.portal.domain.gateway.WebStatsV2Gateway;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@CatchAndLog
+@Tag(name = "web端统计相关-v2")
+@Slf4j
+@RequestMapping("/web/stats/v2")
+public class WebStatsV2Controller {
+
+    @Autowired
+    private WebStatsV2Gateway webStatsV2Gateway;
+
+    @PostMapping("/screen")
+    @Operation(summary = "首页大屏统计")
+    public ApiResult<ScreenStatsV2DTO> queryScreen() {
+        return ApiResult.success(webStatsV2Gateway.queryScreenV2());
+    }
+}

+ 50 - 0
portal-service-common/src/main/java/com/hfln/portal/common/dto/data/stat/ScreenStatsV2DTO.java

@@ -0,0 +1,50 @@
+package com.hfln.portal.common.dto.data.stat;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ScreenStatsV2DTO {
+
+    @Schema(description = "设备激活数量")
+    private Integer deviceActivationCount;
+
+    @Schema(description = "设备在线率")
+    private Double deviceActiveRate;
+
+    @Schema(description = "设备在线数量")
+    private Integer deviceOnlineCount;
+
+    @Schema(description = "设备月度新增数量")
+    private Integer deviceMonthlyNewCount;
+
+    @Schema(description = "机构数量")
+    private Integer tenantCount;
+
+    @Schema(description = "机构月度新增数量")
+    private Integer tenantMonthlyNewCount;
+
+    @Schema(description = "用户数量")
+    private int userCount;
+
+    @Schema(description = "用户月度新增数量")
+    private Integer userMonthlyNewCount;
+
+    @Schema(description = "用户分布")
+    private List<UserDistributionInfo> userDistributionList;
+
+    @Data
+    public static class UserDistributionInfo {
+
+        @Schema(description = "分布类型")
+        private String disType;
+
+        @Schema(description = "分布类型")
+        private String disTypeName;
+
+        @Schema(description = "数量")
+        private Integer count;
+    }
+}

+ 9 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/WebStatsV2Gateway.java

@@ -0,0 +1,9 @@
+package com.hfln.portal.domain.gateway;
+
+import com.hfln.portal.common.dto.data.stat.ScreenStatsV2DTO;
+
+public interface WebStatsV2Gateway {
+
+    ScreenStatsV2DTO queryScreenV2();
+}
+

+ 92 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebStatsV2GatewayImpl.java

@@ -0,0 +1,92 @@
+package com.hfln.portal.infrastructure.gateway.impl;
+
+import com.hfln.portal.common.dto.data.stat.ScreenStatsV2DTO;
+import com.hfln.portal.domain.gateway.WebStatsV2Gateway;
+import com.hfln.portal.infrastructure.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class WebStatsV2GatewayImpl implements WebStatsV2Gateway {
+
+
+    @Autowired
+    private DevInfoService devInfoService;
+
+    @Autowired
+    private TblTenantService tblTenantService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private AdminUserService adminuserService;
+
+    @Override
+    public ScreenStatsV2DTO queryScreenV2() {
+        ScreenStatsV2DTO res = new ScreenStatsV2DTO();
+        Map<String, BigDecimal> statInfo = devInfoService.queryStatInfoV2();
+        if (statInfo != null) {
+            res.setDeviceActivationCount(statInfo.get("deviceActivationCount") == null ? 0 : statInfo.get("deviceActivationCount").intValue());
+            res.setDeviceOnlineCount(statInfo.get("deviceOnlineCount") == null ? 0 : statInfo.get("deviceOnlineCount").intValue());
+            res.setDeviceMonthlyNewCount(statInfo.get("deviceMonthlyNewCount") == null ? 0 : statInfo.get("deviceMonthlyNewCount").intValue());
+            if (res.getDeviceActivationCount() != 0 && res.getDeviceOnlineCount() != 0) {
+                res.setDeviceActiveRate(statInfo.get("deviceOnlineCount").divide(statInfo.get("deviceActivationCount"), 4, BigDecimal.ROUND_HALF_UP).doubleValue());
+            } else {
+                res.setDeviceActiveRate(null);
+            }
+        }
+
+        Map<String, BigDecimal> tenantStat = tblTenantService.queryStats();
+        if (tenantStat != null) {
+            res.setTenantCount(tenantStat.get("tenantCount") == null ? 0 : tenantStat.get("tenantCount").intValue());
+            res.setTenantMonthlyNewCount(tenantStat.get("tenantMonthlyNewCount") == null ? 0 : tenantStat.get("tenantMonthlyNewCount").intValue());
+        }
+
+        Map<String, BigDecimal> adminUserStat = adminuserService.queryStats();
+        if (adminUserStat != null) {
+            int adminUserCount = adminUserStat.get("adminUserCount") == null ? 0 : adminUserStat.get("adminUserCount").intValue();
+            res.setUserCount(res.getUserCount() + adminUserCount);
+            int adminUserMonthlyNewCount = adminUserStat.get("adminUserMonthlyNewCount") == null ? 0 : adminUserStat.get("adminUserMonthlyNewCount").intValue();
+            res.setUserMonthlyNewCount(res.getUserMonthlyNewCount() + adminUserMonthlyNewCount);
+        }
+
+        List<ScreenStatsV2DTO.UserDistributionInfo> userDistributionList = new ArrayList<>();
+        Map<String, BigDecimal> userStat = userService.queryStats();
+        if (userStat != null) {
+            res.setUserCount(res.getUserCount() + (userStat.get("userCount") == null ? 0 : userStat.get("userCount").intValue()));
+            res.setUserMonthlyNewCount(userStat.get("userMonthlyNewCount") == null ? 0 : userStat.get("userMonthlyNewCount").intValue());
+
+            ScreenStatsV2DTO.UserDistributionInfo userDistributionInfo = new ScreenStatsV2DTO.UserDistributionInfo();
+            userDistributionInfo.setDisType("personal");
+            userDistributionInfo.setDisTypeName("个人");
+            userDistributionInfo.setCount(res.getUserCount());
+            userDistributionList.add(userDistributionInfo);
+        }
+
+        List<Map<String, Object>> userDisList = adminuserService.queryUserDis();
+
+        if (!CollectionUtils.isEmpty(userDisList)) {
+            for (Map<String, Object> userDis : userDisList) {
+                ScreenStatsV2DTO.UserDistributionInfo userDistributionInfo = new ScreenStatsV2DTO.UserDistributionInfo();
+                userDistributionInfo.setDisType((String) userDis.get("disType"));
+                userDistributionInfo.setDisTypeName((String) userDis.get("disTypeName"));
+                userDistributionInfo.setCount(((Long) userDis.get("count")).intValue());
+                userDistributionList.add(userDistributionInfo);
+            }
+        }
+        res.setUserDistributionList(userDistributionList);
+        return res;
+    }
+}
+
+
+ 

+ 32 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/AdminUserInfoMapper.java

@@ -4,6 +4,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.hfln.portal.infrastructure.po.AdminUserInfo;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -14,4 +20,30 @@ public interface AdminUserInfoMapper extends BaseMapper<AdminUserInfo> {
 
     @Delete("DELETE FROM admin_user_info WHERE userId = #{userId}")
     int delById(Long userId);
+
+    @Select({
+            "<script>",
+            "SELECT ",
+            "   sum(1) as 'adminUserCount', ",
+            "   sum(case when create_time &gt;= #{month} then 1 else 0 end) as 'adminUserMonthlyNewCount' ",
+            "FROM admin_user_info ",
+            "WHERE is_deleted = 0 and user_type not in ('admin', 'manager')",
+            "</script>"
+    })
+    Map<String, BigDecimal> queryStats(LocalDate month);
+
+    @Select({
+            "<script>",
+            "SELECT " +
+                    "    dic.item_code AS 'disType', " +
+                    "    dic.item_name AS 'disTypeName', " +
+                    "    COUNT(admin_user.user_id) AS count " +
+                    "FROM tbl_dic_item dic " +
+                    "         LEFT JOIN tbl_tenant tenant ON dic.item_code = tenant.tenant_type " +
+                    "         LEFT JOIN admin_user_info admin_user ON tenant.tenant_id = admin_user.tenant_id " +
+                    "WHERE dic.dic_type = 'institution_type' and dic.is_deleted = 0 and tenant.is_deleted = 0 and admin_user.is_deleted = 0 " +
+                    "GROUP BY dic.item_code, dic.item_name ",
+            "</script>"
+    })
+    List<Map<String, Object>> queryUserDis();
 }

+ 13 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/DevInfoMapper.java

@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.Map;
 
 /**
@@ -84,4 +85,16 @@ public interface DevInfoMapper extends BaseMapper<DevInfo> {
             "</script>"
     })
     Map<String, BigDecimal> queryStatInfo(Long tenantId);
+
+    @Select({
+            "<script>",
+            "SELECT ",
+            "   SUM(CASE WHEN active_time is not null THEN 1 ELSE 0 END) AS 'deviceActivationCount',",
+            "   sum(case when online = 1 then 1 else 0 end) as 'deviceOnlineCount', ",
+            "   sum(case when active_time &gt;= #{month} then 1 else 0 end) as 'deviceMonthlyNewCount' ",
+            "FROM dev_info ",
+            "WHERE is_deleted = 0 ",
+            "</script>"
+    })
+    Map<String, BigDecimal> queryStatInfoV2(LocalDate month);
 }

+ 17 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/TblTenantMapper.java

@@ -3,10 +3,26 @@ package com.hfln.portal.infrastructure.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.hfln.portal.infrastructure.po.TblTenant;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Map;
 
 /**
  * 组织机构表 Mapper 接口
  */
 @Mapper
 public interface TblTenantMapper extends BaseMapper<TblTenant> {
-} 
+
+    @Select({
+            "<script>",
+            "SELECT ",
+            "   sum(1) as 'tenantCount', ",
+            "   sum(case when create_time &gt;= #{month} then 1 else 0 end) as 'tenantMonthlyNewCount' ",
+            "FROM tbl_tenant ",
+            "WHERE is_deleted = 0 ",
+            "</script>"
+    })
+    Map<String, BigDecimal> queryStats(LocalDate month);
+}

+ 16 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/UserInfoMapper.java

@@ -3,7 +3,23 @@ package com.hfln.portal.infrastructure.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.hfln.portal.infrastructure.po.UserInfo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Map;
 
 @Mapper
 public interface UserInfoMapper extends BaseMapper<UserInfo> {
+
+    @Select({
+            "<script>",
+            "SELECT ",
+            "   sum(1) as 'userCount', ",
+            "   sum(case when create_time &gt;= #{month} then 1 else 0 end) as 'userMonthlyNewCount' ",
+            "FROM user_info ",
+            "WHERE is_deleted = 0 ",
+            "</script>"
+    })
+    Map<String, BigDecimal> queryStats(LocalDate month);
 }

+ 6 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/AdminUserService.java

@@ -6,7 +6,9 @@ import com.hfln.portal.common.request.web.ClientQueryParam;
 import com.hfln.portal.common.request.web.QueryManagerParam;
 import com.hfln.portal.infrastructure.po.AdminUserInfo;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 public interface AdminUserService extends IService<AdminUserInfo> {
 
@@ -27,4 +29,8 @@ public interface AdminUserService extends IService<AdminUserInfo> {
     void updateAllById(AdminUserInfo adminUserInfo);
 
     List<AdminUserInfo> queryByTenantIdAndUserType(Long tenantId, String userType);
+
+    Map<String, BigDecimal> queryStats();
+
+    List<Map<String, Object>> queryUserDis();
 }

+ 2 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/DevInfoService.java

@@ -40,4 +40,6 @@ public interface DevInfoService extends IService<DevInfo> {
 
 
     Map<String, BigDecimal> queryStatInfo(Long tenantId);
+
+    Map<String, BigDecimal> queryStatInfoV2();
 }

+ 4 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/TblTenantService.java

@@ -5,11 +5,15 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.hfln.portal.common.request.tenant.TenantQueryReq;
 import com.hfln.portal.infrastructure.po.TblTenant;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 public interface TblTenantService extends IService<TblTenant> {
 
     List<TblTenant> queryByCodeOrName(String tenantCode, String tenantName);
 
     Page<TblTenant> queryTenantList(TenantQueryReq req);
+
+    Map<String, BigDecimal> queryStats();
 }

+ 5 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/UserService.java

@@ -3,6 +3,9 @@ package com.hfln.portal.infrastructure.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.hfln.portal.infrastructure.po.UserInfo;
 
+import java.math.BigDecimal;
+import java.util.Map;
+
 public interface UserService extends IService<UserInfo> {
 
     /**
@@ -31,4 +34,6 @@ public interface UserService extends IService<UserInfo> {
     UserInfo queryByOpenId(String openId);
 
     UserInfo queryById(Long userId);
+
+    Map<String, BigDecimal> queryStats();
 }

+ 14 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/AdminUserServiceImpl.java

@@ -16,7 +16,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 @Service
@@ -148,4 +152,14 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserInfoMapper, Admin
         queryWrapper.eq(AdminUserInfo::getIsDeleted, BasePO.DeleteFlag.NOT_DELETED);
         return this.baseMapper.selectList(queryWrapper);
     }
+
+    @Override
+    public Map<String, BigDecimal> queryStats() {
+        return this.baseMapper.queryStats(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()));
+    }
+
+    @Override
+    public List<Map<String, Object>> queryUserDis() {
+        return this.baseMapper.queryUserDis();
+    }
 }

+ 8 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/DevInfoServiceImpl.java

@@ -20,7 +20,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -263,4 +265,10 @@ public class DevInfoServiceImpl extends ServiceImpl<DevInfoMapper, DevInfo> impl
 
         return this.baseMapper.queryStatInfo(tenantId);
     }
+
+    @Override
+    public Map<String, BigDecimal> queryStatInfoV2() {
+
+        return this.baseMapper.queryStatInfoV2(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()));
+    }
 }

+ 9 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/TblTenantServiceImpl.java

@@ -12,7 +12,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
 import java.util.List;
+import java.util.Map;
 
 
 @Service
@@ -50,4 +54,9 @@ public class TblTenantServiceImpl extends ServiceImpl<TblTenantMapper, TblTenant
         queryWrapper.orderByAsc(TblTenant::getSort);
         return this.baseMapper.selectPage(page, queryWrapper);
     }
+
+    @Override
+    public Map<String, BigDecimal> queryStats() {
+        return this.baseMapper.queryStats(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()));
+    }
 }

+ 9 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/UserServiceImpl.java

@@ -10,6 +10,10 @@ import com.hfln.portal.infrastructure.service.UserService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Map;
 import java.util.Objects;
 
 @Service
@@ -67,5 +71,10 @@ public class UserServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> imple
         return this.baseMapper.selectOne(queryWrapper);
     }
 
+    @Override
+    public Map<String, BigDecimal> queryStats() {
+        return this.baseMapper.queryStats(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()));
+    }
+
 
 }