diff --git a/web-adapter/pom.xml b/web-adapter/pom.xml
index 0f72808..cda94b0 100644
--- a/web-adapter/pom.xml
+++ b/web-adapter/pom.xml
@@ -26,5 +26,9 @@
com.zcloud.gbs.edgeguard
web-client
+
+ com.xuxueli
+ xxl-job-core
+
diff --git a/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/job/AlarmHiddenStatusSyncJob.java b/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/job/AlarmHiddenStatusSyncJob.java
new file mode 100644
index 0000000..5d578ed
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/job/AlarmHiddenStatusSyncJob.java
@@ -0,0 +1,21 @@
+package com.zcloud.gbs.edgeguard.job;
+
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.zcloud.gbs.edgeguard.command.AlarmHiddenStatusSyncExe;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class AlarmHiddenStatusSyncJob {
+ private static final int BATCH_SIZE = 200;
+
+ private final AlarmHiddenStatusSyncExe syncExe;
+
+ @XxlJob("edgeguardAlarmHiddenStatusSyncJob")
+ public ReturnT execute(String param) {
+ int count = syncExe.syncPending(BATCH_SIZE);
+ return new ReturnT<>(ReturnT.SUCCESS_CODE, "同步报警隐患状态数量: " + count);
+ }
+}
diff --git a/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/AlarmController.java b/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/AlarmController.java
new file mode 100644
index 0000000..8a2201f
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/AlarmController.java
@@ -0,0 +1,45 @@
+package com.zcloud.gbs.edgeguard.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.gbs.edgeguard.api.AlarmServiceI;
+import com.zcloud.gbs.edgeguard.dto.AlarmDisposeCmd;
+import com.zcloud.gbs.edgeguard.dto.AlarmPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmCo;
+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.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+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/alarms")
+@RequiredArgsConstructor
+public class AlarmController {
+ private final AlarmServiceI service;
+
+ @ApiOperation("报警分页")
+ @PostMapping("/page")
+ public PageResponse page(@Validated @RequestBody AlarmPageQry qry) {
+ return service.page(qry);
+ }
+
+ @ApiOperation("报警详情")
+ @GetMapping("/{id}")
+ public SingleResponse detail(@PathVariable Long id) {
+ return service.detail(id);
+ }
+
+ @ApiOperation("提交报警处置")
+ @PostMapping("/{id}/disposal")
+ public Response dispose(@PathVariable Long id, @Validated @RequestBody AlarmDisposeCmd cmd) {
+ return service.dispose(id, cmd);
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmDisposeExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmDisposeExe.java
new file mode 100644
index 0000000..a008234
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmDisposeExe.java
@@ -0,0 +1,81 @@
+package com.zcloud.gbs.edgeguard.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.gbs.edgeguard.domain.gateway.AlarmDisposalGateway;
+import com.zcloud.gbs.edgeguard.domain.gateway.AlarmGateway;
+import com.zcloud.gbs.edgeguard.domain.gateway.HiddenGateway;
+import com.zcloud.gbs.edgeguard.domain.model.AlarmDisposalE;
+import com.zcloud.gbs.edgeguard.domain.model.AlarmE;
+import com.zcloud.gbs.edgeguard.dto.AlarmDisposeCmd;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+@Component
+@RequiredArgsConstructor
+public class AlarmDisposeExe {
+ private final AlarmGateway alarmGateway;
+ private final AlarmDisposalGateway disposalGateway;
+ private final HiddenGateway hiddenGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(Long alarmId, AlarmDisposeCmd cmd) {
+ AlarmE alarm = alarmGateway.getById(alarmId);
+ if (alarm == null) {
+ throw new BizException("报警不存在");
+ }
+ if ("DISPOSED".equals(alarm.getDisposalStatus())) {
+ throw new BizException("报警已处置");
+ }
+ validate(cmd);
+
+ Long handlerUserId = AuthContext.getUserId();
+ String handlerName = AuthContext.getCurrentUser().getName();
+ String hiddenId = null;
+ if (Integer.valueOf(1).equals(cmd.getIsHiddenHazard())) {
+ try {
+ hiddenId = hiddenGateway.createFromAlarm(alarm, handlerUserId, handlerName);
+ } catch (Exception exception) {
+ throw new BizException("创建隐患失败: " + exception.getMessage());
+ }
+ }
+
+ AlarmDisposalE disposal = new AlarmDisposalE();
+ disposal.setAlarmId(alarmId);
+ disposal.setIsFalseAlarm(cmd.getIsFalseAlarm());
+ disposal.setIsHiddenHazard(cmd.getIsHiddenHazard());
+ disposal.setDisposalResultCode(cmd.getDisposalResultCode());
+ disposal.setDisposalResultName(cmd.getDisposalResultName());
+ disposal.setDisposalDescription(cmd.getDisposalDescription());
+ disposal.setHiddenId(hiddenId);
+ if (hiddenId != null) {
+ disposal.setHiddenStatus(100);
+ disposal.setHiddenStatusName("待确认");
+ disposal.setHiddenSyncTime(new Date());
+ }
+ disposal.setHandlerUserId(handlerUserId);
+ disposal.setDisposedTime(new Date());
+
+ alarm.setDisposalStatus(hiddenId == null ? "DISPOSED" : "HIDDEN_HANDLING");
+ if (!disposalGateway.add(disposal) || !alarmGateway.update(alarm)) {
+ throw new BizException("保存报警处置失败");
+ }
+ }
+
+ private void validate(AlarmDisposeCmd cmd) {
+ Integer falseAlarm = cmd.getIsFalseAlarm();
+ if (falseAlarm == null || (falseAlarm != 0 && falseAlarm != 1)) {
+ throw new BizException("是否误报参数错误");
+ }
+ if (falseAlarm == 0 && cmd.getIsHiddenHazard() == null) {
+ throw new BizException("非误报时必须选择是否隐患");
+ }
+ if (falseAlarm == 0 && Integer.valueOf(0).equals(cmd.getIsHiddenHazard())
+ && (cmd.getDisposalResultCode() == null || cmd.getDisposalResultCode().trim().isEmpty())) {
+ throw new BizException("非隐患必须填写处置结果");
+ }
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmHiddenStatusSyncExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmHiddenStatusSyncExe.java
new file mode 100644
index 0000000..fe6115c
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmHiddenStatusSyncExe.java
@@ -0,0 +1,77 @@
+package com.zcloud.gbs.edgeguard.command;
+
+import com.zcloud.gbs.edgeguard.domain.gateway.AlarmDisposalGateway;
+import com.zcloud.gbs.edgeguard.domain.gateway.AlarmGateway;
+import com.zcloud.gbs.edgeguard.domain.gateway.HiddenGateway;
+import com.zcloud.gbs.edgeguard.domain.model.AlarmDisposalE;
+import com.zcloud.gbs.edgeguard.domain.model.AlarmE;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class AlarmHiddenStatusSyncExe {
+ private static final int HIDDEN_ACCEPTED = 301;
+ private static final int HIDDEN_ARCHIVED = 400;
+
+ private final AlarmGateway alarmGateway;
+ private final AlarmDisposalGateway disposalGateway;
+ private final HiddenGateway hiddenGateway;
+
+ public void sync(AlarmE alarm) {
+ if (alarm == null || !"HIDDEN_HANDLING".equals(alarm.getDisposalStatus())) {
+ return;
+ }
+ AlarmDisposalE disposal = disposalGateway.getByAlarmId(alarm.getId());
+ if (disposal == null || disposal.getHiddenId() == null) {
+ return;
+ }
+ Integer status;
+ try {
+ status = hiddenGateway.queryStatus(disposal.getHiddenId(), alarm.getAlarmNo());
+ } catch (Exception exception) {
+ log.warn("同步报警隐患状态失败, alarmId={}, hiddenId={}",
+ alarm.getId(), disposal.getHiddenId(), exception);
+ return;
+ }
+ if (status == null) {
+ return;
+ }
+ disposal.setHiddenStatus(status);
+ disposal.setHiddenStatusName(statusName(status));
+ disposal.setHiddenSyncTime(new Date());
+ disposalGateway.update(disposal);
+ if (status == HIDDEN_ACCEPTED || status == HIDDEN_ARCHIVED) {
+ alarm.setDisposalStatus("DISPOSED");
+ alarmGateway.update(alarm);
+ }
+ }
+
+ public int syncPending(int limit) {
+ List alarms = alarmGateway.listByDisposalStatus("HIDDEN_HANDLING", limit);
+ for (AlarmE alarm : alarms) {
+ sync(alarm);
+ }
+ return alarms.size();
+ }
+
+ private String statusName(Integer status) {
+ switch (status) {
+ case 100: return "待确认";
+ case 110: return "待核实";
+ case 120: return "待审核";
+ case 200: return "待整改";
+ case 201: return "确认打回";
+ case 202: return "特殊处置";
+ case 300: return "待验收";
+ case 301: return "已验收";
+ case 400: return "已归档";
+ default: return "处理中";
+ }
+ }
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/AlarmQueryExe.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/AlarmQueryExe.java
new file mode 100644
index 0000000..b270c25
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/AlarmQueryExe.java
@@ -0,0 +1,20 @@
+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.command.AlarmHiddenStatusSyncExe;
+import com.zcloud.gbs.edgeguard.domain.gateway.*;
+import com.zcloud.gbs.edgeguard.domain.model.*;
+import com.zcloud.gbs.edgeguard.dto.AlarmPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+import java.util.*;
+@Component @RequiredArgsConstructor
+public class AlarmQueryExe {
+ private final AlarmGateway alarms; private final AlarmDisposalGateway disposals; private final RegionAccessService access;
+ private final AlarmHiddenStatusSyncExe hiddenStatusSyncExe;
+ public PageResponse page(AlarmPageQry q){ if(q.getCorpId()!=null)access.requireAccessibleCorp(q.getCorpId()); if(q.getRegionId()!=null)access.requireAccessibleRegion(q.getRegionId()); int i=q.getPageIndex()<=0?1:q.getPageIndex(),s=q.getPageSize()<=0?10:Math.min(q.getPageSize(),200); List out=new ArrayList<>(); for(AlarmE a:alarms.page(q.getAlarmNo(),q.getCorpId(),q.getRegionId(),q.getDisposalStatus(),q.getAlarmTimeStart(),q.getAlarmTimeEnd(),i,s))out.add(co(a,false)); return PageResponse.of(out,(int)alarms.count(q.getAlarmNo(),q.getCorpId(),q.getRegionId(),q.getDisposalStatus(),q.getAlarmTimeStart(),q.getAlarmTimeEnd()),s,i); }
+ public AlarmCo detail(Long id){ AlarmE a=alarms.getById(id); if(a==null)return null; hiddenStatusSyncExe.sync(a); return co(a,true); }
+ private AlarmCo co(AlarmE a,boolean detail){AlarmCo c=new AlarmCo();BeanUtils.copyProperties(a,c);if(detail){AlarmDisposalE d=disposals.getByAlarmId(a.getId());if(d!=null){AlarmDisposalCo x=new AlarmDisposalCo();BeanUtils.copyProperties(d,x);c.setDisposal(x);}}return c;}
+}
diff --git a/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/AlarmServiceImpl.java b/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/AlarmServiceImpl.java
new file mode 100644
index 0000000..cf37d7f
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/gbs/edgeguard/service/AlarmServiceImpl.java
@@ -0,0 +1,37 @@
+package com.zcloud.gbs.edgeguard.service;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.gbs.edgeguard.api.AlarmServiceI;
+import com.zcloud.gbs.edgeguard.command.AlarmDisposeExe;
+import com.zcloud.gbs.edgeguard.command.query.AlarmQueryExe;
+import com.zcloud.gbs.edgeguard.dto.AlarmDisposeCmd;
+import com.zcloud.gbs.edgeguard.dto.AlarmPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmCo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class AlarmServiceImpl implements AlarmServiceI {
+ private final AlarmQueryExe queryExe;
+ private final AlarmDisposeExe disposeExe;
+
+ @Override
+ public PageResponse page(AlarmPageQry qry) {
+ return queryExe.page(qry);
+ }
+
+ @Override
+ public SingleResponse detail(Long id) {
+ AlarmCo alarm = queryExe.detail(id);
+ return alarm == null ? SingleResponse.buildFailure("报警不存在") : SingleResponse.of(alarm);
+ }
+
+ @Override
+ public Response dispose(Long id, AlarmDisposeCmd cmd) {
+ disposeExe.execute(id, cmd);
+ return Response.buildSuccess();
+ }
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/AlarmServiceI.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/AlarmServiceI.java
new file mode 100644
index 0000000..4113b75
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/api/AlarmServiceI.java
@@ -0,0 +1,12 @@
+package com.zcloud.gbs.edgeguard.api;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.gbs.edgeguard.dto.AlarmDisposeCmd;
+import com.zcloud.gbs.edgeguard.dto.AlarmPageQry;
+import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmCo;
+public interface AlarmServiceI {
+ PageResponse page(AlarmPageQry qry);
+ SingleResponse detail(Long id);
+ Response dispose(Long id, AlarmDisposeCmd cmd);
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmDisposeCmd.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmDisposeCmd.java
new file mode 100644
index 0000000..f3a501f
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmDisposeCmd.java
@@ -0,0 +1,18 @@
+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 AlarmDisposeCmd extends Command {
+ @NotNull(message = "是否误报不能为空")
+ private Integer isFalseAlarm;
+ private Integer isHiddenHazard;
+ private String disposalResultCode;
+ private String disposalResultName;
+ private String disposalDescription;
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmPageQry.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmPageQry.java
new file mode 100644
index 0000000..7cfe32f
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmPageQry.java
@@ -0,0 +1,14 @@
+package com.zcloud.gbs.edgeguard.dto;
+import com.alibaba.cola.dto.PageQuery;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+@Data @EqualsAndHashCode(callSuper = true)
+public class AlarmPageQry extends PageQuery {
+ private String alarmNo;
+ private Long corpId;
+ private Long regionId;
+ private String disposalStatus;
+ private Date alarmTimeStart;
+ private Date alarmTimeEnd;
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmCo.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmCo.java
new file mode 100644
index 0000000..8563671
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmCo.java
@@ -0,0 +1,12 @@
+package com.zcloud.gbs.edgeguard.dto.clientobject;
+import com.alibaba.cola.dto.ClientObject;
+import lombok.Data;
+import java.util.Date;
+@Data
+public class AlarmCo extends ClientObject {
+ private Long id; private String alarmNo; private String sourceSystem; private Date alarmTime;
+ private Date receivedTime; private String alarmAddress; private Long corpId; private String corpNameSnapshot;
+ private Long regionId; private String regionCode; private String regionNameSnapshot; private String regionPathSnapshot;
+ private String cameraSource; private String cameraId; private String cameraNameSnapshot; private String alarmImageUrl;
+ private String disposalStatus; private AlarmDisposalCo disposal;
+}
diff --git a/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmDisposalCo.java b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmDisposalCo.java
new file mode 100644
index 0000000..07ba491
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmDisposalCo.java
@@ -0,0 +1,12 @@
+package com.zcloud.gbs.edgeguard.dto.clientobject;
+import com.alibaba.cola.dto.ClientObject;
+import lombok.Data;
+import java.util.Date;
+@Data
+public class AlarmDisposalCo extends ClientObject {
+ private Long id; private Long alarmId; private Integer isFalseAlarm; private Integer isHiddenHazard;
+ private String disposalResultCode; private String disposalResultName; private String disposalDescription;
+ private String hiddenId; private Integer hiddenStatus; private String hiddenStatusName; private Date hiddenSyncTime;
+ private Long handlerUserId; private String handlerUserName;
+ private Long handlerDeptId; private String handlerDeptName; private Date disposedTime;
+}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmDisposalGateway.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmDisposalGateway.java
index 74fda19..81a7af0 100644
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmDisposalGateway.java
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmDisposalGateway.java
@@ -6,4 +6,5 @@ public interface AlarmDisposalGateway {
Boolean add(AlarmDisposalE disposal);
Boolean update(AlarmDisposalE disposal);
AlarmDisposalE getById(Long id);
+ AlarmDisposalE getByAlarmId(Long alarmId);
}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmGateway.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmGateway.java
index 0df82fc..6809bba 100644
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmGateway.java
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/AlarmGateway.java
@@ -1,9 +1,16 @@
package com.zcloud.gbs.edgeguard.domain.gateway;
import com.zcloud.gbs.edgeguard.domain.model.AlarmE;
+import java.util.List;
public interface AlarmGateway {
Boolean add(AlarmE alarm);
Boolean update(AlarmE alarm);
AlarmE getById(Long id);
+ List page(String alarmNo, Long corpId, Long regionId, String disposalStatus,
+ java.util.Date alarmTimeStart, java.util.Date alarmTimeEnd,
+ int pageIndex, int pageSize);
+ long count(String alarmNo, Long corpId, Long regionId, String disposalStatus,
+ java.util.Date alarmTimeStart, java.util.Date alarmTimeEnd);
+ List listByDisposalStatus(String disposalStatus, int limit);
}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/HiddenGateway.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/HiddenGateway.java
new file mode 100644
index 0000000..7433b85
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/HiddenGateway.java
@@ -0,0 +1,9 @@
+package com.zcloud.gbs.edgeguard.domain.gateway;
+
+import com.zcloud.gbs.edgeguard.domain.model.AlarmE;
+
+public interface HiddenGateway {
+ String createFromAlarm(AlarmE alarm, Long handlerUserId, String handlerName);
+
+ Integer queryStatus(String hiddenId, String alarmNo);
+}
diff --git a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/AlarmDisposalE.java b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/AlarmDisposalE.java
index 9916253..1240f16 100644
--- a/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/AlarmDisposalE.java
+++ b/web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/model/AlarmDisposalE.java
@@ -20,6 +20,9 @@ public class AlarmDisposalE extends BaseE {
private String disposalResultName;
private String disposalDescription;
private String hiddenId;
+ private Integer hiddenStatus;
+ private String hiddenStatusName;
+ private Date hiddenSyncTime;
private Long handlerUserId;
private String handlerUserName;
private Long handlerDeptId;
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmDisposalGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmDisposalGatewayImpl.java
index 83e0499..90ac616 100644
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmDisposalGatewayImpl.java
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmDisposalGatewayImpl.java
@@ -28,6 +28,11 @@ public class AlarmDisposalGatewayImpl implements AlarmDisposalGateway {
return toEntity(repository.getById(id));
}
+ @Override
+ public AlarmDisposalE getByAlarmId(Long alarmId) {
+ return toEntity(repository.getByAlarmId(alarmId));
+ }
+
private AlarmDisposalDO toDO(AlarmDisposalE source) {
AlarmDisposalDO target = new AlarmDisposalDO();
BeanUtils.copyProperties(source, target);
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmGatewayImpl.java
index f783f89..0b5c5ae 100644
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmGatewayImpl.java
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/AlarmGatewayImpl.java
@@ -7,6 +7,12 @@ import com.zcloud.gbs.edgeguard.persistence.repository.AlarmRepository;
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.Date;
+import java.util.List;
+import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@@ -28,6 +34,42 @@ public class AlarmGatewayImpl implements AlarmGateway {
return toEntity(repository.getById(id));
}
+ @Override
+ public List page(String alarmNo, Long corpId, Long regionId, String disposalStatus,
+ Date start, Date end, int pageIndex, int pageSize) {
+ Page page = repository.page(new Page<>(pageIndex, pageSize), wrapper(alarmNo, corpId, regionId, disposalStatus, start, end));
+ List result = new ArrayList<>();
+ for (AlarmDO row : page.getRecords()) result.add(toEntity(row));
+ return result;
+ }
+
+ @Override
+ public long count(String alarmNo, Long corpId, Long regionId, String disposalStatus,
+ Date start, Date end) {
+ return repository.count(wrapper(alarmNo, corpId, regionId, disposalStatus, start, end));
+ }
+
+ @Override
+ public List listByDisposalStatus(String disposalStatus, int limit) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(AlarmDO::getDisposalStatus, disposalStatus)
+ .orderByAsc(AlarmDO::getId)
+ .last("LIMIT " + Math.max(1, Math.min(limit, 500)));
+ return repository.list(wrapper).stream().map(this::toEntity).collect(Collectors.toList());
+ }
+
+ private LambdaQueryWrapper wrapper(String alarmNo, Long corpId, Long regionId,
+ String disposalStatus, Date start, Date end) {
+ return new LambdaQueryWrapper()
+ .like(alarmNo != null && !alarmNo.trim().isEmpty(), AlarmDO::getAlarmNo, alarmNo)
+ .eq(corpId != null, AlarmDO::getCorpId, corpId)
+ .eq(regionId != null, AlarmDO::getRegionId, regionId)
+ .eq(disposalStatus != null && !disposalStatus.trim().isEmpty(), AlarmDO::getDisposalStatus, disposalStatus)
+ .ge(start != null, AlarmDO::getAlarmTime, start)
+ .le(end != null, AlarmDO::getAlarmTime, end)
+ .orderByDesc(AlarmDO::getAlarmTime).orderByDesc(AlarmDO::getId);
+ }
+
private AlarmDO toDO(AlarmE source) {
AlarmDO target = new AlarmDO();
BeanUtils.copyProperties(source, target);
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/HiddenGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/HiddenGatewayImpl.java
new file mode 100644
index 0000000..9c2eeec
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/HiddenGatewayImpl.java
@@ -0,0 +1,77 @@
+package com.zcloud.gbs.edgeguard.gatewayimpl;
+
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.gbscommon.zcloudhidden.face.ZcloudHiddenFacade;
+import com.zcloud.gbscommon.zcloudhidden.request.HiddenAddCmd;
+import com.zcloud.gbscommon.zcloudhidden.request.HiddenImgAddCmd;
+import com.zcloud.gbscommon.zcloudhidden.request.HiddenStatisticsListQry;
+import com.zcloud.gbscommon.zcloudhidden.response.HiddenListCO;
+import com.alibaba.cola.dto.PageResponse;
+import com.zcloud.gbs.edgeguard.domain.gateway.HiddenGateway;
+import com.zcloud.gbs.edgeguard.domain.model.AlarmE;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.UUID;
+import java.util.Collections;
+
+@Component
+public class HiddenGatewayImpl implements HiddenGateway {
+ @DubboReference(check = false)
+ private ZcloudHiddenFacade hiddenFacade;
+
+ @Override
+ public String createFromAlarm(AlarmE alarm, Long handlerUserId, String handlerName) {
+ HiddenAddCmd cmd = new HiddenAddCmd();
+ cmd.setHiddenId(UUID.randomUUID().toString());
+ cmd.setSource(1);
+ cmd.setForeignKey(alarm.getAlarmNo());
+ cmd.setHiddenDesc("边缘人脸识别区域报警");
+ cmd.setHiddenPart(alarm.getAlarmAddress());
+ cmd.setHiddenLevel("hiddenLevel1004");
+ cmd.setHiddenLevelName("一般隐患");
+ cmd.setHiddenType("alarm");
+ cmd.setHiddenTypeName("报警隐患");
+ cmd.setPositionDesc(alarm.getRegionPathSnapshot());
+ cmd.setHiddenFindWay("1");
+ cmd.setIsAi(0);
+ cmd.setCorpId(alarm.getCorpId());
+ cmd.setCorpName(alarm.getCorpNameSnapshot());
+ cmd.setCreatorId(handlerUserId);
+ cmd.setCreatorName(handlerName);
+ cmd.setConfirmUserId(handlerUserId);
+ cmd.setConfirmUserName(handlerName);
+ cmd.setHiddenFindTime(new Date());
+ cmd.setRectificationType(2);
+ cmd.setHiddenJson("{\"confirm\":\"1\",\"rectificationType\":2}");
+ if (alarm.getAlarmImageUrl() != null && !alarm.getAlarmImageUrl().trim().isEmpty()) {
+ HiddenImgAddCmd image = new HiddenImgAddCmd();
+ image.setCorpId(alarm.getCorpId());
+ image.setHiddenId(cmd.getHiddenId());
+ image.setUrl(alarm.getAlarmImageUrl());
+ cmd.setHiddenImgAddCmds(Collections.singletonList(image));
+ }
+ SingleResponse> response = hiddenFacade.addHidden(cmd);
+ if (response == null || !response.isSuccess()) {
+ throw new IllegalStateException(response == null ? "创建隐患失败" : response.getErrMessage());
+ }
+ return cmd.getHiddenId();
+ }
+
+ @Override
+ public Integer queryStatus(String hiddenId, String alarmNo) {
+ HiddenStatisticsListQry qry = new HiddenStatisticsListQry();
+ qry.setForeignKey(alarmNo);
+ PageResponse response = hiddenFacade.listByForeignKey(qry);
+ if (response == null || !response.isSuccess() || response.getData() == null
+ || response.getData().isEmpty()) {
+ return null;
+ }
+ return response.getData().stream()
+ .filter(hidden -> hiddenId.equals(hidden.getHiddenId()))
+ .map(HiddenListCO::getState)
+ .findFirst()
+ .orElse(null);
+ }
+}
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/AlarmDisposalDO.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/AlarmDisposalDO.java
index d6a74ef..c1531d1 100644
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/AlarmDisposalDO.java
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/dataobject/AlarmDisposalDO.java
@@ -18,6 +18,9 @@ public class AlarmDisposalDO extends BaseDO {
private String disposalResultName;
private String disposalDescription;
private String hiddenId;
+ private Integer hiddenStatus;
+ private String hiddenStatusName;
+ private Date hiddenSyncTime;
private Long handlerUserId;
private String handlerUserName;
private Long handlerDeptId;
diff --git a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/AlarmDisposalRepository.java b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/AlarmDisposalRepository.java
index 8d697c8..436676e 100644
--- a/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/AlarmDisposalRepository.java
+++ b/web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/persistence/repository/AlarmDisposalRepository.java
@@ -4,4 +4,7 @@ import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.gbs.edgeguard.persistence.dataobject.AlarmDisposalDO;
public interface AlarmDisposalRepository extends BaseRepository {
+ default AlarmDisposalDO getByAlarmId(Long alarmId) {
+ return lambdaQuery().eq(AlarmDisposalDO::getAlarmId, alarmId).one();
+ }
}
diff --git a/web-infrastructure/src/main/resources/RegionManagementDDL.sql b/web-infrastructure/src/main/resources/RegionManagementDDL.sql
index 21f2072..f7bfc68 100644
--- a/web-infrastructure/src/main/resources/RegionManagementDDL.sql
+++ b/web-infrastructure/src/main/resources/RegionManagementDDL.sql
@@ -129,6 +129,9 @@ CREATE TABLE `edgeguard_alarm_disposal` (
`disposal_result_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '处置结果名称快照',
`disposal_description` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '处置说明',
`hidden_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '关联隐患id,仅判定为隐患时有值',
+ `hidden_status` int DEFAULT NULL COMMENT '隐患处理状态码',
+ `hidden_status_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '隐患处理状态名称',
+ `hidden_sync_time` datetime DEFAULT NULL COMMENT '隐患状态最后同步时间',
`handler_user_id` bigint NOT NULL COMMENT '处置人用户id',
`handler_user_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '处置人姓名快照',
`handler_dept_id` bigint DEFAULT NULL COMMENT '处置部门id',
@@ -149,6 +152,7 @@ CREATE TABLE `edgeguard_alarm_disposal` (
PRIMARY KEY (`id`),
UNIQUE KEY `uk_disposal_alarm` (`alarm_id`),
KEY `idx_disposal_hidden` (`hidden_id`),
+ KEY `idx_disposal_hidden_status` (`tenant_id`, `hidden_status`, `hidden_sync_time`),
KEY `idx_disposal_handler` (`tenant_id`, `handler_user_id`, `disposed_time`),
KEY `idx_disposal_result` (`tenant_id`, `is_false_alarm`, `is_hidden_hazard`, `disposed_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='报警处置结论表';