Commit c46d8f19 by Jony.L

大屏数据:大地图 真实数据

parent 49e2ad4f
...@@ -37,23 +37,26 @@ public class HomeDashboardRespVO { ...@@ -37,23 +37,26 @@ public class HomeDashboardRespVO {
@Schema(description = "用户管理数据(key: d/m/y, value: 对应维度的数据列表)") @Schema(description = "用户管理数据(key: d/m/y, value: 对应维度的数据列表)")
private Map<String, List<UserStatisticsVO>> users; private Map<String, List<UserStatisticsVO>> users;
@Schema(description = "地图数据(按省市统计算力资源)")
private List<MapDataVO> mapData;
/** /**
* 平台总体态势 * 平台总体态势
*/ */
@Schema(description = "平台总体态势") @Schema(description = "平台总体态势")
@Data @Data
public static class OverallSituationVO { public static class OverallSituationVO {
@Schema(description = "算力总规模(PTOPS)") @Schema(description = "算力总规模(TOPS)")
private String allCompute; private String allCompute;
@Schema(description = "已租赁算力(PTOPS)") @Schema(description = "已租赁算力(TOPS)")
private String leaseCompute; private String leaseCompute;
@Schema(description = "算力利用率(%)") @Schema(description = "算力利用率(%)")
private String computeUtilizationRate; private String computeUtilizationRate;
@Schema(description = "运行中任务数") @Schema(description = "闲置算力(TOPS)")
private Integer runningTaskCount; private String idleCompute;
@Schema(description = "GPU总卡数") @Schema(description = "GPU总卡数")
private Long gpuCount; private Long gpuCount;
...@@ -191,4 +194,17 @@ public class HomeDashboardRespVO { ...@@ -191,4 +194,17 @@ public class HomeDashboardRespVO {
@Schema(description = "活跃用户数") @Schema(description = "活跃用户数")
private Integer activeUsersCount; private Integer activeUsersCount;
} }
/**
* 地图数据(按省市统计算力资源)
*/
@Schema(description = "地图数据")
@Data
public static class MapDataVO {
@Schema(description = "省份名称(如:北京市、广东省等)")
private String name;
@Schema(description = "该省份的算力资源值")
private Double value;
}
} }
...@@ -14,15 +14,15 @@ import java.math.BigDecimal; ...@@ -14,15 +14,15 @@ import java.math.BigDecimal;
@Data @Data
public class HomeIndexOverallSituationRespVO { public class HomeIndexOverallSituationRespVO {
@Schema(description = "算力总规模(PTOPS)") @Schema(description = "算力总规模(TOPS)")
private BigDecimal allCompute; private BigDecimal allCompute;
@Schema(description = "已租赁算力(PTOPS)") @Schema(description = "已租赁算力(TOPS)")
private BigDecimal leaseCompute; private BigDecimal leaseCompute;
@Schema(description = "算力利用率(%)") @Schema(description = "算力利用率(%)")
private BigDecimal computeUtilizationRate; private BigDecimal computeUtilizationRate;
@Schema(description = "运行中任务数") @Schema(description = "闲置算力(TOPS)")
private Integer runningTaskCount; private BigDecimal idleCompute;
} }
...@@ -3,6 +3,9 @@ package com.luhu.computility.module.biz.service.home; ...@@ -3,6 +3,9 @@ package com.luhu.computility.module.biz.service.home;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.luhu.computility.framework.common.exception.ServiceException; import com.luhu.computility.framework.common.exception.ServiceException;
import com.luhu.computility.framework.common.pojo.PageResult; import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.ip.core.Area;
import com.luhu.computility.framework.ip.core.enums.AreaTypeEnum;
import com.luhu.computility.framework.ip.core.utils.AreaUtils;
import com.luhu.computility.module.apihub.api.apicalllog.ApiCallLogApi; import com.luhu.computility.module.apihub.api.apicalllog.ApiCallLogApi;
import com.luhu.computility.module.apihub.api.apicalllog.dto.ApiCallLogPageReqDTO; import com.luhu.computility.module.apihub.api.apicalllog.dto.ApiCallLogPageReqDTO;
import com.luhu.computility.module.apihub.api.apicalllog.dto.ApiCallLogRespDTO; import com.luhu.computility.module.apihub.api.apicalllog.dto.ApiCallLogRespDTO;
...@@ -12,20 +15,10 @@ import com.luhu.computility.module.apihub.api.order.ApiHubOrderStatisticsApi; ...@@ -12,20 +15,10 @@ import com.luhu.computility.module.apihub.api.order.ApiHubOrderStatisticsApi;
import com.luhu.computility.module.apihub.api.order.dto.ApiOrderStatisticsDTO; import com.luhu.computility.module.apihub.api.order.dto.ApiOrderStatisticsDTO;
import com.luhu.computility.module.apihub.api.statistics.ApiHubStatisticsApi; import com.luhu.computility.module.apihub.api.statistics.ApiHubStatisticsApi;
import com.luhu.computility.module.apihub.api.statistics.dto.ServiceCapabilityDTO; import com.luhu.computility.module.apihub.api.statistics.dto.ServiceCapabilityDTO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexApiCallsRespVO; import com.luhu.computility.module.biz.controller.admin.home.vo.*;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexComputeDistributionRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexOrdersCountRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexOverallSituationRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeDashboardRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexTopBarRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexUsersCountRespVO;
import com.luhu.computility.module.compute.api.order.ComputeOrderStatisticsApi; import com.luhu.computility.module.compute.api.order.ComputeOrderStatisticsApi;
import com.luhu.computility.module.compute.api.order.ComputeStatisticsApi; import com.luhu.computility.module.compute.api.order.ComputeStatisticsApi;
import com.luhu.computility.module.compute.api.order.dto.ComputeDistributionDTO; import com.luhu.computility.module.compute.api.order.dto.*;
import com.luhu.computility.module.compute.api.order.dto.ComputeOrderStatisticsDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceOrderRespDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceOrderSnapshotStatisticDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceSpuStatisticDTO;
import com.luhu.computility.module.member.controller.admin.user.vo.MemberUserPageReqVO; import com.luhu.computility.module.member.controller.admin.user.vo.MemberUserPageReqVO;
import com.luhu.computility.module.member.dal.dataobject.user.MemberUserDO; import com.luhu.computility.module.member.dal.dataobject.user.MemberUserDO;
import com.luhu.computility.module.member.service.user.MemberUserService; import com.luhu.computility.module.member.service.user.MemberUserService;
...@@ -318,8 +311,11 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -318,8 +311,11 @@ public class HomeIndexServiceImpl implements HomeIndexService {
result.setComputeUtilizationRate(BigDecimal.ZERO); result.setComputeUtilizationRate(BigDecimal.ZERO);
} }
// 6. 运行中任务数(暂时写死为 40) // 6. 闲置算力 = 总算力 - 已租赁算力(保留2位小数)
result.setRunningTaskCount(40); BigDecimal idleCompute = BigDecimal.valueOf(resourceSpuStatisticDTO.getTotalCompute())
.subtract(BigDecimal.valueOf(resourceOrderSnapshotStatisticDTO.getTotalCompute()))
.setScale(2, RoundingMode.HALF_UP);
result.setIdleCompute(idleCompute);
return result; return result;
} }
...@@ -533,13 +529,13 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -533,13 +529,13 @@ public class HomeIndexServiceImpl implements HomeIndexService {
public HomeDashboardRespVO getAllDashboardData() { public HomeDashboardRespVO getAllDashboardData() {
HomeDashboardRespVO result = new HomeDashboardRespVO(); HomeDashboardRespVO result = new HomeDashboardRespVO();
// 1. 平台总体态势(算力总规模、已租赁算力、算力利用率、运行中任务数 // 1. 平台总体态势(算力总规模、已租赁算力、算力利用率、闲置算力
HomeIndexOverallSituationRespVO overallSituation = getOverallSituation(); HomeIndexOverallSituationRespVO overallSituation = getOverallSituation();
HomeDashboardRespVO.OverallSituationVO overallSituationVO = new HomeDashboardRespVO.OverallSituationVO(); HomeDashboardRespVO.OverallSituationVO overallSituationVO = new HomeDashboardRespVO.OverallSituationVO();
overallSituationVO.setAllCompute(overallSituation.getAllCompute().toString()); overallSituationVO.setAllCompute(overallSituation.getAllCompute().toString());
overallSituationVO.setLeaseCompute(overallSituation.getLeaseCompute().toString()); overallSituationVO.setLeaseCompute(overallSituation.getLeaseCompute().toString());
overallSituationVO.setComputeUtilizationRate(overallSituation.getComputeUtilizationRate().toString()); overallSituationVO.setComputeUtilizationRate(overallSituation.getComputeUtilizationRate().toString());
overallSituationVO.setRunningTaskCount(overallSituation.getRunningTaskCount()); overallSituationVO.setIdleCompute(overallSituation.getIdleCompute().toString());
result.setOverallSituation(overallSituationVO); result.setOverallSituation(overallSituationVO);
// 2. 算力资源结构分布(GPU型号分布、算力来源分布、计算资源分布) // 2. 算力资源结构分布(GPU型号分布、算力来源分布、计算资源分布)
...@@ -586,6 +582,10 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -586,6 +582,10 @@ public class HomeIndexServiceImpl implements HomeIndexService {
// 7. 轮播数据(月度应用和模型服务数据,暂时返回空列表) // 7. 轮播数据(月度应用和模型服务数据,暂时返回空列表)
result.setCarouselItems(new ArrayList<>()); result.setCarouselItems(new ArrayList<>());
// 8. 地图数据(按省市统计算力资源)
List<HomeDashboardRespVO.MapDataVO> mapData = getMapData();
result.setMapData(mapData);
return result; return result;
} }
...@@ -659,4 +659,53 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -659,4 +659,53 @@ public class HomeIndexServiceImpl implements HomeIndexService {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
/**
* 获取地图数据(按省市统计算力资源)
* 使用若依官方的 AreaUtils 根据 areaId 获取省级信息
*
* @return 地图数据列表,包含省份名称和对应的算力总值
*/
private List<HomeDashboardRespVO.MapDataVO> getMapData() {
// 获取所有资源的地区信息和算力值
ResourceAreaInfoDTO areaInfo = computeStatisticsApi.getAllResourceAreaIds();
if (areaInfo == null || CollectionUtils.isEmpty(areaInfo.getItems())) {
return new ArrayList<>();
}
// 用于统计每个省份的算力总值
Map<String, Double> provinceComputeMap = new HashMap<>();
// 遍历所有资源,按省份累加算力值
for (ResourceAreaInfoDTO.ResourceAreaItem item : areaInfo.getItems()) {
Integer areaId = item.getAreaId();
Double compute = item.getCompute();
// 只处理有地区ID和算力值的资源
if (areaId != null && compute != null) {
// 使用若依官方的 AreaUtils 根据 areaId 获取省级ID
Integer provinceId = AreaUtils.getParentIdByType(areaId, AreaTypeEnum.PROVINCE);
if (provinceId != null) {
// 根据省级ID获取省级信息
Area province = AreaUtils.getArea(provinceId);
if (province != null) {
String provinceName = province.getName();
// 累加算力值:如果省份不存在则放入新值,如果存在则加上新算力值
provinceComputeMap.merge(provinceName, compute, Double::sum);
}
}
}
}
// 转换为地图数据格式(省份名称 + 算力总值)
return provinceComputeMap.entrySet().stream()
.map(entry -> {
HomeDashboardRespVO.MapDataVO vo = new HomeDashboardRespVO.MapDataVO();
vo.setName(entry.getKey()); // 省份名称
vo.setValue(entry.getValue()); // 算力总值
return vo;
})
.collect(Collectors.toList());
}
} }
...@@ -3,6 +3,9 @@ package com.luhu.computility.module.compute.api.order; ...@@ -3,6 +3,9 @@ package com.luhu.computility.module.compute.api.order;
import com.luhu.computility.module.compute.api.order.dto.ComputeDistributionDTO; import com.luhu.computility.module.compute.api.order.dto.ComputeDistributionDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceOrderSnapshotStatisticDTO; import com.luhu.computility.module.compute.api.order.dto.ResourceOrderSnapshotStatisticDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceSpuStatisticDTO; import com.luhu.computility.module.compute.api.order.dto.ResourceSpuStatisticDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceAreaInfoDTO;
import java.util.List;
/** /**
* 算力资源订单统计API接口 * 算力资源订单统计API接口
...@@ -17,4 +20,10 @@ public interface ComputeStatisticsApi { ...@@ -17,4 +20,10 @@ public interface ComputeStatisticsApi {
ResourceSpuStatisticDTO getAllCompute(); ResourceSpuStatisticDTO getAllCompute();
ComputeDistributionDTO getComputeDistribution(); ComputeDistributionDTO getComputeDistribution();
/**
* 获取所有资源的地区ID列表
* @return 资源地区信息
*/
ResourceAreaInfoDTO getAllResourceAreaIds();
} }
package com.luhu.computility.module.compute.api.order.dto;
import lombok.Data;
import java.util.List;
/**
* 资源地区信息 DTO
* 用于大屏地图统计
*/
@Data
public class ResourceAreaInfoDTO {
/**
* 资源地区信息列表
*/
private List<ResourceAreaItem> items;
/**
* 资源地区信息项
*/
@Data
public static class ResourceAreaItem {
/**
* 地区ID
*/
private Integer areaId;
/**
* 算力值
*/
private Double compute;
}
}
\ No newline at end of file
...@@ -61,6 +61,9 @@ public class ResourceSpuPageReqVO extends PageParam { ...@@ -61,6 +61,9 @@ public class ResourceSpuPageReqVO extends PageParam {
@Schema(description = "服务器所在地") @Schema(description = "服务器所在地")
private String location; private String location;
@Schema(description = "地区ID(关联 area.csv)", example = "620500")
private Integer areaId;
@Schema(description = "状态(0 下架,1 上架,2 回收)", example = "1") @Schema(description = "状态(0 下架,1 上架,2 回收)", example = "1")
private Integer status; private Integer status;
......
...@@ -100,6 +100,9 @@ public class ResourceSpuRespVO { ...@@ -100,6 +100,9 @@ public class ResourceSpuRespVO {
@ExcelProperty("服务器所在地") @ExcelProperty("服务器所在地")
private String location; private String location;
@Schema(description = "地区ID(关联 area.csv)", example = "620500")
private Integer areaId;
@Schema(description = "状态(0 下架,1 上架,2 回收)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "状态(0 下架,1 上架,2 回收)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("状态(0 下架,1 上架,2 回收)") @ExcelProperty("状态(0 下架,1 上架,2 回收)")
private Integer status; private Integer status;
......
...@@ -87,6 +87,9 @@ public class ResourceSpuSaveReqVO { ...@@ -87,6 +87,9 @@ public class ResourceSpuSaveReqVO {
@Schema(description = "服务器所在地") @Schema(description = "服务器所在地")
private String location; private String location;
@Schema(description = "地区ID(关联 area.csv)", example = "620500")
private Integer areaId;
@Schema(description = "状态(0 下架,1 上架,2 回收)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "状态(0 下架,1 上架,2 回收)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态(0 下架,1 上架,2 回收)不能为空") @NotNull(message = "状态(0 下架,1 上架,2 回收)不能为空")
private Integer status; private Integer status;
......
...@@ -112,6 +112,10 @@ public class ResourceSpuDO extends BaseDO { ...@@ -112,6 +112,10 @@ public class ResourceSpuDO extends BaseDO {
*/ */
private String location; private String location;
/** /**
* 地区ID(关联 area.csv,通过 AreaUtils 获取省市区信息)
*/
private Integer areaId;
/**
* 状态(0 下架,1 上架,2 回收) * 状态(0 下架,1 上架,2 回收)
*/ */
private Integer status; private Integer status;
......
...@@ -4,6 +4,7 @@ import com.luhu.computility.module.compute.api.order.ComputeStatisticsApi; ...@@ -4,6 +4,7 @@ import com.luhu.computility.module.compute.api.order.ComputeStatisticsApi;
import com.luhu.computility.module.compute.api.order.dto.ComputeDistributionDTO; import com.luhu.computility.module.compute.api.order.dto.ComputeDistributionDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceOrderSnapshotStatisticDTO; import com.luhu.computility.module.compute.api.order.dto.ResourceOrderSnapshotStatisticDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceSpuStatisticDTO; import com.luhu.computility.module.compute.api.order.dto.ResourceSpuStatisticDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceAreaInfoDTO;
import com.luhu.computility.module.compute.dal.dataobject.resourcecategory.ResourceCategoryDO; import com.luhu.computility.module.compute.dal.dataobject.resourcecategory.ResourceCategoryDO;
import com.luhu.computility.module.compute.dal.dataobject.resourcespu.ResourceSpuDO; import com.luhu.computility.module.compute.dal.dataobject.resourcespu.ResourceSpuDO;
import com.luhu.computility.module.compute.dal.mysql.resourcecategory.ResourceCategoryMapper; import com.luhu.computility.module.compute.dal.mysql.resourcecategory.ResourceCategoryMapper;
...@@ -119,4 +120,25 @@ public class ComputeStatisticsApiImpl implements ComputeStatisticsApi { ...@@ -119,4 +120,25 @@ public class ComputeStatisticsApiImpl implements ComputeStatisticsApi {
return result; return result;
} }
@Override
public ResourceAreaInfoDTO getAllResourceAreaIds() {
// 查询所有算力资源
List<ResourceSpuDO> spuList = resourceSpuMapper.selectList();
ResourceAreaInfoDTO result = new ResourceAreaInfoDTO();
// 提取每个资源的地区ID和算力值,用于地图统计
List<ResourceAreaInfoDTO.ResourceAreaItem> items = spuList.stream()
.filter(spu -> spu.getAreaId() != null) // 只处理有地区ID的资源
.map(spu -> {
ResourceAreaInfoDTO.ResourceAreaItem item = new ResourceAreaInfoDTO.ResourceAreaItem();
item.setAreaId(spu.getAreaId()); // 地区ID
item.setCompute(spu.getCompute()); // 算力值
return item;
})
.collect(Collectors.toList());
result.setItems(items);
return result;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment