diff --git a/start/src/main/resources/templates/risk.html b/start/src/main/resources/templates/risk.html
deleted file mode 100644
index 01d0760..0000000
--- a/start/src/main/resources/templates/risk.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
--
\ No newline at end of file
diff --git a/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/RegionCameraController.java b/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/RegionCameraController.java
new file mode 100644
index 0000000..1cdc616
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/RegionCameraController.java
@@ -0,0 +1,54 @@
+package com.zcloud.gbs.edgeguard.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.zcloud.gbs.edgeguard.api.RegionCameraServiceI;
+import com.zcloud.gbs.edgeguard.dto.CameraLeaderUpdateCmd;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraBindCmd;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.RegionCameraCo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "边缘人脸区域安全-区域摄像头")
+@RestController
+@RequestMapping("/edgeguard")
+@RequiredArgsConstructor
+public class RegionCameraController {
+ private final RegionCameraServiceI regionCameraService;
+
+ @ApiOperation("查询区域已绑定摄像头")
+ @PostMapping("/region-cameras/page")
+ public PageResponse page(@Validated @RequestBody RegionCameraPageQry qry) {
+ return regionCameraService.page(qry);
+ }
+
+ @ApiOperation("保存区域摄像头选择结果")
+ @PutMapping("/regions/{regionId}/cameras")
+ public Response bind(@PathVariable("regionId") Long regionId,
+ @Validated @RequestBody RegionCameraBindCmd cmd) {
+ return regionCameraService.bind(regionId, cmd);
+ }
+
+ @ApiOperation("设置摄像头负责人")
+ @PutMapping("/region-cameras/{id}/leader")
+ public Response updateLeader(@PathVariable("id") Long id,
+ @Validated @RequestBody CameraLeaderUpdateCmd cmd) {
+ return regionCameraService.updateLeader(id, cmd);
+ }
+
+ @ApiOperation("解除摄像头绑定")
+ @DeleteMapping("/region-cameras/{id}")
+ public Response unbind(@PathVariable("id") Long id) {
+ return regionCameraService.unbind(id);
+ }
+}
diff --git a/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/RiskPointController.java b/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/RiskPointController.java
deleted file mode 100644
index f33109c..0000000
--- a/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/RiskPointController.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.zcloud.gbs.edgeguard.web;
-
-
-import com.alibaba.cola.dto.MultiResponse;
-import com.alibaba.cola.dto.PageResponse;
-import com.alibaba.cola.dto.Response;
-import com.alibaba.cola.dto.SingleResponse;
-import com.zcloud.gbs.edgeguard.api.RiskPointServiceI;
-import com.zcloud.gbs.edgeguard.dto.RiskPointAddCmd;
-import com.zcloud.gbs.edgeguard.dto.RiskPointPageQry;
-import com.zcloud.gbs.edgeguard.dto.RiskPointUpdateCmd;
-import com.zcloud.gbs.edgeguard.dto.clientobject.RiskPointCo;
-import com.jjb.saas.framework.auth.model.SSOUser;
-import com.jjb.saas.framework.auth.utils.AuthContext;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.AllArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.ArrayList;
-
-/**
- * @author lin
- */
-@Api(tags = "边缘人脸区域安全-风险点管理")
-@RequestMapping("/edgeguard/riskPoint")
-@RestController
-@AllArgsConstructor
-public class RiskPointController {
- private final RiskPointServiceI riskPointService;
-
- @ApiOperation("新增")
- @PostMapping("/save")
- public SingleResponse add(@Validated @RequestBody RiskPointAddCmd cmd) {
- SSOUser ssoUser = AuthContext.getCurrentUser();
- return riskPointService.add(cmd);
- }
-
- @ApiOperation("分页")
- @PostMapping("/list")
- public PageResponse page(@RequestBody RiskPointPageQry qry) {
- return riskPointService.listPage(qry);
- }
-
- @ApiOperation("所有数据")
- @GetMapping("/listAll")
- public MultiResponse listAll() {
- return MultiResponse.of(new ArrayList());
- }
-
- @ApiOperation("详情")
- @GetMapping("/{id}")
- public SingleResponse getInfoById(@PathVariable("id") Long id) {
- return SingleResponse.of(new RiskPointCo());
- }
-
- @ApiOperation("删除")
- @DeleteMapping("/{id}")
- public Response remove(@PathVariable("id") Long id) {
- riskPointService.remove(id);
- return SingleResponse.buildSuccess();
- }
-
- @ApiOperation("删除多个")
- @DeleteMapping("/ids")
- public Response removeBatch(@RequestParam Long[] ids) {
- riskPointService.removeBatch(ids);
- return SingleResponse.buildSuccess();
- }
-
- @ApiOperation("修改")
- @PutMapping("/edit")
- public SingleResponse edit(@Validated @RequestBody RiskPointUpdateCmd riskPointUpdateCmd) {
- riskPointService.edit(riskPointUpdateCmd);
- return SingleResponse.buildSuccess();
- }
-}
diff --git a/web-app/pom.xml b/web-app/pom.xml
index 3c8925a..af2c7aa 100644
--- a/web-app/pom.xml
+++ b/web-app/pom.xml
@@ -21,6 +21,12 @@
com.zcloud.gbs.edgeguard
web-infrastructure
+
+ org.junit.vintage
+ junit-vintage-engine
+ 5.3.1
+ test
+
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/CameraLeaderUpdateExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/CameraLeaderUpdateExe.java
new file mode 100644
index 0000000..d0140d7
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/CameraLeaderUpdateExe.java
@@ -0,0 +1,34 @@
+package com.zcloud.gbs.edgeguard.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.gbs.edgeguard.domain.gateway.RegionCameraGateway;
+import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
+import com.zcloud.gbs.edgeguard.dto.CameraLeaderUpdateCmd;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+@Component
+@RequiredArgsConstructor
+public class CameraLeaderUpdateExe {
+ private final RegionCameraGateway cameraGateway;
+ private final RegionAccessService accessService;
+ private final RegionCommandSupport support;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(Long id, CameraLeaderUpdateCmd cmd) {
+ RegionCameraE binding = cameraGateway.getById(id);
+ if (binding == null || !"BOUND".equals(binding.getBindStatus())) {
+ throw new BizException("有效摄像头绑定不存在");
+ }
+ accessService.requireAccessibleRegion(binding.getRegionId());
+ support.validateLeader(cmd.getLeaderUserId(), binding.getCorpId());
+ RegionCameraE changed = new RegionCameraE();
+ changed.setId(id);
+ changed.setVersion(binding.getVersion());
+ changed.setLeaderUserId(cmd.getLeaderUserId());
+ if (!cameraGateway.update(changed)) {
+ throw new BizException("设置摄像头负责人失败,请刷新后重试");
+ }
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionAccessService.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionAccessService.java
index 6e6a4e2..3cfaad5 100644
--- a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionAccessService.java
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionAccessService.java
@@ -2,7 +2,9 @@ package com.zcloud.gbs.edgeguard.command;
import com.alibaba.cola.exception.BizException;
import com.zcloud.gbs.edgeguard.domain.gateway.CorpGateway;
+import com.zcloud.gbs.edgeguard.domain.gateway.RegionGateway;
import com.zcloud.gbs.edgeguard.domain.model.CorpE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionE;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@@ -12,6 +14,7 @@ import java.util.List;
@RequiredArgsConstructor
public class RegionAccessService {
private final CorpGateway corpGateway;
+ private final RegionGateway regionGateway;
public List accessibleCorps() {
return corpGateway.listAccessibleCorps();
@@ -28,4 +31,13 @@ public class RegionAccessService {
}
throw new BizException("无权访问该企业数据");
}
+
+ public RegionE requireAccessibleRegion(Long regionId) {
+ RegionE region = regionGateway.getById(regionId);
+ if (region == null) {
+ throw new BizException("区域不存在");
+ }
+ requireAccessibleCorp(region.getCorpId());
+ return region;
+ }
}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindExe.java
new file mode 100644
index 0000000..b2e16fd
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindExe.java
@@ -0,0 +1,65 @@
+package com.zcloud.gbs.edgeguard.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.gbs.edgeguard.domain.model.CameraKeyE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionE;
+import com.zcloud.gbs.edgeguard.dto.CameraSelectionCmd;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraBindCmd;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Component
+@RequiredArgsConstructor
+public class RegionCameraBindExe {
+ private static final String CAMERA_SOURCE = "VIDEOPATROL";
+ private final RegionAccessService accessService;
+ private final RegionCameraBindTransaction transaction;
+
+ public void execute(Long regionId, RegionCameraBindCmd cmd) {
+ RegionE region = accessService.requireAccessibleRegion(regionId);
+ List keys = new ArrayList<>();
+ List snapshots = new ArrayList<>();
+ Set identities = new HashSet<>();
+ for (CameraSelectionCmd camera : cmd.getCameras()) {
+ if (!region.getCorpId().equals(camera.getCorpinfoId())) {
+ throw new BizException("摄像头所属单位与区域所属企业不一致:" + camera.getVideoName());
+ }
+ String cameraId = camera.getFixedCameraId().trim();
+ CameraKeyE key = new CameraKeyE(CAMERA_SOURCE, cameraId);
+ if (!identities.add(key.identity())) {
+ throw new BizException("摄像头选择结果存在重复项");
+ }
+ keys.add(key);
+ snapshots.add(toSnapshot(camera));
+ }
+ transaction.execute(region, keys, snapshots);
+ }
+
+ private RegionCameraE toSnapshot(CameraSelectionCmd camera) {
+ RegionCameraE snapshot = new RegionCameraE();
+ snapshot.setCameraSource(CAMERA_SOURCE);
+ snapshot.setCameraId(camera.getFixedCameraId().trim());
+ snapshot.setCameraName(camera.getVideoName().trim());
+ snapshot.setVideoType(camera.getVideoType());
+ snapshot.setCameraUnitId(camera.getCorpinfoId());
+ snapshot.setCameraUnitName(camera.getCorpinfoName());
+ snapshot.setCameraDeptId(camera.getDepartmentId());
+ snapshot.setCameraDeptName(camera.getDepartmentName());
+ snapshot.setVideoLevel(camera.getVideoLevel());
+ snapshot.setVideoAddress(camera.getVideoAddress());
+ snapshot.setIsOnline(camera.getIsOnline());
+ snapshot.setDeviceModel(camera.getDeviceModel());
+ snapshot.setDeviceGbNumber(camera.getDeviceGbNumber());
+ snapshot.setCameraNumber(camera.getCameraNumber());
+ snapshot.setLongitude(camera.getLongitude());
+ snapshot.setLatitude(camera.getLatitude());
+ snapshot.setRemarks(camera.getRemarks());
+ return snapshot;
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindTransaction.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindTransaction.java
new file mode 100644
index 0000000..2798bba
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindTransaction.java
@@ -0,0 +1,93 @@
+package com.zcloud.gbs.edgeguard.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.gbs.edgeguard.domain.gateway.RegionCameraGateway;
+import com.zcloud.gbs.edgeguard.domain.model.CameraKeyE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionE;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Component
+@RequiredArgsConstructor
+public class RegionCameraBindTransaction {
+ private final RegionCameraGateway cameraGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(RegionE region, List keys, List authoritative) {
+ Map existingByIdentity = new HashMap<>();
+ for (RegionCameraE existing : cameraGateway.listByKeys(region.getCorpId(), keys)) {
+ existingByIdentity.put(identity(existing), existing);
+ if ("BOUND".equals(existing.getBindStatus()) && !region.getId().equals(existing.getRegionId())) {
+ throw new BizException("摄像头已绑定其他区域:" + existing.getCameraName());
+ }
+ }
+ Map authoritativeByIdentity = new HashMap<>();
+ for (RegionCameraE camera : authoritative) {
+ authoritativeByIdentity.put(identity(camera), camera);
+ }
+ Set selected = new HashSet<>(authoritativeByIdentity.keySet());
+ Date now = new Date();
+
+ for (RegionCameraE current : cameraGateway.listBoundByRegionId(region.getId())) {
+ if (!selected.contains(identity(current))) {
+ current.setBindStatus("UNBOUND");
+ current.setUnboundTime(now);
+ if (!cameraGateway.update(current)) {
+ throw new BizException("解除摄像头绑定失败");
+ }
+ }
+ }
+ for (Map.Entry entry : authoritativeByIdentity.entrySet()) {
+ RegionCameraE authoritativeCamera = entry.getValue();
+ RegionCameraE existing = existingByIdentity.get(entry.getKey());
+ if (existing == null) {
+ RegionCameraE created = snapshot(authoritativeCamera, new RegionCameraE());
+ created.setRegionId(region.getId());
+ created.setCorpId(region.getCorpId());
+ created.setBindStatus("BOUND");
+ created.setBoundTime(now);
+ if (!cameraGateway.add(created)) {
+ throw new BizException("保存摄像头绑定失败");
+ }
+ } else {
+ Long leaderUserId = existing.getLeaderUserId();
+ Date boundTime = existing.getBoundTime();
+ boolean wasBound = "BOUND".equals(existing.getBindStatus());
+ snapshot(authoritativeCamera, existing);
+ existing.setRegionId(region.getId());
+ existing.setCorpId(region.getCorpId());
+ existing.setLeaderUserId(leaderUserId);
+ existing.setBindStatus("BOUND");
+ existing.setBoundTime(wasBound && boundTime != null ? boundTime : now);
+ existing.setUnboundTime(null);
+ if (!cameraGateway.update(existing)) {
+ throw new BizException("更新摄像头绑定失败");
+ }
+ }
+ }
+ }
+
+ private RegionCameraE snapshot(RegionCameraE source, RegionCameraE target) {
+ Long id = target.getId();
+ Integer version = target.getVersion();
+ BeanUtils.copyProperties(source, target, "id", "regionId", "corpId", "leaderUserId",
+ "bindStatus", "boundTime", "unboundTime", "version");
+ target.setId(id);
+ target.setVersion(version);
+ return target;
+ }
+
+ private String identity(RegionCameraE camera) {
+ return camera.getCameraSource() + ":" + camera.getCameraId();
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraUnbindExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraUnbindExe.java
new file mode 100644
index 0000000..68f4312
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RegionCameraUnbindExe.java
@@ -0,0 +1,34 @@
+package com.zcloud.gbs.edgeguard.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.gbs.edgeguard.domain.gateway.RegionCameraGateway;
+import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+@Component
+@RequiredArgsConstructor
+public class RegionCameraUnbindExe {
+ private final RegionCameraGateway cameraGateway;
+ private final RegionAccessService accessService;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(Long id) {
+ RegionCameraE binding = cameraGateway.getById(id);
+ if (binding == null || !"BOUND".equals(binding.getBindStatus())) {
+ throw new BizException("有效摄像头绑定不存在");
+ }
+ accessService.requireAccessibleRegion(binding.getRegionId());
+ RegionCameraE changed = new RegionCameraE();
+ changed.setId(id);
+ changed.setVersion(binding.getVersion());
+ changed.setBindStatus("UNBOUND");
+ changed.setUnboundTime(new Date());
+ if (!cameraGateway.update(changed)) {
+ throw new BizException("解除摄像头绑定失败,请刷新后重试");
+ }
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointAddExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointAddExe.java
deleted file mode 100644
index d10ca3c..0000000
--- a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointAddExe.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.zcloud.gbs.edgeguard.command;
-
-import com.alibaba.cola.exception.BizException;
-import com.zcloud.gbs.edgeguard.domain.gateway.RiskPointGateway;
-import com.zcloud.gbs.edgeguard.domain.model.RiskPointE;
-import com.zcloud.gbs.edgeguard.dto.RiskPointAddCmd;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * 风险点新增执行器
- *
- * @author lin
- */
-@Component
-@AllArgsConstructor
-public class RiskPointAddExe {
- private final RiskPointGateway riskPointGateway;
-
- @Transactional(rollbackFor = Exception.class)
- public boolean execute(RiskPointAddCmd cmd) {
- RiskPointE examTypeE = new RiskPointE();
- BeanUtils.copyProperties(cmd, examTypeE);
- boolean res = false;
- try {
- res = riskPointGateway.add(examTypeE);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- if (!res) {
- throw new BizException("保存失败");
- }
- return true;
- }
-}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointRemoveExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointRemoveExe.java
deleted file mode 100644
index e3a44a8..0000000
--- a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointRemoveExe.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.zcloud.gbs.edgeguard.command;
-
-import com.alibaba.cola.exception.BizException;
-import com.zcloud.gbs.edgeguard.domain.gateway.RiskPointGateway;
-import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * 风险点新增执行器
- * @author lin
- */
-@Component
-@AllArgsConstructor
-public class RiskPointRemoveExe {
- private final RiskPointGateway riskPointGateway;
- @Transactional(rollbackFor = Exception.class)
- public boolean execute(Long id) {
- boolean res = riskPointGateway.deletedRiskPointById(id);
- if(!res){
- throw new BizException("删除失败");
- }
- return true;
- }
- @Transactional(rollbackFor = Exception.class)
- public boolean execute(Long[] ids) {
- boolean res = riskPointGateway.deletedRiskPointByIds(ids);
- if(!res){
- throw new BizException("删除失败");
- }
- return true;
- }
-}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointUpdateExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointUpdateExe.java
deleted file mode 100644
index d7a88fb..0000000
--- a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/RiskPointUpdateExe.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.zcloud.gbs.edgeguard.command;
-
-import com.alibaba.cola.exception.BizException;
-import com.zcloud.gbs.edgeguard.domain.gateway.RiskPointGateway;
-import com.zcloud.gbs.edgeguard.domain.model.RiskPointE;
-import com.zcloud.gbs.edgeguard.dto.RiskPointUpdateCmd;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * 风险点修改执行器
- *
- * @author lin
- */
-@Component
-@AllArgsConstructor
-public class RiskPointUpdateExe {
- private final RiskPointGateway riskPointGateway;
-
- @Transactional(rollbackFor = Exception.class)
- public void execute(RiskPointUpdateCmd riskPointUpdateCmd) {
- RiskPointE riskPointE = new RiskPointE();
- BeanUtils.copyProperties(riskPointUpdateCmd, riskPointE);
- boolean res = riskPointGateway.update(riskPointE);
- if (!res) {
- throw new BizException("修改失败");
- }
- }
-}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/convertor/RiskPointCoConvertor.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/convertor/RiskPointCoConvertor.java
deleted file mode 100644
index bb47799..0000000
--- a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/convertor/RiskPointCoConvertor.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.zcloud.gbs.edgeguard.command.convertor;
-
-import com.zcloud.gbs.edgeguard.dto.clientobject.RiskPointCo;
-import com.zcloud.gbs.edgeguard.persistence.dataobject.RiskPointDO;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface RiskPointCoConvertor {
- /**
- * @param riskPointE
- * @return
- */
- List converDOsToCOs(List riskPointE);
-}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/RegionCameraQueryExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/RegionCameraQueryExe.java
new file mode 100644
index 0000000..7eb1835
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/RegionCameraQueryExe.java
@@ -0,0 +1,72 @@
+package com.zcloud.gbs.edgeguard.command.query;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.zcloud.gbs.edgeguard.command.RegionAccessService;
+import com.zcloud.gbs.edgeguard.domain.gateway.RegionCameraGateway;
+import com.zcloud.gbs.edgeguard.domain.gateway.UserGateway;
+import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionE;
+import com.zcloud.gbs.edgeguard.domain.model.UserE;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.RegionCameraCo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Component
+@RequiredArgsConstructor
+public class RegionCameraQueryExe {
+ private final RegionCameraGateway cameraGateway;
+ private final UserGateway userGateway;
+ private final RegionAccessService accessService;
+
+ public PageResponse page(RegionCameraPageQry qry) {
+ RegionE region = accessService.requireAccessibleRegion(qry.getRegionId());
+ int pageIndex = safePageIndex(qry.getPageIndex());
+ int pageSize = safePageSize(qry.getPageSize());
+ List rows = cameraGateway.pageBound(
+ region.getId(), qry.getName(), qry.getVideoLevel(), qry.getIsOnline(), pageIndex, pageSize);
+ long total = cameraGateway.countBound(
+ region.getId(), qry.getName(), qry.getVideoLevel(), qry.getIsOnline());
+
+ Set leaderIds = new HashSet<>();
+ for (RegionCameraE row : rows) {
+ if (row.getLeaderUserId() != null) leaderIds.add(row.getLeaderUserId());
+ }
+ Map leaderNames = new HashMap<>();
+ for (UserE user : userGateway.listByIds(leaderIds)) {
+ leaderNames.put(user.getId(), user.getName());
+ }
+ List result = new ArrayList<>();
+ for (RegionCameraE row : rows) {
+ RegionCameraCo co = new RegionCameraCo();
+ BeanUtils.copyProperties(row, co);
+ co.setFixedCameraId(row.getCameraId());
+ co.setVideoName(row.getCameraName());
+ co.setCorpinfoId(row.getCameraUnitId());
+ co.setCorpinfoName(row.getCameraUnitName());
+ co.setDepartmentId(row.getCameraDeptId());
+ co.setDepartmentName(row.getCameraDeptName());
+ co.setRegionName(region.getRegionName());
+ co.setLeaderUserName(leaderNames.get(row.getLeaderUserId()));
+ result.add(co);
+ }
+ return PageResponse.of(result, (int) total, pageSize, pageIndex);
+ }
+
+ private int safePageIndex(int pageIndex) {
+ return pageIndex <= 0 ? 1 : pageIndex;
+ }
+
+ private int safePageSize(int pageSize) {
+ return pageSize <= 0 ? 10 : Math.min(pageSize, 200);
+ }
+
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/RiskPointQueryExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/RiskPointQueryExe.java
deleted file mode 100644
index 994d4a4..0000000
--- a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/RiskPointQueryExe.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.zcloud.gbs.edgeguard.command.query;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.zcloud.gbs.edgeguard.command.convertor.RiskPointCoConvertor;
-import com.zcloud.gbs.edgeguard.dto.RiskPointPageQry;
-import com.zcloud.gbs.edgeguard.dto.clientobject.RiskPointCo;
-import com.zcloud.gbs.edgeguard.persistence.dataobject.RiskPointDO;
-import com.zcloud.gbs.edgeguard.persistence.repository.RiskPointRepository;
-import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * 风险点新增执行器
- *
- * @author lin
- */
-@Component
-@AllArgsConstructor
-public class RiskPointQueryExe {
- private final RiskPointRepository riskPointRepository;
- private final RiskPointCoConvertor riskPointCoConvertor;
-
- /**
- * 分页
- *
- * @param riskPointPageQry
- * @return
- */
- public PageResponse execute(RiskPointPageQry riskPointPageQry) {
- PageResponse pageResponse = riskPointRepository.listRiskPointPage(riskPointPageQry.toHashMap());
- List examCenterCOS = riskPointCoConvertor.converDOsToCOs(pageResponse.getData());
- return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
- }
-}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/RegionCameraServiceImpl.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/RegionCameraServiceImpl.java
new file mode 100644
index 0000000..bca4acb
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/RegionCameraServiceImpl.java
@@ -0,0 +1,47 @@
+package com.zcloud.gbs.edgeguard.service;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.zcloud.gbs.edgeguard.api.RegionCameraServiceI;
+import com.zcloud.gbs.edgeguard.command.CameraLeaderUpdateExe;
+import com.zcloud.gbs.edgeguard.command.RegionCameraBindExe;
+import com.zcloud.gbs.edgeguard.command.RegionCameraUnbindExe;
+import com.zcloud.gbs.edgeguard.command.query.RegionCameraQueryExe;
+import com.zcloud.gbs.edgeguard.dto.CameraLeaderUpdateCmd;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraBindCmd;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.RegionCameraCo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class RegionCameraServiceImpl implements RegionCameraServiceI {
+ private final RegionCameraQueryExe queryExe;
+ private final RegionCameraBindExe bindExe;
+ private final CameraLeaderUpdateExe leaderUpdateExe;
+ private final RegionCameraUnbindExe unbindExe;
+
+ @Override
+ public PageResponse page(RegionCameraPageQry qry) {
+ return queryExe.page(qry);
+ }
+
+ @Override
+ public Response bind(Long regionId, RegionCameraBindCmd cmd) {
+ bindExe.execute(regionId, cmd);
+ return Response.buildSuccess();
+ }
+
+ @Override
+ public Response updateLeader(Long id, CameraLeaderUpdateCmd cmd) {
+ leaderUpdateExe.execute(id, cmd);
+ return Response.buildSuccess();
+ }
+
+ @Override
+ public Response unbind(Long id) {
+ unbindExe.execute(id);
+ return Response.buildSuccess();
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/RiskPointServiceImpl.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/RiskPointServiceImpl.java
deleted file mode 100644
index eb0ddee..0000000
--- a/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/RiskPointServiceImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.zcloud.gbs.edgeguard.service;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.alibaba.cola.dto.SingleResponse;
-import com.zcloud.gbs.edgeguard.api.RiskPointServiceI;
-import com.zcloud.gbs.edgeguard.command.RiskPointAddExe;
-import com.zcloud.gbs.edgeguard.command.RiskPointRemoveExe;
-import com.zcloud.gbs.edgeguard.command.RiskPointUpdateExe;
-import com.zcloud.gbs.edgeguard.command.query.RiskPointQueryExe;
-import com.zcloud.gbs.edgeguard.dto.RiskPointAddCmd;
-import com.zcloud.gbs.edgeguard.dto.RiskPointPageQry;
-import com.zcloud.gbs.edgeguard.dto.RiskPointUpdateCmd;
-import com.zcloud.gbs.edgeguard.dto.clientobject.RiskPointCo;
-import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Service;
-
-/**
- * @author lin
- */
-@Service
-@AllArgsConstructor
-public class RiskPointServiceImpl implements RiskPointServiceI {
- private final RiskPointAddExe riskPointAddExe;
- private final RiskPointUpdateExe riskPointUpdateExe;
- private final RiskPointRemoveExe riskPointRemoveExe;
- private final RiskPointQueryExe riskPointQueryExe;
-
- @Override
- public PageResponse listPage(RiskPointPageQry qry){
-
- return riskPointQueryExe.execute(qry);
- }
-
- @Override
- public SingleResponse add(RiskPointAddCmd cmd) {
-
- riskPointAddExe.execute(cmd);
- return SingleResponse.buildSuccess();
- }
-
- @Override
- public void edit(RiskPointUpdateCmd riskPointUpdateCmd) {
- riskPointUpdateExe.execute(riskPointUpdateCmd);
- }
-
- @Override
- public void remove(Long id) {
- riskPointRemoveExe.execute(id);
- }
-
- @Override
- public void removeBatch(Long[] ids) {
- riskPointRemoveExe.execute(ids);
- }
-
-}
diff --git a/web-app/src/test/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindTransactionTest.java b/web-app/src/test/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindTransactionTest.java
new file mode 100644
index 0000000..19ce286
--- /dev/null
+++ b/web-app/src/test/java/com/zcloud/gbs/edgeguard/command/RegionCameraBindTransactionTest.java
@@ -0,0 +1,97 @@
+package com.zcloud.gbs.edgeguard.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.gbs.edgeguard.domain.gateway.RegionCameraGateway;
+import com.zcloud.gbs.edgeguard.domain.model.CameraKeyE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
+import com.zcloud.gbs.edgeguard.domain.model.RegionE;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+public class RegionCameraBindTransactionTest {
+ @Test
+ public void shouldApplyAddAndUnbindDifference() {
+ FakeGateway gateway = new FakeGateway();
+ gateway.rows.add(binding(1L, 10L, "SOURCE", "A", "BOUND"));
+ RegionCameraBindTransaction transaction = new RegionCameraBindTransaction(gateway);
+ RegionE region = new RegionE();
+ region.setId(10L);
+ region.setCorpId(100L);
+
+ transaction.execute(region,
+ Collections.singletonList(new CameraKeyE("SOURCE", "B")),
+ Collections.singletonList(binding(null, null, "SOURCE", "B", null)));
+
+ Assert.assertEquals("UNBOUND", gateway.find("SOURCE:A", false).getBindStatus());
+ Assert.assertNotNull(gateway.find("SOURCE:B", false));
+ Assert.assertEquals("BOUND", gateway.find("SOURCE:B", false).getBindStatus());
+ Assert.assertEquals(Long.valueOf(10L), gateway.find("SOURCE:B", false).getRegionId());
+ }
+
+ @Test
+ public void shouldRejectCameraBoundToOtherRegion() {
+ FakeGateway gateway = new FakeGateway();
+ gateway.rows.add(binding(1L, 99L, "SOURCE", "A", "BOUND"));
+ RegionCameraBindTransaction transaction = new RegionCameraBindTransaction(gateway);
+ RegionE region = new RegionE();
+ region.setId(10L);
+ region.setCorpId(100L);
+
+ try {
+ transaction.execute(region,
+ Collections.singletonList(new CameraKeyE("SOURCE", "A")),
+ Collections.singletonList(binding(null, null, "SOURCE", "A", null)));
+ Assert.fail("绑定到其他区域的摄像头应被拒绝");
+ } catch (BizException expected) {
+ Assert.assertTrue(expected.getMessage().startsWith("摄像头已绑定其他区域"));
+ }
+ }
+
+ private static RegionCameraE binding(Long id, Long regionId, String source, String cameraId, String status) {
+ RegionCameraE camera = new RegionCameraE();
+ camera.setId(id);
+ camera.setRegionId(regionId);
+ camera.setCameraSource(source);
+ camera.setCameraId(cameraId);
+ camera.setCameraName(cameraId);
+ camera.setBindStatus(status);
+ return camera;
+ }
+
+ private static class FakeGateway implements RegionCameraGateway {
+ private final List rows = new ArrayList<>();
+ private long sequence = 10;
+
+ @Override public Boolean add(RegionCameraE value) { value.setId(sequence++); rows.add(value); return true; }
+ @Override public Boolean update(RegionCameraE value) { return true; }
+ @Override public Boolean deleteById(Long id) { return false; }
+ @Override public RegionCameraE getById(Long id) { return null; }
+ @Override public boolean existsBoundByRegionId(Long regionId) { return false; }
+ @Override public List pageBound(Long regionId, String name, String level, Integer online, int index, int size) { return Collections.emptyList(); }
+ @Override public long countBound(Long regionId, String name, String level, Integer online) { return 0; }
+ @Override public List listBoundByRegionId(Long regionId) {
+ List result = new ArrayList<>();
+ for (RegionCameraE row : rows) if (regionId.equals(row.getRegionId()) && "BOUND".equals(row.getBindStatus())) result.add(row);
+ return result;
+ }
+ @Override public List listByKeys(Long corpId, Collection keys) {
+ List result = new ArrayList<>();
+ for (CameraKeyE key : keys) {
+ RegionCameraE value = find(key.identity(), false);
+ if (value != null) result.add(value);
+ }
+ return result;
+ }
+ private RegionCameraE find(String identity, boolean ignored) {
+ for (RegionCameraE row : rows) {
+ if ((row.getCameraSource() + ":" + row.getCameraId()).equals(identity)) return row;
+ }
+ return null;
+ }
+ }
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/RegionCameraServiceI.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/RegionCameraServiceI.java
new file mode 100644
index 0000000..1b6d72a
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/RegionCameraServiceI.java
@@ -0,0 +1,15 @@
+package com.zcloud.gbs.edgeguard.api;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.zcloud.gbs.edgeguard.dto.CameraLeaderUpdateCmd;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraBindCmd;
+import com.zcloud.gbs.edgeguard.dto.RegionCameraPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.RegionCameraCo;
+
+public interface RegionCameraServiceI {
+ PageResponse page(RegionCameraPageQry qry);
+ Response bind(Long regionId, RegionCameraBindCmd cmd);
+ Response updateLeader(Long id, CameraLeaderUpdateCmd cmd);
+ Response unbind(Long id);
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/RiskPointServiceI.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/RiskPointServiceI.java
deleted file mode 100644
index 6ef7738..0000000
--- a/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/RiskPointServiceI.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.zcloud.gbs.edgeguard.api;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.alibaba.cola.dto.SingleResponse;
-import com.zcloud.gbs.edgeguard.dto.RiskPointAddCmd;
-import com.zcloud.gbs.edgeguard.dto.RiskPointPageQry;
-import com.zcloud.gbs.edgeguard.dto.RiskPointUpdateCmd;
-import com.zcloud.gbs.edgeguard.dto.clientobject.RiskPointCo;
-
-public interface RiskPointServiceI {
- PageResponse listPage(RiskPointPageQry qry);
- SingleResponse add(RiskPointAddCmd cmd);
-
- void edit(RiskPointUpdateCmd riskPointUpdateCmd);
-
- void remove(Long id);
-
- void removeBatch(Long[] ids);
-
-}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/CameraLeaderUpdateCmd.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/CameraLeaderUpdateCmd.java
new file mode 100644
index 0000000..1e824c9
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/CameraLeaderUpdateCmd.java
@@ -0,0 +1,14 @@
+package com.zcloud.gbs.edgeguard.dto;
+
+import com.alibaba.cola.dto.Command;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CameraLeaderUpdateCmd extends Command {
+ @NotNull(message = "摄像头负责人不能为空")
+ private Long leaderUserId;
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/CameraSelectionCmd.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/CameraSelectionCmd.java
new file mode 100644
index 0000000..64b2eea
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/CameraSelectionCmd.java
@@ -0,0 +1,30 @@
+package com.zcloud.gbs.edgeguard.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class CameraSelectionCmd implements Serializable {
+ @NotBlank(message = "固定摄像头业务ID不能为空")
+ private String fixedCameraId;
+ @NotBlank(message = "视频名称不能为空")
+ private String videoName;
+ private String videoType;
+ @NotNull(message = "所属单位ID不能为空")
+ private Long corpinfoId;
+ private String corpinfoName;
+ private Long departmentId;
+ private String departmentName;
+ private String videoLevel;
+ private String videoAddress;
+ private Integer isOnline;
+ private String deviceModel;
+ private String deviceGbNumber;
+ private String cameraNumber;
+ private String longitude;
+ private String latitude;
+ private String remarks;
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RegionCameraBindCmd.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RegionCameraBindCmd.java
new file mode 100644
index 0000000..433a5ee
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RegionCameraBindCmd.java
@@ -0,0 +1,19 @@
+package com.zcloud.gbs.edgeguard.dto;
+
+import com.alibaba.cola.dto.Command;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class RegionCameraBindCmd extends Command {
+ /** 提交完整选中集合;空集合表示解除该区域全部绑定。 */
+ @Valid
+ @NotNull(message = "摄像头选择结果不能为空")
+ private List cameras = new ArrayList<>();
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RegionCameraPageQry.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RegionCameraPageQry.java
new file mode 100644
index 0000000..a6cc0d2
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RegionCameraPageQry.java
@@ -0,0 +1,19 @@
+package com.zcloud.gbs.edgeguard.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class RegionCameraPageQry extends PageQuery {
+ @NotNull(message = "区域ID不能为空")
+ @ApiModelProperty(value = "区域ID", required = true)
+ private Long regionId;
+ private String name;
+ private String videoLevel;
+ private Integer isOnline;
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointAddCmd.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointAddCmd.java
deleted file mode 100644
index b37cba0..0000000
--- a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointAddCmd.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.zcloud.gbs.edgeguard.dto;
-
-import com.alibaba.cola.dto.Command;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotEmpty;
-
-/**
- *
- * @author lin
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class RiskPointAddCmd extends Command {
- @ApiModelProperty(value = "风险点名字", name = "riskPointName", required = true)
- @NotEmpty(message = "风险点名字不能为空")
- private String riskPointName;
-// @ApiModelProperty(value = "部门Id", name = "deptId", required = true)
-// @NotEmpty
-// private String deptId;
- @NotEmpty(message = "部门名字不能为空")
- @ApiModelProperty(value = "部门名字", name = "deptName", required = true)
- private String deptName;
-}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointPageQry.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointPageQry.java
deleted file mode 100644
index 3a5d6d4..0000000
--- a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointPageQry.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.zcloud.gbs.edgeguard.dto;
-
-import com.alibaba.cola.dto.PageQuery;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-@Data
-public class RiskPointPageQry extends PageQuery {
- @ApiModelProperty(value = "风险点名称")
- private String likeRiskPointName;
- @ApiModelProperty(value = "部门名称")
- private String eqDeptName;
-
- public Map toHashMap() {
- Map map = new HashMap<>();
- Class> clazz = this.getClass();
-
- Field[] fields = clazz.getDeclaredFields();
- for (Field field : fields) {
- try {
- field.setAccessible(true);
- map.put(field.getName(), field.get(this));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }
-
- Class> superClass = clazz.getSuperclass();
- if (superClass != null) {
- Field[] superFields = superClass.getDeclaredFields();
- for (Field field : superFields) {
- try {
- field.setAccessible(true);
- map.put(field.getName(), field.get(this));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }
- }
- return map;
- }
-}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointUpdateCmd.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointUpdateCmd.java
deleted file mode 100644
index 5038eff..0000000
--- a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/RiskPointUpdateCmd.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.zcloud.gbs.edgeguard.dto;
-
-import com.alibaba.cola.dto.Command;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotEmpty;
-
-/**
- *
- * @author lin
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class RiskPointUpdateCmd extends Command {
- @ApiModelProperty(value = "风险点id", name = "id", required = true)
- @NotEmpty
- private String id;
- @ApiModelProperty(value = "风险点名字", name = "riskPointName", required = true)
- @NotEmpty
- private String riskPointName;
-
- @NotEmpty
- @ApiModelProperty(value = "部门名字", name = "deptName", required = true)
- private String deptName;
-}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/RegionCameraCo.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/RegionCameraCo.java
new file mode 100644
index 0000000..f7b36d3
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/RegionCameraCo.java
@@ -0,0 +1,33 @@
+package com.zcloud.gbs.edgeguard.dto.clientobject;
+
+import com.alibaba.cola.dto.ClientObject;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class RegionCameraCo extends ClientObject {
+ private Long id;
+ private Long regionId;
+ private String regionName;
+ private String fixedCameraId;
+ private String videoName;
+ private String videoType;
+ private Long corpinfoId;
+ private String corpinfoName;
+ private Long departmentId;
+ private String departmentName;
+ private String videoLevel;
+ private String videoAddress;
+ private Integer isOnline;
+ private String deviceModel;
+ private String deviceGbNumber;
+ private String cameraNumber;
+ private String longitude;
+ private String latitude;
+ private Long leaderUserId;
+ private String leaderUserName;
+ private String bindStatus;
+ private Date boundTime;
+ private Date unboundTime;
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/RiskPointCo.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/RiskPointCo.java
deleted file mode 100644
index 527f90d..0000000
--- a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/RiskPointCo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.zcloud.gbs.edgeguard.dto.clientobject;
-
-import com.alibaba.cola.dto.ClientObject;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-public class RiskPointCo extends ClientObject {
- @ApiModelProperty(value = "id")
- private Long id;
- @ApiModelProperty(value = "风险点名称")
- private String riskPointName;
- @ApiModelProperty(value = "部门名称")
- private String deptName;
- @ApiModelProperty(value = "创建人")
- private String createName;
-}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionCameraGateway.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionCameraGateway.java
index c6c039e..3f62b34 100644
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionCameraGateway.java
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionCameraGateway.java
@@ -1,6 +1,10 @@
package com.zcloud.gbs.edgeguard.domain.gateway;
import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
+import com.zcloud.gbs.edgeguard.domain.model.CameraKeyE;
+
+import java.util.Collection;
+import java.util.List;
public interface RegionCameraGateway {
Boolean add(RegionCameraE regionCamera);
@@ -8,4 +12,9 @@ public interface RegionCameraGateway {
Boolean deleteById(Long id);
RegionCameraE getById(Long id);
boolean existsBoundByRegionId(Long regionId);
+ List pageBound(Long regionId, String cameraName, String videoLevel,
+ Integer isOnline, int pageIndex, int pageSize);
+ long countBound(Long regionId, String cameraName, String videoLevel, Integer isOnline);
+ List listBoundByRegionId(Long regionId);
+ List listByKeys(Long corpId, Collection cameraKeys);
}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionGateway.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionGateway.java
index 41f93b7..723cf62 100644
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionGateway.java
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RegionGateway.java
@@ -11,6 +11,7 @@ public interface RegionGateway {
Boolean deleteById(Long id);
RegionE getById(Long id);
List listByCorpIds(Collection corpIds);
+ List listByIds(Collection ids);
boolean existsSiblingName(Long corpId, Long parentId, String regionName, Long excludeId);
boolean existsChild(Long parentId);
}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RiskPointGateway.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RiskPointGateway.java
deleted file mode 100644
index 0c7ecce..0000000
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/RiskPointGateway.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.zcloud.gbs.edgeguard.domain.gateway;
-
-
-import com.zcloud.gbs.edgeguard.domain.model.RiskPointE;
-
-/**
- * 领域getway
- * @author lin
- */
-public interface RiskPointGateway {
-
- /**
- * 新增
- * @param riskPointE 准考证管理
- * @return 结果
- */
- Boolean add(RiskPointE riskPointE) ;
-
- /**
- * 修改
- * @param riskPointE 准考证管理
- * @return 结果
- */
- Boolean update(RiskPointE riskPointE);
-
- /**
- * 删除
- * @param id
- * @return 结果
- */
- Boolean deletedRiskPointById(Long id);
- Boolean deletedRiskPointByIds(Long[] id);
-}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/CameraKeyE.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/CameraKeyE.java
new file mode 100644
index 0000000..cac5ef6
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/CameraKeyE.java
@@ -0,0 +1,17 @@
+package com.zcloud.gbs.edgeguard.domain.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CameraKeyE {
+ private String cameraSource;
+ private String cameraId;
+
+ public String identity() {
+ return cameraSource + ":" + cameraId;
+ }
+}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/RegionCameraE.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/RegionCameraE.java
index d54c495..9bcb9a2 100644
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/RegionCameraE.java
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/RegionCameraE.java
@@ -18,19 +18,23 @@ public class RegionCameraE extends BaseE {
private String cameraSource;
private String cameraId;
private String cameraName;
- private String cameraUnitId;
+ private String videoType;
+ private Long cameraUnitId;
private String cameraUnitName;
- private String cameraTypeCode;
- private String cameraTypeName;
- private String cameraLevelCode;
- private String cameraLevelName;
- private String cameraDeptId;
+ private Long cameraDeptId;
private String cameraDeptName;
- private String onlineStatus;
- private String cameraSnapshot;
- private Date cameraSyncedAt;
+ private String videoLevel;
+ private String videoAddress;
+ private Integer isOnline;
+ private String deviceModel;
+ private String deviceGbNumber;
+ private String cameraNumber;
+ private String longitude;
+ private String latitude;
private Long leaderUserId;
private String bindStatus;
private Date boundTime;
private Date unboundTime;
+ private Integer version;
+ private String remarks;
}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/RiskPointE.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/RiskPointE.java
deleted file mode 100644
index b441604..0000000
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/RiskPointE.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.zcloud.gbs.edgeguard.domain.model;
-
-import com.alibaba.cola.domain.Entity;
-import com.jjb.saas.framework.domain.model.BaseE;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 领域模型,根据领域模型驱动设计
- *
- * @author lin
- */
-@Data
-@Entity
-@EqualsAndHashCode(callSuper = true)
-public class RiskPointE extends BaseE {
- private Long id;
- private String riskPointName;
- private String deptName;
-}
diff --git a/web-infrastructure/pom.xml b/web-infrastructure/pom.xml
index 45f9046..98d6b1f 100644
--- a/web-infrastructure/pom.xml
+++ b/web-infrastructure/pom.xml
@@ -39,5 +39,6 @@
com.jjb.saas
jjb-saas-framework-facade
+
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionCameraGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionCameraGatewayImpl.java
index 0a8717a..7341822 100644
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionCameraGatewayImpl.java
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionCameraGatewayImpl.java
@@ -1,6 +1,7 @@
package com.zcloud.gbs.edgeguard.gatewayimpl;
import com.zcloud.gbs.edgeguard.domain.gateway.RegionCameraGateway;
+import com.zcloud.gbs.edgeguard.domain.model.CameraKeyE;
import com.zcloud.gbs.edgeguard.domain.model.RegionCameraE;
import com.zcloud.gbs.edgeguard.persistence.dataobject.RegionCameraDO;
import com.zcloud.gbs.edgeguard.persistence.repository.RegionCameraRepository;
@@ -8,6 +9,13 @@ import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
@Service
@RequiredArgsConstructor
public class RegionCameraGatewayImpl implements RegionCameraGateway {
@@ -41,6 +49,69 @@ public class RegionCameraGatewayImpl implements RegionCameraGateway {
.count() > 0;
}
+ @Override
+ public List pageBound(Long regionId, String cameraName, String videoLevel,
+ Integer isOnline, int pageIndex, int pageSize) {
+ LambdaQueryWrapper wrapper = boundWrapper(regionId, cameraName, videoLevel, isOnline)
+ .orderByDesc(RegionCameraDO::getBoundTime).orderByDesc(RegionCameraDO::getId);
+ Page page = repository.page(new Page<>(pageIndex, pageSize), wrapper);
+ return toEntities(page.getRecords());
+ }
+
+ @Override
+ public long countBound(Long regionId, String cameraName, String videoLevel, Integer isOnline) {
+ return repository.count(boundWrapper(regionId, cameraName, videoLevel, isOnline));
+ }
+
+ @Override
+ public List listBoundByRegionId(Long regionId) {
+ return toEntities(repository.lambdaQuery()
+ .eq(RegionCameraDO::getRegionId, regionId)
+ .eq(RegionCameraDO::getBindStatus, "BOUND")
+ .list());
+ }
+
+ @Override
+ public List listByKeys(Long corpId, Collection cameraKeys) {
+ if (cameraKeys == null || cameraKeys.isEmpty()) {
+ return Collections.emptyList();
+ }
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(RegionCameraDO::getCorpId, corpId);
+ wrapper.and(group -> {
+ boolean first = true;
+ for (CameraKeyE key : cameraKeys) {
+ if (first) {
+ group.eq(RegionCameraDO::getCameraSource, key.getCameraSource())
+ .eq(RegionCameraDO::getCameraId, key.getCameraId());
+ first = false;
+ } else {
+ group.or(nested -> nested.eq(RegionCameraDO::getCameraSource, key.getCameraSource())
+ .eq(RegionCameraDO::getCameraId, key.getCameraId()));
+ }
+ }
+ });
+ return toEntities(repository.list(wrapper));
+ }
+
+ private LambdaQueryWrapper boundWrapper(Long regionId, String cameraName,
+ String videoLevel, Integer isOnline) {
+ return new LambdaQueryWrapper()
+ .eq(RegionCameraDO::getRegionId, regionId)
+ .eq(RegionCameraDO::getBindStatus, "BOUND")
+ .like(cameraName != null && !cameraName.trim().isEmpty(), RegionCameraDO::getCameraName, cameraName)
+ .eq(videoLevel != null && !videoLevel.trim().isEmpty(), RegionCameraDO::getVideoLevel, videoLevel)
+ .eq(isOnline != null, RegionCameraDO::getIsOnline, isOnline);
+ }
+
+ private List toEntities(List rows) {
+ List result = new ArrayList<>();
+ for (RegionCameraDO row : rows) {
+ result.add(toEntity(row));
+ }
+ return result;
+ }
+
private RegionCameraDO toDO(RegionCameraE source) {
RegionCameraDO target = new RegionCameraDO();
BeanUtils.copyProperties(source, target);
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionGatewayImpl.java
index 6f35309..1bd7b3d 100644
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionGatewayImpl.java
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RegionGatewayImpl.java
@@ -58,6 +58,19 @@ public class RegionGatewayImpl implements RegionGateway {
return result;
}
+ @Override
+ public List listByIds(Collection ids) {
+ if (ids == null || ids.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List rows = repository.lambdaQuery().in(RegionDO::getId, ids).list();
+ List result = new ArrayList<>();
+ for (RegionDO row : rows) {
+ result.add(toEntity(row));
+ }
+ return result;
+ }
+
@Override
public boolean existsSiblingName(Long corpId, Long parentId, String regionName, Long excludeId) {
return repository.lambdaQuery()
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RiskPointGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RiskPointGatewayImpl.java
deleted file mode 100644
index a5dbf72..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/RiskPointGatewayImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.zcloud.gbs.edgeguard.gatewayimpl;
-
-import com.zcloud.gbs.edgeguard.domain.gateway.RiskPointGateway;
-import com.zcloud.gbs.edgeguard.domain.model.RiskPointE;
-import com.zcloud.gbs.edgeguard.persistence.dataobject.RiskPointDO;
-import com.zcloud.gbs.edgeguard.persistence.repository.RiskPointRepository;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-
-import java.util.Arrays;
-
-/**
- * 持久层实现
- *
- * @author lin
- */
-
-@Service
-@AllArgsConstructor
-public class RiskPointGatewayImpl implements RiskPointGateway {
- private final RiskPointRepository riskPointRepository;
-
- @Override
- public Boolean add(RiskPointE riskPointE) {
- RiskPointDO d = new RiskPointDO();
- BeanUtils.copyProperties(riskPointE, d);
- riskPointRepository.save(d);
- return true;
- }
-
- @Override
- public Boolean update(RiskPointE riskPointE) {
- RiskPointDO d = new RiskPointDO();
- BeanUtils.copyProperties(riskPointE, d);
- riskPointRepository.updateById(d);
- return true;
- }
-
- @Override
- public Boolean deletedRiskPointById(Long id) {
- return riskPointRepository.removeById(id);
- }
-
- @Override
- public Boolean deletedRiskPointByIds(Long[] ids) {
- return riskPointRepository.removeByIds(Arrays.asList(ids));
- }
-
-
-}
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/RegionCameraDO.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/RegionCameraDO.java
index effcfd1..f599ef8 100644
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/RegionCameraDO.java
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/RegionCameraDO.java
@@ -16,17 +16,19 @@ public class RegionCameraDO extends BaseDO {
private String cameraSource;
private String cameraId;
private String cameraName;
- private String cameraUnitId;
+ private String videoType;
+ private Long cameraUnitId;
private String cameraUnitName;
- private String cameraTypeCode;
- private String cameraTypeName;
- private String cameraLevelCode;
- private String cameraLevelName;
- private String cameraDeptId;
+ private Long cameraDeptId;
private String cameraDeptName;
- private String onlineStatus;
- private String cameraSnapshot;
- private Date cameraSyncedAt;
+ private String videoLevel;
+ private String videoAddress;
+ private Integer isOnline;
+ private String deviceModel;
+ private String deviceGbNumber;
+ private String cameraNumber;
+ private String longitude;
+ private String latitude;
private Long leaderUserId;
private String bindStatus;
private Date boundTime;
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/RiskPointDO.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/RiskPointDO.java
deleted file mode 100644
index 876922c..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/RiskPointDO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.zcloud.gbs.edgeguard.persistence.dataobject;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.jjb.saas.framework.repository.basedo.BaseDO;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("risk_point")
-public class RiskPointDO extends BaseDO {
-
- private String riskPointName;
-
- private String deptName;
-}
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/domainobject/RiskPointDO.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/domainobject/RiskPointDO.java
deleted file mode 100644
index 6cddda6..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/domainobject/RiskPointDO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.zcloud.gbs.edgeguard.persistence.domainobject;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.jjb.saas.framework.repository.basedo.BaseDO;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("risk_point")
-public class RiskPointDO extends BaseDO {
-
- private String riskPointName;
-
- private String deptName;
-}
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/mapper/RiskPointMapper.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/mapper/RiskPointMapper.java
deleted file mode 100644
index 9818173..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/mapper/RiskPointMapper.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.zcloud.gbs.edgeguard.persistence.mapper;
-
-import com.zcloud.gbs.edgeguard.persistence.dataobject.RiskPointDO;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface RiskPointMapper extends BaseMapper {
-}
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/RiskPointRepository.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/RiskPointRepository.java
deleted file mode 100644
index ab91760..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/RiskPointRepository.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.zcloud.gbs.edgeguard.persistence.repository;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.zcloud.gbs.edgeguard.persistence.dataobject.RiskPointDO;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.jjb.saas.framework.repository.repo.BaseRepository;
-
-import java.util.Map;
-
-/**
- * @author lin
- */
-public interface RiskPointRepository extends BaseRepository {
- PageResponse listRiskPointPage(Map parmas);
-}
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/impl/RiskPointRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/impl/RiskPointRepositoryImpl.java
deleted file mode 100644
index 752c3eb..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/impl/RiskPointRepositoryImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.zcloud.gbs.edgeguard.persistence.repository.impl;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.jjb.saas.framework.repository.common.PageHelper;
-import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
-import com.zcloud.gbs.edgeguard.persistence.dataobject.RiskPointDO;
-import com.zcloud.gbs.edgeguard.persistence.mapper.RiskPointMapper;
-import com.zcloud.gbs.edgeguard.persistence.repository.RiskPointRepository;
-import com.zcloud.gbs.edgeguard.utils.PageQueryHelper;
-import com.zcloud.gbs.edgeguard.utils.Query;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.Map;
-
-/**
- * @author lin
- */
-@Service
-@RequiredArgsConstructor
-public class RiskPointRepositoryImpl extends BaseRepositoryImpl implements RiskPointRepository {
- private final RiskPointMapper riskPointMapper;
-
- @Override
- public PageResponse listRiskPointPage(Map parmas) {
- IPage iPage = new Query().getPage(parmas);
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, parmas);
- queryWrapper.orderByDesc("create_time");
- IPage result = riskPointMapper.selectPage(iPage, queryWrapper);
- return PageHelper.pageToResponse(result, result.getRecords());
- }
-}
diff --git a/web-infrastructure/src/main/resources/RegionManagementDDL.sql b/web-infrastructure/src/main/resources/RegionManagementDDL.sql
index c021afe..4cd01f6 100644
--- a/web-infrastructure/src/main/resources/RegionManagementDDL.sql
+++ b/web-infrastructure/src/main/resources/RegionManagementDDL.sql
@@ -42,17 +42,19 @@ CREATE TABLE `edgeguard_region_camera` (
`camera_source` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '摄像头来源系统编码',
`camera_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '第三方摄像头唯一标识',
`camera_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '摄像头名称缓存,第三方为权威数据源',
- `camera_unit_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头所属单位第三方标识缓存',
- `camera_unit_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头所属单位名称缓存',
- `camera_type_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头类型编码缓存',
- `camera_type_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头类型名称缓存',
- `camera_level_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头等级编码缓存',
- `camera_level_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头等级名称缓存',
- `camera_dept_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头主管部门第三方标识缓存',
- `camera_dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头主管部门名称缓存',
- `online_status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '在线状态缓存ONLINE/OFFLINE/UNKNOWN',
- `camera_snapshot` json DEFAULT NULL COMMENT '第三方摄像头扩展字段快照',
- `camera_synced_at` datetime DEFAULT NULL COMMENT '摄像头缓存最近同步时间',
+ `video_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '视频类型快照',
+ `camera_unit_id` bigint DEFAULT NULL COMMENT '所属单位ID快照',
+ `camera_unit_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '所属单位名称快照',
+ `camera_dept_id` bigint DEFAULT NULL COMMENT '主管部门ID快照',
+ `camera_dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主管部门名称快照',
+ `video_level` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '视频等级快照',
+ `video_address` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '视频地址快照',
+ `is_online` int DEFAULT NULL COMMENT '在线状态:0离线,1在线',
+ `device_model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '规格型号快照',
+ `device_gb_number` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设备国标编号快照',
+ `camera_number` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '摄像头编号快照',
+ `longitude` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '经度快照',
+ `latitude` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '纬度快照',
`leader_user_id` bigint DEFAULT NULL COMMENT '摄像头负责人用户id',
`bind_status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'BOUND' COMMENT '绑定状态BOUND/UNBOUND',
`bound_time` datetime NOT NULL COMMENT '最近绑定时间',
@@ -70,10 +72,10 @@ CREATE TABLE `edgeguard_region_camera` (
`update_id` bigint DEFAULT NULL COMMENT '修改人id',
`env` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '环境标识',
PRIMARY KEY (`id`),
- UNIQUE KEY `uk_camera_source_id` (`camera_source`, `camera_id`),
+ UNIQUE KEY `uk_camera_source_id` (`tenant_id`, `camera_source`, `camera_id`),
KEY `idx_region_camera` (`tenant_id`, `region_id`, `bind_status`, `delete_enum`),
KEY `idx_camera_corp` (`tenant_id`, `corp_id`, `delete_enum`),
- KEY `idx_camera_filter` (`tenant_id`, `region_id`, `camera_level_code`, `online_status`, `delete_enum`),
+ KEY `idx_camera_filter` (`tenant_id`, `region_id`, `bind_status`, `video_level`, `is_online`, `delete_enum`),
KEY `idx_camera_name` (`camera_name`),
KEY `idx_camera_leader` (`leader_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='区域与第三方摄像头绑定表';
diff --git a/web-infrastructure/src/main/resources/mybatis/RiskPointMapper.xml b/web-infrastructure/src/main/resources/mybatis/RiskPointMapper.xml
deleted file mode 100644
index 6d37b67..0000000
--- a/web-infrastructure/src/main/resources/mybatis/RiskPointMapper.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
diff --git a/边缘人脸识别区域安全设计方案.md b/边缘人脸识别区域安全设计方案.md
index f2f7886..35718be 100644
--- a/边缘人脸识别区域安全设计方案.md
+++ b/边缘人脸识别区域安全设计方案.md
@@ -157,13 +157,16 @@ nodeType = REGION 本地区域节点
| `camera_source` | `varchar(64)` | 摄像头来源系统编码 |
| `camera_id` | `varchar(128)` | 第三方摄像头唯一标识 |
| `camera_name` | `varchar(255)` | 摄像头名称缓存 |
-| `camera_unit_id/name` | `varchar` | 所属单位标识及名称缓存 |
-| `camera_type_code/name` | `varchar` | 类型编码及名称缓存 |
-| `camera_level_code/name` | `varchar` | 等级编码及名称缓存 |
-| `camera_dept_id/name` | `varchar` | 主管部门标识及名称缓存 |
-| `online_status` | `varchar(32)` | 在线状态缓存 |
-| `camera_snapshot` | `json` | 第三方其他扩展字段快照 |
-| `camera_synced_at` | `datetime` | 缓存最近同步时间 |
+| `video_type` | `varchar(64)` | 视频类型快照 |
+| `camera_unit_id/name` | `bigint/varchar` | 所属单位及名称快照 |
+| `camera_dept_id/name` | `bigint/varchar` | 主管部门及名称快照 |
+| `video_level` | `varchar(64)` | 视频等级快照 |
+| `video_address` | `varchar(1000)` | 视频地址快照 |
+| `is_online` | `int` | 在线状态快照 |
+| `device_model` | `varchar(255)` | 规格型号快照 |
+| `device_gb_number` | `varchar(128)` | 设备国标编号快照 |
+| `camera_number` | `varchar(128)` | 摄像头编号快照 |
+| `longitude/latitude` | `varchar(64)` | 经纬度快照 |
| `leader_user_id` | `bigint` | 摄像头负责人用户 ID |
| `bind_status` | `varchar(32)` | `BOUND/UNBOUND`,若逻辑删除足够可不单设 |
| `bound_time` | `datetime` | 绑定时间 |
@@ -174,7 +177,7 @@ nodeType = REGION 本地区域节点
- 区域列表索引:`tenant_id + region_id + delete_enum`。
- 摄像头负责人索引:`leader_user_id`,仅在需要按负责人查询时增加。
-当前只缓存已经绑定的摄像头,因此展示字段直接放在绑定表中即可。如果后续要求缓存全部第三方摄像头、未绑定摄像头也要离线搜索,或一个摄像头允许绑定多个区域,则应拆分为“摄像头缓存表 + 区域摄像头关系表”。
+当前只缓存已绑定摄像头的 `FixedCameraCO` 业务展示字段,权威主数据仍由视频巡检服务维护。如果后续要求缓存全部摄像头或一个摄像头允许绑定多个区域,再拆分为“摄像头缓存表 + 区域摄像头关系表”。
## 5. 页面功能拆解
@@ -432,14 +435,14 @@ OR
| 编号 | 方法与路径 | 用途 | 主要入参 | 主要返回 | 核心规则 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- |
-| `CAMERA-01` | `POST /edgeguard/region-cameras/page` | 查询区域已绑定摄像头 | `RegionCameraPageQry` | `PageResponse` | 必须传 `regionId`;从本地快照分页;支持名称、等级、在线状态;负责人批量翻译 | P0 |
-| `CAMERA-02` | `POST /edgeguard/region-cameras/candidates/page` | 查询第三方可选摄像头 | `CameraCandidatePageQry` | `PageResponse` | 通过 Infrastructure Gateway 调第三方;标记未绑定、已绑定当前区域、已绑定其他区域 | P0,依赖第三方契约 |
-| `CAMERA-03` | `PUT /edgeguard/regions/{regionId}/cameras` | 保存区域摄像头选择结果 | `regionId + RegionCameraBindCmd` | `Response` | 入参提交选中的 `cameraSource + cameraId`;服务端重新查询权威数据;计算新增和解绑差异并在本地事务保存;重复提交幂等 | P0,依赖第三方契约 |
+| `CAMERA-01` | `POST /edgeguard/region-cameras/page` | 查询区域已绑定摄像头 | `RegionCameraPageQry` | `PageResponse` | 必须传 `regionId`;从本地快照分页;支持名称、等级和在线状态筛选;负责人批量翻译 | P0 |
+| `CAMERA-02` | `POST /videopatrol/fixedCamera/list` | 查询可选摄像头 | 视频巡检 `FixedCameraPageQry` | 视频巡检 `FixedCameraCO` 分页 | 前端直接调用视频巡检服务,本服务不重复提供接口;`pageSize` 不使用 1000 | P0,外部前端依赖 |
+| `CAMERA-03` | `PUT /edgeguard/regions/{regionId}/cameras` | 保存区域摄像头选择结果 | `regionId + RegionCameraBindCmd` | `Response` | 入参字段与 `FixedCameraCO` 对齐;校验所属企业;保存展示快照并计算绑定差异;重复提交幂等 | P0 |
| `CAMERA-04` | `PUT /edgeguard/region-cameras/{id}/leader` | 设置摄像头负责人 | `id + CameraLeaderUpdateCmd` | `Response` | 负责人必须为有效用户;只修改当前有效绑定 | P0 |
| `CAMERA-05` | `DELETE /edgeguard/region-cameras/{id}` | 解除摄像头绑定 | `id` | `Response` | 只解除本地关系,不删除第三方摄像头;写入 `UNBOUND/unboundTime` | P0 |
| `CAMERA-06` | `GET /edgeguard/region-cameras/{id}` | 查看摄像头详情 | `id` | `SingleResponse` | 优先查询第三方实时详情;失败时返回本地快照并明确 `snapshot=true` | P1,依赖第三方契约 |
-`RegionCameraPageQry` 至少包含 `regionId`,可选 `cameraName/cameraLevelCode/onlineStatus`。摄像头选择接口的分页字段和筛选能力最终以第三方接口能力为准。
+`RegionCameraPageQry` 至少包含 `regionId`,可选 `name`。可选摄像头分页参数以视频巡检服务的 `FixedCameraPageQry` 为准。
### 11.4 第三方区域开放接口
@@ -465,7 +468,7 @@ OR
`AlarmReceiveCmd` 当前确认字段:
- `sourceSystem`、`alarmNo`、`alarmTime`、`alarmAddress`。
-- `cameraSource`、`cameraId`、`cameraName`。
+- `fixedCameraId`、`videoName`、`videoType`、所属单位、主管部门、视频等级、在线状态和摄像头编号等 `FixedCameraCO` 字段。
- `regionCode`(第三方可传,但最终以本地摄像头绑定匹配结果校验)。
- `alarmImageUrl`。
@@ -513,7 +516,7 @@ OR
| 依赖 | 使用接口 | 当前状态 | 开发前需要确认 |
| --- | --- | --- | --- |
| 企业/用户公共服务 | `REGION-01~04`、`CAMERA-04`、统计展示 | 已有公共能力 | 企业数据权限来源、负责人有效性校验和批量翻译字段 |
-| 第三方摄像头服务 | `CAMERA-02/03/06` | 契约待提供 | 协议、分页报文、筛选字段、唯一 ID、详情接口、超时和错误码 |
+| 视频巡检固定摄像头分页 | `CAMERA-02` | 已确认 | 前端调用 `POST /videopatrol/fixedCamera/list`,普通分页时返回 `FixedCameraCO` |
| 第三方报警平台 | `ALARM-01` | 契约待联调 | JSON 报文、鉴权签名、重试策略、截图 URL 有效期、区域/摄像头无法匹配时的处理 |
| 隐患服务 `ZcloudHiddenFacade` | `ALARM-04/05` | Common 已有能力 | `HiddenAddCmd` 必填字段、返回的隐患 ID、幂等行为、失败错误码 |
@@ -524,7 +527,7 @@ OR
| 开发批次 | 接口 | 当前状态 | 原因 |
| --- | --- | --- | --- |
| 第1批:区域闭环 | `REGION-01~05` | `DOING` | 分层实现、校验、测试及编译已完成;待菜单资源分配真实权限编码后转 `DONE` |
-| 第2批:摄像头绑定 | `CAMERA-01~05` | `TODO` | 本地绑定可开发;候选和保存快照依赖第三方摄像头契约 |
+| 第2批:摄像头绑定 | `CAMERA-01~05` | `DOING` | 前端复用视频巡检固定摄像头分页;本服务已完成快照保存、负责人、解绑及绑定差异逻辑;待配置菜单权限编码 |
| 第3批:报警与统计 | `ALARM-01~04`、`STAT-01~02` | `TODO` | 统计需求和下钻行为已由原型确认;与报警主流程同批开发、联调 |
| 第4批:开放查询 | `OPEN-REGION-01~04` | `TODO` | 需先确认第三方实际需要和开放鉴权方案 |
| 第5批:增强能力 | `CAMERA-06`、`ALARM-05` | `TODO` | 实时详情降级和隐患失败重试 |