Commit 9d6be529 by lijinqi

大屏 平台态势总览 接口完成

parent e1c58c98
......@@ -2,7 +2,9 @@ package com.luhu.computility.module.biz.controller.admin.home;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexApiCallsRespVO;
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.HomeIndexTopBarRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexUsersCountRespVO;
import com.luhu.computility.module.biz.service.home.HomeIndexService;
......@@ -14,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import java.util.List;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
......@@ -60,5 +63,21 @@ public class HomeIndexController {
public CommonResult<HomeIndexTopBarRespVO> getTopBarData(){
return success(homeIndexService.getTopBarData());
}
@GetMapping("/getOverallSituation")
@Operation(summary = "获取平台总体态势")
@PermitAll
public CommonResult<HomeIndexOverallSituationRespVO> getOverallSituation() {
return success(homeIndexService.getOverallSituation());
}
@GetMapping("/getComputeDistribution")
@Operation(summary = "算力资源分布")
public CommonResult<HomeIndexComputeDistributionRespVO> getComputeDistribution(String type) {
return success(homeIndexService.getComputeDistribution(type));
}
}
package com.luhu.computility.module.biz.controller.admin.home.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* @Author: lijinqi
* @Date : 2026/01/13 17:00
* @VERSION v1.0
*/
@Schema(description = "管理后台 - 首页/算力资源分布RespVO")
@Data
public class HomeIndexComputeDistributionRespVO {
@Schema(description = "gpu结构分布")
private List<ComputeDistribution> gpu;
@Schema(description = "算力来源分布")
private List<ComputeDistribution> source;
@Schema(description = "计算资源分布")
private List<ComputeDistribution> resource;
class ComputeDistribution{
private String name;
private double value;
}
}
package com.luhu.computility.module.biz.controller.admin.home.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* @Author: lijinqi
* @Date : 2026/01/13 17:00
* @VERSION v1.0
*/
@Schema(description = "管理后台 - 首页/平台总体态势RespVO")
@Data
public class HomeIndexOverallSituationRespVO {
@Schema(description = "算力总规模")
private BigDecimal allCompute;
@Schema(description = "可租赁算力")
private BigDecimal leaseCompute;
@Schema(description = "已使用算力")
private BigDecimal usedCompute;
@Schema(description = "算力利用率")
private BigDecimal computeUtilizationRate;
@Schema(description = "GPU总卡数")
private Long gpuCount;
@Schema(description = "Cpu总核数")
private Long coreCount;
@Schema(description = "内存总量")
private Long memoryCapacity;
}
package com.luhu.computility.module.biz.service.home;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexApiCallsRespVO;
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.HomeIndexTopBarRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexUsersCountRespVO;
......@@ -22,4 +25,9 @@ public interface HomeIndexService {
List<HomeIndexApiCallsRespVO> getApiCallsData(String dateType);
HomeIndexTopBarRespVO getTopBarData();
HomeIndexOverallSituationRespVO getOverallSituation();
HomeIndexComputeDistributionRespVO getComputeDistribution(String type);
}
......@@ -7,29 +7,32 @@ 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.ApiCallLogRespDTO;
import com.luhu.computility.module.apihub.api.apiorder.ApiOrderApi;
import com.luhu.computility.module.apihub.api.apiorder.dto.ApiOrderPageReqDTO;
import com.luhu.computility.module.apihub.api.apiorder.dto.ApiOrderRespDTO;
import com.luhu.computility.module.apihub.api.order.ApiHubOrderStatisticsApi;
import com.luhu.computility.module.apihub.api.order.dto.ApiOrderStatisticsDTO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexApiCallsRespVO;
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.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.ComputeStatisticsApi;
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.dal.dataobject.user.MemberUserDO;
import com.luhu.computility.module.member.service.user.MemberUserService;
import com.luhu.computility.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
import com.luhu.computility.module.trade.dal.dataobject.order.TradeOrderDO;
import com.luhu.computility.module.trade.enums.order.TradeOrderStatusEnum;
import com.luhu.computility.module.trade.service.order.TradeOrderQueryService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
......@@ -57,6 +60,8 @@ public class HomeIndexServiceImpl implements HomeIndexService {
ApiOrderApi apiOrderApi;
@Resource
ApiCallLogApi apiCallLogApi;
@Resource
ComputeStatisticsApi computeStatisticsApi;
@Override
public List<HomeIndexUsersCountRespVO> getRegisterUsersCount() {
......@@ -280,6 +285,29 @@ public class HomeIndexServiceImpl implements HomeIndexService {
}
@Override
public HomeIndexOverallSituationRespVO getOverallSituation() {
ResourceSpuStatisticDTO resourceSpuStatisticDTO = computeStatisticsApi.getAllCompute();
ResourceOrderSnapshotStatisticDTO resourceOrderSnapshotStatisticDTO =
computeStatisticsApi.queryResourceOrderSnapshotStatistic();
HomeIndexOverallSituationRespVO homeIndexOverallSituation = new HomeIndexOverallSituationRespVO();
homeIndexOverallSituation.setAllCompute(BigDecimal.valueOf(resourceSpuStatisticDTO.getTotalCompute()).setScale(2) );
homeIndexOverallSituation.setCoreCount(resourceSpuStatisticDTO.getTotalCoreCount());
homeIndexOverallSituation.setGpuCount(resourceSpuStatisticDTO.getTotalGpuCount());
homeIndexOverallSituation.setMemoryCapacity(resourceSpuStatisticDTO.getTotalMemoryCapacity());
homeIndexOverallSituation.setUsedCompute(BigDecimal.valueOf(resourceOrderSnapshotStatisticDTO.getTotalCompute()).setScale(2));
homeIndexOverallSituation.setLeaseCompute(BigDecimal.valueOf(resourceSpuStatisticDTO.getTotalCompute()- resourceOrderSnapshotStatisticDTO.getTotalCompute()).setScale(2));
//百分比 不带% 前端展示+%即可
homeIndexOverallSituation.setComputeUtilizationRate(BigDecimal.valueOf(resourceOrderSnapshotStatisticDTO.getTotalCompute()/resourceSpuStatisticDTO.getTotalCompute()).multiply(BigDecimal.valueOf(100))
.setScale(2, RoundingMode.HALF_UP));
return homeIndexOverallSituation;
}
@Override
public HomeIndexComputeDistributionRespVO getComputeDistribution(String type) {
return null;
}
@Override
public List<HomeIndexOrdersCountRespVO> getOrdersData(String dateType) {
LocalDate today = LocalDate.now();
LocalDateTime endTime = null;
......@@ -454,4 +482,7 @@ public class HomeIndexServiceImpl implements HomeIndexService {
}
throw new ServiceException("无效的统计时间类型:" + dateType);
}
}
......@@ -24,4 +24,5 @@ public interface ComputeOrderStatisticsApi {
List<ResourceOrderRespDTO> getPaidOrderList(LocalDateTime[] timeRange);
}
package com.luhu.computility.module.compute.api.order;
import com.luhu.computility.module.compute.api.order.dto.ResourceOrderSnapshotStatisticDTO;
import com.luhu.computility.module.compute.api.order.dto.ResourceSpuStatisticDTO;
/**
* 算力资源订单统计API接口
*
* @author jony
*/
public interface ComputeStatisticsApi {
ResourceOrderSnapshotStatisticDTO queryResourceOrderSnapshotStatistic();
ResourceSpuStatisticDTO getAllCompute();
}
package com.luhu.computility.module.compute.api.order.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ResourceOrderSnapshotStatisticDTO {
private Double totalCompute;
private Long totalGpuCount;
private Long totalCoreCount;
private Long totalMemoryCapacity;
}
package com.luhu.computility.module.compute.api.order.dto;
import lombok.Data;
@Data
public class ResourceSpuStatisticDTO {
private Double totalCompute;
private Long totalGpuCount;
private Long totalCoreCount;
private Long totalMemoryCapacity;
}
......@@ -28,6 +28,18 @@ public class ResourceSpuRespVO {
@ExcelProperty("GPU配置")
private String gpu;
@Schema(description = "算力")
private Double compute;
@Schema(description = "GPU数量")
private Integer gpuCount;
@Schema(description = "CPU核心数")
private Integer coreCount;
@Schema(description = "内存容量")
private Integer memoryCapacity;
@Schema(description = "内存配置", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("内存配置")
private String ram;
......
......@@ -23,6 +23,18 @@ public class ResourceSpuSaveReqVO {
@Schema(description = "GPU配置")
private String gpu;
@Schema(description = "算力")
private Double compute;
@Schema(description = "GPU数量")
private Integer gpuCount;
@Schema(description = "CPU核心数")
private Integer coreCount;
@Schema(description = "内存容量")
private Integer memoryCapacity;
@Schema(description = "内存配置", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "内存配置不能为空")
private String ram;
......
......@@ -36,6 +36,26 @@ public class AppResourceOrderSnapshotSaveReqVO {
@NotBlank(message = "内存配置不能为空")
private String ram;
@Schema(description = "算力", requiredMode = Schema.RequiredMode.REQUIRED, example = "222.22")
@NotBlank(message = "算力不能为空")
private Double compute;
@Schema(description = "GPU卡数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8")
@NotBlank(message = "GPU卡数量不能为空")
private Long gpuCount;
@Schema(description = "CPU核数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8")
@NotBlank(message = "CPU核数")
private Long coreCount;
@Schema(description = "内存大小", requiredMode = Schema.RequiredMode.REQUIRED, example = "64")
@NotBlank(message = "内存大小不能为空")
private Long memoryCapacity;
@Schema(description = "服务器位置", requiredMode = Schema.RequiredMode.REQUIRED, example = "长沙")
@NotBlank(message = "服务器位置不能为空")
private String location;
@Schema(description = "存储配置", requiredMode = Schema.RequiredMode.REQUIRED, example = "2TB NVMe SSD")
@NotBlank(message = "存储配置不能为空")
private String storage;
......
......@@ -52,7 +52,22 @@ public class ResourceOrderSnapshotDO extends BaseDO {
* GPU配置快照
*/
private String gpu;
/**
* 算力
*/
private Double compute;
/**
* GPU数量
*/
private Integer gpuCount;
/**
* CPU核心数
*/
private Integer coreCount;
/**
* 内存容量
*/
private Integer memoryCapacity;
/**
* 内存配置快照
*/
......
......@@ -40,6 +40,22 @@ public class ResourceSpuDO extends BaseDO {
*/
private String gpu;
/**
* 算力
*/
private Double compute;
/**
* GPU数量
*/
private Long gpuCount;
/**
* CPU核心数
*/
private Long coreCount;
/**
* 内存容量
*/
private Long memoryCapacity;
/**
* 内存配置
*/
private String ram;
......
package com.luhu.computility.module.compute.dal.mysql.resourceordersnapshot;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.module.compute.api.order.dto.ResourceOrderSnapshotStatisticDTO;
import com.luhu.computility.module.compute.dal.dataobject.resourceordersnapshot.ResourceOrderSnapshotDO;
import com.luhu.computility.module.compute.controller.app.resourceordersnapshot.vo.AppResourceOrderSnapshotRespVO;
import com.luhu.computility.module.compute.controller.app.resourceordersnapshot.vo.AppResourceOrderSnapshotPageReqVO;
import com.luhu.computility.module.compute.dal.dataobject.resourcespu.ResourceSpuDO;
import com.luhu.computility.module.member.dal.dataobject.user.MemberUserDO;
import org.apache.ibatis.annotations.Mapper;
......@@ -67,4 +72,39 @@ public interface ResourceOrderSnapshotMapper extends BaseMapperX<ResourceOrderSn
.eq(ResourceOrderSnapshotDO::getOrderId, orderId));
}
default ResourceOrderSnapshotStatisticDTO queryResourceOrderSnapshotStatistic() {
ResourceOrderSnapshotStatisticDTO resp = new ResourceOrderSnapshotStatisticDTO();
// SQL sum 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<ResourceOrderSnapshotDO>()
.select("IFNULL(SUM(compute), 0) as totalCompute, IFNULL(SUM(gpu_count), 0) as totalGpuCount, " +
"IFNULL(SUM(core_count), 0) as totalCoreCount, IFNULL(SUM(memory_capacity), 0) as totalMemoryCapacity"));
if (!result.isEmpty()) {
// compute -> BigDecimal,保留两位小数
Map<String, Object> row = result.get(0);
//算力(保留 2 位)
BigDecimal compute = getBigDecimal(row, "totalCompute")
.setScale(2, RoundingMode.HALF_UP);
//强烈建议:VO 用 BigDecimal
resp.setTotalCompute(compute.doubleValue());
//GPU 数量
resp.setTotalGpuCount( getBigDecimal(row, "totalGpuCount").longValue() );
//CPU 核心数
resp.setTotalCoreCount( getBigDecimal(row, "totalCoreCount").longValue() );
//内存容量
resp.setTotalMemoryCapacity( getBigDecimal(row, "totalMemoryCapacity").longValue());
}
return resp;
}
static BigDecimal getBigDecimal(Map<String, Object> map, String key) {
Object val = map.get(key);
return val == null ? BigDecimal.ZERO : (BigDecimal) val;
}
}
package com.luhu.computility.module.compute.dal.mysql.resourcespu;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.luhu.computility.module.compute.api.order.dto.ResourceSpuStatisticDTO;
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.mysql.resourcecategory.ResourceCategoryMapper;
......@@ -45,5 +49,39 @@ public interface ResourceSpuMapper extends BaseMapperX<ResourceSpuDO> {
.orderByDesc(ResourceSpuDO::getId));
}
default ResourceSpuStatisticDTO selectResourceSpuStatistic() {
ResourceSpuStatisticDTO resp = new ResourceSpuStatisticDTO();
// SQL sum 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<ResourceSpuDO>()
.select("IFNULL(SUM(compute), 0) as totalCompute, IFNULL(SUM(gpu_count), 0) as totalGpuCount, " +
"IFNULL(SUM(core_count), 0) as totalCoreCount, IFNULL(SUM(memory_capacity), 0) as totalMemoryCapacity"));
if (!result.isEmpty()) {
// compute -> BigDecimal,保留两位小数
Map<String, Object> row = result.get(0);
//算力(保留 2 位)
BigDecimal compute = getBigDecimal(row, "totalCompute")
.setScale(2, RoundingMode.HALF_UP);
//强烈建议:VO 用 BigDecimal
resp.setTotalCompute(compute.doubleValue());
//GPU 数量
resp.setTotalGpuCount( getBigDecimal(row, "totalGpuCount").longValue() );
//CPU 核心数
resp.setTotalCoreCount( getBigDecimal(row, "totalCoreCount").longValue() );
//内存容量
resp.setTotalMemoryCapacity( getBigDecimal(row, "totalMemoryCapacity").longValue());
}
return resp;
}
static BigDecimal getBigDecimal(Map<String, Object> map, String key) {
Object val = map.get(key);
return val == null ? BigDecimal.ZERO : (BigDecimal) val;
}
}
package com.luhu.computility.module.compute.service.impl;
import com.luhu.computility.module.compute.api.order.ComputeStatisticsApi;
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.dal.mysql.resourceordersnapshot.ResourceOrderSnapshotMapper;
import com.luhu.computility.module.compute.dal.mysql.resourcespu.ResourceSpuMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 算力资源订单统计API实现类
*
* @author jony
*/
@Service
@Slf4j
public class ComputeStatisticsApiImpl implements ComputeStatisticsApi {
@Resource
private ResourceOrderSnapshotMapper resourceOrderSnapshotMapper;
@Resource
private ResourceSpuMapper resourceSpuMapper;
@Override
public ResourceSpuStatisticDTO getAllCompute() {
return resourceSpuMapper.selectResourceSpuStatistic();
}
@Override
public ResourceOrderSnapshotStatisticDTO queryResourceOrderSnapshotStatistic() {
return resourceOrderSnapshotMapper.queryResourceOrderSnapshotStatistic();
}
}
......@@ -842,6 +842,11 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
createReqVO.setStorage(spu.getStorage());
createReqVO.setPowerSupply(spu.getPowerSupply());
createReqVO.setNic(spu.getNic());
createReqVO.setGpuCount(spu.getGpuCount());
createReqVO.setCompute(spu.getCompute());
createReqVO.setCoreCount(spu.getCoreCount());
createReqVO.setMemoryCapacity(spu.getMemoryCapacity());
createReqVO.setLocation(spu.getLocation());
createReqVO.setIp(spu.getIp());
createReqVO.setSpuName(spu.getName());
createReqVO.setDurationDays(sku.getDurationDays());
......
......@@ -59,13 +59,13 @@ spring:
#username: root
#password: 159357 # D7kaJdNdLsjzXGhD
#url: jdbc:mysql://43.139.100.220:13306/new_computility?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
#username: root
#password: D7kaJdNdLsjzXGhD
url: jdbc:mysql://8.136.9.68:3306/new_computility?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
url: jdbc:mysql://43.139.100.220:13306/new_computility?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
username: root
password: Luchuan@123
password: D7kaJdNdLsjzXGhD
# url: jdbc:mysql://8.136.9.68:3306/new_computility?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
# username: root
# password: Luchuan@123
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
redis:
host: 127.0.0.1 # 地址
......
......@@ -390,11 +390,11 @@ digital-human-zhuxi:
token: Basic emh1eGlAdHhnOndBSmNETDRMZVZ3QjlhdlV1OVJN
similar-image:
base-url: http://117.157.192.95:8082/appDemo
base-url: https://218.77.58.42:18088/
match-mage: ${similar-image.base-url}/matchImage
swap-face:
base-url: http://117.157.192.95:8082/appDemo
base-url: https://218.77.58.42:18088/
upload-image: ${swap-face.base-url}/uploadFaceSwapImage
create-video-stream: ${swap-face.base-url}/reActorFaceSwap
view-video: ${swap-face.base-url}/viewVideo
......
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