From 699bdb5b821e87859f5900e4db1d1a2353c6f6a2 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期五, 03 四月 2026 15:25:08 +0800
Subject: [PATCH] 网关管理

---
 server/system_timer/src/main/resources/bootstrap-dev.yml                                                      |    4 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml                                              |    4 
 server/db/business.yw_electrical_log.permissions.sql                                                          |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalLogServiceImpl.java  |  111 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalRoomServiceImpl.java |  117 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwConditionerService.java             |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwTopUpLogMapper.java                     |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalLogService.java           |   21 
 server/visits/admin_timer/src/main/resources/bootstrap-test.yml                                               |    4 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwConditionerCloudController.java            |   96 ++
 server/system_gateway/src/main/resources/bootstrap-dev.yml                                                    |    4 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalCloudController.java             |   96 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalLogMapper.java                |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalRoom.java               |   79 ++
 server/db/yw_gateway.sql                                                                                      |   19 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalService.java              |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwGatewayService.java                 |   70 +
 admin/.env.development                                                                                        |    1 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalLogCloudController.java          |   96 ++
 server/db/business.yw_gateway.permissions.sql                                                                 |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalRoomMapper.java               |   13 
 server/system_timer/src/main/resources/bootstrap-test.yml                                                     |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalMapper.java                   |   13 
 server/visits/admin_timer/src/main/resources/bootstrap-dev.yml                                                |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwGatewayServiceImpl.java        |  142 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalServiceImpl.java     |  137 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectrical.java                   |  119 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalRoomService.java          |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTopUpLogServiceImpl.java       |  118 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwTopUpLogService.java                |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwConditionerServiceImpl.java    |  128 +++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalRoomCloudController.java         |   96 ++
 server/db/business.yw_conditioner.permissions.sql                                                             |    5 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml                                             |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalLog.java                |   86 ++
 server/db/business.yw_top_up_log.permissions.sql                                                              |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwGatewayMapper.java                      |   13 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwGatewayCloudController.java                |  105 ++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwTopUpLogCloudController.java               |   96 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwGateway.java                      |   87 ++
 server/db/business.yw_electrical_room.permissions.sql                                                         |    5 
 server/system_gateway/src/main/resources/bootstrap-test.yml                                                   |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwConditioner.java                  |   84 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java                         |    4 
 server/db/business.yw_electrical.permissions.sql                                                              |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwConditionerMapper.java                  |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwTopUpLog.java                     |  102 ++
 47 files changed, 2,216 insertions(+), 18 deletions(-)

diff --git a/admin/.env.development b/admin/.env.development
index cdcb9a1..4e50306 100644
--- a/admin/.env.development
+++ b/admin/.env.development
@@ -8,3 +8,4 @@
 VUE_APP_API_URL  = 'http://192.168.1.44:10010'
 
 #VUE_APP_API_URL  = 'https://zhcg.fnwtzx.com/gateway_interface'
