Commit 01afe459 authored by 李成龙's avatar 李成龙

提交对接视频模块

parent 659da7b2
......@@ -29,12 +29,12 @@ public class ElasticSearchClientConfig {
@Qualifier("highLevelClient")
public RestHighLevelClient restHighLevelClient() {
String auth = Base64.encodeBase64String(("elastic:es123456").getBytes());
try {
String url = uris.replace("http://", "");
final String[] parts = StringUtils.split(url, ":");
HttpHost httpHost = new HttpHost(parts[0], Integer.parseInt(parts[1]), "http");
RestClientBuilder builder = RestClient.builder(httpHost);
//增加安全配置,使用kibana,勿删
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic","es123456"));
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
......@@ -46,17 +46,14 @@ public class ElasticSearchClientConfig {
.setSocketTimeout(6000 * 1000);// 套接字超时(默认为30秒)//更改客户端的超时限制默认30秒现在改为100*1000分钟
}
});// 调整最大重试超时时间(默认为30秒).setMaxRetryTimeoutMillis(60000);
builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// builder.setDefaultHeaders(new BasicHeader[] {
// new BasicHeader("Authorization","Basic"+auth)
// });
//增加安全配置,使用kibana,勿删
// builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
// @Override
// public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
// httpClientBuilder.disableAuthCaching();
// return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
// }
// });
return new RestHighLevelClient(builder);
} catch (Exception e) {
throw new IllegalStateException("Invalid ES nodes " + "property '" + uris + "'", e);
......
......@@ -5,6 +5,8 @@ import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
......@@ -13,9 +15,8 @@ import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.video.dao.impl.VideoOriginalServiceImpl;
import com.yeejoin.amos.video.dto.VideoOriginalDto;
import com.yeejoin.amos.video.entity.VideoOriginal;
import com.yeejoin.amos.video.service.impl.VideoOriginalServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -34,14 +35,20 @@ public class VideoOriginalController extends BaseController {
@Autowired
private VideoOriginalServiceImpl videoOriginalServiceImpl;
@GetMapping("/hk/init")
@PostMapping("/hk/init")
@TycloudOperation(ApiLevel = UserType.AGENCY,needAuth=false)
@ApiOperation(httpMethod = "GET", value = "构建海康原始视频数据", notes = "构建海康原始视频数据")
public ResponseModel<Boolean> hkInitData() {
return ResponseHelper.buildResponse(videoOriginalServiceImpl.initEs("", ""));
@ApiOperation(httpMethod = "POST", value = "构建海康原始视频数据", notes = "构建海康原始视频数据,db参数为true时,同时保存到数据库")
public ResponseModel<Boolean> hkInitEsData(Boolean db) {
return ResponseHelper.buildResponse(videoOriginalServiceImpl.initEs("", "",db));
}
// @PostMapping("/hk/db/init")
// @TycloudOperation(ApiLevel = UserType.AGENCY,needAuth=false)
// @ApiOperation(httpMethod = "POST", value = "构建海康原始视频数据", notes = "构建海康原始视频数据")
// public ResponseModel<Boolean> hkInitDBData() {
// return ResponseHelper.buildResponse(videoOriginalServiceImpl.initDB("", ""));
// }
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(httpMethod = "GET", value = "按视频名称查询视频节点", notes = "按视频名称查询视频节点")
@ApiOperation(httpMethod = "GET", value = "按视频名称查询视频节点'", notes = "按视频名称查询视频节点,'all参数为查询所有")
@GetMapping(value = "/list/video/{cn}")
public ResponseModel<List<VideoOriginalDto>> videoBySimilar( @PathVariable String cn) throws Exception {
return ResponseHelper.buildResponse(videoOriginalServiceImpl.qeueryByKeys(cn));
......
......@@ -5,7 +5,7 @@ import java.util.List;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import com.yeejoin.amos.video.entity.VideoOriginal;
import com.yeejoin.amos.video.entity.EsVideoOriginal;
/**
* 模板表接口类
......@@ -14,8 +14,8 @@ import com.yeejoin.amos.video.entity.VideoOriginal;
* @date 2021-09-01
*/
@Repository
public interface IVideoOriginalRepository extends PagingAndSortingRepository<VideoOriginal, String> {
public interface IVideoOriginalRepository extends PagingAndSortingRepository<EsVideoOriginal, String> {
List<VideoOriginal> findByCnLike(String cn);
List<EsVideoOriginal> findByCnLike(String cn);
}
package com.yeejoin.amos.video.dto;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 模板表
......@@ -27,5 +27,6 @@ public class VideoOriginalDto extends BaseDto {
@ApiModelProperty(value = "视频代码")
private String indexCode;
@ApiModelProperty(value = "视频厂商类型")
private String type;
}
package com.yeejoin.amos.video.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 模板表
*
* @author system_generator
* @date 2021-09-01
*/
@Data
@Accessors(chain = true)
@Document(indexName = "video", type = "videoOriginal", shards = 1, replicas = 0)
public class EsVideoOriginal {
/** 主键 */
@Id
private String sequenceNbr;
/**
* 视频名称
*/
@Field(type = FieldType.Text)
private String cn;
/**
* 视频代码
*/
@Field(type = FieldType.Text)
private String indexCode;
/**
* 原始数据
*/
@Field(type = FieldType.Text, index = false)
private String originalData;
/**
* 视频厂商类型
*/
@Field(type = FieldType.Keyword, index = false)
private String type;
@Field(type = FieldType.Text, index = false)
private String recDate;
@Field(type = FieldType.Text, index = false)
private String recUserId;
@Field(type = FieldType.Text, index = false)
private String recUserName;
}
package com.yeejoin.amos.video.entity;
import java.util.Date;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yeejoin.amos.boot.biz.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
......@@ -17,35 +16,35 @@ import lombok.experimental.Accessors;
* @date 2021-09-01
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@Document(indexName = "video", type = "videoOriginal", shards = 1, replicas = 0)
public class VideoOriginal {
/** 主键 */
@Id
private String sequenceNbr;
@TableName("cb_video_original")
@ApiModel(value="VideoOriginal对象", description="视频原始数据")
public class VideoOriginal extends BaseEntity{
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 视频名称
*/
@Field(type = FieldType.Keyword)
@ApiModelProperty(value = "视频名称")
private String cn;
/**
* 视频代码
*/
@Field(type = FieldType.Text)
@ApiModelProperty(value = "视频名称")
private String indexCode;
/**
* 原始数据
*/
@Field(type = FieldType.Text, index = false)
@ApiModelProperty(value = "视频名称")
private String originalData;
@Field(type = FieldType.Text, index = false)
private String recDate;
@Field(type = FieldType.Text, index = false)
private String recUserId;
@Field(type = FieldType.Text, index = false)
private String recUserName;
/**
* 视频厂商类型
*/
@ApiModelProperty(value = "视频厂商类型")
private String type;
}
package com.yeejoin.amos.video.service;
public interface IVideoOriginalService {
}
package com.yeejoin.amos.video.dao.impl;
package com.yeejoin.amos.video.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Spliterator;
import java.util.stream.StreamSupport;
import javax.annotation.PostConstruct;
import org.apache.commons.compress.utils.Lists;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.FuzzyQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
......@@ -29,14 +16,18 @@ import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.video.dao.IVideoOriginalRepository;
import com.yeejoin.amos.video.dto.VideoOriginalDto;
import com.yeejoin.amos.video.entity.EsVideoOriginal;
import com.yeejoin.amos.video.entity.VideoOriginal;
//import net.sf.json.JSONObject;
import com.yeejoin.amos.video.mapper.VideoOriginalMapper;
import com.yeejoin.amos.video.service.IVideoOriginalService;
/**
* 模板表服务实现类
......@@ -45,15 +36,13 @@ import com.yeejoin.amos.video.entity.VideoOriginal;
* @date 2021-09-01
*/
@Service
public class VideoOriginalServiceImpl {
public class VideoOriginalServiceImpl extends BaseService<VideoOriginalDto, VideoOriginal, VideoOriginalMapper> implements IVideoOriginalService {
private static final Logger logger = LoggerFactory.getLogger(VideoOriginalServiceImpl.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private IVideoOriginalRepository iVideoOriginalRepository;
@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Value("${biz.hk.video.url}")
private String hkVideoUrl;
......@@ -64,124 +53,157 @@ public class VideoOriginalServiceImpl {
@Value("${biz.hk.video.csv}")
private String hkVideoCsv;
private final String protocol="hls";
private final static String HK = "HK";
@PostConstruct
public void init() {
// 初始化ES,重建索引
// initEs();
}
/**
* 重建索引
* @param db
*/
public Boolean initEs(String userId,String userName) {
// iVideoOriginalRepository.deleteAll();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(30000);
factory.setReadTimeout(30000);
restTemplate.setRequestFactory(factory);
// String objectStr = "{\"httpMethod\":\"GET\",\"path\":\"/api/resource/v1/csv/downloadcsv/{csvFileName}\",\"headers\":{},\"query\":{},\"parameter\":{\"csvFileName\":\"otherDomainCameraFull_1.csv\"},\"mock\":false,\"appKey\":\"25907430\",\"appSecret\":\"RJj3WmSNdQuyX0yCR02b\"}";
public Boolean initEs(String userId,String userName, Boolean db) {
iVideoOriginalRepository.deleteAll();
// HttpHeaders headers = new HttpHeaders();
// headers.add("Content-Type", "application/json");
// SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// factory.setConnectTimeout(30000);
// factory.setReadTimeout(30000);
// restTemplate.setRequestFactory(factory);
String objectStr = new StringBuilder().append(
"{\"httpMethod\":\"GET\",\"path\":\"/api/resource/v1/csv/downloadcsv/{csvFileName}\",\"headers\":{},\"query\":{},\"parameter\":{\"csvFileName\":\"")
.append(hkVideoCsv).append("\"},\"mock\":false,\"appKey\":\"").append(hkVideoAPPkey)
.append("\",\"appSecret\":\"").append(hkVideoAPPsecret).append("\"}").toString();
JSONObject obj = JSONObject.parseObject(objectStr);
HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers); // 组装
logger.info("开始查询海康视频数据"+objectStr);
ResponseEntity<String> response = restTemplate.exchange(hkVideoUrl, HttpMethod.POST, request, String.class);
// JSONObject obj = JSONObject.parseObject(objectStr);
// HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers); // 组装
// logger.info("开始查询海康视频数据"+objectStr);
// ResponseEntity<String> response = restTemplate.exchange(hkVideoUrl, HttpMethod.POST, request, String.class);
ResponseEntity<String> response = getVideoData(objectStr);
String ss = response.getBody();
JSONObject obj1 = JSONObject.parseObject(ss);
String sss = obj1.get("response").toString();
logger.info("完成海康视频数据查询:长度:"+sss.length());
String[] str = sss.split("\n");
List<VideoOriginal> resultData = new ArrayList<VideoOriginal>();
List<EsVideoOriginal> resultData = new ArrayList<EsVideoOriginal>();
for (String originalStr : str) {
String[] strstr = originalStr.split(",");
String cn = strstr[0];
String indexCode = strstr[1];
if (!cn.equals("cn") && !indexCode.equals("indexCode")) {
VideoOriginal videoOriginal = new VideoOriginal();
EsVideoOriginal videoOriginal = new EsVideoOriginal();
videoOriginal.setCn(cn);
videoOriginal.setIndexCode(indexCode);
videoOriginal.setOriginalData(originalStr);
videoOriginal.setRecUserId(userId);
videoOriginal.setRecUserName(userName);
videoOriginal.setType(HK);
videoOriginal.setRecDate(DateUtils.getDateNowString());
resultData.add(videoOriginal);
// iVideoOriginalRepository.save(videoOriginal);
}
}
logger.info("开始搜索引擎中存储"+resultData.size());
iVideoOriginalRepository.saveAll(resultData);
logger.info("完成搜索引擎中存储");
boolean isSuccess = this.saveToDB(str, userId, userName, db);
if(!isSuccess) {
logger.info("搜索引擎存储视频原始数据失败");
}
return true;
}
public List<VideoOriginalDto> qeueryByKeys(String cn) {
// TODO Auto-generated method stub
// List<VideoOriginal> videoOriginalList = new ArrayList<VideoOriginal>();
// MatchQueryBuilder builder = QueryBuilders.matchQuery("cn", cn);
//// FuzzyQueryBuilder builder = QueryBuilders.fuzzyQuery("cn", cn);
// NativeSearchQuery searchQuery = new NativeSearchQuery(builder);
// SearchHits<VideoOriginal> searchHits = elasticsearchTemplate.search(searchQuery, VideoOriginal.class);
// BoolQueryBuilder boolMust = QueryBuilders.boolQuery();
// BoolQueryBuilder qb4 = QueryBuilders.boolQuery()
// .should(QueryBuilders.termQuery("cn", cn));
// boolMust.must(qb4);
// NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder()
// //过滤条件
// .withQuery(boolMust);
// SearchHits<VideoOriginal> searchHits = elasticsearchTemplate.search(queryBuilder.build(), VideoOriginal.class);
// for (SearchHit searchHit : searchHits.getSearchHits())
// {
// System.out.println(searchHit.getContent());
// JSONObject jsonObject = (JSONObject) JSONObject.toJSON(searchHit.getContent());
// VideoOriginal videoOriginals = (VideoOriginal) JSONObject.toJavaObject(jsonObject,VideoOriginal.class);
// videoOriginalList.add(videoOriginals);
// }
List<VideoOriginalDto> videoOriginalDtoList = new ArrayList<VideoOriginalDto>();
if(cn.equals("all")) {
Iterable<VideoOriginal> it = iVideoOriginalRepository.findAll();
for (VideoOriginal videoOriginal : it) {
Iterable<EsVideoOriginal> it = iVideoOriginalRepository.findAll();
for (EsVideoOriginal videoOriginal : it) {
videoOriginalDtoList.add(transDto(videoOriginal));
}
}else {
List<VideoOriginal> videoOriginalList = iVideoOriginalRepository.findByCnLike(cn);
for (VideoOriginal videoOriginal : videoOriginalList) {
List<EsVideoOriginal> videoOriginalList = iVideoOriginalRepository.findByCnLike(cn);
for (EsVideoOriginal videoOriginal : videoOriginalList) {
videoOriginalDtoList.add(transDto(videoOriginal));
}
}
return videoOriginalDtoList;
}
private VideoOriginalDto transDto(VideoOriginal videoOriginal){
private VideoOriginalDto transDto(EsVideoOriginal videoOriginal){
VideoOriginalDto videoOriginalDto = new VideoOriginalDto();
videoOriginalDto.setCn(videoOriginal.getCn());
videoOriginalDto.setIndexCode(videoOriginal.getIndexCode());
videoOriginalDto.setType(HK);
return videoOriginalDto;
}
public String qeueryByIndexCode(String indexCode) {
// TODO Auto-generated method stub
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(30000);
factory.setReadTimeout(30000);
restTemplate.setRequestFactory(factory);
// // TODO Auto-generated method stub
// HttpHeaders headers = new HttpHeaders();
// headers.add("Content-Type", "application/json");
// SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// factory.setConnectTimeout(30000);
// factory.setReadTimeout(30000);
// restTemplate.setRequestFactory(factory);
String objectStr = new StringBuilder().append("{\"httpMethod\":\"POST\",\"path\":\"/api/video/v1/cameras/previewURLs\",\"headers\":{},\"query\":{},\"parameter\":{},\"body\":{\"indexCode\":\"")
.append(indexCode).append("\",\"netZoneCode\":\"0\",\"transmode\":1,\"streamType\":0,\"protocol\":\"").append(protocol).append("\"},\"contentType\":\"application/json;charset=UTF-8\",\"mock\":false,\"appKey\":\"").append(hkVideoAPPkey)
.append("\",\"appSecret\":\"").append(hkVideoAPPsecret).append("\"}").toString();
JSONObject obj = JSONObject.parseObject(objectStr);
HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers); // 组装
logger.info("开始查询海康视频数据"+objectStr);
ResponseEntity<String> response = restTemplate.exchange(hkVideoUrl, HttpMethod.POST, request, String.class);
// JSONObject obj = JSONObject.parseObject(objectStr);
// HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers); // 组装
// logger.info("开始查询海康视频播放地址"+objectStr);
// ResponseEntity<String> response = restTemplate.exchange(hkVideoUrl, HttpMethod.POST, request, String.class);
ResponseEntity<String> response = getVideoData(objectStr);
String ss = response.getBody();
JSONObject obj1 = JSONObject.parseObject(ss);
String sss = obj1.get("response").toString();
String ssss = JSONObject.parseObject(sss).get("data").toString();
String sssss =JSONObject.parseObject(ssss).get("url").toString();
logger.info("完成海康视频数据查询:长度:"+sss.length());
logger.info("完成海康视频播放地址查询:长度:"+sss.length());
return sssss;
}
private ResponseEntity<String> getVideoData(String urlParam){
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(30000);
factory.setReadTimeout(30000);
restTemplate.setRequestFactory(factory);
JSONObject obj = JSONObject.parseObject(urlParam);
HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers); // 组装
logger.info("开始查询海康视频数据"+urlParam);
ResponseEntity<String> response = restTemplate.exchange(hkVideoUrl, HttpMethod.POST, request, String.class);
return response;
}
private boolean saveToDB(String[] str,String userId,String userName,boolean db) {
List<VideoOriginal> resultData = new ArrayList<VideoOriginal>();
for (String originalStr : str) {
String[] strstr = originalStr.split(",");
String cn = strstr[0];
String indexCode = strstr[1];
if (!cn.equals("cn") && !indexCode.equals("indexCode")) {
VideoOriginal videoOriginal = new VideoOriginal();
videoOriginal.setCn(cn);
videoOriginal.setIndexCode(indexCode);
videoOriginal.setOriginalData(originalStr);
videoOriginal.setRecUserId(userId);
videoOriginal.setRecUserName(userName);
videoOriginal.setType(HK);
videoOriginal.setRecDate(DateUtils.getDateNow());
resultData.add(videoOriginal);
}
}
boolean result = false;
if(db) {
try {
QueryWrapper<VideoOriginal> wrapper = new QueryWrapper<VideoOriginal>();
wrapper.eq("type", HK);
boolean isTrue = this.remove(wrapper);
if(isTrue) {
result = this.saveBatch(resultData);
}
} catch (Exception e) {
// TODO: handle exception
logger.error("HK原始视频数据删除失败:"+e);
e.printStackTrace();
}
}
return result;
}
}
\ No newline at end of file
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 to comment