diff --git a/ruoyi-modules/E8Service/Dockerfile b/ruoyi-modules/E8Service/Dockerfile
new file mode 100644
index 00000000..0b8e5e09
--- /dev/null
+++ b/ruoyi-modules/E8Service/Dockerfile
@@ -0,0 +1,27 @@
+# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-debian:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds
+#FROM findepi/graalvm:java17-native
+
+LABEL maintainer="Lion Li"
+
+RUN mkdir -p /smartparks/E8Service/logs \
+ /smartparks/E8Service/temp \
+ /smartparks/E8Service/agent
+
+WORKDIR /ruoyi/system
+
+ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
+
+EXPOSE ${SERVER_PORT}
+
+ADD ./target/E8Service.jar ./E8Service.jar
+
+SHELL ["/bin/bash", "-c"]
+
+ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
+ #-Dskywalking.agent.service_name=ruoyi-system \
+ #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \
+ -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \
+ -jar E8Service.jar
+
diff --git a/ruoyi-modules/E8Service/pom.xml b/ruoyi-modules/E8Service/pom.xml
new file mode 100644
index 00000000..8d17813e
--- /dev/null
+++ b/ruoyi-modules/E8Service/pom.xml
@@ -0,0 +1,133 @@
+
+
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+
+ 4.0.0
+
+ E8Service
+
+
+ E8Service-e8服务接口
+
+
+
+
+
+ org.dromara
+ ruoyi-common-nacos
+
+
+
+ org.dromara
+ ruoyi-common-sentinel
+
+
+
+
+ org.dromara
+ ruoyi-common-log
+
+
+
+ org.dromara
+ ruoyi-common-service-impl
+
+
+
+ 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
+
+
+
+
+ org.dromara
+ ruoyi-api-workflow
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/E8ServiceApplication.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/E8ServiceApplication.java
new file mode 100644
index 00000000..be8e55b6
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/E8ServiceApplication.java
@@ -0,0 +1,22 @@
+package org.dromara.E8Service;
+
+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;
+
+/**
+ * 系统模块
+ *
+ * @author ruoyi
+ */
+@EnableDubbo
+@SpringBootApplication
+public class E8ServiceApplication {
+ public static void main(String[] args) {
+ SpringApplication application = new SpringApplication(E8ServiceApplication.class);
+ application.setApplicationStartup(new BufferingApplicationStartup(2048));
+ application.run(args);
+ System.out.println("(♥◠‿◠)ノ゙ 系统模块启动成功 ლ(´ڡ`ლ)゙ ");
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/CustomerService.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/CustomerService.java
new file mode 100644
index 00000000..eb4c8914
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/CustomerService.java
@@ -0,0 +1,57 @@
+package org.dromara.E8Service.Service.base;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.dromara.E8Service.domain.QueryDto;
+import org.dromara.E8Service.domain.custom.req.CustomAddReq;
+import org.dromara.E8Service.domain.custom.req.CustomFindReq;
+import org.dromara.E8Service.domain.custom.req.CustomUpdateReq;
+import org.dromara.E8Service.domain.custom.res.CustomAddRes;
+import org.dromara.E8Service.domain.custom.res.CustomFindRes;
+
+/**
+ * @author lsm
+ * @apiNote CustomerService
+ * @since 2025/6/23
+ */
+public interface CustomerService {
+
+ /**
+ * 查询单个人员信息
+ *
+ * @param findReq 传参
+ * @return CustomFindRes
+ */
+ CustomFindRes findCustomer(CustomFindReq findReq);
+
+ /**
+ * 人员信息分页查询
+ *
+ * @param dto 传参
+ * @return IPage
+ */
+ IPage findCustomerList(QueryDto dto);
+
+ /**
+ * 新增人员信息
+ *
+ * @param addReq 传参
+ * @return CustomAddRes
+ */
+ CustomAddRes addCustomer(CustomAddReq addReq);
+
+ /**
+ * 人员信息修改
+ *
+ * @param updateReq 传参
+ * @return Boolean
+ */
+ Boolean updateCustomer(CustomUpdateReq updateReq);
+
+ /**
+ * 删除人员信息
+ *
+ * @param id 传参
+ * @return Boolean
+ */
+ Boolean deleteCustomer(Long id);
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/LiftService.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/LiftService.java
new file mode 100644
index 00000000..cd64ff10
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/LiftService.java
@@ -0,0 +1,56 @@
+package org.dromara.E8Service.Service.base;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.dromara.E8Service.domain.QueryDto;
+import org.dromara.E8Service.domain.lift.req.LiftAddReq;
+import org.dromara.E8Service.domain.lift.req.LiftUpdateReq;
+import org.dromara.E8Service.domain.lift.res.LiftFindRes;
+
+/**
+ * @author zcxlsm
+ * @apiNote LiftService
+ * @since 2025/5/9 18:04
+ */
+public interface LiftService {
+
+ /**
+ * 电梯信息分页查询
+ *
+ * @param dto 传参
+ * @return IPage
+ */
+ IPage getPageList(QueryDto dto);
+
+ /**
+ * 查询电梯楼层
+ *
+ * @param id 传参
+ * @return LiftFindRes
+ */
+ LiftFindRes getLiftFloor(Long id);
+
+ /**
+ * 添加电梯
+ *
+ * @param addReq 传参
+ * @return Boolean
+ */
+ Boolean addLift(LiftAddReq addReq);
+
+ /**
+ * 修改电梯信息
+ *
+ * @param updateReq 传参
+ * @return Boolean
+ */
+ Boolean updateLift(LiftUpdateReq updateReq);
+
+ /**
+ * 删除电梯信息
+ *
+ * @param id 传参
+ * @return Boolean
+ */
+ Boolean deleteLift(Integer id);
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/impl/CustomerServiceImpl.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/impl/CustomerServiceImpl.java
new file mode 100644
index 00000000..d3394838
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/impl/CustomerServiceImpl.java
@@ -0,0 +1,171 @@
+package org.dromara.E8Service.Service.base.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.E8Service.Service.base.CustomerService;
+import org.dromara.E8Service.domain.ApiResp;
+import org.dromara.E8Service.domain.QueryDto;
+import org.dromara.E8Service.domain.custom.req.CustomAddReq;
+import org.dromara.E8Service.domain.custom.req.CustomFindReq;
+import org.dromara.E8Service.domain.custom.req.CustomUpdateReq;
+import org.dromara.E8Service.domain.custom.res.CustomAddRes;
+import org.dromara.E8Service.domain.custom.res.CustomFindRes;
+import org.dromara.E8Service.utils.E8ApiUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author lsm
+ * @apiNote CustomerServiceImpl
+ * @since 2025/6/23
+ */
+@Slf4j
+@Service
+@DubboService
+public class CustomerServiceImpl implements CustomerService {
+ private final static String CUSTOMER_GET_PAGE_LIST = "/api/E8/customer/get-page-list";
+ private final static String CUSTOMER_GET_FIRST_OR_DEFAULT = "/api/E8/customer/get-first-or-default";
+ private final static String CUSTOMER_CREATE = "/api/E8/customer";
+ private final static String CUSTOMER_UPDATE = "/api/E8/customer/{id}/update";
+ private final static String CUSTOMER_DELETE = "/api/E8/customer/{id}";
+
+ @Resource
+ private E8ApiUtil e8ApiUtil;
+
+ /**
+ * 查询单个人员信息
+ *
+ * @param findReq 传参
+ * @return CustomerInfo
+ */
+ @Override
+ public CustomFindRes findCustomer(CustomFindReq findReq) {
+ // 将查询请求对象转换为参数映射
+ Map params = BeanUtil.beanToMap(findReq);
+
+ // 调用API接口获取客户信息
+ ApiResp apiResp = e8ApiUtil.doPost(params, CUSTOMER_GET_FIRST_OR_DEFAULT);
+
+ // 检查API调用是否成功
+ if (!apiResp.getSuccess()) {
+ log.info("E8查询人员信息失败 errorMsg:{}", apiResp);
+ // 如果API调用失败,返回null
+ return null;
+ }
+
+ // 将API响应结果转换为CustomFindRes对象并返回
+ return JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), CustomFindRes.class);
+ }
+
+ /**
+ * 人员信息分页查询
+ *
+ * @param dto 传参
+ * @return IPage
+ */
+ @Override
+ public IPage findCustomerList(QueryDto dto) {
+ // 创建参数映射,用于存储HTTP请求的参数
+ Map params = new HashMap<>();
+ // 添加分页参数:当前页码和最大结果数量
+ params.put("pageIndex", dto.getPageIndex());
+ params.put("maxResultCount", dto.getMaxResultCount());
+ // 将查询条件对象转换为JSON字符串,并再次转换为Map对象,然后添加到参数映射中
+ params.put("queryDto", JSONUtil.toBean(JSONUtil.toJsonStr(dto.getQueryDto()), CustomFindReq.class));
+
+ // 调用API工具类的POST方法,发送请求到第三方API,并获取响应结果
+ ApiResp apiResp = e8ApiUtil.doPost(params, CUSTOMER_GET_PAGE_LIST);
+
+
+ if (!apiResp.getSuccess()) {
+ log.info("E8人员信息分页查询 errorMsg:{}", apiResp);
+ // 如果API响应不成功,返回null
+ return null;
+ }
+
+ // 将API响应结果转换为Map对象,以便于后续处理
+ Map result = JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), new TypeReference<>() {
+ }, false);
+ // 创建一个分页对象,用于存储客户信息列表和分页数据
+ IPage pageInfo = new Page<>(dto.getPageIndex(), dto.getMaxResultCount());
+ // 设置总记录数
+ pageInfo.setTotal(Long.parseLong(result.get("total").toString()));
+ // 将API响应结果中的客户信息列表转换为CustomFindRes对象列表,并设置到分页对象中
+ pageInfo.setRecords(JSONUtil.toList(JSONUtil.toJsonStr(result.get("item")), CustomFindRes.class));
+
+ // 返回分页对象
+ return pageInfo;
+ }
+
+ /**
+ * 新增人员信息
+ *
+ * @param addReq 传参
+ * @return Boolean
+ */
+ @Override
+ public CustomAddRes addCustomer(CustomAddReq addReq) {
+ // 将添加请求对象转换为Map对象,以便后续API调用
+ Map params = BeanUtil.beanToMap(addReq);
+
+ // 执行客户创建API调用,并获取API响应对象
+ ApiResp apiResp = e8ApiUtil.doPost(params, CUSTOMER_CREATE);
+
+ // 检查API调用是否成功
+ if (!apiResp.getSuccess()) {
+ log.info("E8新增人员信息失败 errorMsg:{}", apiResp);
+ // 如果API调用失败,返回null
+ return null;
+ }
+
+ // 返回API调用是否成功的标志
+ return JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), CustomAddRes.class);
+ }
+
+ /**
+ * 人员信息修改
+ *
+ * @param updateReq 传参
+ * @return Boolean
+ */
+ @Override
+ public Boolean updateCustomer(CustomUpdateReq updateReq) {
+ // 根据更新请求构建API URL
+ String api = CUSTOMER_UPDATE.replace("{id}", updateReq.getId().toString());
+
+ // 将更新请求对象转换为Map,以便后续API调用
+ Map params = BeanUtil.beanToMap(updateReq);
+
+ // 调用API工具类发送POST请求,并获取API响应对象
+ ApiResp apiResp = e8ApiUtil.doPost(params, api);
+
+ // 返回API调用是否成功的标志
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 删除人员信息
+ *
+ * @param id 传参
+ * @return Boolean
+ */
+ @Override
+ public Boolean deleteCustomer(Long id) {
+ // 构造删除客户的API请求URL
+ String api = CUSTOMER_DELETE.replace("{id}", id.toString());
+
+ // 调用API工具类的 doGetOrDel 方法发送GET或DELETE请求,并获取响应结果
+ ApiResp apiResp = e8ApiUtil.doGetOrDel(api, null, true);
+
+ // 返回API请求是否成功的标志
+ return apiResp.getSuccess();
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/impl/LiftServiceImpl.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/impl/LiftServiceImpl.java
new file mode 100644
index 00000000..0aaa26ec
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/base/impl/LiftServiceImpl.java
@@ -0,0 +1,163 @@
+package org.dromara.E8Service.Service.base.impl;
+
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.E8Service.Service.base.LiftService;
+import org.dromara.E8Service.domain.ApiResp;
+import org.dromara.E8Service.domain.QueryDto;
+import org.dromara.E8Service.domain.lift.req.LiftAddReq;
+import org.dromara.E8Service.domain.lift.req.LiftFindReq;
+import org.dromara.E8Service.domain.lift.req.LiftUpdateReq;
+import org.dromara.E8Service.domain.lift.res.LiftFindRes;
+import org.dromara.E8Service.utils.E8ApiUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author lsm
+ * @apiNote LiftServiceImpl
+ * @since 2025/5/9 11:52
+ */
+@Service
+@DubboService
+public class LiftServiceImpl implements LiftService {
+
+ private static final String GET_PAGE_LIST = "/api/E8Door/man-elevator-management/get-page-list";
+ private static final String GET_LIFT_FLOOR = "/api/E8Door/man-elevator-management/{id}/get-man-elevator-floors";
+ private static final String LIFT_ADD = "/api/E8Door/man-elevator-management";
+ private static final String LIFT_UPDATE = "/api/E8Door/man-elevator-management/{id}/update";
+ private static final String LIFT_DELETE = "/api/E8Door/man-elevator-management/{id}";
+
+ @Resource
+ private E8ApiUtil e8ApiUtil;
+
+ /**
+ * 电梯信息分页查询
+ *
+ * @param dto 传参
+ * @return IPage
+ */
+ @Override
+ public IPage getPageList(QueryDto dto) {
+ // 创建一个参数映射,用于存储API请求所需的参数
+ Map params = new HashMap<>();
+ // 将分页索引和最大结果数放入参数映射中
+ params.put("pageIndex", dto.getPageIndex());
+ params.put("maxResultCount", dto.getMaxResultCount());
+ // 将查询DTO转换为LiftInfo对象,并将其添加到参数映射中
+ params.put("queryDto", JSONUtil.toBean(JSONUtil.toJsonStr(dto.getQueryDto()), LiftFindReq.class));
+
+ // 调用E8 API工具类的POST方法,传入参数和API路径,获取API响应
+ ApiResp apiResp = e8ApiUtil.doPost(params, GET_PAGE_LIST);
+ // 如果API响应不成功,则返回null
+ if (!apiResp.getSuccess()) {
+ return null;
+ }
+
+ // 将API响应的结果转换为一个Map对象
+ Map result = JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), new TypeReference<>() {
+ }, false);
+ // 创建一个分页对象,传入分页索引和最大结果数
+ IPage page = new Page<>(dto.getPageIndex(), dto.getMaxResultCount());
+ // 设置分页对象的总记录数
+ page.setTotal(Long.parseLong(result.get("total").toString()));
+ // 将结果中的项转换为LiftFindRes列表,并设置为分页对象的记录
+ page.setRecords(JSONUtil.toList(JSONUtil.toJsonStr(result.get("item")), LiftFindRes.class));
+
+ // 返回填充了数据的分页对象
+ return page;
+ }
+
+ /**
+ * 查询电梯楼层
+ *
+ * @param id 传参
+ * @return LiftFindRes
+ */
+ @Override
+ public LiftFindRes getLiftFloor(Long id) {
+
+ // 构造请求URL,其中{id}将被liftInfo的ID替换
+ String url = GET_LIFT_FLOOR.replace("{id}", id.toString());
+
+ // 调用API接口,获取电梯信息
+ ApiResp apiResp = e8ApiUtil.doPost(null, url);
+ // 如果API调用不成功,则返回null
+ if (!apiResp.getSuccess()) {
+ return null;
+ }
+
+ // 将API响应结果转换为LiftFindRes对象,并返回
+ return JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), LiftFindRes.class);
+ }
+
+ /**
+ * 添加电梯
+ *
+ * @param addReq 传参
+ * @return Boolean
+ */
+ @Override
+ public Boolean addLift(LiftAddReq addReq) {
+ // 将添加请求对象转换为Map对象,便于后续操作
+ Map params = BeanUtil.beanToMap(addReq);
+
+ // 调用第三方API进行电梯添加操作,并获取API响应结果
+ ApiResp apiResp = e8ApiUtil.doPost(params, LIFT_ADD);
+
+ // 返回API操作是否成功的标志
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 修改电梯信息
+ *
+ * @param updateReq 传参
+ * @return Boolean
+ */
+ @Override
+ public Boolean updateLift(LiftUpdateReq updateReq) {
+
+ // 根据LiftUpdateReq对象中的ID生成请求URL
+ String url = LIFT_UPDATE.replace("{id}", updateReq.getId().toString());
+
+ // 将LiftUpdateReq对象转换为Map类型,以便于API请求参数的处理
+ Map params = BeanUtil.beanToMap(updateReq);
+
+ // 调用E8 API进行POST请求,并返回API响应对象
+ ApiResp apiResp = e8ApiUtil.doPost(params, url);
+
+ // 返回API调用是否成功的标志
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 删除电梯信息
+ *
+ * @param id 传参
+ * @return Boolean
+ */
+ @Override
+ public Boolean deleteLift(Integer id) {
+
+ // 构造删除电梯的API请求URL,使用id替换模板中的{id}占位符
+ String url = LIFT_DELETE.replace("{id}", id.toString());
+
+ // 调用e8ApiUtils工具类执行DELETE请求,并获取API响应结果
+ ApiResp apiResp = e8ApiUtil.doGetOrDel(url, null, true);
+
+ // 返回API响应中的成功标志,表示删除操作是否成功
+ return apiResp.getSuccess();
+ }
+
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/AccessControlService.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/AccessControlService.java
new file mode 100644
index 00000000..6217a056
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/AccessControlService.java
@@ -0,0 +1,47 @@
+package org.dromara.E8Service.Service.business;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.dromara.E8Service.domain.AccessControl.req.RemoteOpenDoorReq;
+import org.dromara.E8Service.domain.AccessControl.res.AccessRecordFindRes;
+import org.dromara.E8Service.domain.QueryDto;
+
+/**
+ * @author lsm
+ * @apiNote AccessControlService
+ * @since 2025/6/24
+ */
+public interface AccessControlService {
+
+ /**
+ * 远程开门
+ *
+ * @param req 传参
+ * @return Boolean
+ */
+ Boolean remoteOpenDoor(RemoteOpenDoorReq req);
+
+
+ /**
+ * 获取通行记录分页列表
+ *
+ * @param dto 传参
+ * @return IPage
+ */
+ IPage getPageAccessRecordList(QueryDto dto);
+
+// /**
+// * 人员授权
+// *
+// * @param imageFile 传参
+// * @return Boolean
+// */
+// Boolean addCustomerAuth(Byte[] imageFile);
+
+// /**
+// * 获取人员权限分页列表
+// *
+// * @param dto 传参
+// * @return
+// */
+// IPage getPageAccessControl(QueryDto dto);
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/VoucherControlService.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/VoucherControlService.java
new file mode 100644
index 00000000..12662511
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/VoucherControlService.java
@@ -0,0 +1,16 @@
+package org.dromara.E8Service.Service.business;
+
+/**
+ * @author lsm
+ * @apiNote VoucherControlService
+ * @since 2025/6/24
+ */
+public class VoucherControlService {
+
+ /**
+ * 上传人脸
+ *
+ * @param queryDto 查询参数
+ * @return 凭证控制列表
+ */
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/impl/AccessControlServiceImpl.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/impl/AccessControlServiceImpl.java
new file mode 100644
index 00000000..2cec0ee1
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/Service/business/impl/AccessControlServiceImpl.java
@@ -0,0 +1,110 @@
+package org.dromara.E8Service.Service.business.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.E8Service.Service.business.AccessControlService;
+import org.dromara.E8Service.domain.AccessControl.req.AccessRecordFindReq;
+import org.dromara.E8Service.domain.AccessControl.req.RemoteOpenDoorReq;
+import org.dromara.E8Service.domain.AccessControl.res.AccessRecordFindRes;
+import org.dromara.E8Service.domain.ApiResp;
+import org.dromara.E8Service.domain.QueryDto;
+import org.dromara.E8Service.utils.E8ApiUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author lsm
+ * @apiNote AccessControlServiceImpl
+ * @since 2025/6/24
+ */
+@Slf4j
+@Service
+@DubboService
+public class AccessControlServiceImpl implements AccessControlService {
+
+ // 远程开门
+ private static final String REMOTE_OPEN_DOOR = "/api/E8Door/man-device-info/device-control";
+
+ // 获取通行记录分页列表
+ private static final String GET_PAGE_ACCESS_RECORD_PAGE_LIST = "/api/E8Door/man-pass-record/get-page-list";
+
+ // 人员授权
+ private static final String PERSON_AUTHORIZATION = "/api/E8Door/man-auth-info/auth-info-by-type";
+
+ // 获取人员权限分页列表
+ private static final String GET_PAGE_PERSON_AUTHORIZATION_PAGE_LIST = "/api/E8Door/man-person-device-finally/get-page-list";
+
+ @Resource
+ private E8ApiUtil e8ApiUtil;
+
+ /**
+ * 远程开门
+ *
+ * @param req 入参
+ * @return Boolean
+ */
+ @Override
+ public Boolean remoteOpenDoor(RemoteOpenDoorReq req) {
+ // 将RemoteOpenDoorReq转为Map对象,以便作为API请求的参数
+ Map params = BeanUtil.beanToMap(req);
+
+ // 调用第三方API进行开门操作,传入处理后的参数和指定的API端点
+ ApiResp apiResp = e8ApiUtil.doPost(params, REMOTE_OPEN_DOOR);
+
+ // 返回API调用是否成功的结果
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 获取通行记录分页列表
+ *
+ * @param dto 传参
+ * @return IPage
+ */
+ @Override
+ public IPage getPageAccessRecordList(QueryDto dto) {
+ // 创建一个参数映射,用于存储API请求的参数
+ Map params = new HashMap<>();
+ // 将分页索引和最大结果数放入参数映射中
+ params.put("pageIndex", dto.getPageIndex());
+ params.put("maxResultCount", dto.getMaxResultCount());
+ // 将查询DTO转换为JSON字符串,再转换为Map对象,然后放入参数映射中
+ params.put("queryDto", JSONUtil.toBean(JSONUtil.toJsonStr(dto.getQueryDto()), AccessRecordFindReq.class));
+
+ // 调用API工具类的POST方法,传入参数和API路径,获取API响应对象
+ ApiResp apiResp = e8ApiUtil.doPost(params, GET_PAGE_ACCESS_RECORD_PAGE_LIST);
+ // 如果API响应不成功,则返回null
+ if (!apiResp.getSuccess()) {
+ return null;
+ }
+
+ // 将API响应的结果转换为JSON字符串,再转换为Map对象
+ Map result = JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), new TypeReference<>() {
+ }, false);
+ // 创建一个分页对象,传入分页索引和最大结果数
+ IPage page = new Page<>(dto.getPageIndex(), dto.getMaxResultCount());
+ // 从结果映射中获取总记录数,转换为长整型后设置到分页对象中
+ page.setTotal(Long.parseLong(result.get("total").toString()));
+ // 从结果映射中获取项目列表,转换为访问记录信息列表后设置到分页对象中
+ page.setRecords(JSONUtil.toList(JSONUtil.toJsonStr(result.get("item")), AccessRecordFindRes.class));
+
+ // 返回填充了数据的分页对象
+ return page;
+ }
+
+ /**
+ * 人员授权
+ *
+ * @param imageFile 传参
+ * @return Boolean
+ */
+
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/controller/AccessControlController.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/controller/AccessControlController.java
new file mode 100644
index 00000000..144d6c03
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/controller/AccessControlController.java
@@ -0,0 +1,66 @@
+package org.dromara.E8Service.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.E8Service.Service.business.AccessControlService;
+import org.dromara.E8Service.domain.AccessControl.req.RemoteOpenDoorReq;
+import org.dromara.E8Service.domain.AccessControl.res.AccessRecordFindRes;
+import org.dromara.E8Service.domain.QueryDto;
+import org.dromara.common.core.domain.R;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author lsm
+ * @apiNote AccessControlController
+ * @since 2025/6/24
+ */
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/e8accessControl")
+public class AccessControlController {
+
+ private final AccessControlService accessControlService;
+
+ /**
+ * 远程开门
+ *
+ * @param req 传参
+ * @return Boolean
+ */
+ @PostMapping("/remoteOpenDoor")
+ public R remoteOpenDoor(RemoteOpenDoorReq req) {
+ log.info("E8远程开门 入参:{}", req);
+
+ Boolean flag = accessControlService.remoteOpenDoor(req);
+
+ if (flag) {
+ return R.ok();
+ } else {
+ return R.fail("E8远程开门,调用失败!");
+ }
+ }
+
+ /**
+ * 获取门禁记录列表
+ *
+ * @param dto 查询参数
+ * @return IPage
+ */
+ @PostMapping("/getPageAccessRecordList")
+ public R> getPageAccessRecordList(QueryDto dto) {
+ log.info("E8获取门禁记录列表 入参:{}", dto);
+
+ IPage page = accessControlService.getPageAccessRecordList(dto);
+
+ if (page == null) {
+ return R.fail("E8获取门禁记录列表,调用失败!");
+ } else {
+ return R.ok(page);
+ }
+ }
+
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/controller/DoorDeviceController.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/controller/DoorDeviceController.java
new file mode 100644
index 00000000..9d868dfa
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/controller/DoorDeviceController.java
@@ -0,0 +1,120 @@
+package org.dromara.E8Service.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.E8Service.Service.base.DoorDeviceService;
+import org.dromara.E8Service.domain.DoorDevice.req.DoorDeviceAddReq;
+import org.dromara.E8Service.domain.DoorDevice.req.DoorDeviceUpdateReq;
+import org.dromara.E8Service.domain.DoorDevice.res.DoorDeviceAddRes;
+import org.dromara.E8Service.domain.DoorDevice.res.DoorDeviceFindRes;
+import org.dromara.E8Service.domain.DoorDevice.res.DoorDeviceUpdateRes;
+import org.dromara.E8Service.domain.QueryDto;
+import org.dromara.common.core.domain.R;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author lsm
+ * @apiNote DoorDeviceController
+ * @since 2025/6/23
+ */
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/e8doorDevice")
+public class DoorDeviceController {
+
+ private final DoorDeviceService doorDeviceService;
+
+ /**
+ * 查询门禁信息
+ *
+ * @param id 入参
+ * @return Result
+ */
+ @PostMapping("/findDoorDevice/{id}")
+ public R findDoorDevice(@PathVariable Long id) {
+ log.info("E8接口 查询门禁信息 入参={}", id);
+
+ DoorDeviceFindRes doorDeviceInfo = doorDeviceService.findDoorDevice(id);
+
+ if (doorDeviceInfo == null) {
+ return R.fail("E8接口查询门禁信息,调用失败!");
+ } else {
+ return R.ok(doorDeviceInfo);
+ }
+ }
+
+ /**
+ * 新增门禁信息
+ *
+ * @param addReq 入参
+ * @return Boolean
+ */
+ @PostMapping("/addDoorDevice")
+ public R addDoorDevice(@RequestBody DoorDeviceAddReq addReq) {
+ log.info("E8接口新增门禁信息 入参={}", addReq);
+
+ DoorDeviceAddRes doorDevice = doorDeviceService.addDoorDevice(addReq);
+
+ if (doorDevice == null) {
+ return R.fail("E8接口新增门禁信息,调用失败!");
+ } else {
+ return R.ok(doorDevice);
+ }
+ }
+
+ /**
+ * 门禁信息修改
+ *
+ * @param updateReq 入参
+ * @return Boolean
+ */
+ @PostMapping("/updateDoorDevice")
+ public R updateDoorDevice(@RequestBody DoorDeviceUpdateReq updateReq) {
+ log.info("E8接口门禁信息修改 入参={}", updateReq);
+
+ DoorDeviceUpdateRes doorDevice = doorDeviceService.updateDoorDevice(updateReq);
+
+ if (doorDevice == null) {
+ return R.fail("E8接口门禁信息修改,调用失败!");
+ } else {
+ return R.ok(doorDevice);
+ }
+ }
+
+ /**
+ * 删除门禁信息
+ *
+ * @param id 入参
+ * @return Boolean
+ */
+ @PostMapping("/deleteDoorDevice/{id}")
+ public R deleteDoorDevice(@PathVariable Integer id) {
+ log.info("E8接口删除门禁信息 入参={}", id);
+
+ Boolean flag = doorDeviceService.deleteDoorDevice(id);
+
+ return flag ? R.ok() : R.fail("E8接口删除门禁信息,调用失败!");
+ }
+
+ /**
+ * 查询门禁信息列表
+ *
+ * @param dto 入参
+ * @return IPage
+ */
+ @PostMapping("/findDoorDeviceList")
+ public R> findDoorDeviceList(@RequestBody QueryDto dto) {
+ log.info("E8接口查询门禁信息列表 入参={}", dto);
+
+ IPage doorDeviceList = doorDeviceService.findDoorDeviceList(dto);
+
+ if (ObjectUtils.isEmpty(doorDeviceList)) {
+ return R.fail("E8接口查询门禁信息列表,调用失败!");
+ } else {
+ return R.ok(doorDeviceList);
+ }
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/req/AccessRecordFindReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/req/AccessRecordFindReq.java
new file mode 100644
index 00000000..d0618d4d
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/req/AccessRecordFindReq.java
@@ -0,0 +1,60 @@
+package org.dromara.E8Service.domain.AccessControl.req;
+
+import lombok.Data;
+
+/**
+ * @author lsm
+ * @apiNote AccessRecordFindReq
+ * @since 2025/5/27 15:08
+ */
+@Data
+public class AccessRecordFindReq {
+
+ /**
+ * 是否脱敏 true脱敏,敏感信息加***隐藏;false完整显示
+ */
+ private Boolean isViewFullData;
+
+ /**
+ * 开始时间
+ */
+ private String startTime;
+
+ /**
+ * 结束时间
+ */
+ private String endTime;
+
+ /**
+ * 人员姓名
+ */
+ private String customerName;
+
+ /**
+ * 人员手机号码
+ */
+ private String tel;
+
+ /**
+ * 组织ID
+ */
+ private Long orgId;
+
+ /**
+ * 门ID
+ */
+ private Long doorId;
+
+ /**
+ * 设备ID
+ */
+ private Long deviceId;
+
+ /**
+ * 通行记录类型 0:未知 1:卡开门 2:人脸开门 3:指纹开门 4:密码开门 5:按钮开门 6:条码开门 7:多卡开门 8:密码开门 9:蓝牙开门 10:身份证开门
+ * 11:二维码开门 12:远程开门 13:卡呼梯 14:卡乘梯 15:密码呼梯 16:密码乘梯 17:指纹呼梯 18:指纹乘梯 19:人脸呼梯 20:人脸乘梯
+ * 21:二维码呼梯 22:二维码乘梯 23:扫码呼梯 24:扫码乘梯 25:蓝牙呼梯 26:远程呼梯 27:远程授权
+ */
+ private Integer recordType;
+
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/req/RemoteOpenDoorReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/req/RemoteOpenDoorReq.java
new file mode 100644
index 00000000..3775c8f9
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/req/RemoteOpenDoorReq.java
@@ -0,0 +1,48 @@
+package org.dromara.E8Service.domain.AccessControl.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote RemoteOpenDoorReq
+ * @since 2025/5/27 15:02
+ */
+@Data
+public class RemoteOpenDoorReq {
+
+ /**
+ * 门操作类型 0:开门 1:关门 2:常开 3:常闭 4:取消常开 5:取消常闭 6:取消报警
+ */
+ private Integer type;
+
+ /**
+ * 原因
+ */
+ private String reason;
+
+ /**
+ * 操作人ID
+ */
+ private Long operatorId;
+
+ /**
+ * 门操作数据
+ */
+ private List controlList;
+
+ @Data
+ public static class ControlData {
+
+ /**
+ * 门ID
+ */
+ private Long doorId;
+
+ /**
+ * 设备ID
+ */
+ private Long deviceId;
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/res/AccessRecordFindRes.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/res/AccessRecordFindRes.java
new file mode 100644
index 00000000..0e48bb4f
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/AccessControl/res/AccessRecordFindRes.java
@@ -0,0 +1,245 @@
+package org.dromara.E8Service.domain.AccessControl.res;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author lsm
+ * @apiNote AccessRecordFindRes
+ * @since 2025/5/27 15:12
+ */
+@Data
+public class AccessRecordFindRes {
+
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 记录ID
+ */
+ private String recordId;
+
+ /**
+ * 设备ID
+ */
+ private Long deviceId;
+
+ /**
+ * 设备编号
+ */
+ private Integer devNo;
+
+ /**
+ * 设备名称
+ */
+ private String deviceName;
+
+ /**
+ * 门ID
+ */
+ private Long doorId;
+
+ /**
+ * 门名称
+ */
+ private String doorName;
+
+ /**
+ * 设备类型(例如:1102-车场控制机,205-辅机等)
+ */
+ private Integer deviceType;
+
+ /**
+ * 分控ID
+ */
+ private Long deviceSubId;
+
+ /**
+ * 读头ID
+ */
+ private Long readerId;
+
+ /**
+ * 读头名称
+ */
+ private String readerName;
+
+ /**
+ * 出入口类型(0-未知,1-入口,2-出口)
+ */
+ private Integer gatewayType;
+
+ /**
+ * 区域ID
+ */
+ private Long areaId;
+
+ /**
+ * 区域名称
+ */
+ private String areaName;
+
+ /**
+ * 客户ID
+ */
+ private Long customerId;
+
+ /**
+ * 客户编号
+ */
+ private String customerNo;
+
+ /**
+ * 客户名称
+ */
+ private String customerName;
+
+ /**
+ * 客户名称(备用字段)
+ */
+ private String customerName1;
+
+ /**
+ * 客户手机号
+ */
+ private String customerTel;
+
+ /**
+ * 客户手机号(备用字段)
+ */
+ private String customerTel1;
+
+ /**
+ * 组织ID
+ */
+ private String organIds;
+
+ /**
+ * 组织全路径
+ */
+ private String organFullPath;
+
+ /**
+ * 卡类别(例如:34-普通用户卡,35-胁迫卡等)
+ */
+ private Integer cardType;
+
+ /**
+ * 凭证编号
+ */
+ private String idno;
+
+ /**
+ * 凭证类型(例如:10-MF1-A卡,20-个人密码等)
+ */
+ private Integer voucherType;
+
+ /**
+ * 凭证模式(0-ID卡模式,1-IC卡模式等)
+ */
+ private Integer voucherMode;
+
+ /**
+ * 图片地址
+ */
+ private String pictureUrl;
+
+ /**
+ * 监控图片地址
+ */
+ private String monitorPictureUrl;
+
+ /**
+ * 视频地址
+ */
+ private String videoUrl;
+
+ /**
+ * 通行记录类型(例如:1-卡开门,2-人脸开门等)
+ */
+ private Integer recordType;
+
+ /**
+ * 是否脱机记录(0-否,1-是)
+ */
+ private Integer offineFlag;
+
+ /**
+ * 通行时间
+ */
+ private Date actionTime;
+
+ /**
+ * 添加时间
+ */
+ private Date addTime;
+
+ /**
+ * 扩展字段
+ */
+ private String extend;
+
+ /**
+ * 体温
+ */
+ private Double temperature;
+
+ /**
+ * 健康状态(0-未知,1-正常,2-异常)
+ */
+ private Integer healthCodeStatus;
+
+ /**
+ * 设备类型描述
+ */
+ private String deviceTypeDesc;
+
+ /**
+ * 出入口类型描述
+ */
+ private String gatewayTypeDesc;
+
+ /**
+ * 凭证类型描述
+ */
+ private String voucherTypeDesc;
+
+ /**
+ * 凭证模式描述
+ */
+ private String voucherModeDesc;
+
+ /**
+ * 卡类描述
+ */
+ private String cardTypeDesc;
+
+ /**
+ * 记录类型描述
+ */
+ private String recordTypeDesc;
+
+ /**
+ * 体温描述
+ */
+ private String temperatureDesc;
+
+ /**
+ * 健康码状态描述
+ */
+ private String healthCodeStatusDesc;
+
+ /**
+ * 人脸凭证地址
+ */
+ private String voucherUrl;
+
+ /**
+ * 是否显示敏感信息(true-隐藏,false-显示)
+ */
+ private Boolean isViewFullData;
+
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/DoorDevice/res/DoorDeviceUpdateRes.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/DoorDevice/res/DoorDeviceUpdateRes.java
new file mode 100644
index 00000000..06a428f4
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/DoorDevice/res/DoorDeviceUpdateRes.java
@@ -0,0 +1,198 @@
+package org.dromara.E8Service.domain.DoorDevice.res;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote DoorDeviceUpdateRes
+ * @since 2025/6/23
+ */
+@Data
+public class DoorDeviceUpdateRes {
+ /**
+ * 设备ID
+ */
+ private Long id;
+ /**
+ * 创建时间
+ */
+ private String creationTime;
+ /**
+ * 创建者ID
+ */
+ private String creatorId;
+ /**
+ * 修改时间
+ */
+ private String lastModificationTime;
+ /**
+ * 修改者ID
+ */
+ private String lastModifierId;
+ /**
+ * 是否删除
+ */
+ private Boolean isDeleted;
+ /**
+ * 删除者ID
+ */
+ private String deleterId;
+ /**
+ * 删除时间
+ */
+ private String deletionTime;
+ /**
+ * 设备编号
+ */
+ private String no;
+ /**
+ * 设备编号编码
+ */
+ private Integer noCode;
+ /**
+ * cloudId
+ */
+ private String cloudId;
+ /**
+ * name
+ */
+ private String name;
+ /**
+ * 父级设备名称
+ */
+ private String parentName;
+ /**
+ * 父级设备ID,默认0
+ */
+ private Integer parentId;
+ /**
+ * 管理机IP
+ */
+ private String masterIp;
+ /**
+ * 设备IP
+ */
+ private String ip;
+ /**
+ * 设备端口
+ */
+ private Long port;
+ /**
+ * 设备MAC
+ */
+ private String mac;
+ /**
+ * 子网掩码
+ */
+ private String netMask;
+ /**
+ * 设备网关
+ */
+ private String gatewayIP;
+ /**
+ * 设备产品线类型 0:车行 1:车位 2:人行
+ */
+ private Integer productType;
+ /**
+ * 设备类型
+ */
+ private Long type;
+ /**
+ * 设备类型描述
+ */
+ private String typeDescription;
+ /**
+ * 业务逻辑设备类型
+ */
+ private Integer logicType;
+ /**
+ * 设备型号
+ */
+ private Integer model;
+ /**
+ * 设备型号描述
+ */
+ private String modelDescription;
+ /**
+ * 机号
+ */
+ private String modelName;
+ /**
+ * 设备序列号
+ */
+ private String sn;
+ /**
+ * 设备CPUID
+ */
+ private String cpuID;
+ /**
+ * 设备在线状态 0:离线 1:在线 2:未知
+ */
+ private Integer status;
+ /**
+ * 设备在线状态描述
+ */
+ private String statusDescription;
+ /**
+ * 机号
+ */
+ private String macNo;
+ /**
+ * 蓝牙地址
+ */
+ private String bluetoothAddr;
+ /**
+ * 设备层级
+ */
+ private Integer deviceLevel;
+ /**
+ * 父级设备路径 默认空
+ */
+ private String parentIdPath;
+ /**
+ * 是否需要升级
+ */
+ private Boolean isNeedUpgrade;
+ /**
+ * 项目ID
+ */
+ private Integer projectId;
+ /**
+ * 创建者
+ */
+ private String creatorName;
+ /**
+ * 关联门
+ */
+ private String relDoors;
+ /**
+ * int32 出入口类型 0:未知 1:入口 2:出口
+ */
+ private Integer gatewayType;
+ /**
+ * 出入口类型
+ */
+ private String gatewayTypeDesc;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 设备通讯方式 0:TCP/IP 1:RS485
+ */
+ private Integer commType;
+ /**
+ * 工单号(设备搜索)
+ */
+ private String projectNumber;
+ /**
+ * 固件版本信息(设备搜索)
+ */
+ private String version;
+ /**
+ * 子设备列表
+ */
+ private List childList;
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomAddReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomAddReq.java
new file mode 100644
index 00000000..12fdf036
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomAddReq.java
@@ -0,0 +1,309 @@
+package org.dromara.E8Service.domain.custom.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote CustomAddReq
+ * @since 2025/5/26 21:43
+ */
+@Data
+public class CustomAddReq {
+
+ /**
+ * 人员姓名
+ */
+ private String name;
+
+ /**
+ * 证件类型,0身份证,1驾驶证,2工作证,100其他
+ */
+ private Integer identityType;
+
+ /**
+ * 证件编号
+ */
+ private String identityNo;
+
+ /**
+ * 籍贯
+ */
+ private String hometown;
+
+ /**
+ * 生日
+ */
+ private String birthday;
+
+ /**
+ * 地址
+ */
+ private String address;
+
+ /**
+ * 性别,0女,1男
+ */
+ private Integer gender;
+
+ /**
+ * 职务
+ */
+ private String duty;
+
+ /**
+ * 房号
+ */
+ private String roomNo;
+
+ /**
+ * 入职时间
+ */
+ private String enterTime;
+
+ /**
+ * 手机号
+ */
+ private String mobile;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 紧急联系人
+ */
+ private String emergencyContact;
+
+ /**
+ * 紧急联系人电话
+ */
+ private String emergencyContactPhone;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 区域全路径(多个以;分割,层级以|分割)
+ */
+ private String areaFullPath;
+
+ /**
+ * 组织ID(以;分隔)
+ */
+ private String areaIds;
+
+ /**
+ * 组织全路径(多个以;分割,层级以|分割)
+ */
+ private String organFullPath;
+
+ /**
+ * 组织ID(以;分隔)
+ */
+ private String organIds;
+
+ /**
+ * 客户明细
+ */
+ private CustomerDetail detail;
+
+ /**
+ * 车牌号
+ */
+ private String carNos;
+
+ /**
+ * 人员图片
+ */
+ private String image;
+
+ /**
+ * 指纹索引,0-9,0-左手大拇指,4-左手小指,……,9-右手小指
+ */
+ private String fingerNo;
+
+ /**
+ * 指纹信息 多个以“;分隔”
+ */
+ private String fingerData;
+
+ /**
+ * 绑定车辆信息
+ */
+ private List vehicleInfos;
+
+ /**
+ * 相关联区域
+ */
+ private List relAreas;
+
+ /**
+ * 是否特殊车牌
+ */
+ private Boolean isSpecialPlate;
+
+ /**
+ * 车辆信息·
+ */
+ @Data
+ public static class Vehicle {
+
+ /**
+ * 用户id
+ */
+ private Long customerId;
+
+ /**
+ * 车牌号
+ */
+ private String plateNO;
+
+ /**
+ * 车牌颜色,0其他,1蓝牌,2黄牌,3白牌,4黑牌,5绿牌,6黄绿牌
+ */
+ private Integer plateColor;
+
+ /**
+ * 车辆类型0小型车,1大型车,2其它,3摩托车
+ */
+ private Integer type;
+
+ /**
+ * 品牌
+ */
+ private String carLogo;
+ }
+
+ /**
+ * 人员明细
+ */
+ @Data
+ public static class CustomerDetail {
+
+ /**
+ * 客户Id
+ */
+ private Long customerId;
+
+ /**
+ * 工号
+ */
+ private String workNo;
+
+ /**
+ * 最高学历,0未知,1小学,2初中,3高中,4大学专科,5大学本科,6硕士研究生,7博士研究生
+ */
+ private Integer education;
+
+ /**
+ * 毕业学校
+ */
+ private String school;
+
+ /**
+ * 专业
+ */
+ private String master;
+
+ /**
+ * 政治面貌
+ */
+ private String politics;
+
+ /**
+ * 婚姻状况
+ */
+ private Integer marriage;
+
+ /**
+ * QQ
+ */
+ private String qq;
+
+ /**
+ * 微信
+ */
+ private String wechat;
+
+ /**
+ * 驾驶证号
+ */
+ private String driverLicense;
+
+ /**
+ * 是否忽略反潜回(1:是;0:否)
+ */
+ private Integer isIgnoreEntryBack;
+
+ /**
+ * 是否忽略门时区(1:是;0:否)
+ */
+ private Integer isIgnoreDoorSchedule;
+
+ /**
+ * 是否忽略互锁(1:是;0:否)
+ */
+ private Integer isIgnoreLock;
+
+ /**
+ * 是否忽略报警(1:是;0:否)
+ */
+ private Integer isIgnoreAlarm;
+
+ /**
+ * 是否发行卡凭证(0:未录入;1:未发行;2:已发行)
+ */
+ private Integer isIssue;
+
+ /**
+ * 是否忽略人时区(1:是;0:否)
+ */
+ private Integer isIgnorePersonSchedule;
+
+ /**
+ * 是否黑名单人员(1:是;0:否)
+ */
+ private Integer isBlacklist;
+ }
+
+ /**
+ * 相关联的区域
+ */
+ @Data
+ public static class RelatedArea {
+ /**
+ * 区域id
+ */
+ private Long areaId;
+
+ /**
+ * 区域名称
+ */
+ private String areaName;
+
+ /**
+ * 用户类型 0业主,1家属,2租客,3员工,4企业主,11职员,12临时人员,13户主,14外部人员,100其他人员
+ */
+ private Integer userType;
+
+ /**
+ * 区域类型 0区域,1楼栋,2,房屋,3门,4楼层
+ */
+ private Integer areaType;
+
+ /**
+ * 区域类型描述
+ */
+ private String areaTypeDesc;
+
+ /**
+ * 区域编号
+ */
+ private String areaNo;
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomFindReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomFindReq.java
new file mode 100644
index 00000000..e3dc7288
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomFindReq.java
@@ -0,0 +1,75 @@
+package org.dromara.E8Service.domain.custom.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote CustomFindReq
+ * @since 2025/5/26 20:14
+ */
+
+@Data
+public class CustomFindReq {
+
+ /**
+ * 是否脱敏 true脱敏,敏感信息加***隐藏;false完整显示
+ */
+ private Boolean isViewFullData;
+
+ /**
+ * 人员ID
+ */
+ private Long customerId;
+
+ /**
+ * 人员编号
+ */
+ private String no;
+
+ /**
+ * 人员姓名
+ */
+ private String name;
+
+ /**
+ * 所属区域id
+ */
+ private Long areaId;
+
+ /**
+ * 手机号
+ */
+ private String mobileNo;
+
+ /**
+ * 组织id列表
+ */
+ private List orgIds;
+
+ /**
+ * 人员姓名/编号/手机号 模糊查询
+ */
+ private String matchString;
+
+ /**
+ * 人员是否添加凭证 为true时筛选有凭证的人员
+ */
+ private Boolean isHasVoucher;
+
+ /**
+ * 需要排除的人员id列表
+ */
+ private List exceptIds;
+
+ /**
+ * 完整手机号精确查找
+ */
+ private String fullMobile;
+
+ /**
+ * 人员是否在多人开门组
+ */
+ private Boolean isFilterMoreGroup;
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomUpdateReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomUpdateReq.java
new file mode 100644
index 00000000..5f2cd848
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/req/CustomUpdateReq.java
@@ -0,0 +1,329 @@
+package org.dromara.E8Service.domain.custom.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote : CustomUpdateReq
+ * @since 2025/5/27 10:11
+ */
+@Data
+public class CustomUpdateReq {
+
+ /**
+ * 人员id
+ */
+ private Long id;
+
+ /**
+ * 人员编号
+ */
+ private String no;
+
+ /**
+ * 人员姓名
+ */
+ private String name;
+
+ /**
+ * 证件类型,0身份证,1驾驶证,2工作证,100其他
+ */
+ private Integer identityType;
+
+ /**
+ * 证件编号
+ */
+ private String identityNo;
+
+ /**
+ * 籍贯
+ */
+ private String hometown;
+
+ /**
+ * 生日
+ */
+ private String birthday;
+
+ /**
+ * 地址
+ */
+ private String address;
+
+ /**
+ * 性别,0女,1男
+ */
+ private Integer gender;
+
+ /**
+ * 职务
+ */
+ private String duty;
+
+ /**
+ * 房号
+ */
+ private String roomNo;
+
+ /**
+ * 入职时间
+ */
+ private String enterTime;
+
+ /**
+ * 手机号
+ */
+ private String mobile;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 紧急联系人
+ */
+ private String emergencyContact;
+
+ /**
+ * 紧急联系人电话
+ */
+ private String emergencyContactPhone;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 区域全路径(多个以;分割,层级以|分割)
+ */
+ private String areaFullPath;
+
+ /**
+ * 组织ID(以;分隔)
+ */
+ private String areaIds;
+
+ /**
+ * 组织全路径(多个以;分割,层级以|分割)
+ */
+ private String organFullPath;
+
+ /**
+ * 组织ID(以;分隔)
+ */
+ private String organIds;
+
+ /**
+ * 客户明细
+ */
+ private CustomerDetail detail;
+
+ /**
+ * 车牌号
+ */
+ private String carNos;
+
+ /**
+ * 人员图片
+ */
+ private String image;
+
+ /**
+ * 指纹索引,0-9,0-左手大拇指,4-左手小指,……,9-右手小指
+ */
+ private String fingerNo;
+
+ /**
+ * 指纹信息 多个以“;分隔”
+ */
+ private String fingerData;
+
+ /**
+ * 绑定车辆信息
+ */
+ private List vehicleInfos;
+
+ /**
+ * 相关联区域
+ */
+ private List relAreas;
+
+ /**
+ * 是否特殊车牌
+ */
+ private Boolean isSpecialPlate;
+
+ /**
+ * 人员明细
+ */
+ @Data
+ public static class CustomerDetail {
+
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 客户Id
+ */
+ private Long customerId;
+
+ /**
+ * 工号
+ */
+ private String workNo;
+
+ /**
+ * 最高学历,0未知,1小学,2初中,3高中,4大学专科,5大学本科,6硕士研究生,7博士研究生
+ */
+ private Integer education;
+
+ /**
+ * 毕业学校
+ */
+ private String school;
+
+ /**
+ * 专业
+ */
+ private String master;
+
+ /**
+ * 政治面貌
+ */
+ private String politics;
+
+ /**
+ * 婚姻状况
+ */
+ private Integer marriage;
+
+ /**
+ * QQ
+ */
+ private String qq;
+
+ /**
+ * 微信
+ */
+ private String wechat;
+
+ /**
+ * 驾驶证号
+ */
+ private String driverLicense;
+
+ /**
+ * 是否忽略反潜回(1:是;0:否)
+ */
+ private Integer isIgnoreEntryBack;
+
+ /**
+ * 是否忽略门时区(1:是;0:否)
+ */
+ private Integer isIgnoreDoorSchedule;
+
+ /**
+ * 是否忽略互锁(1:是;0:否)
+ */
+ private Integer isIgnoreLock;
+
+ /**
+ * 是否忽略报警(1:是;0:否)
+ */
+ private Integer isIgnoreAlarm;
+
+ /**
+ * 是否发行卡凭证(0:未录入;1:未发行;2:已发行)
+ */
+ private Integer isIssue;
+
+ /**
+ * 是否忽略人时区(1:是;0:否)
+ */
+ private Integer isIgnorePersonSchedule;
+
+ /**
+ * 是否黑名单人员(1:是;0:否)
+ */
+ private Integer isBlacklist;
+ }
+
+ /**
+ * 车辆信息·
+ */
+ @Data
+ public static class Vehicle {
+
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 用户id
+ */
+ private Long customerId;
+
+ /**
+ * 车牌号
+ */
+ private String plateNO;
+
+ /**
+ * 车牌颜色,0其他,1蓝牌,2黄牌,3白牌,4黑牌,5绿牌,6黄绿牌
+ */
+ private Integer plateColor;
+
+ /**
+ * 车辆类型0小型车,1大型车,2其它,3摩托车
+ */
+ private Integer type;
+
+ /**
+ * 品牌
+ */
+ private String carLogo;
+ }
+
+ /**
+ * 相关联的区域
+ */
+ @Data
+ public static class RelatedArea {
+ /**
+ * 区域id
+ */
+ private Long areaId;
+
+ /**
+ * 区域名称
+ */
+ private String areaName;
+
+ /**
+ * 用户类型 0业主,1家属,2租客,3员工,4企业主,11职员,12临时人员,13户主,14外部人员,100其他人员
+ */
+ private Integer userType;
+
+ /**
+ * 区域类型 0区域,1楼栋,2,房屋,3门,4楼层
+ */
+ private Integer areaType;
+
+ /**
+ * 区域类型描述
+ */
+ private String areaTypeDesc;
+
+ /**
+ * 区域编号
+ */
+ private String areaNo;
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/res/CustomAddRes.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/res/CustomAddRes.java
new file mode 100644
index 00000000..00fe51e7
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/res/CustomAddRes.java
@@ -0,0 +1,72 @@
+package org.dromara.E8Service.domain.custom.res;
+
+import lombok.Data;
+
+/**
+ * @apiNote CustomAddRes
+ * @author lsm
+ * @since 2025/6/24
+*/
+@Data
+public class CustomAddRes {
+ /**
+ * id
+ */
+ private Long id;
+ /**
+ * 人员编号
+ */
+ private String no;
+ /**
+ * 人员姓名
+ */
+ private String name;
+ /**
+ * 证件类型,0身份证,1驾驶证,2工作证,100其他
+ */
+ private Object identityType;
+ /**
+ * 证件号
+ */
+ private String identityNo;
+ /**
+ * 籍贯
+ */
+ private String hometown;
+ /**
+ * 生日
+ */
+ private Object birthday;
+ /**
+ * 地址
+ */
+ private String address;
+ /**
+ * 性别,0女,1男
+ */
+ private Integer gender;
+ /**
+ * 手机号
+ */
+ private String mobile;
+ /**
+ * 邮箱
+ */
+ private String email;
+ /**
+ * 紧急联系人
+ */
+ private String emergencyContact;
+ /**
+ * 紧急联系人电话
+ */
+ private String emergencyContactPhone;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * isViewFullData
+ */
+ private Boolean isViewFullData;
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/res/CustomFindRes.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/res/CustomFindRes.java
new file mode 100644
index 00000000..9839bd75
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/custom/res/CustomFindRes.java
@@ -0,0 +1,490 @@
+package org.dromara.E8Service.domain.custom.res;
+
+
+import lombok.Data;
+import org.dromara.E8Service.domain.enums.AreaTypeEnum;
+import org.dromara.E8Service.domain.enums.UserTypeEnum;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote CustomFindRes
+ * @since 2025/5/26 20:34
+ */
+@Data
+public class CustomFindRes {
+
+ /**
+ * 人员id
+ */
+ private Long id;
+
+ /**
+ * 创建时间
+ */
+ private String creationTime;
+
+ /**
+ * 创建者id(uuid)
+ */
+ private String creatorId;
+
+ /**
+ * 最后修改时间
+ */
+ private String lastModificationTime;
+
+ /**
+ * 最后修改者id(uuid)
+ */
+ private String lastModifierId;
+
+ /**
+ * 是否删除
+ */
+ private Boolean isDeleted;
+
+ /**
+ * 删除者id(uuid)
+ */
+ private String deleterId;
+
+ /**
+ * 删除时间
+ */
+ private String deletionTime;
+
+ /**
+ * 人员编号
+ */
+ private String no;
+
+ /**
+ * 人员姓名
+ */
+ private String name;
+
+ /**
+ * 证件类型,0身份证,1驾驶证,2工作证,100其他
+ */
+ private Integer identityType;
+
+ /**
+ * 证件类型名
+ */
+ private String identityTypeName;
+
+ /**
+ * 证件编号
+ */
+ private String identityNo;
+
+ /**
+ * 籍贯
+ */
+ private String hometown;
+
+ /**
+ * 生日
+ */
+ private String birthday;
+
+ /**
+ * 地址
+ */
+ private String address;
+
+ /**
+ * 性别,0女,1男
+ */
+ private Integer gender;
+
+ /**
+ * 性别名称
+ */
+ private String genderName;
+
+ /**
+ * 职务
+ */
+ private String duty;
+
+ /**
+ * 组织名称
+ */
+ private String orgName;
+
+ /**
+ * 区域名称
+ */
+ private String areaName;
+
+ /**
+ * 绑定车辆信息
+ */
+ private List tempCars;
+
+ /**
+ * 房号
+ */
+ private String roomNo;
+
+ /**
+ * 入职时间
+ */
+ private String enterTime;
+
+ /**
+ * 手机号
+ */
+ private String mobile;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 紧急联系人
+ */
+ private String emergencyContact;
+
+ /**
+ * 紧急联系人电话
+ */
+ private String emergencyContactPhone;
+
+ /**
+ * 箱号
+ */
+ private String crateName;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 客户明细
+ */
+ private CustomerDetail detail;
+
+ /**
+ * 区域全路径(多个以;分割,层级以|分割)
+ */
+ private String areaFullPath;
+
+ /**
+ * 区域全路径(多个以;分割,层级以|分割)
+ */
+ private String areaIds;
+
+ /**
+ * 组织ID(以;分隔)
+ */
+ private String organFullPath;
+
+ /**
+ * 组织ID(以;分隔)
+ */
+ private String organIds;
+
+ /**
+ * 凭证信息
+ */
+ private String voucherInfos;
+
+ /**
+ * 人员图片
+ */
+ private String image;
+
+ /**
+ * 人员图片地址
+ */
+ private String imageUrl;
+
+ /**
+ * 指纹索引,0-9,0-左手大拇指,4-左手小指,……,9-右手小指
+ */
+ private String fingerNo;
+
+ /**
+ * 指纹信息 多个以“;分隔”
+ */
+ private String fingerData;
+
+ /**
+ * 是否在黑名单 1:是 0:否
+ */
+ private Integer isBlacklist;
+
+ /**
+ * 相关联区域
+ */
+ private List relAreas;
+
+ /**
+ * 线上id
+ */
+ private String onlineId;
+
+ /**
+ * 车牌号
+ */
+ private String carNos;
+
+ /**
+ * 是否特殊车牌
+ */
+ private boolean isSpecialPlate;
+
+ /**
+ * 是否脱敏 true脱敏,敏感信息加***隐藏;false完整显示
+ */
+ private boolean isViewFullData;
+
+ /**
+ * 车辆信息·
+ */
+ @Data
+ public static class Vehicle {
+ /**
+ * 车辆id
+ */
+ private Long id;
+
+ /**
+ * 创建时间
+ */
+ private String creationTime;
+
+ /**
+ * 创建者id(uuid)
+ */
+ private String creatorId;
+
+ /**
+ * 最后修改时间
+ */
+ private String lastModificationTime;
+
+ /**
+ * 最后修改者id(uuid)
+ */
+ private String lastModifierId;
+
+ /**
+ * 是否删除
+ */
+ private Boolean isDeleted;
+
+ /**
+ * 删除者id(uuid)
+ */
+ private String deleterId;
+
+ /**
+ * 删除时间
+ */
+ private String deletionTime;
+
+ /**
+ * 用户id
+ */
+ private Long customerId;
+
+ /**
+ * 车牌号
+ */
+ private String plateNO;
+
+ /**
+ * 车牌颜色,0其他,1蓝牌,2黄牌,3白牌,4黑牌,5绿牌,6黄绿牌
+ */
+ private Integer plateColor;
+
+ /**
+ * 车辆类型0小型车,1大型车,2其它,3摩托车
+ */
+ private Integer type;
+
+ /**
+ * 车辆状态
+ */
+ private Integer status;
+
+ /**
+ * 品牌
+ */
+ private String carLogo;
+ }
+
+ /**
+ * 人员明细
+ */
+ @Data
+ public static class CustomerDetail {
+ /**
+ * 客户明细id
+ */
+ private Long id;
+
+ /**
+ * 创建时间
+ */
+ private String creationTime;
+
+ /**
+ * 创建者id(uuid)
+ */
+ private String creatorId;
+
+ /**
+ * 最后修改时间
+ */
+ private String lastModificationTime;
+
+ /**
+ * 最后修改者id(uuid)
+ */
+ private String lastModifierId;
+
+ /**
+ * 是否删除
+ */
+ private boolean isDeleted;
+
+ /**
+ * 删除者id(uuid)
+ */
+ private String deleterId;
+
+ /**
+ * 删除时间
+ */
+ private String deletionTime;
+
+ /**
+ * 客户Id
+ */
+ private Integer customerId;
+
+ /**
+ * 工号
+ */
+ private String workNo;
+
+ /**
+ * 最高学历,0未知,1小学,2初中,3高中,4大学专科,5大学本科,6硕士研究生,7博士研究生
+ */
+ private Integer education;
+
+ /**
+ * 毕业学校
+ */
+ private String school;
+
+ /**
+ * 专业
+ */
+ private String master;
+
+ /**
+ * 政治面貌
+ */
+ private String politics;
+
+ /**
+ * 婚姻状况
+ */
+ private Integer marriage;
+
+ /**
+ * QQ
+ */
+ private String qq;
+
+ /**
+ * 微信
+ */
+ private String wechat;
+
+ /**
+ * 驾驶证号
+ */
+ private String driverLicense;
+
+ /**
+ * 是否忽略反潜回(1:是;0:否)
+ */
+ private Integer isIgnoreEntryBack;
+
+ /**
+ * 是否忽略门时区(1:是;0:否)
+ */
+ private Integer isIgnoreDoorSchedule;
+
+ /**
+ * 是否忽略互锁(1:是;0:否)
+ */
+ private Integer isIgnoreLock;
+
+ /**
+ * 是否忽略报警(1:是;0:否)
+ */
+ private Integer isIgnoreAlarm;
+
+ /**
+ * 是否发行卡凭证(0:未录入;1:未发行;2:已发行)
+ */
+ private Integer isIssue;
+
+ /**
+ * 是否忽略人时区(1:是;0:否)
+ */
+ private Integer isIgnorePersonSchedule;
+
+ /**
+ * 是否黑名单人员(1:是;0:否)
+ */
+ private Integer isBlacklist;
+ }
+
+ /**
+ * 相关联的区域
+ */
+ @Data
+ public static class RelatedArea {
+ /**
+ * 区域id
+ */
+ private Long areaId;
+
+ /**
+ * 区域名称
+ */
+ private String areaName;
+
+ /**
+ * 用户类型
+ */
+ private UserTypeEnum userType;
+
+ /**
+ * 区域类型
+ */
+ private AreaTypeEnum areaType;
+
+ /**
+ * 区域类型描述
+ */
+ private String areaTypeDesc;
+
+ /**
+ * 区域编号
+ */
+ private String areaNo;
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/enums/AreaTypeEnum.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/enums/AreaTypeEnum.java
new file mode 100644
index 00000000..dd41a4b4
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/enums/AreaTypeEnum.java
@@ -0,0 +1,45 @@
+package org.dromara.E8Service.domain.enums;
+
+/**
+ * @author lsm
+ * @apiNote AreaTypeEnum
+ * @since 2025/5/26 21:22
+ */
+public enum AreaTypeEnum {
+ // 枚举值,括号中是对应的编号和描述
+ REGION(0, "区域"),
+ BUILDING(1, "楼栋"),
+ HOUSE(2, "房屋"),
+ DOOR(3, "门"),
+ FLOOR(4, "楼层");
+
+ // 定义私有变量,用于存储编号和描述
+ private final int code;
+ private final String description;
+
+ // 构造方法,用于初始化每个枚举值的编号和描述
+ AreaTypeEnum(int code, String description) {
+ this.code = code;
+ this.description = description;
+ }
+
+ // 获取编号的方法
+ public int getCode() {
+ return code;
+ }
+
+ // 获取描述的方法
+ public String getDescription() {
+ return description;
+ }
+
+ // 根据编号获取对应的枚举值
+ public static AreaTypeEnum getByCode(int code) {
+ for (AreaTypeEnum areaType : AreaTypeEnum.values()) {
+ if (areaType.getCode() == code) {
+ return areaType;
+ }
+ }
+ return null; // 如果没有找到匹配的编号,返回 null
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/enums/UserTypeEnum.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/enums/UserTypeEnum.java
new file mode 100644
index 00000000..f190a08b
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/enums/UserTypeEnum.java
@@ -0,0 +1,50 @@
+package org.dromara.E8Service.domain.enums;
+
+/**
+ * @author zcxlsm
+ * @apiNote UserEnumType
+ * @since 2025/5/26 21:16
+ */
+public enum UserTypeEnum {
+ // 枚举值,括号中是对应的编号和描述
+ OWNER(0, "业主"),
+ FAMILY_MEMBER(1, "家属"),
+ TENANT(2, "租客"),
+ EMPLOYEE(3, "员工"),
+ BUSINESS_OWNER(4, "企业主"),
+ STAFF(11, "职员"),
+ TEMPORARY_PERSONNEL(12, "临时人员"),
+ HOUSEHOLD_HEAD(13, "户主"),
+ EXTERNAL_PERSONNEL(14, "外部人员"),
+ OTHER_PERSONNEL(100, "其他人员");
+
+ // 定义私有变量,用于存储编号和描述
+ private final int code;
+ private final String description;
+
+ // 构造方法,用于初始化每个枚举值的编号和描述
+ UserTypeEnum(int code, String description) {
+ this.code = code;
+ this.description = description;
+ }
+
+ // 获取编号的方法
+ public int getCode() {
+ return code;
+ }
+
+ // 获取描述的方法
+ public String getDescription() {
+ return description;
+ }
+
+ // 根据编号获取对应的枚举值
+ public static UserTypeEnum getByCode(int code) {
+ for (UserTypeEnum userType : UserTypeEnum.values()) {
+ if (userType.getCode() == code) {
+ return userType;
+ }
+ }
+ return null; // 如果没有找到匹配的编号,返回 null
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftAddReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftAddReq.java
new file mode 100644
index 00000000..8d1623ff
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftAddReq.java
@@ -0,0 +1,27 @@
+package org.dromara.E8Service.domain.lift.req;
+
+import lombok.Data;
+
+/**
+ * @author lsm
+ * @apiNote LiftAddReq
+ * @since 2025/5/27 11:47
+ */
+@Data
+public class LiftAddReq {
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 区域ID
+ */
+ private Long areaId;
+
+ /**
+ * 备注
+ */
+ private String remark;
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftFindReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftFindReq.java
new file mode 100644
index 00000000..30900baf
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftFindReq.java
@@ -0,0 +1,41 @@
+package org.dromara.E8Service.domain.lift.req;
+
+import lombok.Data;
+
+/**
+ * @author lsm
+ * @apiNote LiftFindReq
+ * @since 2025/5/27 11:30
+ */
+@Data
+public class LiftFindReq {
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 是否脱敏 true脱敏,敏感信息加***隐藏;false完整显示;
+ */
+ private Boolean isViewFullData;
+
+ /**
+ * 电梯名称
+ */
+ private String name;
+
+ /**
+ * 类型 0:单开 1:双开
+ */
+ private Integer type;
+
+ /**
+ * 脱离原因 0:人工脱离 1:消防脱离
+ */
+ private Integer reason;
+
+ /**
+ * 上级区域ID
+ */
+ private Long parentId;
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftUpdateReq.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftUpdateReq.java
new file mode 100644
index 00000000..ae295cd5
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/req/LiftUpdateReq.java
@@ -0,0 +1,33 @@
+package org.dromara.E8Service.domain.lift.req;
+
+import lombok.Data;
+
+/**
+ * @author lsm
+ * @apiNote LiftUpdateReq
+ * @since 2025/5/27 11:54
+ */
+@Data
+public class LiftUpdateReq {
+
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 区域ID
+ */
+ private Long areaId;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/res/LiftAddRes.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/res/LiftAddRes.java
new file mode 100644
index 00000000..7993a8fe
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/res/LiftAddRes.java
@@ -0,0 +1,9 @@
+package org.dromara.E8Service.domain.lift.res;
+
+/**
+ * @author lsm
+ * @apiNote LiftAddRes
+ * @since 2025/6/24
+ */
+public class LiftAddRes {
+}
diff --git a/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/res/LiftFindRes.java b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/res/LiftFindRes.java
new file mode 100644
index 00000000..5bca2503
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/java/org/dromara/E8Service/domain/lift/res/LiftFindRes.java
@@ -0,0 +1,177 @@
+package org.dromara.E8Service.domain.lift.res;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zcxlsm
+ * @apiNote LiftFindRes
+ * @since 2025/5/27 11:33
+ */
+@Data
+public class LiftFindRes {
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 创建时间
+ */
+ private String creationTime;
+
+ /**
+ * 创建人
+ */
+ private String creatorId;
+
+ /**
+ * 最后修改时间
+ */
+ private String lastModificationTime;
+
+ /**
+ * 最后修改人
+ */
+ private String lastModifierId;
+
+ /**
+ * 是否删除
+ */
+ private Boolean isDeleted;
+
+ /**
+ * 删除人
+ */
+ private String deleterId;
+
+ /**
+ * 删除时间
+ */
+ private String deletionTime;
+
+ /**
+ * 电梯编号
+ */
+ private String code;
+
+ /**
+ * 电梯名称
+ */
+ private String name;
+
+ /**
+ * 所属区域Id
+ */
+ private Long areaId;
+
+ /**
+ * 区域名称
+ */
+ private String areaName;
+
+ /**
+ * 绑定设备ID
+ */
+ private Long deviceId;
+
+ /**
+ * 设备名称
+ */
+ private String deviceName;
+
+ /**
+ * 最高楼层限制
+ */
+ private Integer maxFloorNum;
+
+ /**
+ * 类型 0:单开 1:多开
+ */
+ private Integer type;
+
+ /**
+ * 状态 0:正常 1:脱离
+ */
+ private Integer status;
+
+ /**
+ * 脱离原因
+ */
+ private String reason;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 创建人名称
+ */
+ private String creatorName;
+
+ /**
+ * 楼层集合
+ */
+ private List floorList;
+
+ /**
+ * 线上ID
+ */
+ private String onlineId;
+
+ @Data
+ public static class ManElevatorFloorsDto {
+
+ /**
+ * 电梯Id
+ */
+ private Long elevatorId;
+
+ /**
+ * 楼层权限标识
+ */
+ private Long floorId;
+
+ /**
+ * 楼层名称
+ */
+ private String floorName;
+
+ /**
+ * 是否前门
+ */
+ private boolean isFrontDoor;
+
+ /**
+ * 是否后门
+ */
+ private boolean isBackDoor;
+
+ /**
+ * 是否公共楼层
+ */
+ private boolean isCommonFloor;
+
+ /**
+ * 轿厢二维码
+ */
+ private String outSideCallqrCode;
+
+ /**
+ * 是否选择前门
+ */
+ private boolean isSelectFrontDoor;
+
+ /**
+ * 是否选择后门
+ */
+ private boolean isSelectBackDoor;
+
+ /**
+ * 楼层按键值
+ */
+ private Long floorCode;
+ }
+}
diff --git a/ruoyi-modules/E8Service/src/main/resources/application.yml b/ruoyi-modules/E8Service/src/main/resources/application.yml
new file mode 100644
index 00000000..6ad19a21
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/resources/application.yml
@@ -0,0 +1,34 @@
+# Tomcat
+server:
+ port: 7777
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: E8Service
+ 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/E8Service/src/main/resources/banner.txt b/ruoyi-modules/E8Service/src/main/resources/banner.txt
new file mode 100644
index 00000000..c86da884
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _ _
+ (_) | |
+ _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___
+| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \
+| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | |
+|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_|
+ __/ | __/ |
+ |___/ |___/
diff --git a/ruoyi-modules/E8Service/src/main/resources/logback-plus.xml b/ruoyi-modules/E8Service/src/main/resources/logback-plus.xml
new file mode 100644
index 00000000..00d30896
--- /dev/null
+++ b/ruoyi-modules/E8Service/src/main/resources/logback-plus.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+ ${console.log.pattern}
+ utf-8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml
index 8f73c2b6..b950a8bd 100644
--- a/ruoyi-modules/pom.xml
+++ b/ruoyi-modules/pom.xml
@@ -16,6 +16,7 @@
ruoyi-workflow
Property
Sis
+ E8Service
ruoyi-modules