diff --git a/.gitignore b/.gitignore
index 9154f4c..d1cebfc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,41 @@
hs_err_pid*
replay_pid*
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..b3ab2da
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..2e74ab9
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..9645b9d
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,368 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "associatedIndex": 1
+}
+
+
+
+
+
+ {
+ "keyToString": {
+ "Application.CloudSendInfoUtils.executor": "Debug",
+ "Application.DataUtils.executor": "Debug",
+ "Application.Group.executor": "Run",
+ "Application.InstructionSendInfoUtils.executor": "Run",
+ "Application.TestController.executor": "Run",
+ "Application.XmlRpcHttpDirectCall.executor": "Run",
+ "Application.test111.executor": "Run",
+ "Maven.commoms [clean].executor": "Run",
+ "Maven.commoms [package].executor": "Run",
+ "Maven.core [clean].executor": "Run",
+ "Maven.core [install].executor": "Run",
+ "Maven.core [package].executor": "Run",
+ "Maven.station_control [clean,install,-U].executor": "Run",
+ "Maven.station_control [clean].executor": "Run",
+ "Maven.station_control [dependency:resolve,-U].executor": "Run",
+ "Maven.station_control [dependency:tree].executor": "Run",
+ "Maven.station_control [install].executor": "Run",
+ "Maven.station_control [package].executor": "Run",
+ "Maven.station_control [tree].executor": "Run",
+ "Maven.web-server [clean,install,-U].executor": "Run",
+ "Maven.web-server [clean].executor": "Run",
+ "Maven.web-server [compile].executor": "Run",
+ "Maven.web-server [dependency:resolve,-U].executor": "Run",
+ "Maven.web-server [package].executor": "Run",
+ "RequestMappingsPanelOrder0": "0",
+ "RequestMappingsPanelOrder1": "1",
+ "RequestMappingsPanelWidth0": "75",
+ "RequestMappingsPanelWidth1": "75",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "Spring Boot.WebServerApplication.executor": "Debug",
+ "kotlin-language-version-configured": "true",
+ "last_opened_file_path": "D:/andy/ideaWorker/my/station-control/web-server/src/main/resources",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "project.structure.last.edited": "Project",
+ "project.structure.proportion": "0.15",
+ "project.structure.side.proportion": "0.2",
+ "settings.editor.selected.configurable": "fileTemplates",
+ "vue.rearranger.settings.migration": "true"
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1754904370788
+
+
+ 1754904370788
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/commoms/core/pom.xml b/commoms/core/pom.xml
new file mode 100644
index 0000000..13cde45
--- /dev/null
+++ b/commoms/core/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+ com.evotech.hd
+ commoms
+ 1.0-SNAPSHOT
+
+ com.evotech.hd
+ core
+ 1.0-SNAPSHOT
+ core
+ core
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.38
+
+
+ io.swagger
+ swagger-annotations
+ 1.6.2
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.mapstruct
+ mapstruct-processor
+ 1.4.2.Final
+ provided
+
+
+ org.mapstruct
+ mapstruct
+ 1.4.2.Final
+ compile
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.4.2
+
+
+ org.apache.commons
+ commons-lang3
+ 3.14.0
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
\ No newline at end of file
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/converter/ObjectToStringDeserializer.java b/commoms/core/src/main/java/com/evotech/hd/core/converter/ObjectToStringDeserializer.java
new file mode 100644
index 0000000..0f8a69c
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/converter/ObjectToStringDeserializer.java
@@ -0,0 +1,24 @@
+package com.evotech.hd.core.converter;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+import java.io.IOException;
+
+/**
+ * ObjectToStringDeserializer
+ *
+ * @author andy.shi
+ * @ClassName:ObjectToStringDeserializer
+ * @date: 2025年10月25日 8:50
+ * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
+ */
+
+public class ObjectToStringDeserializer extends JsonDeserializer {
+ @Override
+ public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+ // 将 JSON 对象转为字符串(如 {"key":"value"} → "{\"key\":\"value\"}")
+ return p.readValueAsTree().toString();
+ }
+}
\ No newline at end of file
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/dtos/BaseDTO.java b/commoms/core/src/main/java/com/evotech/hd/core/dtos/BaseDTO.java
new file mode 100644
index 0000000..b67a86c
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/dtos/BaseDTO.java
@@ -0,0 +1,88 @@
+package com.evotech.hd.core.dtos;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.evotech.hd.core.converter.ObjectToStringDeserializer;
+import com.evotech.hd.query.Query;
+import com.evotech.hd.query.QueryType;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.type.JdbcType;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Data
+@JsonInclude(JsonInclude.Include.ALWAYS)
+public abstract class BaseDTO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ /**
+ * 实体主键
+ */
+ @ApiModelProperty("唯一标识")
+ private Integer id;
+ @ApiModelProperty("name")
+ @Query(javaField = "name", tableColumn = "a.name", type = QueryType.LIKE)
+ String name;
+
+ @ApiModelProperty(hidden = true)
+ private Date createTime;
+
+ @ApiModelProperty(hidden = true)
+ @TableField(typeHandler = JacksonTypeHandler.class, jdbcType = JdbcType.OTHER)
+ @JsonDeserialize(using = ObjectToStringDeserializer.class)
+ private String extendeds;
+
+
+ public Map getExtendeds() {
+ if(StringUtils.isNotEmpty(extendeds)){
+ try {
+// ObjectMapper 是 Jackson 库的核心类,用于处理 JSON 数据的序列化和反序列化。它提供了多种方法来将 Java 对象转换为 JSON 字符串,以及将 JSON 字符串转换为 Java 对象
+ // 使用 Jackson 库将 JSON 字符串反序列化为 Map 类型的代码
+ return new ObjectMapper().readValue(extendeds, Map.class);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to parse JSON", e);
+ }
+ }
+ return new LinkedHashMap<>();
+ }
+ public void setParams(Map params) {
+ if (params == null) {
+ this.extendeds = null;
+ } else {
+ try {
+ // 将 params(一个 Map 类型的对象)转换为 JSON 格式的字符串,并将其存储在 paramsJson 字段中
+ this.extendeds = new ObjectMapper().writeValueAsString(params);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to serialize JSON", e);
+ }
+ }
+ }
+
+ /**
+ * 构造函数
+ */
+ public BaseDTO() {
+
+ }
+
+ /**
+ * 构造函数
+ *
+ * @param id
+ */
+ public BaseDTO(Integer id) {
+ this.id = id;
+ }
+
+
+}
+
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/dtos/LoginForm.java b/commoms/core/src/main/java/com/evotech/hd/core/dtos/LoginForm.java
new file mode 100644
index 0000000..0dbb072
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/dtos/LoginForm.java
@@ -0,0 +1,22 @@
+package com.evotech.hd.core.dtos;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("登录对象")
+@Data
+public class LoginForm {
+
+ /**
+ * 用户名
+ */
+ @ApiModelProperty("用户名")
+ private String username;
+
+ /**
+ * 密码
+ */
+ @ApiModelProperty("密码")
+ private String password;
+}
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/dtos/OptionDTO.java b/commoms/core/src/main/java/com/evotech/hd/core/dtos/OptionDTO.java
new file mode 100644
index 0000000..abc6431
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/dtos/OptionDTO.java
@@ -0,0 +1,62 @@
+package com.evotech.hd.core.dtos;
+
+import com.evotech.hd.core.entity.BaseEntity;
+import com.evotech.hd.core.enums.BaseEnum;
+import com.evotech.hd.utils.Collections;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 下拉菜单 模版 类
+ *
+ * @ClassName:OptionDTO
+ * @date: 2025年09月17日 9:23
+ * @author: andy.shi
+ * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
+ */
+@Data
+@ApiModel("下拉菜单模版")
+public class OptionDTO implements Serializable {
+
+ @ApiModelProperty("下拉菜单name")
+ String label;
+
+ @ApiModelProperty("下拉菜单value")
+ String value;
+
+ List childList = Collections.emptyList();
+
+ public OptionDTO() {
+ }
+
+ public OptionDTO(String label, String value) {
+ this.label = label;
+ this.value = value;
+ }
+
+ public OptionDTO(BaseEnum baseEnum) {
+ this.label = String.valueOf(baseEnum.getLabel());
+ this.value = String.valueOf(baseEnum.getValue());
+ }
+
+ public OptionDTO(BaseEntity baseEntity) {
+ this.label = baseEntity.getName();
+ this.value = baseEntity.getKey();
+ }
+
+ public static List getOptionDTOList(Map params) {
+ List optionList = Collections.emptyList();
+ Iterator> paramsIt = params.entrySet().iterator();
+ while (paramsIt.hasNext()){
+ Map.Entry entry = paramsIt.next();
+ optionList.add(new OptionDTO(entry.getKey(), entry.getValue()));
+ }
+ return optionList;
+ }
+}
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/dtos/PageDTO.java b/commoms/core/src/main/java/com/evotech/hd/core/dtos/PageDTO.java
new file mode 100644
index 0000000..35f704b
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/dtos/PageDTO.java
@@ -0,0 +1,23 @@
+package com.evotech.hd.core.dtos;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 类
+ *
+ * @ClassName:PageDTO
+ * @date: 2025年08月20日 15:01
+ * @author: andy.shi
+ * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
+ */
+@Data
+@ApiModel("分页工具类")
+public class PageDTO {
+
+ @ApiModelProperty("当前页")
+ Integer page;
+ @ApiModelProperty("每页显示的条数")
+ Integer pageSize;
+}
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/dtos/ParamMeta.java b/commoms/core/src/main/java/com/evotech/hd/core/dtos/ParamMeta.java
new file mode 100644
index 0000000..e5c8098
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/dtos/ParamMeta.java
@@ -0,0 +1,31 @@
+package com.evotech.hd.core.dtos;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 类
+ *
+ * @ClassName:ParamMeta
+ * @date: 2025年09月18日 13:38
+ * @author: andy.shi
+ * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
+ */
+@Data
+@ApiModel("MAP类型数据返回")
+public class ParamMeta {
+ @ApiModelProperty("Map的key")
+ private String key;
+
+ @ApiModelProperty("特殊参数对象")
+ private T value;
+
+ public ParamMeta() {
+ }
+
+ public ParamMeta(String key, T value) {
+ this.key = key;
+ this.value = value;
+ }
+}
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/dtos/RequestParams.java b/commoms/core/src/main/java/com/evotech/hd/core/dtos/RequestParams.java
new file mode 100644
index 0000000..fa85419
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/dtos/RequestParams.java
@@ -0,0 +1,22 @@
+package com.evotech.hd.core.dtos;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 类
+ *
+ * @ClassName:Params
+ * @date: 2025年09月04日 15:37
+ * @author: andy.shi
+ * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
+ */
+@Data
+@ApiModel("请求接口参数")
+public class RequestParams{
+ @ApiModelProperty("请求条件")
+ T params;
+ @ApiModelProperty("分页")
+ PageDTO page;
+}
diff --git a/commoms/core/src/main/java/com/evotech/hd/core/dtos/Result.java b/commoms/core/src/main/java/com/evotech/hd/core/dtos/Result.java
new file mode 100644
index 0000000..eb78d2b
--- /dev/null
+++ b/commoms/core/src/main/java/com/evotech/hd/core/dtos/Result.java
@@ -0,0 +1,135 @@
+package com.evotech.hd.core.dtos;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.evotech.hd.core.enums.CodeMsg;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 请求返回对象
+ * @ClassName:BaseResponse
+ * @date: 2025年04月15日 16:37
+ * @author: andy.shi
+ * @contact: 17330188597
+ * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
+ */
+@Data
+@ApiModel
+public class Result implements Serializable {
+
+ @ApiModelProperty("请求处理状态")
+ private Integer status;
+ @ApiModelProperty("状态码")
+ private String code;
+ @ApiModelProperty("返回消息")
+ private String msg;
+ @ApiModelProperty(value = "返回数据", required = true)
+ private T data;
+
+ public static Result getInstance(){
+ return new Result();
+ }
+
+ public Result() {
+ }
+
+ public Result build(Class cls) {
+ return (Result) this;
+ }
+ public Result> buildList(Class cls) {
+ return (Result>) this;
+ }
+
+ public Result> buildIPage(Class cls) {
+ return (Result>) this;
+ }
+
+ public Result