package tech.powerjob.server.web.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import tech.powerjob.common.OmsConstant; import tech.powerjob.common.enums.InstanceStatus; import tech.powerjob.common.response.ResultDTO; import tech.powerjob.server.auth.Permission; import tech.powerjob.server.auth.RoleScope; import tech.powerjob.server.auth.interceptor.ApiPermission; import tech.powerjob.common.enums.SwitchableStatus; import tech.powerjob.server.common.module.WorkerInfo; import tech.powerjob.server.persistence.remote.model.AppInfoDO; import tech.powerjob.server.persistence.remote.repository.AppInfoRepository; import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository; import tech.powerjob.server.persistence.remote.repository.JobInfoRepository; import tech.powerjob.server.remote.server.self.ServerInfoService; import tech.powerjob.server.remote.worker.WorkerClusterQueryService; import tech.powerjob.server.web.response.SystemOverviewVO; import tech.powerjob.server.web.response.WorkerStatusVO; import java.util.Date; import java.util.List; import java.util.Optional; import java.util.TimeZone; import java.util.stream.Collectors; /** * 系统信息控制器(服务于前端首页) * * @author tjq * @since 2020/4/14 */ @Slf4j @RestController @RequestMapping("/system") @RequiredArgsConstructor public class SystemInfoController { private final AppInfoRepository appInfoRepository; private final JobInfoRepository jobInfoRepository; private final InstanceInfoRepository instanceInfoRepository; private final ServerInfoService serverInfoService; private final WorkerClusterQueryService workerClusterQueryService; @GetMapping("/listWorker") @ApiPermission(name = "System-ListWorker", roleScope = RoleScope.APP, requiredPermission = Permission.READ) public ResultDTO> listWorker(Long appId) { List workerInfos = workerClusterQueryService.getAllWorkers(appId); return ResultDTO.success(workerInfos.stream().map(WorkerStatusVO::new).collect(Collectors.toList())); } @GetMapping("/overview") @ApiPermission(name = "System-Overview", roleScope = RoleScope.APP, requiredPermission = Permission.READ) public ResultDTO getSystemOverview(Long appId) { SystemOverviewVO overview = new SystemOverviewVO(); Optional appInfoOpt = appInfoRepository.findById(appId); if (appInfoOpt.isPresent()) { AppInfoDO appInfo = appInfoOpt.get(); overview.setAppId(appId); overview.setAppName(appInfo.getAppName()); } // 总任务数量 overview.setJobCount(jobInfoRepository.countByAppIdAndStatusNot(appId, SwitchableStatus.DELETED.getV())); // 运行任务数 overview.setRunningInstanceCount(instanceInfoRepository.countByAppIdAndStatus(appId, InstanceStatus.RUNNING.getV())); // 近期失败任务数(24H内) Date date = DateUtils.addDays(new Date(), -1); overview.setFailedInstanceCount(instanceInfoRepository.countByAppIdAndStatusAndGmtCreateAfter(appId, InstanceStatus.FAILED.getV(), date)); // 服务器时区 overview.setTimezone(TimeZone.getDefault().getDisplayName()); // 服务器时间 overview.setServerTime(DateFormatUtils.format(new Date(), OmsConstant.TIME_PATTERN)); overview.setWebServerInfo(serverInfoService.fetchCurrentServerInfo()); overview.setScheduleServerInfo(serverInfoService.fetchAppServerInfo(appId)); return ResultDTO.success(overview); } }