diff --git a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/ReportService.java b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/ReportService.java index ecc2acc..6c62a15 100644 --- a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/ReportService.java +++ b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/ReportService.java @@ -8,6 +8,8 @@ import cn.craftlabs.platform.api.persistence.contract.PlatformContractLineMapper import cn.craftlabs.platform.api.persistence.contract.PlatformContractMapper; import cn.craftlabs.platform.api.persistence.customer.PlatformCustomer; import cn.craftlabs.platform.api.persistence.customer.PlatformCustomerMapper; +import cn.craftlabs.platform.api.persistence.delivery.PlatformDeliveryBatch; +import cn.craftlabs.platform.api.persistence.delivery.PlatformDeliveryBatchMapper; import cn.craftlabs.platform.api.persistence.license.PlatformLicenseSn; import cn.craftlabs.platform.api.persistence.license.PlatformLicenseSnMapper; import cn.craftlabs.platform.api.persistence.project.PlatformProject; @@ -35,6 +37,7 @@ public class ReportService { private final PlatformCallbackInboxMapper callbackInboxMapper; private final PlatformProjectMapper projectMapper; private final PlatformCustomerMapper customerMapper; + private final PlatformDeliveryBatchMapper deliveryBatchMapper; public ReportService( PlatformContractMapper contractMapper, @@ -42,13 +45,15 @@ public class ReportService { PlatformLicenseSnMapper licenseSnMapper, PlatformCallbackInboxMapper callbackInboxMapper, PlatformProjectMapper projectMapper, - PlatformCustomerMapper customerMapper) { + PlatformCustomerMapper customerMapper, + PlatformDeliveryBatchMapper deliveryBatchMapper) { this.contractMapper = contractMapper; this.contractLineMapper = contractLineMapper; this.licenseSnMapper = licenseSnMapper; this.callbackInboxMapper = callbackInboxMapper; this.projectMapper = projectMapper; this.customerMapper = customerMapper; + this.deliveryBatchMapper = deliveryBatchMapper; } @Transactional(readOnly = true) @@ -118,7 +123,43 @@ public class ReportService { @Transactional(readOnly = true) public List getProjectHealth() { - return new ArrayList<>(); + List projects = projectMapper.selectList(null); + return projects.stream().map(project -> { + ProjectHealthRow row = new ProjectHealthRow(); + row.setProjectId(project.getId()); + row.setProjectName(project.getName()); + + LambdaQueryWrapper deliveryQuery = Wrappers.lambdaQuery(PlatformDeliveryBatch.class) + .eq(PlatformDeliveryBatch::getProjectId, project.getId()); + List batches = deliveryBatchMapper.selectList(deliveryQuery); + long totalBatches = batches.size(); + long deliveredBatches = batches.stream().filter(b -> "DELIVERED".equals(b.getStatus())).count(); + double deliveryRate = totalBatches > 0 ? deliveredBatches * 100.0 / totalBatches : 0; + + LambdaQueryWrapper snQuery = Wrappers.lambdaQuery(PlatformLicenseSn.class) + .eq(PlatformLicenseSn::getProjectId, project.getId()); + List sns = licenseSnMapper.selectList(snQuery); + long totalSns = sns.size(); + long activatedSns = sns.stream().filter(sn -> "ACTIVATED".equals(sn.getStatus())).count(); + double activationRate = totalSns > 0 ? activatedSns * 100.0 / totalSns : 0; + double snIssuedRate = totalSns > 0 ? 100.0 : 0; + + row.setDeliveryRate(deliveryRate); + row.setSnIssuedRate(snIssuedRate); + row.setActivationRate(activationRate); + + String healthLevel; + if (deliveryRate < 50 || activationRate < 50) { + healthLevel = "RED"; + } else if (deliveryRate < 80 || activationRate < 80) { + healthLevel = "YELLOW"; + } else { + healthLevel = "GREEN"; + } + row.setHealthLevel(healthLevel); + + return row; + }).collect(Collectors.toList()); } private String resolveCustomerName(Long customerId) {