diff --git a/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java b/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java index 6ef03b50..dcbe6ea6 100644 --- a/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java +++ b/renren-admin/src/main/java/io/renren/common/controller/CensusControllerV2.java @@ -1,10 +1,13 @@ package io.renren.common.controller; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.renren.common.annotation.LogOperation; +import io.renren.common.constant.Constant; +import io.renren.common.domain.Tsingtao_xhaProperties; import io.renren.common.utils.Result; import io.renren.modules.processForm.service.TAbilityApplicationService; import io.renren.modules.resource.service.ResourceService; @@ -14,6 +17,9 @@ import io.renren.modules.sys.service.SysDeptService; import io.renren.modules.sys.service.SysUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,6 +40,8 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/census/center/v2") public class CensusControllerV2 { + @Value("${project.place}") + private Integer projectPlace; private static final Logger logger = LoggerFactory.getLogger(CensusControllerV2.class); @Autowired @@ -49,6 +57,8 @@ public class CensusControllerV2 { @Autowired private JdbcTemplate jdbcTemplate; + @Autowired + private Tsingtao_xhaProperties tsingtao_xhaProperties; @Value("${census.type}") private String[] censusTypes; // 需要进行统计的资源类型 @@ -297,4 +307,92 @@ public class CensusControllerV2 { return new Result().ok(resourceService.componentServiceRank(type)); } + @GetMapping("/infrastructureInfo") + @ApiOperation("基础设施简况") + @LogOperation("基础设施简况") + public Result>> infrastructureInfo() { + List> result = new CopyOnWriteArrayList<>(); + CompletableFuture allAmount = null; + switch (Constant.ProjectPlace.getByFlag(projectPlace)) { + case BAOTOU: { // 包头 + allAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总基础设施数目 + return jdbcTemplate.queryForObject("SELECT COUNT(id) FROM tb_data_resource WHERE type = '基础设施' AND del_flag = 0", Long.class); + }).thenAccept(sum -> { + result.add(new HashMap() { + { + put("amount", sum); + put("type", "视频资源数量"); + } + }); + }); + } + break; + case TSINGTAO: { // 青岛大数据局 + allAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总基础设施数目 + return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM t_camera;", Long.class); + }).thenAccept(sum -> { + result.add(new HashMap() { + { + put("amount", sum); + put("type", "视频资源数量"); + } + }); + }); + } + break; + case TSINGTAO_XHA: { // 青岛西海岸 + allAmount = CompletableFuture.supplyAsync(() -> { // 获取平台总基础设施数目 + List result_ = new CopyOnWriteArrayList<>(); + CompletableFuture cloud = + CompletableFuture.runAsync(() -> { // 云脑专网 + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url(tsingtao_xhaProperties.getCloudcam()).build(); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + JSONObject jsonObject = JSON.parseObject(response.body().string()); + if (jsonObject.containsKey("data")) { + result_.add(jsonObject.getJSONObject("data").getLongValue("total")); + } + } else { + logger.error("包头获取失败"); + } + } catch (Exception exception) { + logger.error("包头失败", exception); + } + }); + CompletableFuture local = + CompletableFuture.runAsync(() -> { // 金宏网 + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url(tsingtao_xhaProperties.getLocalcam()).build(); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + JSONObject jsonObject = JSON.parseObject(response.body().string()); + if (jsonObject.containsKey("data")) { + result_.add(jsonObject.getJSONObject("data").getLongValue("total")); + } + } else { + logger.error("包头获取失败"); + } + } catch (Exception exception) { + logger.error("包头失败", exception); + } + }); + CompletableFuture.allOf(cloud, local); + return result_.stream().filter(index -> index != null).findAny().orElse(0l); + }).thenAccept(sum -> { + result.add(new HashMap() { + { + put("amount", sum); + put("type", "视频资源数量"); + } + }); + }); + } + break; + } + CompletableFuture all = CompletableFuture.allOf(allAmount); + all.join(); + return new Result().ok(result); + } + } diff --git a/renren-admin/src/main/java/io/renren/common/domain/BaoTouProperties.java b/renren-admin/src/main/java/io/renren/common/domain/BaoTouProperties.java new file mode 100644 index 00000000..471b2158 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/common/domain/BaoTouProperties.java @@ -0,0 +1,19 @@ +package io.renren.common.domain; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + + +/** + * 包头区域配置项 + */ +@Data +@Component +@PropertySource("classpath:/domain/baotou.properties") +@ConfigurationProperties(prefix = "baotou") +public class BaoTouProperties { + private String hlsurl; +} diff --git a/renren-admin/src/main/java/io/renren/common/domain/TsingtaoProperties.java b/renren-admin/src/main/java/io/renren/common/domain/TsingtaoProperties.java new file mode 100644 index 00000000..7041bcd8 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/common/domain/TsingtaoProperties.java @@ -0,0 +1,18 @@ +package io.renren.common.domain; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 青岛市区 + */ +@Data +@Component +@PropertySource("classpath:/domain/tsingtao.properties") +@ConfigurationProperties(prefix = "tsingtao") +public class TsingtaoProperties { + +} diff --git a/renren-admin/src/main/java/io/renren/common/domain/Tsingtao_xhaProperties.java b/renren-admin/src/main/java/io/renren/common/domain/Tsingtao_xhaProperties.java new file mode 100644 index 00000000..f816620a --- /dev/null +++ b/renren-admin/src/main/java/io/renren/common/domain/Tsingtao_xhaProperties.java @@ -0,0 +1,19 @@ +package io.renren.common.domain; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 青岛西海岸 + */ +@Data +@Component +@PropertySource("classpath:/domain/tsingtao-xha.properties") +@ConfigurationProperties(prefix = "tsingtao-xha") +public class Tsingtao_xhaProperties { + private String cloudhls; + private String localhls; +} diff --git a/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java b/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java index 7353e579..d29d47e1 100644 --- a/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java +++ b/renren-admin/src/main/java/io/renren/modules/resource/controller/ResourceController.java @@ -13,6 +13,8 @@ import io.renren.common.validator.group.DefaultGroup; import io.renren.modules.resource.dto.ResourceDTO; import io.renren.modules.resource.excel.ResourceExcelImportListener; import io.renren.modules.resource.service.ResourceService; +import io.renren.modules.resource.videoPreview.AbstractVideoPreviewService; +import io.renren.modules.resource.videoPreview.VideoPreviewFactory; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -399,4 +401,15 @@ public class ResourceController { } */ + @GetMapping("getHls") + @ApiOperation("对接知识库数据") + public Result getHls(String key) { + Optional factory = VideoPreviewFactory.build(); + if (factory.isPresent()) { + String hls = factory.get().getHls(key); + return new Result().ok(hls); + } + return null; + } + } \ No newline at end of file diff --git a/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java b/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java index 45888fe0..979c40d5 100644 --- a/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java +++ b/renren-admin/src/main/java/io/renren/modules/resource/service/ResourceService.java @@ -81,4 +81,6 @@ public interface ResourceService extends CrudService(); } } + + @Override + public Integer getProjectPlace() { + return this.projectPlace; + } } \ No newline at end of file diff --git a/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/AbstractVideoPreviewService.java b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/AbstractVideoPreviewService.java new file mode 100644 index 00000000..79f94a8a --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/AbstractVideoPreviewService.java @@ -0,0 +1,16 @@ +package io.renren.modules.resource.videoPreview; + + +/** + * 视频预览抽象类 + */ +public abstract class AbstractVideoPreviewService { + + /** + * 获取hls预览地址 + * + * @param key 获取hls地址的键 + * @return + */ + public abstract String getHls(String key); +} diff --git a/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/VideoPreviewFactory.java b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/VideoPreviewFactory.java new file mode 100644 index 00000000..fdf3fcef --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/VideoPreviewFactory.java @@ -0,0 +1,72 @@ +package io.renren.modules.resource.videoPreview; + + +import io.renren.common.constant.Constant; +import io.renren.common.domain.BaoTouProperties; +import io.renren.common.domain.TsingtaoProperties; +import io.renren.common.domain.Tsingtao_xhaProperties; +import io.renren.common.utils.SpringContextUtils; +import io.renren.modules.monitor.service.MonitorService; +import io.renren.modules.resource.service.ResourceService; +import io.renren.modules.resource.videoPreview.domain.BaoTouVideoPreviewService; +import io.renren.modules.resource.videoPreview.domain.TsingtaoVideoPreviewService; +import io.renren.modules.resource.videoPreview.domain.TsingtaoXHAVideoPreviewService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Optional; + +/** + * 视频预览工厂类 + */ +public final class VideoPreviewFactory { + private static Logger logger = LoggerFactory.getLogger(VideoPreviewFactory.class); + private static ResourceService resourceService; + private static int projectPlace; + + private static BaoTouProperties baoTouProperties; // 包头配置 + + private static MonitorService monitorService; + + private static TsingtaoProperties tsingtaoProperties; // 青岛市区配置 + + private static Tsingtao_xhaProperties tsingtao_xhaProperties; // 青岛西海岸配置 + + static { + VideoPreviewFactory.resourceService = SpringContextUtils.getBean(ResourceService.class); + VideoPreviewFactory.projectPlace = resourceService.getProjectPlace(); + VideoPreviewFactory.baoTouProperties = SpringContextUtils.getBean(BaoTouProperties.class); + VideoPreviewFactory.monitorService = SpringContextUtils.getBean(MonitorService.class); + + VideoPreviewFactory.tsingtaoProperties = SpringContextUtils.getBean(TsingtaoProperties.class); + VideoPreviewFactory.tsingtao_xhaProperties = SpringContextUtils.getBean(Tsingtao_xhaProperties.class); + } + + /** + * 获取预览服务实现 + * + * @return + */ + public static Optional build() { + AbstractVideoPreviewService abstractVideoPreviewService = null; + switch (Constant.ProjectPlace.getByFlag(projectPlace)) { + case TSINGTAO: { // 青岛市局 + abstractVideoPreviewService = new TsingtaoVideoPreviewService(monitorService); + } + break; + case TSINGTAO_XHA: { // 青岛西海岸 + abstractVideoPreviewService = new TsingtaoXHAVideoPreviewService(tsingtao_xhaProperties); + } + break; + case BAOTOU: { // 包头 + abstractVideoPreviewService = new BaoTouVideoPreviewService(baoTouProperties); + } + break; + case UNKNOWN: { // 未知区域 + logger.error("区域未知"); + } + break; + } + return Optional.ofNullable(abstractVideoPreviewService); + } +} diff --git a/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/BaoTouVideoPreviewService.java b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/BaoTouVideoPreviewService.java new file mode 100644 index 00000000..b76882b7 --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/BaoTouVideoPreviewService.java @@ -0,0 +1,51 @@ +package io.renren.modules.resource.videoPreview.domain; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.renren.common.domain.BaoTouProperties; +import io.renren.modules.resource.videoPreview.AbstractVideoPreviewService; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * 包头预览 + */ +public class BaoTouVideoPreviewService extends AbstractVideoPreviewService { + private static Logger logger = LoggerFactory.getLogger(BaoTouVideoPreviewService.class); + private static final OkHttpClient client = new OkHttpClient(); + + private BaoTouProperties baoTouProperties; + + public BaoTouVideoPreviewService(BaoTouProperties baoTouProperties) { + this.baoTouProperties = baoTouProperties; + } + + /** + * 获取hls预览地址 + * + * @param key 获取hls地址的键 + * @return + */ + @Override + public String getHls(String key) { + String hls = null; + Request request = new Request.Builder().url(String.format(baoTouProperties.getHlsurl(), key)).build(); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + JSONObject jsonObject = JSON.parseObject(response.body().string()); + if (jsonObject.containsKey("data")) { + hls = jsonObject.getString("data"); + } + } else { + logger.error("包头预览地址获取失败"); + } + } catch (Exception exception) { + logger.error("包头预览地址获取失败", exception); + } + return hls; + } +} diff --git a/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/TsingtaoVideoPreviewService.java b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/TsingtaoVideoPreviewService.java new file mode 100644 index 00000000..516b4aae --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/TsingtaoVideoPreviewService.java @@ -0,0 +1,37 @@ +package io.renren.modules.resource.videoPreview.domain; + +import io.renren.modules.monitor.service.MonitorService; +import io.renren.modules.resource.videoPreview.AbstractVideoPreviewService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +/** + * 青岛市局预览 + */ +public class TsingtaoVideoPreviewService extends AbstractVideoPreviewService { + private static Logger logger = LoggerFactory.getLogger(BaoTouVideoPreviewService.class); + + private MonitorService monitorService; + + public TsingtaoVideoPreviewService(MonitorService monitorService) { + this.monitorService = monitorService; + } + + /** + * 获取hls预览地址 + * + * @param key 获取hls地址的键 + * @return + */ + @Override + public String getHls(String key) { + try { + return monitorService.fileCode(key); + } catch (IOException e) { + logger.error("青岛市局获取预览地址失败", e); + return null; + } + } +} diff --git a/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/TsingtaoXHAVideoPreviewService.java b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/TsingtaoXHAVideoPreviewService.java new file mode 100644 index 00000000..bb6b68fe --- /dev/null +++ b/renren-admin/src/main/java/io/renren/modules/resource/videoPreview/domain/TsingtaoXHAVideoPreviewService.java @@ -0,0 +1,76 @@ +package io.renren.modules.resource.videoPreview.domain; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.renren.common.domain.Tsingtao_xhaProperties; +import io.renren.modules.resource.videoPreview.AbstractVideoPreviewService; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CopyOnWriteArrayList; + + +/** + * 青岛西海岸 + */ +public class TsingtaoXHAVideoPreviewService extends AbstractVideoPreviewService { + private static Logger logger = LoggerFactory.getLogger(TsingtaoXHAVideoPreviewService.class); + Tsingtao_xhaProperties tsingtao_xhaProperties; + + public TsingtaoXHAVideoPreviewService(Tsingtao_xhaProperties tsingtao_xhaProperties) { + this.tsingtao_xhaProperties = tsingtao_xhaProperties; + } + + /** + * 获取hls预览地址 + * + * @param key 获取hls地址的键 + * @return + */ + @Override + public String getHls(String key) { + List result = new CopyOnWriteArrayList<>(); + CompletableFuture cloud = + CompletableFuture.runAsync(() -> { // 云脑专网 + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url(String.format(tsingtao_xhaProperties.getCloudhls(), key)).build(); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + JSONObject jsonObject = JSON.parseObject(response.body().string()); + if (jsonObject.containsKey("data")) { + result.add(jsonObject.getString("data")); + } + } else { + logger.error("西海岸预览地址获取失败"); + } + } catch (Exception exception) { + logger.error("西海岸预览地址获取失败", exception); + } + }); + CompletableFuture local = + CompletableFuture.runAsync(() -> { // 金宏网 + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url(String.format(tsingtao_xhaProperties.getLocalhls(), key)).build(); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + JSONObject jsonObject = JSON.parseObject(response.body().string()); + if (jsonObject.containsKey("data")) { + result.add(jsonObject.getString("data")); + } + } else { + logger.error("西海岸预览地址获取失败"); + } + } catch (Exception exception) { + logger.error("西海案预览地址获取失败", exception); + } + }); + CompletableFuture.allOf(cloud, local); + return result.stream().filter(index -> StringUtils.isNotEmpty(index)).findAny().orElse(null); + } +} diff --git a/renren-admin/src/main/resources/application.yml b/renren-admin/src/main/resources/application.yml index 425c184e..35bf83c3 100644 --- a/renren-admin/src/main/resources/application.yml +++ b/renren-admin/src/main/resources/application.yml @@ -1,6 +1,6 @@ project: # 平台部署位置 0:青岛市区 1:青岛西海岸 2:包头 - place: + place: 0 # 大数据部门相关配置 big_date: name: 青岛市大数据发展管理局 diff --git a/renren-admin/src/main/resources/domain/baotou.properties b/renren-admin/src/main/resources/domain/baotou.properties new file mode 100644 index 00000000..f59252f2 --- /dev/null +++ b/renren-admin/src/main/resources/domain/baotou.properties @@ -0,0 +1 @@ +baotou.hlsurl=http://10.110.205.1:18088/server/device/hisdeviceapplylist/url/%s \ No newline at end of file diff --git a/renren-admin/src/main/resources/domain/tsingtao-xha.properties b/renren-admin/src/main/resources/domain/tsingtao-xha.properties new file mode 100644 index 00000000..b8ee1e93 --- /dev/null +++ b/renren-admin/src/main/resources/domain/tsingtao-xha.properties @@ -0,0 +1,2 @@ +tsingtao-xha.cloudhls=http://10.10.30.9:8001/hx-weatherwarning/camera/getCameraLiveStreamByCode?cameraCode=%s&protocol=hls +tsingtao-xha.localhls=http://10.134.135.9:8001/hx-weatherwarning/camera/getCameraLiveStreamByCode?cameraCode=%s&protocol=hls \ No newline at end of file diff --git a/renren-admin/src/main/resources/domain/tsingtao.properties b/renren-admin/src/main/resources/domain/tsingtao.properties new file mode 100644 index 00000000..e69de29b diff --git a/renren-common/src/main/java/io/renren/common/constant/Constant.java b/renren-common/src/main/java/io/renren/common/constant/Constant.java index eb0c1beb..1f306bc2 100644 --- a/renren-common/src/main/java/io/renren/common/constant/Constant.java +++ b/renren-common/src/main/java/io/renren/common/constant/Constant.java @@ -1,5 +1,7 @@ package io.renren.common.constant; +import java.util.Arrays; + /** * 常量 */ @@ -228,7 +230,11 @@ public interface Constant { /** * 包头 */ - BAOTOU(2); + BAOTOU(2), + /** + * 未知 + */ + UNKNOWN(Integer.MAX_VALUE); private int value; ProjectPlace(int value) { @@ -238,5 +244,10 @@ public interface Constant { public int getValue() { return value; } + + public static ProjectPlace getByFlag(int flag) { + ProjectPlace[] index = ProjectPlace.values(); + return Arrays.asList(index).stream().filter(index_ -> index_.value == flag).findAny().orElse(ProjectPlace.UNKNOWN); + } } } \ No newline at end of file