diff --git a/start/pom.xml b/start/pom.xml
index e4695e4..6d15eb7 100644
--- a/start/pom.xml
+++ b/start/pom.xml
@@ -39,7 +39,7 @@
org.springframework.boot
spring-boot-maven-plugin
- com.zcloud.risk.Application
+ com.zcloud.iotalarm.IotAlarmApplication
diff --git a/start/src/main/resources/bootstrap.yml b/start/src/main/resources/bootstrap.yml
index d921869..7253d0c 100644
--- a/start/src/main/resources/bootstrap.yml
+++ b/start/src/main/resources/bootstrap.yml
@@ -2,5 +2,7 @@ spring:
config:
import:
- classpath:nacos.yml
+# - classpath:prodnacos.yml
- classpath:sdk.yml
+# - classpath:prodsdk.yml
- classpath:swagger.yml
diff --git a/start/src/main/resources/nacos.yml b/start/src/main/resources/nacos.yml
index af260d4..eebc076 100644
--- a/start/src/main/resources/nacos.yml
+++ b/start/src/main/resources/nacos.yml
@@ -2,10 +2,10 @@ nacos:
url: 192.168.20.100:30290
namespace: jjb-dragon
application:
- name: jjb-saas-zcloud-risk
+ name: jjb-saas-zcloud-iotalarm
version:
- gateway: risk
- cn-name: 风险中心
+ gateway: iotalarm
+ cn-name: 物联网消防报警
spring:
application:
name: ${application.name}${application.version}
diff --git a/start/src/main/resources/nacos/jjb-saas-demo.yml b/start/src/main/resources/nacos/jjb-saas-demo.yml
index 536d952..d943abe 100644
--- a/start/src/main/resources/nacos/jjb-saas-demo.yml
+++ b/start/src/main/resources/nacos/jjb-saas-demo.yml
@@ -15,4 +15,13 @@ springfox:
base-url: ${application.gateway}
swagger:
v2:
- path: /${application.gateway}/v2/api-docs
\ No newline at end of file
+ path: /${application.gateway}/v2/api-docs
+
+# 报警消息模板配置
+alarm:
+ message:
+ template:
+ # 报警自动推送模板编码(由开放平台配置)
+ auto-push: IOT_ALARM_AUTO_PUSH
+ # 报警处置推送模板编码(由开放平台配置)
+ dispose-push: IOT_ALARM_DISPOSE_PUSH
\ No newline at end of file
diff --git a/start/src/main/resources/prodnacos.yml b/start/src/main/resources/prodnacos.yml
new file mode 100644
index 0000000..f8a0eda
--- /dev/null
+++ b/start/src/main/resources/prodnacos.yml
@@ -0,0 +1,42 @@
+nacos:
+ url: prod-nacos:8848
+ namespace: jjb-dragon
+application:
+ name: jjb-saas-zcloud-iotalarm
+ version:
+ gateway: iotalarm
+ cn-name: 物联网消防报警
+spring:
+ application:
+ name: ${application.name}${application.version}
+ profiles:
+ # 环境配置
+ active: prod
+ cloud:
+ nacos:
+ config:
+ namespace: ${nacos.namespace}
+ server-addr: ${nacos.url}
+ username: nacos
+ password: u9Hc7tLFBY
+ file-extension: yml
+ shared-configs:
+ - config-common.yml
+ - config-port.yml
+ - config-mq.yml
+ - config-log.yml
+ - config-sdk-server.yml
+ - config-actuator.yml
+ - config-job.yml
+ - config-mysql.yml
+ - config-redis.yml
+ - config-cache.yml
+ - config-spring.yml
+ - config-mybatis.yml
+ - config-sdk.yml
+ - config-flyway.yml
+ discovery:
+ server-addr: ${spring.cloud.nacos.config.server-addr}
+ namespace: ${spring.cloud.nacos.config.namespace}
+ username: nacos
+ password: u9Hc7tLFBY
diff --git a/start/src/main/resources/prodsdk.yml b/start/src/main/resources/prodsdk.yml
new file mode 100644
index 0000000..e59087b
--- /dev/null
+++ b/start/src/main/resources/prodsdk.yml
@@ -0,0 +1,54 @@
+sdk:
+ server:
+# 线上环境
+ app-key: 0fde29723e51420d82b7047feaad98c9
+# 港务局环境
+# app-key: 7aa164ddb87a450fbcd902b38a49e36e
+ client:
+ gateway:
+ url: ${common.gateway.network.http.external}
+ route:
+ - client:
+ system-code: ${application.name}
+ name: ${application.cn-name}-后端
+ group-code: public_api
+ service:
+ system-code: ${application.name}
+ name: ${application.cn-name}-后端
+ group-code: public_api
+ strip-prefix: 0
+ uri: http://${application.name}
+ path: /${application.gateway}/**
+ - client:
+ system-code: ${application.name}-container
+ name: ${application.cn-name}-前端
+ group-code: public_api
+ service:
+ system-code: ${application.name}-container
+ name: ${application.cn-name}-前端
+ group-code: public_api
+ strip-prefix: 0
+ uri: http://jjb-saas-base
+ path: /${application.gateway}/container/**
+ order: -2
+openapi:
+ appId: 1871106785124999168
+ appKey: 7314ecfc11ff4d5fad1ac19284ed2ac3
+ appSecret: 7565ab15-a2ae-4830-9b4d-fb382cd5fb30
+ appPublicKey: 3059301306072a8648ce3d020106082a811ccf5501822d03420004f339671110a06681fcfd968ad9247bd3cd0d2ec6b2159d1d4b775e7ed5566b3297d82cf14b626ef11fdd6bc7ecb6bcfb3ea94ccd1f381f4116f43367be4b360f
+ appPrivateKey: 308193020100301306072a8648ce3d020106082a811ccf5501822d0479307702010104206b6abc8e717b7d042f1e8531190a7c18113e4a701417f2770d2150d33ba97779a00a06082a811ccf5501822da14403420004f339671110a06681fcfd968ad9247bd3cd0d2ec6b2159d1d4b775e7ed5566b3297d82cf14b626ef11fdd6bc7ecb6bcfb3ea94ccd1f381f4116f43367be4b360f
+ encryptType: SM2
+ platform:
+ - name: default
+ openPublicKey: 3059301306072a8648ce3d020106082a811ccf5501822d034200045b5d8fcad91e113910406db4caf0f5c6688048e0f46742d55f872a25855316803ddb177cc9bb5906ff0b2ad4d6b1f1378a49109104613e79b5b5512e3710e88f
+ url: ${common.gateway.network.http.intranet}
+ protocol: HTTP
+ defaultPlatform: true
+ ##ciphertext plaintext
+ type: plaintext
+ apiPlatform:
+ - name: default
+ #多个可以逗号隔开
+ apiCode: test:01
+ #多个可以逗号隔开,可以为空
+ tenantIds: 1838408702262321152
diff --git a/start/src/main/resources/sdk.yml b/start/src/main/resources/sdk.yml
index cffc4f1..e3c5f01 100644
--- a/start/src/main/resources/sdk.yml
+++ b/start/src/main/resources/sdk.yml
@@ -1,6 +1,6 @@
sdk:
server:
- app-key: 722091ff53dd4abba078c2a00efd4a42
+ app-key: d8328fe2605f4f92848fef116472241d
client:
gateway:
url: ${common.gateway.network.http.external}
@@ -14,7 +14,7 @@ sdk:
name: ${application.cn-name}-后端
group-code: public_api
strip-prefix: 0
- uri: lb://${application.name}
+ uri: http://${application.name}
path: /${application.gateway}/**
- client:
system-code: ${application.name}-container
@@ -25,7 +25,7 @@ sdk:
name: ${application.cn-name}-前端
group-code: public_api
strip-prefix: 0
- uri: lb://jjb-saas-base
+ uri: http://jjb-saas-base
path: /${application.gateway}/container/**
order: -2
openapi:
diff --git a/web-adapter/src/main/java/com/zcloud/web/AlarmDisposeController.java b/web-adapter/src/main/java/com/zcloud/web/AlarmDisposeController.java
new file mode 100644
index 0000000..2e41b03
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/web/AlarmDisposeController.java
@@ -0,0 +1,77 @@
+package com.zcloud.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.api.AlarmDisposeServiceI;
+import com.zcloud.dto.AlarmDisposeAssignCmd;
+import com.zcloud.dto.AlarmDisposeBatchAssignCmd;
+import com.zcloud.dto.AlarmDisposeInvalidCmd;
+import com.zcloud.dto.AlarmDisposePageQry;
+import com.zcloud.dto.clientobject.AlarmDisposeCO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * AlarmDisposeController - 报警处置控制器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Api(tags = "报警处置分配")
+@RequestMapping("/${application.gateway}/alarmDispose")
+@RestController
+@AllArgsConstructor
+public class AlarmDisposeController {
+ private final AlarmDisposeServiceI alarmDisposeService;
+
+ @ApiOperation("待处置列表")
+ @PostMapping("/assignList")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-alarmdispose-assignlist')")
+ public PageResponse assignList(@RequestBody AlarmDisposePageQry qry) {
+ if (qry.getTenantId() == null) {
+ qry.setTenantId(AuthContext.getTenantId());
+ }
+ return alarmDisposeService.assignList(qry);
+ }
+
+ @ApiOperation("单条处置分配")
+ @PostMapping("/assign")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-alarmdispose-assign')")
+ public SingleResponse assign(@Validated @RequestBody AlarmDisposeAssignCmd cmd) {
+ if (cmd.getTenantId() == null) {
+ cmd.setTenantId(AuthContext.getTenantId());
+ }
+ return alarmDisposeService.assign(cmd);
+ }
+
+ @ApiOperation("批量处置分配")
+ @PostMapping("/batchAssign")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-alarmdispose-batchassign')")
+ public SingleResponse batchAssign(@Validated @RequestBody AlarmDisposeBatchAssignCmd cmd) {
+ if (cmd.getTenantId() == null) {
+ cmd.setTenantId(AuthContext.getTenantId());
+ }
+ return alarmDisposeService.batchAssign(cmd);
+ }
+
+ @ApiOperation("无效报警处理")
+ @PostMapping("/invalid")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-alarmdispose-invalid')")
+ public SingleResponse invalid(@Validated @RequestBody AlarmDisposeInvalidCmd cmd) {
+ if (cmd.getTenantId() == null) {
+ cmd.setTenantId(AuthContext.getTenantId());
+ }
+ return alarmDisposeService.invalid(cmd);
+ }
+
+ @ApiOperation("报警详情")
+ @GetMapping("/{id}")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-alarmdispose-assignlist')")
+ public SingleResponse info(@PathVariable("id") Long id) {
+ return alarmDisposeService.info(id);
+ }
+}
\ No newline at end of file
diff --git a/web-adapter/src/main/java/com/zcloud/web/AlarmRecordController.java b/web-adapter/src/main/java/com/zcloud/web/AlarmRecordController.java
new file mode 100644
index 0000000..d352179
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/web/AlarmRecordController.java
@@ -0,0 +1,43 @@
+package com.zcloud.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.api.AlarmRecordServiceI;
+import com.zcloud.dto.AlarmRecordPageQry;
+import com.zcloud.dto.clientobject.AlarmRecordCO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * AlarmRecordController - 报警记录控制器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Api(tags = "报警记录管理")
+@RequestMapping("/${application.gateway}/alarmRecord")
+@RestController
+@AllArgsConstructor
+public class AlarmRecordController {
+ private final AlarmRecordServiceI alarmRecordService;
+
+ @ApiOperation("报警记录列表")
+ @PostMapping("/list")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-alarmrecord-list')")
+ public PageResponse list(@RequestBody AlarmRecordPageQry qry) {
+ if (qry.getTenantId() == null) {
+ qry.setTenantId(AuthContext.getTenantId());
+ }
+ return alarmRecordService.list(qry);
+ }
+
+ @ApiOperation("报警详情")
+ @GetMapping("/{id}")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-alarmrecord-info')")
+ public SingleResponse info(@PathVariable("id") Long id) {
+ return alarmRecordService.info(id);
+ }
+}
\ No newline at end of file
diff --git a/web-adapter/src/main/java/com/zcloud/web/AppAlarmDisposeController.java b/web-adapter/src/main/java/com/zcloud/web/AppAlarmDisposeController.java
new file mode 100644
index 0000000..382010c
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/web/AppAlarmDisposeController.java
@@ -0,0 +1,58 @@
+package com.zcloud.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.api.AlarmDisposeServiceI;
+import com.zcloud.dto.AppAlarmDisposePageQry;
+import com.zcloud.dto.AppAlarmDisposeSubmitCmd;
+import com.zcloud.dto.clientobject.AlarmDisposeCO;
+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.*;
+
+/**
+ * AppAlarmDisposeController - APP报警处置控制器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Api(tags = "手机端报警处置")
+@RequestMapping("/${application.gateway}/app/alarmDispose")
+@RestController
+@AllArgsConstructor
+public class AppAlarmDisposeController {
+
+ private final AlarmDisposeServiceI alarmDisposeService;
+
+ @ApiOperation("手机端待处置列表")
+ @PostMapping("/todoList")
+ public PageResponse todoList(@RequestBody AppAlarmDisposePageQry qry) {
+ // 自动填充当前用户ID和租户ID
+ qry.setCurrentUserId(AuthContext.getUserId());
+ if (qry.getTenantId() == null) {
+ qry.setTenantId(AuthContext.getTenantId());
+ }
+ return alarmDisposeService.appTodoList(qry);
+ }
+
+ @ApiOperation("手机端报警详情")
+ @GetMapping("/{id}")
+ public SingleResponse info(@PathVariable("id") Long id) {
+ return alarmDisposeService.appInfo(id);
+ }
+
+ @ApiOperation("手机端提交处置结果")
+ @PostMapping("/submit")
+ public SingleResponse submit(@Validated @RequestBody AppAlarmDisposeSubmitCmd cmd) {
+ // 自动填充租户ID和组织ID
+ if (cmd.getTenantId() == null) {
+ cmd.setTenantId(AuthContext.getTenantId());
+ }
+ if (cmd.getOrgId() == null) {
+ cmd.setOrgId(AuthContext.getOrgId());
+ }
+ return alarmDisposeService.appSubmit(cmd);
+ }
+}
\ No newline at end of file
diff --git a/web-adapter/src/main/java/com/zcloud/web/AppAlarmRecordController.java b/web-adapter/src/main/java/com/zcloud/web/AppAlarmRecordController.java
new file mode 100644
index 0000000..f8e62bb
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/web/AppAlarmRecordController.java
@@ -0,0 +1,37 @@
+package com.zcloud.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.api.AlarmRecordServiceI;
+import com.zcloud.dto.AppAlarmRecordPageQry;
+import com.zcloud.dto.clientobject.AlarmRecordCO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * AppAlarmRecordController - APP报警记录控制器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Api(tags = "手机端处置记录")
+@RequestMapping("/${application.gateway}/app/alarmRecord")
+@RestController
+@AllArgsConstructor
+public class AppAlarmRecordController {
+
+ private final AlarmRecordServiceI alarmRecordService;
+
+ @ApiOperation("处置记录列表(按当前用户过滤)")
+ @PostMapping("/list")
+ public PageResponse list(@RequestBody AppAlarmRecordPageQry qry) {
+ return alarmRecordService.appList(qry);
+ }
+
+ @ApiOperation("处置记录详情")
+ @GetMapping("/{id}")
+ public SingleResponse info(@PathVariable("id") Long id) {
+ return alarmRecordService.appInfo(id);
+ }
+}
\ No newline at end of file
diff --git a/web-adapter/src/main/java/com/zcloud/web/DeviceRegionController.java b/web-adapter/src/main/java/com/zcloud/web/DeviceRegionController.java
new file mode 100644
index 0000000..efa7710
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/web/DeviceRegionController.java
@@ -0,0 +1,93 @@
+package com.zcloud.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.api.DeviceRegionServiceI;
+import com.zcloud.dto.DeviceRegionAddCmd;
+import com.zcloud.dto.DeviceRegionPageQry;
+import com.zcloud.dto.BindSensorCmd;
+import com.zcloud.dto.UnbindSensorCmd;
+import com.zcloud.dto.ManagerCmd;
+import com.zcloud.dto.clientobject.DeviceRegionCO;
+import com.zcloud.dto.clientobject.FireRegionCO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * DeviceRegionController - 设备区域控制器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Api(tags = "设备区域管理")
+@RequestMapping("/${application.gateway}/deviceRegion")
+@RestController
+@AllArgsConstructor
+public class DeviceRegionController {
+ private final DeviceRegionServiceI deviceRegionService;
+
+ @ApiOperation("分页列表")
+ @PostMapping("/list")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-list')")
+ public PageResponse list(@RequestBody DeviceRegionPageQry qry) {
+ if (qry.getTenantId() == null) {
+ qry.setTenantId(AuthContext.getTenantId());
+ }
+ return deviceRegionService.listPage(qry);
+ }
+
+ @ApiOperation("新增或修改")
+ @PostMapping("/saveOrUpdate")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-add')")
+ public SingleResponse saveOrUpdate(@Validated @RequestBody DeviceRegionAddCmd cmd) {
+ return deviceRegionService.saveOrUpdate(cmd);
+ }
+
+ @ApiOperation("绑定传感器")
+ @PostMapping("/bindSensor")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-edit')")
+ public SingleResponse bindSensor(@Validated @RequestBody BindSensorCmd cmd) {
+ return deviceRegionService.bindSensor(cmd);
+ }
+
+ @ApiOperation("解绑传感器")
+ @PostMapping("/unbindSensor")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-edit')")
+ public SingleResponse unbindSensor(@Validated @RequestBody UnbindSensorCmd cmd) {
+ return deviceRegionService.unbindSensor(cmd);
+ }
+
+ @ApiOperation("负责人配置")
+ @PutMapping("/manager")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-edit')")
+ public SingleResponse manager(@Validated @RequestBody ManagerCmd cmd) {
+ return deviceRegionService.manager(cmd);
+ }
+
+ @ApiOperation("消防区域列表")
+ @GetMapping("/fireRegionList")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-list')")
+ public SingleResponse fireRegionList() {
+ Long tenantId = AuthContext.getTenantId();
+ return deviceRegionService.fireRegionList(tenantId);
+ }
+
+ @ApiOperation("删除")
+ @DeleteMapping("/{id}")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-delete')")
+ public SingleResponse remove(@PathVariable("id") Long id) {
+ deviceRegionService.remove(id);
+ return SingleResponse.buildSuccess();
+ }
+
+ @ApiOperation("详情")
+ @GetMapping("/{id}")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-deviceregion-list')")
+ public SingleResponse info(@PathVariable("id") Long id) {
+ return deviceRegionService.info(id);
+ }
+}
\ No newline at end of file
diff --git a/web-adapter/src/main/java/com/zcloud/web/RiskPointController.java b/web-adapter/src/main/java/com/zcloud/web/RiskPointController.java
deleted file mode 100644
index 6e5370a..0000000
--- a/web-adapter/src/main/java/com/zcloud/web/RiskPointController.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.zcloud.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.api.RiskPointServiceI;
-import com.zcloud.dto.RiskPointAddCmd;
-import com.zcloud.dto.RiskPointPageQry;
-import com.zcloud.dto.RiskPointUpdateCmd;
-import com.zcloud.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("/risk/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-adapter/src/main/java/com/zcloud/web/SensorDeviceController.java b/web-adapter/src/main/java/com/zcloud/web/SensorDeviceController.java
new file mode 100644
index 0000000..17705d2
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/web/SensorDeviceController.java
@@ -0,0 +1,85 @@
+package com.zcloud.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.api.SensorDeviceServiceI;
+import com.zcloud.dto.SensorDeviceAddCmd;
+import com.zcloud.dto.SensorDevicePageQry;
+import com.zcloud.dto.SensorDeviceThresholdCmd;
+import com.zcloud.dto.SensorDeviceUpdateCmd;
+import com.zcloud.dto.clientobject.SensorDeviceCO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * SensorDeviceController - 传感器设备控制器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Api(tags = "传感器设备管理")
+@RequestMapping("/${application.gateway}/sensorDevice")
+@RestController
+@AllArgsConstructor
+public class SensorDeviceController {
+ private final SensorDeviceServiceI sensorDeviceService;
+
+ @ApiOperation("新增")
+ @PostMapping("/save")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-add')")
+ public SingleResponse save(@Validated @RequestBody SensorDeviceAddCmd cmd) {
+ return sensorDeviceService.add(cmd);
+ }
+
+ @ApiOperation("分页列表")
+ @PostMapping("/list")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-list')")
+ public PageResponse list(@RequestBody SensorDevicePageQry qry) {
+ if (qry.getTenantId() == null) {
+ qry.setTenantId(AuthContext.getTenantId());
+ }
+ return sensorDeviceService.listPage(qry);
+ }
+
+ @ApiOperation("修改")
+ @PutMapping("/edit")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-edit')")
+ public SingleResponse edit(@Validated @RequestBody SensorDeviceUpdateCmd cmd) {
+ sensorDeviceService.edit(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @ApiOperation("状态切换")
+ @PutMapping("/status")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-edit')")
+ public SingleResponse updateStatus(@RequestParam Long id, @RequestParam String status) {
+ sensorDeviceService.updateStatus(id, status);
+ return SingleResponse.buildSuccess();
+ }
+
+ @ApiOperation("阈值配置")
+ @PutMapping("/threshold")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-edit')")
+ public SingleResponse updateThreshold(@Validated @RequestBody SensorDeviceThresholdCmd cmd) {
+ sensorDeviceService.updateThreshold(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @ApiOperation("删除")
+ @DeleteMapping("/{id}")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-delete')")
+ public SingleResponse remove(@PathVariable("id") Long id) {
+ sensorDeviceService.remove(id);
+ return SingleResponse.buildSuccess();
+ }
+
+ @ApiOperation("详情")
+ @GetMapping("/{id}")
+ public SingleResponse info(@PathVariable("id") Long id) {
+ return sensorDeviceService.info(id);
+ }
+}
\ No newline at end of file
diff --git a/web-adapter/src/main/java/com/zcloud/web/SensorTypeController.java b/web-adapter/src/main/java/com/zcloud/web/SensorTypeController.java
new file mode 100644
index 0000000..86621e8
--- /dev/null
+++ b/web-adapter/src/main/java/com/zcloud/web/SensorTypeController.java
@@ -0,0 +1,68 @@
+package com.zcloud.web;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.api.SensorTypeServiceI;
+import com.zcloud.dto.SensorTypeAddCmd;
+import com.zcloud.dto.SensorTypePageQry;
+import com.zcloud.dto.SensorTypeUpdateCmd;
+import com.zcloud.dto.clientobject.SensorTypeCO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * SensorTypeController - 传感器类型控制器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Api(tags = "传感器类型管理")
+@RequestMapping("/${application.gateway}/sensorType")
+@RestController
+@AllArgsConstructor
+public class SensorTypeController {
+ private final SensorTypeServiceI sensorTypeService;
+
+ @ApiOperation("新增")
+ @PostMapping("/save")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensortype-add')")
+ public SingleResponse save(@Validated @RequestBody SensorTypeAddCmd cmd) {
+ return sensorTypeService.add(cmd);
+ }
+
+ @ApiOperation("分页列表")
+ @PostMapping("/list")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensortype-list')")
+ public PageResponse list(@RequestBody SensorTypePageQry qry) {
+ if (qry.getTenantId() == null) {
+ qry.setTenantId(AuthContext.getTenantId());
+ }
+ return sensorTypeService.listPage(qry);
+ }
+
+ @ApiOperation("修改")
+ @PutMapping("/edit")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensortype-edit')")
+ public SingleResponse edit(@Validated @RequestBody SensorTypeUpdateCmd cmd) {
+ sensorTypeService.edit(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @ApiOperation("删除")
+ @DeleteMapping("/{id}")
+ @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensortype-delete')")
+ public SingleResponse remove(@PathVariable("id") Long id) {
+ sensorTypeService.remove(id);
+ return SingleResponse.buildSuccess();
+ }
+
+ @ApiOperation("详情")
+ @GetMapping("/{id}")
+ public SingleResponse info(@PathVariable("id") Long id) {
+ return sensorTypeService.info(id);
+ }
+}
\ No newline at end of file
diff --git a/web-app/pom.xml b/web-app/pom.xml
index 343603e..ce32f08 100644
--- a/web-app/pom.xml
+++ b/web-app/pom.xml
@@ -13,6 +13,24 @@
web-app
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-stream-rocketmq
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+
+
com.zcloud
web-client
diff --git a/web-app/src/main/java/com/zcloud/command/AlarmDisposeAssignExe.java b/web-app/src/main/java/com/zcloud/command/AlarmDisposeAssignExe.java
new file mode 100644
index 0000000..753deed
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/AlarmDisposeAssignExe.java
@@ -0,0 +1,97 @@
+package com.zcloud.command;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.AlarmRecordGateway;
+import com.zcloud.domain.gateway.AlarmDisposeLogGateway;
+import com.zcloud.domain.model.AlarmRecordE;
+import com.zcloud.domain.model.AlarmDisposeLogE;
+import com.zcloud.dto.AlarmDisposeAssignCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import com.zcloud.service.AlarmMessageService;
+import com.zcloud.service.AlarmTodoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * AlarmDisposeAssignExe - 报警处置执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class AlarmDisposeAssignExe {
+
+ private final AlarmRecordGateway alarmRecordGateway;
+ private final AlarmDisposeLogGateway alarmDisposeLogGateway;
+ private final AlarmMessageService alarmMessageService;
+ private final AlarmTodoService alarmTodoService;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(AlarmDisposeAssignCmd cmd) {
+ // 查询报警记录
+ AlarmRecordE alarmRecord = alarmRecordGateway.getById(cmd.getId());
+ if (Tools.isEmpty(alarmRecord)) {
+ throw new BizException("报警记录不存在");
+ }
+
+ // 检查状态:只有待研判(10)状态可以分配
+ if (alarmRecord.getStatus() != 10) {
+ throw new BizException("该报警已分配或已处置,无法再次分配");
+ }
+
+ // 更新报警记录状态和处置人
+ AlarmRecordE updateEntity = new AlarmRecordE();
+ BeanUtils.copyProperties(cmd, updateEntity);
+ updateEntity.setId(cmd.getId());
+ updateEntity.setStatus(20); // 待处置
+ updateEntity.setManagerId(cmd.getDisposeUserId());
+ updateEntity.setAssignTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ if (StrUtil.isNotBlank(cmd.getAlarmLevel())) {
+ updateEntity.setAlarmLevel(cmd.getAlarmLevel());
+ }
+ if (StrUtil.isNotBlank(cmd.getAlarmType())) {
+ updateEntity.setAlarmType(cmd.getAlarmType());
+ }
+
+ Boolean res = alarmRecordGateway.update(updateEntity);
+ if (!res) {
+ throw new BizException("分配失败");
+ }
+
+ // 记录处置日志
+ AlarmDisposeLogE log = new AlarmDisposeLogE();
+ log.setAlarmDisposalLogId(UuidUtil.get32UUID());
+ log.setAlarmId(cmd.getId());
+ log.setAlarmNo(alarmRecord.getAlarmNo());
+ log.setActionType("MANUAL_ASSIGN");
+ log.setBeforeStatus(10);
+ log.setAfterStatus(20);
+ log.setOperatorId(cmd.getDisposeUserId());
+ log.setActionDesc("手动分配处置");
+ log.setActionTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ log.setTenantId(cmd.getTenantId());
+ log.setOrgId(cmd.getOrgId());
+ log.setDeleteEnum("FALSE");
+
+ alarmDisposeLogGateway.add(log);
+
+ // 发送报警处置推送消息给处置人
+ // 更新后的报警记录包含分配时间和处置说明
+ alarmMessageService.sendDisposePushMessage(updateEntity, cmd.getDisposeUserId());
+
+ // 新增处置人待办
+ alarmTodoService.addDisposeTodo(updateEntity, cmd.getDisposeUserId());
+
+ // 完成负责人待办(原来负责人是 alarmRecord.getManagerId())
+ alarmTodoService.completeTodo(cmd.getId());
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/AlarmDisposeBatchAssignExe.java b/web-app/src/main/java/com/zcloud/command/AlarmDisposeBatchAssignExe.java
new file mode 100644
index 0000000..86ed5e5
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/AlarmDisposeBatchAssignExe.java
@@ -0,0 +1,93 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.AlarmRecordGateway;
+import com.zcloud.domain.gateway.AlarmDisposeLogGateway;
+import com.zcloud.domain.model.AlarmRecordE;
+import com.zcloud.domain.model.AlarmDisposeLogE;
+import com.zcloud.dto.AlarmDisposeBatchAssignCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import com.zcloud.service.AlarmMessageService;
+import com.zcloud.service.AlarmTodoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * AlarmDisposeBatchAssignExe - 报警处置执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class AlarmDisposeBatchAssignExe {
+
+ private final AlarmRecordGateway alarmRecordGateway;
+ private final AlarmDisposeLogGateway alarmDisposeLogGateway;
+ private final AlarmMessageService alarmMessageService;
+ private final AlarmTodoService alarmTodoService;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(AlarmDisposeBatchAssignCmd cmd) {
+ List ids = cmd.getIds();
+ if (Tools.isEmpty(ids)) {
+ throw new BizException("请选择要分配的报警记录");
+ }
+
+ String assignTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ for (Long id : ids) {
+ // 查询报警记录
+ AlarmRecordE alarmRecord = alarmRecordGateway.getById(id);
+ if (Tools.isEmpty(alarmRecord)) {
+ continue; // 跳过不存在的记录
+ }
+
+ // 检查状态:只有待研判(10)状态可以分配
+ if (alarmRecord.getStatus() != 10) {
+ continue; // 跳过非待研判状态的记录
+ }
+
+ // 更新报警记录状态和处置人
+ AlarmRecordE updateEntity = new AlarmRecordE();
+ updateEntity.setId(id);
+ updateEntity.setStatus(20); // 待处置
+ updateEntity.setManagerId(cmd.getDisposeUserId());
+ updateEntity.setAssignTime(assignTime);
+ updateEntity.setTenantId(cmd.getTenantId());
+ updateEntity.setOrgId(cmd.getOrgId());
+
+ alarmRecordGateway.update(updateEntity);
+
+ // 记录处置日志
+ AlarmDisposeLogE log = new AlarmDisposeLogE();
+ log.setAlarmDisposalLogId(UuidUtil.get32UUID());
+ log.setAlarmId(id);
+ log.setAlarmNo(alarmRecord.getAlarmNo());
+ log.setActionType("MANUAL_ASSIGN");
+ log.setBeforeStatus(10);
+ log.setAfterStatus(20);
+ log.setOperatorId(cmd.getDisposeUserId());
+ log.setActionDesc("批量分配处置");
+ log.setActionTime(assignTime);
+ log.setTenantId(cmd.getTenantId());
+ log.setOrgId(cmd.getOrgId());
+ log.setDeleteEnum("FALSE");
+
+ alarmDisposeLogGateway.add(log);
+
+ // 发送报警处置推送消息给处置人
+ alarmMessageService.sendDisposePushMessage(updateEntity, cmd.getDisposeUserId());
+
+ // 新增处置人待办
+ alarmTodoService.addDisposeTodo(updateEntity, cmd.getDisposeUserId());
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/AlarmDisposeInvalidExe.java b/web-app/src/main/java/com/zcloud/command/AlarmDisposeInvalidExe.java
new file mode 100644
index 0000000..f86c405
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/AlarmDisposeInvalidExe.java
@@ -0,0 +1,89 @@
+package com.zcloud.command;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.AlarmRecordGateway;
+import com.zcloud.domain.gateway.AlarmDisposeLogGateway;
+import com.zcloud.domain.model.AlarmRecordE;
+import com.zcloud.domain.model.AlarmDisposeLogE;
+import com.zcloud.dto.AlarmDisposeInvalidCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import com.zcloud.service.AlarmTodoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * AlarmDisposeInvalidExe - 报警处置执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class AlarmDisposeInvalidExe {
+
+ private final AlarmRecordGateway alarmRecordGateway;
+ private final AlarmDisposeLogGateway alarmDisposeLogGateway;
+ private final AlarmTodoService alarmTodoService;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(AlarmDisposeInvalidCmd cmd) {
+ // 查询报警记录
+ AlarmRecordE alarmRecord = alarmRecordGateway.getById(cmd.getId());
+ if (Tools.isEmpty(alarmRecord)) {
+ throw new BizException("报警记录不存在");
+ }
+
+ // 检查状态:只有待研判(10)或待处置(20)状态可以标记为无效
+ if (alarmRecord.getStatus() != 10 && alarmRecord.getStatus() != 20) {
+ throw new BizException("该报警已处置或已消警,无法标记为无效");
+ }
+
+ Integer beforeStatus = alarmRecord.getStatus();
+
+ // 更新报警记录状态
+ AlarmRecordE updateEntity = new AlarmRecordE();
+ updateEntity.setId(cmd.getId());
+ updateEntity.setStatus(40); // 误报
+ updateEntity.setDisposeTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ updateEntity.setDisposeResult("误报");
+ if (StrUtil.isNotBlank(cmd.getInvalidReason())) {
+ updateEntity.setDisposeRemark(cmd.getInvalidReason());
+ }
+ updateEntity.setTenantId(cmd.getTenantId());
+ updateEntity.setOrgId(cmd.getOrgId());
+
+ Boolean res = alarmRecordGateway.update(updateEntity);
+ if (!res) {
+ throw new BizException("标记无效失败");
+ }
+
+ // 记录处置日志
+ AlarmDisposeLogE log = new AlarmDisposeLogE();
+ log.setAlarmDisposalLogId(UuidUtil.get32UUID());
+ log.setAlarmId(cmd.getId());
+ log.setAlarmNo(alarmRecord.getAlarmNo());
+ log.setActionType("INVALID");
+ log.setBeforeStatus(beforeStatus);
+ log.setAfterStatus(40);
+ log.setActionDesc("标记为无效报警");
+ if (StrUtil.isNotBlank(cmd.getInvalidReason())) {
+ log.setResultText(cmd.getInvalidReason());
+ }
+ log.setActionTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ log.setTenantId(cmd.getTenantId());
+ log.setOrgId(cmd.getOrgId());
+ log.setDeleteEnum("FALSE");
+
+ alarmDisposeLogGateway.add(log);
+
+ // 删除待办(误报时删除所有相关待办)
+ alarmTodoService.deleteTodo(cmd.getId());
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/AppAlarmDisposeSubmitExe.java b/web-app/src/main/java/com/zcloud/command/AppAlarmDisposeSubmitExe.java
new file mode 100644
index 0000000..5378a66
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/AppAlarmDisposeSubmitExe.java
@@ -0,0 +1,111 @@
+package com.zcloud.command;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.AlarmRecordGateway;
+import com.zcloud.domain.gateway.AlarmDisposeLogGateway;
+import com.zcloud.domain.model.AlarmRecordE;
+import com.zcloud.domain.model.AlarmDisposeLogE;
+import com.zcloud.dto.AppAlarmDisposeSubmitCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import com.zcloud.service.AlarmTodoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * AppAlarmDisposeSubmitExe - APP报警处置执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class AppAlarmDisposeSubmitExe {
+
+ private final AlarmRecordGateway alarmRecordGateway;
+ private final AlarmDisposeLogGateway alarmDisposeLogGateway;
+ private final AlarmTodoService alarmTodoService;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(AppAlarmDisposeSubmitCmd cmd) {
+ // 查询报警记录
+ AlarmRecordE alarmRecord = alarmRecordGateway.getById(cmd.getAlarmId());
+ if (Tools.isEmpty(alarmRecord)) {
+ throw new BizException("报警记录不存在");
+ }
+
+ // 检查状态:只有待处置(20)状态可以提交处置
+ if (alarmRecord.getStatus() != 20) {
+ throw new BizException("该报警已处置或状态异常,无法提交处置结果");
+ }
+
+ // 确定目标状态
+ Integer afterStatus;
+ String actionDesc;
+ if ("误报".equals(cmd.getDisposeResult())) {
+ afterStatus = 40; // 误报
+ actionDesc = "手机端处置:误报判定";
+ } else {
+ afterStatus = 30; // 已消警
+ actionDesc = "手机端处置:已消警";
+ }
+
+ // 更新报警记录
+ AlarmRecordE updateEntity = new AlarmRecordE();
+ updateEntity.setId(cmd.getAlarmId());
+ updateEntity.setStatus(afterStatus);
+ updateEntity.setDisposeTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ updateEntity.setDisposeResult(cmd.getDisposeResult());
+ if (StrUtil.isNotBlank(cmd.getDisposeRemark())) {
+ updateEntity.setDisposeRemark(cmd.getDisposeRemark());
+ }
+ if (StrUtil.isNotBlank(cmd.getPictureUrls())) {
+ updateEntity.setPictureUrls(cmd.getPictureUrls());
+ }
+ updateEntity.setTenantId(cmd.getTenantId());
+ updateEntity.setOrgId(cmd.getOrgId());
+
+ Boolean res = alarmRecordGateway.update(updateEntity);
+ if (!res) {
+ throw new BizException("处置提交失败");
+ }
+
+ // 记录处置日志
+ AlarmDisposeLogE log = new AlarmDisposeLogE();
+ log.setAlarmDisposalLogId(UuidUtil.get32UUID());
+ log.setAlarmId(cmd.getAlarmId());
+ log.setAlarmNo(alarmRecord.getAlarmNo());
+ log.setActionType("DISPOSE");
+ log.setBeforeStatus(20);
+ log.setAfterStatus(afterStatus);
+ log.setActionDesc(actionDesc);
+ log.setResultText(cmd.getDisposeResult());
+ if (StrUtil.isNotBlank(cmd.getDisposeRemark())) {
+ log.setResultText(cmd.getDisposeRemark());
+ }
+ if (StrUtil.isNotBlank(cmd.getPictureUrls())) {
+ log.setPictureUrls(cmd.getPictureUrls());
+ }
+ log.setActionTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ log.setTenantId(cmd.getTenantId());
+ log.setOrgId(cmd.getOrgId());
+ log.setDeleteEnum("FALSE");
+
+ alarmDisposeLogGateway.add(log);
+
+ // 根据处置结果处理待办
+ if ("误报".equals(cmd.getDisposeResult())) {
+ // 误报时删除待办
+ alarmTodoService.deleteTodo(cmd.getAlarmId());
+ } else {
+ // 已消警时完成待办
+ alarmTodoService.completeTodo(cmd.getAlarmId());
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/BindSensorExe.java b/web-app/src/main/java/com/zcloud/command/BindSensorExe.java
new file mode 100644
index 0000000..3abd521
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/BindSensorExe.java
@@ -0,0 +1,56 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.DeviceRegionGateway;
+import com.zcloud.domain.gateway.RegionSensorRelGateway;
+import com.zcloud.domain.model.DeviceRegionE;
+import com.zcloud.domain.model.RegionSensorRelE;
+import com.zcloud.dto.BindSensorCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * BindSensorExe - 绑定传感器执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class BindSensorExe {
+
+ private final RegionSensorRelGateway regionSensorRelGateway;
+ private final DeviceRegionGateway deviceRegionGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(BindSensorCmd cmd) {
+ // 检查传感器是否已绑定到其他区域
+ Boolean isBound = regionSensorRelGateway.isSensorBound(cmd.getSensorId());
+ if (isBound) {
+ throw new BizException("该传感器已绑定到其他区域,请先解绑");
+ }
+
+ // 检查区域配置是否存在
+ DeviceRegionE region = deviceRegionGateway.getById(cmd.getRegionConfigId());
+ if (Tools.isEmpty(region)) {
+ throw new BizException("区域配置不存在");
+ }
+
+ RegionSensorRelE entity = new RegionSensorRelE();
+ BeanUtils.copyProperties(cmd, entity);
+ entity.setRegionSensorRelId(UuidUtil.get32UUID());
+ entity.setFireRegionId(region.getFireRegionId());
+ // 设置默认值
+ entity.setDeleteEnum("FALSE");
+
+ Long res = regionSensorRelGateway.add(entity);
+ if (Tools.isEmpty(res)) {
+ throw new BizException("绑定失败");
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/DeviceRegionAddExe.java b/web-app/src/main/java/com/zcloud/command/DeviceRegionAddExe.java
new file mode 100644
index 0000000..03ded84
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/DeviceRegionAddExe.java
@@ -0,0 +1,52 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.domain.gateway.DeviceRegionGateway;
+import com.zcloud.domain.model.DeviceRegionE;
+import com.zcloud.dto.DeviceRegionAddCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * DeviceRegionAddExe - 设备区域执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class DeviceRegionAddExe {
+
+ private final DeviceRegionGateway deviceRegionGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public SingleResponse execute(DeviceRegionAddCmd cmd) {
+ // 检查消防区域是否已存在配置
+ DeviceRegionE existingRegion = deviceRegionGateway.getByFireRegionId(cmd.getFireRegionId());
+ if (existingRegion != null) {
+ throw new BizException("该消防区域已存在配置,请直接修改");
+ }
+
+ DeviceRegionE entity = new DeviceRegionE();
+ BeanUtils.copyProperties(cmd, entity);
+ entity.setRegionConfigId(UuidUtil.get32UUID());
+ // 设置默认值
+ entity.setDeleteEnum("FALSE");
+ // 设置状态默认值
+ if (entity.getStatus() == null) {
+ entity.setStatus(1);
+ }
+
+ Long res = deviceRegionGateway.add(entity);
+ if (Tools.isEmpty(res)) {
+ throw new BizException("保存失败");
+ }
+ return SingleResponse.of(entity.getRegionConfigId());
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/DeviceRegionRemoveExe.java b/web-app/src/main/java/com/zcloud/command/DeviceRegionRemoveExe.java
new file mode 100644
index 0000000..5297d49
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/DeviceRegionRemoveExe.java
@@ -0,0 +1,36 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.DeviceRegionGateway;
+import com.zcloud.domain.model.DeviceRegionE;
+import com.zcloud.gbscommon.utils.Tools;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * DeviceRegionRemoveExe - 设备区域执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class DeviceRegionRemoveExe {
+
+ private final DeviceRegionGateway deviceRegionGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(Long id) {
+ DeviceRegionE existingRegion = deviceRegionGateway.getById(id);
+ if (Tools.isEmpty(existingRegion)) {
+ throw new BizException("区域配置不存在");
+ }
+
+ Boolean res = deviceRegionGateway.deleteById(id);
+ if (!res) {
+ throw new BizException("删除失败");
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/DeviceRegionUpdateExe.java b/web-app/src/main/java/com/zcloud/command/DeviceRegionUpdateExe.java
new file mode 100644
index 0000000..1821629
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/DeviceRegionUpdateExe.java
@@ -0,0 +1,41 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.DeviceRegionGateway;
+import com.zcloud.domain.model.DeviceRegionE;
+import com.zcloud.dto.DeviceRegionAddCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * DeviceRegionUpdateExe - 设备区域执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class DeviceRegionUpdateExe {
+
+ private final DeviceRegionGateway deviceRegionGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(DeviceRegionAddCmd cmd) {
+ DeviceRegionE existingRegion = deviceRegionGateway.getById(cmd.getId());
+ if (Tools.isEmpty(existingRegion)) {
+ throw new BizException("区域配置不存在");
+ }
+
+ DeviceRegionE entity = new DeviceRegionE();
+ BeanUtils.copyProperties(cmd, entity);
+
+ Boolean res = deviceRegionGateway.update(entity);
+ if (!res) {
+ throw new BizException("修改失败");
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/ManagerExe.java b/web-app/src/main/java/com/zcloud/command/ManagerExe.java
new file mode 100644
index 0000000..e6b766c
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/ManagerExe.java
@@ -0,0 +1,38 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.DeviceRegionGateway;
+import com.zcloud.domain.gateway.RegionSensorRelGateway;
+import com.zcloud.domain.model.DeviceRegionE;
+import com.zcloud.dto.ManagerCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * ManagerExe - 管理员执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class ManagerExe {
+
+ private final DeviceRegionGateway deviceRegionGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(ManagerCmd cmd) {
+ DeviceRegionE existingRegion = deviceRegionGateway.getById(cmd.getId());
+ if (Tools.isEmpty(existingRegion)) {
+ throw new BizException("区域配置不存在");
+ }
+
+ Boolean res = deviceRegionGateway.updateManager(cmd.getId(), cmd.getManagerId(), cmd.getDepartmentId());
+ if (!res) {
+ throw new BizException("负责人配置失败");
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/RiskPointAddExe.java b/web-app/src/main/java/com/zcloud/command/RiskPointAddExe.java
deleted file mode 100644
index 7eafdbc..0000000
--- a/web-app/src/main/java/com/zcloud/command/RiskPointAddExe.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.zcloud.command;
-
-import com.alibaba.cola.exception.BizException;
-import com.zcloud.domain.gateway.RiskPointGateway;
-import com.zcloud.domain.model.RiskPointE;
-import com.zcloud.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/command/RiskPointRemoveExe.java b/web-app/src/main/java/com/zcloud/command/RiskPointRemoveExe.java
deleted file mode 100644
index 90fc337..0000000
--- a/web-app/src/main/java/com/zcloud/command/RiskPointRemoveExe.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.zcloud.command;
-
-import com.alibaba.cola.exception.BizException;
-import com.zcloud.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/command/RiskPointUpdateExe.java b/web-app/src/main/java/com/zcloud/command/RiskPointUpdateExe.java
deleted file mode 100644
index 7032d54..0000000
--- a/web-app/src/main/java/com/zcloud/command/RiskPointUpdateExe.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.zcloud.command;
-
-import com.alibaba.cola.exception.BizException;
-import com.zcloud.domain.gateway.RiskPointGateway;
-import com.zcloud.domain.model.RiskPointE;
-import com.zcloud.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/command/SensorDeviceAddExe.java b/web-app/src/main/java/com/zcloud/command/SensorDeviceAddExe.java
new file mode 100644
index 0000000..f01d7b7
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorDeviceAddExe.java
@@ -0,0 +1,49 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorDeviceGateway;
+import com.zcloud.domain.model.SensorDeviceE;
+import com.zcloud.dto.SensorDeviceAddCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorDeviceAddExe - 传感器设备执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorDeviceAddExe {
+
+ private final SensorDeviceGateway sensorDeviceGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(SensorDeviceAddCmd cmd) {
+ SensorDeviceE entity = new SensorDeviceE();
+ BeanUtils.copyProperties(cmd, entity);
+ entity.setSensorDeviceId(UuidUtil.get32UUID());
+ // 设置默认值
+ entity.setDeleteEnum("FALSE");
+ // 设置报警开关默认值
+ if (entity.getAlarmSwitch() == null) {
+ entity.setAlarmSwitch(1);
+ }
+ // 设置连续报警确认次数默认值
+ if (entity.getContinuousAlarmCount() == null) {
+ entity.setContinuousAlarmCount(3);
+ }
+
+ Long res = sensorDeviceGateway.add(entity);
+ if (Tools.isEmpty(res)) {
+ throw new BizException("保存失败");
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/SensorDeviceRemoveExe.java b/web-app/src/main/java/com/zcloud/command/SensorDeviceRemoveExe.java
new file mode 100644
index 0000000..357ef9f
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorDeviceRemoveExe.java
@@ -0,0 +1,31 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorDeviceGateway;
+import com.zcloud.gbscommon.utils.Tools;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorDeviceRemoveExe - 传感器设备执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorDeviceRemoveExe {
+
+ private final SensorDeviceGateway sensorDeviceGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(Long id) {
+ boolean res = sensorDeviceGateway.deleteById(id);
+ if (!res) {
+ throw new BizException("删除失败");
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/SensorDeviceStatusExe.java b/web-app/src/main/java/com/zcloud/command/SensorDeviceStatusExe.java
new file mode 100644
index 0000000..1b97b4f
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorDeviceStatusExe.java
@@ -0,0 +1,37 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorDeviceGateway;
+import com.zcloud.domain.model.SensorDeviceE;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorDeviceStatusExe - 传感器设备执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorDeviceStatusExe {
+
+ private final SensorDeviceGateway sensorDeviceGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(Long id, String status) {
+ SensorDeviceE entity = sensorDeviceGateway.getById(id);
+ if (entity == null) {
+ throw new BizException("传感器设备不存在");
+ }
+
+ entity.setSensorStatus(status);
+ boolean res = sensorDeviceGateway.update(entity);
+ if (!res) {
+ throw new BizException("状态修改失败");
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/SensorDeviceThresholdExe.java b/web-app/src/main/java/com/zcloud/command/SensorDeviceThresholdExe.java
new file mode 100644
index 0000000..11d7302
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorDeviceThresholdExe.java
@@ -0,0 +1,55 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorDeviceGateway;
+import com.zcloud.domain.model.SensorDeviceE;
+import com.zcloud.dto.SensorDeviceThresholdCmd;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorDeviceThresholdExe - 传感器设备执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorDeviceThresholdExe {
+
+ private final SensorDeviceGateway sensorDeviceGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(SensorDeviceThresholdCmd cmd) {
+ SensorDeviceE entity = sensorDeviceGateway.getById(cmd.getId());
+ if (entity == null) {
+ throw new BizException("传感器设备不存在");
+ }
+
+ // 校验:只有数值类传感器才允许配置阈值
+ if (!"NUMBER".equals(entity.getSensorAttr())) {
+ throw new BizException("开关类传感器不支持阈值配置");
+ }
+
+ // 校验:只有阈值设定为是的才允许配置
+ if (entity.getThresholdFlag() == null || entity.getThresholdFlag() != 1) {
+ throw new BizException("该传感器未开启阈值设定,不允许配置阈值");
+ }
+
+ // 更新阈值相关字段
+ BeanUtils.copyProperties(cmd, entity);
+
+ boolean res = sensorDeviceGateway.update(entity);
+ if (!res) {
+ throw new BizException("阈值配置失败");
+ }
+
+ // TODO: 发送 MQ 事件 ThresholdConfigChangedEvent(一期预留)
+ // thresholdEventPublisher.publish(entity);
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/SensorDeviceUpdateExe.java b/web-app/src/main/java/com/zcloud/command/SensorDeviceUpdateExe.java
new file mode 100644
index 0000000..000a737
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorDeviceUpdateExe.java
@@ -0,0 +1,36 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorDeviceGateway;
+import com.zcloud.domain.model.SensorDeviceE;
+import com.zcloud.dto.SensorDeviceUpdateCmd;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorDeviceUpdateExe - 传感器设备执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorDeviceUpdateExe {
+
+ private final SensorDeviceGateway sensorDeviceGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(SensorDeviceUpdateCmd cmd) {
+ SensorDeviceE entity = new SensorDeviceE();
+ BeanUtils.copyProperties(cmd, entity);
+
+ boolean res = sensorDeviceGateway.update(entity);
+ if (!res) {
+ throw new BizException("修改失败");
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/SensorTypeAddExe.java b/web-app/src/main/java/com/zcloud/command/SensorTypeAddExe.java
new file mode 100644
index 0000000..5ffd692
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorTypeAddExe.java
@@ -0,0 +1,41 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorTypeGateway;
+import com.zcloud.domain.model.SensorTypeE;
+import com.zcloud.dto.SensorTypeAddCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorTypeAddExe - 传感器类型执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorTypeAddExe {
+
+ private final SensorTypeGateway sensorTypeGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(SensorTypeAddCmd cmd) {
+ SensorTypeE entity = new SensorTypeE();
+ BeanUtils.copyProperties(cmd, entity);
+ entity.setSensorTypeId(UuidUtil.get32UUID());
+ // 设置默认值
+ entity.setDeleteEnum("FALSE");
+
+ Long res = sensorTypeGateway.add(entity);
+ if (Tools.isEmpty(res)) {
+ throw new BizException("保存失败");
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/SensorTypeRemoveExe.java b/web-app/src/main/java/com/zcloud/command/SensorTypeRemoveExe.java
new file mode 100644
index 0000000..4c03684
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorTypeRemoveExe.java
@@ -0,0 +1,39 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorTypeGateway;
+import com.zcloud.gbscommon.utils.Tools;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorTypeRemoveExe - 传感器类型执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorTypeRemoveExe {
+
+ private final SensorTypeGateway sensorTypeGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(Long id) {
+ // TODO: 检查是否有传感器设备引用该类型(T7 SensorDevice 完成后补充)
+ // LambdaQueryWrapper deviceWrapper = new LambdaQueryWrapper<>();
+ // deviceWrapper.eq(SensorDeviceDO::getSensorTypeId, sensorType.getSensorTypeId())
+ // .eq(SensorDeviceDO::getDeleteEnum, "FALSE");
+ // if (sensorDeviceGateway.exists(deviceWrapper)) {
+ // throw new BizException("该类型已被传感器使用,不可删除");
+ // }
+
+ boolean res = sensorTypeGateway.deleteById(id);
+ if (!res) {
+ throw new BizException("删除失败");
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/SensorTypeUpdateExe.java b/web-app/src/main/java/com/zcloud/command/SensorTypeUpdateExe.java
new file mode 100644
index 0000000..27a9c77
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/SensorTypeUpdateExe.java
@@ -0,0 +1,36 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.SensorTypeGateway;
+import com.zcloud.domain.model.SensorTypeE;
+import com.zcloud.dto.SensorTypeUpdateCmd;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * SensorTypeUpdateExe - 传感器类型执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class SensorTypeUpdateExe {
+
+ private final SensorTypeGateway sensorTypeGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public boolean execute(SensorTypeUpdateCmd cmd) {
+ SensorTypeE entity = new SensorTypeE();
+ BeanUtils.copyProperties(cmd, entity);
+
+ boolean res = sensorTypeGateway.update(entity);
+ if (!res) {
+ throw new BizException("修改失败");
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/UnbindSensorExe.java b/web-app/src/main/java/com/zcloud/command/UnbindSensorExe.java
new file mode 100644
index 0000000..f311b1b
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/UnbindSensorExe.java
@@ -0,0 +1,38 @@
+package com.zcloud.command;
+
+import com.alibaba.cola.exception.BizException;
+import com.zcloud.domain.gateway.RegionSensorRelGateway;
+import com.zcloud.domain.model.RegionSensorRelE;
+import com.zcloud.dto.UnbindSensorCmd;
+import com.zcloud.gbscommon.utils.Tools;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * UnbindSensorExe - 解绑传感器执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+@RefreshScope
+public class UnbindSensorExe {
+
+ private final RegionSensorRelGateway regionSensorRelGateway;
+
+ @Transactional(rollbackFor = Exception.class)
+ public void execute(UnbindSensorCmd cmd) {
+ // 检查传感器是否已绑定
+ RegionSensorRelE rel = regionSensorRelGateway.getBySensorId(cmd.getSensorId());
+ if (Tools.isEmpty(rel)) {
+ throw new BizException("该传感器未绑定到任何区域");
+ }
+
+ Boolean res = regionSensorRelGateway.deleteBySensorId(cmd.getSensorId());
+ if (!res) {
+ throw new BizException("解绑失败");
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/convertor/RiskPointCoConvertor.java b/web-app/src/main/java/com/zcloud/command/convertor/RiskPointCoConvertor.java
deleted file mode 100644
index 4d6b799..0000000
--- a/web-app/src/main/java/com/zcloud/command/convertor/RiskPointCoConvertor.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.zcloud.command.convertor;
-
-import com.zcloud.dto.clientobject.RiskPointCo;
-import com.zcloud.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/command/query/AlarmDisposeQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/AlarmDisposeQueryExe.java
new file mode 100644
index 0000000..f647783
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/query/AlarmDisposeQueryExe.java
@@ -0,0 +1,74 @@
+package com.zcloud.command.query;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zcloud.dto.AlarmDisposePageQry;
+import com.zcloud.dto.clientobject.AlarmDisposeCO;
+import com.zcloud.persistence.dataobject.AlarmRecordDO;
+import com.zcloud.persistence.repository.AlarmRecordRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * AlarmDisposeQueryExe - 报警处置执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+public class AlarmDisposeQueryExe {
+
+ private final AlarmRecordRepository alarmRecordRepository;
+
+ public PageResponse execute(AlarmDisposePageQry qry) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ wrapper.eq(ObjectUtil.isNotEmpty(qry.getTenantId()), AlarmRecordDO::getTenantId, qry.getTenantId())
+ .eq(ObjectUtil.isNotEmpty(qry.getOrgId()), AlarmRecordDO::getOrgId, qry.getOrgId())
+ .like(ObjectUtil.isNotEmpty(qry.getAlarmNo()), AlarmRecordDO::getAlarmNo, qry.getAlarmNo())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmSource()), AlarmRecordDO::getAlarmSource, qry.getAlarmSource())
+ .like(ObjectUtil.isNotEmpty(qry.getSensorCode()), AlarmRecordDO::getSensorCode, qry.getSensorCode())
+ .eq(ObjectUtil.isNotEmpty(qry.getFireRegionId()), AlarmRecordDO::getFireRegionId, qry.getFireRegionId())
+ .eq(ObjectUtil.isNotEmpty(qry.getDepartmentId()), AlarmRecordDO::getDepartmentId, qry.getDepartmentId())
+ .eq(ObjectUtil.isNotEmpty(qry.getDisposeUserId()), AlarmRecordDO::getManagerId, qry.getDisposeUserId())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmLevel()), AlarmRecordDO::getAlarmLevel, qry.getAlarmLevel())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmType()), AlarmRecordDO::getAlarmType, qry.getAlarmType())
+ // 查询待研判(10)或待处置(20)的报警
+ .in(AlarmRecordDO::getStatus, 10, 20)
+ .eq(AlarmRecordDO::getActiveFlag, 1)
+ .orderByDesc(AlarmRecordDO::getAlarmTime);
+
+ // 处理报警时间范围
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeStart())) {
+ wrapper.ge(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeStart());
+ }
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeEnd())) {
+ wrapper.le(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeEnd());
+ }
+
+ List results = alarmRecordRepository.list(wrapper);
+ int total = results.size();
+
+ // Convert to CO
+ List alarmDisposeCOs = BeanUtil.copyToList(results, AlarmDisposeCO.class);
+
+ return PageResponse.of(alarmDisposeCOs, total, qry.getPageSize(), qry.getPageIndex());
+ }
+
+ public SingleResponse getById(Long id) {
+ AlarmRecordDO d = alarmRecordRepository.getById(id);
+ if (d == null) {
+ return SingleResponse.buildFailure("报警记录不存在");
+ }
+
+ AlarmDisposeCO co = new AlarmDisposeCO();
+ BeanUtils.copyProperties(d, co);
+ return SingleResponse.of(co);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/query/AlarmRecordQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/AlarmRecordQueryExe.java
new file mode 100644
index 0000000..653e23f
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/query/AlarmRecordQueryExe.java
@@ -0,0 +1,69 @@
+package com.zcloud.command.query;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zcloud.dto.AlarmRecordPageQry;
+import com.zcloud.dto.clientobject.AlarmRecordCO;
+import com.zcloud.persistence.dataobject.AlarmRecordDO;
+import com.zcloud.persistence.repository.AlarmRecordRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * AlarmRecordQueryExe - 报警记录执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+public class AlarmRecordQueryExe {
+
+ private final AlarmRecordRepository alarmRecordRepository;
+
+ public PageResponse execute(AlarmRecordPageQry qry) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ wrapper.eq(ObjectUtil.isNotEmpty(qry.getTenantId()), AlarmRecordDO::getTenantId, qry.getTenantId())
+ .eq(ObjectUtil.isNotEmpty(qry.getOrgId()), AlarmRecordDO::getOrgId, qry.getOrgId())
+ .like(ObjectUtil.isNotEmpty(qry.getAlarmNo()), AlarmRecordDO::getAlarmNo, qry.getAlarmNo())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmSource()), AlarmRecordDO::getAlarmSource, qry.getAlarmSource())
+ .like(ObjectUtil.isNotEmpty(qry.getSensorCode()), AlarmRecordDO::getSensorCode, qry.getSensorCode())
+ // 支持按状态筛选(不指定则查询所有状态)
+ .eq(ObjectUtil.isNotEmpty(qry.getStatus()), AlarmRecordDO::getStatus, qry.getStatus())
+ .eq(AlarmRecordDO::getDeleteEnum, "FALSE")
+ .orderByDesc(AlarmRecordDO::getAlarmTime);
+
+ // 处理报警时间范围
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeStart())) {
+ wrapper.ge(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeStart());
+ }
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeEnd())) {
+ wrapper.le(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeEnd());
+ }
+
+ List results = alarmRecordRepository.list(wrapper);
+ int total = results.size();
+
+ // Convert to CO
+ List alarmRecordCOs = BeanUtil.copyToList(results, AlarmRecordCO.class);
+
+ return PageResponse.of(alarmRecordCOs, total, qry.getPageSize(), qry.getPageIndex());
+ }
+
+ public SingleResponse getById(Long id) {
+ AlarmRecordDO d = alarmRecordRepository.getById(id);
+ if (d == null || "TRUE".equals(d.getDeleteEnum())) {
+ return SingleResponse.buildFailure("报警记录不存在");
+ }
+
+ AlarmRecordCO co = new AlarmRecordCO();
+ BeanUtils.copyProperties(d, co);
+ return SingleResponse.of(co);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/query/AppAlarmDisposeQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/AppAlarmDisposeQueryExe.java
new file mode 100644
index 0000000..e05237b
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/query/AppAlarmDisposeQueryExe.java
@@ -0,0 +1,80 @@
+package com.zcloud.command.query;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zcloud.dto.AppAlarmDisposePageQry;
+import com.zcloud.dto.clientobject.AlarmDisposeCO;
+import com.zcloud.persistence.dataobject.AlarmRecordDO;
+import com.zcloud.persistence.repository.AlarmRecordRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * AppAlarmDisposeQueryExe - APP报警处置执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+public class AppAlarmDisposeQueryExe {
+
+ private final AlarmRecordRepository alarmRecordRepository;
+
+ /**
+ * 手机端待处置列表(按当前用户过滤)
+ */
+ public PageResponse execute(AppAlarmDisposePageQry qry) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ wrapper.eq(ObjectUtil.isNotEmpty(qry.getTenantId()), AlarmRecordDO::getTenantId, qry.getTenantId())
+ .eq(ObjectUtil.isNotEmpty(qry.getOrgId()), AlarmRecordDO::getOrgId, qry.getOrgId())
+ .like(ObjectUtil.isNotEmpty(qry.getAlarmNo()), AlarmRecordDO::getAlarmNo, qry.getAlarmNo())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmSource()), AlarmRecordDO::getAlarmSource, qry.getAlarmSource())
+ .like(ObjectUtil.isNotEmpty(qry.getSensorCode()), AlarmRecordDO::getSensorCode, qry.getSensorCode())
+ .eq(ObjectUtil.isNotEmpty(qry.getFireRegionId()), AlarmRecordDO::getFireRegionId, qry.getFireRegionId())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmLevel()), AlarmRecordDO::getAlarmLevel, qry.getAlarmLevel())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmType()), AlarmRecordDO::getAlarmType, qry.getAlarmType())
+ // 关键:按当前用户过滤(managerId = 当前用户ID)
+ .eq(ObjectUtil.isNotEmpty(qry.getCurrentUserId()), AlarmRecordDO::getManagerId, qry.getCurrentUserId())
+ // 只查询待处置(20)状态的报警
+ .eq(AlarmRecordDO::getStatus, 20)
+ .eq(AlarmRecordDO::getActiveFlag, 1)
+ .orderByDesc(AlarmRecordDO::getAlarmTime);
+
+ // 处理报警时间范围
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeStart())) {
+ wrapper.ge(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeStart());
+ }
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeEnd())) {
+ wrapper.le(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeEnd());
+ }
+
+ List results = alarmRecordRepository.list(wrapper);
+ int total = results.size();
+
+ // Convert to CO
+ List alarmDisposeCOs = BeanUtil.copyToList(results, AlarmDisposeCO.class);
+
+ return PageResponse.of(alarmDisposeCOs, total, qry.getPageSize(), qry.getPageIndex());
+ }
+
+ /**
+ * 手机端报警详情
+ */
+ public SingleResponse getById(Long id) {
+ AlarmRecordDO d = alarmRecordRepository.getById(id);
+ if (d == null) {
+ return SingleResponse.buildFailure("报警记录不存在");
+ }
+
+ AlarmDisposeCO co = new AlarmDisposeCO();
+ BeanUtils.copyProperties(d, co);
+ return SingleResponse.of(co);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/query/AppAlarmRecordQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/AppAlarmRecordQueryExe.java
new file mode 100644
index 0000000..f854f70
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/query/AppAlarmRecordQueryExe.java
@@ -0,0 +1,74 @@
+package com.zcloud.command.query;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.dto.AppAlarmRecordPageQry;
+import com.zcloud.dto.clientobject.AlarmRecordCO;
+import com.zcloud.persistence.dataobject.AlarmRecordDO;
+import com.zcloud.persistence.repository.AlarmRecordRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * AppAlarmRecordQueryExe - APP报警记录执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+public class AppAlarmRecordQueryExe {
+
+ private final AlarmRecordRepository alarmRecordRepository;
+
+ public PageResponse execute(AppAlarmRecordPageQry qry) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ // 按当前用户过滤(处置人ID)
+ Long userId = AuthContext.getUserId();
+ wrapper.eq(userId != null, AlarmRecordDO::getDisposeUserId, userId);
+ // 支持按状态筛选(30已消警/40误报)
+ wrapper.eq(ObjectUtil.isNotEmpty(qry.getStatus()), AlarmRecordDO::getStatus, qry.getStatus())
+ .eq(AlarmRecordDO::getDeleteEnum, "FALSE")
+ .orderByDesc(AlarmRecordDO::getAlarmTime);
+
+ // 处理报警时间范围
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeStart())) {
+ wrapper.ge(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeStart());
+ }
+ if (ObjectUtil.isNotEmpty(qry.getAlarmTimeEnd())) {
+ wrapper.le(AlarmRecordDO::getAlarmTime, qry.getAlarmTimeEnd());
+ }
+
+ List results = alarmRecordRepository.list(wrapper);
+ int total = results.size();
+
+ // Convert to CO
+ List alarmRecordCOs = BeanUtil.copyToList(results, AlarmRecordCO.class);
+
+ return PageResponse.of(alarmRecordCOs, total, qry.getPageSize(), qry.getPageIndex());
+ }
+
+ public SingleResponse getById(Long id) {
+ AlarmRecordDO d = alarmRecordRepository.getById(id);
+ if (d == null || "TRUE".equals(d.getDeleteEnum())) {
+ return SingleResponse.buildFailure("报警记录不存在");
+ }
+
+ // 验证是否为当前用户的记录
+ Long userId = AuthContext.getUserId();
+ if (userId != null && d.getDisposeUserId() != null && !userId.equals(d.getDisposeUserId())) {
+ return SingleResponse.buildFailure("无权限查看该报警记录");
+ }
+
+ AlarmRecordCO co = new AlarmRecordCO();
+ BeanUtils.copyProperties(d, co);
+ return SingleResponse.of(co);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/query/DeviceRegionQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/DeviceRegionQueryExe.java
new file mode 100644
index 0000000..624cea1
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/query/DeviceRegionQueryExe.java
@@ -0,0 +1,76 @@
+package com.zcloud.command.query;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zcloud.dto.DeviceRegionPageQry;
+import com.zcloud.dto.clientobject.DeviceRegionCO;
+import com.zcloud.dto.clientobject.FireRegionCO;
+import com.zcloud.persistence.dataobject.DeviceRegionDO;
+import com.zcloud.persistence.repository.DeviceRegionRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * DeviceRegionQueryExe - 设备区域执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+public class DeviceRegionQueryExe {
+
+ private final DeviceRegionRepository deviceRegionRepository;
+
+ public PageResponse execute(DeviceRegionPageQry qry) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ wrapper.eq(ObjectUtil.isNotEmpty(qry.getTenantId()), DeviceRegionDO::getTenantId, qry.getTenantId())
+ .eq(ObjectUtil.isNotEmpty(qry.getOrgId()), DeviceRegionDO::getOrgId, qry.getOrgId())
+ .like(ObjectUtil.isNotEmpty(qry.getFireRegionCode()), DeviceRegionDO::getFireRegionCode, qry.getFireRegionCode())
+ .eq(ObjectUtil.isNotEmpty(qry.getDepartmentId()), DeviceRegionDO::getDepartmentId, qry.getDepartmentId())
+ .eq(ObjectUtil.isNotEmpty(qry.getManagerId()), DeviceRegionDO::getManagerId, qry.getManagerId())
+ .eq(ObjectUtil.isNotEmpty(qry.getStatus()), DeviceRegionDO::getStatus, qry.getStatus())
+ .eq(DeviceRegionDO::getDeleteEnum, "FALSE")
+ .orderByDesc(DeviceRegionDO::getCreateTime);
+
+ List results = deviceRegionRepository.list(wrapper);
+ int total = results.size();
+
+ // Convert to CO
+ List deviceRegionCOs = BeanUtil.copyToList(results, DeviceRegionCO.class);
+
+ return PageResponse.of(deviceRegionCOs, total, qry.getPageSize(), qry.getPageIndex());
+ }
+
+ public SingleResponse getById(Long id) {
+ DeviceRegionDO d = deviceRegionRepository.getById(id);
+ if (d == null || "TRUE".equals(d.getDeleteEnum())) {
+ return SingleResponse.buildFailure("记录不存在或已被删除");
+ }
+
+ DeviceRegionCO co = new DeviceRegionCO();
+ BeanUtils.copyProperties(d, co);
+ return SingleResponse.of(co);
+ }
+
+ public SingleResponse fireRegionList(Long tenantId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ wrapper.eq(ObjectUtil.isNotEmpty(tenantId), DeviceRegionDO::getTenantId, tenantId)
+ .eq(DeviceRegionDO::getDeleteEnum, "FALSE")
+ .orderByDesc(DeviceRegionDO::getCreateTime);
+
+ List results = deviceRegionRepository.list(wrapper);
+
+ // Convert to FireRegionCO
+ List fireRegionCOs = BeanUtil.copyToList(results, FireRegionCO.class);
+
+ return SingleResponse.of(fireRegionCOs.isEmpty() ? null : fireRegionCOs.get(0));
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/query/RiskPointQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/RiskPointQueryExe.java
deleted file mode 100644
index 8a8b580..0000000
--- a/web-app/src/main/java/com/zcloud/command/query/RiskPointQueryExe.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.zcloud.command.query;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.zcloud.command.convertor.RiskPointCoConvertor;
-import com.zcloud.dto.RiskPointPageQry;
-import com.zcloud.dto.clientobject.RiskPointCo;
-import com.zcloud.persistence.dataobject.RiskPointDO;
-import com.zcloud.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/command/query/SensorDeviceQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/SensorDeviceQueryExe.java
new file mode 100644
index 0000000..9e36565
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/query/SensorDeviceQueryExe.java
@@ -0,0 +1,64 @@
+package com.zcloud.command.query;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zcloud.dto.SensorDevicePageQry;
+import com.zcloud.dto.clientobject.SensorDeviceCO;
+import com.zcloud.persistence.dataobject.SensorDeviceDO;
+import com.zcloud.persistence.repository.SensorDeviceRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * SensorDeviceQueryExe - 传感器设备执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+public class SensorDeviceQueryExe {
+
+ private final SensorDeviceRepository sensorDeviceRepository;
+
+ public PageResponse execute(SensorDevicePageQry qry) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ wrapper.eq(ObjectUtil.isNotEmpty(qry.getTenantId()), SensorDeviceDO::getTenantId, qry.getTenantId())
+ .eq(ObjectUtil.isNotEmpty(qry.getOrgId()), SensorDeviceDO::getOrgId, qry.getOrgId())
+ .like(ObjectUtil.isNotEmpty(qry.getSensorCode()), SensorDeviceDO::getSensorCode, qry.getSensorCode())
+ .like(ObjectUtil.isNotEmpty(qry.getSensorName()), SensorDeviceDO::getSensorName, qry.getSensorName())
+ .eq(ObjectUtil.isNotEmpty(qry.getSensorTypeId()), SensorDeviceDO::getSensorTypeId, qry.getSensorTypeId())
+ .eq(ObjectUtil.isNotEmpty(qry.getSensorAttr()), SensorDeviceDO::getSensorAttr, qry.getSensorAttr())
+ .eq(ObjectUtil.isNotEmpty(qry.getSensorStatus()), SensorDeviceDO::getSensorStatus, qry.getSensorStatus())
+ .eq(ObjectUtil.isNotEmpty(qry.getAlarmSwitch()), SensorDeviceDO::getAlarmSwitch, qry.getAlarmSwitch())
+ .eq(ObjectUtil.isNotEmpty(qry.getThresholdFlag()), SensorDeviceDO::getThresholdFlag, qry.getThresholdFlag())
+ .like(ObjectUtil.isNotEmpty(qry.getInstallPosition()), SensorDeviceDO::getInstallPosition, qry.getInstallPosition())
+ .eq(SensorDeviceDO::getDeleteEnum, "FALSE")
+ .orderByDesc(SensorDeviceDO::getCreateTime);
+
+ List results = sensorDeviceRepository.list(wrapper);
+ int total = results.size();
+
+ // Convert to CO
+ List sensorDeviceCOs = BeanUtil.copyToList(results, SensorDeviceCO.class);
+
+ return PageResponse.of(sensorDeviceCOs, total, qry.getPageSize(), qry.getPageIndex());
+ }
+
+ public SingleResponse getById(Long id) {
+ SensorDeviceDO d = sensorDeviceRepository.getById(id);
+ if (d == null || "TRUE".equals(d.getDeleteEnum())) {
+ return SingleResponse.buildFailure("记录不存在或已被删除");
+ }
+
+ SensorDeviceCO co = new SensorDeviceCO();
+ BeanUtils.copyProperties(d, co);
+ return SingleResponse.of(co);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/command/query/SensorTypeQueryExe.java b/web-app/src/main/java/com/zcloud/command/query/SensorTypeQueryExe.java
new file mode 100644
index 0000000..b56f6a8
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/command/query/SensorTypeQueryExe.java
@@ -0,0 +1,60 @@
+package com.zcloud.command.query;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zcloud.dto.SensorTypePageQry;
+import com.zcloud.dto.clientobject.SensorTypeCO;
+import com.zcloud.persistence.dataobject.SensorTypeDO;
+import com.zcloud.persistence.repository.SensorTypeRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * SensorTypeQueryExe - 传感器类型执行器
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Component
+@RequiredArgsConstructor
+public class SensorTypeQueryExe {
+
+ private final SensorTypeRepository sensorTypeRepository;
+
+ public PageResponse execute(SensorTypePageQry qry) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+
+ wrapper.eq(ObjectUtil.isNotEmpty(qry.getTenantId()), SensorTypeDO::getTenantId, qry.getTenantId())
+ .eq(ObjectUtil.isNotEmpty(qry.getOrgId()), SensorTypeDO::getOrgId, qry.getOrgId())
+ .like(ObjectUtil.isNotEmpty(qry.getTypeCode()), SensorTypeDO::getTypeCode, qry.getTypeCode())
+ .like(ObjectUtil.isNotEmpty(qry.getTypeName()), SensorTypeDO::getTypeName, qry.getTypeName())
+ .eq(ObjectUtil.isNotEmpty(qry.getSensorAttr()), SensorTypeDO::getSensorAttr, qry.getSensorAttr())
+ .eq(ObjectUtil.isNotEmpty(qry.getStatus()), SensorTypeDO::getStatus, qry.getStatus())
+ .eq(SensorTypeDO::getDeleteEnum, "FALSE")
+ .orderByDesc(SensorTypeDO::getCreateTime);
+
+ List results = sensorTypeRepository.list(wrapper);
+ int total = results.size();
+
+ // Convert to CO
+ List sensorTypeCOs = BeanUtil.copyToList(results, SensorTypeCO.class);
+
+ return PageResponse.of(sensorTypeCOs, total, qry.getPageSize(), qry.getPageIndex());
+ }
+
+ public SingleResponse getById(Long id) {
+ SensorTypeDO d = sensorTypeRepository.getById(id);
+ if (d == null || "TRUE".equals(d.getDeleteEnum())) {
+ return SingleResponse.buildFailure("记录不存在或已被删除");
+ }
+
+ SensorTypeCO co = new SensorTypeCO();
+ BeanUtils.copyProperties(d, co);
+ return SingleResponse.of(co);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/service/AlarmDisposeServiceImpl.java b/web-app/src/main/java/com/zcloud/service/AlarmDisposeServiceImpl.java
new file mode 100644
index 0000000..e17e167
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/service/AlarmDisposeServiceImpl.java
@@ -0,0 +1,78 @@
+package com.zcloud.service;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.api.AlarmDisposeServiceI;
+import com.zcloud.command.AlarmDisposeAssignExe;
+import com.zcloud.command.AlarmDisposeBatchAssignExe;
+import com.zcloud.command.AlarmDisposeInvalidExe;
+import com.zcloud.command.AppAlarmDisposeSubmitExe;
+import com.zcloud.command.query.AlarmDisposeQueryExe;
+import com.zcloud.command.query.AppAlarmDisposeQueryExe;
+import com.zcloud.dto.AlarmDisposeAssignCmd;
+import com.zcloud.dto.AlarmDisposeBatchAssignCmd;
+import com.zcloud.dto.AlarmDisposeInvalidCmd;
+import com.zcloud.dto.AlarmDisposePageQry;
+import com.zcloud.dto.AppAlarmDisposePageQry;
+import com.zcloud.dto.AppAlarmDisposeSubmitCmd;
+import com.zcloud.dto.clientobject.AlarmDisposeCO;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AlarmDisposeServiceImpl implements AlarmDisposeServiceI {
+
+ private final AlarmDisposeAssignExe alarmDisposeAssignExe;
+ private final AlarmDisposeBatchAssignExe alarmDisposeBatchAssignExe;
+ private final AlarmDisposeInvalidExe alarmDisposeInvalidExe;
+ private final AlarmDisposeQueryExe alarmDisposeQueryExe;
+ private final AppAlarmDisposeQueryExe appAlarmDisposeQueryExe;
+ private final AppAlarmDisposeSubmitExe appAlarmDisposeSubmitExe;
+
+ @Override
+ public PageResponse assignList(AlarmDisposePageQry qry) {
+ return alarmDisposeQueryExe.execute(qry);
+ }
+
+ @Override
+ public SingleResponse assign(AlarmDisposeAssignCmd cmd) {
+ alarmDisposeAssignExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public SingleResponse batchAssign(AlarmDisposeBatchAssignCmd cmd) {
+ alarmDisposeBatchAssignExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public SingleResponse invalid(AlarmDisposeInvalidCmd cmd) {
+ alarmDisposeInvalidExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public SingleResponse info(Long id) {
+ return alarmDisposeQueryExe.getById(id);
+ }
+
+ // ==================== 手机端接口实现 ====================
+
+ @Override
+ public PageResponse appTodoList(AppAlarmDisposePageQry qry) {
+ return appAlarmDisposeQueryExe.execute(qry);
+ }
+
+ @Override
+ public SingleResponse appInfo(Long id) {
+ return appAlarmDisposeQueryExe.getById(id);
+ }
+
+ @Override
+ public SingleResponse appSubmit(AppAlarmDisposeSubmitCmd cmd) {
+ appAlarmDisposeSubmitExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/service/AlarmMessageService.java b/web-app/src/main/java/com/zcloud/service/AlarmMessageService.java
new file mode 100644
index 0000000..302de78
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/service/AlarmMessageService.java
@@ -0,0 +1,111 @@
+package com.zcloud.service;
+
+import com.jjb.saas.message.client.message.facede.MessageFacade;
+import com.jjb.saas.message.client.message.request.MessageSendCmd;
+import com.jjb.saas.message.client.message.request.MessageTargetCmd;
+import com.zcloud.domain.model.AlarmRecordE;
+import com.zcloud.gbscommon.utils.UuidUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * AlarmMessageService - 报警消息服务
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@RefreshScope
+public class AlarmMessageService {
+
+ @DubboReference
+ private MessageFacade messageFacade;
+
+ @Value("${alarm.message.template.auto-push:}")
+ private String autoPushTemplateCode;
+
+ @Value("${alarm.message.template.dispose-push:}")
+ private String disposePushTemplateCode;
+
+ /**
+ * 发送报警自动推送消息
+ * @param alarmRecord 报警记录
+ * @param managerId 区域负责人ID
+ */
+ public void sendAutoPushMessage(AlarmRecordE alarmRecord, Long managerId) {
+ if (alarmRecord == null || managerId == null) {
+ log.warn("报警自动推送消息参数不完整,跳过发送");
+ return;
+ }
+
+ try {
+ MessageSendCmd messageSendCmd = new MessageSendCmd();
+ messageSendCmd.setBusinessId(UuidUtil.get32UUID());
+
+ MessageTargetCmd messageTargetCmd = new MessageTargetCmd();
+ messageTargetCmd.setUserId(managerId);
+ messageSendCmd.setTargetCmd(messageTargetCmd);
+
+ messageSendCmd.setSourceCode(autoPushTemplateCode);
+ messageSendCmd.setNeedTokenEnum(false);
+
+ Map params = new HashMap<>();
+ params.put("deviceSourceDesc", alarmRecord.getDeviceSourceDesc());
+ params.put("alarmLevel", alarmRecord.getAlarmLevel());
+ params.put("alarmTime", alarmRecord.getAlarmTime());
+ params.put("alarmDesc", alarmRecord.getAlarmDesc());
+ messageSendCmd.setParams(params);
+
+ messageFacade.send(messageSendCmd);
+ log.info("报警自动推送消息发送成功,报警ID: {}, 接收人ID: {}", alarmRecord.getId(), managerId);
+ } catch (Exception e) {
+ log.error("报警自动推送消息发送失败,报警ID: {}, 接收人ID: {}, 错误: {}",
+ alarmRecord.getId(), managerId, e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 发送报警处置推送消息
+ * @param alarmRecord 报警记录
+ * @param disposeUserId 处置人ID
+ */
+ public void sendDisposePushMessage(AlarmRecordE alarmRecord, Long disposeUserId) {
+ if (alarmRecord == null || disposeUserId == null) {
+ log.warn("报警处置推送消息参数不完整,跳过发送");
+ return;
+ }
+
+ try {
+ MessageSendCmd messageSendCmd = new MessageSendCmd();
+ messageSendCmd.setBusinessId(UuidUtil.get32UUID());
+
+ MessageTargetCmd messageTargetCmd = new MessageTargetCmd();
+ messageTargetCmd.setUserId(disposeUserId);
+ messageSendCmd.setTargetCmd(messageTargetCmd);
+
+ messageSendCmd.setSourceCode(disposePushTemplateCode);
+ messageSendCmd.setNeedTokenEnum(false);
+
+ Map params = new HashMap<>();
+ params.put("deviceSourceDesc", alarmRecord.getDeviceSourceDesc());
+ params.put("alarmLevel", alarmRecord.getAlarmLevel());
+ params.put("assignTime", alarmRecord.getAssignTime());
+ params.put("disposeRemark", alarmRecord.getDisposeRemark());
+ messageSendCmd.setParams(params);
+
+ messageFacade.send(messageSendCmd);
+ log.info("报警处置推送消息发送成功,报警ID: {}, 接收人ID: {}", alarmRecord.getId(), disposeUserId);
+ } catch (Exception e) {
+ log.error("报警处置推送消息发送失败,报警ID: {}, 接收人ID: {}, 错误: {}",
+ alarmRecord.getId(), disposeUserId, e.getMessage(), e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/service/AlarmRecordServiceImpl.java b/web-app/src/main/java/com/zcloud/service/AlarmRecordServiceImpl.java
new file mode 100644
index 0000000..654f280
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/service/AlarmRecordServiceImpl.java
@@ -0,0 +1,40 @@
+package com.zcloud.service;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.api.AlarmRecordServiceI;
+import com.zcloud.command.query.AlarmRecordQueryExe;
+import com.zcloud.command.query.AppAlarmRecordQueryExe;
+import com.zcloud.dto.AlarmRecordPageQry;
+import com.zcloud.dto.AppAlarmRecordPageQry;
+import com.zcloud.dto.clientobject.AlarmRecordCO;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AlarmRecordServiceImpl implements AlarmRecordServiceI {
+
+ private final AlarmRecordQueryExe alarmRecordQueryExe;
+ private final AppAlarmRecordQueryExe appAlarmRecordQueryExe;
+
+ @Override
+ public PageResponse list(AlarmRecordPageQry qry) {
+ return alarmRecordQueryExe.execute(qry);
+ }
+
+ @Override
+ public SingleResponse info(Long id) {
+ return alarmRecordQueryExe.getById(id);
+ }
+
+ @Override
+ public PageResponse appList(AppAlarmRecordPageQry qry) {
+ return appAlarmRecordQueryExe.execute(qry);
+ }
+
+ @Override
+ public SingleResponse appInfo(Long id) {
+ return appAlarmRecordQueryExe.getById(id);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/service/AlarmTodoService.java b/web-app/src/main/java/com/zcloud/service/AlarmTodoService.java
new file mode 100644
index 0000000..26b1205
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/service/AlarmTodoService.java
@@ -0,0 +1,124 @@
+package com.zcloud.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zcloud.domain.model.AlarmRecordE;
+import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil;
+import com.zcloud.gbscommon.todolistmq.event.TodoListAddEvent;
+import com.zcloud.gbscommon.todolistmq.event.TodoListDeleteEvent;
+import com.zcloud.gbscommon.todolistmq.event.TodoListCompleteEvent;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Service;
+
+/**
+ * AlarmTodoService - 报警待办服务
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@RefreshScope
+public class AlarmTodoService {
+
+ private final TodoListEventPusherUtil todoListEventPusherUtil;
+
+ /**
+ * 新增负责人待办(PC端)
+ * @param alarmRecord 报警记录
+ * @param managerId 负责人ID
+ */
+ public void addManagerTodo(AlarmRecordE alarmRecord, Long managerId) {
+ if (alarmRecord == null || managerId == null) {
+ log.warn("新增负责人待办参数不完整,跳过发送");
+ return;
+ }
+
+ try {
+ TodoListAddEvent event = new TodoListAddEvent();
+ event.setTitle("您有一条【IoT报警】待研判");
+ event.setContent("设备来源:" + alarmRecord.getDeviceSourceDesc());
+ event.setForeignKey(alarmRecord.getId()); // 报警主表ID
+ event.setForeignSubsidiaryKey(alarmRecord.getId()); // 没有附表时为alarmId
+ event.setReceiveUser(managerId);
+ event.setPcFlag(1); // PC端待办
+ event.setAppFlag(0); // APP端待办
+ event.setOtherParams(new JSONObject());
+
+ todoListEventPusherUtil.sendMessageAddEvent(event);
+ log.info("负责人待办发送成功,报警ID: {}, 负责人ID: {}", alarmRecord.getId(), managerId);
+ } catch (Exception e) {
+ log.error("负责人待办发送失败,报警ID: {}, 负责人ID: {}, 错误: {}",
+ alarmRecord.getId(), managerId, e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 新增处置人待办(APP端)
+ * @param alarmRecord 报警记录
+ * @param disposeUserId 处置人ID
+ */
+ public void addDisposeTodo(AlarmRecordE alarmRecord, Long disposeUserId) {
+ if (alarmRecord == null || disposeUserId == null) {
+ log.warn("新增处置人待办参数不完整,跳过发送");
+ return;
+ }
+
+ try {
+ TodoListAddEvent event = new TodoListAddEvent();
+ event.setTitle("您有一条【IoT报警】待处置");
+ event.setContent("设备来源:" + alarmRecord.getDeviceSourceDesc());
+ event.setForeignKey(alarmRecord.getId()); // 报警主表ID
+ event.setForeignSubsidiaryKey(alarmRecord.getId()); // 没有附表时为alarmId
+ event.setReceiveUser(disposeUserId);
+ event.setPcFlag(0); // PC端待办
+ event.setAppFlag(1); // APP端待办
+ event.setOtherParams(new JSONObject());
+
+ todoListEventPusherUtil.sendMessageAddEvent(event);
+ log.info("处置人待办发送成功,报警ID: {}, 处置人ID: {}", alarmRecord.getId(), disposeUserId);
+ } catch (Exception e) {
+ log.error("处置人待办发送失败,报警ID: {}, 处置人ID: {}, 错误: {}",
+ alarmRecord.getId(), disposeUserId, e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 完成待办
+ * @param alarmId 报警主表ID
+ */
+ public void completeTodo(Long alarmId) {
+ if (alarmId == null) {
+ log.warn("完成待办参数不完整,跳过发送");
+ return;
+ }
+
+ try {
+ TodoListCompleteEvent event = new TodoListCompleteEvent(alarmId, String.valueOf(alarmId));
+ todoListEventPusherUtil.sendMessageCompleteEvent(event);
+ log.info("待办完成发送成功,报警ID: {}", alarmId);
+ } catch (Exception e) {
+ log.error("待办完成发送失败,报警ID: {}, 错误: {}", alarmId, e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 删除待办
+ * @param alarmId 报警主表ID
+ */
+ public void deleteTodo(Long alarmId) {
+ if (alarmId == null) {
+ log.warn("删除待办参数不完整,跳过发送");
+ return;
+ }
+
+ try {
+ TodoListDeleteEvent event = new TodoListDeleteEvent(alarmId, alarmId);
+ todoListEventPusherUtil.sendMessageDeleteEvent(event);
+ log.info("待办删除发送成功,报警ID: {}", alarmId);
+ } catch (Exception e) {
+ log.error("待办删除发送失败,报警ID: {}, 错误: {}", alarmId, e.getMessage(), e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/service/DeviceRegionServiceImpl.java b/web-app/src/main/java/com/zcloud/service/DeviceRegionServiceImpl.java
new file mode 100644
index 0000000..695bfc8
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/service/DeviceRegionServiceImpl.java
@@ -0,0 +1,83 @@
+package com.zcloud.service;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.api.DeviceRegionServiceI;
+import com.zcloud.command.DeviceRegionAddExe;
+import com.zcloud.command.DeviceRegionUpdateExe;
+import com.zcloud.command.DeviceRegionRemoveExe;
+import com.zcloud.command.BindSensorExe;
+import com.zcloud.command.UnbindSensorExe;
+import com.zcloud.command.ManagerExe;
+import com.zcloud.command.query.DeviceRegionQueryExe;
+import com.zcloud.dto.DeviceRegionAddCmd;
+import com.zcloud.dto.DeviceRegionPageQry;
+import com.zcloud.dto.BindSensorCmd;
+import com.zcloud.dto.UnbindSensorCmd;
+import com.zcloud.dto.ManagerCmd;
+import com.zcloud.dto.clientobject.DeviceRegionCO;
+import com.zcloud.dto.clientobject.FireRegionCO;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class DeviceRegionServiceImpl implements DeviceRegionServiceI {
+
+ private final DeviceRegionAddExe deviceRegionAddExe;
+ private final DeviceRegionUpdateExe deviceRegionUpdateExe;
+ private final DeviceRegionQueryExe deviceRegionQueryExe;
+ private final DeviceRegionRemoveExe deviceRegionRemoveExe;
+ private final BindSensorExe bindSensorExe;
+ private final UnbindSensorExe unbindSensorExe;
+ private final ManagerExe managerExe;
+
+ @Override
+ public PageResponse listPage(DeviceRegionPageQry qry) {
+ return deviceRegionQueryExe.execute(qry);
+ }
+
+ @Override
+ public SingleResponse saveOrUpdate(DeviceRegionAddCmd cmd) {
+ // 判断是新增还是修改
+ if (cmd.getId() != null) {
+ deviceRegionUpdateExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ } else {
+ return deviceRegionAddExe.execute(cmd);
+ }
+ }
+
+ @Override
+ public SingleResponse bindSensor(BindSensorCmd cmd) {
+ bindSensorExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public SingleResponse unbindSensor(UnbindSensorCmd cmd) {
+ unbindSensorExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public SingleResponse manager(ManagerCmd cmd) {
+ managerExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public SingleResponse fireRegionList(Long tenantId) {
+ return deviceRegionQueryExe.fireRegionList(tenantId);
+ }
+
+ @Override
+ public void remove(Long id) {
+ deviceRegionRemoveExe.execute(id);
+ }
+
+ @Override
+ public SingleResponse info(Long id) {
+ return deviceRegionQueryExe.getById(id);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/service/RiskPointServiceImpl.java b/web-app/src/main/java/com/zcloud/service/RiskPointServiceImpl.java
deleted file mode 100644
index 845fc26..0000000
--- a/web-app/src/main/java/com/zcloud/service/RiskPointServiceImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.zcloud.service;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.alibaba.cola.dto.SingleResponse;
-import com.zcloud.api.RiskPointServiceI;
-import com.zcloud.command.RiskPointAddExe;
-import com.zcloud.command.RiskPointRemoveExe;
-import com.zcloud.command.RiskPointUpdateExe;
-import com.zcloud.command.query.RiskPointQueryExe;
-import com.zcloud.dto.RiskPointAddCmd;
-import com.zcloud.dto.RiskPointPageQry;
-import com.zcloud.dto.RiskPointUpdateCmd;
-import com.zcloud.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/main/java/com/zcloud/service/SensorDeviceServiceImpl.java b/web-app/src/main/java/com/zcloud/service/SensorDeviceServiceImpl.java
new file mode 100644
index 0000000..4adf904
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/service/SensorDeviceServiceImpl.java
@@ -0,0 +1,66 @@
+package com.zcloud.service;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.api.SensorDeviceServiceI;
+import com.zcloud.command.SensorDeviceRemoveExe;
+import com.zcloud.command.SensorDeviceStatusExe;
+import com.zcloud.command.SensorDeviceThresholdExe;
+import com.zcloud.command.SensorDeviceUpdateExe;
+import com.zcloud.command.query.SensorDeviceQueryExe;
+import com.zcloud.command.SensorDeviceAddExe;
+import com.zcloud.dto.SensorDeviceAddCmd;
+import com.zcloud.dto.SensorDevicePageQry;
+import com.zcloud.dto.SensorDeviceThresholdCmd;
+import com.zcloud.dto.SensorDeviceUpdateCmd;
+import com.zcloud.dto.clientobject.SensorDeviceCO;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class SensorDeviceServiceImpl implements SensorDeviceServiceI {
+
+ private final SensorDeviceAddExe sensorDeviceAddExe;
+ private final SensorDeviceUpdateExe sensorDeviceUpdateExe;
+ private final SensorDeviceQueryExe sensorDeviceQueryExe;
+ private final SensorDeviceRemoveExe sensorDeviceRemoveExe;
+ private final SensorDeviceStatusExe sensorDeviceStatusExe;
+ private final SensorDeviceThresholdExe sensorDeviceThresholdExe;
+
+ @Override
+ public PageResponse listPage(SensorDevicePageQry qry) {
+ return sensorDeviceQueryExe.execute(qry);
+ }
+
+ @Override
+ public SingleResponse add(SensorDeviceAddCmd cmd) {
+ sensorDeviceAddExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public void edit(SensorDeviceUpdateCmd cmd) {
+ sensorDeviceUpdateExe.execute(cmd);
+ }
+
+ @Override
+ public void updateStatus(Long id, String status) {
+ sensorDeviceStatusExe.execute(id, status);
+ }
+
+ @Override
+ public void updateThreshold(SensorDeviceThresholdCmd cmd) {
+ sensorDeviceThresholdExe.execute(cmd);
+ }
+
+ @Override
+ public void remove(Long id) {
+ sensorDeviceRemoveExe.execute(id);
+ }
+
+ @Override
+ public SingleResponse info(Long id) {
+ return sensorDeviceQueryExe.getById(id);
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/main/java/com/zcloud/service/SensorTypeServiceImpl.java b/web-app/src/main/java/com/zcloud/service/SensorTypeServiceImpl.java
new file mode 100644
index 0000000..28d2441
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/service/SensorTypeServiceImpl.java
@@ -0,0 +1,51 @@
+package com.zcloud.service;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.api.SensorTypeServiceI;
+import com.zcloud.command.SensorTypeRemoveExe;
+import com.zcloud.command.SensorTypeUpdateExe;
+import com.zcloud.command.query.SensorTypeQueryExe;
+import com.zcloud.command.SensorTypeAddExe;
+import com.zcloud.dto.SensorTypeAddCmd;
+import com.zcloud.dto.SensorTypePageQry;
+import com.zcloud.dto.SensorTypeUpdateCmd;
+import com.zcloud.dto.clientobject.SensorTypeCO;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class SensorTypeServiceImpl implements SensorTypeServiceI {
+
+ private final SensorTypeAddExe sensorTypeAddExe;
+ private final SensorTypeUpdateExe sensorTypeUpdateExe;
+ private final SensorTypeQueryExe sensorTypeQueryExe;
+ private final SensorTypeRemoveExe sensorTypeRemoveExe;
+
+ @Override
+ public PageResponse listPage(SensorTypePageQry qry) {
+ return sensorTypeQueryExe.execute(qry);
+ }
+
+ @Override
+ public SingleResponse add(SensorTypeAddCmd cmd) {
+ sensorTypeAddExe.execute(cmd);
+ return SingleResponse.buildSuccess();
+ }
+
+ @Override
+ public void edit(SensorTypeUpdateCmd cmd) {
+ sensorTypeUpdateExe.execute(cmd);
+ }
+
+ @Override
+ public void remove(Long id) {
+ sensorTypeRemoveExe.execute(id);
+ }
+
+ @Override
+ public SingleResponse info(Long id) {
+ return sensorTypeQueryExe.getById(id);
+ }
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/api/AlarmDisposeServiceI.java b/web-client/src/main/java/com/zcloud/api/AlarmDisposeServiceI.java
new file mode 100644
index 0000000..abb13ff
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/api/AlarmDisposeServiceI.java
@@ -0,0 +1,77 @@
+package com.zcloud.api;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.dto.AlarmDisposeAssignCmd;
+import com.zcloud.dto.AlarmDisposeBatchAssignCmd;
+import com.zcloud.dto.AlarmDisposeInvalidCmd;
+import com.zcloud.dto.AlarmDisposePageQry;
+import com.zcloud.dto.AppAlarmDisposePageQry;
+import com.zcloud.dto.AppAlarmDisposeSubmitCmd;
+import com.zcloud.dto.clientobject.AlarmDisposeCO;
+
+/**
+ * AlarmDisposeServiceI - 报警处置服务接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface AlarmDisposeServiceI {
+
+ /**
+ * 待处置列表查询
+ * @param qry
+ * @return
+ */
+ PageResponse assignList(AlarmDisposePageQry qry);
+
+ /**
+ * 单条处置分配
+ * @param cmd
+ * @return
+ */
+ SingleResponse assign(AlarmDisposeAssignCmd cmd);
+
+ /**
+ * 批量处置分配
+ * @param cmd
+ * @return
+ */
+ SingleResponse batchAssign(AlarmDisposeBatchAssignCmd cmd);
+
+ /**
+ * 无效报警处理
+ * @param cmd
+ * @return
+ */
+ SingleResponse invalid(AlarmDisposeInvalidCmd cmd);
+
+ /**
+ * 报警详情
+ * @param id
+ * @return
+ */
+ SingleResponse info(Long id);
+
+ // ==================== 手机端接口 ====================
+
+ /**
+ * 手机端待处置列表(按当前用户过滤)
+ * @param qry
+ * @return
+ */
+ PageResponse appTodoList(AppAlarmDisposePageQry qry);
+
+ /**
+ * 手机端报警详情
+ * @param id
+ * @return
+ */
+ SingleResponse appInfo(Long id);
+
+ /**
+ * 手机端提交处置结果
+ * @param cmd
+ * @return
+ */
+ SingleResponse appSubmit(AppAlarmDisposeSubmitCmd cmd);
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/api/AlarmRecordServiceI.java b/web-client/src/main/java/com/zcloud/api/AlarmRecordServiceI.java
new file mode 100644
index 0000000..42d8052
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/api/AlarmRecordServiceI.java
@@ -0,0 +1,43 @@
+package com.zcloud.api;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.dto.AlarmRecordPageQry;
+import com.zcloud.dto.AppAlarmRecordPageQry;
+import com.zcloud.dto.clientobject.AlarmRecordCO;
+
+/**
+ * AlarmRecordServiceI - 报警记录服务接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface AlarmRecordServiceI {
+
+ /**
+ * 报警记录列表查询
+ * @param qry
+ * @return
+ */
+ PageResponse list(AlarmRecordPageQry qry);
+
+ /**
+ * 报警详情
+ * @param id
+ * @return
+ */
+ SingleResponse info(Long id);
+
+ /**
+ * 手机端报警记录列表查询(按当前用户过滤)
+ * @param qry
+ * @return
+ */
+ PageResponse appList(AppAlarmRecordPageQry qry);
+
+ /**
+ * 手机端报警详情
+ * @param id
+ * @return
+ */
+ SingleResponse appInfo(Long id);
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/api/DeviceRegionServiceI.java b/web-client/src/main/java/com/zcloud/api/DeviceRegionServiceI.java
new file mode 100644
index 0000000..a500f48
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/api/DeviceRegionServiceI.java
@@ -0,0 +1,75 @@
+package com.zcloud.api;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.dto.DeviceRegionAddCmd;
+import com.zcloud.dto.DeviceRegionUpdateCmd;
+import com.zcloud.dto.DeviceRegionPageQry;
+import com.zcloud.dto.BindSensorCmd;
+import com.zcloud.dto.UnbindSensorCmd;
+import com.zcloud.dto.ManagerCmd;
+import com.zcloud.dto.clientobject.DeviceRegionCO;
+import com.zcloud.dto.clientobject.FireRegionCO;
+
+/**
+ * DeviceRegionServiceI - 设备区域服务接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface DeviceRegionServiceI {
+
+ /**
+ * 分页列表
+ * @param qry
+ * @return
+ */
+ PageResponse listPage(DeviceRegionPageQry qry);
+
+ /**
+ * 新增或修改
+ * @param cmd
+ * @return
+ */
+ SingleResponse saveOrUpdate(DeviceRegionAddCmd cmd);
+
+ /**
+ * 绑定传感器
+ * @param cmd
+ * @return
+ */
+ SingleResponse bindSensor(BindSensorCmd cmd);
+
+ /**
+ * 解绑传感器
+ * @param cmd
+ * @return
+ */
+ SingleResponse unbindSensor(UnbindSensorCmd cmd);
+
+ /**
+ * 负责人配置
+ * @param cmd
+ * @return
+ */
+ SingleResponse manager(ManagerCmd cmd);
+
+ /**
+ * 消防区域列表(连表查询)
+ * @param tenantId
+ * @return
+ */
+ SingleResponse fireRegionList(Long tenantId);
+
+ /**
+ * 删除
+ * @param id
+ */
+ void remove(Long id);
+
+ /**
+ * 详情
+ * @param id
+ * @return
+ */
+ SingleResponse info(Long id);
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/api/RiskPointServiceI.java b/web-client/src/main/java/com/zcloud/api/RiskPointServiceI.java
deleted file mode 100644
index 9ef67c9..0000000
--- a/web-client/src/main/java/com/zcloud/api/RiskPointServiceI.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.zcloud.api;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.alibaba.cola.dto.SingleResponse;
-import com.zcloud.dto.RiskPointAddCmd;
-import com.zcloud.dto.RiskPointPageQry;
-import com.zcloud.dto.RiskPointUpdateCmd;
-import com.zcloud.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/api/SensorDeviceServiceI.java b/web-client/src/main/java/com/zcloud/api/SensorDeviceServiceI.java
new file mode 100644
index 0000000..8ee8f8a
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/api/SensorDeviceServiceI.java
@@ -0,0 +1,63 @@
+package com.zcloud.api;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.dto.SensorDeviceAddCmd;
+import com.zcloud.dto.SensorDevicePageQry;
+import com.zcloud.dto.SensorDeviceUpdateCmd;
+import com.zcloud.dto.SensorDeviceThresholdCmd;
+import com.zcloud.dto.clientobject.SensorDeviceCO;
+
+/**
+ * SensorDeviceServiceI - 传感器设备服务接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface SensorDeviceServiceI {
+
+ /**
+ * 分页列表
+ * @param qry
+ * @return
+ */
+ PageResponse listPage(SensorDevicePageQry qry);
+
+ /**
+ * 新增
+ * @param cmd
+ * @return
+ */
+ SingleResponse add(SensorDeviceAddCmd cmd);
+
+ /**
+ * 修改
+ * @param cmd
+ */
+ void edit(SensorDeviceUpdateCmd cmd);
+
+ /**
+ * 状态切换
+ * @param id
+ * @param status
+ */
+ void updateStatus(Long id, String status);
+
+ /**
+ * 阈值配置
+ * @param cmd
+ */
+ void updateThreshold(SensorDeviceThresholdCmd cmd);
+
+ /**
+ * 删除
+ * @param id
+ */
+ void remove(Long id);
+
+ /**
+ * 详情
+ * @param id
+ * @return
+ */
+ SingleResponse info(Long id);
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/api/SensorTypeServiceI.java b/web-client/src/main/java/com/zcloud/api/SensorTypeServiceI.java
new file mode 100644
index 0000000..13cd773
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/api/SensorTypeServiceI.java
@@ -0,0 +1,49 @@
+package com.zcloud.api;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.dto.SensorTypeAddCmd;
+import com.zcloud.dto.SensorTypePageQry;
+import com.zcloud.dto.SensorTypeUpdateCmd;
+import com.zcloud.dto.clientobject.SensorTypeCO;
+
+/**
+ * SensorTypeServiceI - 传感器类型服务接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface SensorTypeServiceI {
+
+ /**
+ * 分页列表
+ * @param qry
+ * @return
+ */
+ PageResponse listPage(SensorTypePageQry qry);
+
+ /**
+ * 新增
+ * @param cmd
+ * @return
+ */
+ SingleResponse add(SensorTypeAddCmd cmd);
+
+ /**
+ * 修改
+ * @param cmd
+ */
+ void edit(SensorTypeUpdateCmd cmd);
+
+ /**
+ * 删除
+ * @param id
+ */
+ void remove(Long id);
+
+ /**
+ * 详情
+ * @param id
+ * @return
+ */
+ SingleResponse info(Long id);
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AlarmDisposeAssignCmd.java b/web-client/src/main/java/com/zcloud/dto/AlarmDisposeAssignCmd.java
new file mode 100644
index 0000000..bdeeb2e
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AlarmDisposeAssignCmd.java
@@ -0,0 +1,38 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * AlarmDisposeAssignCmd - 报警处置命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AlarmDisposeAssignCmd extends Command {
+
+ @ApiModelProperty(value = "报警主键ID", name = "id", required = true)
+ private Long id;
+
+ @ApiModelProperty(value = "处置人ID", name = "disposeUserId", required = true)
+ private Long disposeUserId;
+
+ @ApiModelProperty(value = "报警级别", name = "alarmLevel")
+ private String alarmLevel;
+
+ @ApiModelProperty(value = "报警类型", name = "alarmType")
+ private String alarmType;
+
+ @ApiModelProperty(value = "租户ID", name = "tenantId")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID", name = "orgId")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AlarmDisposeBatchAssignCmd.java b/web-client/src/main/java/com/zcloud/dto/AlarmDisposeBatchAssignCmd.java
new file mode 100644
index 0000000..d0da928
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AlarmDisposeBatchAssignCmd.java
@@ -0,0 +1,34 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.util.List;
+
+/**
+ * AlarmDisposeBatchAssignCmd - 报警处置命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AlarmDisposeBatchAssignCmd extends Command {
+
+ @ApiModelProperty(value = "报警主键ID列表", name = "ids", required = true)
+ private List ids;
+
+ @ApiModelProperty(value = "处置人ID", name = "disposeUserId", required = true)
+ private Long disposeUserId;
+
+ @ApiModelProperty(value = "租户ID", name = "tenantId")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID", name = "orgId")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AlarmDisposeInvalidCmd.java b/web-client/src/main/java/com/zcloud/dto/AlarmDisposeInvalidCmd.java
new file mode 100644
index 0000000..ef35112
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AlarmDisposeInvalidCmd.java
@@ -0,0 +1,32 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * AlarmDisposeInvalidCmd - 报警处置命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AlarmDisposeInvalidCmd extends Command {
+
+ @ApiModelProperty(value = "报警主键ID", name = "id", required = true)
+ private Long id;
+
+ @ApiModelProperty(value = "无效原因", name = "invalidReason")
+ private String invalidReason;
+
+ @ApiModelProperty(value = "租户ID", name = "tenantId")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID", name = "orgId")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AlarmDisposePageQry.java b/web-client/src/main/java/com/zcloud/dto/AlarmDisposePageQry.java
new file mode 100644
index 0000000..3fc0846
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AlarmDisposePageQry.java
@@ -0,0 +1,50 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * AlarmDisposePageQry - 报警处置查询
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class AlarmDisposePageQry extends PageQuery {
+
+ @ApiModelProperty(value = "报警编号")
+ private String alarmNo;
+
+ @ApiModelProperty(value = "报警来源")
+ private String alarmSource;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "消防区域ID")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "处置人ID")
+ private Long disposeUserId;
+
+ @ApiModelProperty(value = "报警级别")
+ private String alarmLevel;
+
+ @ApiModelProperty(value = "报警类型")
+ private String alarmType;
+
+ @ApiModelProperty(value = "报警时间开始")
+ private String alarmTimeStart;
+
+ @ApiModelProperty(value = "报警时间结束")
+ private String alarmTimeEnd;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AlarmRecordPageQry.java b/web-client/src/main/java/com/zcloud/dto/AlarmRecordPageQry.java
new file mode 100644
index 0000000..feccbdd
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AlarmRecordPageQry.java
@@ -0,0 +1,38 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * AlarmRecordPageQry - 报警记录查询
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class AlarmRecordPageQry extends PageQuery {
+
+ @ApiModelProperty(value = "报警编号")
+ private String alarmNo;
+
+ @ApiModelProperty(value = "报警来源 THRESHOLD/DCS")
+ private String alarmSource;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "当前状态 10待研判/20待处置/30已消警/40误报")
+ private Integer status;
+
+ @ApiModelProperty(value = "报警时间开始")
+ private String alarmTimeStart;
+
+ @ApiModelProperty(value = "报警时间结束")
+ private String alarmTimeEnd;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AppAlarmDisposePageQry.java b/web-client/src/main/java/com/zcloud/dto/AppAlarmDisposePageQry.java
new file mode 100644
index 0000000..5ec2bea
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AppAlarmDisposePageQry.java
@@ -0,0 +1,47 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * AppAlarmDisposePageQry - APP报警处置查询
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class AppAlarmDisposePageQry extends PageQuery {
+
+ @ApiModelProperty(value = "报警编号")
+ private String alarmNo;
+
+ @ApiModelProperty(value = "报警来源")
+ private String alarmSource;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "消防区域ID")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "报警级别")
+ private String alarmLevel;
+
+ @ApiModelProperty(value = "报警类型")
+ private String alarmType;
+
+ @ApiModelProperty(value = "报警时间开始")
+ private String alarmTimeStart;
+
+ @ApiModelProperty(value = "报警时间结束")
+ private String alarmTimeEnd;
+
+ @ApiModelProperty(value = "当前用户ID(手机端自动填充)")
+ private Long currentUserId;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AppAlarmDisposeSubmitCmd.java b/web-client/src/main/java/com/zcloud/dto/AppAlarmDisposeSubmitCmd.java
new file mode 100644
index 0000000..41c37f8
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AppAlarmDisposeSubmitCmd.java
@@ -0,0 +1,38 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * AppAlarmDisposeSubmitCmd - APP报警处置命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AppAlarmDisposeSubmitCmd extends Command {
+
+ @ApiModelProperty(value = "报警ID", name = "alarmId", required = true)
+ private Long alarmId;
+
+ @ApiModelProperty(value = "处置结果(已消警/误报)", name = "disposeResult", required = true)
+ private String disposeResult;
+
+ @ApiModelProperty(value = "处置说明", name = "disposeRemark")
+ private String disposeRemark;
+
+ @ApiModelProperty(value = "图片地址(多个URL用逗号分隔)", name = "pictureUrls")
+ private String pictureUrls;
+
+ @ApiModelProperty(value = "租户ID", name = "tenantId")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID", name = "orgId")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/AppAlarmRecordPageQry.java b/web-client/src/main/java/com/zcloud/dto/AppAlarmRecordPageQry.java
new file mode 100644
index 0000000..05b75c4
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/AppAlarmRecordPageQry.java
@@ -0,0 +1,23 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * AppAlarmRecordPageQry - APP报警记录查询
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class AppAlarmRecordPageQry extends PageQuery {
+
+ @ApiModelProperty(value = "当前状态 30已消警/40误报")
+ private Integer status;
+
+ @ApiModelProperty(value = "报警时间开始")
+ private String alarmTimeStart;
+
+ @ApiModelProperty(value = "报警时间结束")
+ private String alarmTimeEnd;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/BindSensorCmd.java b/web-client/src/main/java/com/zcloud/dto/BindSensorCmd.java
new file mode 100644
index 0000000..a3fe438
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/BindSensorCmd.java
@@ -0,0 +1,38 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * BindSensorCmd - 绑定传感器命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class BindSensorCmd extends Command {
+
+ @ApiModelProperty(value = "区域配置主键ID", name = "regionConfigId", required = true)
+ private Long regionConfigId;
+
+ @ApiModelProperty(value = "外部消防区域ID", name = "fireRegionId")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "传感器ID", name = "sensorId", required = true)
+ private Long sensorId;
+
+ @ApiModelProperty(value = "传感器编码快照", name = "sensorCode")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "租户ID", name = "tenantId")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID", name = "orgId")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/DeviceRegionAddCmd.java b/web-client/src/main/java/com/zcloud/dto/DeviceRegionAddCmd.java
new file mode 100644
index 0000000..b2bec5d
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/DeviceRegionAddCmd.java
@@ -0,0 +1,47 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * DeviceRegionAddCmd - 设备区域命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class DeviceRegionAddCmd extends Command {
+
+ @ApiModelProperty(value = "主键ID(修改时必填)", name = "id")
+ private Long id;
+
+ @ApiModelProperty(value = "外部消防区域主键", name = "fireRegionId", required = true)
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "外部消防区域编码", name = "fireRegionCode")
+ private String fireRegionCode;
+
+ @ApiModelProperty(value = "负责部门ID", name = "departmentId")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "负责人ID", name = "managerId")
+ private Long managerId;
+
+ @ApiModelProperty(value = "状态 1启用0停用", name = "status")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注", name = "remarks")
+ private String remarks;
+
+ @ApiModelProperty(value = "租户ID", name = "tenantId")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID", name = "orgId")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/DeviceRegionPageQry.java b/web-client/src/main/java/com/zcloud/dto/DeviceRegionPageQry.java
new file mode 100644
index 0000000..a7dc071
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/DeviceRegionPageQry.java
@@ -0,0 +1,32 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * DeviceRegionPageQry - 设备区域查询
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class DeviceRegionPageQry extends PageQuery {
+
+ @ApiModelProperty(value = "消防区域编码")
+ private String fireRegionCode;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "负责人ID")
+ private Long managerId;
+
+ @ApiModelProperty(value = "状态 1启用0停用")
+ private Integer status;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/DeviceRegionUpdateCmd.java b/web-client/src/main/java/com/zcloud/dto/DeviceRegionUpdateCmd.java
new file mode 100644
index 0000000..2387ea7
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/DeviceRegionUpdateCmd.java
@@ -0,0 +1,38 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * DeviceRegionUpdateCmd - 设备区域命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class DeviceRegionUpdateCmd extends Command {
+
+ @ApiModelProperty(value = "主键ID", name = "id", required = true)
+ private Long id;
+
+ @ApiModelProperty(value = "外部消防区域编码", name = "fireRegionCode")
+ private String fireRegionCode;
+
+ @ApiModelProperty(value = "负责部门ID", name = "departmentId")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "负责人ID", name = "managerId")
+ private Long managerId;
+
+ @ApiModelProperty(value = "状态 1启用0停用", name = "status")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注", name = "remarks")
+ private String remarks;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/ManagerCmd.java b/web-client/src/main/java/com/zcloud/dto/ManagerCmd.java
new file mode 100644
index 0000000..54de9bc
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/ManagerCmd.java
@@ -0,0 +1,29 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * ManagerCmd - 管理员命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class ManagerCmd extends Command {
+
+ @ApiModelProperty(value = "区域配置主键ID", name = "id", required = true)
+ private Long id;
+
+ @ApiModelProperty(value = "负责人ID", name = "managerId", required = true)
+ private Long managerId;
+
+ @ApiModelProperty(value = "负责部门ID", name = "departmentId")
+ private Long departmentId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/RiskPointAddCmd.java b/web-client/src/main/java/com/zcloud/dto/RiskPointAddCmd.java
deleted file mode 100644
index 64bf449..0000000
--- a/web-client/src/main/java/com/zcloud/dto/RiskPointAddCmd.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.zcloud.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/dto/RiskPointPageQry.java b/web-client/src/main/java/com/zcloud/dto/RiskPointPageQry.java
deleted file mode 100644
index 72b9880..0000000
--- a/web-client/src/main/java/com/zcloud/dto/RiskPointPageQry.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.zcloud.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/dto/RiskPointUpdateCmd.java b/web-client/src/main/java/com/zcloud/dto/RiskPointUpdateCmd.java
deleted file mode 100644
index e599c00..0000000
--- a/web-client/src/main/java/com/zcloud/dto/RiskPointUpdateCmd.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.zcloud.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/dto/SensorDeviceAddCmd.java b/web-client/src/main/java/com/zcloud/dto/SensorDeviceAddCmd.java
new file mode 100644
index 0000000..1c30d50
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/SensorDeviceAddCmd.java
@@ -0,0 +1,80 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * SensorDeviceAddCmd - 传感器设备命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SensorDeviceAddCmd extends Command {
+
+ @ApiModelProperty(value = "传感器编码", name = "sensorCode", required = true)
+ private String sensorCode;
+
+ @ApiModelProperty(value = "传感器名称", name = "sensorName", required = true)
+ private String sensorName;
+
+ @ApiModelProperty(value = "传感器类型主键ID", name = "sensorTypeId", required = true)
+ private Long sensorTypeId;
+
+ @ApiModelProperty(value = "传感器属性快照(NUMBER/SWITCH)", name = "sensorAttr", required = true)
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "安装位置", name = "installPosition")
+ private String installPosition;
+
+ @ApiModelProperty(value = "传感器状态", name = "sensorStatus")
+ private String sensorStatus;
+
+ @ApiModelProperty(value = "是否定位(0否1是)", name = "positioningFlag")
+ private Integer positioningFlag;
+
+ @ApiModelProperty(value = "报警开关(1开0关)", name = "alarmSwitch")
+ private Integer alarmSwitch;
+
+ @ApiModelProperty(value = "是否阈值设定(0否1是)", name = "thresholdFlag")
+ private Integer thresholdFlag;
+
+ @ApiModelProperty(value = "单位", name = "unitName")
+ private String unitName;
+
+ @ApiModelProperty(value = "量程下限", name = "rangeMin")
+ private String rangeMin;
+
+ @ApiModelProperty(value = "量程上限", name = "rangeMax")
+ private String rangeMax;
+
+ @ApiModelProperty(value = "低低报阈值", name = "thresholdLowLow")
+ private String thresholdLowLow;
+
+ @ApiModelProperty(value = "低报阈值", name = "thresholdLow")
+ private String thresholdLow;
+
+ @ApiModelProperty(value = "高报阈值", name = "thresholdHigh")
+ private String thresholdHigh;
+
+ @ApiModelProperty(value = "高高报阈值", name = "thresholdHighHigh")
+ private String thresholdHighHigh;
+
+ @ApiModelProperty(value = "连续报警确认次数(默认3次)", name = "continuousAlarmCount")
+ private Integer continuousAlarmCount;
+
+ @ApiModelProperty(value = "出厂日期", name = "factoryDate")
+ private String factoryDate;
+
+ @ApiModelProperty(value = "企业侧源编码", name = "enterpriseSourceCode")
+ private String enterpriseSourceCode;
+
+ @ApiModelProperty(value = "备注", name = "remarks")
+ private String remarks;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/SensorDevicePageQry.java b/web-client/src/main/java/com/zcloud/dto/SensorDevicePageQry.java
new file mode 100644
index 0000000..6cfae98
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/SensorDevicePageQry.java
@@ -0,0 +1,44 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * SensorDevicePageQry - 传感器设备查询
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class SensorDevicePageQry extends PageQuery {
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "传感器名称")
+ private String sensorName;
+
+ @ApiModelProperty(value = "传感器类型ID")
+ private Long sensorTypeId;
+
+ @ApiModelProperty(value = "传感器属性(NUMBER/SWITCH)")
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "传感器状态")
+ private String sensorStatus;
+
+ @ApiModelProperty(value = "报警开关(1开0关)")
+ private Integer alarmSwitch;
+
+ @ApiModelProperty(value = "是否阈值设定(0否1是)")
+ private Integer thresholdFlag;
+
+ @ApiModelProperty(value = "安装位置")
+ private String installPosition;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/SensorDeviceThresholdCmd.java b/web-client/src/main/java/com/zcloud/dto/SensorDeviceThresholdCmd.java
new file mode 100644
index 0000000..af4f33c
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/SensorDeviceThresholdCmd.java
@@ -0,0 +1,47 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * SensorDeviceThresholdCmd - 传感器设备命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SensorDeviceThresholdCmd extends Command {
+
+ @ApiModelProperty(value = "主键ID", name = "id", required = true)
+ private Long id;
+
+ @ApiModelProperty(value = "单位", name = "unitName")
+ private String unitName;
+
+ @ApiModelProperty(value = "量程下限", name = "rangeMin")
+ private String rangeMin;
+
+ @ApiModelProperty(value = "量程上限", name = "rangeMax")
+ private String rangeMax;
+
+ @ApiModelProperty(value = "低低报阈值", name = "thresholdLowLow")
+ private String thresholdLowLow;
+
+ @ApiModelProperty(value = "低报阈值", name = "thresholdLow")
+ private String thresholdLow;
+
+ @ApiModelProperty(value = "高报阈值", name = "thresholdHigh")
+ private String thresholdHigh;
+
+ @ApiModelProperty(value = "高高报阈值", name = "thresholdHighHigh")
+ private String thresholdHighHigh;
+
+ @ApiModelProperty(value = "连续报警确认次数", name = "continuousAlarmCount")
+ private Integer continuousAlarmCount;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/SensorDeviceUpdateCmd.java b/web-client/src/main/java/com/zcloud/dto/SensorDeviceUpdateCmd.java
new file mode 100644
index 0000000..57f2b09
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/SensorDeviceUpdateCmd.java
@@ -0,0 +1,71 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * SensorDeviceUpdateCmd - 传感器设备命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SensorDeviceUpdateCmd extends Command {
+
+ @ApiModelProperty(value = "主键ID", name = "id", required = true)
+ private Long id;
+
+ @ApiModelProperty(value = "传感器编码", name = "sensorCode")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "传感器名称", name = "sensorName")
+ private String sensorName;
+
+ @ApiModelProperty(value = "传感器类型主键ID", name = "sensorTypeId")
+ private Long sensorTypeId;
+
+ @ApiModelProperty(value = "传感器属性快照(NUMBER/SWITCH)", name = "sensorAttr")
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "安装位置", name = "installPosition")
+ private String installPosition;
+
+ @ApiModelProperty(value = "传感器状态", name = "sensorStatus")
+ private String sensorStatus;
+
+ @ApiModelProperty(value = "是否定位(0否1是)", name = "positioningFlag")
+ private Integer positioningFlag;
+
+ @ApiModelProperty(value = "报警开关(1开0关)", name = "alarmSwitch")
+ private Integer alarmSwitch;
+
+ @ApiModelProperty(value = "是否阈值设定(0否1是)", name = "thresholdFlag")
+ private Integer thresholdFlag;
+
+ @ApiModelProperty(value = "单位", name = "unitName")
+ private String unitName;
+
+ @ApiModelProperty(value = "量程下限", name = "rangeMin")
+ private String rangeMin;
+
+ @ApiModelProperty(value = "量程上限", name = "rangeMax")
+ private String rangeMax;
+
+ @ApiModelProperty(value = "连续报警确认次数(默认3次)", name = "continuousAlarmCount")
+ private Integer continuousAlarmCount;
+
+ @ApiModelProperty(value = "出厂日期", name = "factoryDate")
+ private String factoryDate;
+
+ @ApiModelProperty(value = "企业侧源编码", name = "enterpriseSourceCode")
+ private String enterpriseSourceCode;
+
+ @ApiModelProperty(value = "备注", name = "remarks")
+ private String remarks;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/SensorTypeAddCmd.java b/web-client/src/main/java/com/zcloud/dto/SensorTypeAddCmd.java
new file mode 100644
index 0000000..57476b2
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/SensorTypeAddCmd.java
@@ -0,0 +1,38 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * SensorTypeAddCmd - 传感器类型命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SensorTypeAddCmd extends Command {
+
+ @ApiModelProperty(value = "类型编码", name = "typeCode", required = true)
+ private String typeCode;
+
+ @ApiModelProperty(value = "类型名称", name = "typeName", required = true)
+ private String typeName;
+
+ @ApiModelProperty(value = "传感器属性(STRING/NUMBER/SWITCH)", name = "sensorAttr", required = true)
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "排序", name = "sortNo")
+ private Integer sortNo;
+
+ @ApiModelProperty(value = "状态(1:启用 0:停用)", name = "status", required = true)
+ private Integer status;
+
+ @ApiModelProperty(value = "备注", name = "remarks")
+ private String remarks;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/SensorTypePageQry.java b/web-client/src/main/java/com/zcloud/dto/SensorTypePageQry.java
new file mode 100644
index 0000000..627f6fb
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/SensorTypePageQry.java
@@ -0,0 +1,32 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.PageQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * SensorTypePageQry - 传感器类型查询
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class SensorTypePageQry extends PageQuery {
+
+ @ApiModelProperty(value = "类型名称")
+ private String typeName;
+
+ @ApiModelProperty(value = "类型编码")
+ private String typeCode;
+
+ @ApiModelProperty(value = "传感器属性(STRING/NUMBER/SWITCH)")
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "状态(1:启用 0:停用)")
+ private Integer status;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/SensorTypeUpdateCmd.java b/web-client/src/main/java/com/zcloud/dto/SensorTypeUpdateCmd.java
new file mode 100644
index 0000000..6190b00
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/SensorTypeUpdateCmd.java
@@ -0,0 +1,41 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * SensorTypeUpdateCmd - 传感器类型命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SensorTypeUpdateCmd extends Command {
+
+ @ApiModelProperty(value = "主键ID", name = "id", required = true)
+ private Long id;
+
+ @ApiModelProperty(value = "类型编码", name = "typeCode", required = false)
+ private String typeCode;
+
+ @ApiModelProperty(value = "类型名称", name = "typeName", required = false)
+ private String typeName;
+
+ @ApiModelProperty(value = "传感器属性(STRING/NUMBER/SWITCH)", name = "sensorAttr", required = false)
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "排序", name = "sortNo")
+ private Integer sortNo;
+
+ @ApiModelProperty(value = "状态(1:启用 0:停用)", name = "status")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注", name = "remarks")
+ private String remarks;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/UnbindSensorCmd.java b/web-client/src/main/java/com/zcloud/dto/UnbindSensorCmd.java
new file mode 100644
index 0000000..f607382
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/UnbindSensorCmd.java
@@ -0,0 +1,26 @@
+package com.zcloud.dto;
+
+import com.alibaba.cola.dto.Command;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * UnbindSensorCmd - 解绑传感器命令
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class UnbindSensorCmd extends Command {
+
+ @ApiModelProperty(value = "传感器ID", name = "sensorId", required = true)
+ private Long sensorId;
+
+ @ApiModelProperty(value = "租户ID", name = "tenantId")
+ private Long tenantId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmDisposeCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmDisposeCO.java
new file mode 100644
index 0000000..a7b057d
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmDisposeCO.java
@@ -0,0 +1,125 @@
+package com.zcloud.dto.clientobject;
+
+import com.alibaba.cola.dto.ClientObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * AlarmDisposeCO - 报警处置客户端对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class AlarmDisposeCO extends ClientObject {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String alarmRecordId;
+
+ @ApiModelProperty(value = "报警编号(32位)")
+ private String alarmNo;
+
+ @ApiModelProperty(value = "报警来源 THRESHOLD/DCS")
+ private String alarmSource;
+
+ @ApiModelProperty(value = "设备来源描述快照")
+ private String deviceSourceDesc;
+
+ @ApiModelProperty(value = "传感器ID")
+ private Long sensorId;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "消防区域ID")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "当前负责人ID")
+ private Long managerId;
+
+ @ApiModelProperty(value = "报警级别")
+ private String alarmLevel;
+
+ @ApiModelProperty(value = "报警类型")
+ private String alarmType;
+
+ @ApiModelProperty(value = "阈值类型 HIGH/HIGH_HIGH/LOW/LOW_LOW")
+ private String thresholdType;
+
+ @ApiModelProperty(value = "告警值")
+ private BigDecimal currentValue;
+
+ @ApiModelProperty(value = "比较方向 UP/DOWN")
+ private String compareFlag;
+
+ @ApiModelProperty(value = "单位")
+ private String unitName;
+
+ @ApiModelProperty(value = "报警描述")
+ private String alarmDesc;
+
+ @ApiModelProperty(value = "报警时间")
+ private String alarmTime;
+
+ @ApiModelProperty(value = "当前状态 10待研判/20待处置/30已消警/40误报")
+ private Integer status;
+
+ @ApiModelProperty(value = "分配时间")
+ private String assignTime;
+
+ @ApiModelProperty(value = "处置时间")
+ private String disposeTime;
+
+ @ApiModelProperty(value = "处置人ID")
+ private Long disposeUserId;
+
+ @ApiModelProperty(value = "当前处置结果快照")
+ private String disposeResult;
+
+ @ApiModelProperty(value = "当前处置说明快照")
+ private String disposeRemark;
+
+ @ApiModelProperty(value = "图片地址")
+ private String pictureUrls;
+
+ @ApiModelProperty(value = "是否活跃告警")
+ private Integer activeFlag;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "创建人ID")
+ private Long createId;
+
+ @ApiModelProperty(value = "创建人姓名")
+ private String createName;
+
+ @ApiModelProperty(value = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ @ApiModelProperty(value = "更新人ID")
+ private Long updateId;
+
+ @ApiModelProperty(value = "更新人姓名")
+ private String updateName;
+
+ @ApiModelProperty(value = "更新时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmRecordCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmRecordCO.java
new file mode 100644
index 0000000..14a640a
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/clientobject/AlarmRecordCO.java
@@ -0,0 +1,128 @@
+package com.zcloud.dto.clientobject;
+
+import com.alibaba.cola.dto.ClientObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * AlarmRecordCO - 报警记录客户端对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class AlarmRecordCO extends ClientObject {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String alarmRecordId;
+
+ @ApiModelProperty(value = "报警编号(32位)")
+ private String alarmNo;
+
+ @ApiModelProperty(value = "报警来源 THRESHOLD/DCS")
+ private String alarmSource;
+
+ @ApiModelProperty(value = "设备来源描述快照")
+ private String deviceSourceDesc;
+
+ @ApiModelProperty(value = "传感器ID")
+ private Long sensorId;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "消防区域ID")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "当前负责人ID")
+ private Long managerId;
+
+ @ApiModelProperty(value = "报警级别")
+ private String alarmLevel;
+
+ @ApiModelProperty(value = "报警类型")
+ private String alarmType;
+
+ @ApiModelProperty(value = "阈值类型 HIGH/HIGH_HIGH/LOW/LOW_LOW")
+ private String thresholdType;
+
+ @ApiModelProperty(value = "告警值")
+ private BigDecimal currentValue;
+
+ @ApiModelProperty(value = "比较方向 UP/DOWN")
+ private String compareFlag;
+
+ @ApiModelProperty(value = "单位")
+ private String unitName;
+
+ @ApiModelProperty(value = "报警描述")
+ private String alarmDesc;
+
+ @ApiModelProperty(value = "报警时间")
+ private String alarmTime;
+
+ @ApiModelProperty(value = "当前状态 10待研判/20待处置/30已消警/40误报")
+ private Integer status;
+
+ @ApiModelProperty(value = "分配时间")
+ private String assignTime;
+
+ @ApiModelProperty(value = "处置时间")
+ private String disposeTime;
+
+ @ApiModelProperty(value = "处置人ID")
+ private Long disposeUserId;
+
+ @ApiModelProperty(value = "当前处置结果快照")
+ private String disposeResult;
+
+ @ApiModelProperty(value = "当前处置说明快照")
+ private String disposeRemark;
+
+ @ApiModelProperty(value = "图片地址")
+ private String pictureUrls;
+
+ @ApiModelProperty(value = "外部记录唯一键")
+ private String sourceRecordKey;
+
+ @ApiModelProperty(value = "是否活跃告警")
+ private Integer activeFlag;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "创建人ID")
+ private Long createId;
+
+ @ApiModelProperty(value = "创建人姓名")
+ private String createName;
+
+ @ApiModelProperty(value = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ @ApiModelProperty(value = "更新人ID")
+ private Long updateId;
+
+ @ApiModelProperty(value = "更新人姓名")
+ private String updateName;
+
+ @ApiModelProperty(value = "更新时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/DeviceRegionCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/DeviceRegionCO.java
new file mode 100644
index 0000000..bdde701
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/clientobject/DeviceRegionCO.java
@@ -0,0 +1,67 @@
+package com.zcloud.dto.clientobject;
+
+import com.alibaba.cola.dto.ClientObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * DeviceRegionCO - 设备区域客户端对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class DeviceRegionCO extends ClientObject {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String regionConfigId;
+
+ @ApiModelProperty(value = "外部消防区域主键")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "外部消防区域编码")
+ private String fireRegionCode;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "负责人ID")
+ private Long managerId;
+
+ @ApiModelProperty(value = "状态 1启用0停用")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "创建人ID")
+ private Long createId;
+
+ @ApiModelProperty(value = "创建人姓名")
+ private String createName;
+
+ @ApiModelProperty(value = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ @ApiModelProperty(value = "更新人ID")
+ private Long updateId;
+
+ @ApiModelProperty(value = "更新人姓名")
+ private String updateName;
+
+ @ApiModelProperty(value = "更新时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/FireRegionCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/FireRegionCO.java
new file mode 100644
index 0000000..d2b2f60
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/clientobject/FireRegionCO.java
@@ -0,0 +1,38 @@
+package com.zcloud.dto.clientobject;
+
+import com.alibaba.cola.dto.ClientObject;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * FireRegionCO - 火灾区域客户端对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class FireRegionCO extends ClientObject {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String regionConfigId;
+
+ @ApiModelProperty(value = "外部消防区域主键")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "外部消防区域编码")
+ private String fireRegionCode;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "负责人ID")
+ private Long managerId;
+
+ @ApiModelProperty(value = "状态 1启用0停用")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/RiskPointCo.java b/web-client/src/main/java/com/zcloud/dto/clientobject/RiskPointCo.java
deleted file mode 100644
index 9e96685..0000000
--- a/web-client/src/main/java/com/zcloud/dto/clientobject/RiskPointCo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.zcloud.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-client/src/main/java/com/zcloud/dto/clientobject/SensorDeviceCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/SensorDeviceCO.java
new file mode 100644
index 0000000..68f409c
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/clientobject/SensorDeviceCO.java
@@ -0,0 +1,109 @@
+package com.zcloud.dto.clientobject;
+
+import com.alibaba.cola.dto.ClientObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * SensorDeviceCO - 传感器设备客户端对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class SensorDeviceCO extends ClientObject {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+ @ApiModelProperty(value = "传感器设备业务ID")
+ private String sensorDeviceId;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "传感器名称")
+ private String sensorName;
+
+ @ApiModelProperty(value = "传感器类型主键ID")
+ private Long sensorTypeId;
+
+ @ApiModelProperty(value = "传感器属性快照(NUMBER/SWITCH)")
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "安装位置")
+ private String installPosition;
+
+ @ApiModelProperty(value = "传感器状态")
+ private String sensorStatus;
+
+ @ApiModelProperty(value = "是否定位(0否1是)")
+ private Integer positioningFlag;
+
+ @ApiModelProperty(value = "报警开关(1开0关)")
+ private Integer alarmSwitch;
+
+ @ApiModelProperty(value = "是否阈值设定(0否1是)")
+ private Integer thresholdFlag;
+
+ @ApiModelProperty(value = "单位")
+ private String unitName;
+
+ @ApiModelProperty(value = "量程下限")
+ private String rangeMin;
+
+ @ApiModelProperty(value = "量程上限")
+ private String rangeMax;
+
+ @ApiModelProperty(value = "低低报阈值")
+ private String thresholdLowLow;
+
+ @ApiModelProperty(value = "低报阈值")
+ private String thresholdLow;
+
+ @ApiModelProperty(value = "高报阈值")
+ private String thresholdHigh;
+
+ @ApiModelProperty(value = "高高报阈值")
+ private String thresholdHighHigh;
+
+ @ApiModelProperty(value = "连续报警确认次数")
+ private Integer continuousAlarmCount;
+
+ @ApiModelProperty(value = "出厂日期")
+ private String factoryDate;
+
+ @ApiModelProperty(value = "企业侧源编码")
+ private String enterpriseSourceCode;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "创建人ID")
+ private Long createId;
+
+ @ApiModelProperty(value = "创建人姓名")
+ private String createName;
+
+ @ApiModelProperty(value = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ @ApiModelProperty(value = "更新人ID")
+ private Long updateId;
+
+ @ApiModelProperty(value = "更新人姓名")
+ private String updateName;
+
+ @ApiModelProperty(value = "更新时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-client/src/main/java/com/zcloud/dto/clientobject/SensorTypeCO.java b/web-client/src/main/java/com/zcloud/dto/clientobject/SensorTypeCO.java
new file mode 100644
index 0000000..83a815b
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/dto/clientobject/SensorTypeCO.java
@@ -0,0 +1,67 @@
+package com.zcloud.dto.clientobject;
+
+import com.alibaba.cola.dto.ClientObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * SensorTypeCO - 传感器类型客户端对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+public class SensorTypeCO extends ClientObject {
+
+ @ApiModelProperty(value = "主键ID")
+ private Long id;
+
+ @ApiModelProperty(value = "传感器类型业务ID")
+ private String sensorTypeId;
+
+ @ApiModelProperty(value = "类型编码")
+ private String typeCode;
+
+ @ApiModelProperty(value = "类型名称")
+ private String typeName;
+
+ @ApiModelProperty(value = "传感器属性(STRING/NUMBER/SWITCH)")
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "排序")
+ private Integer sortNo;
+
+ @ApiModelProperty(value = "状态(1:启用 0:停用)")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "创建人ID")
+ private Long createId;
+
+ @ApiModelProperty(value = "创建人姓名")
+ private String createName;
+
+ @ApiModelProperty(value = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ @ApiModelProperty(value = "更新人ID")
+ private Long updateId;
+
+ @ApiModelProperty(value = "更新人姓名")
+ private String updateName;
+
+ @ApiModelProperty(value = "更新时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/gateway/AlarmDisposeLogGateway.java b/web-domain/src/main/java/com/zcloud/domain/gateway/AlarmDisposeLogGateway.java
new file mode 100644
index 0000000..e997b97
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/gateway/AlarmDisposeLogGateway.java
@@ -0,0 +1,27 @@
+package com.zcloud.domain.gateway;
+
+import com.zcloud.domain.model.AlarmDisposeLogE;
+import java.util.List;
+
+/**
+ * AlarmDisposeLogGateway - 报警处置日志网关接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface AlarmDisposeLogGateway {
+
+ /**
+ * 新增
+ */
+ Long add(AlarmDisposeLogE alarmDisposeLogE);
+
+ /**
+ * 根据ID获取
+ */
+ AlarmDisposeLogE getById(Long id);
+
+ /**
+ * 根据报警ID获取处置日志列表
+ */
+ List listByAlarmId(Long alarmId);
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/gateway/AlarmRecordGateway.java b/web-domain/src/main/java/com/zcloud/domain/gateway/AlarmRecordGateway.java
new file mode 100644
index 0000000..4c22c72
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/gateway/AlarmRecordGateway.java
@@ -0,0 +1,42 @@
+package com.zcloud.domain.gateway;
+
+import com.zcloud.domain.model.AlarmRecordE;
+import java.util.List;
+
+/**
+ * AlarmRecordGateway - 报警记录网关接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface AlarmRecordGateway {
+
+ /**
+ * 新增
+ */
+ Long add(AlarmRecordE alarmRecordE);
+
+ /**
+ * 修改
+ */
+ Boolean update(AlarmRecordE alarmRecordE);
+
+ /**
+ * 根据ID获取
+ */
+ AlarmRecordE getById(Long id);
+
+ /**
+ * 根据报警编号获取
+ */
+ AlarmRecordE getByAlarmNo(String alarmNo);
+
+ /**
+ * 根据租户ID获取所有报警记录
+ */
+ List listByTenantId(Long tenantId);
+
+ /**
+ * 更新状态
+ */
+ Boolean updateStatus(Long id, Integer status, String assignTime);
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/gateway/DeviceRegionGateway.java b/web-domain/src/main/java/com/zcloud/domain/gateway/DeviceRegionGateway.java
new file mode 100644
index 0000000..8f87c8a
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/gateway/DeviceRegionGateway.java
@@ -0,0 +1,47 @@
+package com.zcloud.domain.gateway;
+
+import com.zcloud.domain.model.DeviceRegionE;
+import java.util.List;
+
+/**
+ * DeviceRegionGateway - 设备区域网关接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface DeviceRegionGateway {
+
+ /**
+ * 新增
+ */
+ Long add(DeviceRegionE deviceRegionE);
+
+ /**
+ * 修改
+ */
+ Boolean update(DeviceRegionE deviceRegionE);
+
+ /**
+ * 根据ID删除(软删除)
+ */
+ Boolean deleteById(Long id);
+
+ /**
+ * 根据ID获取
+ */
+ DeviceRegionE getById(Long id);
+
+ /**
+ * 根据消防区域ID获取
+ */
+ DeviceRegionE getByFireRegionId(Long fireRegionId);
+
+ /**
+ * 根据租户ID获取所有区域配置
+ */
+ List listByTenantId(Long tenantId);
+
+ /**
+ * 更新负责人
+ */
+ Boolean updateManager(Long id, Long managerId, Long departmentId);
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/gateway/RegionSensorRelGateway.java b/web-domain/src/main/java/com/zcloud/domain/gateway/RegionSensorRelGateway.java
new file mode 100644
index 0000000..faee89b
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/gateway/RegionSensorRelGateway.java
@@ -0,0 +1,31 @@
+package com.zcloud.domain.gateway;
+
+import com.zcloud.domain.model.RegionSensorRelE;
+
+/**
+ * RegionSensorRelGateway - 区域传感器关系网关接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface RegionSensorRelGateway {
+
+ /**
+ * 新增
+ */
+ Long add(RegionSensorRelE regionSensorRelE);
+
+ /**
+ * 根据传感器ID删除(软删除)
+ */
+ Boolean deleteBySensorId(Long sensorId);
+
+ /**
+ * 根据传感器ID获取
+ */
+ RegionSensorRelE getBySensorId(Long sensorId);
+
+ /**
+ * 检查传感器是否已绑定
+ */
+ Boolean isSensorBound(Long sensorId);
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/gateway/RiskPointGateway.java b/web-domain/src/main/java/com/zcloud/domain/gateway/RiskPointGateway.java
deleted file mode 100644
index edb5400..0000000
--- a/web-domain/src/main/java/com/zcloud/domain/gateway/RiskPointGateway.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.zcloud.domain.gateway;
-
-
-import com.zcloud.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/domain/gateway/SensorDeviceGateway.java b/web-domain/src/main/java/com/zcloud/domain/gateway/SensorDeviceGateway.java
new file mode 100644
index 0000000..6af0e0a
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/gateway/SensorDeviceGateway.java
@@ -0,0 +1,31 @@
+package com.zcloud.domain.gateway;
+
+import com.zcloud.domain.model.SensorDeviceE;
+
+/**
+ * SensorDeviceGateway - 传感器设备网关接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface SensorDeviceGateway {
+
+ /**
+ * 新增
+ */
+ Long add(SensorDeviceE sensorDeviceE);
+
+ /**
+ * 修改
+ */
+ Boolean update(SensorDeviceE sensorDeviceE);
+
+ /**
+ * 根据ID删除(软删除)
+ */
+ Boolean deleteById(Long id);
+
+ /**
+ * 根据ID获取
+ */
+ SensorDeviceE getById(Long id);
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/gateway/SensorTypeGateway.java b/web-domain/src/main/java/com/zcloud/domain/gateway/SensorTypeGateway.java
new file mode 100644
index 0000000..273c962
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/gateway/SensorTypeGateway.java
@@ -0,0 +1,31 @@
+package com.zcloud.domain.gateway;
+
+import com.zcloud.domain.model.SensorTypeE;
+
+/**
+ * SensorTypeGateway - 传感器类型网关接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface SensorTypeGateway {
+
+ /**
+ * 新增
+ */
+ Long add(SensorTypeE sensorTypeE);
+
+ /**
+ * 修改
+ */
+ Boolean update(SensorTypeE sensorTypeE);
+
+ /**
+ * 根据ID删除(软删除)
+ */
+ Boolean deleteById(Long id);
+
+ /**
+ * 根据ID获取
+ */
+ SensorTypeE getById(Long id);
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/model/AlarmDisposeLogE.java b/web-domain/src/main/java/com/zcloud/domain/model/AlarmDisposeLogE.java
new file mode 100644
index 0000000..a08dac2
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/model/AlarmDisposeLogE.java
@@ -0,0 +1,85 @@
+package com.zcloud.domain.model;
+
+import com.jjb.saas.framework.domain.model.BaseE;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * AlarmDisposeLogE - 报警处置日志实体
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AlarmDisposeLogE extends BaseE {
+
+ /**
+ * 业务ID(32位)
+ */
+ private String alarmDisposalLogId;
+
+ /**
+ * 报警主键ID
+ */
+ private Long alarmId;
+
+ /**
+ * 报警编号(32位)
+ */
+ private String alarmNo;
+
+ /**
+ * 操作类型 AUTO_ASSIGN/MANUAL_ASSIGN/DISPOSE/INVALID
+ */
+ private String actionType;
+
+ /**
+ * 变更前状态
+ */
+ private Integer beforeStatus;
+
+ /**
+ * 变更后状态
+ */
+ private Integer afterStatus;
+
+ /**
+ * 操作人ID
+ */
+ private Long operatorId;
+
+ /**
+ * 操作说明
+ */
+ private String actionDesc;
+
+ /**
+ * 处置结果
+ */
+ private String resultText;
+
+ /**
+ * 附件图片
+ */
+ private String pictureUrls;
+
+ /**
+ * 操作时间
+ */
+ private String actionTime;
+
+ /**
+ * 删除标识
+ */
+ private String deleteEnum;
+
+ /**
+ * 租户ID
+ */
+ private Long tenantId;
+
+ /**
+ * 组织ID
+ */
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/model/AlarmRecordE.java b/web-domain/src/main/java/com/zcloud/domain/model/AlarmRecordE.java
new file mode 100644
index 0000000..5734737
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/model/AlarmRecordE.java
@@ -0,0 +1,167 @@
+package com.zcloud.domain.model;
+
+import com.jjb.saas.framework.domain.model.BaseE;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * AlarmRecordE - 报警记录实体
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AlarmRecordE extends BaseE {
+
+ /**
+ * 业务ID(32位)
+ */
+ private String alarmRecordId;
+
+ /**
+ * 报警编号(32位)
+ */
+ private String alarmNo;
+
+ /**
+ * 报警来源 THRESHOLD/DCS
+ */
+ private String alarmSource;
+
+ /**
+ * 设备来源描述快照
+ */
+ private String deviceSourceDesc;
+
+ /**
+ * 传感器ID
+ */
+ private Long sensorId;
+
+ /**
+ * 传感器编码
+ */
+ private String sensorCode;
+
+ /**
+ * 消防区域ID
+ */
+ private Long fireRegionId;
+
+ /**
+ * 负责部门ID
+ */
+ private Long departmentId;
+
+ /**
+ * 当前负责人ID
+ */
+ private Long managerId;
+
+ /**
+ * 报警级别
+ */
+ private String alarmLevel;
+
+ /**
+ * 报警类型
+ */
+ private String alarmType;
+
+ /**
+ * 阈值类型 HIGH/HIGH_HIGH/LOW/LOW_LOW
+ */
+ private String thresholdType;
+
+ /**
+ * 告警值
+ */
+ private BigDecimal currentValue;
+
+ /**
+ * 比较方向 UP/DOWN
+ */
+ private String compareFlag;
+
+ /**
+ * 单位
+ */
+ private String unitName;
+
+ /**
+ * 报警描述
+ */
+ private String alarmDesc;
+
+ /**
+ * 报警时间
+ */
+ private String alarmTime;
+
+ /**
+ * 当前状态 10待研判/20待处置/30已消警/40误报
+ */
+ private Integer status;
+
+ /**
+ * 分配时间
+ */
+ private String assignTime;
+
+ /**
+ * 处置时间
+ */
+ private String disposeTime;
+
+ /**
+ * 处置人ID
+ */
+ private Long disposeUserId;
+
+ /**
+ * 当前处置结果快照
+ */
+ private String disposeResult;
+
+ /**
+ * 当前处置说明快照
+ */
+ private String disposeRemark;
+
+ /**
+ * 图片地址
+ */
+ private String pictureUrls;
+
+ /**
+ * 外部记录唯一键
+ */
+ private String sourceRecordKey;
+
+ /**
+ * 是否活跃告警
+ */
+ private Integer activeFlag;
+
+ /**
+ * 备注
+ */
+ private String remarks;
+
+ /**
+ * 删除标识
+ */
+ private String deleteEnum;
+
+ /**
+ * 租户ID
+ */
+ private Long tenantId;
+
+ /**
+ * 组织ID
+ */
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/model/DeviceRegionE.java b/web-domain/src/main/java/com/zcloud/domain/model/DeviceRegionE.java
new file mode 100644
index 0000000..3a1d3bc
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/model/DeviceRegionE.java
@@ -0,0 +1,65 @@
+package com.zcloud.domain.model;
+
+import com.jjb.saas.framework.domain.model.BaseE;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * DeviceRegionE - 设备区域实体
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DeviceRegionE extends BaseE {
+
+ /**
+ * 业务ID(32位)
+ */
+ private String regionConfigId;
+
+ /**
+ * 外部消防区域主键
+ */
+ private Long fireRegionId;
+
+ /**
+ * 外部消防区域编码
+ */
+ private String fireRegionCode;
+
+ /**
+ * 负责部门ID
+ */
+ private Long departmentId;
+
+ /**
+ * 负责人ID
+ */
+ private Long managerId;
+
+ /**
+ * 状态 1启用0停用
+ */
+ private Integer status;
+
+ /**
+ * 备注
+ */
+ private String remarks;
+
+ /**
+ * 删除标识
+ */
+ private String deleteEnum;
+
+ /**
+ * 租户ID
+ */
+ private Long tenantId;
+
+ /**
+ * 组织ID
+ */
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/model/RegionSensorRelE.java b/web-domain/src/main/java/com/zcloud/domain/model/RegionSensorRelE.java
new file mode 100644
index 0000000..3f0c5d6
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/model/RegionSensorRelE.java
@@ -0,0 +1,55 @@
+package com.zcloud.domain.model;
+
+import com.jjb.saas.framework.domain.model.BaseE;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * RegionSensorRelE - 区域传感器关系实体
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class RegionSensorRelE extends BaseE {
+
+ /**
+ * 业务ID(32位)
+ */
+ private String regionSensorRelId;
+
+ /**
+ * 区域配置主键ID
+ */
+ private Long regionConfigId;
+
+ /**
+ * 外部消防区域ID
+ */
+ private Long fireRegionId;
+
+ /**
+ * 传感器ID
+ */
+ private Long sensorId;
+
+ /**
+ * 传感器编码快照
+ */
+ private String sensorCode;
+
+ /**
+ * 删除标识
+ */
+ private String deleteEnum;
+
+ /**
+ * 租户ID
+ */
+ private Long tenantId;
+
+ /**
+ * 组织ID
+ */
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/model/RiskPointE.java b/web-domain/src/main/java/com/zcloud/domain/model/RiskPointE.java
deleted file mode 100644
index 9230d8a..0000000
--- a/web-domain/src/main/java/com/zcloud/domain/model/RiskPointE.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.zcloud.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-domain/src/main/java/com/zcloud/domain/model/SensorDeviceE.java b/web-domain/src/main/java/com/zcloud/domain/model/SensorDeviceE.java
new file mode 100644
index 0000000..1f29b77
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/model/SensorDeviceE.java
@@ -0,0 +1,135 @@
+package com.zcloud.domain.model;
+
+import com.jjb.saas.framework.domain.model.BaseE;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * SensorDeviceE - 传感器设备实体
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SensorDeviceE extends BaseE {
+
+ /**
+ * 传感器设备业务ID (生成32位UUID)
+ */
+ private String sensorDeviceId;
+
+ /**
+ * 传感器编码
+ */
+ private String sensorCode;
+
+ /**
+ * 传感器名称
+ */
+ private String sensorName;
+
+ /**
+ * 传感器类型主键ID
+ */
+ private Long sensorTypeId;
+
+ /**
+ * 传感器属性快照(NUMBER/SWITCH)
+ */
+ private String sensorAttr;
+
+ /**
+ * 安装位置
+ */
+ private String installPosition;
+
+ /**
+ * 传感器状态
+ */
+ private String sensorStatus;
+
+ /**
+ * 是否定位(0否1是)
+ */
+ private Integer positioningFlag;
+
+ /**
+ * 报警开关(1开0关)
+ */
+ private Integer alarmSwitch;
+
+ /**
+ * 是否阈值设定(0否1是)
+ */
+ private Integer thresholdFlag;
+
+ /**
+ * 单位
+ */
+ private String unitName;
+
+ /**
+ * 量程下限
+ */
+ private String rangeMin;
+
+ /**
+ * 量程上限
+ */
+ private String rangeMax;
+
+ /**
+ * 低低报阈值
+ */
+ private String thresholdLowLow;
+
+ /**
+ * 低报阈值
+ */
+ private String thresholdLow;
+
+ /**
+ * 高报阈值
+ */
+ private String thresholdHigh;
+
+ /**
+ * 高高报阈值
+ */
+ private String thresholdHighHigh;
+
+ /**
+ * 连续报警确认次数(默认3次)
+ */
+ private Integer continuousAlarmCount;
+
+ /**
+ * 出厂日期
+ */
+ private String factoryDate;
+
+ /**
+ * 企业侧源编码(同步映射键)
+ */
+ private String enterpriseSourceCode;
+
+ /**
+ * 备注
+ */
+ private String remarks;
+
+ /**
+ * 删除标识
+ */
+ private String deleteEnum;
+
+ /**
+ * 租户ID
+ */
+ private Long tenantId;
+
+ /**
+ * 组织ID
+ */
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-domain/src/main/java/com/zcloud/domain/model/SensorTypeE.java b/web-domain/src/main/java/com/zcloud/domain/model/SensorTypeE.java
new file mode 100644
index 0000000..ef3b902
--- /dev/null
+++ b/web-domain/src/main/java/com/zcloud/domain/model/SensorTypeE.java
@@ -0,0 +1,60 @@
+package com.zcloud.domain.model;
+
+import com.jjb.saas.framework.domain.model.BaseE;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * SensorTypeE - 传感器类型实体
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SensorTypeE extends BaseE {
+
+ /**
+ * 传感器类型业务ID (生成32位UUID)
+ */
+ private String sensorTypeId;
+
+ /**
+ * 类型编码
+ */
+ private String typeCode;
+
+ /**
+ * 类型名称
+ */
+ private String typeName;
+
+ /**
+ * 传感器属性(STRING/NUMBER/SWITCH)
+ */
+ private String sensorAttr;
+
+ /**
+ * 排序
+ */
+ private Integer sortNo;
+
+ /**
+ * 状态(1:启用 0:停用)
+ */
+ private Integer status;
+
+ /**
+ * 备注
+ */
+ private String remarks;
+
+ /**
+ * 租户ID
+ */
+ private Long tenantId;
+
+ /**
+ * 组织ID
+ */
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-infrastructure/pom.xml b/web-infrastructure/pom.xml
index 0cd4358..cf43777 100644
--- a/web-infrastructure/pom.xml
+++ b/web-infrastructure/pom.xml
@@ -23,6 +23,11 @@
web-domain
+
+ com.zcloud
+ web-client
+
+
com.jjb.saas
jjb-saas-application-client
@@ -39,5 +44,17 @@
com.jjb.saas
jjb-saas-framework-facade
+
+ com.jjb.saas
+ jjb-saas-framework-repository
+
+
+ com.jjb.saas
+ jjb-saas-framework-domain
+
+
+ com.jjb.saas
+ jjb-saas-base-starter
+
diff --git a/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/AlarmDisposeLogGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/AlarmDisposeLogGatewayImpl.java
new file mode 100644
index 0000000..d14626c
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/AlarmDisposeLogGatewayImpl.java
@@ -0,0 +1,59 @@
+package com.zcloud.gatewayimpl;
+
+import com.zcloud.domain.gateway.AlarmDisposeLogGateway;
+import com.zcloud.domain.model.AlarmDisposeLogE;
+import com.zcloud.persistence.dataobject.AlarmDisposeLogDO;
+import com.zcloud.persistence.repository.AlarmDisposeLogRepository;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * AlarmDisposeLogGatewayImpl - 报警处置日志网关实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Service
+@AllArgsConstructor
+public class AlarmDisposeLogGatewayImpl implements AlarmDisposeLogGateway {
+
+ private final AlarmDisposeLogRepository alarmDisposeLogRepository;
+
+ @Override
+ public Long add(AlarmDisposeLogE alarmDisposeLogE) {
+ AlarmDisposeLogDO d = new AlarmDisposeLogDO();
+ BeanUtils.copyProperties(alarmDisposeLogE, d);
+ alarmDisposeLogRepository.save(d);
+ return d.getId();
+ }
+
+ @Override
+ public AlarmDisposeLogE getById(Long id) {
+ AlarmDisposeLogDO d = alarmDisposeLogRepository.getById(id);
+ if (d == null) {
+ return null;
+ }
+ AlarmDisposeLogE alarmDisposeLogE = new AlarmDisposeLogE();
+ BeanUtils.copyProperties(d, alarmDisposeLogE);
+ return alarmDisposeLogE;
+ }
+
+ @Override
+ public List listByAlarmId(Long alarmId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(AlarmDisposeLogDO::getAlarmId, alarmId)
+ .eq(AlarmDisposeLogDO::getDeleteEnum, "FALSE")
+ .orderByDesc(AlarmDisposeLogDO::getActionTime);
+
+ List list = alarmDisposeLogRepository.list(wrapper);
+ return list.stream().map(d -> {
+ AlarmDisposeLogE alarmDisposeLogE = new AlarmDisposeLogE();
+ BeanUtils.copyProperties(d, alarmDisposeLogE);
+ return alarmDisposeLogE;
+ }).collect(Collectors.toList());
+ }
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/AlarmRecordGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/AlarmRecordGatewayImpl.java
new file mode 100644
index 0000000..b603057
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/AlarmRecordGatewayImpl.java
@@ -0,0 +1,91 @@
+package com.zcloud.gatewayimpl;
+
+import com.zcloud.domain.gateway.AlarmRecordGateway;
+import com.zcloud.domain.model.AlarmRecordE;
+import com.zcloud.persistence.dataobject.AlarmRecordDO;
+import com.zcloud.persistence.repository.AlarmRecordRepository;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * AlarmRecordGatewayImpl - 报警记录网关实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Service
+@AllArgsConstructor
+public class AlarmRecordGatewayImpl implements AlarmRecordGateway {
+
+ private final AlarmRecordRepository alarmRecordRepository;
+
+ @Override
+ public Long add(AlarmRecordE alarmRecordE) {
+ AlarmRecordDO d = new AlarmRecordDO();
+ BeanUtils.copyProperties(alarmRecordE, d);
+ alarmRecordRepository.save(d);
+ return d.getId();
+ }
+
+ @Override
+ public Boolean update(AlarmRecordE alarmRecordE) {
+ AlarmRecordDO d = new AlarmRecordDO();
+ BeanUtils.copyProperties(alarmRecordE, d);
+ alarmRecordRepository.updateById(d);
+ return true;
+ }
+
+ @Override
+ public AlarmRecordE getById(Long id) {
+ AlarmRecordDO d = alarmRecordRepository.getById(id);
+ if (d == null) {
+ return null;
+ }
+ AlarmRecordE alarmRecordE = new AlarmRecordE();
+ BeanUtils.copyProperties(d, alarmRecordE);
+ return alarmRecordE;
+ }
+
+ @Override
+ public AlarmRecordE getByAlarmNo(String alarmNo) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(AlarmRecordDO::getAlarmNo, alarmNo)
+ .eq(AlarmRecordDO::getDeleteEnum, "FALSE");
+
+ AlarmRecordDO d = alarmRecordRepository.getOne(wrapper);
+ if (d == null) {
+ return null;
+ }
+ AlarmRecordE alarmRecordE = new AlarmRecordE();
+ BeanUtils.copyProperties(d, alarmRecordE);
+ return alarmRecordE;
+ }
+
+ @Override
+ public List listByTenantId(Long tenantId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(AlarmRecordDO::getTenantId, tenantId)
+ .eq(AlarmRecordDO::getDeleteEnum, "FALSE");
+
+ List list = alarmRecordRepository.list(wrapper);
+ return list.stream().map(d -> {
+ AlarmRecordE alarmRecordE = new AlarmRecordE();
+ BeanUtils.copyProperties(d, alarmRecordE);
+ return alarmRecordE;
+ }).collect(Collectors.toList());
+ }
+
+ @Override
+ public Boolean updateStatus(Long id, Integer status, String assignTime) {
+ AlarmRecordDO d = new AlarmRecordDO();
+ d.setId(id);
+ d.setStatus(status);
+ d.setAssignTime(assignTime);
+ alarmRecordRepository.updateById(d);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/DeviceRegionGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/DeviceRegionGatewayImpl.java
new file mode 100644
index 0000000..d40f7e1
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/DeviceRegionGatewayImpl.java
@@ -0,0 +1,96 @@
+package com.zcloud.gatewayimpl;
+
+import com.zcloud.domain.gateway.DeviceRegionGateway;
+import com.zcloud.domain.model.DeviceRegionE;
+import com.zcloud.persistence.dataobject.DeviceRegionDO;
+import com.zcloud.persistence.repository.DeviceRegionRepository;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * DeviceRegionGatewayImpl - 设备区域网关实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Service
+@AllArgsConstructor
+public class DeviceRegionGatewayImpl implements DeviceRegionGateway {
+
+ private final DeviceRegionRepository deviceRegionRepository;
+
+ @Override
+ public Long add(DeviceRegionE deviceRegionE) {
+ DeviceRegionDO d = new DeviceRegionDO();
+ BeanUtils.copyProperties(deviceRegionE, d);
+ deviceRegionRepository.save(d);
+ return d.getId();
+ }
+
+ @Override
+ public Boolean update(DeviceRegionE deviceRegionE) {
+ DeviceRegionDO d = new DeviceRegionDO();
+ BeanUtils.copyProperties(deviceRegionE, d);
+ deviceRegionRepository.updateById(d);
+ return true;
+ }
+
+ @Override
+ public Boolean deleteById(Long id) {
+ return deviceRegionRepository.removeById(id);
+ }
+
+ @Override
+ public DeviceRegionE getById(Long id) {
+ DeviceRegionDO d = deviceRegionRepository.getById(id);
+ if (d == null) {
+ return null;
+ }
+ DeviceRegionE deviceRegionE = new DeviceRegionE();
+ BeanUtils.copyProperties(d, deviceRegionE);
+ return deviceRegionE;
+ }
+
+ @Override
+ public DeviceRegionE getByFireRegionId(Long fireRegionId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(DeviceRegionDO::getFireRegionId, fireRegionId)
+ .eq(DeviceRegionDO::getDeleteEnum, "FALSE");
+
+ DeviceRegionDO d = deviceRegionRepository.getOne(wrapper);
+ if (d == null) {
+ return null;
+ }
+ DeviceRegionE deviceRegionE = new DeviceRegionE();
+ BeanUtils.copyProperties(d, deviceRegionE);
+ return deviceRegionE;
+ }
+
+ @Override
+ public List listByTenantId(Long tenantId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(DeviceRegionDO::getTenantId, tenantId)
+ .eq(DeviceRegionDO::getDeleteEnum, "FALSE");
+
+ List list = deviceRegionRepository.list(wrapper);
+ return list.stream().map(d -> {
+ DeviceRegionE deviceRegionE = new DeviceRegionE();
+ BeanUtils.copyProperties(d, deviceRegionE);
+ return deviceRegionE;
+ }).collect(Collectors.toList());
+ }
+
+ @Override
+ public Boolean updateManager(Long id, Long managerId, Long departmentId) {
+ DeviceRegionDO d = new DeviceRegionDO();
+ d.setId(id);
+ d.setManagerId(managerId);
+ d.setDepartmentId(departmentId);
+ deviceRegionRepository.updateById(d);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/RegionSensorRelGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/RegionSensorRelGatewayImpl.java
new file mode 100644
index 0000000..ad2fa8d
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/RegionSensorRelGatewayImpl.java
@@ -0,0 +1,62 @@
+package com.zcloud.gatewayimpl;
+
+import com.zcloud.domain.gateway.RegionSensorRelGateway;
+import com.zcloud.domain.model.RegionSensorRelE;
+import com.zcloud.persistence.dataobject.RegionSensorRelDO;
+import com.zcloud.persistence.repository.RegionSensorRelRepository;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * RegionSensorRelGatewayImpl - 区域传感器关系网关实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Service
+@AllArgsConstructor
+public class RegionSensorRelGatewayImpl implements RegionSensorRelGateway {
+
+ private final RegionSensorRelRepository regionSensorRelRepository;
+
+ @Override
+ public Long add(RegionSensorRelE regionSensorRelE) {
+ RegionSensorRelDO d = new RegionSensorRelDO();
+ BeanUtils.copyProperties(regionSensorRelE, d);
+ regionSensorRelRepository.save(d);
+ return d.getId();
+ }
+
+ @Override
+ public Boolean deleteBySensorId(Long sensorId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(RegionSensorRelDO::getSensorId, sensorId);
+ return regionSensorRelRepository.remove(wrapper);
+ }
+
+ @Override
+ public RegionSensorRelE getBySensorId(Long sensorId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(RegionSensorRelDO::getSensorId, sensorId)
+ .eq(RegionSensorRelDO::getDeleteEnum, "FALSE");
+
+ RegionSensorRelDO d = regionSensorRelRepository.getOne(wrapper);
+ if (d == null) {
+ return null;
+ }
+ RegionSensorRelE regionSensorRelE = new RegionSensorRelE();
+ BeanUtils.copyProperties(d, regionSensorRelE);
+ return regionSensorRelE;
+ }
+
+ @Override
+ public Boolean isSensorBound(Long sensorId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(RegionSensorRelDO::getSensorId, sensorId)
+ .eq(RegionSensorRelDO::getDeleteEnum, "FALSE");
+
+ long count = regionSensorRelRepository.count(wrapper);
+ return count > 0;
+ }
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/RiskPointGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/RiskPointGatewayImpl.java
deleted file mode 100644
index 460d218..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/RiskPointGatewayImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.zcloud.gatewayimpl;
-
-import com.zcloud.domain.gateway.RiskPointGateway;
-import com.zcloud.domain.model.RiskPointE;
-import com.zcloud.persistence.dataobject.RiskPointDO;
-import com.zcloud.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/gatewayimpl/SensorDeviceGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/SensorDeviceGatewayImpl.java
new file mode 100644
index 0000000..beb5e8c
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/SensorDeviceGatewayImpl.java
@@ -0,0 +1,53 @@
+package com.zcloud.gatewayimpl;
+
+import com.zcloud.domain.gateway.SensorDeviceGateway;
+import com.zcloud.domain.model.SensorDeviceE;
+import com.zcloud.persistence.dataobject.SensorDeviceDO;
+import com.zcloud.persistence.repository.SensorDeviceRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * SensorDeviceGatewayImpl - 传感器设备网关实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Service
+@AllArgsConstructor
+public class SensorDeviceGatewayImpl implements SensorDeviceGateway {
+
+ private final SensorDeviceRepository sensorDeviceRepository;
+
+ @Override
+ public Long add(SensorDeviceE sensorDeviceE) {
+ SensorDeviceDO d = new SensorDeviceDO();
+ BeanUtils.copyProperties(sensorDeviceE, d);
+ sensorDeviceRepository.save(d);
+ return d.getId();
+ }
+
+ @Override
+ public Boolean update(SensorDeviceE sensorDeviceE) {
+ SensorDeviceDO d = new SensorDeviceDO();
+ BeanUtils.copyProperties(sensorDeviceE, d);
+ sensorDeviceRepository.updateById(d);
+ return true;
+ }
+
+ @Override
+ public Boolean deleteById(Long id) {
+ return sensorDeviceRepository.removeById(id);
+ }
+
+ @Override
+ public SensorDeviceE getById(Long id) {
+ SensorDeviceDO d = sensorDeviceRepository.getById(id);
+ if (d == null) {
+ return null;
+ }
+ SensorDeviceE sensorDeviceE = new SensorDeviceE();
+ BeanUtils.copyProperties(d, sensorDeviceE);
+ return sensorDeviceE;
+ }
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/SensorTypeGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/SensorTypeGatewayImpl.java
new file mode 100644
index 0000000..51d0505
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/gatewayimpl/SensorTypeGatewayImpl.java
@@ -0,0 +1,53 @@
+package com.zcloud.gatewayimpl;
+
+import com.zcloud.domain.gateway.SensorTypeGateway;
+import com.zcloud.domain.model.SensorTypeE;
+import com.zcloud.persistence.dataobject.SensorTypeDO;
+import com.zcloud.persistence.repository.SensorTypeRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * SensorTypeGatewayImpl - 传感器类型网关实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Service
+@AllArgsConstructor
+public class SensorTypeGatewayImpl implements SensorTypeGateway {
+
+ private final SensorTypeRepository sensorTypeRepository;
+
+ @Override
+ public Long add(SensorTypeE sensorTypeE) {
+ SensorTypeDO d = new SensorTypeDO();
+ BeanUtils.copyProperties(sensorTypeE, d);
+ sensorTypeRepository.save(d);
+ return d.getId();
+ }
+
+ @Override
+ public Boolean update(SensorTypeE sensorTypeE) {
+ SensorTypeDO d = new SensorTypeDO();
+ BeanUtils.copyProperties(sensorTypeE, d);
+ sensorTypeRepository.updateById(d);
+ return true;
+ }
+
+ @Override
+ public Boolean deleteById(Long id) {
+ return sensorTypeRepository.removeById(id);
+ }
+
+ @Override
+ public SensorTypeE getById(Long id) {
+ SensorTypeDO d = sensorTypeRepository.getById(id);
+ if (d == null) {
+ return null;
+ }
+ SensorTypeE sensorTypeE = new SensorTypeE();
+ BeanUtils.copyProperties(d, sensorTypeE);
+ return sensorTypeE;
+ }
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmDisposeLogDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmDisposeLogDO.java
new file mode 100644
index 0000000..dc49dc4
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmDisposeLogDO.java
@@ -0,0 +1,62 @@
+package com.zcloud.persistence.dataobject;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jjb.saas.framework.repository.basedo.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * AlarmDisposeLogDO - 报警处置日志数据对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@TableName("iot_alarm_disposal_log")
+@EqualsAndHashCode(callSuper = true)
+public class AlarmDisposeLogDO extends BaseDO {
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String alarmDisposalLogId;
+
+ @ApiModelProperty(value = "报警主键ID")
+ private Long alarmId;
+
+ @ApiModelProperty(value = "报警编号(32位)")
+ private String alarmNo;
+
+ @ApiModelProperty(value = "操作类型 AUTO_ASSIGN/MANUAL_ASSIGN/DISPOSE/INVALID")
+ private String actionType;
+
+ @ApiModelProperty(value = "变更前状态")
+ private Integer beforeStatus;
+
+ @ApiModelProperty(value = "变更后状态")
+ private Integer afterStatus;
+
+ @ApiModelProperty(value = "操作人ID")
+ private Long operatorId;
+
+ @ApiModelProperty(value = "操作说明")
+ private String actionDesc;
+
+ @ApiModelProperty(value = "处置结果")
+ private String resultText;
+
+ @ApiModelProperty(value = "附件图片")
+ private String pictureUrls;
+
+ @ApiModelProperty(value = "操作时间")
+ private String actionTime;
+
+ @ApiModelProperty(value = "删除标识")
+ @TableLogic
+ private String deleteEnum = "FALSE";
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmRecordDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmRecordDO.java
new file mode 100644
index 0000000..6f7d8c0
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/AlarmRecordDO.java
@@ -0,0 +1,112 @@
+package com.zcloud.persistence.dataobject;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jjb.saas.framework.repository.basedo.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * AlarmRecordDO - 报警记录数据对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@TableName("iot_alarm_record")
+@EqualsAndHashCode(callSuper = true)
+public class AlarmRecordDO extends BaseDO {
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String alarmRecordId;
+
+ @ApiModelProperty(value = "报警编号(32位)")
+ private String alarmNo;
+
+ @ApiModelProperty(value = "报警来源 THRESHOLD/DCS")
+ private String alarmSource;
+
+ @ApiModelProperty(value = "设备来源描述快照")
+ private String deviceSourceDesc;
+
+ @ApiModelProperty(value = "传感器ID")
+ private Long sensorId;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "消防区域ID")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "当前负责人ID")
+ private Long managerId;
+
+ @ApiModelProperty(value = "报警级别")
+ private String alarmLevel;
+
+ @ApiModelProperty(value = "报警类型")
+ private String alarmType;
+
+ @ApiModelProperty(value = "阈值类型 HIGH/HIGH_HIGH/LOW/LOW_LOW")
+ private String thresholdType;
+
+ @ApiModelProperty(value = "告警值")
+ private BigDecimal currentValue;
+
+ @ApiModelProperty(value = "比较方向 UP/DOWN")
+ private String compareFlag;
+
+ @ApiModelProperty(value = "单位")
+ private String unitName;
+
+ @ApiModelProperty(value = "报警描述")
+ private String alarmDesc;
+
+ @ApiModelProperty(value = "报警时间")
+ private String alarmTime;
+
+ @ApiModelProperty(value = "当前状态 10待研判/20待处置/30已消警/40误报")
+ private Integer status;
+
+ @ApiModelProperty(value = "分配时间")
+ private String assignTime;
+
+ @ApiModelProperty(value = "处置时间")
+ private String disposeTime;
+
+ @ApiModelProperty(value = "处置人ID")
+ private Long disposeUserId;
+
+ @ApiModelProperty(value = "当前处置结果快照")
+ private String disposeResult;
+
+ @ApiModelProperty(value = "当前处置说明快照")
+ private String disposeRemark;
+
+ @ApiModelProperty(value = "图片地址")
+ private String pictureUrls;
+
+ @ApiModelProperty(value = "外部记录唯一键")
+ private String sourceRecordKey;
+
+ @ApiModelProperty(value = "是否活跃告警")
+ private Integer activeFlag;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "删除标识")
+ @TableLogic
+ private String deleteEnum = "FALSE";
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/DeviceRegionDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/DeviceRegionDO.java
new file mode 100644
index 0000000..7c2767d
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/DeviceRegionDO.java
@@ -0,0 +1,50 @@
+package com.zcloud.persistence.dataobject;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jjb.saas.framework.repository.basedo.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * DeviceRegionDO - 设备区域数据对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@TableName("iot_alarm_region_config")
+@EqualsAndHashCode(callSuper = true)
+public class DeviceRegionDO extends BaseDO {
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String regionConfigId;
+
+ @ApiModelProperty(value = "外部消防区域主键")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "外部消防区域编码")
+ private String fireRegionCode;
+
+ @ApiModelProperty(value = "负责部门ID")
+ private Long departmentId;
+
+ @ApiModelProperty(value = "负责人ID")
+ private Long managerId;
+
+ @ApiModelProperty(value = "状态 1启用0停用")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "删除标识")
+ @TableLogic
+ private String deleteEnum = "FALSE";
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/RegionSensorRelDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/RegionSensorRelDO.java
new file mode 100644
index 0000000..85c01e2
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/RegionSensorRelDO.java
@@ -0,0 +1,44 @@
+package com.zcloud.persistence.dataobject;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jjb.saas.framework.repository.basedo.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * RegionSensorRelDO - 区域传感器关系数据对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@TableName("iot_alarm_region_sensor_rel")
+@EqualsAndHashCode(callSuper = true)
+public class RegionSensorRelDO extends BaseDO {
+
+ @ApiModelProperty(value = "业务ID(32位)")
+ private String regionSensorRelId;
+
+ @ApiModelProperty(value = "区域配置主键ID")
+ private Long regionConfigId;
+
+ @ApiModelProperty(value = "外部消防区域ID")
+ private Long fireRegionId;
+
+ @ApiModelProperty(value = "传感器ID")
+ private Long sensorId;
+
+ @ApiModelProperty(value = "传感器编码快照")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "删除标识")
+ @TableLogic
+ private String deleteEnum = "FALSE";
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/RiskPointDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/RiskPointDO.java
deleted file mode 100644
index 7776a91..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/RiskPointDO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.zcloud.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/persistence/dataobject/SensorDeviceDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/SensorDeviceDO.java
new file mode 100644
index 0000000..f1b6c64
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/SensorDeviceDO.java
@@ -0,0 +1,92 @@
+package com.zcloud.persistence.dataobject;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jjb.saas.framework.repository.basedo.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * SensorDeviceDO - 传感器设备数据对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@TableName("iot_alarm_sensor_device")
+@EqualsAndHashCode(callSuper = true)
+public class SensorDeviceDO extends BaseDO {
+
+ @ApiModelProperty(value = "传感器设备业务ID")
+ private String sensorDeviceId;
+
+ @ApiModelProperty(value = "传感器编码")
+ private String sensorCode;
+
+ @ApiModelProperty(value = "传感器名称")
+ private String sensorName;
+
+ @ApiModelProperty(value = "传感器类型主键ID")
+ private Long sensorTypeId;
+
+ @ApiModelProperty(value = "传感器属性快照(NUMBER/SWITCH)")
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "安装位置")
+ private String installPosition;
+
+ @ApiModelProperty(value = "传感器状态")
+ private String sensorStatus;
+
+ @ApiModelProperty(value = "是否定位(0否1是)")
+ private Integer positioningFlag;
+
+ @ApiModelProperty(value = "报警开关(1开0关)")
+ private Integer alarmSwitch;
+
+ @ApiModelProperty(value = "是否阈值设定(0否1是)")
+ private Integer thresholdFlag;
+
+ @ApiModelProperty(value = "单位")
+ private String unitName;
+
+ @ApiModelProperty(value = "量程下限")
+ private String rangeMin;
+
+ @ApiModelProperty(value = "量程上限")
+ private String rangeMax;
+
+ @ApiModelProperty(value = "低低报阈值")
+ private String thresholdLowLow;
+
+ @ApiModelProperty(value = "低报阈值")
+ private String thresholdLow;
+
+ @ApiModelProperty(value = "高报阈值")
+ private String thresholdHigh;
+
+ @ApiModelProperty(value = "高高报阈值")
+ private String thresholdHighHigh;
+
+ @ApiModelProperty(value = "连续报警确认次数")
+ private Integer continuousAlarmCount;
+
+ @ApiModelProperty(value = "出厂日期")
+ private String factoryDate;
+
+ @ApiModelProperty(value = "企业侧源编码")
+ private String enterpriseSourceCode;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "删除标识")
+ @TableLogic
+ private String deleteEnum = "FALSE";
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/SensorTypeDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/SensorTypeDO.java
new file mode 100644
index 0000000..9b82f15
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/dataobject/SensorTypeDO.java
@@ -0,0 +1,50 @@
+package com.zcloud.persistence.dataobject;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jjb.saas.framework.repository.basedo.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * SensorTypeDO - 传感器类型数据对象
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Data
+@TableName("iot_alarm_sensor_type")
+@EqualsAndHashCode(callSuper = true)
+public class SensorTypeDO extends BaseDO {
+
+ @ApiModelProperty(value = "传感器类型业务ID")
+ private String sensorTypeId;
+
+ @ApiModelProperty(value = "类型编码")
+ private String typeCode;
+
+ @ApiModelProperty(value = "类型名称")
+ private String typeName;
+
+ @ApiModelProperty(value = "传感器属性(NUMBER/SWITCH)")
+ private String sensorAttr;
+
+ @ApiModelProperty(value = "排序")
+ private Integer sortNo;
+
+ @ApiModelProperty(value = "状态(1:启用 0:停用)")
+ private Integer status;
+
+ @ApiModelProperty(value = "备注")
+ private String remarks;
+
+ @ApiModelProperty(value = "删除标识")
+ @TableLogic
+ private String deleteEnum = "FALSE";
+
+ @ApiModelProperty(value = "租户ID")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "组织ID")
+ private Long orgId;
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/domainobject/RiskPointDO.java b/web-infrastructure/src/main/java/com/zcloud/persistence/domainobject/RiskPointDO.java
deleted file mode 100644
index b72f86a..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/persistence/domainobject/RiskPointDO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.zcloud.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/persistence/mapper/AlarmDisposeLogMapper.java b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/AlarmDisposeLogMapper.java
new file mode 100644
index 0000000..6d914ce
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/AlarmDisposeLogMapper.java
@@ -0,0 +1,13 @@
+package com.zcloud.persistence.mapper;
+
+import com.zcloud.persistence.dataobject.AlarmDisposeLogDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * AlarmDisposeLogMapper - 报警处置日志Mapper
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Mapper
+public interface AlarmDisposeLogMapper extends BaseMapper {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/AlarmRecordMapper.java b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/AlarmRecordMapper.java
new file mode 100644
index 0000000..e782410
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/AlarmRecordMapper.java
@@ -0,0 +1,13 @@
+package com.zcloud.persistence.mapper;
+
+import com.zcloud.persistence.dataobject.AlarmRecordDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * AlarmRecordMapper - 报警记录Mapper
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Mapper
+public interface AlarmRecordMapper extends BaseMapper {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/DeviceRegionMapper.java b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/DeviceRegionMapper.java
new file mode 100644
index 0000000..781992b
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/DeviceRegionMapper.java
@@ -0,0 +1,13 @@
+package com.zcloud.persistence.mapper;
+
+import com.zcloud.persistence.dataobject.DeviceRegionDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * DeviceRegionMapper - 设备区域Mapper
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Mapper
+public interface DeviceRegionMapper extends BaseMapper {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/RegionSensorRelMapper.java b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/RegionSensorRelMapper.java
new file mode 100644
index 0000000..dabd8c0
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/RegionSensorRelMapper.java
@@ -0,0 +1,13 @@
+package com.zcloud.persistence.mapper;
+
+import com.zcloud.persistence.dataobject.RegionSensorRelDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * RegionSensorRelMapper - 区域传感器关系Mapper
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Mapper
+public interface RegionSensorRelMapper extends BaseMapper {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/RiskPointMapper.java b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/RiskPointMapper.java
deleted file mode 100644
index 2872391..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/RiskPointMapper.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.zcloud.persistence.mapper;
-
-import com.zcloud.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/persistence/mapper/SensorDeviceMapper.java b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/SensorDeviceMapper.java
new file mode 100644
index 0000000..3aa52a7
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/SensorDeviceMapper.java
@@ -0,0 +1,13 @@
+package com.zcloud.persistence.mapper;
+
+import com.zcloud.persistence.dataobject.SensorDeviceDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * SensorDeviceMapper - 传感器设备Mapper
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Mapper
+public interface SensorDeviceMapper extends BaseMapper {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/SensorTypeMapper.java b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/SensorTypeMapper.java
new file mode 100644
index 0000000..493c37b
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/mapper/SensorTypeMapper.java
@@ -0,0 +1,13 @@
+package com.zcloud.persistence.mapper;
+
+import com.zcloud.persistence.dataobject.SensorTypeDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * SensorTypeMapper - 传感器类型Mapper
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Mapper
+public interface SensorTypeMapper extends BaseMapper {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/AlarmDisposeLogRepository.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/AlarmDisposeLogRepository.java
new file mode 100644
index 0000000..87d3596
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/AlarmDisposeLogRepository.java
@@ -0,0 +1,11 @@
+package com.zcloud.persistence.repository;
+
+import com.zcloud.persistence.dataobject.AlarmDisposeLogDO;
+import com.jjb.saas.framework.repository.repo.BaseRepository;
+
+/**
+ * AlarmDisposeLogRepository - 报警处置日志仓储接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface AlarmDisposeLogRepository extends BaseRepository {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/AlarmRecordRepository.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/AlarmRecordRepository.java
new file mode 100644
index 0000000..61f8e62
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/AlarmRecordRepository.java
@@ -0,0 +1,11 @@
+package com.zcloud.persistence.repository;
+
+import com.zcloud.persistence.dataobject.AlarmRecordDO;
+import com.jjb.saas.framework.repository.repo.BaseRepository;
+
+/**
+ * AlarmRecordRepository - 报警记录仓储接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface AlarmRecordRepository extends BaseRepository {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/DeviceRegionRepository.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/DeviceRegionRepository.java
new file mode 100644
index 0000000..4080ffd
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/DeviceRegionRepository.java
@@ -0,0 +1,11 @@
+package com.zcloud.persistence.repository;
+
+import com.zcloud.persistence.dataobject.DeviceRegionDO;
+import com.jjb.saas.framework.repository.repo.BaseRepository;
+
+/**
+ * DeviceRegionRepository - 设备区域仓储接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface DeviceRegionRepository extends BaseRepository {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/RegionSensorRelRepository.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/RegionSensorRelRepository.java
new file mode 100644
index 0000000..481c7e9
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/RegionSensorRelRepository.java
@@ -0,0 +1,11 @@
+package com.zcloud.persistence.repository;
+
+import com.zcloud.persistence.dataobject.RegionSensorRelDO;
+import com.jjb.saas.framework.repository.repo.BaseRepository;
+
+/**
+ * RegionSensorRelRepository - 区域传感器关系仓储接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface RegionSensorRelRepository extends BaseRepository {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/RiskPointRepository.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/RiskPointRepository.java
deleted file mode 100644
index cf6609c..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/RiskPointRepository.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.zcloud.persistence.repository;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.zcloud.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/persistence/repository/SensorDeviceRepository.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/SensorDeviceRepository.java
new file mode 100644
index 0000000..d77d368
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/SensorDeviceRepository.java
@@ -0,0 +1,11 @@
+package com.zcloud.persistence.repository;
+
+import com.zcloud.persistence.dataobject.SensorDeviceDO;
+import com.jjb.saas.framework.repository.repo.BaseRepository;
+
+/**
+ * SensorDeviceRepository - 传感器设备仓储接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface SensorDeviceRepository extends BaseRepository {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/SensorTypeRepository.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/SensorTypeRepository.java
new file mode 100644
index 0000000..984ce68
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/SensorTypeRepository.java
@@ -0,0 +1,11 @@
+package com.zcloud.persistence.repository;
+
+import com.zcloud.persistence.dataobject.SensorTypeDO;
+import com.jjb.saas.framework.repository.repo.BaseRepository;
+
+/**
+ * SensorTypeRepository - 传感器类型仓储接口
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+public interface SensorTypeRepository extends BaseRepository {}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/RiskPointRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/RiskPointRepositoryImpl.java
deleted file mode 100644
index acbd77c..0000000
--- a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/RiskPointRepositoryImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.zcloud.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.persistence.dataobject.RiskPointDO;
-import com.zcloud.persistence.mapper.RiskPointMapper;
-import com.zcloud.persistence.repository.RiskPointRepository;
-import com.zcloud.utils.PageQueryHelper;
-import com.zcloud.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/java/com/zcloud/persistence/repository/impl/SensorDeviceRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/SensorDeviceRepositoryImpl.java
new file mode 100644
index 0000000..94cc367
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/SensorDeviceRepositoryImpl.java
@@ -0,0 +1,18 @@
+package com.zcloud.persistence.repository.impl;
+
+import com.zcloud.persistence.dataobject.SensorDeviceDO;
+import com.zcloud.persistence.mapper.SensorDeviceMapper;
+import com.zcloud.persistence.repository.SensorDeviceRepository;
+import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * SensorDeviceRepositoryImpl - 传感器设备仓储实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Repository
+@RequiredArgsConstructor
+public class SensorDeviceRepositoryImpl extends BaseRepositoryImpl implements SensorDeviceRepository {
+}
\ No newline at end of file
diff --git a/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/SensorTypeRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/SensorTypeRepositoryImpl.java
new file mode 100644
index 0000000..3cad21e
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/persistence/repository/impl/SensorTypeRepositoryImpl.java
@@ -0,0 +1,18 @@
+package com.zcloud.persistence.repository.impl;
+
+import com.zcloud.persistence.dataobject.SensorTypeDO;
+import com.zcloud.persistence.mapper.SensorTypeMapper;
+import com.zcloud.persistence.repository.SensorTypeRepository;
+import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * SensorTypeRepositoryImpl - 传感器类型仓储实现类
+ * @Author wangyan
+ * @Date 2026-04-03 00:00:00
+ */
+@Repository
+@RequiredArgsConstructor
+public class SensorTypeRepositoryImpl extends BaseRepositoryImpl implements SensorTypeRepository {
+}
\ No newline at end of file
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 e2b6d64..0000000
--- a/web-infrastructure/src/main/resources/mybatis/RiskPointMapper.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
diff --git a/web-infrastructure/src/main/resources/mybatis/mybatis-config.xml b/web-infrastructure/src/main/resources/mybatis/mybatis-config.xml
index f7c8d88..d046e94 100644
--- a/web-infrastructure/src/main/resources/mybatis/mybatis-config.xml
+++ b/web-infrastructure/src/main/resources/mybatis/mybatis-config.xml
@@ -5,6 +5,5 @@
"http://mybatis.org/dtd/mybatis-3-config.dtd">
-
\ No newline at end of file