ard-work/src/main/java/com/ruoyi/alarmpoints/tube/controller/ArdTubesDetailsController.java
@@ -120,6 +120,7 @@ String message = ardTubesDetailsService.importArdTubesDetails(tubesDetailsList, updateSupport, operName,tubeId); return success(message); } @PostMapping("/importTemplate") @ApiOperation(value = "ç®¡çº¿è¯¦æ æ¨¡æ¿ä¸è½½æ¥å£") public void importTemplate(HttpServletResponse response) ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java
@@ -152,9 +152,9 @@ @ApiOperation("å¯¼å ¥äº") public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { ExcelUtil<ArdAlarmpointsWell> util = new ExcelUtil<ArdAlarmpointsWell>(ArdAlarmpointsWell.class); List<ArdAlarmpointsWell> userList = util.importExcel(file.getInputStream()); List<ArdAlarmpointsWell> wellList = util.importExcel(file.getInputStream()); String operName = getUsername(); String message = ardAlarmpointsWellService.importUser(userList, updateSupport, operName); String message = ardAlarmpointsWellService.importWell(wellList, updateSupport, operName); return success(message); } ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java
@@ -62,7 +62,13 @@ * @return ç»æ */ public int updateArdAlarmpointsWell(ArdAlarmpointsWell ardAlarmpointsWell); /** * ä¿®æ¹äºç®¡çæäºå· * * @param ardAlarmpointsWell äºç®¡ç * @return ç»æ */ public int updateArdAlarmpointsWellByWellId(ArdAlarmpointsWell ardAlarmpointsWell); /** * å é¤äºç®¡ç * ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java
@@ -60,7 +60,13 @@ * @return ç»æ */ public int updateArdAlarmpointsWell(ArdAlarmpointsWell ardAlarmpointsWell); /** * ä¿®æ¹äºç®¡çæäºå· * * @param ardAlarmpointsWell äºç®¡ç * @return ç»æ */ public int updateArdAlarmpointsWellByWellId(ArdAlarmpointsWell ardAlarmpointsWell); /** * æ¹éå é¤äºç®¡ç * @@ -84,7 +90,7 @@ * @param operName æä½ç¨æ· * @return ç»æ */ public String importUser(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName); public String importWell(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName); /** * æ ¡éªç¨æ·æ¯å¦ææ°æ®æé * ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java
@@ -126,7 +126,13 @@ ardAlarmpointsWell.setUpdateTime(DateUtils.getNowDate()); return ardAlarmpointsWellMapper.updateArdAlarmpointsWell(ardAlarmpointsWell); } @Override @Transactional public int updateArdAlarmpointsWellByWellId(ArdAlarmpointsWell ardAlarmpointsWell) { ardAlarmpointsWell.setUpdateBy(SecurityUtils.getUsername()); ardAlarmpointsWell.setUpdateTime(DateUtils.getNowDate()); return ardAlarmpointsWellMapper.updateArdAlarmpointsWellByWellId(ardAlarmpointsWell); } /** * æ¹éå é¤äºç®¡ç * @@ -150,7 +156,7 @@ } @Override public String importUser(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName) { public String importWell(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName) { if (StringUtils.isNull(ardAlarmpointsWellList) || ardAlarmpointsWellList.size() == 0) { throw new ServiceException("å¯¼å ¥äºæ°æ®ä¸è½ä¸ºç©ºï¼"); } @@ -163,9 +169,9 @@ //è·åå½åç»å½ç¨æ·id String userId = SecurityUtils.getUserId(); well.setUserId(userId); // éªè¯æ¯å¦åå¨è¿ä¸ªç¨æ· ArdAlarmpointsWell u = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(well.getWellId()); if (StringUtils.isNull(u)) { // éªè¯æ¯å¦åå¨è¿ä¸ªäº ArdAlarmpointsWell w = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(well.getWellId()); if (StringUtils.isNull(w)) { BeanValidators.validateWithException(validator, well); well.setCreateBy(operName); this.insertArdAlarmpointsWell(well); @@ -173,10 +179,9 @@ successMsg.append("<br/>" + successNum + "ãäºå· " + well.getWellId() + " å¯¼å ¥æå"); } else if (isUpdateSupport) { BeanValidators.validateWithException(validator, well); checkWellAllowed(well); checkWellDataScope(well.getUserId()); well.setUpdateBy(operName); this.updateArdAlarmpointsWell(well); this.updateArdAlarmpointsWellByWellId(well); successNum++; successMsg.append("<br/>" + successNum + "ãäºå· " + well.getWellId() + " æ´æ°æå"); } else { ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java
@@ -3,6 +3,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell; import com.ruoyi.common.constant.CameraConstants; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; @@ -27,6 +28,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.page.TableDataInfo; import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -137,6 +139,27 @@ return toAjax(ardCamerasService.deleteArdCamerasByIds(ids)); } @Log(title = "å¯¼å ¥ç¸æºè®¾å¤", businessType = BusinessType.IMPORT) @PreAuthorize("@ss.hasPermi('device:cameras:import')") @PostMapping("/importData") @ApiOperation("å¯¼å ¥ç¸æºè®¾å¤") public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { ExcelUtil<ArdCameras> util = new ExcelUtil<ArdCameras>(ArdCameras.class); List<ArdCameras> camerasList = util.importExcel(file.getInputStream()); String operName = getUsername(); String message = ardCamerasService.importCameras(camerasList, updateSupport, operName); return success(message); } @PostMapping("/importTemplate") @ApiOperation("ç¸æºè®¾å¤å¯¼å ¥æ¨¡æ¿") public void importTemplate(HttpServletResponse response) { ExcelUtil<ArdCameras> util = new ExcelUtil<ArdCameras>(ArdCameras.class); util.importTemplateExcel(response, "ç¸æºè®¾å¤æ°æ®"); } @GetMapping("/options") @ApiOperation("éæ©ç¸æºæ°æ®") public List options(ArdCameras ardCameras) { ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
@@ -11,11 +11,18 @@ import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.service.IArdCamerasService; import com.ruoyi.device.camera.service.ICameraSdkService; import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone; import com.ruoyi.device.noguidezone.service.IArdCameraNoGuideZoneService; import com.ruoyi.utils.gis.GisUtil; import com.ruoyi.utils.gis.Point; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -36,7 +43,8 @@ private ICameraSdkService cameraSdkService; @Resource private IArdCamerasService ardCamerasService; @Autowired private IArdCameraNoGuideZoneService ardCameraNoGuideZoneService; @RequestMapping("/preview") private String preview() { @@ -137,6 +145,7 @@ Map<String, Object> ptzMap = cameraSdkService.getPtz(cmd); return AjaxResult.success("è·åptz", ptzMap); } @ApiOperation("è·åPTZèå´") @PostMapping("/getPTZScope") @Log(title = "è·åPTZèå´", businessType = BusinessType.CONTROL) @@ -165,6 +174,33 @@ public @ResponseBody AjaxResult setTargetPosition(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); //æ¦æªæå¨å¼å¯¼ ArdCameraNoGuideZone ardCameraNoGuideZone = new ArdCameraNoGuideZone(); ardCameraNoGuideZone.setCameraId(cmd.getCameraId()); //è·åå½åç¸æºçç¦å¼å¯è§åå表 List<ArdCameraNoGuideZone> ardCameraNoGuideZones = ardCameraNoGuideZoneService.selectArdCameraNoGuideZoneList(ardCameraNoGuideZone); if (ardCameraNoGuideZones.size() > 0) { //è·åå°å½åç¸æºçåæ éå List<Point> pointList = new ArrayList<>(); for(ArdCameraNoGuideZone zone:ardCameraNoGuideZones) { String[] parts = zone.getPoi().split(","); for (int i = 0; i < parts.length; i += 3) { Point point = new Point(); point.setLongitude(Double.valueOf(parts[i])); point.setLatitude(Double.valueOf(parts[i + 1])); pointList.add(point); } } double lon = cmd.getTargetPosition()[0]; double lat = cmd.getTargetPosition()[1]; Point targetPoint = new Point(lon, lat); //夿å¼å¯¼ç®æ æ¯å¦å¨åæ éåç»æçå¤è¾¹å½¢å boolean inPolygon = GisUtil.isInPolygon(targetPoint, pointList); if(inPolygon) { return AjaxResult.error("å¼å¯¼åæ ä½äºç¦å¼å¯è§åå "); } } return toAjax(cameraSdkService.guideTargetPosition(cmd)); } ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java
@@ -5,6 +5,7 @@ import java.util.Map; import java.util.TreeMap; import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.scheduling.domian.SchedulingParam; @@ -71,6 +72,30 @@ */ public int deleteArdCamerasById(String id); /** * å¯¼å ¥ç¸æºè®¾å¤ä¿¡æ¯ * * @param ardCamerasList ç¸æºè®¾å¤æ°æ®å表 * @param isUpdateSupport æ¯å¦æ´æ°æ¯æï¼å¦æå·²åå¨ï¼åè¿è¡æ´æ°æ°æ® * @param operName æä½ç¨æ· * @return ç»æ */ public String importCameras(List<ArdCameras> ardCamerasList, Boolean isUpdateSupport, String operName); /** * æ ¡éªç¸æºæ¯å¦å 许æä½ * * @param ardCameras ç¸æºä¿¡æ¯ */ public void checkCameraAllowed(ArdCameras ardCameras); /** * æ ¡éªç¨æ·æ¯å¦ææ°æ®æé * * @param userId ç¨æ·id */ public void checkCameraDataScope(String userId); public List findOptions(ArdCameras ardCameras); /** * @æè¿° è·åæ¬é¨é¨ä»¥ä¸çææç¸æºåé¨é¨ ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -3,13 +3,18 @@ import java.util.*; import java.util.stream.Collectors; import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CameraConstants; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanValidators; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.channel.domain.ArdChannel; @@ -25,10 +30,12 @@ import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.utils.gis.Point; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.validation.Validator; /** * ç¸æºè®¾å¤Serviceä¸å¡å±å¤ç @@ -50,7 +57,8 @@ private ArdChannelMapper ardChannelMapper; @Resource private IVtduService vtduService; @Autowired protected Validator validator; @PostConstruct public void loadCameras() { @@ -200,6 +208,84 @@ return i; } @Override public String importCameras(List<ArdCameras> ardCamerasList, Boolean isUpdateSupport, String operName) { if (StringUtils.isNull(ardCamerasList) || ardCamerasList.size() == 0) { throw new ServiceException("å¯¼å ¥äºæ°æ®ä¸è½ä¸ºç©ºï¼"); } int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); for (ArdCameras camera : ardCamerasList) { try { //è·åå½åç»å½ç¨æ·id String userId = SecurityUtils.getUserId(); camera.setUserId(userId); // éªè¯æ¯å¦åå¨è¿ä¸ªç¨æ· ArdCameras u = ardCamerasMapper.selectArdCamerasById(camera.getId()); if (StringUtils.isNull(u)) { BeanValidators.validateWithException(validator, camera); camera.setCreateBy(operName); this.insertArdCameras(camera); successNum++; successMsg.append("<br/>" + successNum + "ãç¸æºID " + camera.getId() + " å¯¼å ¥æå"); } else if (isUpdateSupport) { BeanValidators.validateWithException(validator, camera); checkCameraDataScope(camera.getUserId()); camera.setUpdateBy(operName); this.updateArdCameras(camera); successNum++; successMsg.append("<br/>" + successNum + "ãç¸æºID " + camera.getId() + " æ´æ°æå"); } else { failureNum++; failureMsg.append("<br/>" + failureNum + "ãç¸æºID " + camera.getId() + " å·²åå¨"); } } catch (Exception e) { failureNum++; String msg = "<br/>" + failureNum + "ãç¸æºID " + camera.getId() + " å¯¼å ¥å¤±è´¥ï¼"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } } if (failureNum > 0) { failureMsg.insert(0, "徿±æï¼å¯¼å ¥å¤±è´¥ï¼å ± " + failureNum + " æ¡æ°æ®æ ¼å¼ä¸æ£ç¡®ï¼é误å¦ä¸ï¼"); throw new ServiceException(failureMsg.toString()); } else { successMsg.insert(0, "æåæ¨ï¼æ°æ®å·²å ¨é¨å¯¼å ¥æåï¼å ± " + successNum + " æ¡ï¼æ°æ®å¦ä¸ï¼"); } return successMsg.toString(); } /** * æ ¡éªç¸æºæ¯å¦å 许æä½ * * @param ardCameras ç¸æºä¿¡æ¯ */ @Override public void checkCameraAllowed(ArdCameras ardCameras) { if (StringUtils.isNotNull(ardCameras.getId())) { throw new ServiceException("ä¸å 许æä½äº"); } } /** * æ ¡éªç¨æ·æ¯å¦ææ°æ®æé * * @param userId ç¨æ·id */ @Override public void checkCameraDataScope(String userId) { if (!SysUser.isAdmin(SecurityUtils.getUserId())) { ArdCameras camera = new ArdCameras(); camera.setUserId(userId); List<ArdCameras> cameras = SpringUtils.getAopProxy(this).selectArdCamerasList(camera); if (StringUtils.isEmpty(cameras)) { throw new ServiceException("没ææé访é®äºæ°æ®ï¼"); } } } public List findOptions(ArdCameras ardCameras) { List<ArdCameras> options = ardCamerasMapper.findOptions(ardCameras); for (ArdCameras camera : ard-work/src/main/java/com/ruoyi/device/noguidezone/controller/ArdCameraNoGuideZoneController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,113 @@ package com.ruoyi.device.noguidezone.controller; import java.util.List; import javax.servlet.http.HttpServletResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone; import com.ruoyi.device.noguidezone.service.IArdCameraNoGuideZoneService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; /** * ç¦å¼å¯è§åController * * @author ard * @date 2023-10-27 */ @Api(tags = "ç¦å¼å¯è§åç®¡çæ¥å£") @RestController @RequestMapping("/device/noguidezone") public class ArdCameraNoGuideZoneController extends BaseController { @Autowired private IArdCameraNoGuideZoneService ardCameraNoGuideZoneService; /** * æ¥è¯¢ç¦å¼å¯è§åå表 */ @ApiOperation("æ¥è¯¢ç¦å¼å¯è§åå表") @PreAuthorize("@ss.hasPermi('device:noguidezone:list')") @GetMapping("/list") public TableDataInfo list(ArdCameraNoGuideZone ardCameraNoGuideZone) { startPage(); List<ArdCameraNoGuideZone> list = ardCameraNoGuideZoneService.selectArdCameraNoGuideZoneList(ardCameraNoGuideZone); return getDataTable(list); } /** * 导åºç¦å¼å¯è§åå表 */ @PreAuthorize("@ss.hasPermi('device:noguidezone:export')") @Log(title = "ç¦å¼å¯è§å", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, ArdCameraNoGuideZone ardCameraNoGuideZone) { List<ArdCameraNoGuideZone> list = ardCameraNoGuideZoneService.selectArdCameraNoGuideZoneList(ardCameraNoGuideZone); ExcelUtil<ArdCameraNoGuideZone> util = new ExcelUtil<ArdCameraNoGuideZone>(ArdCameraNoGuideZone.class); util.exportExcel(response, list, "ç¦å¼å¯è§åæ°æ®"); } /** * è·åç¦å¼å¯è§å详ç»ä¿¡æ¯ */ @ApiOperation("è·åç¦å¼å¯è§å详ç»ä¿¡æ¯") @PreAuthorize("@ss.hasPermi('device:noguidezone:query')") @GetMapping(value = "/{name}") public AjaxResult getInfo(@PathVariable("name") String name) { return success(ardCameraNoGuideZoneService.selectArdCameraNoGuideZoneByName(name)); } /** * æ°å¢ç¦å¼å¯è§å */ @ApiOperation("æ°å¢ç¦å¼å¯è§å") @PreAuthorize("@ss.hasPermi('device:noguidezone:add')") @Log(title = "ç¦å¼å¯è§å", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody ArdCameraNoGuideZone ardCameraNoGuideZone) { return toAjax(ardCameraNoGuideZoneService.insertArdCameraNoGuideZone(ardCameraNoGuideZone)); } /** * ä¿®æ¹ç¦å¼å¯è§å */ @ApiOperation("ä¿®æ¹ç¦å¼å¯è§å") @PreAuthorize("@ss.hasPermi('device:noguidezone:edit')") @Log(title = "ç¦å¼å¯è§å", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody ArdCameraNoGuideZone ardCameraNoGuideZone) { return toAjax(ardCameraNoGuideZoneService.updateArdCameraNoGuideZone(ardCameraNoGuideZone)); } /** * å é¤ç¦å¼å¯è§å */ @ApiOperation("å é¤ç¦å¼å¯è§å") @PreAuthorize("@ss.hasPermi('device:noguidezone:remove')") @Log(title = "ç¦å¼å¯è§å", businessType = BusinessType.DELETE) @DeleteMapping("/{names}") public AjaxResult remove(@PathVariable String[] names) { return toAjax(ardCameraNoGuideZoneService.deleteArdCameraNoGuideZoneByNames(names)); } } ard-work/src/main/java/com/ruoyi/device/noguidezone/domain/ArdCameraNoGuideZone.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,125 @@ package com.ruoyi.device.noguidezone.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; /** * ç¦å¼å¯è§å对象 ard_camera_no_guide_zone * * @author ard * @date 2023-10-27 */ public class ArdCameraNoGuideZone extends BaseEntity { private static final long serialVersionUID = 1L; /** åç§° */ @Excel(name = "åç§°") private String name; /** èå´ */ @Excel(name = "èå´") private String poi; /** ç¸æºID */ @Excel(name = "ç¸æºID") private String cameraId; /** æ¯å¦å¯ç¨ */ @Excel(name = "æ¯å¦å¯ç¨") private String enabled; /** é¨é¨ID */ @Excel(name = "é¨é¨ID") private Long deptId; /** ç¨æ·ID */ @Excel(name = "ç¨æ·ID") private String userId; /** id */ private String id; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setPoi(String poi) { this.poi = poi; } public String getPoi() { return poi; } public void setCameraId(String cameraId) { this.cameraId = cameraId; } public String getCameraId() { return cameraId; } public void setEnabled(String enabled) { this.enabled = enabled; } public String getEnabled() { return enabled; } public void setDeptId(Long deptId) { this.deptId = deptId; } public Long getDeptId() { return deptId; } public void setUserId(String userId) { this.userId = userId; } public String getUserId() { return userId; } public void setId(String id) { this.id = id; } public String getId() { return id; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("name", getName()) .append("poi", getPoi()) .append("cameraId", getCameraId()) .append("enabled", getEnabled()) .append("deptId", getDeptId()) .append("userId", getUserId()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("id", getId()) .toString(); } } ard-work/src/main/java/com/ruoyi/device/noguidezone/mapper/ArdCameraNoGuideZoneMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,61 @@ package com.ruoyi.device.noguidezone.mapper; import java.util.List; import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone; /** * ç¦å¼å¯è§åMapperæ¥å£ * * @author ard * @date 2023-10-27 */ public interface ArdCameraNoGuideZoneMapper { /** * æ¥è¯¢ç¦å¼å¯è§å * * @param name ç¦å¼å¯è§åä¸»é® * @return ç¦å¼å¯è§å */ public ArdCameraNoGuideZone selectArdCameraNoGuideZoneByName(String name); /** * æ¥è¯¢ç¦å¼å¯è§åå表 * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç¦å¼å¯è§åéå */ public List<ArdCameraNoGuideZone> selectArdCameraNoGuideZoneList(ArdCameraNoGuideZone ardCameraNoGuideZone); /** * æ°å¢ç¦å¼å¯è§å * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç»æ */ public int insertArdCameraNoGuideZone(ArdCameraNoGuideZone ardCameraNoGuideZone); /** * ä¿®æ¹ç¦å¼å¯è§å * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç»æ */ public int updateArdCameraNoGuideZone(ArdCameraNoGuideZone ardCameraNoGuideZone); /** * å é¤ç¦å¼å¯è§å * * @param name ç¦å¼å¯è§åä¸»é® * @return ç»æ */ public int deleteArdCameraNoGuideZoneByName(String name); /** * æ¹éå é¤ç¦å¼å¯è§å * * @param names éè¦å é¤çæ°æ®ä¸»é®éå * @return ç»æ */ public int deleteArdCameraNoGuideZoneByNames(String[] names); } ard-work/src/main/java/com/ruoyi/device/noguidezone/service/IArdCameraNoGuideZoneService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,61 @@ package com.ruoyi.device.noguidezone.service; import java.util.List; import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone; /** * ç¦å¼å¯è§åServiceæ¥å£ * * @author ard * @date 2023-10-27 */ public interface IArdCameraNoGuideZoneService { /** * æ¥è¯¢ç¦å¼å¯è§å * * @param name ç¦å¼å¯è§åä¸»é® * @return ç¦å¼å¯è§å */ public ArdCameraNoGuideZone selectArdCameraNoGuideZoneByName(String name); /** * æ¥è¯¢ç¦å¼å¯è§åå表 * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç¦å¼å¯è§åéå */ public List<ArdCameraNoGuideZone> selectArdCameraNoGuideZoneList(ArdCameraNoGuideZone ardCameraNoGuideZone); /** * æ°å¢ç¦å¼å¯è§å * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç»æ */ public int insertArdCameraNoGuideZone(ArdCameraNoGuideZone ardCameraNoGuideZone); /** * ä¿®æ¹ç¦å¼å¯è§å * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç»æ */ public int updateArdCameraNoGuideZone(ArdCameraNoGuideZone ardCameraNoGuideZone); /** * æ¹éå é¤ç¦å¼å¯è§å * * @param names éè¦å é¤çç¦å¼å¯è§å主é®éå * @return ç»æ */ public int deleteArdCameraNoGuideZoneByNames(String[] names); /** * å é¤ç¦å¼å¯è§åä¿¡æ¯ * * @param name ç¦å¼å¯è§åä¸»é® * @return ç»æ */ public int deleteArdCameraNoGuideZoneByName(String name); } ard-work/src/main/java/com/ruoyi/device/noguidezone/service/impl/ArdCameraNoGuideZoneServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,98 @@ package com.ruoyi.device.noguidezone.service.impl; import java.util.List; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.uuid.IdUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.device.noguidezone.mapper.ArdCameraNoGuideZoneMapper; import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone; import com.ruoyi.device.noguidezone.service.IArdCameraNoGuideZoneService; /** * ç¦å¼å¯è§åServiceä¸å¡å±å¤ç * * @author ard * @date 2023-10-27 */ @Service public class ArdCameraNoGuideZoneServiceImpl implements IArdCameraNoGuideZoneService { @Autowired private ArdCameraNoGuideZoneMapper ardCameraNoGuideZoneMapper; /** * æ¥è¯¢ç¦å¼å¯è§å * * @param name ç¦å¼å¯è§åä¸»é® * @return ç¦å¼å¯è§å */ @Override public ArdCameraNoGuideZone selectArdCameraNoGuideZoneByName(String name) { return ardCameraNoGuideZoneMapper.selectArdCameraNoGuideZoneByName(name); } /** * æ¥è¯¢ç¦å¼å¯è§åå表 * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç¦å¼å¯è§å */ @Override public List<ArdCameraNoGuideZone> selectArdCameraNoGuideZoneList(ArdCameraNoGuideZone ardCameraNoGuideZone) { return ardCameraNoGuideZoneMapper.selectArdCameraNoGuideZoneList(ardCameraNoGuideZone); } /** * æ°å¢ç¦å¼å¯è§å * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç»æ */ @Override public int insertArdCameraNoGuideZone(ArdCameraNoGuideZone ardCameraNoGuideZone) { ardCameraNoGuideZone.setUserId(SecurityUtils.getUserId()); ardCameraNoGuideZone.setCreateBy(SecurityUtils.getUsername()); ardCameraNoGuideZone.setCreateTime(DateUtils.getNowDate()); ardCameraNoGuideZone.setId(IdUtils.simpleUUID()); return ardCameraNoGuideZoneMapper.insertArdCameraNoGuideZone(ardCameraNoGuideZone); } /** * ä¿®æ¹ç¦å¼å¯è§å * * @param ardCameraNoGuideZone ç¦å¼å¯è§å * @return ç»æ */ @Override public int updateArdCameraNoGuideZone(ArdCameraNoGuideZone ardCameraNoGuideZone) { ardCameraNoGuideZone.setUpdateBy(SecurityUtils.getUsername()); ardCameraNoGuideZone.setUpdateTime(DateUtils.getNowDate()); return ardCameraNoGuideZoneMapper.updateArdCameraNoGuideZone(ardCameraNoGuideZone); } /** * æ¹éå é¤ç¦å¼å¯è§å * * @param names éè¦å é¤çç¦å¼å¯è§åä¸»é® * @return ç»æ */ @Override public int deleteArdCameraNoGuideZoneByNames(String[] names) { return ardCameraNoGuideZoneMapper.deleteArdCameraNoGuideZoneByNames(names); } /** * å é¤ç¦å¼å¯è§åä¿¡æ¯ * * @param name ç¦å¼å¯è§åä¸»é® * @return ç»æ */ @Override public int deleteArdCameraNoGuideZoneByName(String name) { return ardCameraNoGuideZoneMapper.deleteArdCameraNoGuideZoneByName(name); } } ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhClientServiceImpl.java
@@ -896,7 +896,7 @@ // è®¾å¤æçº¿åè°: å½è®¾å¤åºç°æçº¿æ¶ï¼SDKä¼è°ç¨è¯¥å½æ° private static class DisConnect implements NetSDKLib.fDisConnect { public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { log.warn("Device[" + pchDVRIP + "] Port[" + nDVRPort + "] DisConnect!"); log.warn("Device[" + pchDVRIP + ":" + nDVRPort + "] DisConnect!"); } } @@ -904,7 +904,7 @@ private static class HaveReConnect implements NetSDKLib.fHaveReConnect { @Override public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { log.warn("ReConnect Device[" + pchDVRIP + "] Port[" + nDVRPort + "]"); log.warn("ReConnect Device[" + pchDVRIP + ":" + nDVRPort + "]"); } } ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/ExceptionCallBack.java
@@ -22,19 +22,19 @@ Integer port = camera.getPort(); switch (dwType) { case EXCEPTION_EXCHANGE: log.warn("Device[" + ip + "] Port[" + port + "]ç¨æ·äº¤äºæ¶å¼å¸¸"); log.warn("Device[" + ip + ":" + port + "]ç¨æ·äº¤äºæ¶å¼å¸¸"); break; case EXCEPTION_PREVIEW: log.warn("Device[" + ip + "] Port[" + port + "]ç½ç»é¢è§å¼å¸¸"); log.warn("Device[" + ip + ":" + port + "]ç½ç»é¢è§å¼å¸¸"); break; case EXCEPTION_RECONNECT: log.warn("Device[" + ip + "] Port[" + port + "]é¢è§æ¶éè¿"); log.warn("Device[" + ip + ":" + port + "]é¢è§æ¶éè¿"); break; case RELOGIN_SUCCESS: log.warn("Device[" + ip + "] Port[" + port + "]ç¨æ·éç»éæå"); log.warn("Device[" + ip + ":" + port + "]ç¨æ·éç»éæå"); break; case EXCEPTION_RELOGIN: log.warn("Device[" + ip + "] Port[" + port + "]ç¨æ·éç»é"); log.warn("Device[" + ip + ":" + port + "]ç¨æ·éç»é"); break; } } ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikClientServiceImpl.java
@@ -1094,7 +1094,7 @@ public boolean controlInfrarecfg(CameraCmd cmd) { String cameraId = cmd.getCameraId(); boolean enable = cmd.isEnable(); Integer channelNum = cmd.getChanNo(); Integer chanNo = cmd.getChanNo(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; } @@ -1102,17 +1102,17 @@ NET_DVR_CAMERAPARAMCFG_EX struDayNigh = new NET_DVR_CAMERAPARAMCFG_EX(); Pointer point = struDayNigh.getPointer(); IntByReference ibrBytesReturned = new IntByReference(0); boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_CCDPARAMCFG_EX, channelNum, point, struDayNigh.size(), ibrBytesReturned); boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_CCDPARAMCFG_EX, chanNo, point, struDayNigh.size(), ibrBytesReturned); if (!b_GetCameraParam) { log.error("è·ååç«¯åæ°å¤±è´¥ï¼é误ç ï¼" + hCNetSDK.NET_DVR_GetLastError()); } struDayNigh.read(); log.debug("æ¯å¦å¼å¯å¤è§ï¼" + struDayNigh.struDayNight.byDayNightFilterType); String current = struDayNigh.struDayNight.byDayNightFilterType == 1 ? "å¼å¯" : "å ³é"; log.debug("å½åç¶æ:" + current); NET_DVR_DAYNIGHT daynight = new NET_DVR_DAYNIGHT(); if (enable) { daynight.byDayNightFilterType = 1;//夿 } else { daynight.byDayNightFilterType = 0;//ç½å¤© } @@ -1120,12 +1120,15 @@ daynight.byDayNightFilterTime = 60; struDayNigh.struDayNight = daynight; struDayNigh.write(); boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_CCDPARAMCFG_EX, channelNum, point, struDayNigh.size()); boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_CCDPARAMCFG_EX, chanNo, point, struDayNigh.size()); if (!bool) { int code = hCNetSDK.NET_DVR_GetLastError(); log.error("设置å¤è§å¤±è´¥,请ç¨åéè¯" + code); } log.debug("设置å¤è§æå"); else { log.debug("设置å¤è§æå"); } return bool; } ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml
@@ -185,7 +185,35 @@ </trim> where id = #{id} </update> <update id="updateArdAlarmpointsWellByWellId" parameterType="ArdAlarmpointsWell"> update ard_alarmpoints_well <trim prefix="SET" suffixOverrides=","> <if test="wellId != null">well_id = #{wellId},</if> <if test="wellNumber != null">well_number = #{wellNumber},</if> <if test="oilProduction != null">oil_production = #{oilProduction},</if> <if test="wellBlock != null">well_block = #{wellBlock},</if> <if test="productionDate != null">production_date = #{productionDate},</if> <if test="displacementMode != null">displacement_mode = #{displacementMode},</if> <if test="surroundingEnvironment != null">surrounding_environment = #{surroundingEnvironment},</if> <if test="wellType != null">well_type = #{wellType},</if> <if test="installedLoad != null">installed_load = #{installedLoad},</if> <if test="meteringStation != null">metering_station = #{meteringStation},</if> <if test="transferStation != null">transfer_station = #{transferStation},</if> <if test="dehydrationStation != null">dehydration_station = #{dehydrationStation},</if> <if test="runStatus != null">run_status = #{runStatus},</if> <if test="longitude != null">longitude = #{longitude},</if> <if test="latitude != null">latitude = #{latitude},</if> <if test="altitude != null">altitude = #{altitude},</if> <if test="deptId != null">dept_id = #{deptId},</if> <if test="userId != null">user_id = #{userId},</if> <if test="createBy != null">create_by = #{createBy},</if> <if test="createTime != null">create_time = #{createTime},</if> <if test="updateBy != null">update_by = #{updateBy},</if> <if test="updateTime != null">update_time = #{updateTime},</if> <if test="cameraId != null">camera_id = #{cameraId},</if> </trim> where well_id = #{wellId} </update> <delete id="deleteArdAlarmpointsWellById" parameterType="String"> delete from ard_alarmpoints_well ard-work/src/main/resources/mapper/device/ArdCameraNoGuideZoneMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,99 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.device.noguidezone.mapper.ArdCameraNoGuideZoneMapper"> <resultMap type="ArdCameraNoGuideZone" id="ArdCameraNoGuideZoneResult"> <result property="name" column="name" /> <result property="poi" column="poi" /> <result property="cameraId" column="camera_id" /> <result property="enabled" column="enabled" /> <result property="deptId" column="dept_id" /> <result property="userId" column="user_id" /> <result property="createBy" column="create_by" /> <result property="createTime" column="create_time" /> <result property="updateBy" column="update_by" /> <result property="updateTime" column="update_time" /> <result property="id" column="id" /> </resultMap> <sql id="selectArdCameraNoGuideZoneVo"> select name, poi, camera_id, enabled, dept_id, user_id, create_by, create_time, update_by, update_time, id from ard_camera_no_guide_zone </sql> <select id="selectArdCameraNoGuideZoneList" parameterType="ArdCameraNoGuideZone" resultMap="ArdCameraNoGuideZoneResult"> <include refid="selectArdCameraNoGuideZoneVo"/> <where> <if test="name != null and name != ''"> and name like '%'||#{name}||'%'</if> <if test="poi != null and poi != ''"> and poi = #{poi}</if> <if test="cameraId != null and cameraId != ''"> and camera_id = #{cameraId}</if> <if test="enabled != null and enabled != ''"> and enabled = #{enabled}</if> <if test="deptId != null "> and dept_id = #{deptId}</if> <if test="userId != null and userId != ''"> and user_id = #{userId}</if> </where> </select> <select id="selectArdCameraNoGuideZoneByName" parameterType="String" resultMap="ArdCameraNoGuideZoneResult"> <include refid="selectArdCameraNoGuideZoneVo"/> where name = #{name} </select> <insert id="insertArdCameraNoGuideZone" parameterType="ArdCameraNoGuideZone"> insert into ard_camera_no_guide_zone <trim prefix="(" suffix=")" suffixOverrides=","> <if test="name != null">name,</if> <if test="poi != null">poi,</if> <if test="cameraId != null">camera_id,</if> <if test="enabled != null">enabled,</if> <if test="deptId != null">dept_id,</if> <if test="userId != null">user_id,</if> <if test="createBy != null">create_by,</if> <if test="createTime != null">create_time,</if> <if test="updateBy != null">update_by,</if> <if test="updateTime != null">update_time,</if> <if test="id != null">id,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="name != null">#{name},</if> <if test="poi != null">#{poi},</if> <if test="cameraId != null">#{cameraId},</if> <if test="enabled != null">#{enabled},</if> <if test="deptId != null">#{deptId},</if> <if test="userId != null">#{userId},</if> <if test="createBy != null">#{createBy},</if> <if test="createTime != null">#{createTime},</if> <if test="updateBy != null">#{updateBy},</if> <if test="updateTime != null">#{updateTime},</if> <if test="id != null">#{id},</if> </trim> </insert> <update id="updateArdCameraNoGuideZone" parameterType="ArdCameraNoGuideZone"> update ard_camera_no_guide_zone <trim prefix="SET" suffixOverrides=","> <if test="poi != null">poi = #{poi},</if> <if test="cameraId != null">camera_id = #{cameraId},</if> <if test="enabled != null">enabled = #{enabled},</if> <if test="deptId != null">dept_id = #{deptId},</if> <if test="userId != null">user_id = #{userId},</if> <if test="createBy != null">create_by = #{createBy},</if> <if test="createTime != null">create_time = #{createTime},</if> <if test="updateBy != null">update_by = #{updateBy},</if> <if test="updateTime != null">update_time = #{updateTime},</if> <if test="id != null">id = #{id},</if> </trim> where name = #{name} </update> <delete id="deleteArdCameraNoGuideZoneByName" parameterType="String"> delete from ard_camera_no_guide_zone where name = #{name} </delete> <delete id="deleteArdCameraNoGuideZoneByNames" parameterType="String"> delete from ard_camera_no_guide_zone where name in <foreach item="name" collection="array" open="(" separator="," close=")"> #{name} </foreach> </delete> </mapper> ard-work/src/main/resources/templates/test.html
@@ -4,133 +4,139 @@ <meta charset="UTF-8"> <title>æµè¯é¡µ</title> <script th:src="@{/js/jquery-3.6.4.min.js}"></script> <script th:src="@{/js/adapter.min.js}"></script> <script th:src="@{/js/webrtcstreamer.js}"></script> <link rel="stylesheet" th:href="@{/css/bootstrap.css}"/> <script th:src="@{/js/bootstrap.js}"></script> <style> .top-buffer { margin-top: 10px; } .container { border: 2px solid #1b6d85; padding: 20px; } </style> <body> <div class="container"> <div class="row "> <div class="dropdown"> ç¸æºidï¼<select id="select"> <div class="col-md-12"> ç¸æºidï¼<select id="select" style="width: 330px;"> </select> </div> </div> <div class="row top-buffer"> <div class="col-md-1 col-md-offset-1"> <button id="up" type="button" class="btn btn-primary">ä¸</button> </div> <div class="col-md-4 col-md-offset-3"> <div class="btn-group" role="group"> <button id="controlZoomIn" type="button" class="btn btn-primary">è°ç¦-</button> <button id="controlZoomOut" type="button" class="btn btn-primary">è°ç¦+</button> </div> </div> </div> <div class="row "> <div class="col-md-1"> <button id="left" type="button" class="btn btn-primary">å·¦</button> </div> <div class="col-md-1 col-md-offset-1"> <button id="right" type="button" class="btn btn-primary">å³</button> </div> <div class="col-md-4 col-md-offset-2"> <div class="btn-group" role="group"> <button id="controlFocusNear" type="button" class="btn btn-primary">èç¦-</button> <button id="controlFocusFar" type="button" class="btn btn-primary">èç¦+</button> </div> </div> </div> <div class="row "> <div class="col-md-1 col-md-offset-1"> <button id="down" type="button" class="btn btn-primary">ä¸</button> </div> <div class="col-md-4 col-md-offset-3"> <div class="btn-group" role="group"> <button id="controlIrisOpen" type="button" class="btn btn-primary">å å-</button> <button id="controlIrisClose" type="button" class="btn btn-primary">å å+</button> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="row top-buffer"> <div class="input-group"> <span class="input-group-addon">ç®çåæ å¼ï¼</span> <input id="targetPostion" class="form-control" placeholder="ç®çåæ "/> <button id="setTargetPostion" type="button" class="btn btn-default">æååæ </button> </div> <div class="input-group"> <span class="input-group-addon">På¼ï¼</span> <input id="p" class="form-control" placeholder="请è¾å ¥På¼"/> </div> <div class="input-group"> <span class="input-group-addon">Tå¼ï¼</span> <input id="t" class="form-control" placeholder="请è¾å ¥Tå¼"/> </div> <div class="input-group"> <span class="input-group-addon">Zå¼ï¼</span> <input id="z" class="form-control" placeholder="请è¾å ¥Zå¼"/> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="getPTZ" type="button" class="btn btn-default">è·åptz</button> <button id="setPTZ" type="button" class="btn btn-default">设置ptz</button> <button id="setPreset" type="button" class="btn btn-default">设é¢ç½®ç¹</button> <button id="gotoPreset" type="button" class="btn btn-default">è°é¢ç½®ç¹</button> <button id="getZeroPTZ" type="button" class="btn btn-default">è°ç¨é¶æ¹ä½è§</button> <button id="setZeroPTZ" type="button" class="btn btn-default">è®¾ç½®é¶æ¹ä½è§</button> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="FocusMode" type="button" class="btn btn-default">æå¨èç¦</button> <div id="focusDiv" class="input-group"> <span class="input-group-addon">èç¦å¼ï¼</span> <input id="focus" class="form-control" placeholder="èç¦å¼"/> </div> <button id="getFocusPos" type="button" class="btn btn-default">è·åèç¦å¼</button> <button id="setFocusPos" type="button" class="btn btn-default">设置èç¦å¼</button> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="WiperPwron" type="button" class="btn btn-default">å¼å¯é¨å·</button> <button id="Defogcfg" type="button" class="btn btn-default">å¼å¯éé¾</button> <button id="Infrarecfg" type="button" class="btn btn-default">å¼å¯çº¢å¤</button> <button id="HeateRpwron" type="button" class="btn btn-default">å¼å¯äºå°å ç</button> <button id="CameraDeicing" type="button" class="btn btn-default">å¼å¯é头å ç</button> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="voice" type="button" class="btn btn-default">å¼å§è¯é³å¯¹è®²</button> <button id="record" type="button" class="btn btn-default">å¼å§å½å</button> <button id="realCutPic" type="button" class="btn btn-default">宿¶æå¾</button> <button id="saveCutPic" type="button" class="btn btn-default">å卿å¾</button> </div> </div> <div class="row top-buffer"> <div class="col-md-6"> <img class="thumbnail" id="imgContainer" style="width: 500px; height: 300px;"/> </div> </div> </div> <div class="col-md-1"/> <div class="col-md-5"> <div class="row top-buffer"> <video id="video" muted autoplay loop controls style="width: 800px; height: 100%; object-fit: fill;"/> <div class="col-md-1 col-md-offset-1"> <button id="up" type="button" class="btn btn-primary">ä¸</button> </div> <div class="col-md-6 col-md-offset-2"> <div class="btn-group" role="group"> <button id="controlZoomIn" type="button" class="btn btn-primary">è°ç¦-</button> <button id="controlZoomOut" type="button" class="btn btn-primary">è°ç¦+</button> </div> </div> </div> <div class="row "> <div class="col-md-1"> <button id="left" type="button" class="btn btn-primary">å·¦</button> </div> <div class="col-md-1 col-md-offset-1"> <button id="right" type="button" class="btn btn-primary">å³</button> </div> <div class="col-md-6 col-md-offset-1"> <div class="btn-group" role="group"> <button id="controlFocusNear" type="button" class="btn btn-primary">èç¦-</button> <button id="controlFocusFar" type="button" class="btn btn-primary">èç¦+</button> </div> </div> </div> <div class="row "> <div class="col-md-1 col-md-offset-1"> <button id="down" type="button" class="btn btn-primary">ä¸</button> </div> <div class="col-md-6 col-md-offset-2"> <div class="btn-group" role="group"> <button id="controlIrisOpen" type="button" class="btn btn-primary">å å-</button> <button id="controlIrisClose" type="button" class="btn btn-primary">å å+</button> </div> </div> </div> <div class="row "> <div class="col-md-10"> <div class="row top-buffer"> <div class="input-group"> <span class="input-group-addon">ç®çåæ å¼ï¼</span> <input id="targetPostion" class="form-control" placeholder="ç®çåæ "/> <button id="setTargetPostion" type="button" class="btn btn-default">æååæ </button> </div> <div class="input-group"> <span class="input-group-addon">På¼ï¼</span> <input id="p" class="form-control" placeholder="请è¾å ¥På¼"/> </div> <div class="input-group"> <span class="input-group-addon">Tå¼ï¼</span> <input id="t" class="form-control" placeholder="请è¾å ¥Tå¼"/> </div> <div class="input-group"> <span class="input-group-addon">Zå¼ï¼</span> <input id="z" class="form-control" placeholder="请è¾å ¥Zå¼"/> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="getPTZ" type="button" class="btn btn-default">è·åptz</button> <button id="setPTZ" type="button" class="btn btn-default">设置ptz</button> <button id="setPreset" type="button" class="btn btn-default">设é¢ç½®ç¹</button> <button id="gotoPreset" type="button" class="btn btn-default">è°é¢ç½®ç¹</button> <button id="setZeroPTZ" type="button" class="btn btn-default">è®¾ç½®é¶æ¹ä½è§</button> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="FocusMode" type="button" class="btn btn-default">æå¨èç¦</button> <div id="focusDiv" class="input-group"> <span class="input-group-addon">èç¦å¼ï¼</span> <input id="focus" class="form-control" placeholder="èç¦å¼"/> </div> <button id="getFocusPos" type="button" class="btn btn-default">è·åèç¦å¼</button> <button id="setFocusPos" type="button" class="btn btn-default">设置èç¦å¼</button> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="WiperPwron" type="button" class="btn btn-default">å¼å¯é¨å·</button> <button id="Defogcfg" type="button" class="btn btn-default">å¼å¯éé¾</button> <button id="Infrarecfg" type="button" class="btn btn-default">å¼å¯çº¢å¤</button> <button id="HeateRpwron" type="button" class="btn btn-default">å¼å¯äºå°å ç</button> <button id="CameraDeicing" type="button" class="btn btn-default">å¼å¯é头å ç</button> </div> </div> <div class="row top-buffer"> <div class="btn-group" role="group"> <button id="voice" type="button" class="btn btn-default">å¼å§è¯é³å¯¹è®²</button> <button id="record" type="button" class="btn btn-default">å¼å§å½å</button> <button id="saveCutPic" type="button" class="btn btn-default">å卿å¾</button> </div> </div> </div> </div> </div> <div class="col-md-6"> <div class="row"> <div class="row top-buffer"> <video id="video" muted autoplay loop controls style="width: 100%; height: 360px; object-fit: fill; border: 2px solid #3498db;"/> </div> <div class="row"> <img class="thumbnail" id="imgContainer" style="width: 100%; height: 360px; border: 2px solid #3498db;"/> </div> </div> </div> </div> </div> <script th:inline="javascript" th:type="module"> <script th:inline="javascript"> var cameraId, opt, optOpen, optClose, token; window.onload = function () { @@ -175,7 +181,6 @@ dataType: "json", data: JSON.stringify(opt), success: function (data) { console.log(data); token = data.token; } }) @@ -589,20 +594,20 @@ cameraId = $('#select option:selected').val(); opt = {"cameraId": cameraId, "chanNo": 1}; $.ajax({ headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': token }, url: "../cameraSdk/getFocusPos", type: "post", dataType: "json", data: JSON.stringify(opt), success: function (datas) { console.log(datas); $("#focus").val(datas.data); } }) headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': token }, url: "../cameraSdk/getFocusPos", type: "post", dataType: "json", data: JSON.stringify(opt), success: function (datas) { console.log(datas); $("#focus").val(datas.data); } }) }) var heateRpwronflag = true; $("#HeateRpwron").click(function () { @@ -656,7 +661,8 @@ $.ajax({ headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' 'Content-Type': 'application/json', 'Authorization': token }, url: "../cameraSdk/cameraDeicing", type: "post", @@ -721,7 +727,7 @@ console.log(data.data); setTimeout(() => { $('#imgContainer').attr('src', data.data); }, 1000 ) }, 1000) } }) @@ -790,67 +796,264 @@ }) } let webRtcServer = null; let videoMap = new Map(); $('video').click(function (e) { let ID = e.target.id;//è·åå½åç¹å»äºä»¶çå ç´ console.log(ID); if (videoMap.get(ID) != null) { closeVideo(ID, videoMap.get(ID)); } else { var cameraId = $('#select option:selected').val(); let camera = cameraMap.get(cameraId); console.log(camera); if (camera.factory == "3") { realViewYs("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); } else if (camera.factory == "2") { realViewDh("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); } else { realViewHik("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); var cameraId = $('#select option:selected').val(); $.ajax({ headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': token }, url: "../vtdu/media/" + cameraId + "_" + 1, type: "get", dataType: "json", success: function (data) { realView(data.data.webrtcUrl + "/", e.target.id); } } }) }); //é¢è§æµ·åº·ç¸æº function realViewHik(serverip, elem, username, password, ipaddr, port) { // webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000"); webRtcServer = new WebRtcStreamer(elem, "http://192.168.1.227:8000"); let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/ch1/main/av_stream"; let option = "rtptransport=tcp"; console.log("rtspå°åï¼" + rtspUrl); webRtcServer.connect(rtspUrl, null, option, null); videoMap.set(elem, webRtcServer); let webrtcClient; //whepæä½æ¹æ³ const restartPause = 2000; const unquoteCredential = (v) => ( JSON.parse(`"${v}"`) ); const linkToIceServers = (links) => ( (links !== null) ? links.split(', ').map((link) => { const m = link.match(/^<(.+?)>; rel="ice-server"(; username="(.*?)"; credential="(.*?)"; credential-type="password")?/i); const ret = { urls: [m[1]], }; if (m[3] !== undefined) { ret.username = unquoteCredential(m[3]); ret.credential = unquoteCredential(m[4]); ret.credentialType = "password"; } return ret; }) : [] ); const parseOffer = (offer) => { const ret = { iceUfrag: '', icePwd: '', medias: [], }; for (const line of offer.split('\r\n')) { if (line.startsWith('m=')) { ret.medias.push(line.slice('m='.length)); } else if (ret.iceUfrag === '' && line.startsWith('a=ice-ufrag:')) { ret.iceUfrag = line.slice('a=ice-ufrag:'.length); } else if (ret.icePwd === '' && line.startsWith('a=ice-pwd:')) { ret.icePwd = line.slice('a=ice-pwd:'.length); } } return ret; }; const generateSdpFragment = (offerData, candidates) => { const candidatesByMedia = {}; for (const candidate of candidates) { const mid = candidate.sdpMLineIndex; if (candidatesByMedia[mid] === undefined) { candidatesByMedia[mid] = []; } candidatesByMedia[mid].push(candidate); } let frag = 'a=ice-ufrag:' + offerData.iceUfrag + '\r\n' + 'a=ice-pwd:' + offerData.icePwd + '\r\n'; let mid = 0; for (const media of offerData.medias) { if (candidatesByMedia[mid] !== undefined) { frag += 'm=' + media + '\r\n' + 'a=mid:' + mid + '\r\n'; for (const candidate of candidatesByMedia[mid]) { frag += 'a=' + candidate.candidate + '\r\n'; } } mid++; } return frag; } //é¢è§å¤§åç¸æº function realViewDh(serverip, elem, username, password, ipaddr, port) { webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000"); let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/cam/realmonitor?channel=1&subtype=0"; let option = "rtptransport=tcp"; console.log("rtspå°åï¼" + rtspUrl); class WHEPClient { constructor(whepUrl, videoId) { this.video = videoId; this.wurl = new URL('whep', whepUrl); this.pc = null; this.restartTimeout = null; this.eTag = ''; this.queuedCandidates = []; this.start(); } webRtcServer.connect(rtspUrl, null, option, null); videoMap.set(elem, webRtcServer); start() { console.log("requesting ICE servers"); fetch(this.wurl, { method: 'OPTIONS', }) .then((res) => this.onIceServers(res)) .catch((err) => { console.log('error: ' + err); this.scheduleRestart(); }); } onIceServers(res) { this.pc = new RTCPeerConnection({ iceServers: linkToIceServers(res.headers.get('Link')), }); const direction = "sendrecv"; this.pc.addTransceiver("video", {direction}); this.pc.addTransceiver("audio", {direction}); this.pc.onicecandidate = (evt) => this.onLocalCandidate(evt); this.pc.oniceconnectionstatechange = () => this.onConnectionState(); this.pc.ontrack = (evt) => { console.log("new track:", evt.track.kind); document.getElementById(this.video).srcObject = evt.streams[0]; }; this.pc.createOffer() .then((offer) => this.onLocalOffer(offer)); } onLocalOffer(offer) { this.offerData = parseOffer(offer.sdp); this.pc.setLocalDescription(offer); console.log("sending offer"); console.log(this.wurl); fetch(this.wurl, { method: 'POST', headers: { 'Content-Type': 'application/sdp', }, body: offer.sdp, }) .then((res) => { if (res.status !== 201) { throw new Error('bad status code'); } // this.eTag = res.headers.get('ETag'); this.eTag = res.headers.get("ETag") || res.headers.get('E-Tag'); return res.text(); }) .then((sdp) => this.onRemoteAnswer(new RTCSessionDescription({ type: 'answer', sdp, }))) .catch((err) => { console.log('error: ' + err); this.scheduleRestart(); }); } onConnectionState() { if (this.restartTimeout !== null) { return; } console.log("peer connection state:", this.pc.iceConnectionState); switch (this.pc.iceConnectionState) { case "disconnected": this.scheduleRestart(); } } onRemoteAnswer(answer) { if (this.restartTimeout !== null) { return; } this.pc.setRemoteDescription(new RTCSessionDescription(answer)); if (this.queuedCandidates.length !== 0) { this.sendLocalCandidates(this.queuedCandidates); this.queuedCandidates = []; } } onLocalCandidate(evt) { if (this.restartTimeout !== null) { return; } if (evt.candidate !== null) { if (this.eTag === '') { this.queuedCandidates.push(evt.candidate); } else { this.sendLocalCandidates([evt.candidate]) } } } sendLocalCandidates(candidates) { fetch(this.wurl, { method: 'PATCH', headers: { 'Content-Type': 'application/trickle-ice-sdpfrag', 'If-Match': this.eTag, }, body: generateSdpFragment(this.offerData, candidates), }) .then((res) => { if (res.status !== 204) { throw new Error('bad status code'); } }) .catch((err) => { console.log('error: ' + err); this.scheduleRestart(); }); } scheduleRestart() { if (this.restartTimeout !== null) { return; } if (this.pc !== null) { this.pc.close(); this.pc = null; } this.restartTimeout = window.setTimeout(() => { this.restartTimeout = null; this.start(); }, restartPause); this.eTag = ''; this.queuedCandidates = []; } stop() { if (this.pc) { try { this.pc.close(); } catch (e) { console.log("Failure close peer connection:" + e); } this.pc = null; } } } //é¢è§å®è§ç¸æº function realViewYs(serverip, elem, username, password, ipaddr, port) { webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000"); let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/media/video1/multicast"; console.log("rtspå°åï¼" + rtspUrl); let option = "rtptransport=tcp"; webRtcServer.connect(rtspUrl, null, option, null); videoMap.set(elem, webRtcServer); } function closeVideo(id, webrtc) { webrtc.disconnect(); videoMap.delete(id); } //页é¢éåºæ¶éæ¯ window.onbeforeunload = function () { webRtcServer.disconnect(); function realView(whepUrl, videoId) { console.log(whepUrl) webrtcClient = new WHEPClient(whepUrl, videoId); } </script> </body>