From 08b6a55a3a111aaee9842999b85afa60b6d61dc3 Mon Sep 17 00:00:00 2001 From: houzhongjian <houzhongyi@126.com> Date: 星期四, 14 十一月 2024 15:29:38 +0800 Subject: [PATCH] 大华及海康摄像头截图功能开发 --- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/opcua/collector/OpcUaCollector.java | 12 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/ImageService.java | 22 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCaptureReceiveCB.java | 18 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dao/ImageDao.java | 14 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/NvrService.java | 2 iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml | 15 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/CameraController.java | 20 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java | 330 +++++++++---------- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraHikvisionTask.java | 42 ++ iailab-module-data/iailab-module-data-biz/src/main/resources/application-dev.yaml | 13 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/CameraService.java | 4 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/CameraServiceImpl.java | 44 ++ iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/nvr/NvrController.java | 2 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dto/ImageDTO.java | 7 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/NvrServiceImpl.java | 2 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraDahuaTask.java | 5 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java | 15 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/ImageServiceImpl.java | 108 +----- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/config/VideoConfiguration.java | 64 ++++ iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHClientFactory.java | 1 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHSavePath.java | 32 +- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/CameraPageReqVO.java | 2 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/kio/collector/KingIOCollector.java | 15 /dev/null | 32 -- iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/plan/PlanItemApiImpl.java | 15 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCapturePictureClient.java | 13 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/HttpRequest.java | 5 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/ImageController.java | 64 ++++ iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/ImagePageReqVO.java | 28 + 29 files changed, 552 insertions(+), 394 deletions(-) diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java index c44bb02..d5a4c21 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java @@ -5,6 +5,7 @@ import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.framework.excel.core.util.ExcelUtils; import com.iailab.framework.tenant.core.context.TenantContextHolder; +import com.iailab.module.data.api.dto.DeviceValueDTO; import com.iailab.module.data.api.dto.IndexQueryDTO; import com.iailab.module.data.api.dto.echarts.BarLineDTO; import com.iailab.module.data.api.dto.echarts.SeriesItem; @@ -18,33 +19,29 @@ import com.iailab.module.data.api.point.dto.ApiPointsValueQueryDTO; import com.iailab.module.data.common.ApiDataQueryDTO; import com.iailab.module.data.common.ApiDataValueDTO; +import com.iailab.module.data.common.utils.ApiSecurityUtils; import com.iailab.module.data.ind.collection.IndItemCollector; import com.iailab.module.data.ind.item.vo.IndItemValueVO; import com.iailab.module.data.plan.item.entity.PlanItemEntity; +import com.iailab.module.data.plan.item.service.PlanItemService; import com.iailab.module.data.plan.item.vo.PlanItemValueExportVO; import com.iailab.module.data.point.common.PointDataTypeEnum; import com.iailab.module.data.point.dto.DaPointDTO; import com.iailab.module.data.point.service.DaPointService; -import com.iailab.module.data.api.dto.DeviceValueDTO; -import com.iailab.module.data.common.utils.ApiSecurityUtils; -import com.iailab.module.data.plan.item.service.PlanItemService; -import com.iailab.module.data.point.vo.DaPointExcelVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; - -import javax.annotation.Resource; - -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -300,7 +297,7 @@ List<PlanItemValueExportVO> exportList = list.stream().map(item -> { PlanItemValueExportVO exportVO = new PlanItemValueExportVO(); exportVO.setDataTime(DateUtils.format(item.getDataTime(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); - exportVO.setDataValue(new BigDecimal(item.getDataValue()).setScale(0, BigDecimal.ROUND_HALF_UP).toString()); + exportVO.setDataValue(BigDecimal.valueOf(item.getDataValue()).setScale(0, RoundingMode.HALF_UP).toString()); return exportVO; }).collect(Collectors.toList()); ExcelUtils.write(response, "计划数据.xls", "计划数据", PlanItemValueExportVO.class, exportList); diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/plan/PlanItemApiImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/plan/PlanItemApiImpl.java index 46f93e7..4fcf398 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/plan/PlanItemApiImpl.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/plan/PlanItemApiImpl.java @@ -2,14 +2,18 @@ import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.module.data.api.plan.dto.ApiPlanDataDTO; +import com.iailab.module.data.api.plan.dto.ApiPlanItemDTO; import com.iailab.module.data.common.ApiDataQueryDTO; import com.iailab.module.data.common.ApiDataValueDTO; import com.iailab.module.data.plan.item.collection.PlanItemCollector; +import com.iailab.module.data.plan.item.entity.PlanItemEntity; +import com.iailab.module.data.plan.item.service.PlanItemService; import com.iailab.module.data.plan.item.vo.PlanItemDataVO; import com.iailab.module.data.plan.item.vo.PlanItemValueVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.LinkedHashMap; @@ -27,11 +31,16 @@ @Autowired private PlanItemCollector planItemCollector; + @Autowired + private PlanItemService planItemService; + + @Override public List<ApiDataValueDTO> queryPlanItemHistoryValue(ApiDataQueryDTO dto) { List<PlanItemValueVO> list = planItemCollector.queryValue(dto.getItemNo(), dto.getStart(), dto.getEnd()); return ConvertUtils.sourceToTarget(list, ApiDataValueDTO.class); } + @Override public LinkedHashMap<String, List<ApiPlanDataDTO>> queryPlanItemRecordValue(ApiDataQueryDTO dto) { LinkedHashMap<String, List<ApiPlanDataDTO>> result = new LinkedHashMap<>(); if (CollectionUtils.isEmpty(dto.getItemNos())) { @@ -44,4 +53,10 @@ return result; } + @Override + public ApiPlanItemDTO getInfoByNo(String itemNo){ + PlanItemEntity entity = planItemService.getInfoByNo(itemNo); + return ConvertUtils.sourceToTarget(entity, ApiPlanItemDTO.class); + } + } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/kio/collector/KingIOCollector.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/kio/collector/KingIOCollector.java index 77339a2..4ee8b2a 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/kio/collector/KingIOCollector.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/kio/collector/KingIOCollector.java @@ -2,9 +2,12 @@ import com.iailab.module.data.channel.kio.entity.ChannelKioDeviceEntity; import com.iailab.module.data.channel.kio.service.ChannelKioDeviceService; +import com.iailab.module.data.channel.opcua.collector.OpcUaUtils; +import com.iailab.module.data.common.enums.CommonConstant; import com.iailab.module.data.common.enums.DataSourceType; import com.iailab.module.data.common.utils.TagUtils; import lombok.extern.slf4j.Slf4j; +import org.eclipse.milo.opcua.sdk.client.OpcUaClient; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -50,9 +53,15 @@ return kingIOClient; } - public String getTagValue(String sourceId, String tagName) throws Exception { - KingIOClient client = this.getClient(sourceId); - String value = client.getTagValue(tagName); + public String getTagValue(String sourceId, String tagName) { + String value = CommonConstant.BAD_VALUE.toString(); + try{ + KingIOClient client = this.getClient(sourceId); + value = client.getTagValue(tagName); + }catch (Exception ex){ + ex.printStackTrace(); + return value; + } return value; } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/opcua/collector/OpcUaCollector.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/opcua/collector/OpcUaCollector.java index 306e4b2..4eeff2e 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/opcua/collector/OpcUaCollector.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/opcua/collector/OpcUaCollector.java @@ -64,9 +64,15 @@ return opcUaClient; } - public String getTagValue(String sourceId, String tagNo) throws Exception { - OpcUaClient opcUaClient = this.getClient(sourceId); - String value = OpcUaUtils.readNode(opcUaClient, tagNo); + public String getTagValue(String sourceId, String tagNo) { + String value = CommonConstant.BAD_VALUE.toString(); + try{ + OpcUaClient opcUaClient = this.getClient(sourceId); + value = OpcUaUtils.readNode(opcUaClient, tagNo); + }catch (Exception ex){ + ex.printStackTrace(); + return value; + } return value; } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/HttpRequest.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/HttpRequest.java index 0f4a314..00d9cc0 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/HttpRequest.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/HttpRequest.java @@ -1,6 +1,5 @@ package com.iailab.module.data.common.utils; -import com.iailab.framework.security.core.util.SecurityFrameworkUtils; import com.iailab.framework.tenant.core.context.TenantContextHolder; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; @@ -250,6 +249,7 @@ * @return */ public static String doPost(String url, String json, String charset, String token) { + Long tenantId = TenantContextHolder.getTenantId(); org.apache.http.client.HttpClient httpClient = null; HttpPost httpPost = null; String result = null; @@ -260,8 +260,7 @@ httpPost.addHeader("Accept", "application/json"); httpPost.addHeader("Content-Type", "application/json;charset=UTF-8"); httpPost.addHeader("token", token); - //传递租户id - httpPost.addHeader("Tenant-Id", String.valueOf(TenantContextHolder.getTenantId())); + httpPost.addHeader("Tenant-Id", String.valueOf(tenantId)); StringEntity stringEntity = new StringEntity(json); stringEntity.setContentEncoding("UTF-8"); stringEntity.setContentType("application/json"); diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraDahuaTask.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraDahuaTask.java index f351ec3..133d990 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraDahuaTask.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraDahuaTask.java @@ -9,6 +9,7 @@ import com.iailab.module.data.video.service.CameraService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -32,13 +33,15 @@ @Resource private CameraService cameraService; - @Resource + @Autowired private DHClientFactory dhClientFactory; @Override public void run(String params) { logger.info("devCameraDahuaTask定时任务正在执行,参数为:{}", params); + //传递租户id System.out.println(TenantContextHolder.getTenantId()); + String tenantId = String.valueOf(TenantContextHolder.getTenantId()); try { CameraPageReqVO cameraPageReqVO = new CameraPageReqVO(); cameraPageReqVO.setType("2"); diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraHikvisionTask.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraHikvisionTask.java new file mode 100644 index 0000000..abbbab1 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/DevCameraHikvisionTask.java @@ -0,0 +1,42 @@ +package com.iailab.module.data.job.task; + +import com.iailab.module.data.video.controller.admin.camera.vo.CameraPageReqVO; +import com.iailab.module.data.video.config.VideoConfiguration; +import com.iailab.module.data.video.dto.CameraDTO; +import com.iailab.module.data.video.hikvision.utils.HIKDevice; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; + +@Component("devCameraHikvisionTask") +public class DevCameraHikvisionTask implements ITask { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private static HIKDevice hikDevice; + + @Autowired + public void setHIKDevice(HIKDevice tHIKDevice) { + DevCameraHikvisionTask.hikDevice = tHIKDevice; + } + + @Override + public void run(String params) { + logger.info("devCameraDahuaTask定时任务正在执行,参数为:{}", params); + CameraPageReqVO cameraPageReqVO = new CameraPageReqVO(); + cameraPageReqVO.setType("1"); + List<CameraDTO> list = VideoConfiguration.staticCameraService.list(cameraPageReqVO); + if (CollectionUtils.isEmpty(list)) { + logger.info("Alarm List 为空"); + return; + } + list.stream().forEach(cameraDTO -> { + hikDevice.loginDevice(cameraDTO); + }); + } +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/config/VideoConfiguration.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/config/VideoConfiguration.java new file mode 100644 index 0000000..5057319 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/config/VideoConfiguration.java @@ -0,0 +1,64 @@ +package com.iailab.module.data.video.config; + +import com.iailab.module.data.video.service.CameraService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +/** + * 摄像头配置文件 + */ +@Configuration +public class VideoConfiguration { + + @Value("${video.capture-dir}") + public String captureDir; + + @Value("${video.dahua.path.capture-path}") + public String dhCapturePath; + + @Value("${video.dahua.path.model-path}") + public String dhModelPath; + + @Value("${video.hikvision.path.capture-path}") + public String hkCapturePath; + + @Value("${video.hikvision.path.model-path}") + public String hkModelPath; + + @Value("${video.hikvision.pic-size}") + public String picSize; + + @Value("${video.hikvision.pic-quality}") + public String picQuality; + + @Resource + public CameraService cameraService; + + public static String staticDhCapturePath; + + public static String staticDhModelPath; + + public static String staticHkCapturePath; + + public static String staticHkModelPath; + + public static String staticPicSize; + + public static String staticPicQuality; + + public static CameraService staticCameraService; + + @PostConstruct + public void initUrl() { + staticDhCapturePath = this.captureDir + this.dhCapturePath; + staticDhModelPath = this.captureDir + this.dhModelPath; + staticHkCapturePath = this.captureDir + this.hkCapturePath; + staticHkModelPath = this.captureDir + this.hkModelPath; + staticPicSize = this.picSize; + staticPicQuality = this.picQuality; + staticCameraService = this.cameraService; + } +} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/CameraController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/CameraController.java index 62a38de..810f3e0 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/CameraController.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/CameraController.java @@ -12,10 +12,8 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.annotation.security.PermitAll; import javax.validation.Valid; import java.util.List; -import java.util.Map; import static com.iailab.framework.common.pojo.CommonResult.error; import static com.iailab.framework.common.pojo.CommonResult.success; @@ -81,16 +79,16 @@ @DeleteMapping("/delete") @Operation(summary = "删除") @PreAuthorize("@ss.hasPermission('video:camera:delete')") - public CommonResult delete(@RequestBody String[] ids) { - cameraService.delete(ids); + public CommonResult delete(@RequestParam("id") String id) { + cameraService.delete(id); return success(); } - @PostMapping("/DHCaptureCallback") - @Operation(summary = "大华摄像头截图成功后回调存储处理图片") - @PermitAll - public CommonResult DHCaptureCallback(@RequestBody Map<String, String> params) { - cameraService.dealCapture(params); - return success(); - } +// @PostMapping("/DHCaptureCallback") +// @Operation(summary = "大华摄像头截图成功后回调存储处理图片") +// @PermitAll +// public CommonResult DHCaptureCallback(@RequestBody Map<String, String> params) { +// cameraService.dealCapture(params); +// return success(); +// } } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/ImageController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/ImageController.java new file mode 100644 index 0000000..f1ecfaf --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/ImageController.java @@ -0,0 +1,64 @@ +package com.iailab.module.data.video.controller.admin.camera; + +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.module.data.video.controller.admin.camera.vo.ImagePageReqVO; +import com.iailab.module.data.video.dto.ImageDTO; +import com.iailab.module.data.video.service.ImageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +import static com.iailab.framework.common.pojo.CommonResult.success; + +/** + * @author Houzhongjian + * @Description + * @createTime 2024年11月01日 + */ +@RestController +@RequestMapping("/data/video/image") +@Tag(name = "截图管理") +public class ImageController { + + @Autowired + private ImageService imageService; + + @GetMapping("page") + @Operation(summary = "分页") + @PreAuthorize("@ss.hasPermission('video:image:query')") + public CommonResult<PageResult<ImageDTO>> page(@Valid ImagePageReqVO imagePageReqVO) { + return success(imageService.getPage(imagePageReqVO)); + } + + @GetMapping("list") + @PreAuthorize("@ss.hasPermission('video:image:query')") + public CommonResult<List<ImageDTO>> list(@Valid ImagePageReqVO imagePageReqVO) { + List<ImageDTO> list = imageService.list(imagePageReqVO); + return success(list); + } + + @GetMapping("/get") + @Operation(summary = "信息") + @PreAuthorize("@ss.hasPermission('video:image:query')") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult<ImageDTO> get(@RequestParam("id") String id) { + ImageDTO data = imageService.get(id); + return success(data); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除") + @PreAuthorize("@ss.hasPermission('video:image:delete')") + public CommonResult delete(@RequestParam("id") String id) { + imageService.delete(id); + return success(); + } + +} \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/CameraPageReqVO.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/CameraPageReqVO.java index 4a3659c..18f8c1b 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/CameraPageReqVO.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/CameraPageReqVO.java @@ -7,7 +7,7 @@ import lombok.ToString; /** - * @author PanZhibao + * @author Houzhongjian * @Description * @createTime 2024年08月17日 */ diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/ImagePageReqVO.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/ImagePageReqVO.java new file mode 100644 index 0000000..8123c41 --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/camera/vo/ImagePageReqVO.java @@ -0,0 +1,28 @@ +package com.iailab.module.data.video.controller.admin.camera.vo; + +import com.iailab.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * @author Houzhongjian + * @Description + * @createTime 2024年08月17日 + */ +@Schema(description = "截图图片 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ImagePageReqVO extends PageParam { + + private String cameraId; + + private String brand; + + private String code; + + private String device; + +} \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/nvr/NvrController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/nvr/NvrController.java index db7ebf4..1872f14 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/nvr/NvrController.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/controller/admin/nvr/NvrController.java @@ -69,7 +69,7 @@ @DeleteMapping("/delete") @Operation(summary = "删除") @PreAuthorize("@ss.hasPermission('video:nvr:delete')") - public CommonResult<Boolean> delete(@RequestParam("id") Long id) { + public CommonResult<Boolean> delete(@RequestParam("id") String id) { devCameraService.delete(id); return success(true); } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCapturePictureClient.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCapturePictureClient.java index b84bdf7..83e9868 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCapturePictureClient.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCapturePictureClient.java @@ -1,7 +1,6 @@ package com.iailab.module.data.video.dahua; -import com.alibaba.fastjson.JSON; -import com.iailab.module.data.common.utils.HttpRequest; +import com.iailab.module.data.video.config.VideoConfiguration; import com.iailab.module.data.video.dahua.frame.DHCapturePictureFrame; import com.iailab.netsdk.common.Res; import com.iailab.netsdk.demo.module.LoginModule; @@ -13,7 +12,6 @@ import com.sun.jna.ptr.IntByReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import java.awt.*; import java.io.File; @@ -26,10 +24,6 @@ */ public class DHCapturePictureClient { private Logger logger = LoggerFactory.getLogger(getClass()); - -// private String url = "http://localhost:48080/admin-api/data/video/camera/DHCaptureCallback"; -// @Value("${video.dahua.callback.url}") -// public String url; // 登陆句柄 public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE; @@ -299,11 +293,12 @@ return false; } else { System.out.println("CLIENT_CapturePicture success"); - // 回调处理图片 + // 处理图片 Map<String, String> params = new HashMap<>(); params.put("strFileName", strFileName); params.put("cmdSerial", cmdSerial); - HttpRequest.doPost(DHConfiguration.staticUrl, JSON.toJSONString(params), "utf-8", ""); + params.put("brand", "DH"); + VideoConfiguration.staticCameraService.dealCapture(params); } return true; } catch (Exception ex) { diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCaptureReceiveCB.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCaptureReceiveCB.java index 764c241..109c905 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCaptureReceiveCB.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHCaptureReceiveCB.java @@ -1,12 +1,11 @@ package com.iailab.module.data.video.dahua; -import com.alibaba.fastjson.JSON; -import com.iailab.module.data.common.utils.HttpRequest; +import com.iailab.module.data.video.config.VideoConfiguration; +import com.iailab.module.data.video.service.CameraService; import com.iailab.netsdk.lib.NetSDKLib; import com.sun.jna.Pointer; -import org.springframework.beans.factory.annotation.Value; -import javax.annotation.PostConstruct; +import javax.annotation.Resource; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -25,12 +24,13 @@ */ public class DHCaptureReceiveCB implements NetSDKLib.fSnapRev { + @Resource + private CameraService cameraService; + @Override public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int revLen, int encodeType, int cmdSerial, Pointer dwUser) { System.out.println("DHCaptureReceiveCB:"); Calendar calendar = Calendar.getInstance(); -// calendar.set(Calendar.MONTH, 0); -// calendar.set(Calendar.SECOND, 0); if (pBuf != null && revLen > 0) { String strFileName = DHSavePath.getSavePath().getSaveCapturePath(String.valueOf(cmdSerial), calendar.getTime()); System.out.println("cmdSerial=" + cmdSerial); @@ -48,12 +48,12 @@ e.printStackTrace(); } - // 回调处理图片 + // 处理图片 Map<String, String> params = new HashMap<>(); params.put("strFileName", strFileName); params.put("cmdSerial", Integer.valueOf(cmdSerial).toString()); - HttpRequest.doPost(DHConfiguration.staticUrl, JSON.toJSONString(params), "utf-8", ""); - + params.put("brand", "DH"); + cameraService.dealCapture(params); } } } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHClientFactory.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHClientFactory.java index 2f813dc..c25fe65 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHClientFactory.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHClientFactory.java @@ -1,5 +1,6 @@ package com.iailab.module.data.video.dahua; +import com.iailab.framework.tenant.core.context.TenantContextHolder; import com.iailab.module.data.video.dto.LogDTO; import com.iailab.module.data.video.dto.NvrDTO; import com.iailab.module.data.video.enums.CameraStatusEnum; diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHConfiguration.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHConfiguration.java deleted file mode 100644 index 310dadd..0000000 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.iailab.module.data.video.dahua; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -import javax.annotation.PostConstruct; - -@Configuration -public class DHConfiguration { - - @Value("${video.dahua.path.capturePath}") - public String capturePath; - - @Value("${video.dahua.path.modelPath}") - public String modelPath; - - @Value("${video.dahua.callback.url}") - public String url; - - public static String staticCapturePath; - - public static String staticModelPath; - - public static String staticUrl; - - @PostConstruct - public void initUrl() { - staticCapturePath = this.capturePath; - staticModelPath = this.modelPath; - staticUrl = this.url; - } -} diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHSavePath.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHSavePath.java index 031681a..e3cbca0 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHSavePath.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dahua/DHSavePath.java @@ -1,9 +1,9 @@ package com.iailab.module.data.video.dahua; +import com.iailab.module.data.video.config.VideoConfiguration; import com.iailab.netsdk.lib.ToolKits; import java.io.File; -import java.io.IOException; import java.util.Date; /** @@ -27,12 +27,12 @@ * @return */ public String getSaveCapturePath(String channel, Date curDate) { - File path1 = new File(DHConfiguration.staticCapturePath); + File path1 = new File(VideoConfiguration.staticDhCapturePath); if (!path1.exists()) { path1.mkdir(); } - File path2 = new File(DHConfiguration.staticCapturePath + ToolKits.getDay() + "/" + channel + "/"); + File path2 = new File(VideoConfiguration.staticDhCapturePath + ToolKits.getDay() + "/" + channel + "/"); if (!path2.exists()) { path2.mkdirs(); } @@ -49,17 +49,17 @@ * @param curDate * @return */ - public String getSaveModelPath(String cameraCode, Date curDate) throws IOException { -// File path1 = new File(modelPath); -// if (!path1.exists()) { -// path1.mkdir(); -// } - - File path2 = new File(DHConfiguration.staticModelPath + ToolKits.getDay() + "/" + cameraCode + "/"); -// if (!path2.exists()) { -// path2.mkdirs(); -// } - //return path2.getAbsolutePath() + "/"; - return path2.getAbsolutePath(); - } +// public String getSaveModelPath(String cameraCode, Date curDate) throws IOException { +//// File path1 = new File(modelPath); +//// if (!path1.exists()) { +//// path1.mkdir(); +//// } +// +// File path2 = new File(DHConfiguration.staticModelPath + ToolKits.getDay() + "/" + cameraCode + "/"); +//// if (!path2.exists()) { +//// path2.mkdirs(); +//// } +// //return path2.getAbsolutePath() + "/"; +// return path2.getAbsolutePath(); +// } } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dao/ImageDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dao/ImageDao.java index 065b975..463a031 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dao/ImageDao.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dao/ImageDao.java @@ -1,7 +1,10 @@ package com.iailab.module.data.video.dao; -import com.iailab.framework.common.dao.BaseDao; +import com.iailab.framework.common.pojo.PageResult; +import com.iailab.framework.mybatis.core.mapper.BaseMapperX; +import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX; import com.iailab.framework.tenant.core.db.dynamic.TenantDS; +import com.iailab.module.data.video.controller.admin.camera.vo.ImagePageReqVO; import com.iailab.module.data.video.entity.ImageEntity; import org.apache.ibatis.annotations.Mapper; @@ -12,5 +15,12 @@ */ @TenantDS @Mapper -public interface ImageDao extends BaseDao<ImageEntity> { +public interface ImageDao extends BaseMapperX<ImageEntity> { + + default PageResult<ImageEntity> selectPage(ImagePageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX<ImageEntity>() + .likeIfPresent(ImageEntity::getCameraId, pageReqVO.getCameraId()) + .orderByDesc(ImageEntity::getId)); + } + } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dto/ImageDTO.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dto/ImageDTO.java index 44fddbf..0046fe5 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dto/ImageDTO.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/dto/ImageDTO.java @@ -29,4 +29,11 @@ private String imageUrl; private Date createDate; + + private String brand; + + private String code; + + private String device; + } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java index 06a5fd4..df8e685 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/HIKDevice.java @@ -1,5 +1,9 @@ package com.iailab.module.data.video.hikvision.utils; +import com.alibaba.fastjson.JSONException; +import com.iailab.module.data.video.config.VideoConfiguration; +import com.iailab.module.data.video.dto.CameraDTO; +import com.iailab.module.data.video.enums.CameraStatusEnum; import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Platform; @@ -8,41 +12,43 @@ import javax.annotation.PreDestroy; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; @Slf4j @Component public class HIKDevice { - // 接口的实例,通过接口实例调用外部dll/so的函数 - public static HCNetSDK hCNetSDK = null; + // 接口的实例,通过接口实例调用外部dll/so的函数 + public static HCNetSDK hCNetSDK = null; // 用户登录返回句柄 - public static int lUserID; + public static int lUserID; + //构造函数 - public HIKDevice(){ - if (hCNetSDK == null) { + public HIKDevice() { + if (hCNetSDK == null) { synchronized (HCNetSDK.class) { try { - if (Platform.isWindows()) { - hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_WIN_PATH, HCNetSDK.class); - } - if (Platform.isLinux()) { - hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_LINUX_PATH, HCNetSDK.class); - } + if (Platform.isWindows()) { + hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_WIN_PATH, HCNetSDK.class); + } + if (Platform.isLinux()) { + hCNetSDK = (HCNetSDK) Native.loadLibrary(MessageCode.HIK_LINUX_PATH, HCNetSDK.class); + } } catch (Exception ex) { log.error("SdkInitService-init-hCNetSDK-error"); } } } } - /** - * 初始化资源配置 - */ - public int initDevices(){ - System.out.println("进入构造函数"); + + /** + * 初始化资源配置 + */ + public int initDevices() { + System.out.println("进入构造函数"); // 初始化SDK boolean initSuc = hCNetSDK.NET_DVR_Init(); if (initSuc != true) { @@ -52,180 +58,154 @@ // 设置连接时间与重连时间 hCNetSDK.NET_DVR_SetConnectTime(2000, 1); System.out.println("初始化SDK资源完成"); - return 0; - } + return 0; + } //销毁函数 @PreDestroy public void destroy() throws Exception { hCNetSDK.NET_DVR_Cleanup(); } - + /* - * 功能:登录设备 - * 参数: - * deviceIP-设备局域网IP地址 - * devicePort-设备SDK服务端口 - * userName-用户名 - * passWord-密码 - * */ -// public String loginDevice() throws JSONException { -// if (!getDeviceStatus()) { -// int init = initDevices(); -// if (init == 1) { -// return "初始化失败"; -// } -// ArrayList<String> list = mZnfxCodeService.getDriverInfo("driverinfo"); -// if (list != null && list.size() > 0) { -// String driverip = list.get(0); -// String driverport = list.get(1); -// String username = list.get(2); -// String password = list.get(3); -// String returnVal = Login_V40(driverip, Short.parseShort(driverport), username, password); -// System.out.println(returnVal); -// return returnVal; -// } else { -// return "获取设备信息失败!"; -// } -// } -// else -// { -// String result = captureJPEGPicture(); -// System.out.println(result); -// return result; -// } -// -// } + * 功能:登录设备 + * 参数: + * deviceIP-设备局域网IP地址 + * devicePort-设备SDK服务端口 + * userName-用户名 + * passWord-密码 + * */ + public String loginDevice(CameraDTO camera) throws JSONException { + if (!getDeviceStatus(camera.getId())) { + int init = initDevices(); + if (init == 1) { + return "初始化失败"; + } + String driverip = camera.getIp(); + String driverport = camera.getPort(); + String username = camera.getUsername(); + String password = camera.getPassword(); + String returnVal = Login_V40(driverip, Short.parseShort(driverport), username, password, camera); + System.out.println(returnVal); + return returnVal; + } else { + String result = captureJPEGPicture(camera); + System.out.println(result); + return result; + } + + } /** - * - * @param m_sDeviceIP 设备ip地址 - * @param wPort 端口号,设备网络SDK登录默认端口8000 - * @param m_sUsername 用户名 - * @param m_sPassword 密码 - */ - public String Login_V40(String m_sDeviceIP,short wPort,String m_sUsername,String m_sPassword) { - /* 注册 */ - // 设备登录信息 - HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); + * @param m_sDeviceIP 设备ip地址 + * @param wPort 端口号,设备网络SDK登录默认端口8000 + * @param m_sUsername 用户名 + * @param m_sPassword 密码 + */ + public String Login_V40(String m_sDeviceIP, short wPort, String m_sUsername, String m_sPassword, CameraDTO camera) { + /* 注册 */ + // 设备登录信息 + HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); - // 设备信息 - HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); - m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; - System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); - m_strLoginInfo.wPort =wPort ; - m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; - System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); - m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; - System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); - // 是否异步登录:false- 否,true- 是 - m_strLoginInfo.bUseAsynLogin = false; - // write()调用后数据才写入到内存中 - m_strLoginInfo.write(); + // 设备信息 + HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); + m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; + System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); + m_strLoginInfo.wPort = wPort; + m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; + System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); + m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; + System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); + // 是否异步登录:false- 否,true- 是 + m_strLoginInfo.bUseAsynLogin = false; + // write()调用后数据才写入到内存中 + m_strLoginInfo.write(); - lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); - if (lUserID == -1) { -// updateZnfxPostalStatus(PostalStatus.ABNORMAL.value()); -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.ABNORMAL.value()); - - System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); - return "登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError(); - } else { - System.out.println("登录成功!"); - // read()后,结构体中才有对应的数据 - m_strDeviceInfo.read(); -// updateZnfxPostalStatus(PostalStatus.NORMAL.value()); -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.NORMAL.value()); - - String result = captureJPEGPicture(); - - return result; - } - } - - //注销设备 - public String logoutDevice() - { - NativeLong nlUserID = new NativeLong(lUserID); - if (!hCNetSDK.NET_DVR_Logout(nlUserID)) - { - System.out.println("注销失败,设备ID:"+ nlUserID.intValue() + "错误码:"+hCNetSDK.NET_DVR_GetLastError()); - return "{\"result\":\"loginDevice Fail\",\"userID\":"+nlUserID.intValue()+",\"errorCode\":"+hCNetSDK.NET_DVR_GetLastError()+"}"; - }else{ - System.out.println("注销成功,设备ID:"+ nlUserID.intValue()); - return "{\"result\":\"logoutDevice Success\",\"userID\":"+nlUserID.intValue()+",\"errorCode\":0}"; + lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); + if (lUserID == -1) { + VideoConfiguration.staticCameraService.setStatus(camera.getId(), CameraStatusEnum.OFFLINE.getCode()); + System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); + return "登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError(); + } else { + System.out.println("登录成功!"); + // read()后,结构体中才有对应的数据 + m_strDeviceInfo.read(); + VideoConfiguration.staticCameraService.setStatus(camera.getId(), CameraStatusEnum.ONLIEN.getCode()); + String result = captureJPEGPicture(camera); + return result; } } - /** - * 设备抓图(无预览) - * 单帧设备抓取保存的图片为JPG,具体注意问题需要详细查看【设备网络sdk使用手册】 - * @return - */ - public String captureJPEGPicture() - { -// ArrayList<String> list = mZnfxCodeService.getDriverInfo("driverpic"); - List<String> list = new ArrayList<>(); - list.add("tlChannel"); - list.add("tlPicSize"); - list.add("tlPicQuality"); - if (list != null && list.size() > 0) { - int tlChannel = Integer.parseInt(list.get(0)); - int tlPicSize = Integer.parseInt(list.get(1)); - int tlPicQuality = Integer.parseInt(list.get(2)); - NativeLong nlUserID = new NativeLong(lUserID); - NativeLong nChannel = new NativeLong(tlChannel); - HCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new HCNetSDK.NET_DVR_JPEGPARA(); - lpJpegPara.wPicSize = (short)tlPicSize; - lpJpegPara.wPicQuality = (short)tlPicQuality; - // 参数必须写入到结构体,否则在保存图片的时候异常图片 - lpJpegPara.write(); - String tFiledirName = CommonUtils.getCurrDate();//yyyyMMdd - // 创建文件名称 - String tDatePath = MessageCode.DvrPicSavePath+"/"+tFiledirName; - // 判断文件夹是否创建 - File tFile = new File(tDatePath); - if (!tFile.exists()){ - tFile.mkdirs(); - } - String tDate = CommonUtils.getCurrDate2();//yyyyMMddHHmmss - // 文件名称 - String tImageName = tDate +".png"; - // 全路径 - String tPath = tDatePath+"/"+tImageName; - // 开始抓图 - if (!hCNetSDK.NET_DVR_CaptureJPEGPicture(nlUserID, nChannel, lpJpegPara, tPath)) - { - return "失败编码:"+hCNetSDK.NET_DVR_GetLastError() ; - }else { - Long tImageId = CommonUtils.Getnum();//生成流水号 -// saveZnfxImageInfo(tFiledirName,tImageName,tPath,tImageId); + //注销设备 + public String logoutDevice() { + NativeLong nlUserID = new NativeLong(lUserID); + if (!hCNetSDK.NET_DVR_Logout(nlUserID)) { + System.out.println("注销失败,设备ID:" + nlUserID.intValue() + "错误码:" + hCNetSDK.NET_DVR_GetLastError()); + return "{\"result\":\"loginDevice Fail\",\"userID\":" + nlUserID.intValue() + ",\"errorCode\":" + hCNetSDK.NET_DVR_GetLastError() + "}"; + } else { + System.out.println("注销成功,设备ID:" + nlUserID.intValue()); + return "{\"result\":\"logoutDevice Success\",\"userID\":" + nlUserID.intValue() + ",\"errorCode\":0}"; + } + } - return "success>>>>>>>>>>>" + tImageName; - } - } - else - { - return "login fail>>>>>>>>>>>"; - } - } - /** - * 检查设备是否在线 + /** + * 设备抓图(无预览) + * 单帧设备抓取保存的图片为JPG,具体注意问题需要详细查看【设备网络sdk使用手册】 + * * @return */ - private boolean getDeviceStatus() { - boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(lUserID, 20005, null, 0); -// if (!isOnLine) { -//// updateZnfxPostalStatus(PostalStatus.ABNORMAL.value()); //离线 -//// insertZnfxPostalStatusLog(PostalStatus.ABNORMAL.value()); -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.ABNORMAL.value()); -// return false; -// } else { -// mZnfxPostalStatusService.changeStatus(MessageCode.POSTAL_STATUS_TYPE_CAMERA, PostalStatus.NORMAL.value()); -//// updateZnfxPostalStatus(PostalStatus.NORMAL.value());//在线 -// } - return true; - } + public String captureJPEGPicture(CameraDTO camera) { + int tlChannel = camera.getChannel(); + String tlPicSize = VideoConfiguration.staticPicSize; + String tlPicQuality = VideoConfiguration.staticPicQuality; + NativeLong nlUserID = new NativeLong(lUserID); + NativeLong nChannel = new NativeLong(tlChannel); + HCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new HCNetSDK.NET_DVR_JPEGPARA(); + lpJpegPara.wPicSize = Short.parseShort(tlPicSize); + lpJpegPara.wPicQuality = Short.parseShort(tlPicQuality); + // 参数必须写入到结构体,否则在保存图片的时候异常图片 + lpJpegPara.write(); + String tFilename = CommonUtils.getCurrDate();//yyyyMMdd + // 创建文件名称 + String tDatePath = VideoConfiguration.staticHkCapturePath + tFilename; + // 判断文件夹是否创建 + File tFile = new File(tDatePath); + if (!tFile.exists()) { + tFile.mkdirs(); + } + String tDate = CommonUtils.getCurrDate2();//yyyyMMddHHmmss + // 文件名称 + String tImageName = tDate + ".png"; + // 全路径 + String tPath = tDatePath + "/" + tImageName; + // 开始抓图 + if (!hCNetSDK.NET_DVR_CaptureJPEGPicture(nlUserID, nChannel, lpJpegPara, tPath)) { + return "失败编码:" + hCNetSDK.NET_DVR_GetLastError(); + } else { + Map<String, String> params = new HashMap<>(); + params.put("strFileName", tPath); + params.put("cmdSerial", camera.getCode()); + params.put("brand", "HK"); + VideoConfiguration.staticCameraService.dealCapture(params); + return "success>>>>>>>>>>>" + tImageName; + } + } + + /** + * 检查设备是否在线 + * + * @return + */ + private boolean getDeviceStatus(String id) { + boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(lUserID, 20005, null, 0); + if (!isOnLine) { + VideoConfiguration.staticCameraService.setStatus(id, CameraStatusEnum.OFFLINE.getCode()); + return false; + } else { + VideoConfiguration.staticCameraService.setStatus(id, CameraStatusEnum.ONLIEN.getCode()); + } + return true; + } // /** // * 更新摄像头通讯状态 // * @param status diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/CameraService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/CameraService.java index 4a92875..d99c27a 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/CameraService.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/CameraService.java @@ -29,7 +29,7 @@ void update(CameraDTO dto); - void delete(String[] ids); + void delete(String id); Long cheack(CameraDTO dto); @@ -38,4 +38,6 @@ CameraDTO getByCode(String code); void dealCapture(Map<String, String> params); + + void setStatus(String id, Integer status); } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/ImageService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/ImageService.java index 2c39c8f..16643d0 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/ImageService.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/ImageService.java @@ -1,35 +1,29 @@ package com.iailab.module.data.video.service; -import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.BaseService; +import com.iailab.module.data.video.controller.admin.camera.vo.ImagePageReqVO; import com.iailab.module.data.video.dto.ImageDTO; -import com.iailab.module.data.video.entity.DataEntity; import com.iailab.module.data.video.entity.ImageEntity; +import javax.validation.Valid; import java.util.Date; import java.util.List; -import java.util.Map; /** - * @author PanZhibao + * @author Houzhongjian * @Description * @createTime 2024年02月27日 */ public interface ImageService extends BaseService<ImageEntity> { - PageData<ImageDTO> page(Map<String, Object> params); + PageResult<ImageDTO> getPage(ImagePageReqVO imagePageReqVO); + + List<ImageDTO> list(@Valid ImagePageReqVO cameraPageReqVO); ImageDTO get(String id); - List<DataEntity> getValueList(String cameraId, Date startTime, Date endTime); - - void save(ImageDTO dto); - - void update(ImageDTO dto); - - void delete(String[] ids); - - String getUrl(String cameraId, String imagePath); + void delete(String id); ImageDTO get(String cameraId, Date createDate); diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/NvrService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/NvrService.java index c2339b7..6e65ad1 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/NvrService.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/NvrService.java @@ -30,7 +30,7 @@ String update(NvrSaveReqVO saveReqVO); - void delete(Long id); + void delete(String id); // Long cheack(DevNvrDTO dto); diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/CameraServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/CameraServiceImpl.java index 5084c84..cd8f26a 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/CameraServiceImpl.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/CameraServiceImpl.java @@ -10,8 +10,7 @@ import com.iailab.framework.web.core.util.WebFrameworkUtils; import com.iailab.module.data.mq.consumer.ImageMessage; import com.iailab.module.data.video.controller.admin.camera.vo.CameraPageReqVO; -import com.iailab.module.data.video.dahua.DHConfiguration; -import com.iailab.module.data.video.dahua.DHSavePath; +import com.iailab.module.data.video.config.VideoConfiguration; import com.iailab.module.data.video.dao.CameraDao; import com.iailab.module.data.video.dao.ImageDao; import com.iailab.module.data.video.dto.CameraDTO; @@ -21,6 +20,7 @@ import com.iailab.module.data.video.service.CameraService; import org.apache.commons.lang3.StringUtils; import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -36,6 +36,9 @@ */ @Service public class CameraServiceImpl extends BaseServiceImpl<CameraDao, CameraEntity> implements CameraService { + + @Value("${video.capture-dir}") + public String captureDir; @Resource private CameraDao cameraDao; @@ -94,20 +97,40 @@ public void dealCapture(Map<String, String> params) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.SECOND, 0); Date captureDate = calendar.getTime(); CameraDTO devCamera = getByCode(params.get("cmdSerial")); String strFileName = params.get("strFileName"); + String brand = params.get("brand"); + String capturePath = ""; + String routingKey = ""; + switch (brand) { + case "DH": + capturePath = VideoConfiguration.staticDhCapturePath; + routingKey = ImageMessage.DAHUA_ROUTING_KEY; + break; + case "HK": + capturePath = VideoConfiguration.staticHkCapturePath; + routingKey = ImageMessage.HIKVISION_ROUTING_KEY; + break; + } String imagePath = strFileName.replace("\\", "/"); - String imageUrl = imagePath.replace(DHConfiguration.staticCapturePath, ""); + String imageUrl = imagePath.replace(capturePath, ""); ImageEntity image = new ImageEntity(); image.setCameraId(devCamera.getId()); image.setImagePath(imagePath); - image.setImageUrl("/Capture/" + imageUrl); + image.setImageUrl(capturePath.replace(captureDir, "") + imageUrl); image.setCreateDate(captureDate); imageDao.insert(image); //存入rabbitmq消息队列,等待模型处理 - sendRabbitMQMessage(image); + sendRabbitMQMessage(image, routingKey); + } + + @Override + public void setStatus(String id, Integer status) { + CameraEntity cameraEntity = new CameraEntity(); + cameraEntity.setId(id); + cameraEntity.setStatus(status); + baseDao.updateById(cameraEntity); } private QueryWrapper<CameraEntity> getWrapper(CameraPageReqVO cameraPageReqVO){ @@ -136,8 +159,8 @@ @Override @DSTransactional(rollbackFor = Exception.class) - public void delete(String[] ids) { - baseDao.deleteBatchIds(Arrays.asList(ids)); + public void delete(String id) { + baseDao.deleteById(id); } @Override @@ -151,14 +174,13 @@ } // 发送rabbitMQ消息 - private void sendRabbitMQMessage(ImageEntity image) { + private void sendRabbitMQMessage(ImageEntity image, String routingKey) { String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); ImageMessage imageMessage = new ImageMessage(); imageMessage.setMessageId(image.getId()); imageMessage.setCreateTime(createTime); imageMessage.setImageDTO(BeanUtils.toBean(image, ImageDTO.class)); - rabbitTemplate.convertAndSend(ImageMessage.EXCHANGE, ImageMessage.DAHUA_ROUTING_KEY, imageMessage); - rabbitTemplate.convertAndSend(ImageMessage.EXCHANGE, ImageMessage.HIKVISION_ROUTING_KEY, imageMessage); + rabbitTemplate.convertAndSend(ImageMessage.EXCHANGE, routingKey, imageMessage); } } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/ImageServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/ImageServiceImpl.java index 2d6c2d8..a095674 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/ImageServiceImpl.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/ImageServiceImpl.java @@ -2,26 +2,26 @@ import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.iailab.framework.common.constant.Constant; -import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.data.video.controller.admin.camera.vo.ImagePageReqVO; import com.iailab.module.data.video.dao.ImageDao; import com.iailab.module.data.video.dto.ImageDTO; -import com.iailab.module.data.video.entity.DataEntity; import com.iailab.module.data.video.entity.ImageEntity; +import com.iailab.module.data.video.entity.DataEntity; import com.iailab.module.data.video.service.ImageService; import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import javax.validation.Valid; import java.util.*; /** - * @author PanZhibao + * @author Houzhongjian * @Description * @createTime 2024年02月27日 */ @@ -29,12 +29,17 @@ public class ImageServiceImpl extends BaseServiceImpl<ImageDao, ImageEntity> implements ImageService { @Override - public PageData<ImageDTO> page(Map<String, Object> params) { - IPage<ImageEntity> page = baseDao.selectPage( - getPage(params, Constant.CREATE_DATE, false), - getWrapper(params) - ); - return getPageData(page, ImageDTO.class); + public PageResult<ImageDTO> getPage(ImagePageReqVO imagePageReqVO) { + PageResult<ImageEntity> pageResult = baseDao.selectPage(imagePageReqVO); + return BeanUtils.toBean(pageResult, ImageDTO.class); + } + + @Override + public List<ImageDTO> list(@Valid ImagePageReqVO imagePageReqVO) { + QueryWrapper<ImageEntity> queryWrapper = getWrapper(imagePageReqVO); + queryWrapper.orderByDesc(Constant.CREATE_DATE); + List<ImageEntity> list = baseDao.selectList(queryWrapper); + return ConvertUtils.sourceToTarget(list, ImageDTO.class); } @Override @@ -44,79 +49,11 @@ return ConvertUtils.sourceToTarget(entity, ImageDTO.class); } - private QueryWrapper<ImageEntity> getWrapper(Map<String, Object> params){ - String cameraId = (String)params.get("cameraId"); - String startTime = (String)params.get("startTime"); - String endTime = (String)params.get("endTime"); - - QueryWrapper<ImageEntity> wrapper = new QueryWrapper<>(); - wrapper.eq(StringUtils.isNotBlank(cameraId), "camera_id", cameraId) - .ge(StringUtils.isNotBlank(startTime), "create_date", startTime) - .le(StringUtils.isNotBlank(endTime), "create_date", endTime); - - return wrapper; - } - - @Override - public List<DataEntity> getValueList(String cameraId, Date startTime, Date endTime) { - QueryWrapper<ImageEntity> wrapper = new QueryWrapper<>(); - wrapper.eq( "camera_id", cameraId) - .ge( "create_date", startTime) - .le( "create_date", endTime) - .orderByAsc("create_date"); - List<DataEntity> result = new ArrayList<>(); - List<ImageEntity> list = baseDao.selectList(wrapper); - if (CollectionUtils.isEmpty(list)) { - return result; - } - list.forEach(item -> { - DataEntity dataEntity = new DataEntity(); - dataEntity.setDataValue(item.getImagePath()); - dataEntity.setTimeStamp(item.getCreateDate()); - result.add(dataEntity); - }); - return result; - } - - @Override - public String getUrl(String cameraId, String imagePath) { - String result = ""; - QueryWrapper<ImageEntity> wrapper = new QueryWrapper<>(); - wrapper.eq( "camera_id", cameraId) - .eq( "image_path", imagePath) - .orderByDesc("create_date"); - List<ImageEntity> devImageEntities = baseDao.selectList(wrapper); - ImageEntity entity = new ImageEntity(); - if (ObjectUtils.isNotEmpty(devImageEntities)) { - entity = devImageEntities.get(0); - } - if (entity != null) { - return entity.getImageUrl(); - } - return result; - } - - @Override - public void save(ImageDTO dto) { - ImageEntity entity = ConvertUtils.sourceToTarget(dto, ImageEntity.class); - - //保存菜单 - insert(entity); - } - - @Override - public void update(ImageDTO dto) { - ImageEntity entity = ConvertUtils.sourceToTarget(dto, ImageEntity.class); - - //更新菜单 - updateById(entity); - } - @Override @DSTransactional(rollbackFor = Exception.class) - public void delete(String[] ids) { + public void delete(String id) { //删除菜单 - baseDao.deleteBatchIds(Arrays.asList(ids)); + baseDao.deleteById(id); } @Override @@ -132,4 +69,11 @@ return ConvertUtils.sourceToTarget(entity, ImageDTO.class); } + private QueryWrapper<ImageEntity> getWrapper(ImagePageReqVO imagePageReqVO){ + String cameraId = imagePageReqVO.getCameraId(); + QueryWrapper<ImageEntity> wrapper = new QueryWrapper<>(); + wrapper.eq( "camera_id", cameraId); + return wrapper; + } + } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/NvrServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/NvrServiceImpl.java index fc5b663..7d1847c 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/NvrServiceImpl.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/service/impl/NvrServiceImpl.java @@ -115,7 +115,7 @@ @Override @DSTransactional(rollbackFor = Exception.class) - public void delete(Long id) { + public void delete(String id) { nvrDao.deleteById(id); } diff --git a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-dev.yaml b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-dev.yaml index 7521d5c..c315b9f 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-dev.yaml +++ b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-dev.yaml @@ -81,10 +81,15 @@ upload-dir: D:/DLUT/upload/ video: + capture-dir: D:/iailab dahua: path: - capturePath: D:/irs/Capture/ - modelPath: D:/irs/Model/ - callback: - url: http://localhost:48080/admin-api/data/video/camera/DHCaptureCallback + capture-path: /Dahua/Capture/ + model-path: /Dahua/Model/ + hikvision: + path: + capture-path: /Hikvision/Capture/ + model-path: /Hikvision/Model/ + pic-size: 2 # size of picture 0=CIF, 1=QCIF, 2=D1 3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA + pic-quality: 0 # quality of picture 0-best 1-better 2-normal diff --git a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml index f384b30..aee65d8 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml +++ b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml @@ -52,7 +52,7 @@ influx-db: org: iailab bucket: buk_shasteel - token: Q2qsriQG3FEfZ35lik1KSkFToma3bsgfQLwJrNQfSK06MC569sZ9mrQ0vLtsVYn70HMfQcC9gf_yUG16JQtm8w== + token: p-WkLXdPmHD4Cdij2PD-r92dLEQqjQ8V5KhyZYHYroBNVE0ZrW5VgzqWBNmXmiEdxEWaURC7rrKVzuM0XTEraQ== url: http://172.16.8.200:8086 username: root password: iailab12345678 @@ -61,10 +61,15 @@ upload-dir: D:/DLUT/upload/ video: + capture-dir: D:/iailab dahua: path: - capturePath: D:/irs/Capture/ - modelPath: D:/irs/Model/ - callback: - url: http://localhost:48080/admin-api/data/video/camera/DHCaptureCallback + capture-path: /Dahua/Capture/ + model-path: /Dahua/Model/ + hikvision: + path: + capture-path: /Hikvision/Capture/ + model-path: /Hikvision/Model/ + pic-size: 2 # size of picture 0=CIF, 1=QCIF, 2=D1 3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA + pic-quality: 0 # quality of picture 0-best 1-better 2-normal -- Gitblit v1.9.3