CameraBaseServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package com.huimv.admin.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.ListUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import cn.hutool.json.JSONUtil;
  6. import com.alibaba.fastjson.JSON;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  10. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  11. import com.hikvision.artemis.sdk.ArtemisHttpUtil;
  12. import com.hikvision.artemis.sdk.config.ArtemisConfig;
  13. import com.huimv.admin.common.utils.Result;
  14. import com.huimv.admin.common.utils.ResultCode;
  15. import com.huimv.admin.common.utils.ResultUtil;
  16. import com.huimv.admin.entity.BasePigpen;
  17. import com.huimv.admin.entity.CameraArea;
  18. import com.huimv.admin.entity.CameraBase;
  19. import com.huimv.admin.entity.CameraBrand;
  20. import com.huimv.admin.entity.dto.CameraNameDto;
  21. import com.huimv.admin.entity.hkwsdto.*;
  22. import com.huimv.admin.entity.vo.*;
  23. import com.huimv.admin.mapper.CameraAreaMapper;
  24. import com.huimv.admin.mapper.CameraBaseMapper;
  25. import com.huimv.admin.mapper.CameraBrandMapper;
  26. import com.huimv.admin.service.ICameraBaseService;
  27. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import javax.servlet.http.HttpServletRequest;
  32. import java.util.*;
  33. import java.util.concurrent.CopyOnWriteArrayList;
  34. import java.util.stream.Collectors;
  35. /**
  36. * <p>
  37. * 服务实现类
  38. * </p>
  39. *
  40. * @author author
  41. * @since 2023-02-16
  42. */
  43. @Service
  44. public class CameraBaseServiceImpl extends ServiceImpl<CameraBaseMapper, CameraBase> implements ICameraBaseService {
  45. @Autowired
  46. private CameraAreaMapper cameraAreaMapper;
  47. @Autowired
  48. private CameraBrandMapper cameraBrandMapper;
  49. @Autowired
  50. private CameraBaseMapper cameraBaseMapper;
  51. @Override
  52. public Result listPage(CameraListVo cameraListVo) {
  53. Integer current = cameraListVo.getCurrent();
  54. String strchStr = cameraListVo.getStrchStr();
  55. Integer size = cameraListVo.getSize();
  56. // Integer areaId = cameraListVo.getAreaId();
  57. Integer sort = cameraListVo.getSort();
  58. Integer farmId = cameraListVo.getFarmId();
  59. Integer onLineStatus = cameraListVo.getOnLineStatus();
  60. String regionUuid = cameraListVo.getRegionUuid();
  61. QueryWrapper<CameraBase> wrapper = new QueryWrapper<>();
  62. if (null == current) {
  63. current = 1;
  64. }
  65. if (null == size) {
  66. size = 10;
  67. }
  68. if (farmId != null) {
  69. wrapper.eq("cb.farm_id", farmId);
  70. }
  71. if (StringUtils.isNotBlank(regionUuid)) {
  72. wrapper.eq("cb.region_uuid", regionUuid);
  73. }
  74. if (onLineStatus != null) {
  75. wrapper.eq("cb.on_line_status", onLineStatus);
  76. }
  77. if (StringUtils.isNotBlank(strchStr)) {
  78. wrapper.and(i -> i.like("cb.camera_name", strchStr));
  79. }
  80. if (sort == null) {
  81. wrapper.orderByDesc("cb.id");
  82. } else if (sort == 1) {
  83. wrapper.orderByDesc("cb.sort");
  84. } else {
  85. wrapper.orderByAsc("cb.sort");
  86. }
  87. wrapper.orderByDesc("cb.id");
  88. Page<CameraBase> page = new Page<>(current,size);
  89. IPage<CameraBaseVo> cameraBaseVoIPage = cameraBaseMapper.listPage(page, wrapper);
  90. return new Result(ResultCode.SUCCESS, cameraBaseVoIPage);
  91. }
  92. @Override
  93. public Result getCameraDetails(CameraListsVo cameraListsVo) {
  94. List<Integer> cameraIds = cameraListsVo.getCameraIds();
  95. CameraBrand cameraBrand = cameraBrandMapper.selectById(18);
  96. List list = new ArrayList();
  97. for (Integer cameraId : cameraIds) {
  98. CameraBase cameraBase = this.getById(cameraId);
  99. String regionUuid = cameraBase.getRegionUuid();
  100. CameraArea cameraArea = cameraAreaMapper.selectOne(new QueryWrapper<CameraArea>().eq("region_uuid", regionUuid));
  101. // http://61.153.248.106:6713/mag/hls/6bf5d2cf30bb440cad3fc126512f5188/1/live.m3u8
  102. String hls = "http://" + cameraArea.getPublicUrl() + cameraBrand.getStreamType() + cameraBase.getCameraUuid() + "/" + cameraBrand.getMainStream() + "/" + "live.m3u8";
  103. CameraVo cameraVo = new CameraVo();
  104. cameraVo.setHlsUrl(hls);
  105. cameraVo.setId(cameraBase.getId());
  106. cameraVo.setCameraName(cameraBase.getCameraName());
  107. list.add(cameraVo);
  108. }
  109. return ResultUtil.list(list);
  110. }
  111. @Override
  112. public void sync(Map<String, Integer> params, List<CameraDto1> list) {
  113. Integer farmId = params.get("farmId");
  114. List<CameraBase> huatongCameraBaseList = this.list(new QueryWrapper<CameraBase>().eq("farm_id", farmId));
  115. List<String> haikangCarmearId = list.stream().map(CameraDto1::getCameraUuid).collect(Collectors.toList());
  116. List<String> huatongCameraId = huatongCameraBaseList.stream().map(CameraBase::getCameraUuid).collect(Collectors.toList());
  117. CopyOnWriteArrayList<String> haikangDeviceIdCopy = ListUtil.toCopyOnWriteArrayList(haikangCarmearId);
  118. CopyOnWriteArrayList<String> huatongDeviceIdCopy = ListUtil.toCopyOnWriteArrayList(huatongCameraId);
  119. haikangDeviceIdCopy.removeAll(huatongCameraId);
  120. //TODO 想不出来,回头优化
  121. if (haikangDeviceIdCopy.size() > 0) {
  122. for (String s : haikangDeviceIdCopy) {
  123. for (CameraDto1 cameraDto1 : list) {
  124. if (s.equals(cameraDto1.getCameraUuid())) {
  125. CameraBase cameraBase = new CameraBase();
  126. BeanUtil.copyProperties(cameraDto1, cameraBase);
  127. CameraArea cameraArea = cameraAreaMapper.selectOne(new QueryWrapper<CameraArea>().eq("region_uuid", cameraDto1.getRegionUuid()));
  128. if (ObjectUtil.isNotEmpty(cameraArea)) {
  129. cameraBase.setAreaName(cameraArea.getAreaName());
  130. }
  131. // http://61.153.248.106:6713/mag/hls/6bf5d2cf30bb440cad3fc126512f5188/1/live.m3u8
  132. cameraBase.setUrl("http://"+cameraArea.getPublicUrl()+"/mag/hls/"+cameraDto1.getCameraUuid()+"/1/live.m3u8");
  133. cameraBase.setBrandName("海康威视");
  134. cameraBase.setFarmId(farmId);
  135. this.save(cameraBase);
  136. }
  137. }
  138. }
  139. }
  140. //删除
  141. huatongDeviceIdCopy.removeAll(haikangCarmearId);
  142. if (huatongDeviceIdCopy.size() > 0) {
  143. this.remove(new QueryWrapper<CameraBase>().in("camera_uuid", huatongDeviceIdCopy));
  144. }
  145. }
  146. //更新摄像头状态
  147. @Override
  148. public void updateCameraOnlin(List<CameraDto1> list) {
  149. for (CameraDto1 cameraDto1 : list) {
  150. String cameraUuid = cameraDto1.getCameraUuid();
  151. CameraBase one = this.getOne(new QueryWrapper<CameraBase>().eq("camera_uuid", cameraUuid));
  152. one.setOnLineStatus(1 == cameraDto1.getOnLineStatus());
  153. }
  154. }
  155. @Override
  156. public Result list(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
  157. String farmId = paramsMap.get("farmId");
  158. QueryWrapper<CameraArea> queryWrapper = new QueryWrapper<>();
  159. queryWrapper.eq("farm_id", farmId);
  160. List<CameraArea> cameraAreas = cameraAreaMapper.selectList(queryWrapper);
  161. List<CameraNameDto> cameraNameDtoList = new LinkedList();
  162. for (CameraArea cameraArea : cameraAreas) {
  163. CameraNameDto cameraNameDto = new CameraNameDto();
  164. QueryWrapper<CameraBase> baseQueryWrapper = new QueryWrapper<>();
  165. baseQueryWrapper.eq("farm_id", farmId).eq("area_name", cameraArea.getAreaName());
  166. List<CameraBase> cameraBases = cameraBaseMapper.selectList(baseQueryWrapper);
  167. cameraNameDto.setCameraBases(cameraBases);
  168. cameraNameDto.setId(cameraArea.getId());
  169. cameraNameDto.setAreaName(cameraArea.getAreaName());
  170. cameraNameDtoList.add(cameraNameDto);
  171. }
  172. return new Result(ResultCode.SUCCESS, cameraNameDtoList);
  173. }
  174. @Override
  175. @Transactional
  176. public void NewSync(Map<String, Integer> params, List<CameraDetailDto> hkvsNewCameraDtoDatumList) throws Exception {
  177. Integer farmId = params.get("farmId");
  178. this.remove(new QueryWrapper<CameraBase>().eq("farm_id", farmId));
  179. for (CameraDetailDto cameraDto : hkvsNewCameraDtoDatumList) {
  180. CameraBase cameraBase = new CameraBase();
  181. cameraBase.setAreaName(cameraDto.getRegionName());
  182. cameraBase.setCameraName(cameraDto.getName());
  183. cameraBase.setCameraUuid(cameraDto.getIndexCode());
  184. String callPostApiGetPreviewURLs = callPostApiGetPreviewURLs(cameraDto.getIndexCode());
  185. HkvsPreviewDto hkvsPreviewDto = JSONUtil.toBean(callPostApiGetPreviewURLs, HkvsPreviewDto.class);
  186. cameraBase.setUrl(hkvsPreviewDto.getData().getUrl());
  187. cameraBase.setCameraType(Integer.parseInt(cameraDto.getCameraType()));
  188. cameraBase.setCameraChannelNum(Integer.parseInt(cameraDto.getChanNum()));
  189. cameraBase.setUpdateTime(cameraDto.getUpdateTime());
  190. cameraBase.setUnitUuid(cameraDto.getParentIndexCode());
  191. cameraBase.setRegionUuid(cameraDto.getRegionIndexCode());
  192. cameraBase.setOrderNum(cameraDto.getSort());
  193. cameraBase.setBrandName("海康威视");
  194. cameraBase.setFarmId(farmId);
  195. this.save(cameraBase);
  196. }
  197. }
  198. private static final String ARTEMIS_PATH = "/artemis";
  199. private static final String SUBREGIONS_PATH = "/api/resource/v2/regions/subRegions";
  200. private static final String CAMERAS_PATH = "/api/resource/v2/camera/search";
  201. private static final String PREVIEW_PATH = "/api/video/v2/cameras/previewURLs";
  202. private static final String NEW_APPKEY = "27546900";
  203. private static final String NEW_SECRET = "S5qgrKdBd75M0NZRzGAh";
  204. private static final String OPENAPI_IP = "61.153.248.109";
  205. private static final String ZK_REGION = "500d8b6a-2554-43f3-bda7-e686577eb741";
  206. private static final String PJ_REGION = "70405f14-1cb5-4413-8bef-38e4a365cbee";
  207. private static final String PW_REGION = "66096289-bd19-4390-a5d5-71a31e970b0b";
  208. /**
  209. * 调用POST请求类型接口,获取监控点预览取流URLv2
  210. * 接口实际url:https://ip:port/artemis/api/video/v2/cameras/previewURLs
  211. * @return
  212. */
  213. public static String callPostApiGetPreviewURLs(String cameraIndexCode) throws Exception {
  214. /**
  215. * https://ip:port/artemis/api/video/v2/cameras/previewURLs
  216. * 根据指定的区域编号获取该区域下的监控点列表信息,返回结果分页展示。
  217. * 注:返回的监控点不包括下级区域的。
  218. */
  219. ArtemisConfig config = new ArtemisConfig();
  220. config.setHost(OPENAPI_IP); // 代理API网关nginx服务器ip端口
  221. config.setAppKey(NEW_APPKEY); // 秘钥appkey
  222. config.setAppSecret(NEW_SECRET);// 秘钥appSecret
  223. final String getCamsApi = ARTEMIS_PATH + PREVIEW_PATH;
  224. Map<String, Object> paramMap = new HashMap<String, Object>();// post请求Form表单参数
  225. paramMap.put("cameraIndexCode",cameraIndexCode);
  226. paramMap.put("streamType",0);
  227. paramMap.put("protocol","ws");
  228. paramMap.put("transmode",1);
  229. paramMap.put("expand","streamform=rtp");
  230. String body = JSON.toJSON(paramMap).toString();
  231. Map<String, String> path = new HashMap<String, String>(2) {
  232. {
  233. put("https://", getCamsApi);
  234. }
  235. };
  236. String s = ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  237. System.out.println(s);
  238. return s;
  239. }
  240. /* *//**
  241. * 查询结果 转换成树形结构
  242. * @param bizBaseAreas 原始数据
  243. * @return 树
  244. *//*
  245. private List<CameraNameDto> parseBizBaseArea(List<CameraBase> bizBaseAreas){
  246. //构建需要展示的树形节点结构
  247. Map<String, CameraNameDto> nodeMap = bizBaseAreas.stream().map(basePigpen -> {
  248. CameraNameDto baseVo = new CameraNameDto();
  249. baseVo.setId(basePigpen.getId()+"");
  250. baseVo.setCameraName(basePigpen.getCameraName());
  251. baseVo.setFarmId(basePigpen.getFarmId().toString());
  252. baseVo.setChildNode(new ArrayList<>());
  253. return baseVo;
  254. }).collect(Collectors.toMap(CameraNameDto::getId, b -> b,(k1, k2)->k1));
  255. //创建数组存父亲节点
  256. ArrayList<CameraNameDto> roots = new ArrayList<>();
  257. //构建树形
  258. nodeMap.values().forEach(item->{
  259. String parentCode = item.getParentId()+"";
  260. if (nodeMap.get(parentCode) == null){
  261. //父节点为空,说明当前节点就已经是父节点了 将该节点存起来
  262. roots.add(item);
  263. }else {
  264. //父节点 不为空,说明有父节点,拿到该节点的父节点的孩子节点(就是我自己),将该节点存起来
  265. nodeMap.get(parentCode).getChildNode().add(item);
  266. }
  267. });
  268. return roots;
  269. }*/
  270. }