diff --git a/ruoyi-modules/hwmom-dms/pom.xml b/ruoyi-modules/hwmom-dms/pom.xml
new file mode 100644
index 00000000..2dda9049
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/pom.xml
@@ -0,0 +1,137 @@
+
+
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+
+ 4.0.0
+
+ hwmom-dms
+
+
+ hwmom-dms设备模块
+
+
+
+
+
+ org.dromara
+ ruoyi-common-nacos
+
+
+
+ org.dromara
+ ruoyi-common-sentinel
+
+
+
+
+ org.dromara
+ ruoyi-common-log
+
+
+
+ org.dromara
+ ruoyi-common-dict
+
+
+
+ org.dromara
+ ruoyi-common-doc
+
+
+
+ org.dromara
+ ruoyi-common-web
+
+
+
+ org.dromara
+ ruoyi-common-mybatis
+
+
+
+ org.dromara
+ ruoyi-common-dubbo
+
+
+
+ org.dromara
+ ruoyi-common-seata
+
+
+
+ org.dromara
+ ruoyi-common-idempotent
+
+
+
+ org.dromara
+ ruoyi-common-tenant
+
+
+
+ org.dromara
+ ruoyi-common-security
+
+
+
+ org.dromara
+ ruoyi-common-translation
+
+
+
+ org.dromara
+ ruoyi-common-sensitive
+
+
+
+ org.dromara
+ ruoyi-common-encrypt
+
+
+
+
+ org.dromara
+ ruoyi-api-system
+
+
+
+ org.dromara
+ ruoyi-api-resource
+
+
+
+
+
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/HwMomDmsApplication.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/HwMomDmsApplication.java
new file mode 100644
index 00000000..b2560f67
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/HwMomDmsApplication.java
@@ -0,0 +1,22 @@
+package org.dromara.dms;
+
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+/**
+ * DMS设备模块
+ *
+ * @author ruoyi
+ */
+@EnableDubbo
+@SpringBootApplication
+public class HwMomDmsApplication {
+ public static void main(String[] args) {
+ SpringApplication application = new SpringApplication(HwMomDmsApplication.class);
+ application.setApplicationStartup(new BufferingApplicationStartup(2048));
+ application.run(args);
+ System.out.println("(♥◠‿◠)ノ゙ HwDms启动成功 ლ(´ڡ`ლ)゙ ");
+ }
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeController.java
new file mode 100644
index 00000000..21e595a0
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeController.java
@@ -0,0 +1,117 @@
+package org.dromara.dms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.dms.domain.vo.DmsDeviceModeVo;
+import org.dromara.dms.domain.bo.DmsDeviceModeBo;
+import org.dromara.dms.service.IDmsDeviceModeService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 设备模型
+ * 前端访问路由地址为:/dms/deviceMode
+ *
+ * @author Yinq
+ * @date 2025-03-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/deviceMode")
+public class DmsDeviceModeController extends BaseController {
+
+ private final IDmsDeviceModeService dmsDeviceModeService;
+
+ /**
+ * 查询设备模型列表
+ */
+ @SaCheckPermission("dms:deviceMode:list")
+ @GetMapping("/list")
+ public TableDataInfo list(DmsDeviceModeBo bo, PageQuery pageQuery) {
+ return dmsDeviceModeService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出设备模型列表
+ */
+ @SaCheckPermission("dms:deviceMode:export")
+ @Log(title = "设备模型", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(DmsDeviceModeBo bo, HttpServletResponse response) {
+ List list = dmsDeviceModeService.queryList(bo);
+ ExcelUtil.exportExcel(list, "设备模型", DmsDeviceModeVo.class, response);
+ }
+
+ /**
+ * 获取设备模型详细信息
+ *
+ * @param deviceModeId 主键
+ */
+ @SaCheckPermission("dms:deviceMode:query")
+ @GetMapping("/{deviceModeId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long deviceModeId) {
+ return R.ok(dmsDeviceModeService.queryById(deviceModeId));
+ }
+
+ /**
+ * 新增设备模型
+ */
+ @SaCheckPermission("dms:deviceMode:add")
+ @Log(title = "设备模型", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody DmsDeviceModeBo bo) {
+ return toAjax(dmsDeviceModeService.insertByBo(bo));
+ }
+
+ /**
+ * 修改设备模型
+ */
+ @SaCheckPermission("dms:deviceMode:edit")
+ @Log(title = "设备模型", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody DmsDeviceModeBo bo) {
+ return toAjax(dmsDeviceModeService.updateByBo(bo));
+ }
+
+ /**
+ * 删除设备模型
+ *
+ * @param deviceModeIds 主键串
+ */
+ @SaCheckPermission("dms:deviceMode:remove")
+ @Log(title = "设备模型", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{deviceModeIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] deviceModeIds) {
+ return toAjax(dmsDeviceModeService.deleteWithValidByIds(List.of(deviceModeIds), true));
+ }
+
+
+ /**
+ * 下拉框查询设备模型列表
+ */
+
+ @GetMapping("/getDmsDeviceModeList")
+ public R> getDmsDeviceModeList(DmsDeviceModeBo bo) {
+ List list = dmsDeviceModeService.queryList(bo);
+ return R.ok(list);
+ }
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeFunctionController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeFunctionController.java
new file mode 100644
index 00000000..6e75766d
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeFunctionController.java
@@ -0,0 +1,116 @@
+package org.dromara.dms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo;
+import org.dromara.dms.domain.bo.DmsDeviceModeFunctionBo;
+import org.dromara.dms.service.IDmsDeviceModeFunctionService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 设备模型功能
+ * 前端访问路由地址为:/dms/deviceModeFunction
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/deviceModeFunction")
+public class DmsDeviceModeFunctionController extends BaseController {
+
+ private final IDmsDeviceModeFunctionService dmsDeviceModeFunctionService;
+
+ /**
+ * 查询设备模型功能列表
+ */
+ @SaCheckPermission("dms:deviceModeFunction:list")
+ @GetMapping("/list")
+ public TableDataInfo list(DmsDeviceModeFunctionBo bo, PageQuery pageQuery) {
+ return dmsDeviceModeFunctionService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出设备模型功能列表
+ */
+ @SaCheckPermission("dms:deviceModeFunction:export")
+ @Log(title = "设备模型功能", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(DmsDeviceModeFunctionBo bo, HttpServletResponse response) {
+ List list = dmsDeviceModeFunctionService.queryList(bo);
+ ExcelUtil.exportExcel(list, "设备模型功能", DmsDeviceModeFunctionVo.class, response);
+ }
+
+ /**
+ * 获取设备模型功能详细信息
+ *
+ * @param modeFunctionId 主键
+ */
+ @SaCheckPermission("dms:deviceModeFunction:query")
+ @GetMapping("/{modeFunctionId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long modeFunctionId) {
+ return R.ok(dmsDeviceModeFunctionService.queryById(modeFunctionId));
+ }
+
+ /**
+ * 新增设备模型功能
+ */
+ @SaCheckPermission("dms:deviceModeFunction:add")
+ @Log(title = "设备模型功能", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody DmsDeviceModeFunctionBo bo) {
+ return toAjax(dmsDeviceModeFunctionService.insertByBo(bo));
+ }
+
+ /**
+ * 修改设备模型功能
+ */
+ @SaCheckPermission("dms:deviceModeFunction:edit")
+ @Log(title = "设备模型功能", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody DmsDeviceModeFunctionBo bo) {
+ return toAjax(dmsDeviceModeFunctionService.updateByBo(bo));
+ }
+
+ /**
+ * 删除设备模型功能
+ *
+ * @param modeFunctionIds 主键串
+ */
+ @SaCheckPermission("dms:deviceModeFunction:remove")
+ @Log(title = "设备模型功能", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{modeFunctionIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] modeFunctionIds) {
+ return toAjax(dmsDeviceModeFunctionService.deleteWithValidByIds(List.of(modeFunctionIds), true));
+ }
+
+
+ /**
+ * 下拉框查询设备模型功能列表
+ */
+ @GetMapping("/getDmsDeviceModeFunctionList")
+ public R> getDmsDeviceModeFunctionList(DmsDeviceModeFunctionBo bo) {
+ List list = dmsDeviceModeFunctionService.queryList(bo);
+ return R.ok(list);
+ }
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeParameterController.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeParameterController.java
new file mode 100644
index 00000000..18c90616
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/controller/DmsDeviceModeParameterController.java
@@ -0,0 +1,116 @@
+package org.dromara.dms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo;
+import org.dromara.dms.domain.bo.DmsDeviceModeParameterBo;
+import org.dromara.dms.service.IDmsDeviceModeParameterService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 设备参数
+ * 前端访问路由地址为:/dms/deviceModeParameter
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/deviceModeParameter")
+public class DmsDeviceModeParameterController extends BaseController {
+
+ private final IDmsDeviceModeParameterService dmsDeviceModeParameterService;
+
+ /**
+ * 查询设备参数列表
+ */
+ @SaCheckPermission("dms:deviceModeParameter:list")
+ @GetMapping("/list")
+ public TableDataInfo list(DmsDeviceModeParameterBo bo, PageQuery pageQuery) {
+ return dmsDeviceModeParameterService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出设备参数列表
+ */
+ @SaCheckPermission("dms:deviceModeParameter:export")
+ @Log(title = "设备参数", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(DmsDeviceModeParameterBo bo, HttpServletResponse response) {
+ List list = dmsDeviceModeParameterService.queryList(bo);
+ ExcelUtil.exportExcel(list, "设备参数", DmsDeviceModeParameterVo.class, response);
+ }
+
+ /**
+ * 获取设备参数详细信息
+ *
+ * @param modeParameterId 主键
+ */
+ @SaCheckPermission("dms:deviceModeParameter:query")
+ @GetMapping("/{modeParameterId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long modeParameterId) {
+ return R.ok(dmsDeviceModeParameterService.queryById(modeParameterId));
+ }
+
+ /**
+ * 新增设备参数
+ */
+ @SaCheckPermission("dms:deviceModeParameter:add")
+ @Log(title = "设备参数", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody DmsDeviceModeParameterBo bo) {
+ return toAjax(dmsDeviceModeParameterService.insertByBo(bo));
+ }
+
+ /**
+ * 修改设备参数
+ */
+ @SaCheckPermission("dms:deviceModeParameter:edit")
+ @Log(title = "设备参数", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody DmsDeviceModeParameterBo bo) {
+ return toAjax(dmsDeviceModeParameterService.updateByBo(bo));
+ }
+
+ /**
+ * 删除设备参数
+ *
+ * @param modeParameterIds 主键串
+ */
+ @SaCheckPermission("dms:deviceModeParameter:remove")
+ @Log(title = "设备参数", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{modeParameterIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] modeParameterIds) {
+ return toAjax(dmsDeviceModeParameterService.deleteWithValidByIds(List.of(modeParameterIds), true));
+ }
+
+
+ /**
+ * 下拉框查询设备参数列表
+ */
+ @GetMapping("/getDmsDeviceModeParameterList")
+ public R> getDmsDeviceModeParameterList(DmsDeviceModeParameterBo bo) {
+ List list = dmsDeviceModeParameterService.queryList(bo);
+ return R.ok(list);
+ }
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceMode.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceMode.java
new file mode 100644
index 00000000..1ed27f82
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceMode.java
@@ -0,0 +1,52 @@
+package org.dromara.dms.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 设备模型对象 dms_device_mode
+ *
+ * @author Yinq
+ * @date 2025-03-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("dms_device_mode")
+public class DmsDeviceMode extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备模型ID
+ */
+ @TableId(value = "device_mode_id", type = IdType.AUTO)
+ private Long deviceModeId;
+
+ /**
+ * 设备模型名称
+ */
+ private String deviceModeName;
+
+ /**
+ * 设备模型状态(1:启用,9:删除)
+ */
+ @TableLogic(value="1", delval="9")
+ private String deviceModeStatus;
+
+ /**
+ * 设备模型图片地址
+ */
+ private String deviceModePic;
+
+ /**
+ * 场景描述
+ */
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeFunction.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeFunction.java
new file mode 100644
index 00000000..c3eb829d
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeFunction.java
@@ -0,0 +1,128 @@
+package org.dromara.dms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * 设备模型功能对象 dms_device_mode_function
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Data
+@TableName("dms_device_mode_function")
+public class DmsDeviceModeFunction {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备模型功能ID
+ */
+ @TableId(value = "mode_function_id", type = IdType.AUTO)
+ private Long modeFunctionId;
+
+ /**
+ * 设备模型ID,关联表hw_device_mode的device_mode_id
+ */
+ private Long deviceModeId;
+
+ /**
+ * 功能模式(1、属性,2、服务,3、事件)
+ */
+ private String functionMode;
+
+ /**
+ * 坐标标识(1、经度,2、纬度)
+ */
+ private String coordinate;
+
+ /**
+ * 功能名称
+ */
+ private String functionName;
+
+ /**
+ * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)
+ */
+ private String functionIdentifier;
+
+ /**
+ * 功能类型(1、直采变量 2、手录变量 3、运算性变量)
+ */
+ private String functionType;
+
+ /**
+ * 数据类型(2、int,4、float,5、double,6、binary(image/base64),9、bool,10、string)
+ */
+ private Long dataType;
+
+ /**
+ * 数据定义
+ */
+ private String dataDefinition;
+
+ /**
+ * 运算性变量公式(标识符1*标识符2*100)
+ */
+ private String functionFormula;
+
+ /**
+ * 单位
+ */
+ private String propertyUnit;
+
+ /**
+ * 显示标识(0、不显示,1、显示,2、可累积显示)
+ */
+ private String displayFlag;
+
+ /**
+ * 读写标识(1、读写,2、只读)
+ */
+ private String rwFlag;
+
+ /**
+ * 调用方式(1、异步,2、同步),当功能模式为服务时必填
+ */
+ private String invokeMethod;
+
+ /**
+ * 事件类型(1、信息,2、告警,3、故障),当功能类型为事件时必填
+ */
+ private String eventType;
+
+ /**
+ * 描述
+ */
+ private String remark;
+
+ /**
+ * 获取公式
+ */
+ private String acquisitionFormula;
+
+ /**
+ * 预留字段,顺序
+ */
+ private Long orderFlag;
+
+ /**
+ * 预留字段,寄存器
+ */
+ private String deviceRegister;
+
+ /**
+ * 预留字段,步长
+ */
+ private Long propertyStep;
+
+ /**
+ * 预留字段
+ */
+ private String propertyField;
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeParameter.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeParameter.java
new file mode 100644
index 00000000..a472f4c4
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/DmsDeviceModeParameter.java
@@ -0,0 +1,75 @@
+package org.dromara.dms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 设备参数对象 dms_device_mode_parameter
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Data
+@TableName("dms_device_mode_parameter")
+public class DmsDeviceModeParameter {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备属性参数ID
+ */
+ @TableId(value = "mode_parameter_id", type = IdType.AUTO)
+ private Long modeParameterId;
+
+ /**
+ * 设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id
+ */
+ private Long modeFunctionId;
+
+ /**
+ * 设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段
+ */
+ private Long releatedParameterId;
+
+ /**
+ * 参数类型(1、输入参数,2、输出参数)
+ */
+ private String parameterType;
+
+ /**
+ * 参数名称
+ */
+ private String parameterName;
+
+ /**
+ * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)
+ */
+ private String parameterIdentifier;
+
+ /**
+ * 数据类型(在平台字典表中定义)
+ */
+ private Long dataType;
+
+ /**
+ * 数据定义
+ */
+ private String dataDefinition;
+
+ /**
+ * 单位
+ */
+ private String propertyUnit;
+
+ /**
+ * 预留字段,步长
+ */
+ private Long propertyStep;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeBo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeBo.java
new file mode 100644
index 00000000..ebc170ee
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeBo.java
@@ -0,0 +1,50 @@
+package org.dromara.dms.domain.bo;
+
+import org.dromara.dms.domain.DmsDeviceMode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 设备模型业务对象 dms_device_mode
+ *
+ * @author Yinq
+ * @date 2025-03-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = DmsDeviceMode.class, reverseConvertGenerate = false)
+public class DmsDeviceModeBo extends BaseEntity {
+
+ /**
+ * 设备模型ID
+ */
+ private Long deviceModeId;
+
+ /**
+ * 设备模型名称
+ */
+ @NotBlank(message = "设备模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String deviceModeName;
+
+ /**
+ * 设备模型状态(1:启用,9:删除)
+ */
+ private String deviceModeStatus;
+
+ /**
+ * 设备模型图片地址
+ */
+ private String deviceModePic;
+
+ /**
+ * 场景描述
+ */
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeFunctionBo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeFunctionBo.java
new file mode 100644
index 00000000..a8e68ff5
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeFunctionBo.java
@@ -0,0 +1,131 @@
+package org.dromara.dms.domain.bo;
+
+import org.dromara.dms.domain.DmsDeviceModeFunction;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 设备模型功能业务对象 dms_device_mode_function
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = DmsDeviceModeFunction.class, reverseConvertGenerate = false)
+public class DmsDeviceModeFunctionBo extends BaseEntity {
+
+ /**
+ * 设备模型功能ID
+ */
+ private Long modeFunctionId;
+
+ /**
+ * 设备模型ID,关联表hw_device_mode的device_mode_id
+ */
+ private Long deviceModeId;
+
+ /**
+ * 功能模式(1、属性,2、服务,3、事件)
+ */
+ @NotBlank(message = "功能模式(1、属性,2、服务,3、事件)不能为空", groups = {AddGroup.class, EditGroup.class})
+ private String functionMode;
+
+ /**
+ * 坐标标识(1、经度,2、纬度)
+ */
+ private String coordinate;
+
+ /**
+ * 功能名称
+ */
+ @NotBlank(message = "功能名称不能为空", groups = {AddGroup.class, EditGroup.class})
+ private String functionName;
+
+ /**
+ * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)
+ */
+ private String functionIdentifier;
+
+ /**
+ * 功能类型(1、直采变量 2、手录变量 3、运算性变量)
+ */
+ private String functionType;
+
+ /**
+ * 数据类型(2、int,4、float,5、double,6、binary(image/base64),9、bool,10、string)
+ */
+ private Long dataType;
+
+ /**
+ * 数据定义
+ */
+ private String dataDefinition;
+
+ /**
+ * 运算性变量公式(标识符1*标识符2*100)
+ */
+ private String functionFormula;
+
+ /**
+ * 单位
+ */
+ private String propertyUnit;
+
+ /**
+ * 显示标识(0、不显示,1、显示,2、可累积显示)
+ */
+ private String displayFlag;
+
+ /**
+ * 读写标识(1、读写,2、只读)
+ */
+ private String rwFlag;
+
+ /**
+ * 调用方式(1、异步,2、同步),当功能模式为服务时必填
+ */
+ private String invokeMethod;
+
+ /**
+ * 事件类型(1、信息,2、告警,3、故障),当功能类型为事件时必填
+ */
+ private String eventType;
+
+ /**
+ * 描述
+ */
+ private String remark;
+
+ /**
+ * 获取公式
+ */
+ private String acquisitionFormula;
+
+ /**
+ * 预留字段,顺序
+ */
+ private Long orderFlag;
+
+ /**
+ * 预留字段,寄存器
+ */
+ private String deviceRegister;
+
+ /**
+ * 预留字段,步长
+ */
+ private Long propertyStep;
+
+ /**
+ * 预留字段
+ */
+ private String propertyField;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeParameterBo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeParameterBo.java
new file mode 100644
index 00000000..2583de03
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/bo/DmsDeviceModeParameterBo.java
@@ -0,0 +1,77 @@
+package org.dromara.dms.domain.bo;
+
+import org.dromara.dms.domain.DmsDeviceModeParameter;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 设备参数业务对象 dms_device_mode_parameter
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = DmsDeviceModeParameter.class, reverseConvertGenerate = false)
+public class DmsDeviceModeParameterBo extends BaseEntity {
+
+ /**
+ * 设备属性参数ID
+ */
+ private Long modeParameterId;
+
+ /**
+ * 设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id
+ */
+ private Long modeFunctionId;
+
+ /**
+ * 设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段
+ */
+ private Long releatedParameterId;
+
+ /**
+ * 参数类型(1、输入参数,2、输出参数)
+ */
+ @NotBlank(message = "参数类型(1、输入参数,2、输出参数)不能为空", groups = {AddGroup.class, EditGroup.class})
+ private String parameterType;
+
+ /**
+ * 参数名称
+ */
+ @NotBlank(message = "参数名称不能为空", groups = {AddGroup.class, EditGroup.class})
+ private String parameterName;
+
+ /**
+ * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)
+ */
+ @NotBlank(message = "标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)不能为空", groups = {AddGroup.class, EditGroup.class})
+ private String parameterIdentifier;
+
+ /**
+ * 数据类型(在平台字典表中定义)
+ */
+ private Long dataType;
+
+ /**
+ * 数据定义
+ */
+ private String dataDefinition;
+
+ /**
+ * 单位
+ */
+ private String propertyUnit;
+
+ /**
+ * 预留字段,步长
+ */
+ private Long propertyStep;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeFunctionVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeFunctionVo.java
new file mode 100644
index 00000000..d4575f39
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeFunctionVo.java
@@ -0,0 +1,168 @@
+package org.dromara.dms.domain.vo;
+
+import org.dromara.dms.domain.DmsDeviceModeFunction;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 设备模型功能视图对象 dms_device_mode_function
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = DmsDeviceModeFunction.class)
+public class DmsDeviceModeFunctionVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备模型功能ID
+ */
+ @ExcelProperty(value = "设备模型功能ID")
+ private Long modeFunctionId;
+
+ /**
+ * 设备模型ID,关联表hw_device_mode的device_mode_id
+ */
+ @ExcelProperty(value = "设备模型ID,关联表hw_device_mode的device_mode_id")
+ private Long deviceModeId;
+
+ /**
+ * 功能模式(1、属性,2、服务,3、事件)
+ */
+ @ExcelProperty(value = "功能模式", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_function_mode")
+ private String functionMode;
+
+ /**
+ * 坐标标识(1、经度,2、纬度)
+ */
+ @ExcelProperty(value = "坐标标识", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_coordinate")
+ private String coordinate;
+
+ /**
+ * 功能名称
+ */
+ @ExcelProperty(value = "功能名称")
+ private String functionName;
+
+ /**
+ * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)
+ */
+ @ExcelProperty(value = "标识符", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "支=持大小写字母、数字和下划线,对外暂时不超过50个字符")
+ private String functionIdentifier;
+
+ /**
+ * 功能类型(1、直采变量 2、手录变量 3、运算性变量)
+ */
+ @ExcelProperty(value = "功能类型(1、直采变量 2、手录变量 3、运算性变量)", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_function_type")
+ private String functionType;
+
+ /**
+ * 数据类型(2、int,4、float,5、double,6、binary(image/base64),9、bool,10、string)
+ */
+ @ExcelProperty(value = "数据类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_data_type")
+ private Long dataType;
+
+ /**
+ * 数据定义
+ */
+ @ExcelProperty(value = "数据定义")
+ private String dataDefinition;
+
+ /**
+ * 运算性变量公式(标识符1*标识符2*100)
+ */
+ @ExcelProperty(value = "运算性变量公式", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "标=识符1*标识符2*100")
+ private String functionFormula;
+
+ /**
+ * 单位
+ */
+ @ExcelProperty(value = "单位")
+ private String propertyUnit;
+
+ /**
+ * 显示标识(0、不显示,1、显示,2、可累积显示)
+ */
+ @ExcelProperty(value = "显示标识", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_display_flag")
+ private String displayFlag;
+
+ /**
+ * 读写标识(1、读写,2、只读)
+ */
+ @ExcelProperty(value = "读写标识", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_rw_flag")
+ private String rwFlag;
+
+ /**
+ * 调用方式(1、异步,2、同步),当功能模式为服务时必填
+ */
+ @ExcelProperty(value = "调用方式", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_invoke_method")
+ private String invokeMethod;
+
+ /**
+ * 事件类型(1、信息,2、告警,3、故障),当功能类型为事件时必填
+ */
+ @ExcelProperty(value = "事件类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_event_type")
+ private String eventType;
+
+ /**
+ * 描述
+ */
+ @ExcelProperty(value = "描述")
+ private String remark;
+
+ /**
+ * 获取公式
+ */
+ @ExcelProperty(value = "获取公式")
+ private String acquisitionFormula;
+
+ /**
+ * 预留字段,顺序
+ */
+ @ExcelProperty(value = "预留字段,顺序")
+ private Long orderFlag;
+
+ /**
+ * 预留字段,寄存器
+ */
+ @ExcelProperty(value = "预留字段,寄存器")
+ private String deviceRegister;
+
+ /**
+ * 预留字段,步长
+ */
+ @ExcelProperty(value = "预留字段,步长")
+ private Long propertyStep;
+
+ /**
+ * 预留字段
+ */
+ @ExcelProperty(value = "预留字段")
+ private String propertyField;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeParameterVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeParameterVo.java
new file mode 100644
index 00000000..e18a3f88
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeParameterVo.java
@@ -0,0 +1,95 @@
+package org.dromara.dms.domain.vo;
+
+import org.dromara.dms.domain.DmsDeviceModeParameter;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 设备参数视图对象 dms_device_mode_parameter
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = DmsDeviceModeParameter.class)
+public class DmsDeviceModeParameterVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备属性参数ID
+ */
+ @ExcelProperty(value = "设备属性参数ID")
+ private Long modeParameterId;
+
+ /**
+ * 设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id
+ */
+ @ExcelProperty(value = "设备模型功能ID,关联表hw_device_mode_function的字段mode_function_id")
+ private Long modeFunctionId;
+
+ /**
+ * 设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段
+ */
+ @ExcelProperty(value = "设备属性参数ID,关联本表的字段mode_parameter_id。如果数据类型为struct类型,定义json参数时需要用此字段")
+ private Long releatedParameterId;
+
+ /**
+ * 参数类型(1、输入参数,2、输出参数)
+ */
+ @ExcelProperty(value = "参数类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_parameter_type")
+ private String parameterType;
+
+ /**
+ * 参数名称
+ */
+ @ExcelProperty(value = "参数名称")
+ private String parameterName;
+
+ /**
+ * 标识符(支持大小写字母、数字和下划线,对外暂时不超过50个字符)
+ */
+ @ExcelProperty(value = "标识符", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "支=持大小写字母、数字和下划线,对外暂时不超过50个字符")
+ private String parameterIdentifier;
+
+ /**
+ * 数据类型(在平台字典表中定义)
+ */
+ @ExcelProperty(value = "数据类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_data_type")
+ private Long dataType;
+
+ /**
+ * 数据定义
+ */
+ @ExcelProperty(value = "数据定义")
+ private String dataDefinition;
+
+ /**
+ * 单位
+ */
+ @ExcelProperty(value = "单位")
+ private String propertyUnit;
+
+ /**
+ * 预留字段,步长
+ */
+ @ExcelProperty(value = "预留字段,步长")
+ private Long propertyStep;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeVo.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeVo.java
new file mode 100644
index 00000000..e036b9eb
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/domain/vo/DmsDeviceModeVo.java
@@ -0,0 +1,63 @@
+package org.dromara.dms.domain.vo;
+
+import org.dromara.dms.domain.DmsDeviceMode;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 设备模型视图对象 dms_device_mode
+ *
+ * @author Yinq
+ * @date 2025-03-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = DmsDeviceMode.class)
+public class DmsDeviceModeVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备模型ID
+ */
+ @ExcelProperty(value = "设备模型ID")
+ private Long deviceModeId;
+
+ /**
+ * 设备模型名称
+ */
+ @ExcelProperty(value = "设备模型名称")
+ private String deviceModeName;
+
+ /**
+ * 设备模型状态(1:启用,9:删除)
+ */
+ @ExcelProperty(value = "设备模型状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "dms_device_mode_status")
+ private String deviceModeStatus;
+
+ /**
+ * 设备模型图片地址
+ */
+ @ExcelProperty(value = "设备模型图片地址")
+ private String deviceModePic;
+
+ /**
+ * 场景描述
+ */
+ @ExcelProperty(value = "场景描述")
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeFunctionMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeFunctionMapper.java
new file mode 100644
index 00000000..6c7239d9
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeFunctionMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.dms.mapper;
+
+import org.dromara.dms.domain.DmsDeviceModeFunction;
+import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 设备模型功能Mapper接口
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+public interface DmsDeviceModeFunctionMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeMapper.java
new file mode 100644
index 00000000..0f7005ef
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.dms.mapper;
+
+import org.dromara.dms.domain.DmsDeviceMode;
+import org.dromara.dms.domain.vo.DmsDeviceModeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 设备模型Mapper接口
+ *
+ * @author Yinq
+ * @date 2025-03-11
+ */
+public interface DmsDeviceModeMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeParameterMapper.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeParameterMapper.java
new file mode 100644
index 00000000..52516790
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/mapper/DmsDeviceModeParameterMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.dms.mapper;
+
+import org.dromara.dms.domain.DmsDeviceModeParameter;
+import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 设备参数Mapper接口
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+public interface DmsDeviceModeParameterMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeFunctionService.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeFunctionService.java
new file mode 100644
index 00000000..2919118c
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeFunctionService.java
@@ -0,0 +1,69 @@
+package org.dromara.dms.service;
+
+import org.dromara.dms.domain.DmsDeviceModeFunction;
+import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo;
+import org.dromara.dms.domain.bo.DmsDeviceModeFunctionBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 设备模型功能Service接口
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+public interface IDmsDeviceModeFunctionService {
+
+ /**
+ * 查询设备模型功能
+ *
+ * @param modeFunctionId 主键
+ * @return 设备模型功能
+ */
+ DmsDeviceModeFunctionVo queryById(Long modeFunctionId);
+
+ /**
+ * 分页查询设备模型功能列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 设备模型功能分页列表
+ */
+ TableDataInfo queryPageList(DmsDeviceModeFunctionBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的设备模型功能列表
+ *
+ * @param bo 查询条件
+ * @return 设备模型功能列表
+ */
+ List queryList(DmsDeviceModeFunctionBo bo);
+
+ /**
+ * 新增设备模型功能
+ *
+ * @param bo 设备模型功能
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(DmsDeviceModeFunctionBo bo);
+
+ /**
+ * 修改设备模型功能
+ *
+ * @param bo 设备模型功能
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(DmsDeviceModeFunctionBo bo);
+
+ /**
+ * 校验并批量删除设备模型功能信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeParameterService.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeParameterService.java
new file mode 100644
index 00000000..66ccd30b
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeParameterService.java
@@ -0,0 +1,69 @@
+package org.dromara.dms.service;
+
+import org.dromara.dms.domain.DmsDeviceModeParameter;
+import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo;
+import org.dromara.dms.domain.bo.DmsDeviceModeParameterBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 设备参数Service接口
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+public interface IDmsDeviceModeParameterService {
+
+ /**
+ * 查询设备参数
+ *
+ * @param modeParameterId 主键
+ * @return 设备参数
+ */
+ DmsDeviceModeParameterVo queryById(Long modeParameterId);
+
+ /**
+ * 分页查询设备参数列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 设备参数分页列表
+ */
+ TableDataInfo queryPageList(DmsDeviceModeParameterBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的设备参数列表
+ *
+ * @param bo 查询条件
+ * @return 设备参数列表
+ */
+ List queryList(DmsDeviceModeParameterBo bo);
+
+ /**
+ * 新增设备参数
+ *
+ * @param bo 设备参数
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(DmsDeviceModeParameterBo bo);
+
+ /**
+ * 修改设备参数
+ *
+ * @param bo 设备参数
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(DmsDeviceModeParameterBo bo);
+
+ /**
+ * 校验并批量删除设备参数信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeService.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeService.java
new file mode 100644
index 00000000..df894344
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/IDmsDeviceModeService.java
@@ -0,0 +1,69 @@
+package org.dromara.dms.service;
+
+import org.dromara.dms.domain.DmsDeviceMode;
+import org.dromara.dms.domain.vo.DmsDeviceModeVo;
+import org.dromara.dms.domain.bo.DmsDeviceModeBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 设备模型Service接口
+ *
+ * @author Yinq
+ * @date 2025-03-11
+ */
+public interface IDmsDeviceModeService {
+
+ /**
+ * 查询设备模型
+ *
+ * @param deviceModeId 主键
+ * @return 设备模型
+ */
+ DmsDeviceModeVo queryById(Long deviceModeId);
+
+ /**
+ * 分页查询设备模型列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 设备模型分页列表
+ */
+ TableDataInfo queryPageList(DmsDeviceModeBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的设备模型列表
+ *
+ * @param bo 查询条件
+ * @return 设备模型列表
+ */
+ List queryList(DmsDeviceModeBo bo);
+
+ /**
+ * 新增设备模型
+ *
+ * @param bo 设备模型
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(DmsDeviceModeBo bo);
+
+ /**
+ * 修改设备模型
+ *
+ * @param bo 设备模型
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(DmsDeviceModeBo bo);
+
+ /**
+ * 校验并批量删除设备模型信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeFunctionServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeFunctionServiceImpl.java
new file mode 100644
index 00000000..ddc2904b
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeFunctionServiceImpl.java
@@ -0,0 +1,151 @@
+package org.dromara.dms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.dms.domain.bo.DmsDeviceModeFunctionBo;
+import org.dromara.dms.domain.vo.DmsDeviceModeFunctionVo;
+import org.dromara.dms.domain.DmsDeviceModeFunction;
+import org.dromara.dms.mapper.DmsDeviceModeFunctionMapper;
+import org.dromara.dms.service.IDmsDeviceModeFunctionService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 设备模型功能Service业务层处理
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@RequiredArgsConstructor
+@Service
+public class DmsDeviceModeFunctionServiceImpl implements IDmsDeviceModeFunctionService {
+
+ private final DmsDeviceModeFunctionMapper baseMapper;
+
+ /**
+ * 查询设备模型功能
+ *
+ * @param modeFunctionId 主键
+ * @return 设备模型功能
+ */
+ @Override
+ public DmsDeviceModeFunctionVo queryById(Long modeFunctionId) {
+ return baseMapper.selectVoById(modeFunctionId);
+ }
+
+ /**
+ * 分页查询设备模型功能列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 设备模型功能分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(DmsDeviceModeFunctionBo bo, PageQuery pageQuery) {
+ MPJLambdaWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的设备模型功能列表
+ *
+ * @param bo 查询条件
+ * @return 设备模型功能列表
+ */
+ @Override
+ public List queryList(DmsDeviceModeFunctionBo bo) {
+ MPJLambdaWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private MPJLambdaWrapper buildQueryWrapper(DmsDeviceModeFunctionBo bo) {
+ Map params = bo.getParams();
+ MPJLambdaWrapper lqw = JoinWrappers.lambda(DmsDeviceModeFunction.class)
+ .selectAll(DmsDeviceModeFunction.class)
+ .eq(bo.getModeFunctionId() != null, DmsDeviceModeFunction::getModeFunctionId, bo.getModeFunctionId())
+ .eq(bo.getDeviceModeId() != null, DmsDeviceModeFunction::getDeviceModeId, bo.getDeviceModeId())
+ .eq(StringUtils.isNotBlank(bo.getFunctionMode()), DmsDeviceModeFunction::getFunctionMode, bo.getFunctionMode())
+ .eq(StringUtils.isNotBlank(bo.getCoordinate()), DmsDeviceModeFunction::getCoordinate, bo.getCoordinate())
+ .like(StringUtils.isNotBlank(bo.getFunctionName()), DmsDeviceModeFunction::getFunctionName, bo.getFunctionName())
+ .eq(StringUtils.isNotBlank(bo.getFunctionIdentifier()), DmsDeviceModeFunction::getFunctionIdentifier, bo.getFunctionIdentifier())
+ .eq(StringUtils.isNotBlank(bo.getFunctionType()), DmsDeviceModeFunction::getFunctionType, bo.getFunctionType())
+ .eq(bo.getDataType() != null, DmsDeviceModeFunction::getDataType, bo.getDataType())
+ .eq(StringUtils.isNotBlank(bo.getDataDefinition()), DmsDeviceModeFunction::getDataDefinition, bo.getDataDefinition())
+ .eq(StringUtils.isNotBlank(bo.getFunctionFormula()), DmsDeviceModeFunction::getFunctionFormula, bo.getFunctionFormula())
+ .eq(StringUtils.isNotBlank(bo.getPropertyUnit()), DmsDeviceModeFunction::getPropertyUnit, bo.getPropertyUnit())
+ .eq(StringUtils.isNotBlank(bo.getDisplayFlag()), DmsDeviceModeFunction::getDisplayFlag, bo.getDisplayFlag())
+ .eq(StringUtils.isNotBlank(bo.getRwFlag()), DmsDeviceModeFunction::getRwFlag, bo.getRwFlag())
+ .eq(StringUtils.isNotBlank(bo.getInvokeMethod()), DmsDeviceModeFunction::getInvokeMethod, bo.getInvokeMethod())
+ .eq(StringUtils.isNotBlank(bo.getEventType()), DmsDeviceModeFunction::getEventType, bo.getEventType())
+ .eq(StringUtils.isNotBlank(bo.getAcquisitionFormula()), DmsDeviceModeFunction::getAcquisitionFormula, bo.getAcquisitionFormula())
+ .eq(bo.getOrderFlag() != null, DmsDeviceModeFunction::getOrderFlag, bo.getOrderFlag())
+ .eq(StringUtils.isNotBlank(bo.getDeviceRegister()), DmsDeviceModeFunction::getDeviceRegister, bo.getDeviceRegister())
+ .eq(bo.getPropertyStep() != null, DmsDeviceModeFunction::getPropertyStep, bo.getPropertyStep())
+ .eq(StringUtils.isNotBlank(bo.getPropertyField()), DmsDeviceModeFunction::getPropertyField, bo.getPropertyField())
+ .orderByAsc(DmsDeviceModeFunction::getModeFunctionId);
+ return lqw;
+ }
+
+ /**
+ * 新增设备模型功能
+ *
+ * @param bo 设备模型功能
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(DmsDeviceModeFunctionBo bo) {
+ DmsDeviceModeFunction add = MapstructUtils.convert(bo, DmsDeviceModeFunction.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setModeFunctionId(add.getModeFunctionId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改设备模型功能
+ *
+ * @param bo 设备模型功能
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(DmsDeviceModeFunctionBo bo) {
+ DmsDeviceModeFunction update = MapstructUtils.convert(bo, DmsDeviceModeFunction.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(DmsDeviceModeFunction entity) {
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除设备模型功能信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if (isValid) {
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeParameterServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeParameterServiceImpl.java
new file mode 100644
index 00000000..755b4ba5
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeParameterServiceImpl.java
@@ -0,0 +1,141 @@
+package org.dromara.dms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.dms.domain.bo.DmsDeviceModeParameterBo;
+import org.dromara.dms.domain.vo.DmsDeviceModeParameterVo;
+import org.dromara.dms.domain.DmsDeviceModeParameter;
+import org.dromara.dms.mapper.DmsDeviceModeParameterMapper;
+import org.dromara.dms.service.IDmsDeviceModeParameterService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 设备参数Service业务层处理
+ *
+ * @author Yinq
+ * @date 2025-03-12
+ */
+@RequiredArgsConstructor
+@Service
+public class DmsDeviceModeParameterServiceImpl implements IDmsDeviceModeParameterService {
+
+ private final DmsDeviceModeParameterMapper baseMapper;
+
+ /**
+ * 查询设备参数
+ *
+ * @param modeParameterId 主键
+ * @return 设备参数
+ */
+ @Override
+ public DmsDeviceModeParameterVo queryById(Long modeParameterId) {
+ return baseMapper.selectVoById(modeParameterId);
+ }
+
+ /**
+ * 分页查询设备参数列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 设备参数分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(DmsDeviceModeParameterBo bo, PageQuery pageQuery) {
+ MPJLambdaWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的设备参数列表
+ *
+ * @param bo 查询条件
+ * @return 设备参数列表
+ */
+ @Override
+ public List queryList(DmsDeviceModeParameterBo bo) {
+ MPJLambdaWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private MPJLambdaWrapper buildQueryWrapper(DmsDeviceModeParameterBo bo) {
+ Map params = bo.getParams();
+ MPJLambdaWrapper lqw = JoinWrappers.lambda(DmsDeviceModeParameter.class)
+ .selectAll(DmsDeviceModeParameter.class)
+ .eq(bo.getModeParameterId() != null, DmsDeviceModeParameter::getModeParameterId, bo.getModeParameterId())
+ .eq(bo.getModeFunctionId() != null, DmsDeviceModeParameter::getModeFunctionId, bo.getModeFunctionId())
+ .eq(bo.getReleatedParameterId() != null, DmsDeviceModeParameter::getReleatedParameterId, bo.getReleatedParameterId())
+ .eq(StringUtils.isNotBlank(bo.getParameterType()), DmsDeviceModeParameter::getParameterType, bo.getParameterType())
+ .like(StringUtils.isNotBlank(bo.getParameterName()), DmsDeviceModeParameter::getParameterName, bo.getParameterName())
+ .eq(StringUtils.isNotBlank(bo.getParameterIdentifier()), DmsDeviceModeParameter::getParameterIdentifier, bo.getParameterIdentifier())
+ .eq(bo.getDataType() != null, DmsDeviceModeParameter::getDataType, bo.getDataType())
+ .eq(StringUtils.isNotBlank(bo.getDataDefinition()), DmsDeviceModeParameter::getDataDefinition, bo.getDataDefinition())
+ .eq(StringUtils.isNotBlank(bo.getPropertyUnit()), DmsDeviceModeParameter::getPropertyUnit, bo.getPropertyUnit())
+ .eq(bo.getPropertyStep() != null, DmsDeviceModeParameter::getPropertyStep, bo.getPropertyStep())
+ .orderByDesc(DmsDeviceModeParameter::getModeParameterId);
+ return lqw;
+ }
+
+ /**
+ * 新增设备参数
+ *
+ * @param bo 设备参数
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(DmsDeviceModeParameterBo bo) {
+ DmsDeviceModeParameter add = MapstructUtils.convert(bo, DmsDeviceModeParameter.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setModeParameterId(add.getModeParameterId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改设备参数
+ *
+ * @param bo 设备参数
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(DmsDeviceModeParameterBo bo) {
+ DmsDeviceModeParameter update = MapstructUtils.convert(bo, DmsDeviceModeParameter.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(DmsDeviceModeParameter entity) {
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除设备参数信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if (isValid) {
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeServiceImpl.java b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeServiceImpl.java
new file mode 100644
index 00000000..c861d074
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/java/org/dromara/dms/service/impl/DmsDeviceModeServiceImpl.java
@@ -0,0 +1,135 @@
+package org.dromara.dms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.dms.domain.bo.DmsDeviceModeBo;
+import org.dromara.dms.domain.vo.DmsDeviceModeVo;
+import org.dromara.dms.domain.DmsDeviceMode;
+import org.dromara.dms.mapper.DmsDeviceModeMapper;
+import org.dromara.dms.service.IDmsDeviceModeService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 设备模型Service业务层处理
+ *
+ * @author Yinq
+ * @date 2025-03-11
+ */
+@RequiredArgsConstructor
+@Service
+public class DmsDeviceModeServiceImpl implements IDmsDeviceModeService {
+
+ private final DmsDeviceModeMapper baseMapper;
+
+ /**
+ * 查询设备模型
+ *
+ * @param deviceModeId 主键
+ * @return 设备模型
+ */
+ @Override
+ public DmsDeviceModeVo queryById(Long deviceModeId){
+ return baseMapper.selectVoById(deviceModeId);
+ }
+
+ /**
+ * 分页查询设备模型列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 设备模型分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(DmsDeviceModeBo bo, PageQuery pageQuery) {
+ MPJLambdaWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的设备模型列表
+ *
+ * @param bo 查询条件
+ * @return 设备模型列表
+ */
+ @Override
+ public List queryList(DmsDeviceModeBo bo) {
+ MPJLambdaWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private MPJLambdaWrapper buildQueryWrapper(DmsDeviceModeBo bo) {
+ Map params = bo.getParams();
+ MPJLambdaWrapper lqw = JoinWrappers.lambda(DmsDeviceMode.class)
+ .selectAll(DmsDeviceMode.class)
+ .eq(bo.getDeviceModeId() != null, DmsDeviceMode::getDeviceModeId, bo.getDeviceModeId())
+ .like(StringUtils.isNotBlank(bo.getDeviceModeName()), DmsDeviceMode::getDeviceModeName, bo.getDeviceModeName())
+ .eq(StringUtils.isNotBlank(bo.getDeviceModeStatus()), DmsDeviceMode::getDeviceModeStatus, bo.getDeviceModeStatus())
+ .eq(StringUtils.isNotBlank(bo.getDeviceModePic()), DmsDeviceMode::getDeviceModePic, bo.getDeviceModePic())
+ .orderByAsc(DmsDeviceMode::getCreateTime);
+ return lqw;
+ }
+
+ /**
+ * 新增设备模型
+ *
+ * @param bo 设备模型
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(DmsDeviceModeBo bo) {
+ DmsDeviceMode add = MapstructUtils.convert(bo, DmsDeviceMode.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setDeviceModeId(add.getDeviceModeId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改设备模型
+ *
+ * @param bo 设备模型
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(DmsDeviceModeBo bo) {
+ DmsDeviceMode update = MapstructUtils.convert(bo, DmsDeviceMode.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(DmsDeviceMode entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除设备模型信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/application.yml b/ruoyi-modules/hwmom-dms/src/main/resources/application.yml
new file mode 100644
index 00000000..d4d1ed7f
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/resources/application.yml
@@ -0,0 +1,34 @@
+# Tomcat
+server:
+ port: 6017
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: hwmom-dms
+ profiles:
+ # 环境配置
+ active: @profiles.active@
+
+--- # nacos 配置
+spring:
+ cloud:
+ nacos:
+ # nacos 服务地址
+ server-addr: @nacos.server@
+ username: @nacos.username@
+ password: @nacos.password@
+ discovery:
+ # 注册组
+ group: @nacos.discovery.group@
+ namespace: ${spring.profiles.active}
+ config:
+ # 配置组
+ group: @nacos.config.group@
+ namespace: ${spring.profiles.active}
+ config:
+ import:
+ - optional:nacos:application-common.yml
+ - optional:nacos:datasource.yml
+ - optional:nacos:${spring.application.name}.yml
diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/banner.txt b/ruoyi-modules/hwmom-dms/src/main/resources/banner.txt
new file mode 100644
index 00000000..6bf01156
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/resources/banner.txt
@@ -0,0 +1,8 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _ _
+ | |____ ___ __ ___ ___ _ __ ___ __| |_ __ ___ ___
+ | '_ \ \ /\ / / '_ ` _ \ / _ \| '_ ` _ \ _____ / _` | '_ ` _ \/ __|
+ | | | \ V V /| | | | | | (_) | | | | | |_____| (_| | | | | | \__ \
+ |_| |_|\_/\_/ |_| |_| |_|\___/|_| |_| |_| \__,_|_| |_| |_|___/
+
diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/logback-plus.xml b/ruoyi-modules/hwmom-dms/src/main/resources/logback-plus.xml
new file mode 100644
index 00000000..caaa3455
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/resources/logback-plus.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+ ${console.log.pattern}
+ utf-8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeFunctionMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeFunctionMapper.xml
new file mode 100644
index 00000000..376e60f1
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeFunctionMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeMapper.xml
new file mode 100644
index 00000000..4fcc82d0
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeParameterMapper.xml b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeParameterMapper.xml
new file mode 100644
index 00000000..69323a23
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/dms/DmsDeviceModeParameterMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/hwmom-dms/src/main/resources/mapper/package-info.md b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/package-info.md
new file mode 100644
index 00000000..c938b1e5
--- /dev/null
+++ b/ruoyi-modules/hwmom-dms/src/main/resources/mapper/package-info.md
@@ -0,0 +1,3 @@
+java包使用 `.` 分割 resource 目录使用 `/` 分割
+
+此文件目的 防止文件夹粘连找不到 `xml` 文件
\ No newline at end of file
diff --git a/ruoyi-modules/hwmom-dp/pom.xml b/ruoyi-modules/hwmom-dp/pom.xml
new file mode 100644
index 00000000..1db1493c
--- /dev/null
+++ b/ruoyi-modules/hwmom-dp/pom.xml
@@ -0,0 +1,93 @@
+
+
+ 4.0.0
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+
+
+ hwmom-dp
+
+
+ hwmom-dp data process数据处理模块
+
+
+
+
+
+ org.springframework.kafka
+ spring-kafka
+
+
+
+ org.dromara
+ ruoyi-common-nacos
+
+
+
+
+ org.dromara
+ ruoyi-common-security
+
+
+
+
+ org.dromara
+ ruoyi-api-resource
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ 2.0.51
+ compile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ 17
+ 17
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/HwDataProcessApplication.java b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/HwDataProcessApplication.java
new file mode 100644
index 00000000..033dab5e
--- /dev/null
+++ b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/HwDataProcessApplication.java
@@ -0,0 +1,20 @@
+package org.dromara.dp;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
+public class HwDataProcessApplication {
+
+ public static void main(String[] args) {
+ SpringApplication application = new SpringApplication(HwDataProcessApplication.class);
+ application.setApplicationStartup(new BufferingApplicationStartup(2048));
+ application.run(args);
+ System.out.println("(♥◠‿◠)ノ゙ data process数据处理模块启动成功 ლ(´ڡ`ლ)゙ ");
+
+
+ }
+
+}
diff --git a/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/kafka/service/KafkaConsumerService.java b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/kafka/service/KafkaConsumerService.java
new file mode 100644
index 00000000..782fc349
--- /dev/null
+++ b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/dp/kafka/service/KafkaConsumerService.java
@@ -0,0 +1,13 @@
+package org.dromara.dp.kafka.service;
+
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.stereotype.Service;
+
+@Service
+public class KafkaConsumerService {
+
+ @KafkaListener(topics = "test", groupId = "my-consumer-group")
+ public void listen(String message) {
+ System.out.println("Received message: " + message);
+ }
+}
diff --git a/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DataProcessServiceImpl.java b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DataProcessServiceImpl.java
new file mode 100644
index 00000000..6e0219f2
--- /dev/null
+++ b/ruoyi-modules/hwmom-dp/src/main/java/org/dromara/service/DataProcessServiceImpl.java
@@ -0,0 +1,685 @@
+//package org.dromara.service;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.aliyun.auth.credentials.Credential;
+//import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
+//import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
+//import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
+//import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
+//import com.ruoyi.common.core.constant.HwDictConstants;
+//import com.ruoyi.common.core.constant.SecurityConstants;
+//import com.ruoyi.common.core.constant.TdEngineConstants;
+//import com.ruoyi.common.core.domain.R;
+//import com.ruoyi.common.core.enums.ResultEnums;
+//import com.ruoyi.common.core.utils.RegexUtils;
+//import com.ruoyi.common.core.utils.StringUtils;
+//import com.ruoyi.dataprocess.amap.LocationVo;
+//import com.ruoyi.dataprocess.amap.PositionUtils;
+//import com.ruoyi.dataprocess.amap.PositionVo;
+//import com.ruoyi.dataprocess.common.ImageUtils;
+//import com.ruoyi.dataprocess.domain.*;
+//import com.ruoyi.dataprocess.mapper.*;
+//import com.ruoyi.dataprocess.service.CommanHandleService;
+//import com.ruoyi.dataprocess.service.IDataProcessService;
+//import com.ruoyi.tdengine.api.RemoteTdEngineService;
+//import com.ruoyi.tdengine.api.domain.TdField;
+//import com.ruoyi.tdengine.api.domain.TdHistorySelectDto;
+//import com.ruoyi.tdengine.api.domain.TdReturnDataVo;
+//import com.ruoyi.tdengine.api.domain.TdTableVo;
+//import darabonba.core.client.ClientOverrideConfiguration;
+//import org.apache.commons.codec.binary.Base64;
+//import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Service;
+//
+//import javax.annotation.Resource;
+//import javax.script.ScriptEngine;
+//import javax.script.ScriptEngineManager;
+//import java.io.IOException;
+//import java.math.BigDecimal;
+//import java.text.SimpleDateFormat;
+//import java.util.*;
+//import java.util.concurrent.CompletableFuture;
+//import java.util.concurrent.ExecutionException;
+//import java.util.concurrent.atomic.AtomicBoolean;
+//import java.util.stream.Collectors;
+//
+///**
+// * @Description: 数据处理业务类
+// * @ClassName: DataProcessServiceImpl
+// * @Author : xins
+// * @Date :2023-09-04 8:58
+// * @Version :1.0
+// */
+//@Service
+//public class DataProcessServiceImpl extends CommanHandleService implements IDataProcessService {
+//
+// private static final Logger logger = LoggerFactory.getLogger(DataProcessServiceImpl.class);
+//
+// private final String AccessKeyId = "LTAI5tPoTQHh8HHst2toxtGa";
+// private final String AccessKeySecret = "K8OIuSNgsSnpGMJ2PdqIJFYyUqL38m";
+//
+// @Resource
+// private RemoteTdEngineService remoteTdEngineService;
+//
+// @Autowired
+// private HwDeviceMapper hwDeviceMapper;
+//
+// @Autowired
+// private HwElectronicFenceMapper hwElectronicFenceMapper;
+//
+// @Autowired
+// private HwFenceAreaMapper hwFenceAreaMapper;
+//
+// @Autowired
+// private HwAlarmInfoMapper hwAlarmInfoMapper;
+//
+// @Autowired
+// private HwAlarmRuleMapper hwAlarmRuleMapper;
+//
+// /**
+// * @param: jsonData
+// * @param: imagePath ruoyifile的上传地址
+// * @param: imagePatterns
+// * @param: imageDomain ruoyifile的domain
+// * @param: imagePrefix ruoyifile的prefix
+// * @param: topic 发布主题,用来获取网关设备devicecode
+// * @description
+// * @author xins
+// * @date 2023-08-31 16:16
+// */
+// @Override
+// public int processBusinessData(String jsonData, String imagePath,
+// String imagePatterns, String imageDomain, String imagePrefix, String topic) {
+// JSONObject json = JSON.parseObject(jsonData);
+// Long ts = json.getLong(TdEngineConstants.PAYLOAD_TS);
+// String tsStr = String.valueOf(ts);
+// if (tsStr.length() == 10) {
+// ts = ts * 1000;
+// }
+// JSONArray paramArr = json.getJSONArray(TdEngineConstants.PAYLOAD_PARAM);
+//// System.out.println(this.hwDeviceMapper);
+//// System.out.println(this.remoteTdEngineService);
+// String deviceCode = "";
+// for (int i = 0; i < paramArr.size(); i++) {
+// try {
+// JSONObject paramJson = paramArr.getJSONObject(i);
+// String dataType = paramJson.getString(TdEngineConstants.PAYLOAD_DATATYPE);
+// JSONObject dataValueJson = paramJson.getJSONObject(TdEngineConstants.PAYLOAD_DATAVALUE);
+// deviceCode = dataValueJson.getString(TdEngineConstants.PAYLOAD_DEVICE_CODE).toLowerCase();
+// //deviceCode = getUidByParam(json);
+// HwDevice hwDevice = hwDeviceMapper.selectHwDeviceByDeviceCode(deviceCode);
+// if (hwDevice == null) {
+// logger.error("此设备【deviceCode:{}】不存在", deviceCode);
+// continue;
+// }
+// if (hwDevice.getDeviceStatus().equals(HwDictConstants.DEVICE_STATUS_DELETE)) {
+// logger.error("此设备【deviceCode:{}】已删除", deviceCode);
+// continue;
+// }
+//
+// Long sceneId = hwDevice.getSceneId();
+// Long deviceId = hwDevice.getDeviceId();
+// Long monitorUnitId = hwDevice.getMonitorUnitId();
+// Long tenantId = hwDevice.getTenantId();
+// String databaseName = TdEngineConstants.getDatabaseName();
+// String tableName = TdEngineConstants.DEFAULT_TABLE_NAME_PREFIX + deviceId;
+//
+// dataValueJson.remove(TdEngineConstants.PAYLOAD_DEVICE_CODE);
+// TdTableVo tdTableVo = new TdTableVo();
+// List schemaFields = new ArrayList<>();
+// List alarmSchemaFields = new ArrayList<>();
+//
+// //添加timestamp字段,默认字段名称是ts,协议上传的key是timestamp
+// TdField firstTdField = new TdField();
+// firstTdField.setFieldName(TdEngineConstants.DEFAULT_FIRST_FIELD_NAME);
+// long currentTimeMillis = System.currentTimeMillis();
+// firstTdField.setFieldValue(currentTimeMillis);
+//// firstTdField.setFieldValue(ts);
+// schemaFields.add(firstTdField);
+//
+// Object longitude = null;
+// Object latitude = null;
+//
+// for (Map.Entry entry : dataValueJson.entrySet()) {
+// String originalKey = entry.getKey();//原来的key
+// Object value = entry.getValue();
+//
+// /**
+// * 先对key进行转换,例如对于key是value的需要转换成value1;
+// */
+// String key = TdEngineConstants.TDENGINE_KEY_TRANSFER_MAP.get(originalKey) == null ? originalKey
+// : TdEngineConstants.TDENGINE_KEY_TRANSFER_MAP.get(originalKey);
+//
+// if (key.equalsIgnoreCase(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_TYPE)) {
+// continue;
+// }
+//
+//
+// if (value instanceof String) {
+// String valueStr = (String) value;
+// if (StringUtils.isNotBlank(valueStr)) {
+// /**
+// * 先判读是否是图片,并获取图片名称, 获取到证明是图片
+// */
+// String[] imagePatternArr = imagePatterns.split(",");
+// String extension = ImageUtils.getImageType(valueStr, imagePatternArr);
+// if (StringUtils.isNotBlank(extension) && valueStr.length() > 300) {
+// //保存图片,并返回图片详细地址进行赋值保存
+// value = getImageFileName(imagePath, imageDomain, imagePrefix, valueStr, deviceId, extension);
+// if (value == null) continue;
+// } else if (dataType.equalsIgnoreCase(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_IMAGE)) {
+// if (ImageUtils.checkIsBase64(valueStr) && valueStr.length() > 300) {//判断没有加前缀的情况
+// String type = dataValueJson.getString(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_TYPE);
+// if (type == null) {
+// type = dataValueJson.getString(TdEngineConstants.PAYLOAD_DEVICE_DATA_TYPE_TYPE_FIRSET_UPPER);
+// }
+// extension = "jpg";
+// if (type != null) {
+// extension = StringUtils.isNotBlank(ImageUtils.getImageType(type, imagePatternArr))
+// ? ImageUtils.getImageType(type, imagePatternArr) : extension;
+// }
+// value = getImageFileName(imagePath, imageDomain, imagePrefix, valueStr, deviceId, extension);
+// if (value == null) continue;
+// }
+// }
+//
+// TdField tdField = new TdField();
+// tdField.setFieldName(key);
+// tdField.setFieldValue(value);
+// schemaFields.add(tdField);
+// }
+// } else {
+// TdField tdField = new TdField();
+// tdField.setFieldName(key);
+// tdField.setFieldValue(value);
+// schemaFields.add(tdField);
+//
+// //经纬度判断
+// if (key.equalsIgnoreCase(HwDictConstants.DEFAULT_FUNCTION_LONGITUDE_IDENTIFIER)) {
+// longitude = value;
+// } else if (key.equalsIgnoreCase(HwDictConstants.DEFAULT_FUNCTION_LATITUDE_IDENTIFIER)) {
+// latitude = value;
+// } else {
+// TdField alarmTdField = new TdField();
+// alarmTdField.setFieldName(originalKey);
+// alarmTdField.setFieldValue(value);
+// alarmSchemaFields.add(alarmTdField);
+// }
+// }
+// }
+//
+// tdTableVo.setDatabaseName(databaseName);
+// tdTableVo.setTableName(tableName);
+// tdTableVo.setSchemaFields(schemaFields);
+//
+// final R> insertResult = this.remoteTdEngineService.insertTable(tdTableVo , SecurityConstants.INNER);
+// if (insertResult.getCode() == ResultEnums.SUCCESS.getCode()) {
+// logger.info("Insert data result: {}", insertResult.getCode());
+// } else {
+// logger.error("Insert data Exception: {},data:{}", insertResult.getMsg(), jsonData);
+// }
+//
+// //校验电子围栏
+// if (longitude != null && latitude != null) {
+// checkElectronicFence(deviceId, tenantId, monitorUnitId, sceneId, longitude, latitude, ts);
+// }
+//
+// //校验设备报警信息
+// checkAlarm(deviceId, alarmSchemaFields, tenantId, sceneId, monitorUnitId, topic, deviceCode);
+//
+// } catch (Exception e) {
+// e.printStackTrace();
+// logger.error("deviceCode:{},errorMsg:{},data:{}", deviceCode, e.getMessage(), jsonData);
+// }
+// }
+//
+// return paramArr.size();
+// }
+//
+// /**
+// * 获取设备UID
+// * @param jsonStr
+// * @return
+// */
+// private String getUidByParam(JSONObject jsonStr){
+//
+// JSONObject jsonObject = new JSONObject(jsonStr);
+//
+// JSONArray paramArray = jsonObject.getJSONArray("param");
+//
+// JSONObject firstParamObject = paramArray.getJSONObject(0);
+//
+// JSONObject datavalueObject = firstParamObject.getJSONObject("datavalue");
+//
+// String uid = datavalueObject.getString("uid");
+//
+// return uid;
+// }
+//
+//
+// private static String getImageFileName(String imagePath, String imageDomain, String imagePrefix, String valueStr, Long deviceId, String extension) {
+// try {
+// String imageFileName = ImageUtils.convertBase64ToImage(imagePath,
+// valueStr, "device" + deviceId, extension);
+// return imageDomain + imagePrefix + imageFileName;
+//
+// } catch (IOException e) {
+// logger.error("转换图片错误:" + e.getMessage(), e);
+// }
+// return null;
+// }
+//
+//
+// /**
+// * @param: deviceId
+// * @param: monitorUnitId
+// * @param: sceneId
+// * @param: longitude
+// * @param: latitude
+// * @param: ts
+// * @description 校验此设备电子围栏
+// * @author xins
+// * @date 2023-09-04 14:04
+// */
+// private void checkElectronicFence(Long deviceId, Long tenantId, Long monitorUnitId, Long sceneId, Object longitude, Object latitude, Long ts) {
+// //根据设备ID、监控单元ID和场景ID获取所有的电子围栏配置。(目前先只支持场景)
+//// List hwElectronicFences = hwElectronicFenceMapper.selectElectronicFencesByDeviceId(deviceId);
+//// hwElectronicFences = hwElectronicFenceMapper.selectElectronicFencesByMonitorUnitId(monitorUnitId);
+// List hwElectronicFences = hwElectronicFenceMapper.selectElectronicFencesBySceneId(sceneId);
+//
+// if (StringUtils.isNotEmpty(hwElectronicFences)) {
+// for (HwElectronicFence hwElectronicFence : hwElectronicFences) {
+// HwFenceArea queryFenceArea = new HwFenceArea();
+// queryFenceArea.setElectronicFenceId(hwElectronicFence.getElectronicFenceId());
+// //获取电子围栏下配置的区域列表
+// List fenceAreas = hwFenceAreaMapper.selectHwFenceAreaList(queryFenceArea);
+// String effectiveTimeFlag = hwElectronicFence.getEffectiveTimeFlag();
+// String triggerStatus = hwElectronicFence.getTriggerStatus();
+// if (fenceAreas != null && !fenceAreas.isEmpty()) {
+// fenceAreas.forEach(fenceArea -> {
+// boolean isAlarmed = false;//是否报警
+// if (effectiveTimeFlag.equals(HwDictConstants.EFFECTIVE_TIME_FLAG_LONG)) {
+// String areaShapeFlag = fenceArea.getAreaShapeFlag();
+// String areaRange = fenceArea.getAreaRange();
+// //多边形处理
+// if (areaShapeFlag.equals(HwDictConstants.AREA_SHAPE_FLAG_POLYGN)) {
+// LocationVo polygonVo = new LocationVo();
+// polygonVo.setMarkerType(LocationVo.MARKER_TYPE_POLYGON);
+// List> polygonList = new ArrayList<>();
+// List postionList = new ArrayList<>();
+// String[] areaRangeArr = areaRange.split("_");//多个点,每个点的经纬度信息(经度_纬度)
+// for (String areaRange1 : areaRangeArr) {
+// String[] areaRange1Arr = areaRange1.split(",");
+// String longitudeStr = areaRange1Arr[0];
+// String latitudeStr = areaRange1Arr[1];
+// postionList.add(new PositionVo(new BigDecimal(longitudeStr), new BigDecimal(latitudeStr)));
+// polygonList.add(postionList);
+// }
+//
+// polygonVo.setPolygonList(polygonList);
+//
+// /**
+// * 传入的longitude和latitude是object类型,本身有可能是BigDecimal,Double,Long和Integer,先转成String再转成Double
+// */
+// boolean isWithin = PositionUtils.checkAddressInLocation(polygonVo, Double.valueOf(String.valueOf(longitude)), Double.valueOf(String.valueOf(latitude)));
+// if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_EXIT) && !isWithin) {//如果电子围栏配置是出界,而此设备出界则报警
+// isAlarmed = true;
+// } else if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_ENTRY) && isWithin) {//如果电子围栏配置是入界,而此设备入界则报警
+// isAlarmed = true;
+// }
+//
+// } else if (areaShapeFlag.equals(HwDictConstants.AREA_SHAPE_FLAG_CIRCULA)) {//圆形处理
+// String[] areaRangeArr = areaRange.split(",");
+// String longitudeStr = areaRangeArr[0];
+// String latitudeStr = areaRangeArr[1];
+// String radiusStr = areaRangeArr[2];
+// LocationVo circulrVo = new LocationVo();
+// circulrVo.setRadius(Double.valueOf(radiusStr));
+// circulrVo.setLongitude(Double.valueOf(longitudeStr));
+// circulrVo.setLatitude(Double.valueOf(latitudeStr));
+// circulrVo.setMarkerType(LocationVo.MARKER_TYPE_CIRCULAR);
+// boolean isWithin = PositionUtils.checkAddressInLocation(circulrVo, Double.valueOf(String.valueOf(longitude)), Double.valueOf(String.valueOf(latitude)));
+// if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_EXIT) && !isWithin) {//如果电子围栏配置是出界,而此设备出界则报警
+// isAlarmed = true;
+// } else if (triggerStatus.equals(HwDictConstants.ELECTRONIC_FENCE_TRIGGER_STATUS_ENTRY) && isWithin) {//如果电子围栏配置是入界,而此设备入界则报警
+// isAlarmed = true;
+// }
+// }
+// }
+//
+// if (isAlarmed) {
+// HwAlarmInfo hwAralmInfo = new HwAlarmInfo();
+// hwAralmInfo.setAlarmInfoType(HwDictConstants.ALARM_INFO_TYPE_ELECTRONIC_FENCE);
+// hwAralmInfo.setAlarmReleatedId(hwElectronicFence.getElectronicFenceId());
+// hwAralmInfo.setDeviceId(deviceId);
+// hwAralmInfo.setMonitorUnitId(monitorUnitId);
+// hwAralmInfo.setTenantId(tenantId);
+// hwAralmInfo.setSceneId(sceneId);
+// hwAralmInfo.setFunctionValue(longitude + "_" + latitude);
+// hwAralmInfo.setTriggerStatus(triggerStatus);
+// hwAralmInfo.setAlarmTime(new Date(ts));
+// hwAralmInfo.setCreateTime(new Date());
+// hwAralmInfo.setFenceAreaId(fenceArea.getFenceAreaId());
+// hwAlarmInfoMapper.insertHwAlarmInfo(hwAralmInfo);
+// }
+// });
+// }
+// }
+// }
+// }
+//
+//
+// /**
+// * @param: deviceId
+// * @param: alarmFields
+// * @description 校验报警
+// * @author xins
+// * @date 2023-11-07 10:15
+// */
+// private void checkAlarm(Long deviceId, List alarmFields,
+// Long tenantId, Long sceneId, Long monitorUnitId, String topic, String subDeviceCode) {
+//
+// try {
+// HwAlarmRule queryAlarmRule = new HwAlarmRule();
+// queryAlarmRule.setRuleDeviceId(deviceId);
+// queryAlarmRule.setRuleType(HwDictConstants.ALARM_RULE_RULE_TYPE_DEVICE);
+// queryAlarmRule.setAlarmRuleStatus(HwDictConstants.ALARM_RULE_STATUS_ENABLE);
+// List alarmRules = hwAlarmRuleMapper.selectHwAlarmRulesWithLink(queryAlarmRule);
+//
+// ScriptEngineManager manager = new ScriptEngineManager();
+// ScriptEngine engine = manager.getEngineByName("js");
+//
+// if (alarmRules != null) {
+// Date currentDate = new Date();
+// for (HwAlarmRule alarmRule : alarmRules) {
+// String triggerExpression = alarmRule.getTriggerExpression()
+// .replaceAll("and", "&&")
+// .replaceAll("or", "||");
+// AtomicBoolean isAlarmed = new AtomicBoolean(false);
+// List alarmDetails = new ArrayList();
+//
+// for (TdField alarmField : alarmFields) {
+// String fieldName = alarmField.getFieldName();
+// Object filedValue = alarmField.getFieldValue();
+// if (triggerExpression.contains("{" + fieldName + "}")) {
+// isAlarmed.set(true);
+//
+// /**
+// * Add By 获取五分钟内的数据 WenJY 2024-07-03 14:13:21
+// */
+// if(alarmRule.getTriggerTimeFrame() != null && alarmRule.getTriggerTimeFrame() > 0){
+// double difValue = FilterDeviceValue(deviceId, fieldName, alarmRule.getTriggerTimeFrame());
+//// if(difValue > 0){
+//// filedValue = difValue;
+//// }
+// filedValue = difValue;
+// }
+// /** End **/
+//
+// triggerExpression = triggerExpression.replaceAll("\\{" + fieldName + "\\}", String.valueOf(filedValue));
+// HwAlarmDetail alarmDetail = new HwAlarmDetail();
+// alarmDetail.setDeviceId(deviceId);
+// alarmDetail.setFunctionIdentifier(fieldName);
+// alarmDetail.setFunctionValue(String.valueOf(filedValue));
+// alarmDetail.setMonitorTime(currentDate);
+// alarmDetails.add(alarmDetail);
+//
+// }
+// }
+//
+// if (isAlarmed.get() && !triggerExpression.contains("{")
+// && RegexUtils.findSymbolInText(triggerExpression).size() > 0
+// && RegexUtils.findNumberInText(triggerExpression).size() > 0) {
+//
+// Boolean triggerExpressionBool = (Boolean) engine.eval(triggerExpression);
+// if (triggerExpressionBool) {
+// HwAlarmInfo alarmInfo = new HwAlarmInfo();
+// alarmInfo.setAlarmInfoType(HwDictConstants.ALARM_INFO_TYPE_DEVICE);
+// alarmInfo.setAlarmReleatedId(alarmRule.getAlarmRuleId());
+// alarmInfo.setDeviceId(deviceId);
+// alarmInfo.setMonitorUnitId(monitorUnitId);
+// alarmInfo.setTenantId(tenantId);
+// alarmInfo.setSceneId(sceneId);
+// alarmInfo.setAlarmLevelId(alarmRule.getAlarmLevelId());
+// alarmInfo.setAlarmTypeId(alarmRule.getAlarmTypeId());
+// alarmInfo.setHwAlarmDetailList(alarmDetails);
+// alarmInfo.setHandleStatus(HwDictConstants.ALARM_HANDLE_STATUS_NO);
+// alarmInfo.setCreateTime(currentDate);
+// alarmInfo.setAlarmTime(currentDate);
+// hwAlarmInfoMapper.insertHwAlarmInfo(alarmInfo);
+// this.insertHwAlarmDetail(alarmInfo);
+// this.handleAlarmLink(alarmRule, topic, subDeviceCode);
+// /**
+// * Add By WenJY 下发报警信息
+// */
+// if(StringUtils.isNotEmpty(alarmRule.getPhoneNumbers())){
+// SendAlarmInfoBySms(deviceId,alarmRule);
+// }else {
+// logger.warn("设备:{};报警信息发送失败,联系方式为空",deviceId);
+// }
+// break;
+// }
+// }
+// }
+// }
+// }catch (Exception e){
+// logger.error("设备:{};报警逻辑处理异常:{}",deviceId,e.getMessage());
+// }
+// }
+//
+// /**
+// * 过滤指定时间段内的数据,返回最大最小的差值,过滤0
+// * @param deviceId
+// * @param fieldName
+// * @param triggerTimeFrame
+// * @return 差值
+// */
+// private double FilterDeviceValue(Long deviceId,String fieldName,long triggerTimeFrame){
+// double differenceValue = 0.00;
+// String databaseName = TdEngineConstants.getDatabaseName();
+// String tableName = TdEngineConstants.DEFAULT_TABLE_NAME_PREFIX + deviceId;
+// long currentTimeMillis = System.currentTimeMillis();
+// long fiveMinutesInMillis = triggerTimeFrame * 60 * 1000;
+// long beforeTimeMillis = currentTimeMillis - fiveMinutesInMillis;
+//
+// TdHistorySelectDto tdHistorySelectDto = new TdHistorySelectDto();
+// tdHistorySelectDto.setDatabaseName(databaseName);
+// tdHistorySelectDto.setTableName(tableName);
+// tdHistorySelectDto.setStartTime(beforeTimeMillis);
+// tdHistorySelectDto.setEndTime(currentTimeMillis);
+// tdHistorySelectDto.setFirstFieldName("ts");
+// R> result = this.remoteTdEngineService.getHistoryData(tdHistorySelectDto , SecurityConstants.INNER);
+//
+// if (result.getCode() == ResultEnums.SUCCESS.getCode()) {
+// logger.info("Get history data result: {}", result.getCode());
+//
+// TdReturnDataVo data = (TdReturnDataVo) result.getData();
+//
+// List