+
diff --git a/server/db/business.yw_conditioner.permissions.sql b/server/db/business.yw_conditioner.permissions.sql
new file mode 100644
index 0000000..f6dc980
--- /dev/null
+++ b/server/db/business.yw_conditioner.permissions.sql
@@ -0,0 +1,5 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywconditioner:create', '鏂板缓绌鸿皟璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywconditioner:delete', '鍒犻櫎绌鸿皟璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywconditioner:update', '淇敼绌鸿皟璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywconditioner:query', '鏌ヨ绌鸿皟璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywconditioner:exportExcel', '瀵煎嚭绌鸿皟璁惧淇℃伅(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/db/business.yw_electrical.permissions.sql b/server/db/business.yw_electrical.permissions.sql
new file mode 100644
index 0000000..6aea41f
--- /dev/null
+++ b/server/db/business.yw_electrical.permissions.sql
@@ -0,0 +1,5 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectrical:create', '鏂板缓鐢佃〃璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectrical:delete', '鍒犻櫎鐢佃〃璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectrical:update', '淇敼鐢佃〃璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectrical:query', '鏌ヨ鐢佃〃璁惧淇℃伅', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectrical:exportExcel', '瀵煎嚭鐢佃〃璁惧淇℃伅(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/db/business.yw_electrical_log.permissions.sql b/server/db/business.yw_electrical_log.permissions.sql
new file mode 100644
index 0000000..569f66e
--- /dev/null
+++ b/server/db/business.yw_electrical_log.permissions.sql
@@ -0,0 +1,5 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricallog:create', '鏂板缓鐢靛櫒绫绘搷浣滄棩蹇�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricallog:delete', '鍒犻櫎鐢靛櫒绫绘搷浣滄棩蹇�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricallog:update', '淇敼鐢靛櫒绫绘搷浣滄棩蹇�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricallog:query', '鏌ヨ鐢靛櫒绫绘搷浣滄棩蹇�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricallog:exportExcel', '瀵煎嚭鐢靛櫒绫绘搷浣滄棩蹇�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/db/business.yw_electrical_room.permissions.sql b/server/db/business.yw_electrical_room.permissions.sql
new file mode 100644
index 0000000..270ff9d
--- /dev/null
+++ b/server/db/business.yw_electrical_room.permissions.sql
@@ -0,0 +1,5 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricalroom:create', '鏂板缓璁惧鍏宠仈鎴块棿', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricalroom:delete', '鍒犻櫎璁惧鍏宠仈鎴块棿', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricalroom:update', '淇敼璁惧鍏宠仈鎴块棿', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricalroom:query', '鏌ヨ璁惧鍏宠仈鎴块棿', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywelectricalroom:exportExcel', '瀵煎嚭璁惧鍏宠仈鎴块棿(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/db/business.yw_gateway.permissions.sql b/server/db/business.yw_gateway.permissions.sql
new file mode 100644
index 0000000..cccf310
--- /dev/null
+++ b/server/db/business.yw_gateway.permissions.sql
@@ -0,0 +1,5 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:create', '鏂板缓缃戝叧绠$悊', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:delete', '鍒犻櫎缃戝叧绠$悊', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:update', '淇敼缃戝叧绠$悊', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:query', '鏌ヨ缃戝叧绠$悊', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywgateway:exportExcel', '瀵煎嚭缃戝叧绠$悊(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/db/business.yw_top_up_log.permissions.sql b/server/db/business.yw_top_up_log.permissions.sql
new file mode 100644
index 0000000..bf81f07
--- /dev/null
+++ b/server/db/business.yw_top_up_log.permissions.sql
@@ -0,0 +1,5 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywtopuplog:create', '鏂板缓鍏呭�艰褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywtopuplog:delete', '鍒犻櫎鍏呭�艰褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywtopuplog:update', '淇敼鍏呭�艰褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywtopuplog:query', '鏌ヨ鍏呭�艰褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywtopuplog:exportExcel', '瀵煎嚭鍏呭�艰褰�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/db/yw_gateway.sql b/server/db/yw_gateway.sql
new file mode 100644
index 0000000..6f40915
--- /dev/null
+++ b/server/db/yw_gateway.sql
@@ -0,0 +1,19 @@
+CREATE TABLE `yw_gateway` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
+  `creator` int(11) DEFAULT NULL COMMENT '鍒涘缓浜虹紪鐮�',
+  `create_date` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+  `editor` int(11) DEFAULT NULL COMMENT '鏇存柊浜虹紪鐮�',
+  `edit_date` datetime DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+  `isdeleted` int(1) DEFAULT '0' COMMENT '鏄惁鍒犻櫎 0鍚� 1鏄�',
+  `name` varchar(100) DEFAULT NULL COMMENT '缃戝叧鍚嶇О',
+  `remark` varchar(500) DEFAULT NULL COMMENT '澶囨敞',
+  `status` int(1) DEFAULT '0' COMMENT '鐘舵�� 0鍚敤 1绂佺敤',
+  `sortnum` int(11) DEFAULT NULL COMMENT '鎺掑簭鐮�',
+  `gateway_model` varchar(100) DEFAULT NULL COMMENT '缃戝叧鍨嬪彿',
+  `gateway_code` varchar(100) DEFAULT NULL COMMENT '缃戝叧璁惧鍙�',
+  `last_heartbeat_time` datetime DEFAULT NULL COMMENT '鏈�鍚庡績璺虫椂闂�',
+  `project_id` int(11) DEFAULT NULL COMMENT '鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project锛�',
+  PRIMARY KEY (`id`),
+  KEY `idx_gateway_code` (`gateway_code`),
+  KEY `idx_project_id` (`project_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缃戝叧绠$悊';
diff --git a/server/system_gateway/src/main/resources/bootstrap-dev.yml b/server/system_gateway/src/main/resources/bootstrap-dev.yml
index a4c7cd6..ab83658 100644
--- a/server/system_gateway/src/main/resources/bootstrap-dev.yml
+++ b/server/system_gateway/src/main/resources/bootstrap-dev.yml
@@ -1,11 +1,11 @@
 spring:
   cloud:
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
         namespace: funingyunwei_dev
         username: nacos
diff --git a/server/system_gateway/src/main/resources/bootstrap-test.yml b/server/system_gateway/src/main/resources/bootstrap-test.yml
index 4ccd298..d50a4c1 100644
--- a/server/system_gateway/src/main/resources/bootstrap-test.yml
+++ b/server/system_gateway/src/main/resources/bootstrap-test.yml
@@ -1,11 +1,11 @@
 spring:
   cloud:
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
         namespace: funingyunwei_test
 #        namespace: dev_renkang
         username: nacos
diff --git a/server/system_timer/src/main/resources/bootstrap-dev.yml b/server/system_timer/src/main/resources/bootstrap-dev.yml
index 21ef2c5..28c3014 100644
--- a/server/system_timer/src/main/resources/bootstrap-dev.yml
+++ b/server/system_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       #      config:
@@ -22,7 +22,7 @@
       #        group: dev
       #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
         namespace: funingyunwei_dev
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/system_timer/src/main/resources/bootstrap-test.yml b/server/system_timer/src/main/resources/bootstrap-test.yml
index 4e04742..7a2cccd 100644
--- a/server/system_timer/src/main/resources/bootstrap-test.yml
+++ b/server/system_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       #      config:
@@ -22,7 +22,7 @@
       #        group: dev
       #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
         namespace: funingyunwei_test
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
index 0c21840..6f52afe 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
         namespace: funingyunwei_dev
         username: nacos
         password: nacos
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-test.yml b/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
index d5944e2..569e3cb 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
         namespace: funingyunwei_test
         username: nacos
         password: nacos
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwConditionerCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwConditionerCloudController.java
new file mode 100644
index 0000000..56fc4e7
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwConditionerCloudController.java
@@ -0,0 +1,96 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwConditioner;
+import com.doumee.service.business.YwConditionerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 绌鸿皟璁惧淇℃伅
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Api(tags = "绌鸿皟璁惧淇℃伅")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX + "/business/ywConditioner")
+public class YwConditionerCloudController extends BaseController {
+
+    @Autowired
+    private YwConditionerService ywConditionerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywconditioner:create")
+    public ApiResponse create(@RequestBody YwConditioner ywConditioner, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywConditioner.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywConditionerService.create(ywConditioner));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywconditioner:delete")
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywConditionerService.deleteById(id, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywconditioner:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywConditionerService.deleteByIdInBatch(idList, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywconditioner:update")
+    public ApiResponse updateById(@RequestBody YwConditioner ywConditioner, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywConditioner.setLoginUserInfo(this.getLoginUser(token));
+        ywConditionerService.updateById(ywConditioner);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywconditioner:query")
+    public ApiResponse<PageData<YwConditioner>> findPage(@RequestBody PageWrap<YwConditioner> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywConditionerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywconditioner:query")
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywConditionerService.findById(id));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywconditioner:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<YwConditioner> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        ExcelExporter.build(YwConditioner.class).export(ywConditionerService.findPage(pageWrap).getRecords(), "绌鸿皟璁惧淇℃伅", response);
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalCloudController.java
new file mode 100644
index 0000000..846d7ad
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalCloudController.java
@@ -0,0 +1,96 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwElectrical;
+import com.doumee.service.business.YwElectricalService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鐢佃〃璁惧淇℃伅
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Api(tags = "鐢佃〃璁惧淇℃伅")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX + "/business/ywElectrical")
+public class YwElectricalCloudController extends BaseController {
+
+    @Autowired
+    private YwElectricalService ywElectricalService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywelectrical:create")
+    public ApiResponse create(@RequestBody YwElectrical ywElectrical, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectrical.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywElectricalService.create(ywElectrical));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywelectrical:delete")
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectricalService.deleteById(id, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywelectrical:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywElectricalService.deleteByIdInBatch(idList, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywelectrical:update")
+    public ApiResponse updateById(@RequestBody YwElectrical ywElectrical, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectrical.setLoginUserInfo(this.getLoginUser(token));
+        ywElectricalService.updateById(ywElectrical);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywelectrical:query")
+    public ApiResponse<PageData<YwElectrical>> findPage(@RequestBody PageWrap<YwElectrical> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywElectricalService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywelectrical:query")
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywElectricalService.findById(id));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywelectrical:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<YwElectrical> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        ExcelExporter.build(YwElectrical.class).export(ywElectricalService.findPage(pageWrap).getRecords(), "鐢佃〃璁惧淇℃伅", response);
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalLogCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalLogCloudController.java
new file mode 100644
index 0000000..9d2d4df
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalLogCloudController.java
@@ -0,0 +1,96 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwElectricalLog;
+import com.doumee.service.business.YwElectricalLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鐢靛櫒绫绘搷浣滄棩蹇�
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Api(tags = "鐢靛櫒绫绘搷浣滄棩蹇�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX + "/business/ywElectricalLog")
+public class YwElectricalLogCloudController extends BaseController {
+
+    @Autowired
+    private YwElectricalLogService ywElectricalLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywelectricallog:create")
+    public ApiResponse create(@RequestBody YwElectricalLog ywElectricalLog, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectricalLog.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywElectricalLogService.create(ywElectricalLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywelectricallog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectricalLogService.deleteById(id, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywelectricallog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywElectricalLogService.deleteByIdInBatch(idList, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywelectricallog:update")
+    public ApiResponse updateById(@RequestBody YwElectricalLog ywElectricalLog, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectricalLog.setLoginUserInfo(this.getLoginUser(token));
+        ywElectricalLogService.updateById(ywElectricalLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywelectricallog:query")
+    public ApiResponse<PageData<YwElectricalLog>> findPage(@RequestBody PageWrap<YwElectricalLog> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywElectricalLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywelectricallog:query")
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywElectricalLogService.findById(id));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywelectricallog:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<YwElectricalLog> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        ExcelExporter.build(YwElectricalLog.class).export(ywElectricalLogService.findPage(pageWrap).getRecords(), "鐢靛櫒绫绘搷浣滄棩蹇�", response);
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalRoomCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalRoomCloudController.java
new file mode 100644
index 0000000..87a1e47
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwElectricalRoomCloudController.java
@@ -0,0 +1,96 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwElectricalRoom;
+import com.doumee.service.business.YwElectricalRoomService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 璁惧鍏宠仈鎴块棿
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Api(tags = "璁惧鍏宠仈鎴块棿")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX + "/business/ywElectricalRoom")
+public class YwElectricalRoomCloudController extends BaseController {
+
+    @Autowired
+    private YwElectricalRoomService ywElectricalRoomService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywelectricalroom:create")
+    public ApiResponse create(@RequestBody YwElectricalRoom ywElectricalRoom, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectricalRoom.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywElectricalRoomService.create(ywElectricalRoom));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywelectricalroom:delete")
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectricalRoomService.deleteById(id, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywelectricalroom:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywElectricalRoomService.deleteByIdInBatch(idList, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywelectricalroom:update")
+    public ApiResponse updateById(@RequestBody YwElectricalRoom ywElectricalRoom, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywElectricalRoom.setLoginUserInfo(this.getLoginUser(token));
+        ywElectricalRoomService.updateById(ywElectricalRoom);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywelectricalroom:query")
+    public ApiResponse<PageData<YwElectricalRoom>> findPage(@RequestBody PageWrap<YwElectricalRoom> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywElectricalRoomService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywelectricalroom:query")
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywElectricalRoomService.findById(id));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywelectricalroom:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<YwElectricalRoom> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        ExcelExporter.build(YwElectricalRoom.class).export(ywElectricalRoomService.findPage(pageWrap).getRecords(), "璁惧鍏宠仈鎴块棿", response);
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwGatewayCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwGatewayCloudController.java
new file mode 100644
index 0000000..a430616
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwGatewayCloudController.java
@@ -0,0 +1,105 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwGateway;
+import com.doumee.service.business.YwGatewayService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 缃戝叧绠$悊
+ * @author renkang
+ * @date 2026/04/02
+ */
+@Api(tags = "缃戝叧绠$悊")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX + "/business/ywGateway")
+public class YwGatewayCloudController extends BaseController {
+
+    @Autowired
+    private YwGatewayService ywGatewayService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywgateway:create")
+    public ApiResponse create(@RequestBody YwGateway ywGateway, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywGateway.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywGatewayService.create(ywGateway));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywgateway:delete")
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywGatewayService.deleteById(id, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywgateway:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywGatewayService.deleteByIdInBatch(idList, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywgateway:update")
+    public ApiResponse updateById(@RequestBody YwGateway ywGateway, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywGateway.setLoginUserInfo(this.getLoginUser(token));
+        ywGatewayService.updateById(ywGateway);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("绂佸惎鐢�")
+    @PostMapping("/updateStatusById")
+    @CloudRequiredPermission("business:ywgateway:update")
+    public ApiResponse updateStatusById(@RequestBody YwGateway ywGateway, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywGateway.setLoginUserInfo(this.getLoginUser(token));
+        ywGatewayService.updateStatusById(ywGateway);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywgateway:query")
+    public ApiResponse<PageData<YwGateway>> findPage(@RequestBody PageWrap<YwGateway> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywGatewayService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywgateway:query")
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywGatewayService.findById(id));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywgateway:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<YwGateway> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        ExcelExporter.build(YwGateway.class).export(ywGatewayService.findPage(pageWrap).getRecords(), "缃戝叧绠$悊", response);
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwTopUpLogCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwTopUpLogCloudController.java
new file mode 100644
index 0000000..9ffde2a
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwTopUpLogCloudController.java
@@ -0,0 +1,96 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.YwTopUpLog;
+import com.doumee.service.business.YwTopUpLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鍏呭�艰褰�
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Api(tags = "鍏呭�艰褰�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX + "/business/ywTopUpLog")
+public class YwTopUpLogCloudController extends BaseController {
+
+    @Autowired
+    private YwTopUpLogService ywTopUpLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywtopuplog:create")
+    public ApiResponse create(@RequestBody YwTopUpLog ywTopUpLog, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywTopUpLog.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywTopUpLogService.create(ywTopUpLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywtopuplog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywTopUpLogService.deleteById(id, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywtopuplog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywTopUpLogService.deleteByIdInBatch(idList, this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywtopuplog:update")
+    public ApiResponse updateById(@RequestBody YwTopUpLog ywTopUpLog, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywTopUpLog.setLoginUserInfo(this.getLoginUser(token));
+        ywTopUpLogService.updateById(ywTopUpLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywtopuplog:query")
+    public ApiResponse<PageData<YwTopUpLog>> findPage(@RequestBody PageWrap<YwTopUpLog> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywTopUpLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywtopuplog:query")
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywTopUpLogService.findById(id));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywtopuplog:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<YwTopUpLog> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.getModel().setLoginUserInfo(this.getLoginUser(token));
+        ExcelExporter.build(YwTopUpLog.class).export(ywTopUpLogService.findPage(pageWrap).getRecords(), "鍏呭�艰褰�", response);
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
index 96054ed..bff4a23 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
         namespace: funingyunwei_dev
         username: nacos
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
index 385cbc6..5ed4f91 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.3:8848 #閰嶇疆Nacos鍦板潃
         namespace: funingyunwei_test
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwConditionerMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwConditionerMapper.java
new file mode 100644
index 0000000..81df6e6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwConditionerMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.doumee.dao.business.model.YwConditioner;
+
+/**
+ * 绌鸿皟璁惧淇℃伅Mapper
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwConditionerMapper extends MPJBaseMapper<YwConditioner> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalLogMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalLogMapper.java
new file mode 100644
index 0000000..983e617
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalLogMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.doumee.dao.business.model.YwElectricalLog;
+
+/**
+ * 鐢靛櫒绫绘搷浣滄棩蹇桵apper
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwElectricalLogMapper extends MPJBaseMapper<YwElectricalLog> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalMapper.java
new file mode 100644
index 0000000..b5a5579
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.doumee.dao.business.model.YwElectrical;
+
+/**
+ * 鐢佃〃璁惧淇℃伅Mapper
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwElectricalMapper extends MPJBaseMapper<YwElectrical> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalRoomMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalRoomMapper.java
new file mode 100644
index 0000000..ee99e89
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwElectricalRoomMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.doumee.dao.business.model.YwElectricalRoom;
+
+/**
+ * 璁惧鍏宠仈鎴块棿Mapper
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwElectricalRoomMapper extends MPJBaseMapper<YwElectricalRoom> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwGatewayMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwGatewayMapper.java
new file mode 100644
index 0000000..a27c973
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwGatewayMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.doumee.dao.business.model.YwGateway;
+
+/**
+ * 缃戝叧绠$悊Mapper
+ * @author renkang
+ * @date 2026/04/02
+ */
+public interface YwGatewayMapper extends MPJBaseMapper<YwGateway> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwTopUpLogMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwTopUpLogMapper.java
new file mode 100644
index 0000000..66d73f1
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwTopUpLogMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.doumee.dao.business.model.YwTopUpLog;
+
+/**
+ * 鍏呭�艰褰昅apper
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwTopUpLogMapper extends MPJBaseMapper<YwTopUpLog> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
index 70a6da0..9dcdaa7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
@@ -73,8 +73,8 @@
     @ExcelColumn(name="鎺掑簭鐮�")
     private Integer sortnum;
 
-    @ApiModelProperty(value = "绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱鐐� 4骞挎挱璁惧 5鏂矾鍣ㄧ┖寮� 6娴峰悍鐢佃〃 7j绌鸿", example = "1")
-    @ExcelColumn(name="绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱鐐� 4骞挎挱璁惧 5鏂矾鍣ㄧ┖寮� 6娴峰悍鐢佃〃 7绌鸿")
+    @ApiModelProperty(value = "绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱鐐� 4骞挎挱璁惧 5鏂矾鍣ㄧ┖寮� 6娴峰悍鐢佃〃 7鏅烘収绌鸿", example = "1")
+    @ExcelColumn(name="绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱鐐� 4骞挎挱璁惧 5鏂矾鍣ㄧ┖寮� 6娴峰悍鐢佃〃 7鏅烘収绌鸿")
     private Integer type;
     @ApiModelProperty(value = "鏄惁鍥尯鍑哄叆鍙� 0涓嶆槸 1鏄�", example = "1")
     @ExcelColumn(name="鏄惁鍥尯鍑哄叆鍙� 0涓嶆槸 1鏄�")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwConditioner.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwConditioner.java
new file mode 100644
index 0000000..a36ddc0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwConditioner.java
@@ -0,0 +1,84 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 绌鸿皟璁惧淇℃伅
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Data
+@ApiModel("绌鸿皟璁惧淇℃伅")
+@TableName("`yw_conditioner`")
+public class YwConditioner extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�")
+    @ExcelColumn(name = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�")
+    @ExcelColumn(name = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "0")
+    @ExcelColumn(name = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    @ExcelColumn(name = "璁惧缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "琛ㄥ湴鍧�(閫氳鍦板潃)")
+    @ExcelColumn(name = "琛ㄥ湴鍧�(閫氳鍦板潃)")
+    private String electricAddress;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name = "鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "涓婃蹇冭烦鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "涓婃蹇冭烦鏃堕棿")
+    private Date lastHeartbeatDate;
+
+    @ApiModelProperty(value = "鐢佃〃浣欓")
+    @ExcelColumn(name = "鐢佃〃浣欓")
+    private BigDecimal balance;
+
+    @ApiModelProperty(value = "閿佸畾鐘舵�侊細0=涓嶉攣瀹氾紱1=閿佸畾鍏筹紱2=閿佸畾寮�", example = "0")
+    @ExcelColumn(name = "閿佸畾鐘舵��")
+    private Integer status;
+
+    @ApiModelProperty(value = "绱鐢ㄧ數閲戦")
+    @ExcelColumn(name = "绱鐢ㄧ數閲戦")
+    private BigDecimal useAmount;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectrical.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectrical.java
new file mode 100644
index 0000000..fe2abd3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectrical.java
@@ -0,0 +1,119 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鐢佃〃璁惧淇℃伅
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Data
+@ApiModel("鐢佃〃璁惧淇℃伅")
+@TableName("`yw_electrical`")
+public class YwElectrical extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�")
+    @ExcelColumn(name = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�")
+    @ExcelColumn(name = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "0")
+    @ExcelColumn(name = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "閲囬泦鍣ㄥ彿")
+    @ExcelColumn(name = "閲囬泦鍣ㄥ彿")
+    private String collectorNo;
+
+    @ApiModelProperty(value = "琛ㄥ彿")
+    @ExcelColumn(name = "琛ㄥ彿")
+    private String code;
+
+    @ApiModelProperty(value = "琛ㄥ湴鍧�(閫氳鍦板潃)")
+    @ExcelColumn(name = "琛ㄥ湴鍧�(閫氳鍦板潃)")
+    private String electricAddress;
+
+    @ApiModelProperty(value = "鐢佃〃绫诲瀷")
+    @ExcelColumn(name = "鐢佃〃绫诲瀷")
+    private String electricType;
+
+    @ApiModelProperty(value = "鍊嶇巼", example = "1")
+    @ExcelColumn(name = "鍊嶇巼")
+    private Integer magnification;
+
+    @ApiModelProperty(value = "浠樿垂绫诲瀷", example = "0")
+    @ExcelColumn(name = "浠樿垂绫诲瀷")
+    private Integer payType;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name = "鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "缃戝叧涓婚敭", example = "1")
+    @ExcelColumn(name = "缃戝叧涓婚敭")
+    private Integer gatewayId;
+
+    @ApiModelProperty(value = "缃戝叧閫氫俊绔彛")
+    @ExcelColumn(name = "缃戝叧閫氫俊绔彛")
+    private String gatewayPort;
+
+    @ApiModelProperty(value = "涓婃蹇冭烦鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "涓婃蹇冭烦鏃堕棿")
+    private Date lastHeartbeatDate;
+
+    @ApiModelProperty(value = "鐢佃〃浣欓")
+    @ExcelColumn(name = "鐢佃〃浣欓")
+    private BigDecimal balance;
+
+    @ApiModelProperty(value = "杩愯鐘舵�侊細0=鏈紑鎴凤紱1=鎷夐椄锛�2=鍚堥椄锛�3=鍏朵粬", example = "0")
+    @ExcelColumn(name = "杩愯鐘舵��")
+    private Integer runStatus;
+
+    @ApiModelProperty(value = "涓婃寮�鎴锋椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "涓婃寮�鎴锋椂闂�")
+    private Date lastOpenDate;
+
+    @ApiModelProperty(value = "涓婃娓呴浂鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "涓婃娓呴浂鏃堕棿")
+    private Date lastCleanDate;
+
+    @ApiModelProperty(value = "缃戝叧鍚嶇О")
+    @TableField(exist = false)
+    private String gatewayName;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalLog.java
new file mode 100644
index 0000000..d5c2816
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalLog.java
@@ -0,0 +1,86 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 鐢靛櫒绫绘搷浣滄棩蹇�
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Data
+@ApiModel("鐢靛櫒绫绘搷浣滄棩蹇�")
+@TableName("`yw_electrical_log`")
+public class YwElectricalLog extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "0")
+    @ExcelColumn(name = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "璁惧绫诲瀷 0鐢佃〃 1绌鸿皟", example = "0")
+    @ExcelColumn(name = "璁惧绫诲瀷")
+    private Integer deviceType;
+
+    @ApiModelProperty(value = "绫诲瀷 0璋冪敤 1鎺ㄩ�佹帴鍙�", example = "0")
+    @ExcelColumn(name = "绫诲瀷")
+    private Integer type;
+
+    @ApiModelProperty(value = "鎺ュ彛鍚嶇О")
+    @ExcelColumn(name = "鎺ュ彛鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鍦板潃淇℃伅")
+    @ExcelColumn(name = "鍦板潃淇℃伅")
+    private String url;
+
+    @ApiModelProperty(value = "璇锋眰鍙傛暟")
+    @ExcelColumn(name = "璇锋眰鍙傛暟")
+    private String request;
+
+    @ApiModelProperty(value = "鍝嶅簲鍙傛暟")
+    @ExcelColumn(name = "鍝嶅簲鍙傛暟")
+    private String reponse;
+
+    @ApiModelProperty(value = "璋冪敤缁撴灉 0鎴愬姛 1澶辫触", example = "0")
+    @ExcelColumn(name = "璋冪敤缁撴灉")
+    private Integer success;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄缂栫爜锛堝涓敤鑻辨枃閫楀彿闅斿紑锛�")
+    @ExcelColumn(name = "鍏宠仈瀵硅薄缂栫爜")
+    private String objId;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalRoom.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalRoom.java
new file mode 100644
index 0000000..69fd1b7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwElectricalRoom.java
@@ -0,0 +1,79 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 璁惧鍏宠仈鎴块棿
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Data
+@ApiModel("璁惧鍏宠仈鎴块棿")
+@TableName("`yw_electrical_room`")
+public class YwElectricalRoom extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "0")
+    @ExcelColumn(name = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "涓氬姟绫诲瀷 0鐢佃〃 1绌鸿皟", example = "0")
+    @ExcelColumn(name = "涓氬姟绫诲瀷")
+    private Integer type;
+
+    @ApiModelProperty(value = "鎴挎簮缂栫爜锛堝叧鑱攜w_room)", example = "1")
+    @ExcelColumn(name = "鎴挎簮缂栫爜")
+    private Integer roomId;
+
+    @ApiModelProperty(value = "鍏宠仈涓婚敭锛堢數琛ㄥ叧鑱旓細yw_electrical锛涚┖璋冨叧鑱旓細yw_conditioner)", example = "1")
+    @ExcelColumn(name = "鍏宠仈涓婚敭")
+    private Integer objId;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name = "鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鎴块棿鍚嶇О")
+    @TableField(exist = false)
+    private String roomName;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    @TableField(exist = false)
+    private String objName;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwGateway.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwGateway.java
new file mode 100644
index 0000000..f30c540
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwGateway.java
@@ -0,0 +1,87 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 缃戝叧绠$悊
+ * @author renkang
+ * @date 2026/04/02
+ */
+@Data
+@ApiModel("缃戝叧绠$悊")
+@TableName("`yw_gateway`")
+public class YwGateway extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "0")
+    @ExcelColumn(name = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "缃戝叧鍚嶇О")
+    @ExcelColumn(name = "缃戝叧鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "0")
+    @ExcelColumn(name = "鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name = "鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "缃戝叧鍨嬪彿")
+    @ExcelColumn(name = "缃戝叧鍨嬪彿")
+    private String gatewayModel;
+
+    @ApiModelProperty(value = "缃戝叧璁惧鍙�")
+    @ExcelColumn(name = "缃戝叧璁惧鍙�")
+    private String gatewayCode;
+
+    @ApiModelProperty(value = "鏈�鍚庡績璺虫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "鏈�鍚庡績璺虫椂闂�")
+    private Date lastHeartbeatTime;
+
+    @ApiModelProperty(value = "鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)", example = "1")
+    private Integer projectId;
+
+    @ApiModelProperty(value = "椤圭洰鍚嶇О")
+    @TableField(exist = false)
+    private String projectName;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwTopUpLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwTopUpLog.java
new file mode 100644
index 0000000..c3bfc4f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwTopUpLog.java
@@ -0,0 +1,102 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鍏呭�艰褰�
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Data
+@ApiModel("鍏呭�艰褰�")
+@TableName("`yw_top_up_log`")
+public class YwTopUpLog extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�")
+    @ExcelColumn(name = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�")
+    @ExcelColumn(name = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "0")
+    @ExcelColumn(name = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鍏宠仈涓氬姟涓婚敭锛坹w_electrical锛�", example = "1")
+    @ExcelColumn(name = "鍏宠仈涓氬姟涓婚敭")
+    private Integer objId;
+
+    @ApiModelProperty(value = "鎵�灞炲叕鍙革紙company锛�", example = "1")
+    @ExcelColumn(name = "鎵�灞炲叕鍙�")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "鏀舵敮璐︽埛锛堝叧鑱攜w_account)", example = "1")
+    @ExcelColumn(name = "鏀舵敮璐︽埛")
+    private Integer accountId;
+
+    @ApiModelProperty(value = "鍏ヨ处鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "鍏ヨ处鏃ユ湡")
+    private Date creditDate;
+
+    @ApiModelProperty(value = "鍏ヨ处閲戦")
+    @ExcelColumn(name = "鍏ヨ处閲戦")
+    private BigDecimal creditFee;
+
+    @ApiModelProperty(value = "鍏呭�肩姸鎬侊細0=鍏呭�间腑锛�1=鍏呭�兼垚鍔燂紱2=鍏呭�煎け璐�", example = "0")
+    @ExcelColumn(name = "鍏呭�肩姸鎬�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍥炶皟鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "鍥炶皟鏃堕棿")
+    private Date callbackDate;
+
+    @ApiModelProperty(value = "鍥炶皟缁撴灉")
+    @ExcelColumn(name = "鍥炶皟缁撴灉")
+    private String callbackInfo;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    @TableField(exist = false)
+    private String electricalName;
+
+    @ApiModelProperty(value = "鍏徃鍚嶇О")
+    @TableField(exist = false)
+    private String companyName;
+
+    @ApiModelProperty(value = "璐︽埛鍚嶇О")
+    @TableField(exist = false)
+    private String accountName;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwConditionerService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwConditionerService.java
new file mode 100644
index 0000000..0714f90
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwConditionerService.java
@@ -0,0 +1,21 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwConditioner;
+import java.util.List;
+
+/**
+ * 绌鸿皟璁惧淇℃伅Service瀹氫箟
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwConditionerService {
+    Integer create(YwConditioner ywConditioner);
+    void deleteById(Integer id, LoginUserInfo user);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
+    void updateById(YwConditioner ywConditioner);
+    YwConditioner findById(Integer id);
+    PageData<YwConditioner> findPage(PageWrap<YwConditioner> pageWrap);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalLogService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalLogService.java
new file mode 100644
index 0000000..4e4ef1e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalLogService.java
@@ -0,0 +1,21 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwElectricalLog;
+import java.util.List;
+
+/**
+ * 鐢靛櫒绫绘搷浣滄棩蹇桽ervice瀹氫箟
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwElectricalLogService {
+    Integer create(YwElectricalLog ywElectricalLog);
+    void deleteById(Integer id, LoginUserInfo user);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
+    void updateById(YwElectricalLog ywElectricalLog);
+    YwElectricalLog findById(Integer id);
+    PageData<YwElectricalLog> findPage(PageWrap<YwElectricalLog> pageWrap);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalRoomService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalRoomService.java
new file mode 100644
index 0000000..f7acf62
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalRoomService.java
@@ -0,0 +1,21 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwElectricalRoom;
+import java.util.List;
+
+/**
+ * 璁惧鍏宠仈鎴块棿Service瀹氫箟
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwElectricalRoomService {
+    Integer create(YwElectricalRoom ywElectricalRoom);
+    void deleteById(Integer id, LoginUserInfo user);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
+    void updateById(YwElectricalRoom ywElectricalRoom);
+    YwElectricalRoom findById(Integer id);
+    PageData<YwElectricalRoom> findPage(PageWrap<YwElectricalRoom> pageWrap);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalService.java
new file mode 100644
index 0000000..171af34
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwElectricalService.java
@@ -0,0 +1,21 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwElectrical;
+import java.util.List;
+
+/**
+ * 鐢佃〃璁惧淇℃伅Service瀹氫箟
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwElectricalService {
+    Integer create(YwElectrical ywElectrical);
+    void deleteById(Integer id, LoginUserInfo user);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
+    void updateById(YwElectrical ywElectrical);
+    YwElectrical findById(Integer id);
+    PageData<YwElectrical> findPage(PageWrap<YwElectrical> pageWrap);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwGatewayService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwGatewayService.java
new file mode 100644
index 0000000..b76f0e7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwGatewayService.java
@@ -0,0 +1,70 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwGateway;
+
+import java.util.List;
+
+/**
+ * 缃戝叧绠$悊Service瀹氫箟
+ * @author renkang
+ * @date 2026/04/02
+ */
+public interface YwGatewayService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param ywGateway 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwGateway ywGateway);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     * @param user 鐧诲綍鐢ㄦ埛
+     */
+    void deleteById(Integer id, LoginUserInfo user);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     * @param user 鐧诲綍鐢ㄦ埛
+     */
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywGateway 瀹炰綋瀵硅薄
+     */
+    void updateById(YwGateway ywGateway);
+
+    /**
+     * 鏇存柊鐘舵��
+     *
+     * @param ywGateway 瀹炰綋瀵硅薄锛坕d + status锛�
+     */
+    void updateStatusById(YwGateway ywGateway);
+
+    /**
+     * 涓婚敭鏌ヨ璇︽儏
+     *
+     * @param id 涓婚敭
+     * @return YwGateway
+     */
+    YwGateway findById(Integer id);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwGateway>
+     */
+    PageData<YwGateway> findPage(PageWrap<YwGateway> pageWrap);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwTopUpLogService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwTopUpLogService.java
new file mode 100644
index 0000000..c132930
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwTopUpLogService.java
@@ -0,0 +1,21 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwTopUpLog;
+import java.util.List;
+
+/**
+ * 鍏呭�艰褰昐ervice瀹氫箟
+ * @author renkang
+ * @date 2026/04/03
+ */
+public interface YwTopUpLogService {
+    Integer create(YwTopUpLog ywTopUpLog);
+    void deleteById(Integer id, LoginUserInfo user);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
+    void updateById(YwTopUpLog ywTopUpLog);
+    YwTopUpLog findById(Integer id);
+    PageData<YwTopUpLog> findPage(PageWrap<YwTopUpLog> pageWrap);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwConditionerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwConditionerServiceImpl.java
new file mode 100644
index 0000000..3f563dc
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwConditionerServiceImpl.java
@@ -0,0 +1,128 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwConditionerMapper;
+import com.doumee.dao.business.model.YwConditioner;
+import com.doumee.service.business.YwConditionerService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 绌鸿皟璁惧淇℃伅Service瀹炵幇
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Service
+public class YwConditionerServiceImpl implements YwConditionerService {
+
+    @Autowired
+    private YwConditionerMapper ywConditionerMapper;
+
+    @Override
+    public Integer create(YwConditioner ywConditioner) {
+        if (Objects.isNull(ywConditioner)
+                || StringUtils.isBlank(ywConditioner.getName())
+                || StringUtils.isBlank(ywConditioner.getCode())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywConditioner.getLoginUserInfo();
+        // 鏍¢獙璁惧缂栧彿鍞竴
+        if (ywConditionerMapper.selectCount(new QueryWrapper<YwConditioner>().lambda()
+                .eq(YwConditioner::getIsdeleted, Constants.ZERO)
+                .eq(YwConditioner::getCode, ywConditioner.getCode())) > Constants.ZERO) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璁惧缂栧彿閲嶅!");
+        }
+        ywConditioner.setCreateDate(new Date());
+        ywConditioner.setCreator(loginUserInfo.getId());
+        ywConditioner.setEditDate(new Date());
+        ywConditioner.setEditor(loginUserInfo.getId());
+        ywConditioner.setIsdeleted(Constants.ZERO);
+        ywConditionerMapper.insert(ywConditioner);
+        return ywConditioner.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo user) {
+        ywConditionerMapper.update(new UpdateWrapper<YwConditioner>()
+                .lambda()
+                .set(YwConditioner::getIsdeleted, Constants.ONE)
+                .set(YwConditioner::getEditDate, DateUtil.getCurrDateTime())
+                .set(YwConditioner::getEditor, user)
+                .eq(YwConditioner::getId, id)
+        );
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id, user);
+        }
+    }
+
+    @Override
+    public void updateById(YwConditioner ywConditioner) {
+        if (Objects.isNull(ywConditioner)
+                || Objects.isNull(ywConditioner.getId())
+                || StringUtils.isBlank(ywConditioner.getName())
+                || StringUtils.isBlank(ywConditioner.getCode())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywConditioner.getLoginUserInfo();
+        // 鏍¢獙璁惧缂栧彿鍞竴锛堟帓闄よ嚜韬級
+        if (ywConditionerMapper.selectCount(new QueryWrapper<YwConditioner>().lambda()
+                .eq(YwConditioner::getIsdeleted, Constants.ZERO)
+                .eq(YwConditioner::getCode, ywConditioner.getCode())
+                .ne(YwConditioner::getId, ywConditioner.getId())) > Constants.ZERO) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璁惧缂栧彿閲嶅!");
+        }
+        ywConditioner.setEditDate(new Date());
+        ywConditioner.setEditor(loginUserInfo.getId());
+        ywConditionerMapper.updateById(ywConditioner);
+    }
+
+    @Override
+    public YwConditioner findById(Integer id) {
+        return ywConditionerMapper.selectOne(new QueryWrapper<YwConditioner>().lambda()
+                .eq(YwConditioner::getId, id)
+                .last(" limit 1 "));
+    }
+
+    @Override
+    public PageData<YwConditioner> findPage(PageWrap<YwConditioner> pageWrap) {
+        IPage<YwConditioner> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwConditioner> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwConditioner model = pageWrap.getModel();
+        queryWrapper.selectAll(YwConditioner.class)
+                .and(Objects.nonNull(model) && StringUtils.isNotBlank(model.getName()),
+                        i -> i.like(YwConditioner::getName, model.getName())
+                             .or()
+                             .like(YwConditioner::getCode, model.getName()))
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getStatus()), YwConditioner::getStatus, model.getStatus())
+                .eq(YwConditioner::getIsdeleted, Constants.ZERO)
+                .orderByDesc(YwConditioner::getCreateDate);
+        IPage<YwConditioner> iPage = ywConditionerMapper.selectJoinPage(page, YwConditioner.class, queryWrapper);
+        return PageData.from(iPage);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalLogServiceImpl.java
new file mode 100644
index 0000000..8881b2e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalLogServiceImpl.java
@@ -0,0 +1,111 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwElectricalLogMapper;
+import com.doumee.dao.business.model.YwElectricalLog;
+import com.doumee.service.business.YwElectricalLogService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 鐢靛櫒绫绘搷浣滄棩蹇桽ervice瀹炵幇
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Service
+public class YwElectricalLogServiceImpl implements YwElectricalLogService {
+
+    @Autowired
+    private YwElectricalLogMapper ywElectricalLogMapper;
+
+    @Override
+    public Integer create(YwElectricalLog ywElectricalLog) {
+        if (Objects.isNull(ywElectricalLog)
+                || StringUtils.isBlank(ywElectricalLog.getName())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywElectricalLog.getLoginUserInfo();
+        ywElectricalLog.setCreateDate(new Date());
+        ywElectricalLog.setCreator(loginUserInfo.getId());
+        ywElectricalLog.setEditDate(new Date());
+        ywElectricalLog.setEditor(loginUserInfo.getId());
+        ywElectricalLog.setIsdeleted(Constants.ZERO);
+        ywElectricalLogMapper.insert(ywElectricalLog);
+        return ywElectricalLog.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo user) {
+        ywElectricalLogMapper.update(new UpdateWrapper<YwElectricalLog>()
+                .lambda()
+                .set(YwElectricalLog::getIsdeleted, Constants.ONE)
+                .set(YwElectricalLog::getEditDate, DateUtil.getCurrDateTime())
+                .set(YwElectricalLog::getEditor, user.getId())
+                .eq(YwElectricalLog::getId, id)
+        );
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id, user);
+        }
+    }
+
+    @Override
+    public void updateById(YwElectricalLog ywElectricalLog) {
+        if (Objects.isNull(ywElectricalLog) || Objects.isNull(ywElectricalLog.getId())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywElectricalLog.getLoginUserInfo();
+        ywElectricalLog.setEditDate(new Date());
+        ywElectricalLog.setEditor(loginUserInfo.getId());
+        ywElectricalLogMapper.updateById(ywElectricalLog);
+    }
+
+    @Override
+    public YwElectricalLog findById(Integer id) {
+        return ywElectricalLogMapper.selectOne(new QueryWrapper<YwElectricalLog>().lambda()
+                .eq(YwElectricalLog::getId, id)
+                .last(" limit 1 "));
+    }
+
+    @Override
+    public PageData<YwElectricalLog> findPage(PageWrap<YwElectricalLog> pageWrap) {
+        IPage<YwElectricalLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwElectricalLog> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwElectricalLog model = pageWrap.getModel();
+        queryWrapper.selectAll(YwElectricalLog.class)
+                .and(Objects.nonNull(model) && StringUtils.isNotBlank(model.getName()),
+                        i -> i.like(YwElectricalLog::getName, model.getName()))
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getDeviceType()), YwElectricalLog::getDeviceType, model.getDeviceType())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getType()), YwElectricalLog::getType, model.getType())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getSuccess()), YwElectricalLog::getSuccess, model.getSuccess())
+                .eq(YwElectricalLog::getIsdeleted, Constants.ZERO)
+                .orderByDesc(YwElectricalLog::getCreateDate);
+        IPage<YwElectricalLog> iPage = ywElectricalLogMapper.selectJoinPage(page, YwElectricalLog.class, queryWrapper);
+        return PageData.from(iPage);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalRoomServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalRoomServiceImpl.java
new file mode 100644
index 0000000..70e651d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalRoomServiceImpl.java
@@ -0,0 +1,117 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwElectricalRoomMapper;
+import com.doumee.dao.business.model.YwConditioner;
+import com.doumee.dao.business.model.YwElectrical;
+import com.doumee.dao.business.model.YwElectricalRoom;
+import com.doumee.service.business.YwElectricalRoomService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 璁惧鍏宠仈鎴块棿Service瀹炵幇
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Service
+public class YwElectricalRoomServiceImpl implements YwElectricalRoomService {
+
+    @Autowired
+    private YwElectricalRoomMapper ywElectricalRoomMapper;
+
+    @Override
+    public Integer create(YwElectricalRoom ywElectricalRoom) {
+        if (Objects.isNull(ywElectricalRoom)
+                || Objects.isNull(ywElectricalRoom.getRoomId())
+                || Objects.isNull(ywElectricalRoom.getObjId())
+                || Objects.isNull(ywElectricalRoom.getType())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywElectricalRoom.getLoginUserInfo();
+        ywElectricalRoom.setCreateDate(new Date());
+        ywElectricalRoom.setCreator(loginUserInfo.getId());
+        ywElectricalRoom.setEditDate(new Date());
+        ywElectricalRoom.setEditor(loginUserInfo.getId());
+        ywElectricalRoom.setIsdeleted(Constants.ZERO);
+        ywElectricalRoomMapper.insert(ywElectricalRoom);
+        return ywElectricalRoom.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo user) {
+        ywElectricalRoomMapper.update(new UpdateWrapper<YwElectricalRoom>()
+                .lambda()
+                .set(YwElectricalRoom::getIsdeleted, Constants.ONE)
+                .set(YwElectricalRoom::getEditDate, DateUtil.getCurrDateTime())
+                .set(YwElectricalRoom::getEditor, user.getId())
+                .eq(YwElectricalRoom::getId, id)
+        );
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id, user);
+        }
+    }
+
+    @Override
+    public void updateById(YwElectricalRoom ywElectricalRoom) {
+        if (Objects.isNull(ywElectricalRoom)
+                || Objects.isNull(ywElectricalRoom.getId())
+                || Objects.isNull(ywElectricalRoom.getRoomId())
+                || Objects.isNull(ywElectricalRoom.getObjId())
+                || Objects.isNull(ywElectricalRoom.getType())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywElectricalRoom.getLoginUserInfo();
+        ywElectricalRoom.setEditDate(new Date());
+        ywElectricalRoom.setEditor(loginUserInfo.getId());
+        ywElectricalRoomMapper.updateById(ywElectricalRoom);
+    }
+
+    @Override
+    public YwElectricalRoom findById(Integer id) {
+        return ywElectricalRoomMapper.selectOne(new QueryWrapper<YwElectricalRoom>().lambda()
+                .eq(YwElectricalRoom::getId, id)
+                .last(" limit 1 "));
+    }
+
+    @Override
+    public PageData<YwElectricalRoom> findPage(PageWrap<YwElectricalRoom> pageWrap) {
+        IPage<YwElectricalRoom> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwElectricalRoom> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwElectricalRoom model = pageWrap.getModel();
+        queryWrapper.selectAll(YwElectricalRoom.class)
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getType()), YwElectricalRoom::getType, model.getType())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getRoomId()), YwElectricalRoom::getRoomId, model.getRoomId())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getObjId()), YwElectricalRoom::getObjId, model.getObjId())
+                .eq(YwElectricalRoom::getIsdeleted, Constants.ZERO)
+                .orderByDesc(YwElectricalRoom::getCreateDate);
+        IPage<YwElectricalRoom> iPage = ywElectricalRoomMapper.selectJoinPage(page, YwElectricalRoom.class, queryWrapper);
+        return PageData.from(iPage);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalServiceImpl.java
new file mode 100644
index 0000000..f25aa2d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwElectricalServiceImpl.java
@@ -0,0 +1,137 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwElectricalMapper;
+import com.doumee.dao.business.model.YwElectrical;
+import com.doumee.dao.business.model.YwGateway;
+import com.doumee.service.business.YwElectricalService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 鐢佃〃璁惧淇℃伅Service瀹炵幇
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Service
+public class YwElectricalServiceImpl implements YwElectricalService {
+
+    @Autowired
+    private YwElectricalMapper ywElectricalMapper;
+
+    @Override
+    public Integer create(YwElectrical ywElectrical) {
+        if (Objects.isNull(ywElectrical)
+                || StringUtils.isBlank(ywElectrical.getName())
+                || StringUtils.isBlank(ywElectrical.getCode())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywElectrical.getLoginUserInfo();
+        // 鏍¢獙琛ㄥ彿鍞竴
+        if (ywElectricalMapper.selectCount(new QueryWrapper<YwElectrical>().lambda()
+                .eq(YwElectrical::getIsdeleted, Constants.ZERO)
+                .eq(YwElectrical::getCode, ywElectrical.getCode())) > Constants.ZERO) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "琛ㄥ彿閲嶅!");
+        }
+        ywElectrical.setCreateDate(new Date());
+        ywElectrical.setCreator(loginUserInfo.getId());
+        ywElectrical.setEditDate(new Date());
+        ywElectrical.setEditor(loginUserInfo.getId());
+        ywElectrical.setIsdeleted(Constants.ZERO);
+        ywElectricalMapper.insert(ywElectrical);
+        return ywElectrical.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo user) {
+        ywElectricalMapper.update(new UpdateWrapper<YwElectrical>()
+                .lambda()
+                .set(YwElectrical::getIsdeleted, Constants.ONE)
+                .set(YwElectrical::getEditDate, DateUtil.getCurrDateTime())
+                .set(YwElectrical::getEditor, user.getId())
+                .eq(YwElectrical::getId, id)
+        );
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id, user);
+        }
+    }
+
+    @Override
+    public void updateById(YwElectrical ywElectrical) {
+        if (Objects.isNull(ywElectrical)
+                || Objects.isNull(ywElectrical.getId())
+                || StringUtils.isBlank(ywElectrical.getName())
+                || StringUtils.isBlank(ywElectrical.getCode())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywElectrical.getLoginUserInfo();
+        // 鏍¢獙琛ㄥ彿鍞竴锛堟帓闄よ嚜韬級
+        if (ywElectricalMapper.selectCount(new QueryWrapper<YwElectrical>().lambda()
+                .eq(YwElectrical::getIsdeleted, Constants.ZERO)
+                .eq(YwElectrical::getCode, ywElectrical.getCode())
+                .ne(YwElectrical::getId, ywElectrical.getId())) > Constants.ZERO) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "琛ㄥ彿閲嶅!");
+        }
+        ywElectrical.setEditDate(new Date());
+        ywElectrical.setEditor(loginUserInfo.getId());
+        ywElectricalMapper.updateById(ywElectrical);
+    }
+
+    @Override
+    public YwElectrical findById(Integer id) {
+        return ywElectricalMapper.selectJoinOne(YwElectrical.class,
+                new MPJLambdaWrapper<YwElectrical>()
+                        .selectAll(YwElectrical.class)
+                        .selectAs(YwGateway::getName, YwElectrical::getGatewayName)
+                        .leftJoin(YwGateway.class, YwGateway::getId, YwElectrical::getGatewayId)
+                        .eq(YwElectrical::getId, id)
+                        .last(" limit 1 ")
+        );
+    }
+
+    @Override
+    public PageData<YwElectrical> findPage(PageWrap<YwElectrical> pageWrap) {
+        IPage<YwElectrical> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwElectrical> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwElectrical model = pageWrap.getModel();
+        queryWrapper.selectAll(YwElectrical.class)
+                .selectAs(YwGateway::getName, YwElectrical::getGatewayName)
+                .leftJoin(YwGateway.class, YwGateway::getId, YwElectrical::getGatewayId)
+                .and(Objects.nonNull(model) && StringUtils.isNotBlank(model.getName()),
+                        i -> i.like(YwElectrical::getName, model.getName())
+                             .or()
+                             .like(YwElectrical::getCode, model.getName()))
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getRunStatus()), YwElectrical::getRunStatus, model.getRunStatus())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getGatewayId()), YwElectrical::getGatewayId, model.getGatewayId())
+                .eq(YwElectrical::getIsdeleted, Constants.ZERO)
+                .orderByDesc(YwElectrical::getCreateDate);
+        IPage<YwElectrical> iPage = ywElectricalMapper.selectJoinPage(page, YwElectrical.class, queryWrapper);
+        return PageData.from(iPage);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwGatewayServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwGatewayServiceImpl.java
new file mode 100644
index 0000000..d9b5653
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwGatewayServiceImpl.java
@@ -0,0 +1,142 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwGatewayMapper;
+import com.doumee.dao.business.model.YwGateway;
+import com.doumee.service.business.YwGatewayService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 缃戝叧绠$悊Service瀹炵幇
+ * @author renkang
+ * @date 2026/04/02
+ */
+@Service
+public class YwGatewayServiceImpl implements YwGatewayService {
+
+    @Autowired
+    private YwGatewayMapper ywGatewayMapper;
+
+    @Override
+    public Integer create(YwGateway ywGateway) {
+        if (Objects.isNull(ywGateway)
+                || StringUtils.isBlank(ywGateway.getName())
+                || StringUtils.isBlank(ywGateway.getGatewayCode())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywGateway.getLoginUserInfo();
+        // 鏍¢獙缃戝叧璁惧鍙峰敮涓�
+        if (ywGatewayMapper.selectCount(new QueryWrapper<YwGateway>().lambda()
+                .eq(YwGateway::getIsdeleted, Constants.ZERO)
+                .eq(YwGateway::getGatewayCode, ywGateway.getGatewayCode())) > Constants.ZERO) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "缃戝叧璁惧鍙烽噸澶�!");
+        }
+        ywGateway.setCreateDate(new Date());
+        ywGateway.setCreator(loginUserInfo.getId());
+        ywGateway.setEditDate(new Date());
+        ywGateway.setEditor(loginUserInfo.getId());
+        ywGateway.setIsdeleted(Constants.ZERO);
+        ywGatewayMapper.insert(ywGateway);
+        return ywGateway.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo user) {
+        ywGatewayMapper.update(new UpdateWrapper<YwGateway>()
+                .lambda()
+                .set(YwGateway::getIsdeleted, Constants.ONE)
+                .set(YwGateway::getEditDate, DateUtil.getCurrDateTime())
+                .set(YwGateway::getEditor, user.getId())
+                .eq(YwGateway::getId, id)
+        );
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id, user);
+        }
+    }
+
+    @Override
+    public void updateById(YwGateway ywGateway) {
+        if (Objects.isNull(ywGateway)
+                || Objects.isNull(ywGateway.getId())
+                || StringUtils.isBlank(ywGateway.getName())
+                || StringUtils.isBlank(ywGateway.getGatewayCode())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywGateway.getLoginUserInfo();
+        // 鏍¢獙缃戝叧璁惧鍙峰敮涓�锛堟帓闄よ嚜韬級
+        if (ywGatewayMapper.selectCount(new QueryWrapper<YwGateway>().lambda()
+                .eq(YwGateway::getIsdeleted, Constants.ZERO)
+                .eq(YwGateway::getGatewayCode, ywGateway.getGatewayCode())
+                .ne(YwGateway::getId, ywGateway.getId())) > Constants.ZERO) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "缃戝叧璁惧鍙烽噸澶�!");
+        }
+        ywGateway.setEditDate(new Date());
+        ywGateway.setEditor(loginUserInfo.getId());
+        ywGatewayMapper.updateById(ywGateway);
+    }
+
+    @Override
+    public void updateStatusById(YwGateway ywGateway) {
+        YwGateway model = new YwGateway();
+        model.setId(ywGateway.getId());
+        model.setStatus(ywGateway.getStatus());
+        ywGatewayMapper.updateById(model);
+    }
+
+    @Override
+    public YwGateway findById(Integer id) {
+        return ywGatewayMapper.selectJoinOne(YwGateway.class,
+                new MPJLambdaWrapper<YwGateway>()
+                        .selectAll(YwGateway.class)
+                        .selectAs(com.doumee.dao.business.model.YwProject::getName, YwGateway::getProjectName)
+                        .leftJoin(com.doumee.dao.business.model.YwProject.class, com.doumee.dao.business.model.YwProject::getId, YwGateway::getProjectId)
+                        .eq(YwGateway::getId, id)
+                        .last(" limit 1 ")
+        );
+    }
+
+    @Override
+    public PageData<YwGateway> findPage(PageWrap<YwGateway> pageWrap) {
+        IPage<YwGateway> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwGateway> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwGateway model = pageWrap.getModel();
+        queryWrapper.selectAll(YwGateway.class)
+                .selectAs(com.doumee.dao.business.model.YwProject::getName, YwGateway::getProjectName)
+                .leftJoin(com.doumee.dao.business.model.YwProject.class, com.doumee.dao.business.model.YwProject::getId, YwGateway::getProjectId)
+                .and(Objects.nonNull(model) && StringUtils.isNotBlank(model.getName()),
+                        i -> i.like(YwGateway::getName, model.getName()).or().like(YwGateway::getGatewayCode, model.getName()))
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getStatus()), YwGateway::getStatus, model.getStatus())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getProjectId()), YwGateway::getProjectId, model.getProjectId())
+                .eq(YwGateway::getIsdeleted, Constants.ZERO)
+                .orderByDesc(YwGateway::getCreateDate);
+        IPage<YwGateway> iPage = ywGatewayMapper.selectJoinPage(page, YwGateway.class, queryWrapper);
+        return PageData.from(iPage);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTopUpLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTopUpLogServiceImpl.java
new file mode 100644
index 0000000..8cc1f04
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTopUpLogServiceImpl.java
@@ -0,0 +1,118 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwTopUpLogMapper;
+import com.doumee.dao.business.model.YwElectrical;
+import com.doumee.dao.business.model.YwTopUpLog;
+import com.doumee.service.business.YwTopUpLogService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 鍏呭�艰褰昐ervice瀹炵幇
+ * @author renkang
+ * @date 2026/04/03
+ */
+@Service
+public class YwTopUpLogServiceImpl implements YwTopUpLogService {
+
+    @Autowired
+    private YwTopUpLogMapper ywTopUpLogMapper;
+
+    @Override
+    public Integer create(YwTopUpLog ywTopUpLog) {
+        if (Objects.isNull(ywTopUpLog)
+                || Objects.isNull(ywTopUpLog.getObjId())
+                || Objects.isNull(ywTopUpLog.getCreditFee())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywTopUpLog.getLoginUserInfo();
+        ywTopUpLog.setCreateDate(new Date());
+        ywTopUpLog.setCreator(loginUserInfo.getId());
+        ywTopUpLog.setEditDate(new Date());
+        ywTopUpLog.setEditor(loginUserInfo.getId());
+        ywTopUpLog.setIsdeleted(Constants.ZERO);
+        ywTopUpLogMapper.insert(ywTopUpLog);
+        return ywTopUpLog.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo user) {
+        ywTopUpLogMapper.update(new UpdateWrapper<YwTopUpLog>()
+                .lambda()
+                .set(YwTopUpLog::getIsdeleted, Constants.ONE)
+                .set(YwTopUpLog::getEditDate, DateUtil.getCurrDateTime())
+                .set(YwTopUpLog::getEditor, user.getId())
+                .eq(YwTopUpLog::getId, id)
+        );
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id, user);
+        }
+    }
+
+    @Override
+    public void updateById(YwTopUpLog ywTopUpLog) {
+        if (Objects.isNull(ywTopUpLog) || Objects.isNull(ywTopUpLog.getId())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywTopUpLog.getLoginUserInfo();
+        ywTopUpLog.setEditDate(new Date());
+        ywTopUpLog.setEditor(loginUserInfo.getId());
+        ywTopUpLogMapper.updateById(ywTopUpLog);
+    }
+
+    @Override
+    public YwTopUpLog findById(Integer id) {
+        return ywTopUpLogMapper.selectJoinOne(YwTopUpLog.class,
+                new MPJLambdaWrapper<YwTopUpLog>()
+                        .selectAll(YwTopUpLog.class)
+                        .selectAs(YwElectrical::getName, YwTopUpLog::getElectricalName)
+                        .leftJoin(YwElectrical.class, YwElectrical::getId, YwTopUpLog::getObjId)
+                        .eq(YwTopUpLog::getId, id)
+                        .last(" limit 1 ")
+        );
+    }
+
+    @Override
+    public PageData<YwTopUpLog> findPage(PageWrap<YwTopUpLog> pageWrap) {
+        IPage<YwTopUpLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<YwTopUpLog> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        YwTopUpLog model = pageWrap.getModel();
+        queryWrapper.selectAll(YwTopUpLog.class)
+                .selectAs(YwElectrical::getName, YwTopUpLog::getElectricalName)
+                .leftJoin(YwElectrical.class, YwElectrical::getId, YwTopUpLog::getObjId)
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getObjId()), YwTopUpLog::getObjId, model.getObjId())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getCompanyId()), YwTopUpLog::getCompanyId, model.getCompanyId())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getStatus()), YwTopUpLog::getStatus, model.getStatus())
+                .eq(YwTopUpLog::getIsdeleted, Constants.ZERO)
+                .orderByDesc(YwTopUpLog::getCreateDate);
+        IPage<YwTopUpLog> iPage = ywTopUpLogMapper.selectJoinPage(page, YwTopUpLog.class, queryWrapper);
+        return PageData.from(iPage);
+    }
+}

--
Gitblit v1.9.3