From a0d2ac0215d9af4342c9f913810fbb9d8d58450e Mon Sep 17 00:00:00 2001 From: aosodo_4812 Date: Wed, 2 Sep 2026 17:35:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=AD=A6=E6=9F=A5=E8=AF=A2=E4=B8=8E?= =?UTF-8?q?=E5=A4=84=E7=BD=AE=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web-adapter/pom.xml | 4 + .../job/AlarmHiddenStatusSyncJob.java | 21 +++++ .../gbs/edgeguard/web/AlarmController.java | 45 +++++++++++ .../edgeguard/command/AlarmDisposeExe.java | 81 +++++++++++++++++++ .../command/AlarmHiddenStatusSyncExe.java | 77 ++++++++++++++++++ .../command/query/AlarmQueryExe.java | 20 +++++ .../edgeguard/service/AlarmServiceImpl.java | 37 +++++++++ .../gbs/edgeguard/api/AlarmServiceI.java | 12 +++ .../gbs/edgeguard/dto/AlarmDisposeCmd.java | 18 +++++ .../gbs/edgeguard/dto/AlarmPageQry.java | 14 ++++ .../edgeguard/dto/clientobject/AlarmCo.java | 12 +++ .../dto/clientobject/AlarmDisposalCo.java | 12 +++ .../domain/gateway/AlarmDisposalGateway.java | 1 + .../domain/gateway/AlarmGateway.java | 7 ++ .../domain/gateway/HiddenGateway.java | 9 +++ .../domain/model/AlarmDisposalE.java | 3 + .../gatewayimpl/AlarmDisposalGatewayImpl.java | 5 ++ .../gatewayimpl/AlarmGatewayImpl.java | 42 ++++++++++ .../gatewayimpl/HiddenGatewayImpl.java | 77 ++++++++++++++++++ .../dataobject/AlarmDisposalDO.java | 3 + .../repository/AlarmDisposalRepository.java | 3 + .../main/resources/RegionManagementDDL.sql | 4 + 22 files changed, 507 insertions(+) create mode 100644 web-adapter/src/main/java/com/zcloud/gbs/edgeguard/job/AlarmHiddenStatusSyncJob.java create mode 100644 web-adapter/src/main/java/com/zcloud/gbs/edgeguard/web/AlarmController.java create mode 100644 web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmDisposeExe.java create mode 100644 web-app/src/main/java/com/zcloud/gbs/edgeguard/command/AlarmHiddenStatusSyncExe.java create mode 100644 web-app/src/main/java/com/zcloud/gbs/edgeguard/command/query/AlarmQueryExe.java create mode 100644 web-app/src/main/java/com/zcloud/gbs/edgeguard/service/AlarmServiceImpl.java create mode 100644 web-client/src/main/java/com/zcloud/gbs/edgeguard/api/AlarmServiceI.java create mode 100644 web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmDisposeCmd.java create mode 100644 web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/AlarmPageQry.java create mode 100644 web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmCo.java create mode 100644 web-client/src/main/java/com/zcloud/gbs/edgeguard/dto/clientobject/AlarmDisposalCo.java create mode 100644 web-domain/src/main/java/com/zcloud/gbs/edgeguard/domain/gateway/HiddenGateway.java create mode 100644 web-infrastructure/src/main/java/com/zcloud/gbs/edgeguard/gatewayimpl/HiddenGatewayImpl.java 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='报警处置结论表';