From 9da6ce44374ca50046c5f4a70e02ed20e2052dff Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期二, 19 十一月 2024 18:15:33 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/funingyunwei

---
 server/db/business.yw_line_point.permissions.sql                                                              |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwCustomerController.java                   |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java               |   92 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractRoomController.java               |   90 
 server/db/business.yw_contract_room.permissions.sql                                                           |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java                     |  103 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java    |  148 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java              |   91 
 server/visits/dmvisit_service/src/main/resources/application-testYL.yml                                       |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java                 |   97 
 server/db/business.yw_device.permissions.sql                                                                  |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java           |   91 
 server/db/business.yw_patrol_scheme.permissions.sql                                                           |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java                 |   85 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractBillController.java               |   90 
 server/db/business.yw_patrol_line.permissions.sql                                                             |    6 
 server/db/business.yw_patrol_task.permissions.sql                                                             |    6 
 server/db/business.yw_device_record.permissions.sql                                                           |    6 
 server/db/business.yw_contract_detail.permissions.sql                                                         |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceController.java                     |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java                  |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java                    |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java       |  203 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java        |  148 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolSchemeController.java               |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolPointMapper.java                  |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java       |  166 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractDetailService.java          |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java     |  142 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java   |  153 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwRoomMapper.java                         |   12 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwLinePointCloudController.java              |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwCustomer.java                     |  143 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwBuildingService.java                |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java                   |  105 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolPointController.java                |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskCloudController.java             |   91 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java                   |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java       |  197 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwCustomerMapper.java                     |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwLinePointMapper.java                    |   12 
 server/db/business.yw_customer.permissions.sql                                                                |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwLinePointService.java               |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java                 |   91 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java           |   91 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwLinePointController.java                  |   90 
 server/db/business.yw_contract_bill.permissions.sql                                                           |    6 
 server/db/business.yw_building.permissions.sql                                                                |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolTaskMapper.java                   |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProjectMapper.java                      |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractRoomMapper.java                 |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwLinePointServiceImpl.java      |  142 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java   |  153 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java            |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java            |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java         |  161 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceRecordController.java               |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolLine.java                   |   70 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceRecordService.java            |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwCustomerCloudController.java               |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceMapper.java                       |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java   |  139 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwBuildingController.java                   |   90 
 server/db/business.yw_patrol_point.permissions.sql                                                            |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwProjectController.java                    |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolSchemeMapper.java                 |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java                  |   78 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolTaskController.java                 |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractDetailCloudController.java         |   91 
 server/db/business.yw_workorder.permissions.sql                                                               |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractController.java                   |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java           |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java                 |  117 
 server/db/business.yw_room.permissions.sql                                                                    |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java               |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java                |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java                         |  107 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java           |  169 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwBuildingMapper.java                     |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java                     |  150 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceRecordMapper.java                 |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractDetail.java               |   93 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java            |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRoom.java                 |   66 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskService.java              |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java                |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractBillMapper.java                 |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractMapper.java                     |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java                      |   78 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolLineService.java              |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwCustomerService.java                |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java                    |   70 
 server/db/business.yw_project.permissions.sql                                                                 |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolLineCloudController.java             |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java     |  169 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwRoomController.java                       |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java             |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolLineMapper.java                   |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java   |  178 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolLineController.java                 |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java                       |   95 
 server/visits/dmvisit_service/src/main/resources/application-testHS.yml.bck                                   |   81 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java                    |  146 
 server/db/business.yw_contract.permissions.sql                                                                |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceRecordCloudController.java           |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java                 |   84 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWorkorderMapper.java                    |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractDetailServiceImpl.java |  159 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractDetailController.java             |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractDetailMapper.java               |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolSchemeService.java            |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwBuildingCloudController.java               |   91 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwWorkorderController.java                  |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java      |  200 +
 114 files changed, 9,035 insertions(+), 0 deletions(-)

diff --git a/server/db/business.yw_building.permissions.sql b/server/db/business.yw_building.permissions.sql
new file mode 100644
index 0000000..13963e8
--- /dev/null
+++ b/server/db/business.yw_building.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywbuilding: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:ywbuilding: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:ywbuilding: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:ywbuilding: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:ywbuilding:exportExcel', '瀵煎嚭杩愮淮妤煎畤淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_contract.permissions.sql b/server/db/business.yw_contract.permissions.sql
new file mode 100644
index 0000000..65d265d
--- /dev/null
+++ b/server/db/business.yw_contract.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywcontract: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:ywcontract: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:ywcontract: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:ywcontract: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:ywcontract:exportExcel', '瀵煎嚭杩愮淮鍚堝悓淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_contract_bill.permissions.sql b/server/db/business.yw_contract_bill.permissions.sql
new file mode 100644
index 0000000..3b595d6
--- /dev/null
+++ b/server/db/business.yw_contract_bill.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywcontractbill: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:ywcontractbill: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:ywcontractbill: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:ywcontractbill: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:ywcontractbill:exportExcel', '瀵煎嚭杩愮淮鍚堝悓璐﹀崟淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_contract_detail.permissions.sql b/server/db/business.yw_contract_detail.permissions.sql
new file mode 100644
index 0000000..907fd7d
--- /dev/null
+++ b/server/db/business.yw_contract_detail.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywcontractdetail: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:ywcontractdetail: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:ywcontractdetail: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:ywcontractdetail: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:ywcontractdetail:exportExcel', '瀵煎嚭杩愮淮鍚堝悓鏉℃淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_contract_room.permissions.sql b/server/db/business.yw_contract_room.permissions.sql
new file mode 100644
index 0000000..7f505b7
--- /dev/null
+++ b/server/db/business.yw_contract_room.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywcontractroom: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:ywcontractroom: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:ywcontractroom: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:ywcontractroom: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:ywcontractroom:exportExcel', '瀵煎嚭杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_customer.permissions.sql b/server/db/business.yw_customer.permissions.sql
new file mode 100644
index 0000000..1cf9415
--- /dev/null
+++ b/server/db/business.yw_customer.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywcustomer: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:ywcustomer: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:ywcustomer: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:ywcustomer: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:ywcustomer:exportExcel', '瀵煎嚭杩愮淮瀹㈡埛淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_device.permissions.sql b/server/db/business.yw_device.permissions.sql
new file mode 100644
index 0000000..c5f64e5
--- /dev/null
+++ b/server/db/business.yw_device.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywdevice: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:ywdevice: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:ywdevice: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:ywdevice: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:ywdevice:exportExcel', '瀵煎嚭杩愮淮璁惧淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_device_record.permissions.sql b/server/db/business.yw_device_record.permissions.sql
new file mode 100644
index 0000000..64f778a
--- /dev/null
+++ b/server/db/business.yw_device_record.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywdevicerecord: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:ywdevicerecord: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:ywdevicerecord: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:ywdevicerecord: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:ywdevicerecord:exportExcel', '瀵煎嚭杩愮淮璁惧杩愮淮璁板綍琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_line_point.permissions.sql b/server/db/business.yw_line_point.permissions.sql
new file mode 100644
index 0000000..ef467d5
--- /dev/null
+++ b/server/db/business.yw_line_point.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywlinepoint: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:ywlinepoint: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:ywlinepoint: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:ywlinepoint: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:ywlinepoint:exportExcel', '瀵煎嚭杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_patrol_line.permissions.sql b/server/db/business.yw_patrol_line.permissions.sql
new file mode 100644
index 0000000..335174f
--- /dev/null
+++ b/server/db/business.yw_patrol_line.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywpatrolline: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:ywpatrolline: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:ywpatrolline: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:ywpatrolline: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:ywpatrolline:exportExcel', '瀵煎嚭杩愮淮宸℃璺嚎淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_patrol_point.permissions.sql b/server/db/business.yw_patrol_point.permissions.sql
new file mode 100644
index 0000000..eb2e823
--- /dev/null
+++ b/server/db/business.yw_patrol_point.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywpatrolpoint: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:ywpatrolpoint: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:ywpatrolpoint: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:ywpatrolpoint: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:ywpatrolpoint:exportExcel', '瀵煎嚭杩愮淮宸℃鐐逛俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_patrol_scheme.permissions.sql b/server/db/business.yw_patrol_scheme.permissions.sql
new file mode 100644
index 0000000..326477d
--- /dev/null
+++ b/server/db/business.yw_patrol_scheme.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywpatrolscheme: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:ywpatrolscheme: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:ywpatrolscheme: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:ywpatrolscheme: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:ywpatrolscheme:exportExcel', '瀵煎嚭杩愮淮宸℃璁″垝淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_patrol_task.permissions.sql b/server/db/business.yw_patrol_task.permissions.sql
new file mode 100644
index 0000000..6b7356d
--- /dev/null
+++ b/server/db/business.yw_patrol_task.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywpatroltask: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:ywpatroltask: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:ywpatroltask: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:ywpatroltask: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:ywpatroltask:exportExcel', '瀵煎嚭杩愮淮宸℃浠诲姟淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_project.permissions.sql b/server/db/business.yw_project.permissions.sql
new file mode 100644
index 0000000..0812cd6
--- /dev/null
+++ b/server/db/business.yw_project.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywproject: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:ywproject: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:ywproject: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:ywproject: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:ywproject:exportExcel', '瀵煎嚭杩愮淮椤圭洰淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_room.permissions.sql b/server/db/business.yw_room.permissions.sql
new file mode 100644
index 0000000..77798b7
--- /dev/null
+++ b/server/db/business.yw_room.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywroom: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:ywroom: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:ywroom: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:ywroom: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:ywroom:exportExcel', '瀵煎嚭杩愮淮鎴挎簮淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.yw_workorder.permissions.sql b/server/db/business.yw_workorder.permissions.sql
new file mode 100644
index 0000000..a3d77e7
--- /dev/null
+++ b/server/db/business.yw_workorder.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywworkorder: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:ywworkorder: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:ywworkorder: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:ywworkorder: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:ywworkorder:exportExcel', '瀵煎嚭杩愮淮宸ュ崟淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwBuildingController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwBuildingController.java
new file mode 100644
index 0000000..a13b17b
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwBuildingController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwBuilding;
+import com.doumee.service.business.YwBuildingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮妤煎畤淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywBuilding")
+public class YwBuildingController extends BaseController {
+
+    @Autowired
+    private YwBuildingService ywBuildingService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywbuilding:create")
+    public ApiResponse create(@RequestBody YwBuilding ywBuilding) {
+        return ApiResponse.success(ywBuildingService.create(ywBuilding));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywbuilding:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywBuildingService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywbuilding:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywBuildingService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywbuilding:update")
+    public ApiResponse updateById(@RequestBody YwBuilding ywBuilding) {
+        ywBuildingService.updateById(ywBuilding);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywbuilding:query")
+    public ApiResponse<PageData<YwBuilding>> findPage (@RequestBody PageWrap<YwBuilding> pageWrap) {
+        return ApiResponse.success(ywBuildingService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywbuilding:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwBuilding> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwBuilding.class).export(ywBuildingService.findPage(pageWrap).getRecords(), "杩愮淮妤煎畤淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywbuilding:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywBuildingService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractBillController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractBillController.java
new file mode 100644
index 0000000..c115fc0
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractBillController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwContractBill;
+import com.doumee.service.business.YwContractBillService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓璐﹀崟淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywContractBill")
+public class YwContractBillController extends BaseController {
+
+    @Autowired
+    private YwContractBillService ywContractBillService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywcontractbill:create")
+    public ApiResponse create(@RequestBody YwContractBill ywContractBill) {
+        return ApiResponse.success(ywContractBillService.create(ywContractBill));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywcontractbill:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywContractBillService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywcontractbill:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywContractBillService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywcontractbill:update")
+    public ApiResponse updateById(@RequestBody YwContractBill ywContractBill) {
+        ywContractBillService.updateById(ywContractBill);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywcontractbill:query")
+    public ApiResponse<PageData<YwContractBill>> findPage (@RequestBody PageWrap<YwContractBill> pageWrap) {
+        return ApiResponse.success(ywContractBillService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywcontractbill:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContractBill> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwContractBill.class).export(ywContractBillService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓璐﹀崟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywcontractbill:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywContractBillService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractController.java
new file mode 100644
index 0000000..3850869
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwContract;
+import com.doumee.service.business.YwContractService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywContract")
+public class YwContractController extends BaseController {
+
+    @Autowired
+    private YwContractService ywContractService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywcontract:create")
+    public ApiResponse create(@RequestBody YwContract ywContract) {
+        return ApiResponse.success(ywContractService.create(ywContract));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywcontract:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywContractService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywcontract:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywContractService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywcontract:update")
+    public ApiResponse updateById(@RequestBody YwContract ywContract) {
+        ywContractService.updateById(ywContract);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywcontract:query")
+    public ApiResponse<PageData<YwContract>> findPage (@RequestBody PageWrap<YwContract> pageWrap) {
+        return ApiResponse.success(ywContractService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywcontract:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContract> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwContract.class).export(ywContractService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywcontract:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywContractService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractDetailController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractDetailController.java
new file mode 100644
index 0000000..4c1448e
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractDetailController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwContractDetail;
+import com.doumee.service.business.YwContractDetailService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓鏉℃淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywContractDetail")
+public class YwContractDetailController extends BaseController {
+
+    @Autowired
+    private YwContractDetailService ywContractDetailService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywcontractdetail:create")
+    public ApiResponse create(@RequestBody YwContractDetail ywContractDetail) {
+        return ApiResponse.success(ywContractDetailService.create(ywContractDetail));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywcontractdetail:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywContractDetailService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywcontractdetail:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywContractDetailService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywcontractdetail:update")
+    public ApiResponse updateById(@RequestBody YwContractDetail ywContractDetail) {
+        ywContractDetailService.updateById(ywContractDetail);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywcontractdetail:query")
+    public ApiResponse<PageData<YwContractDetail>> findPage (@RequestBody PageWrap<YwContractDetail> pageWrap) {
+        return ApiResponse.success(ywContractDetailService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywcontractdetail:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContractDetail> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwContractDetail.class).export(ywContractDetailService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓鏉℃淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywcontractdetail:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywContractDetailService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractRoomController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractRoomController.java
new file mode 100644
index 0000000..1a1a069
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwContractRoomController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwContractRoom;
+import com.doumee.service.business.YwContractRoomService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywContractRoom")
+public class YwContractRoomController extends BaseController {
+
+    @Autowired
+    private YwContractRoomService ywContractRoomService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywcontractroom:create")
+    public ApiResponse create(@RequestBody YwContractRoom ywContractRoom) {
+        return ApiResponse.success(ywContractRoomService.create(ywContractRoom));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywcontractroom:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywContractRoomService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywcontractroom:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywContractRoomService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywcontractroom:update")
+    public ApiResponse updateById(@RequestBody YwContractRoom ywContractRoom) {
+        ywContractRoomService.updateById(ywContractRoom);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywcontractroom:query")
+    public ApiResponse<PageData<YwContractRoom>> findPage (@RequestBody PageWrap<YwContractRoom> pageWrap) {
+        return ApiResponse.success(ywContractRoomService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywcontractroom:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContractRoom> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwContractRoom.class).export(ywContractRoomService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywcontractroom:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywContractRoomService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwCustomerController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwCustomerController.java
new file mode 100644
index 0000000..303a391
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwCustomerController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwCustomer;
+import com.doumee.service.business.YwCustomerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮瀹㈡埛淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywCustomer")
+public class YwCustomerController extends BaseController {
+
+    @Autowired
+    private YwCustomerService ywCustomerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywcustomer:create")
+    public ApiResponse create(@RequestBody YwCustomer ywCustomer) {
+        return ApiResponse.success(ywCustomerService.create(ywCustomer));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywcustomer:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywCustomerService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywcustomer:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywCustomerService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywcustomer:update")
+    public ApiResponse updateById(@RequestBody YwCustomer ywCustomer) {
+        ywCustomerService.updateById(ywCustomer);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywcustomer:query")
+    public ApiResponse<PageData<YwCustomer>> findPage (@RequestBody PageWrap<YwCustomer> pageWrap) {
+        return ApiResponse.success(ywCustomerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywcustomer:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwCustomer> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwCustomer.class).export(ywCustomerService.findPage(pageWrap).getRecords(), "杩愮淮瀹㈡埛淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywcustomer:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywCustomerService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceController.java
new file mode 100644
index 0000000..a69284a
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwDevice;
+import com.doumee.service.business.YwDeviceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮璁惧淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywDevice")
+public class YwDeviceController extends BaseController {
+
+    @Autowired
+    private YwDeviceService ywDeviceService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywdevice:create")
+    public ApiResponse create(@RequestBody YwDevice ywDevice) {
+        return ApiResponse.success(ywDeviceService.create(ywDevice));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywdevice:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywDeviceService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywdevice:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywDeviceService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywdevice:update")
+    public ApiResponse updateById(@RequestBody YwDevice ywDevice) {
+        ywDeviceService.updateById(ywDevice);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywdevice:query")
+    public ApiResponse<PageData<YwDevice>> findPage (@RequestBody PageWrap<YwDevice> pageWrap) {
+        return ApiResponse.success(ywDeviceService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywdevice:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwDevice> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwDevice.class).export(ywDeviceService.findPage(pageWrap).getRecords(), "杩愮淮璁惧淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywdevice:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywDeviceService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceRecordController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceRecordController.java
new file mode 100644
index 0000000..658b47f
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwDeviceRecordController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwDeviceRecord;
+import com.doumee.service.business.YwDeviceRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮璁惧杩愮淮璁板綍琛�")
+@RestController
+@RequestMapping("/business/ywDeviceRecord")
+public class YwDeviceRecordController extends BaseController {
+
+    @Autowired
+    private YwDeviceRecordService ywDeviceRecordService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywdevicerecord:create")
+    public ApiResponse create(@RequestBody YwDeviceRecord ywDeviceRecord) {
+        return ApiResponse.success(ywDeviceRecordService.create(ywDeviceRecord));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywdevicerecord:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywDeviceRecordService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywdevicerecord:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywDeviceRecordService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywdevicerecord:update")
+    public ApiResponse updateById(@RequestBody YwDeviceRecord ywDeviceRecord) {
+        ywDeviceRecordService.updateById(ywDeviceRecord);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywdevicerecord:query")
+    public ApiResponse<PageData<YwDeviceRecord>> findPage (@RequestBody PageWrap<YwDeviceRecord> pageWrap) {
+        return ApiResponse.success(ywDeviceRecordService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywdevicerecord:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwDeviceRecord> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwDeviceRecord.class).export(ywDeviceRecordService.findPage(pageWrap).getRecords(), "杩愮淮璁惧杩愮淮璁板綍琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywdevicerecord:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywDeviceRecordService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwLinePointController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwLinePointController.java
new file mode 100644
index 0000000..cee630e
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwLinePointController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwLinePoint;
+import com.doumee.service.business.YwLinePointService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃")
+@RestController
+@RequestMapping("/business/ywLinePoint")
+public class YwLinePointController extends BaseController {
+
+    @Autowired
+    private YwLinePointService ywLinePointService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywlinepoint:create")
+    public ApiResponse create(@RequestBody YwLinePoint ywLinePoint) {
+        return ApiResponse.success(ywLinePointService.create(ywLinePoint));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywlinepoint:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywLinePointService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywlinepoint:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywLinePointService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywlinepoint:update")
+    public ApiResponse updateById(@RequestBody YwLinePoint ywLinePoint) {
+        ywLinePointService.updateById(ywLinePoint);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywlinepoint:query")
+    public ApiResponse<PageData<YwLinePoint>> findPage (@RequestBody PageWrap<YwLinePoint> pageWrap) {
+        return ApiResponse.success(ywLinePointService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywlinepoint:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwLinePoint> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwLinePoint.class).export(ywLinePointService.findPage(pageWrap).getRecords(), "杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywlinepoint:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywLinePointService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolLineController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolLineController.java
new file mode 100644
index 0000000..70d2fab
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolLineController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwPatrolLine;
+import com.doumee.service.business.YwPatrolLineService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃璺嚎淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywPatrolLine")
+public class YwPatrolLineController extends BaseController {
+
+    @Autowired
+    private YwPatrolLineService ywPatrolLineService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywpatrolline:create")
+    public ApiResponse create(@RequestBody YwPatrolLine ywPatrolLine) {
+        return ApiResponse.success(ywPatrolLineService.create(ywPatrolLine));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywpatrolline:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywPatrolLineService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywpatrolline:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywPatrolLineService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywpatrolline:update")
+    public ApiResponse updateById(@RequestBody YwPatrolLine ywPatrolLine) {
+        ywPatrolLineService.updateById(ywPatrolLine);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywpatrolline:query")
+    public ApiResponse<PageData<YwPatrolLine>> findPage (@RequestBody PageWrap<YwPatrolLine> pageWrap) {
+        return ApiResponse.success(ywPatrolLineService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywpatrolline:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolLine> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwPatrolLine.class).export(ywPatrolLineService.findPage(pageWrap).getRecords(), "杩愮淮宸℃璺嚎淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywpatrolline:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywPatrolLineService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolPointController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolPointController.java
new file mode 100644
index 0000000..baac6d0
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolPointController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwPatrolPoint;
+import com.doumee.service.business.YwPatrolPointService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃鐐逛俊鎭〃")
+@RestController
+@RequestMapping("/business/ywPatrolPoint")
+public class YwPatrolPointController extends BaseController {
+
+    @Autowired
+    private YwPatrolPointService ywPatrolPointService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywpatrolpoint:create")
+    public ApiResponse create(@RequestBody YwPatrolPoint ywPatrolPoint) {
+        return ApiResponse.success(ywPatrolPointService.create(ywPatrolPoint));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywpatrolpoint:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywPatrolPointService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywpatrolpoint:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywPatrolPointService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywpatrolpoint:update")
+    public ApiResponse updateById(@RequestBody YwPatrolPoint ywPatrolPoint) {
+        ywPatrolPointService.updateById(ywPatrolPoint);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywpatrolpoint:query")
+    public ApiResponse<PageData<YwPatrolPoint>> findPage (@RequestBody PageWrap<YwPatrolPoint> pageWrap) {
+        return ApiResponse.success(ywPatrolPointService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywpatrolpoint:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolPoint> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwPatrolPoint.class).export(ywPatrolPointService.findPage(pageWrap).getRecords(), "杩愮淮宸℃鐐逛俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywpatrolpoint:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywPatrolPointService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolSchemeController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolSchemeController.java
new file mode 100644
index 0000000..840efbc
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolSchemeController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwPatrolScheme;
+import com.doumee.service.business.YwPatrolSchemeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃璁″垝淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywPatrolScheme")
+public class YwPatrolSchemeController extends BaseController {
+
+    @Autowired
+    private YwPatrolSchemeService ywPatrolSchemeService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywpatrolscheme:create")
+    public ApiResponse create(@RequestBody YwPatrolScheme ywPatrolScheme) {
+        return ApiResponse.success(ywPatrolSchemeService.create(ywPatrolScheme));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywpatrolscheme:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywPatrolSchemeService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywpatrolscheme:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywPatrolSchemeService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywpatrolscheme:update")
+    public ApiResponse updateById(@RequestBody YwPatrolScheme ywPatrolScheme) {
+        ywPatrolSchemeService.updateById(ywPatrolScheme);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywpatrolscheme:query")
+    public ApiResponse<PageData<YwPatrolScheme>> findPage (@RequestBody PageWrap<YwPatrolScheme> pageWrap) {
+        return ApiResponse.success(ywPatrolSchemeService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywpatrolscheme:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolScheme> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwPatrolScheme.class).export(ywPatrolSchemeService.findPage(pageWrap).getRecords(), "杩愮淮宸℃璁″垝淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywpatrolscheme:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywPatrolSchemeService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolTaskController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolTaskController.java
new file mode 100644
index 0000000..527978f
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwPatrolTaskController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwPatrolTask;
+import com.doumee.service.business.YwPatrolTaskService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃浠诲姟淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywPatrolTask")
+public class YwPatrolTaskController extends BaseController {
+
+    @Autowired
+    private YwPatrolTaskService ywPatrolTaskService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywpatroltask:create")
+    public ApiResponse create(@RequestBody YwPatrolTask ywPatrolTask) {
+        return ApiResponse.success(ywPatrolTaskService.create(ywPatrolTask));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywpatroltask:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywPatrolTaskService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywpatroltask:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywPatrolTaskService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywpatroltask:update")
+    public ApiResponse updateById(@RequestBody YwPatrolTask ywPatrolTask) {
+        ywPatrolTaskService.updateById(ywPatrolTask);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywpatroltask:query")
+    public ApiResponse<PageData<YwPatrolTask>> findPage (@RequestBody PageWrap<YwPatrolTask> pageWrap) {
+        return ApiResponse.success(ywPatrolTaskService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywpatroltask:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolTask> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwPatrolTask.class).export(ywPatrolTaskService.findPage(pageWrap).getRecords(), "杩愮淮宸℃浠诲姟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywpatroltask:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywPatrolTaskService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwProjectController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwProjectController.java
new file mode 100644
index 0000000..08065a9
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwProjectController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwProject;
+import com.doumee.service.business.YwProjectService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮椤圭洰淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywProject")
+public class YwProjectController extends BaseController {
+
+    @Autowired
+    private YwProjectService ywProjectService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywproject:create")
+    public ApiResponse create(@RequestBody YwProject ywProject) {
+        return ApiResponse.success(ywProjectService.create(ywProject));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywproject:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywProjectService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywproject:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywProjectService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywproject:update")
+    public ApiResponse updateById(@RequestBody YwProject ywProject) {
+        ywProjectService.updateById(ywProject);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywproject:query")
+    public ApiResponse<PageData<YwProject>> findPage (@RequestBody PageWrap<YwProject> pageWrap) {
+        return ApiResponse.success(ywProjectService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywproject:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwProject> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwProject.class).export(ywProjectService.findPage(pageWrap).getRecords(), "杩愮淮椤圭洰淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywproject:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywProjectService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwRoomController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwRoomController.java
new file mode 100644
index 0000000..d37d721
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwRoomController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwRoom;
+import com.doumee.service.business.YwRoomService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鎴挎簮淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywRoom")
+public class YwRoomController extends BaseController {
+
+    @Autowired
+    private YwRoomService ywRoomService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywroom:create")
+    public ApiResponse create(@RequestBody YwRoom ywRoom) {
+        return ApiResponse.success(ywRoomService.create(ywRoom));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywroom:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywRoomService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywroom:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywRoomService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywroom:update")
+    public ApiResponse updateById(@RequestBody YwRoom ywRoom) {
+        ywRoomService.updateById(ywRoom);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywroom:query")
+    public ApiResponse<PageData<YwRoom>> findPage (@RequestBody PageWrap<YwRoom> pageWrap) {
+        return ApiResponse.success(ywRoomService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywroom:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwRoom> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwRoom.class).export(ywRoomService.findPage(pageWrap).getRecords(), "杩愮淮鎴挎簮淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywroom:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywRoomService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwWorkorderController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwWorkorderController.java
new file mode 100644
index 0000000..3d41613
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/YwWorkorderController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+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.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwWorkorder;
+import com.doumee.service.business.YwWorkorderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸ュ崟淇℃伅琛�")
+@RestController
+@RequestMapping("/business/ywWorkorder")
+public class YwWorkorderController extends BaseController {
+
+    @Autowired
+    private YwWorkorderService ywWorkorderService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywworkorder:create")
+    public ApiResponse create(@RequestBody YwWorkorder ywWorkorder) {
+        return ApiResponse.success(ywWorkorderService.create(ywWorkorder));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywworkorder:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywWorkorderService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywworkorder:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywWorkorderService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywworkorder:update")
+    public ApiResponse updateById(@RequestBody YwWorkorder ywWorkorder) {
+        ywWorkorderService.updateById(ywWorkorder);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywworkorder:query")
+    public ApiResponse<PageData<YwWorkorder>> findPage (@RequestBody PageWrap<YwWorkorder> pageWrap) {
+        return ApiResponse.success(ywWorkorderService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywworkorder:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwWorkorder> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwWorkorder.class).export(ywWorkorderService.findPage(pageWrap).getRecords(), "杩愮淮宸ュ崟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywworkorder:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywWorkorderService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwBuildingCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwBuildingCloudController.java
new file mode 100644
index 0000000..1a2b580
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwBuildingCloudController.java
@@ -0,0 +1,91 @@
+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.YwBuilding;
+import com.doumee.service.business.YwBuildingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮妤煎畤淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywBuilding")
+public class YwBuildingCloudController extends BaseController {
+
+    @Autowired
+    private YwBuildingService ywBuildingService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywbuilding:create")
+    public ApiResponse create(@RequestBody YwBuilding ywBuilding,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywBuildingService.create(ywBuilding));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywbuilding:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywBuildingService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywbuilding: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));
+        }
+        ywBuildingService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywbuilding:update")
+    public ApiResponse updateById(@RequestBody YwBuilding ywBuilding,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywBuildingService.updateById(ywBuilding);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywbuilding:query")
+    public ApiResponse<PageData<YwBuilding>> findPage (@RequestBody PageWrap<YwBuilding> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywBuildingService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywbuilding:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwBuilding> pageWrap, HttpServletResponse response ,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwBuilding.class).export(ywBuildingService.findPage(pageWrap).getRecords(), "杩愮淮妤煎畤淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywbuilding:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywBuildingService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java
new file mode 100644
index 0000000..3fd42c7
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java
@@ -0,0 +1,91 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+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.YwContractBill;
+import com.doumee.service.business.YwContractBillService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓璐﹀崟淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywContractBill")
+public class YwContractBillCloudController extends BaseController {
+
+    @Autowired
+    private YwContractBillService ywContractBillService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywcontractbill:create")
+    public ApiResponse create(@RequestBody YwContractBill ywContractBill,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractBillService.create(ywContractBill));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywcontractbill:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractBillService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywcontractbill: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));
+        }
+        ywContractBillService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywcontractbill:update")
+    public ApiResponse updateById(@RequestBody YwContractBill ywContractBill,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractBillService.updateById(ywContractBill);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywcontractbill:query")
+    public ApiResponse<PageData<YwContractBill>> findPage (@RequestBody PageWrap<YwContractBill> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractBillService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywcontractbill:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContractBill> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwContractBill.class).export(ywContractBillService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓璐﹀崟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywcontractbill:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractBillService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
new file mode 100644
index 0000000..8241636
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
@@ -0,0 +1,92 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+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.YwContract;
+import com.doumee.service.business.YwContractService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywContract")
+public class YwContractCloudController extends BaseController {
+
+    @Autowired
+    private YwContractService ywContractService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywcontract:create")
+    public ApiResponse create(@RequestBody YwContract ywContract,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractService.create(ywContract));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywcontract:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywcontract: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));
+        }
+        ywContractService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywcontract:update")
+    public ApiResponse updateById(@RequestBody YwContract ywContract,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractService.updateById(ywContract);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywcontract:query")
+    public ApiResponse<PageData<YwContract>> findPage (@RequestBody PageWrap<YwContract> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywcontract:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContract> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwContract.class).export(ywContractService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywcontract:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractDetailCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractDetailCloudController.java
new file mode 100644
index 0000000..1710689
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractDetailCloudController.java
@@ -0,0 +1,91 @@
+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.YwContractDetail;
+import com.doumee.service.business.YwContractDetailService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓鏉℃淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywContractDetail")
+public class YwContractDetailCloudController extends BaseController {
+
+    @Autowired
+    private YwContractDetailService ywContractDetailService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywcontractdetail:create")
+    public ApiResponse create(@RequestBody YwContractDetail ywContractDetail,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractDetailService.create(ywContractDetail));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywcontractdetail:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractDetailService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywcontractdetail: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));
+        }
+        ywContractDetailService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywcontractdetail:update")
+    public ApiResponse updateById(@RequestBody YwContractDetail ywContractDetail,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractDetailService.updateById(ywContractDetail);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywcontractdetail:query")
+    public ApiResponse<PageData<YwContractDetail>> findPage (@RequestBody PageWrap<YwContractDetail> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractDetailService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywcontractdetail:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContractDetail> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwContractDetail.class).export(ywContractDetailService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓鏉℃淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywcontractdetail:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractDetailService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java
new file mode 100644
index 0000000..567c836
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java
@@ -0,0 +1,91 @@
+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.YwContractRoom;
+import com.doumee.service.business.YwContractRoomService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywContractRoom")
+public class YwContractRoomCloudController extends BaseController {
+
+    @Autowired
+    private YwContractRoomService ywContractRoomService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywcontractroom:create")
+    public ApiResponse create(@RequestBody YwContractRoom ywContractRoom,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractRoomService.create(ywContractRoom));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywcontractroom:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractRoomService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywcontractroom: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));
+        }
+        ywContractRoomService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywcontractroom:update")
+    public ApiResponse updateById(@RequestBody YwContractRoom ywContractRoom,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContractRoomService.updateById(ywContractRoom);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywcontractroom:query")
+    public ApiResponse<PageData<YwContractRoom>> findPage (@RequestBody PageWrap<YwContractRoom> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractRoomService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywcontractroom:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwContractRoom> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwContractRoom.class).export(ywContractRoomService.findPage(pageWrap).getRecords(), "杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywcontractroom:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractRoomService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwCustomerCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwCustomerCloudController.java
new file mode 100644
index 0000000..1560f42
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwCustomerCloudController.java
@@ -0,0 +1,91 @@
+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.YwCustomer;
+import com.doumee.service.business.YwCustomerService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮瀹㈡埛淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywCustomer")
+public class YwCustomerCloudController extends BaseController {
+
+    @Autowired
+    private YwCustomerService ywCustomerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywcustomer:create")
+    public ApiResponse create(@RequestBody YwCustomer ywCustomer,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywCustomerService.create(ywCustomer));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywcustomer:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywCustomerService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywcustomer: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));
+        }
+        ywCustomerService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywcustomer:update")
+    public ApiResponse updateById(@RequestBody YwCustomer ywCustomer,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywCustomerService.updateById(ywCustomer);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywcustomer:query")
+    public ApiResponse<PageData<YwCustomer>> findPage (@RequestBody PageWrap<YwCustomer> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywCustomerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywcustomer:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwCustomer> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwCustomer.class).export(ywCustomerService.findPage(pageWrap).getRecords(), "杩愮淮瀹㈡埛淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywcustomer:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywCustomerService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java
new file mode 100644
index 0000000..a181393
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java
@@ -0,0 +1,91 @@
+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.YwDevice;
+import com.doumee.service.business.YwDeviceService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮璁惧淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywDevice")
+public class YwDeviceCloudController extends BaseController {
+
+    @Autowired
+    private YwDeviceService ywDeviceService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywdevice:create")
+    public ApiResponse create(@RequestBody YwDevice ywDevice,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceService.create(ywDevice));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywdevice:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywDeviceService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywdevice: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));
+        }
+        ywDeviceService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywdevice:update")
+    public ApiResponse updateById(@RequestBody YwDevice ywDevice,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywDeviceService.updateById(ywDevice);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywdevice:query")
+    public ApiResponse<PageData<YwDevice>> findPage (@RequestBody PageWrap<YwDevice> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywdevice:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwDevice> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwDevice.class).export(ywDeviceService.findPage(pageWrap).getRecords(), "杩愮淮璁惧淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywdevice:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceRecordCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceRecordCloudController.java
new file mode 100644
index 0000000..534bbcc
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceRecordCloudController.java
@@ -0,0 +1,91 @@
+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.YwDeviceRecord;
+import com.doumee.service.business.YwDeviceRecordService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮璁惧杩愮淮璁板綍琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywDeviceRecord")
+public class YwDeviceRecordCloudController extends BaseController {
+
+    @Autowired
+    private YwDeviceRecordService ywDeviceRecordService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywdevicerecord:create")
+    public ApiResponse create(@RequestBody YwDeviceRecord ywDeviceRecord,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceRecordService.create(ywDeviceRecord));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywdevicerecord:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywDeviceRecordService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywdevicerecord: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));
+        }
+        ywDeviceRecordService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywdevicerecord:update")
+    public ApiResponse updateById(@RequestBody YwDeviceRecord ywDeviceRecord,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywDeviceRecordService.updateById(ywDeviceRecord);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywdevicerecord:query")
+    public ApiResponse<PageData<YwDeviceRecord>> findPage (@RequestBody PageWrap<YwDeviceRecord> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceRecordService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywdevicerecord:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwDeviceRecord> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwDeviceRecord.class).export(ywDeviceRecordService.findPage(pageWrap).getRecords(), "杩愮淮璁惧杩愮淮璁板綍琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywdevicerecord:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceRecordService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwLinePointCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwLinePointCloudController.java
new file mode 100644
index 0000000..1602087
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwLinePointCloudController.java
@@ -0,0 +1,91 @@
+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.YwLinePoint;
+import com.doumee.service.business.YwLinePointService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywLinePoint")
+public class YwLinePointCloudController extends BaseController {
+
+    @Autowired
+    private YwLinePointService ywLinePointService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywlinepoint:create")
+    public ApiResponse create(@RequestBody YwLinePoint ywLinePoint,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywLinePointService.create(ywLinePoint));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywlinepoint:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywLinePointService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywlinepoint: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));
+        }
+        ywLinePointService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywlinepoint:update")
+    public ApiResponse updateById(@RequestBody YwLinePoint ywLinePoint,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywLinePointService.updateById(ywLinePoint);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywlinepoint:query")
+    public ApiResponse<PageData<YwLinePoint>> findPage (@RequestBody PageWrap<YwLinePoint> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywLinePointService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywlinepoint:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwLinePoint> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwLinePoint.class).export(ywLinePointService.findPage(pageWrap).getRecords(), "杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywlinepoint:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywLinePointService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolLineCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolLineCloudController.java
new file mode 100644
index 0000000..c8a6782
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolLineCloudController.java
@@ -0,0 +1,91 @@
+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.YwPatrolLine;
+import com.doumee.service.business.YwPatrolLineService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃璺嚎淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywPatrolLine")
+public class YwPatrolLineCloudController extends BaseController {
+
+    @Autowired
+    private YwPatrolLineService ywPatrolLineService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywpatrolline:create")
+    public ApiResponse create(@RequestBody YwPatrolLine ywPatrolLine,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolLineService.create(ywPatrolLine));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywpatrolline:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolLineService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywpatrolline: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));
+        }
+        ywPatrolLineService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywpatrolline:update")
+    public ApiResponse updateById(@RequestBody YwPatrolLine ywPatrolLine,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolLineService.updateById(ywPatrolLine);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywpatrolline:query")
+    public ApiResponse<PageData<YwPatrolLine>> findPage (@RequestBody PageWrap<YwPatrolLine> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolLineService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywpatrolline:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolLine> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwPatrolLine.class).export(ywPatrolLineService.findPage(pageWrap).getRecords(), "杩愮淮宸℃璺嚎淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywpatrolline:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolLineService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java
new file mode 100644
index 0000000..60f0d75
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java
@@ -0,0 +1,91 @@
+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.YwPatrolPoint;
+import com.doumee.service.business.YwPatrolPointService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃鐐逛俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywPatrolPoint")
+public class YwPatrolPointCloudController extends BaseController {
+
+    @Autowired
+    private YwPatrolPointService ywPatrolPointService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywpatrolpoint:create")
+    public ApiResponse create(@RequestBody YwPatrolPoint ywPatrolPoint,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolPointService.create(ywPatrolPoint));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywpatrolpoint:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolPointService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywpatrolpoint: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));
+        }
+        ywPatrolPointService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywpatrolpoint:update")
+    public ApiResponse updateById(@RequestBody YwPatrolPoint ywPatrolPoint,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolPointService.updateById(ywPatrolPoint);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywpatrolpoint:query")
+    public ApiResponse<PageData<YwPatrolPoint>> findPage (@RequestBody PageWrap<YwPatrolPoint> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolPointService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywpatrolpoint:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolPoint> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwPatrolPoint.class).export(ywPatrolPointService.findPage(pageWrap).getRecords(), "杩愮淮宸℃鐐逛俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywpatrolpoint:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolPointService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java
new file mode 100644
index 0000000..b5a7718
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java
@@ -0,0 +1,91 @@
+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.YwPatrolScheme;
+import com.doumee.service.business.YwPatrolSchemeService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃璁″垝淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywPatrolScheme")
+public class YwPatrolSchemeCloudController extends BaseController {
+
+    @Autowired
+    private YwPatrolSchemeService ywPatrolSchemeService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywpatrolscheme:create")
+    public ApiResponse create(@RequestBody YwPatrolScheme ywPatrolScheme,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolSchemeService.create(ywPatrolScheme));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywpatrolscheme:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolSchemeService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywpatrolscheme: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));
+        }
+        ywPatrolSchemeService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywpatrolscheme:update")
+    public ApiResponse updateById(@RequestBody YwPatrolScheme ywPatrolScheme,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolSchemeService.updateById(ywPatrolScheme);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywpatrolscheme:query")
+    public ApiResponse<PageData<YwPatrolScheme>> findPage (@RequestBody PageWrap<YwPatrolScheme> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolSchemeService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywpatrolscheme:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolScheme> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwPatrolScheme.class).export(ywPatrolSchemeService.findPage(pageWrap).getRecords(), "杩愮淮宸℃璁″垝淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywpatrolscheme:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolSchemeService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskCloudController.java
new file mode 100644
index 0000000..e764b46
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskCloudController.java
@@ -0,0 +1,91 @@
+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.YwPatrolTask;
+import com.doumee.service.business.YwPatrolTaskService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸℃浠诲姟淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywPatrolTask")
+public class YwPatrolTaskCloudController extends BaseController {
+
+    @Autowired
+    private YwPatrolTaskService ywPatrolTaskService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywpatroltask:create")
+    public ApiResponse create(@RequestBody YwPatrolTask ywPatrolTask,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolTaskService.create(ywPatrolTask));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywpatroltask:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolTaskService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywpatroltask: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));
+        }
+        ywPatrolTaskService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywpatroltask:update")
+    public ApiResponse updateById(@RequestBody YwPatrolTask ywPatrolTask,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolTaskService.updateById(ywPatrolTask);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywpatroltask:query")
+    public ApiResponse<PageData<YwPatrolTask>> findPage (@RequestBody PageWrap<YwPatrolTask> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolTaskService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywpatroltask:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwPatrolTask> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwPatrolTask.class).export(ywPatrolTaskService.findPage(pageWrap).getRecords(), "杩愮淮宸℃浠诲姟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywpatroltask:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywPatrolTaskService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
new file mode 100644
index 0000000..82f0eb9
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
@@ -0,0 +1,91 @@
+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.YwProject;
+import com.doumee.service.business.YwProjectService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮椤圭洰淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywProject")
+public class YwProjectCloudController extends BaseController {
+
+    @Autowired
+    private YwProjectService ywProjectService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywproject:create")
+    public ApiResponse create(@RequestBody YwProject ywProject,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywProjectService.create(ywProject));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywproject:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywProjectService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywproject: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));
+        }
+        ywProjectService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywproject:update")
+    public ApiResponse updateById(@RequestBody YwProject ywProject,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywProjectService.updateById(ywProject);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywproject:query")
+    public ApiResponse<PageData<YwProject>> findPage (@RequestBody PageWrap<YwProject> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywProjectService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywproject:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwProject> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwProject.class).export(ywProjectService.findPage(pageWrap).getRecords(), "杩愮淮椤圭洰淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywproject:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywProjectService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java
new file mode 100644
index 0000000..7da4aaf
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java
@@ -0,0 +1,91 @@
+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.YwRoom;
+import com.doumee.service.business.YwRoomService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮鎴挎簮淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywRoom")
+public class YwRoomCloudController extends BaseController {
+
+    @Autowired
+    private YwRoomService ywRoomService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywroom:create")
+    public ApiResponse create(@RequestBody YwRoom ywRoom,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywRoomService.create(ywRoom));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywroom:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywRoomService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywroom: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));
+        }
+        ywRoomService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywroom:update")
+    public ApiResponse updateById(@RequestBody YwRoom ywRoom,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywRoomService.updateById(ywRoom);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywroom:query")
+    public ApiResponse<PageData<YwRoom>> findPage (@RequestBody PageWrap<YwRoom> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywRoomService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywroom:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwRoom> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwRoom.class).export(ywRoomService.findPage(pageWrap).getRecords(), "杩愮淮鎴挎簮淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywroom:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywRoomService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java
new file mode 100644
index 0000000..e7c0fb6
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java
@@ -0,0 +1,91 @@
+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.YwWorkorder;
+import com.doumee.service.business.YwWorkorderService;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Api(tags = "杩愮淮宸ュ崟淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywWorkorder")
+public class YwWorkorderCloudController extends BaseController {
+
+    @Autowired
+    private YwWorkorderService ywWorkorderService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:ywworkorder:create")
+    public ApiResponse create(@RequestBody YwWorkorder ywWorkorder,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywWorkorderService.create(ywWorkorder));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:ywworkorder:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywWorkorderService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:ywworkorder: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));
+        }
+        ywWorkorderService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:ywworkorder:update")
+    public ApiResponse updateById(@RequestBody YwWorkorder ywWorkorder,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywWorkorderService.updateById(ywWorkorder);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:ywworkorder:query")
+    public ApiResponse<PageData<YwWorkorder>> findPage (@RequestBody PageWrap<YwWorkorder> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywWorkorderService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:ywworkorder:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwWorkorder> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(YwWorkorder.class).export(ywWorkorderService.findPage(pageWrap).getRecords(), "杩愮淮宸ュ崟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:ywworkorder:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywWorkorderService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwBuildingMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwBuildingMapper.java
new file mode 100644
index 0000000..a95d0e0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwBuildingMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwBuilding;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwBuildingMapper extends BaseMapper<YwBuilding> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractBillMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractBillMapper.java
new file mode 100644
index 0000000..c94e7e5
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractBillMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwContractBill;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractBillMapper extends BaseMapper<YwContractBill> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractDetailMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractDetailMapper.java
new file mode 100644
index 0000000..1511dc9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractDetailMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwContractDetail;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractDetailMapper extends BaseMapper<YwContractDetail> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractMapper.java
new file mode 100644
index 0000000..8bf798a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwContract;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractMapper extends BaseMapper<YwContract> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractRoomMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractRoomMapper.java
new file mode 100644
index 0000000..b1c767f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractRoomMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwContractRoom;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractRoomMapper extends BaseMapper<YwContractRoom> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwCustomerMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwCustomerMapper.java
new file mode 100644
index 0000000..53eb1e4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwCustomerMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwCustomer;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwCustomerMapper extends BaseMapper<YwCustomer> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceMapper.java
new file mode 100644
index 0000000..80dab10
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwDevice;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwDeviceMapper extends BaseMapper<YwDevice> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceRecordMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceRecordMapper.java
new file mode 100644
index 0000000..1d81018
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwDeviceRecordMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwDeviceRecord;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwDeviceRecordMapper extends BaseMapper<YwDeviceRecord> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwLinePointMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwLinePointMapper.java
new file mode 100644
index 0000000..f251c2b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwLinePointMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwLinePoint;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwLinePointMapper extends BaseMapper<YwLinePoint> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolLineMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolLineMapper.java
new file mode 100644
index 0000000..bc9fe0d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolLineMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwPatrolLine;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolLineMapper extends BaseMapper<YwPatrolLine> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolPointMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolPointMapper.java
new file mode 100644
index 0000000..f726c8e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolPointMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwPatrolPoint;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolPointMapper extends BaseMapper<YwPatrolPoint> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolSchemeMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolSchemeMapper.java
new file mode 100644
index 0000000..8f80eff
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolSchemeMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwPatrolScheme;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolSchemeMapper extends BaseMapper<YwPatrolScheme> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolTaskMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolTaskMapper.java
new file mode 100644
index 0000000..688b3b8
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwPatrolTaskMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwPatrolTask;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolTaskMapper extends BaseMapper<YwPatrolTask> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProjectMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProjectMapper.java
new file mode 100644
index 0000000..051a985
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProjectMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwProject;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwProjectMapper extends BaseMapper<YwProject> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwRoomMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwRoomMapper.java
new file mode 100644
index 0000000..954e93e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwRoomMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwRoom;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwRoomMapper extends BaseMapper<YwRoom> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWorkorderMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWorkorderMapper.java
new file mode 100644
index 0000000..6c558e2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwWorkorderMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwWorkorder;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwWorkorderMapper extends BaseMapper<YwWorkorder> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
new file mode 100644
index 0000000..4cbf1f9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
@@ -0,0 +1,103 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮妤煎畤淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮妤煎畤淇℃伅琛�")
+@TableName("`yw_building`")
+public class YwBuilding {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @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 = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍥炬爣")
+    @ExcelColumn(name="鍥炬爣")
+    private String imgurl;
+
+    @ApiModelProperty(value = "缂栧彿")
+    @ExcelColumn(name="缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "鍦板潃")
+    @ExcelColumn(name="鍦板潃")
+    private String addr;
+
+    @ApiModelProperty(value = "闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @ExcelColumn(name="闈㈢Н锛堝钩鏂圭背锛�")
+    private BigDecimal area;
+
+    @ApiModelProperty(value = "浜ф潈闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @ExcelColumn(name="浜ф潈闈㈢Н锛堝钩鏂圭背锛�")
+    private BigDecimal cqArea;
+
+    @ApiModelProperty(value = "鍙闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @ExcelColumn(name="鍙闈㈢Н锛堝钩鏂圭背锛�")
+    private BigDecimal rentArea;
+
+    @ApiModelProperty(value = "鍦颁笂灞傛暟", example = "1")
+    @ExcelColumn(name="鍦颁笂灞傛暟")
+    private Integer onFloor;
+
+    @ApiModelProperty(value = "鍦颁笅灞傛暟", example = "1")
+    @ExcelColumn(name="鍦颁笅灞傛暟")
+    private Integer underFloor;
+
+    @ApiModelProperty(value = "鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)", example = "1")
+    @ExcelColumn(name="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)")
+    private Integer projectId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
new file mode 100644
index 0000000..023a517
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
@@ -0,0 +1,150 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮鍚堝悓淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮鍚堝悓淇℃伅琛�")
+@TableName("`yw_contract`")
+public class YwContract {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1鎹熷潖 2鎶ュ簾", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父 1鎹熷潖 2鎶ュ簾")
+    private Integer status;
+
+    @ApiModelProperty(value = "绫诲瀷 0鐗╀笟绉熻祦 1鐗╀笟 2绉熻祦", example = "1")
+    @ExcelColumn(name="绫诲瀷 0鐗╀笟绉熻祦 1鐗╀笟 2绉熻祦")
+    private Integer type;
+
+    @ApiModelProperty(value = "缂栧彿", example = "1")
+    @ExcelColumn(name="缂栧彿")
+    private Integer code;
+
+    @ApiModelProperty(value = "缁忓姙浜虹紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="缁忓姙浜虹紪鐮�(鍏宠仈system_user)")
+    private Integer userId;
+
+    @ApiModelProperty(value = "绛捐鏃ユ湡")
+    @ExcelColumn(name="绛捐鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date signDate;
+
+    @ApiModelProperty(value = "寮�濮嬫棩鏈�")
+    @ExcelColumn(name="寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃ユ湡")
+    @ExcelColumn(name="缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+
+    @ApiModelProperty(value = "椤圭洰缂栫爜锛堝叧鑱攜w_project)", example = "1")
+    @ExcelColumn(name="椤圭洰缂栫爜锛堝叧鑱攜w_project)")
+    private Integer projectId;
+
+    @ApiModelProperty(value = "缁撴灉鏄惁鍙栨暣 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="缁撴灉鏄惁鍙栨暣 0鍚� 1鏄�")
+    private Integer roundedUp;
+
+    @ApiModelProperty(value = "鎵�灞炲叕鍙哥紪鐮�(鍏宠仈company)", example = "1")
+    @ExcelColumn(name="鎵�灞炲叕鍙哥紪鐮�(鍏宠仈company)")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "绉熷缂栫爜(鍏宠仈yw_customer锛�", example = "1")
+    @ExcelColumn(name="绉熷缂栫爜(鍏宠仈yw_customer锛�")
+    private Integer renterId;
+
+    @ApiModelProperty(value = "鑱旂郴浜虹紪鐮侊紙鍏宠仈memebr)", example = "1")
+    @ExcelColumn(name="鑱旂郴浜虹紪鐮侊紙鍏宠仈memebr)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "绉熻祦鏉℃鎶奸噾锛堝厓锛�", example = "1")
+    @ExcelColumn(name="绉熻祦鏉℃鎶奸噾锛堝厓锛�")
+    private BigDecimal zlDeposit;
+
+    @ApiModelProperty(value = "绉熻祦鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�", example = "1")
+    @ExcelColumn(name="绉熻祦鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�")
+    private Integer zlPayType;
+
+    @ApiModelProperty(value = "绉熻祦鍏嶇鏈熷紑濮嬫棩鏈�")
+    @ExcelColumn(name="绉熻祦鍏嶇鏈熷紑濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date zlFreeStartDate;
+
+    @ApiModelProperty(value = "绉熻祦鍏嶇鏈熺粨鏉熸棩鏈�")
+    @ExcelColumn(name="绉熻祦鍏嶇鏈熺粨鏉熸棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date zlFreeEndDate;
+
+    @ApiModelProperty(value = "鐗╀笟鎶奸噾锛堝厓锛�", example = "1")
+    @ExcelColumn(name="鐗╀笟鎶奸噾锛堝厓锛�")
+    private BigDecimal wyDeposit;
+
+    @ApiModelProperty(value = "鐗╀笟鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�", example = "1")
+    @ExcelColumn(name="鐗╀笟鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�")
+    private Integer wyPayType;
+
+    @ApiModelProperty(value = "鐗╀笟鍏嶇鏈熷紑濮嬫棩鏈�")
+    @ExcelColumn(name="鐗╀笟鍏嶇鏈熷紑濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date wyFreeStartDate;
+
+    @ApiModelProperty(value = "鐗╀笟鍏嶇鏈熺粨鏉熸棩鏈�")
+    @ExcelColumn(name="鐗╀笟鍏嶇鏈熺粨鏉熸棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date wyFreeEndDate;
+
+    @ApiModelProperty(value = "绉熻祦鎬婚噾棰�", example = "1")
+    @ExcelColumn(name="绉熻祦鎬婚噾棰�")
+    private BigDecimal zlTotalFee;
+
+    @ApiModelProperty(value = "鐗╀笟璐规�婚噾棰�", example = "1")
+    @ExcelColumn(name="鐗╀笟璐规�婚噾棰�")
+    private BigDecimal wyTotalFee;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
new file mode 100644
index 0000000..2804666
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
@@ -0,0 +1,85 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮鍚堝悓璐﹀崟淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮鍚堝悓璐﹀崟淇℃伅琛�")
+@TableName("`yw_contract_bill`")
+public class YwContractBill {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈紑濮嬶紱1杩涜涓紱2宸插畬鎴愶紱", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈紑濮嬶紱1杩涜涓紱2宸插畬鎴愶紱")
+    private Integer status;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @ExcelColumn(name="寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @ExcelColumn(name="缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+
+    @ApiModelProperty(value = "鍚堝悓鏉℃缂栫爜锛堝叧鑱攜w_contract_detail)", example = "1")
+    @ExcelColumn(name="鍚堝悓鏉℃缂栫爜锛堝叧鑱攜w_contract_detail)")
+    private Integer detailId;
+
+    @ApiModelProperty(value = "鍚堝悓缂栫爜锛堝叧鑱攜w_contract)", example = "1")
+    @ExcelColumn(name="鍚堝悓缂栫爜锛堝叧鑱攜w_contract)")
+    private Integer contractId;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鎬婚噾棰�", example = "1")
+    @ExcelColumn(name="鎬婚噾棰�")
+    private BigDecimal totleFee;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractDetail.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractDetail.java
new file mode 100644
index 0000000..ceb3411
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractDetail.java
@@ -0,0 +1,93 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮鍚堝悓鏉℃淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮鍚堝悓鏉℃淇℃伅琛�")
+@TableName("`yw_contract_detail`")
+public class YwContractDetail {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈紑濮� 1杩涜涓� 2宸查��璁� 3宸插畬鎴�", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈紑濮� 1杩涜涓� 2宸查��璁� 3宸插畬鎴�")
+    private Integer status;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @ExcelColumn(name="寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @ExcelColumn(name="缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+
+    @ApiModelProperty(value = "鍚堝悓鍗曚环锛堝厓锛�", example = "1")
+    @ExcelColumn(name="鍚堝悓鍗曚环锛堝厓锛�")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "浠樻鍛ㄦ湡绫诲瀷 0=鍏冩瘡骞崇背澶╋紱1=鍏冩瘡骞崇背鏈堬紱2=鍏冩瘡骞崇背骞达紱3=鍏冩瘡澶╋紱4=鍏冩瘡鏈堬紱5=鍏冩瘡骞达紱6=鍏冩瘡鍦猴紱", example = "1")
+    @ExcelColumn(name="浠樻鍛ㄦ湡绫诲瀷 0=鍏冩瘡骞崇背澶╋紱1=鍏冩瘡骞崇背鏈堬紱2=鍏冩瘡骞崇背骞达紱3=鍏冩瘡澶╋紱4=鍏冩瘡鏈堬紱5=鍏冩瘡骞达紱6=鍏冩瘡鍦猴紱")
+    private Integer circleType;
+
+    @ApiModelProperty(value = "浠樻鎻愬墠澶╂暟", example = "1")
+    @ExcelColumn(name="浠樻鎻愬墠澶╂暟")
+    private Integer advanceDays;
+
+    @ApiModelProperty(value = "鍚堝悓缂栫爜锛堝叧鑱攜w_contract)", example = "1")
+    @ExcelColumn(name="鍚堝悓缂栫爜锛堝叧鑱攜w_contract)")
+    private Integer contractId;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鎬婚噾棰�", example = "1")
+    @ExcelColumn(name="鎬婚噾棰�")
+    private BigDecimal totleFee;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRoom.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRoom.java
new file mode 100644
index 0000000..f83b8b8
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRoom.java
@@ -0,0 +1,66 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛�")
+@TableName("`yw_contract_room`")
+public class YwContractRoom {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鎴挎簮缂栫爜锛堝叧鑱攜w_room)", example = "1")
+    @ExcelColumn(name="鎴挎簮缂栫爜锛堝叧鑱攜w_room)")
+    private Integer roomId;
+
+    @ApiModelProperty(value = "鍚堝悓缂栫爜锛堝叧鑱攜w_contract)", example = "1")
+    @ExcelColumn(name="鍚堝悓缂栫爜锛堝叧鑱攜w_contract)")
+    private Integer contractId;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwCustomer.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwCustomer.java
new file mode 100644
index 0000000..2aca96e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwCustomer.java
@@ -0,0 +1,143 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮瀹㈡埛淇℃伅琛�")
+@TableName("`yw_customer`")
+public class YwCustomer {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鎵�灞炶涓氱紪鐮侊紙鍏宠仈category)", example = "1")
+    @ExcelColumn(name="鎵�灞炶涓氱紪鐮侊紙鍏宠仈category)")
+    private Integer industryId;
+
+    @ApiModelProperty(value = "绫诲瀷 0涓汉 1浼佷笟", example = "1")
+    @ExcelColumn(name="绫诲瀷 0涓汉 1浼佷笟")
+    private Integer type;
+
+    @ApiModelProperty(value = "瀹㈡埛")
+    @ExcelColumn(name="瀹㈡埛")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelColumn(name="鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "韬唤璇佸彿锛堝姞瀵嗭級")
+    @ExcelColumn(name="韬唤璇佸彿锛堝姞瀵嗭級")
+    private String idcardNo;
+
+    @ApiModelProperty(value = "璇佷欢鏄剧ず淇℃伅")
+    @ExcelColumn(name="璇佷欢鏄剧ず淇℃伅")
+    private String idcardDecode;
+
+    @ApiModelProperty(value = "瀹㈡埛缂栫爜")
+    @ExcelColumn(name="瀹㈡埛缂栫爜")
+    private String code;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "韬唤 0鑰佹澘 1瓒呯骇绠$悊鍛�", example = "1")
+    @ExcelColumn(name="韬唤 0鑰佹澘 1瓒呯骇绠$悊鍛�")
+    private Integer highCheckor;
+
+    @ApiModelProperty(value = "鏈�杩戠櫥褰曟椂闂�")
+    @ExcelColumn(name="鏈�杩戠櫥褰曟椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date lastLoginDate;
+
+    @ApiModelProperty(value = "鐧诲綍娆℃暟", example = "1")
+    @ExcelColumn(name="鐧诲綍娆℃暟")
+    private Integer loginNum;
+
+    @ApiModelProperty(value = "绯荤粺鐧诲綍鐢ㄦ埛缂栫爜(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="绯荤粺鐧诲綍鐢ㄦ埛缂栫爜(鍏宠仈system_user)")
+    private Integer userId;
+
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収", example = "1")
+    @ExcelColumn(name="璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収")
+    private Integer idcardType;
+
+    @ApiModelProperty(value = "寮�鎴烽摱琛�")
+    @ExcelColumn(name="寮�鎴烽摱琛�")
+    private String accountBank;
+
+    @ApiModelProperty(value = "璐﹀彿")
+    @ExcelColumn(name="璐﹀彿")
+    private String accountNo;
+
+    @ApiModelProperty(value = "璐︽埛鐢佃瘽")
+    @ExcelColumn(name="璐︽埛鐢佃瘽")
+    private String accountPhone;
+
+    @ApiModelProperty(value = "缁熶竴淇$敤浠g爜")
+    @ExcelColumn(name="缁熶竴淇$敤浠g爜")
+    private String creditCard;
+
+    @ApiModelProperty(value = "榛樿鍙戠エ绫诲瀷 0澧炲�肩◣鏅�氬彂绁� 1澧炲�肩◣涓撶敤鍙戠エ", example = "1")
+    @ExcelColumn(name="榛樿鍙戠エ绫诲瀷 0澧炲�肩◣鏅�氬彂绁� 1澧炲�肩◣涓撶敤鍙戠エ")
+    private Integer fpType;
+
+    @ApiModelProperty(value = "璐﹀彿娉ㄥ唽鍦板潃")
+    @ExcelColumn(name="璐﹀彿娉ㄥ唽鍦板潃")
+    private String accountAddr;
+
+    @ApiModelProperty(value = "韬唤绫诲瀷0鑰佹澘瓒呯骇绠$悊鍛�;1=浜轰簨绠$悊鍛�;2=鍛樺伐", example = "1")
+    @ExcelColumn(name="韬唤绫诲瀷0鑰佹澘瓒呯骇绠$悊鍛�;1=浜轰簨绠$悊鍛�;2=鍛樺伐")
+    private Integer identityType;
+
+    @ApiModelProperty(value = "閭")
+    @ExcelColumn(name="閭")
+    private String email;
+
+    @ApiModelProperty(value = "鑱旂郴浜虹紪鐮侊紙鍏宠仈member锛�", example = "1")
+    @ExcelColumn(name="鑱旂郴浜虹紪鐮侊紙鍏宠仈member锛�")
+    private Integer memberId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
new file mode 100644
index 0000000..4b19ee2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
@@ -0,0 +1,95 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮璁惧淇℃伅琛�")
+@TableName("`yw_device`")
+public class YwDevice {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1鎹熷潖 2鎶ュ簾", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父 1鎹熷潖 2鎶ュ簾")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "璁惧鍨嬪彿", example = "1")
+    @ExcelColumn(name="璁惧鍨嬪彿")
+    private Integer modelNo;
+
+    @ApiModelProperty(value = "鎵�灞炲垎绫荤紪鐮侊紙绠$悊category锛�", example = "1")
+    @ExcelColumn(name="鎵�灞炲垎绫荤紪鐮侊紙绠$悊category锛�")
+    private Integer cateId;
+
+    @ApiModelProperty(value = "绠$悊鍛樼紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="绠$悊鍛樼紪鐮�(鍏宠仈system_user)")
+    private Integer userId;
+
+    @ApiModelProperty(value = "渚涘簲鍟�")
+    @ExcelColumn(name="渚涘簲鍟�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date company;
+
+    @ApiModelProperty(value = "杩愮淮鍐呭")
+    @ExcelColumn(name="杩愮淮鍐呭")
+    private String content;
+
+    @ApiModelProperty(value = "缂栧彿")
+    @ExcelColumn(name="缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
+    @ExcelColumn(name="鎵�鍦ㄤ綅缃�")
+    private String addr;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java
new file mode 100644
index 0000000..4efc99c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java
@@ -0,0 +1,84 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮璁惧杩愮淮璁板綍琛�")
+@TableName("`yw_device_record`")
+public class YwDeviceRecord {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1鎹熷潖 2鎶ュ簾", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父 1鎹熷潖 2鎶ュ簾")
+    private Integer status;
+
+    @ApiModelProperty(value = "璁惧鍨嬪彿", example = "1")
+    @ExcelColumn(name="璁惧鍨嬪彿")
+    private Integer modelNo;
+
+    @ApiModelProperty(value = "璁惧绫荤紪鐮侊紙绠$悊yw_device锛�", example = "1")
+    @ExcelColumn(name="璁惧绫荤紪鐮侊紙绠$悊yw_device锛�")
+    private Integer deviceId;
+
+    @ApiModelProperty(value = "杩愮淮浜哄憳缂栫爜缂栫爜(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="杩愮淮浜哄憳缂栫爜缂栫爜(鍏宠仈system_user)")
+    private Integer userId;
+
+    @ApiModelProperty(value = "渚涘簲鍟�")
+    @ExcelColumn(name="渚涘簲鍟�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date company;
+
+    @ApiModelProperty(value = "鎯呭喌璇存槑")
+    @ExcelColumn(name="鎯呭喌璇存槑")
+    private String content;
+
+    @ApiModelProperty(value = "杩愮淮鏃堕棿")
+    @ExcelColumn(name="杩愮淮鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dealDate;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java
new file mode 100644
index 0000000..0b0a311
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java
@@ -0,0 +1,70 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃")
+@TableName("`yw_line_point`")
+public class YwLinePoint {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_line)", example = "1")
+    @ExcelColumn(name="宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_line)")
+    private Integer lineId;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_point)", example = "1")
+    @ExcelColumn(name="宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_point)")
+    private Integer pointId;
+
+    @ApiModelProperty(value = "鏄惁鎵爜鎵撳崱 0涓嶉渶瑕� 1闇�瑕�", example = "1")
+    @ExcelColumn(name="鏄惁鎵爜鎵撳崱 0涓嶉渶瑕� 1闇�瑕�")
+    private Integer needScancode;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolLine.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolLine.java
new file mode 100644
index 0000000..c598dff
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolLine.java
@@ -0,0 +1,70 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮宸℃璺嚎淇℃伅琛�")
+@TableName("`yw_patrol_line`")
+public class YwPatrolLine {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @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 = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍥炬爣")
+    @ExcelColumn(name="鍥炬爣")
+    private String imgurl;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java
new file mode 100644
index 0000000..be2e4a3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java
@@ -0,0 +1,78 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮宸℃鐐逛俊鎭〃")
+@TableName("`yw_patrol_point`")
+public class YwPatrolPoint {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @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 = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍥炬爣")
+    @ExcelColumn(name="鍥炬爣")
+    private String imgurl;
+
+    @ApiModelProperty(value = "鍖哄煙缂栫爜锛堝叧鑱攃ategory)", example = "1")
+    @ExcelColumn(name="鍖哄煙缂栫爜锛堝叧鑱攃ategory)")
+    private Integer areaId;
+
+    @ApiModelProperty(value = "鍦板潃")
+    @ExcelColumn(name="鍦板潃")
+    private String addr;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java
new file mode 100644
index 0000000..18fa64e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java
@@ -0,0 +1,117 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮宸℃璁″垝淇℃伅琛�")
+@TableName("`yw_patrol_scheme`")
+public class YwPatrolScheme {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鏍囬")
+    @ExcelColumn(name="鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_line)", example = "1")
+    @ExcelColumn(name="宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_line)")
+    private Integer lineId;
+
+    @ApiModelProperty(value = "宸℃璐熻矗浜虹紪鐮侀泦鍚堬紝澶氫釜浣跨敤鑻辨枃閫楀彿闅斿紑")
+    @ExcelColumn(name="宸℃璐熻矗浜虹紪鐮侀泦鍚堬紝澶氫釜浣跨敤鑻辨枃閫楀彿闅斿紑")
+    private String userIds;
+
+    @ApiModelProperty(value = "澶勭悊浜虹紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="澶勭悊浜虹紪鐮�(鍏宠仈system_user)")
+    private Integer dealUserId;
+
+    @ApiModelProperty(value = "澶勭悊鏃堕棿")
+    @ExcelColumn(name="澶勭悊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dealDate;
+
+    @ApiModelProperty(value = "澶勭悊澶囨敞")
+    @ExcelColumn(name="澶勭悊澶囨敞")
+    private String dealInfo;
+
+    @ApiModelProperty(value = "寰幆鍛ㄦ湡  0姣忓ぉ 1姣忓懆 2姣忓ぉ", example = "1")
+    @ExcelColumn(name="寰幆鍛ㄦ湡  0姣忓ぉ 1姣忓懆 2姣忓ぉ")
+    private Integer circleType;
+
+    @ApiModelProperty(value = "寰幆閲嶅瑙勫垯 1-31锛屽涓嫳鏂囬�楀彿闅斿紑")
+    @ExcelColumn(name="寰幆閲嶅瑙勫垯 1-31锛屽涓嫳鏂囬�楀彿闅斿紑")
+    private String circleDays;
+
+    @ApiModelProperty(value = "寮�濮嬫棩鏈�")
+    @ExcelColumn(name="寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃ユ湡")
+    @ExcelColumn(name="缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂寸偣")
+    @ExcelColumn(name="寮�濮嬫椂闂寸偣")
+    private String startTime;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿鐐�")
+    @ExcelColumn(name="缁撴潫鏃堕棿鐐�")
+    private String endTime;
+
+    @ApiModelProperty(value = "鎵ц杩涘害 0寰呭紑濮� 1杩涜涓� 2瓒呮湡 3宸插畬鎴�", example = "1")
+    @ExcelColumn(name="鎵ц杩涘害 0寰呭紑濮� 1杩涜涓� 2瓒呮湡 3宸插畬鎴�")
+    private Integer processStatus;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java
new file mode 100644
index 0000000..3e44e37
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java
@@ -0,0 +1,105 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮宸℃浠诲姟淇℃伅琛�")
+@TableName("`yw_patrol_task`")
+public class YwPatrolTask {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鏍囬")
+    @ExcelColumn(name="鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0寰呭紑濮� 1杩涜涓� 2宸茶秴鏈� 3宸插畬鎴� 4宸插彇娑�", example = "1")
+    @ExcelColumn(name="鐘舵�� 0寰呭紑濮� 1杩涜涓� 2宸茶秴鏈� 3宸插畬鎴� 4宸插彇娑�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "宸℃璁″垝缂栫爜(鍏宠仈yw_patrol_scheme)", example = "1")
+    @ExcelColumn(name="宸℃璁″垝缂栫爜(鍏宠仈yw_patrol_scheme)")
+    private Integer schemeId;
+
+    @ApiModelProperty(value = "宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_point)", example = "1")
+    @ExcelColumn(name="宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_point)")
+    private Integer pointId;
+
+    @ApiModelProperty(value = "澶勭悊浜虹紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="澶勭悊浜虹紪鐮�(鍏宠仈system_user)")
+    private Integer dealUserId;
+
+    @ApiModelProperty(value = "澶勭悊鏃堕棿")
+    @ExcelColumn(name="澶勭悊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dealDate;
+
+    @ApiModelProperty(value = "澶勭悊澶囨敞")
+    @ExcelColumn(name="澶勭悊澶囨敞")
+    private String dealInfo;
+
+    @ApiModelProperty(value = "寰幆鍛ㄦ湡  0姣忓ぉ 1姣忓懆 2姣忓ぉ", example = "1")
+    @ExcelColumn(name="寰幆鍛ㄦ湡  0姣忓ぉ 1姣忓懆 2姣忓ぉ")
+    private Integer circleType;
+
+    @ApiModelProperty(value = "寮�濮嬫棩鏈�")
+    @ExcelColumn(name="寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃ユ湡")
+    @ExcelColumn(name="缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+
+    @ApiModelProperty(value = "宸℃缁撴灉  0姝e父 1寮傚父", example = "1")
+    @ExcelColumn(name="宸℃缁撴灉  0姝e父 1寮傚父")
+    private Integer dealStatus;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java
new file mode 100644
index 0000000..1aa031e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java
@@ -0,0 +1,78 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮椤圭洰淇℃伅琛�")
+@TableName("`yw_project`")
+public class YwProject {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @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 = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍥炬爣")
+    @ExcelColumn(name="鍥炬爣")
+    private String imgurl;
+
+    @ApiModelProperty(value = "鍖哄煙缂栫爜锛坅reas)", example = "1")
+    @ExcelColumn(name="鍖哄煙缂栫爜锛坅reas)")
+    private Integer areaId;
+
+    @ApiModelProperty(value = "鍦板潃")
+    @ExcelColumn(name="鍦板潃")
+    private String addr;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java
new file mode 100644
index 0000000..2d939e7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java
@@ -0,0 +1,107 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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;
+import java.math.BigDecimal;
+
+/**
+ * 杩愮淮鎴挎簮淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮鎴挎簮淇℃伅琛�")
+@TableName("`yw_room`")
+public class YwRoom {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @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 = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍥炬爣")
+    @ExcelColumn(name="鍥炬爣")
+    private String imgurl;
+
+    @ApiModelProperty(value = "鎴块棿缂栧彿")
+    @ExcelColumn(name="鎴块棿缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "鎴垮彿")
+    @ExcelColumn(name="鎴垮彿")
+    private String roomNum;
+
+    @ApiModelProperty(value = "鏄惁鎷涘晢 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鎷涘晢 0鍚� 1鏄�")
+    private Integer isInvestment;
+
+    @ApiModelProperty(value = "寤虹瓚闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @ExcelColumn(name="寤虹瓚闈㈢Н锛堝钩鏂圭背锛�")
+    private BigDecimal area;
+
+    @ApiModelProperty(value = "璁¤垂闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @ExcelColumn(name="璁¤垂闈㈢Н锛堝钩鏂圭背锛�")
+    private BigDecimal feeArea;
+
+    @ApiModelProperty(value = "璁$闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @ExcelColumn(name="璁$闈㈢Н锛堝钩鏂圭背锛�")
+    private BigDecimal rentArea;
+
+    @ApiModelProperty(value = "妤煎眰鏁�", example = "1")
+    @ExcelColumn(name="妤煎眰鏁�")
+    private Integer floor;
+
+    @ApiModelProperty(value = "鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)", example = "1")
+    @ExcelColumn(name="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)")
+    private Integer projectId;
+
+    @ApiModelProperty(value = "鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_building)", example = "1")
+    @ExcelColumn(name="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_building)")
+    private Integer buildingId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java
new file mode 100644
index 0000000..a7c0ca8
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java
@@ -0,0 +1,146 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+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 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Data
+@ApiModel("杩愮淮宸ュ崟淇℃伅琛�")
+@TableName("`yw_workorder`")
+public class YwWorkorder {
+
+    @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")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鏍囬")
+    @ExcelColumn(name="鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鎯呭喌璇存槑")
+    @ExcelColumn(name="鎯呭喌璇存槑")
+    private String content;
+
+    @ApiModelProperty(value = "涓婇棬鏃堕棿")
+    @ExcelColumn(name="涓婇棬鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date getDate;
+
+    @ApiModelProperty(value = "鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)", example = "1")
+    @ExcelColumn(name="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)")
+    private Integer projectId;
+
+    @ApiModelProperty(value = "鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_building)", example = "1")
+    @ExcelColumn(name="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_building)")
+    private Integer buildingId;
+
+    @ApiModelProperty(value = "鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)", example = "1")
+    @ExcelColumn(name="鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)")
+    private Integer roomId;
+
+    @ApiModelProperty(value = "鎻愭姤浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鎻愭姤浜虹紪鐮�")
+    private Integer userId;
+
+    @ApiModelProperty(value = "鑱旂郴鐢佃瘽")
+    @ExcelColumn(name="鑱旂郴鐢佃瘽")
+    private String phone;
+
+    @ApiModelProperty(value = "鎻愭姤鏃堕棿")
+    @ExcelColumn(name="鎻愭姤鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date submitDate;
+
+    @ApiModelProperty(value = "宸ュ崟鍒嗙被缂栫爜(鍏宠仈category锛�", example = "1")
+    @ExcelColumn(name="宸ュ崟鍒嗙被缂栫爜(鍏宠仈category锛�")
+    private Integer cateId;
+
+    @ApiModelProperty(value = "淇濅慨鍖哄煙绫诲瀷 0瀹ゅ唴缁翠慨 1鍏叡鍖哄煙", example = "1")
+    @ExcelColumn(name="淇濅慨鍖哄煙绫诲瀷 0瀹ゅ唴缁翠慨 1鍏叡鍖哄煙")
+    private Integer areaType;
+
+    @ApiModelProperty(value = "宸ュ崟缂栧彿")
+    @ExcelColumn(name="宸ュ崟缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "澶勭悊鐘舵�� 0寰呭鐞� 1宸插垎娲� 2宸插鐞�", example = "1")
+    @ExcelColumn(name="澶勭悊鐘舵�� 0寰呭鐞� 1宸插垎娲� 2宸插鐞�")
+    private Integer dealStatus;
+
+    @ApiModelProperty(value = "鍒嗘淳浜虹紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="鍒嗘淳浜虹紪鐮�(鍏宠仈system_user)")
+    private Integer dispatchUserId;
+
+    @ApiModelProperty(value = "鍒嗘淳鏃堕棿")
+    @ExcelColumn(name="鍒嗘淳鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dispatchDate;
+
+    @ApiModelProperty(value = "鍒嗘淳澶勭悊璇存槑")
+    @ExcelColumn(name="鍒嗘淳澶勭悊璇存槑")
+    private String dispatchInfo;
+
+    @ApiModelProperty(value = "澶勭悊浜虹紪鐮�(鍏宠仈system_user)", example = "1")
+    @ExcelColumn(name="澶勭悊浜虹紪鐮�(鍏宠仈system_user)")
+    private Integer dealUserId;
+
+    @ApiModelProperty(value = "澶勭悊鏃堕棿")
+    @ExcelColumn(name="澶勭悊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dealDate;
+
+    @ApiModelProperty(value = "澶勭悊澶囨敞")
+    @ExcelColumn(name="澶勭悊澶囨敞")
+    private String dealInfo;
+
+    @ApiModelProperty(value = "澶勭悊鏂瑰紡 0鎸囨淳鍚庡鐞� 1鐩存帴鍥炲", example = "1")
+    @ExcelColumn(name="澶勭悊鏂瑰紡 0鎸囨淳鍚庡鐞� 1鐩存帴鍥炲")
+    private Integer dealType;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwBuildingService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwBuildingService.java
new file mode 100644
index 0000000..47a9175
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwBuildingService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwBuilding;
+import java.util.List;
+
+/**
+ * 杩愮淮妤煎畤淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwBuildingService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywBuilding 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwBuilding ywBuilding);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywBuilding 瀹炰綋瀵硅薄
+     */
+    void delete(YwBuilding ywBuilding);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywBuilding 瀹炰綋瀵硅薄
+     */
+    void updateById(YwBuilding ywBuilding);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywBuildings 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwBuilding> ywBuildings);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwBuilding
+     */
+    YwBuilding findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywBuilding 瀹炰綋瀵硅薄
+     * @return YwBuilding
+     */
+    YwBuilding findOne(YwBuilding ywBuilding);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywBuilding 瀹炰綋瀵硅薄
+     * @return List<YwBuilding>
+     */
+    List<YwBuilding> findList(YwBuilding ywBuilding);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwBuilding>
+     */
+    PageData<YwBuilding> findPage(PageWrap<YwBuilding> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywBuilding 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwBuilding ywBuilding);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java
new file mode 100644
index 0000000..4fbdf3e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwContractBill;
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓璐﹀崟淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractBillService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywContractBill 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwContractBill ywContractBill);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywContractBill 瀹炰綋瀵硅薄
+     */
+    void delete(YwContractBill ywContractBill);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywContractBill 瀹炰綋瀵硅薄
+     */
+    void updateById(YwContractBill ywContractBill);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywContractBills 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwContractBill> ywContractBills);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwContractBill
+     */
+    YwContractBill findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywContractBill 瀹炰綋瀵硅薄
+     * @return YwContractBill
+     */
+    YwContractBill findOne(YwContractBill ywContractBill);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywContractBill 瀹炰綋瀵硅薄
+     * @return List<YwContractBill>
+     */
+    List<YwContractBill> findList(YwContractBill ywContractBill);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwContractBill>
+     */
+    PageData<YwContractBill> findPage(PageWrap<YwContractBill> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywContractBill 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwContractBill ywContractBill);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractDetailService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractDetailService.java
new file mode 100644
index 0000000..1b0c8f9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractDetailService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwContractDetail;
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓鏉℃淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractDetailService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywContractDetail 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwContractDetail ywContractDetail);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywContractDetail 瀹炰綋瀵硅薄
+     */
+    void delete(YwContractDetail ywContractDetail);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywContractDetail 瀹炰綋瀵硅薄
+     */
+    void updateById(YwContractDetail ywContractDetail);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywContractDetails 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwContractDetail> ywContractDetails);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwContractDetail
+     */
+    YwContractDetail findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywContractDetail 瀹炰綋瀵硅薄
+     * @return YwContractDetail
+     */
+    YwContractDetail findOne(YwContractDetail ywContractDetail);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywContractDetail 瀹炰綋瀵硅薄
+     * @return List<YwContractDetail>
+     */
+    List<YwContractDetail> findList(YwContractDetail ywContractDetail);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwContractDetail>
+     */
+    PageData<YwContractDetail> findPage(PageWrap<YwContractDetail> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywContractDetail 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwContractDetail ywContractDetail);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java
new file mode 100644
index 0000000..a2e0b66
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwContractRoom;
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractRoomService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywContractRoom 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwContractRoom ywContractRoom);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywContractRoom 瀹炰綋瀵硅薄
+     */
+    void delete(YwContractRoom ywContractRoom);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywContractRoom 瀹炰綋瀵硅薄
+     */
+    void updateById(YwContractRoom ywContractRoom);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywContractRooms 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwContractRoom> ywContractRooms);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwContractRoom
+     */
+    YwContractRoom findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywContractRoom 瀹炰綋瀵硅薄
+     * @return YwContractRoom
+     */
+    YwContractRoom findOne(YwContractRoom ywContractRoom);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywContractRoom 瀹炰綋瀵硅薄
+     * @return List<YwContractRoom>
+     */
+    List<YwContractRoom> findList(YwContractRoom ywContractRoom);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwContractRoom>
+     */
+    PageData<YwContractRoom> findPage(PageWrap<YwContractRoom> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywContractRoom 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwContractRoom ywContractRoom);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
new file mode 100644
index 0000000..6e87661
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwContract;
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwContractService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywContract 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwContract ywContract);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywContract 瀹炰綋瀵硅薄
+     */
+    void delete(YwContract ywContract);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywContract 瀹炰綋瀵硅薄
+     */
+    void updateById(YwContract ywContract);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywContracts 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwContract> ywContracts);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwContract
+     */
+    YwContract findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywContract 瀹炰綋瀵硅薄
+     * @return YwContract
+     */
+    YwContract findOne(YwContract ywContract);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywContract 瀹炰綋瀵硅薄
+     * @return List<YwContract>
+     */
+    List<YwContract> findList(YwContract ywContract);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwContract>
+     */
+    PageData<YwContract> findPage(PageWrap<YwContract> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywContract 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwContract ywContract);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwCustomerService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwCustomerService.java
new file mode 100644
index 0000000..6336441
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwCustomerService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwCustomer;
+import java.util.List;
+
+/**
+ * 杩愮淮瀹㈡埛淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwCustomerService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywCustomer 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwCustomer ywCustomer);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywCustomer 瀹炰綋瀵硅薄
+     */
+    void delete(YwCustomer ywCustomer);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywCustomer 瀹炰綋瀵硅薄
+     */
+    void updateById(YwCustomer ywCustomer);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywCustomers 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwCustomer> ywCustomers);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwCustomer
+     */
+    YwCustomer findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywCustomer 瀹炰綋瀵硅薄
+     * @return YwCustomer
+     */
+    YwCustomer findOne(YwCustomer ywCustomer);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywCustomer 瀹炰綋瀵硅薄
+     * @return List<YwCustomer>
+     */
+    List<YwCustomer> findList(YwCustomer ywCustomer);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwCustomer>
+     */
+    PageData<YwCustomer> findPage(PageWrap<YwCustomer> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywCustomer 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwCustomer ywCustomer);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceRecordService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceRecordService.java
new file mode 100644
index 0000000..1065b7b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceRecordService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwDeviceRecord;
+import java.util.List;
+
+/**
+ * 杩愮淮璁惧杩愮淮璁板綍琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwDeviceRecordService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywDeviceRecord 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwDeviceRecord ywDeviceRecord);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywDeviceRecord 瀹炰綋瀵硅薄
+     */
+    void delete(YwDeviceRecord ywDeviceRecord);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywDeviceRecord 瀹炰綋瀵硅薄
+     */
+    void updateById(YwDeviceRecord ywDeviceRecord);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywDeviceRecords 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwDeviceRecord> ywDeviceRecords);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwDeviceRecord
+     */
+    YwDeviceRecord findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywDeviceRecord 瀹炰綋瀵硅薄
+     * @return YwDeviceRecord
+     */
+    YwDeviceRecord findOne(YwDeviceRecord ywDeviceRecord);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywDeviceRecord 瀹炰綋瀵硅薄
+     * @return List<YwDeviceRecord>
+     */
+    List<YwDeviceRecord> findList(YwDeviceRecord ywDeviceRecord);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwDeviceRecord>
+     */
+    PageData<YwDeviceRecord> findPage(PageWrap<YwDeviceRecord> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywDeviceRecord 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwDeviceRecord ywDeviceRecord);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java
new file mode 100644
index 0000000..b7ef12e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwDevice;
+import java.util.List;
+
+/**
+ * 杩愮淮璁惧淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwDeviceService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywDevice 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwDevice ywDevice);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywDevice 瀹炰綋瀵硅薄
+     */
+    void delete(YwDevice ywDevice);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywDevice 瀹炰綋瀵硅薄
+     */
+    void updateById(YwDevice ywDevice);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywDevices 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwDevice> ywDevices);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwDevice
+     */
+    YwDevice findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywDevice 瀹炰綋瀵硅薄
+     * @return YwDevice
+     */
+    YwDevice findOne(YwDevice ywDevice);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywDevice 瀹炰綋瀵硅薄
+     * @return List<YwDevice>
+     */
+    List<YwDevice> findList(YwDevice ywDevice);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwDevice>
+     */
+    PageData<YwDevice> findPage(PageWrap<YwDevice> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywDevice 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwDevice ywDevice);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwLinePointService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwLinePointService.java
new file mode 100644
index 0000000..e90989d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwLinePointService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwLinePoint;
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwLinePointService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywLinePoint 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwLinePoint ywLinePoint);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywLinePoint 瀹炰綋瀵硅薄
+     */
+    void delete(YwLinePoint ywLinePoint);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywLinePoint 瀹炰綋瀵硅薄
+     */
+    void updateById(YwLinePoint ywLinePoint);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywLinePoints 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwLinePoint> ywLinePoints);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwLinePoint
+     */
+    YwLinePoint findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywLinePoint 瀹炰綋瀵硅薄
+     * @return YwLinePoint
+     */
+    YwLinePoint findOne(YwLinePoint ywLinePoint);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywLinePoint 瀹炰綋瀵硅薄
+     * @return List<YwLinePoint>
+     */
+    List<YwLinePoint> findList(YwLinePoint ywLinePoint);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwLinePoint>
+     */
+    PageData<YwLinePoint> findPage(PageWrap<YwLinePoint> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywLinePoint 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwLinePoint ywLinePoint);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolLineService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolLineService.java
new file mode 100644
index 0000000..7e10d65
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolLineService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwPatrolLine;
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃璺嚎淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolLineService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywPatrolLine 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwPatrolLine ywPatrolLine);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywPatrolLine 瀹炰綋瀵硅薄
+     */
+    void delete(YwPatrolLine ywPatrolLine);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywPatrolLine 瀹炰綋瀵硅薄
+     */
+    void updateById(YwPatrolLine ywPatrolLine);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywPatrolLines 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwPatrolLine> ywPatrolLines);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwPatrolLine
+     */
+    YwPatrolLine findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywPatrolLine 瀹炰綋瀵硅薄
+     * @return YwPatrolLine
+     */
+    YwPatrolLine findOne(YwPatrolLine ywPatrolLine);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywPatrolLine 瀹炰綋瀵硅薄
+     * @return List<YwPatrolLine>
+     */
+    List<YwPatrolLine> findList(YwPatrolLine ywPatrolLine);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwPatrolLine>
+     */
+    PageData<YwPatrolLine> findPage(PageWrap<YwPatrolLine> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywPatrolLine 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwPatrolLine ywPatrolLine);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java
new file mode 100644
index 0000000..e4960f2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwPatrolPoint;
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃鐐逛俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolPointService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywPatrolPoint 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwPatrolPoint ywPatrolPoint);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywPatrolPoint 瀹炰綋瀵硅薄
+     */
+    void delete(YwPatrolPoint ywPatrolPoint);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywPatrolPoint 瀹炰綋瀵硅薄
+     */
+    void updateById(YwPatrolPoint ywPatrolPoint);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywPatrolPoints 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwPatrolPoint> ywPatrolPoints);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwPatrolPoint
+     */
+    YwPatrolPoint findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywPatrolPoint 瀹炰綋瀵硅薄
+     * @return YwPatrolPoint
+     */
+    YwPatrolPoint findOne(YwPatrolPoint ywPatrolPoint);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywPatrolPoint 瀹炰綋瀵硅薄
+     * @return List<YwPatrolPoint>
+     */
+    List<YwPatrolPoint> findList(YwPatrolPoint ywPatrolPoint);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwPatrolPoint>
+     */
+    PageData<YwPatrolPoint> findPage(PageWrap<YwPatrolPoint> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywPatrolPoint 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwPatrolPoint ywPatrolPoint);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolSchemeService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolSchemeService.java
new file mode 100644
index 0000000..97de65d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolSchemeService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwPatrolScheme;
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃璁″垝淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolSchemeService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywPatrolScheme 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwPatrolScheme ywPatrolScheme);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywPatrolScheme 瀹炰綋瀵硅薄
+     */
+    void delete(YwPatrolScheme ywPatrolScheme);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywPatrolScheme 瀹炰綋瀵硅薄
+     */
+    void updateById(YwPatrolScheme ywPatrolScheme);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywPatrolSchemes 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwPatrolScheme> ywPatrolSchemes);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwPatrolScheme
+     */
+    YwPatrolScheme findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywPatrolScheme 瀹炰綋瀵硅薄
+     * @return YwPatrolScheme
+     */
+    YwPatrolScheme findOne(YwPatrolScheme ywPatrolScheme);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywPatrolScheme 瀹炰綋瀵硅薄
+     * @return List<YwPatrolScheme>
+     */
+    List<YwPatrolScheme> findList(YwPatrolScheme ywPatrolScheme);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwPatrolScheme>
+     */
+    PageData<YwPatrolScheme> findPage(PageWrap<YwPatrolScheme> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywPatrolScheme 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwPatrolScheme ywPatrolScheme);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskService.java
new file mode 100644
index 0000000..6185060
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwPatrolTask;
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃浠诲姟淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwPatrolTaskService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywPatrolTask 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwPatrolTask ywPatrolTask);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywPatrolTask 瀹炰綋瀵硅薄
+     */
+    void delete(YwPatrolTask ywPatrolTask);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywPatrolTask 瀹炰綋瀵硅薄
+     */
+    void updateById(YwPatrolTask ywPatrolTask);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywPatrolTasks 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwPatrolTask> ywPatrolTasks);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwPatrolTask
+     */
+    YwPatrolTask findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywPatrolTask 瀹炰綋瀵硅薄
+     * @return YwPatrolTask
+     */
+    YwPatrolTask findOne(YwPatrolTask ywPatrolTask);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywPatrolTask 瀹炰綋瀵硅薄
+     * @return List<YwPatrolTask>
+     */
+    List<YwPatrolTask> findList(YwPatrolTask ywPatrolTask);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwPatrolTask>
+     */
+    PageData<YwPatrolTask> findPage(PageWrap<YwPatrolTask> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywPatrolTask 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwPatrolTask ywPatrolTask);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
new file mode 100644
index 0000000..649181e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwProject;
+import java.util.List;
+
+/**
+ * 杩愮淮椤圭洰淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwProjectService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywProject 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwProject ywProject);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywProject 瀹炰綋瀵硅薄
+     */
+    void delete(YwProject ywProject);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywProject 瀹炰綋瀵硅薄
+     */
+    void updateById(YwProject ywProject);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywProjects 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwProject> ywProjects);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwProject
+     */
+    YwProject findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywProject 瀹炰綋瀵硅薄
+     * @return YwProject
+     */
+    YwProject findOne(YwProject ywProject);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywProject 瀹炰綋瀵硅薄
+     * @return List<YwProject>
+     */
+    List<YwProject> findList(YwProject ywProject);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwProject>
+     */
+    PageData<YwProject> findPage(PageWrap<YwProject> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywProject 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwProject ywProject);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java
new file mode 100644
index 0000000..ebafd27
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwRoom;
+import java.util.List;
+
+/**
+ * 杩愮淮鎴挎簮淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwRoomService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywRoom 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwRoom ywRoom);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywRoom 瀹炰綋瀵硅薄
+     */
+    void delete(YwRoom ywRoom);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywRoom 瀹炰綋瀵硅薄
+     */
+    void updateById(YwRoom ywRoom);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywRooms 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwRoom> ywRooms);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwRoom
+     */
+    YwRoom findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywRoom 瀹炰綋瀵硅薄
+     * @return YwRoom
+     */
+    YwRoom findOne(YwRoom ywRoom);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywRoom 瀹炰綋瀵硅薄
+     * @return List<YwRoom>
+     */
+    List<YwRoom> findList(YwRoom ywRoom);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwRoom>
+     */
+    PageData<YwRoom> findPage(PageWrap<YwRoom> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywRoom 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwRoom ywRoom);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java
new file mode 100644
index 0000000..9e3047c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwWorkorder;
+import java.util.List;
+
+/**
+ * 杩愮淮宸ュ崟淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+public interface YwWorkorderService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywWorkorder 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwWorkorder ywWorkorder);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywWorkorder 瀹炰綋瀵硅薄
+     */
+    void delete(YwWorkorder ywWorkorder);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywWorkorder 瀹炰綋瀵硅薄
+     */
+    void updateById(YwWorkorder ywWorkorder);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywWorkorders 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwWorkorder> ywWorkorders);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwWorkorder
+     */
+    YwWorkorder findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywWorkorder 瀹炰綋瀵硅薄
+     * @return YwWorkorder
+     */
+    YwWorkorder findOne(YwWorkorder ywWorkorder);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywWorkorder 瀹炰綋瀵硅薄
+     * @return List<YwWorkorder>
+     */
+    List<YwWorkorder> findList(YwWorkorder ywWorkorder);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwWorkorder>
+     */
+    PageData<YwWorkorder> findPage(PageWrap<YwWorkorder> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywWorkorder 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwWorkorder ywWorkorder);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
new file mode 100644
index 0000000..b006830
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
@@ -0,0 +1,166 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwBuildingMapper;
+import com.doumee.dao.business.model.YwBuilding;
+import com.doumee.service.business.YwBuildingService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮妤煎畤淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwBuildingServiceImpl implements YwBuildingService {
+
+    @Autowired
+    private YwBuildingMapper ywBuildingMapper;
+
+    @Override
+    public Integer create(YwBuilding ywBuilding) {
+        ywBuildingMapper.insert(ywBuilding);
+        return ywBuilding.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywBuildingMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwBuilding ywBuilding) {
+        UpdateWrapper<YwBuilding> deleteWrapper = new UpdateWrapper<>(ywBuilding);
+        ywBuildingMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywBuildingMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwBuilding ywBuilding) {
+        ywBuildingMapper.updateById(ywBuilding);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwBuilding> ywBuildings) {
+        if (CollectionUtils.isEmpty(ywBuildings)) {
+            return;
+        }
+        for (YwBuilding ywBuilding: ywBuildings) {
+            this.updateById(ywBuilding);
+        }
+    }
+
+    @Override
+    public YwBuilding findById(Integer id) {
+        return ywBuildingMapper.selectById(id);
+    }
+
+    @Override
+    public YwBuilding findOne(YwBuilding ywBuilding) {
+        QueryWrapper<YwBuilding> wrapper = new QueryWrapper<>(ywBuilding);
+        return ywBuildingMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwBuilding> findList(YwBuilding ywBuilding) {
+        QueryWrapper<YwBuilding> wrapper = new QueryWrapper<>(ywBuilding);
+        return ywBuildingMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwBuilding> findPage(PageWrap<YwBuilding> pageWrap) {
+        IPage<YwBuilding> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwBuilding> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwBuilding::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwBuilding::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwBuilding::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwBuilding::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getImgurl() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getImgurl, pageWrap.getModel().getImgurl());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getAddr() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getAddr, pageWrap.getModel().getAddr());
+        }
+        if (pageWrap.getModel().getArea() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getArea, pageWrap.getModel().getArea());
+        }
+        if (pageWrap.getModel().getCqArea() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getCqArea, pageWrap.getModel().getCqArea());
+        }
+        if (pageWrap.getModel().getRentArea() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getRentArea, pageWrap.getModel().getRentArea());
+        }
+        if (pageWrap.getModel().getOnFloor() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getOnFloor, pageWrap.getModel().getOnFloor());
+        }
+        if (pageWrap.getModel().getUnderFloor() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getUnderFloor, pageWrap.getModel().getUnderFloor());
+        }
+        if (pageWrap.getModel().getProjectId() != null) {
+            queryWrapper.lambda().eq(YwBuilding::getProjectId, pageWrap.getModel().getProjectId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywBuildingMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwBuilding ywBuilding) {
+        QueryWrapper<YwBuilding> wrapper = new QueryWrapper<>(ywBuilding);
+        return ywBuildingMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
new file mode 100644
index 0000000..b592fdd
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -0,0 +1,153 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwContractBillMapper;
+import com.doumee.dao.business.model.YwContractBill;
+import com.doumee.service.business.YwContractBillService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓璐﹀崟淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwContractBillServiceImpl implements YwContractBillService {
+
+    @Autowired
+    private YwContractBillMapper ywContractBillMapper;
+
+    @Override
+    public Integer create(YwContractBill ywContractBill) {
+        ywContractBillMapper.insert(ywContractBill);
+        return ywContractBill.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywContractBillMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwContractBill ywContractBill) {
+        UpdateWrapper<YwContractBill> deleteWrapper = new UpdateWrapper<>(ywContractBill);
+        ywContractBillMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywContractBillMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwContractBill ywContractBill) {
+        ywContractBillMapper.updateById(ywContractBill);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwContractBill> ywContractBills) {
+        if (CollectionUtils.isEmpty(ywContractBills)) {
+            return;
+        }
+        for (YwContractBill ywContractBill: ywContractBills) {
+            this.updateById(ywContractBill);
+        }
+    }
+
+    @Override
+    public YwContractBill findById(Integer id) {
+        return ywContractBillMapper.selectById(id);
+    }
+
+    @Override
+    public YwContractBill findOne(YwContractBill ywContractBill) {
+        QueryWrapper<YwContractBill> wrapper = new QueryWrapper<>(ywContractBill);
+        return ywContractBillMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwContractBill> findList(YwContractBill ywContractBill) {
+        QueryWrapper<YwContractBill> wrapper = new QueryWrapper<>(ywContractBill);
+        return ywContractBillMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwContractBill> findPage(PageWrap<YwContractBill> pageWrap) {
+        IPage<YwContractBill> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwContractBill> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwContractBill::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwContractBill::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwContractBill::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwContractBill::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().ge(YwContractBill::getStartDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()));
+            queryWrapper.lambda().le(YwContractBill::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getStartDate()));
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().ge(YwContractBill::getEndDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()));
+            queryWrapper.lambda().le(YwContractBill::getEndDate, Utils.Date.getEnd(pageWrap.getModel().getEndDate()));
+        }
+        if (pageWrap.getModel().getDetailId() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getDetailId, pageWrap.getModel().getDetailId());
+        }
+        if (pageWrap.getModel().getContractId() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getContractId, pageWrap.getModel().getContractId());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getTotleFee() != null) {
+            queryWrapper.lambda().eq(YwContractBill::getTotleFee, pageWrap.getModel().getTotleFee());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywContractBillMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwContractBill ywContractBill) {
+        QueryWrapper<YwContractBill> wrapper = new QueryWrapper<>(ywContractBill);
+        return ywContractBillMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractDetailServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractDetailServiceImpl.java
new file mode 100644
index 0000000..0b455a9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractDetailServiceImpl.java
@@ -0,0 +1,159 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwContractDetailMapper;
+import com.doumee.dao.business.model.YwContractDetail;
+import com.doumee.service.business.YwContractDetailService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓鏉℃淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwContractDetailServiceImpl implements YwContractDetailService {
+
+    @Autowired
+    private YwContractDetailMapper ywContractDetailMapper;
+
+    @Override
+    public Integer create(YwContractDetail ywContractDetail) {
+        ywContractDetailMapper.insert(ywContractDetail);
+        return ywContractDetail.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywContractDetailMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwContractDetail ywContractDetail) {
+        UpdateWrapper<YwContractDetail> deleteWrapper = new UpdateWrapper<>(ywContractDetail);
+        ywContractDetailMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywContractDetailMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwContractDetail ywContractDetail) {
+        ywContractDetailMapper.updateById(ywContractDetail);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwContractDetail> ywContractDetails) {
+        if (CollectionUtils.isEmpty(ywContractDetails)) {
+            return;
+        }
+        for (YwContractDetail ywContractDetail: ywContractDetails) {
+            this.updateById(ywContractDetail);
+        }
+    }
+
+    @Override
+    public YwContractDetail findById(Integer id) {
+        return ywContractDetailMapper.selectById(id);
+    }
+
+    @Override
+    public YwContractDetail findOne(YwContractDetail ywContractDetail) {
+        QueryWrapper<YwContractDetail> wrapper = new QueryWrapper<>(ywContractDetail);
+        return ywContractDetailMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwContractDetail> findList(YwContractDetail ywContractDetail) {
+        QueryWrapper<YwContractDetail> wrapper = new QueryWrapper<>(ywContractDetail);
+        return ywContractDetailMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwContractDetail> findPage(PageWrap<YwContractDetail> pageWrap) {
+        IPage<YwContractDetail> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwContractDetail> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwContractDetail::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwContractDetail::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwContractDetail::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwContractDetail::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().ge(YwContractDetail::getStartDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()));
+            queryWrapper.lambda().le(YwContractDetail::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getStartDate()));
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().ge(YwContractDetail::getEndDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()));
+            queryWrapper.lambda().le(YwContractDetail::getEndDate, Utils.Date.getEnd(pageWrap.getModel().getEndDate()));
+        }
+        if (pageWrap.getModel().getPrice() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getPrice, pageWrap.getModel().getPrice());
+        }
+        if (pageWrap.getModel().getCircleType() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getCircleType, pageWrap.getModel().getCircleType());
+        }
+        if (pageWrap.getModel().getAdvanceDays() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getAdvanceDays, pageWrap.getModel().getAdvanceDays());
+        }
+        if (pageWrap.getModel().getContractId() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getContractId, pageWrap.getModel().getContractId());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getTotleFee() != null) {
+            queryWrapper.lambda().eq(YwContractDetail::getTotleFee, pageWrap.getModel().getTotleFee());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywContractDetailMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwContractDetail ywContractDetail) {
+        QueryWrapper<YwContractDetail> wrapper = new QueryWrapper<>(ywContractDetail);
+        return ywContractDetailMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java
new file mode 100644
index 0000000..9544c78
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java
@@ -0,0 +1,139 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwContractRoomMapper;
+import com.doumee.dao.business.model.YwContractRoom;
+import com.doumee.service.business.YwContractRoomService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓鎴挎簮鍏宠仈淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwContractRoomServiceImpl implements YwContractRoomService {
+
+    @Autowired
+    private YwContractRoomMapper ywContractRoomMapper;
+
+    @Override
+    public Integer create(YwContractRoom ywContractRoom) {
+        ywContractRoomMapper.insert(ywContractRoom);
+        return ywContractRoom.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywContractRoomMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwContractRoom ywContractRoom) {
+        UpdateWrapper<YwContractRoom> deleteWrapper = new UpdateWrapper<>(ywContractRoom);
+        ywContractRoomMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywContractRoomMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwContractRoom ywContractRoom) {
+        ywContractRoomMapper.updateById(ywContractRoom);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwContractRoom> ywContractRooms) {
+        if (CollectionUtils.isEmpty(ywContractRooms)) {
+            return;
+        }
+        for (YwContractRoom ywContractRoom: ywContractRooms) {
+            this.updateById(ywContractRoom);
+        }
+    }
+
+    @Override
+    public YwContractRoom findById(Integer id) {
+        return ywContractRoomMapper.selectById(id);
+    }
+
+    @Override
+    public YwContractRoom findOne(YwContractRoom ywContractRoom) {
+        QueryWrapper<YwContractRoom> wrapper = new QueryWrapper<>(ywContractRoom);
+        return ywContractRoomMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwContractRoom> findList(YwContractRoom ywContractRoom) {
+        QueryWrapper<YwContractRoom> wrapper = new QueryWrapper<>(ywContractRoom);
+        return ywContractRoomMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwContractRoom> findPage(PageWrap<YwContractRoom> pageWrap) {
+        IPage<YwContractRoom> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwContractRoom> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwContractRoom::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwContractRoom::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwContractRoom::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwContractRoom::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getRoomId() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getRoomId, pageWrap.getModel().getRoomId());
+        }
+        if (pageWrap.getModel().getContractId() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getContractId, pageWrap.getModel().getContractId());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwContractRoom::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywContractRoomMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwContractRoom ywContractRoom) {
+        QueryWrapper<YwContractRoom> wrapper = new QueryWrapper<>(ywContractRoom);
+        return ywContractRoomMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
new file mode 100644
index 0000000..bfae567
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -0,0 +1,203 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwContractMapper;
+import com.doumee.dao.business.model.YwContract;
+import com.doumee.service.business.YwContractService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮鍚堝悓淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwContractServiceImpl implements YwContractService {
+
+    @Autowired
+    private YwContractMapper ywContractMapper;
+
+    @Override
+    public Integer create(YwContract ywContract) {
+        ywContractMapper.insert(ywContract);
+        return ywContract.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywContractMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwContract ywContract) {
+        UpdateWrapper<YwContract> deleteWrapper = new UpdateWrapper<>(ywContract);
+        ywContractMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywContractMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwContract ywContract) {
+        ywContractMapper.updateById(ywContract);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwContract> ywContracts) {
+        if (CollectionUtils.isEmpty(ywContracts)) {
+            return;
+        }
+        for (YwContract ywContract: ywContracts) {
+            this.updateById(ywContract);
+        }
+    }
+
+    @Override
+    public YwContract findById(Integer id) {
+        return ywContractMapper.selectById(id);
+    }
+
+    @Override
+    public YwContract findOne(YwContract ywContract) {
+        QueryWrapper<YwContract> wrapper = new QueryWrapper<>(ywContract);
+        return ywContractMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwContract> findList(YwContract ywContract) {
+        QueryWrapper<YwContract> wrapper = new QueryWrapper<>(ywContract);
+        return ywContractMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwContract> findPage(PageWrap<YwContract> pageWrap) {
+        IPage<YwContract> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwContract> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwContract::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwContract::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwContract::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwContract::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwContract::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwContract::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwContract::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwContract::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(YwContract::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(YwContract::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getUserId() != null) {
+            queryWrapper.lambda().eq(YwContract::getUserId, pageWrap.getModel().getUserId());
+        }
+        if (pageWrap.getModel().getSignDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getSignDate, Utils.Date.getStart(pageWrap.getModel().getSignDate()));
+            queryWrapper.lambda().le(YwContract::getSignDate, Utils.Date.getEnd(pageWrap.getModel().getSignDate()));
+        }
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getStartDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()));
+            queryWrapper.lambda().le(YwContract::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getStartDate()));
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getEndDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()));
+            queryWrapper.lambda().le(YwContract::getEndDate, Utils.Date.getEnd(pageWrap.getModel().getEndDate()));
+        }
+        if (pageWrap.getModel().getProjectId() != null) {
+            queryWrapper.lambda().eq(YwContract::getProjectId, pageWrap.getModel().getProjectId());
+        }
+        if (pageWrap.getModel().getRoundedUp() != null) {
+            queryWrapper.lambda().eq(YwContract::getRoundedUp, pageWrap.getModel().getRoundedUp());
+        }
+        if (pageWrap.getModel().getCompanyId() != null) {
+            queryWrapper.lambda().eq(YwContract::getCompanyId, pageWrap.getModel().getCompanyId());
+        }
+        if (pageWrap.getModel().getRenterId() != null) {
+            queryWrapper.lambda().eq(YwContract::getRenterId, pageWrap.getModel().getRenterId());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(YwContract::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getZlDeposit() != null) {
+            queryWrapper.lambda().eq(YwContract::getZlDeposit, pageWrap.getModel().getZlDeposit());
+        }
+        if (pageWrap.getModel().getZlPayType() != null) {
+            queryWrapper.lambda().eq(YwContract::getZlPayType, pageWrap.getModel().getZlPayType());
+        }
+        if (pageWrap.getModel().getZlFreeStartDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getZlFreeStartDate, Utils.Date.getStart(pageWrap.getModel().getZlFreeStartDate()));
+            queryWrapper.lambda().le(YwContract::getZlFreeStartDate, Utils.Date.getEnd(pageWrap.getModel().getZlFreeStartDate()));
+        }
+        if (pageWrap.getModel().getZlFreeEndDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getZlFreeEndDate, Utils.Date.getStart(pageWrap.getModel().getZlFreeEndDate()));
+            queryWrapper.lambda().le(YwContract::getZlFreeEndDate, Utils.Date.getEnd(pageWrap.getModel().getZlFreeEndDate()));
+        }
+        if (pageWrap.getModel().getWyDeposit() != null) {
+            queryWrapper.lambda().eq(YwContract::getWyDeposit, pageWrap.getModel().getWyDeposit());
+        }
+        if (pageWrap.getModel().getWyPayType() != null) {
+            queryWrapper.lambda().eq(YwContract::getWyPayType, pageWrap.getModel().getWyPayType());
+        }
+        if (pageWrap.getModel().getWyFreeStartDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getWyFreeStartDate, Utils.Date.getStart(pageWrap.getModel().getWyFreeStartDate()));
+            queryWrapper.lambda().le(YwContract::getWyFreeStartDate, Utils.Date.getEnd(pageWrap.getModel().getWyFreeStartDate()));
+        }
+        if (pageWrap.getModel().getWyFreeEndDate() != null) {
+            queryWrapper.lambda().ge(YwContract::getWyFreeEndDate, Utils.Date.getStart(pageWrap.getModel().getWyFreeEndDate()));
+            queryWrapper.lambda().le(YwContract::getWyFreeEndDate, Utils.Date.getEnd(pageWrap.getModel().getWyFreeEndDate()));
+        }
+        if (pageWrap.getModel().getZlTotalFee() != null) {
+            queryWrapper.lambda().eq(YwContract::getZlTotalFee, pageWrap.getModel().getZlTotalFee());
+        }
+        if (pageWrap.getModel().getWyTotalFee() != null) {
+            queryWrapper.lambda().eq(YwContract::getWyTotalFee, pageWrap.getModel().getWyTotalFee());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywContractMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwContract ywContract) {
+        QueryWrapper<YwContract> wrapper = new QueryWrapper<>(ywContract);
+        return ywContractMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java
new file mode 100644
index 0000000..cc0f54b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java
@@ -0,0 +1,197 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwCustomerMapper;
+import com.doumee.dao.business.model.YwCustomer;
+import com.doumee.service.business.YwCustomerService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮瀹㈡埛淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwCustomerServiceImpl implements YwCustomerService {
+
+    @Autowired
+    private YwCustomerMapper ywCustomerMapper;
+
+    @Override
+    public Integer create(YwCustomer ywCustomer) {
+        ywCustomerMapper.insert(ywCustomer);
+        return ywCustomer.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywCustomerMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwCustomer ywCustomer) {
+        UpdateWrapper<YwCustomer> deleteWrapper = new UpdateWrapper<>(ywCustomer);
+        ywCustomerMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywCustomerMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwCustomer ywCustomer) {
+        ywCustomerMapper.updateById(ywCustomer);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwCustomer> ywCustomers) {
+        if (CollectionUtils.isEmpty(ywCustomers)) {
+            return;
+        }
+        for (YwCustomer ywCustomer: ywCustomers) {
+            this.updateById(ywCustomer);
+        }
+    }
+
+    @Override
+    public YwCustomer findById(Integer id) {
+        return ywCustomerMapper.selectById(id);
+    }
+
+    @Override
+    public YwCustomer findOne(YwCustomer ywCustomer) {
+        QueryWrapper<YwCustomer> wrapper = new QueryWrapper<>(ywCustomer);
+        return ywCustomerMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwCustomer> findList(YwCustomer ywCustomer) {
+        QueryWrapper<YwCustomer> wrapper = new QueryWrapper<>(ywCustomer);
+        return ywCustomerMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwCustomer> findPage(PageWrap<YwCustomer> pageWrap) {
+        IPage<YwCustomer> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwCustomer> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwCustomer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwCustomer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwCustomer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwCustomer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getIndustryId() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getIndustryId, pageWrap.getModel().getIndustryId());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getPhone() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getPhone, pageWrap.getModel().getPhone());
+        }
+        if (pageWrap.getModel().getIdcardNo() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getIdcardNo, pageWrap.getModel().getIdcardNo());
+        }
+        if (pageWrap.getModel().getIdcardDecode() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getIdcardDecode, pageWrap.getModel().getIdcardDecode());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getHighCheckor() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getHighCheckor, pageWrap.getModel().getHighCheckor());
+        }
+        if (pageWrap.getModel().getLastLoginDate() != null) {
+            queryWrapper.lambda().ge(YwCustomer::getLastLoginDate, Utils.Date.getStart(pageWrap.getModel().getLastLoginDate()));
+            queryWrapper.lambda().le(YwCustomer::getLastLoginDate, Utils.Date.getEnd(pageWrap.getModel().getLastLoginDate()));
+        }
+        if (pageWrap.getModel().getLoginNum() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getLoginNum, pageWrap.getModel().getLoginNum());
+        }
+        if (pageWrap.getModel().getUserId() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getUserId, pageWrap.getModel().getUserId());
+        }
+        if (pageWrap.getModel().getIdcardType() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getIdcardType, pageWrap.getModel().getIdcardType());
+        }
+        if (pageWrap.getModel().getAccountBank() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getAccountBank, pageWrap.getModel().getAccountBank());
+        }
+        if (pageWrap.getModel().getAccountNo() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getAccountNo, pageWrap.getModel().getAccountNo());
+        }
+        if (pageWrap.getModel().getAccountPhone() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getAccountPhone, pageWrap.getModel().getAccountPhone());
+        }
+        if (pageWrap.getModel().getCreditCard() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getCreditCard, pageWrap.getModel().getCreditCard());
+        }
+        if (pageWrap.getModel().getFpType() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getFpType, pageWrap.getModel().getFpType());
+        }
+        if (pageWrap.getModel().getAccountAddr() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getAccountAddr, pageWrap.getModel().getAccountAddr());
+        }
+        if (pageWrap.getModel().getIdentityType() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getIdentityType, pageWrap.getModel().getIdentityType());
+        }
+        if (pageWrap.getModel().getEmail() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getEmail, pageWrap.getModel().getEmail());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(YwCustomer::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywCustomerMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwCustomer ywCustomer) {
+        QueryWrapper<YwCustomer> wrapper = new QueryWrapper<>(ywCustomer);
+        return ywCustomerMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
new file mode 100644
index 0000000..b58dbd4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
@@ -0,0 +1,153 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwDeviceRecordMapper;
+import com.doumee.dao.business.model.YwDeviceRecord;
+import com.doumee.service.business.YwDeviceRecordService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮璁惧杩愮淮璁板綍琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwDeviceRecordServiceImpl implements YwDeviceRecordService {
+
+    @Autowired
+    private YwDeviceRecordMapper ywDeviceRecordMapper;
+
+    @Override
+    public Integer create(YwDeviceRecord ywDeviceRecord) {
+        ywDeviceRecordMapper.insert(ywDeviceRecord);
+        return ywDeviceRecord.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywDeviceRecordMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwDeviceRecord ywDeviceRecord) {
+        UpdateWrapper<YwDeviceRecord> deleteWrapper = new UpdateWrapper<>(ywDeviceRecord);
+        ywDeviceRecordMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywDeviceRecordMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwDeviceRecord ywDeviceRecord) {
+        ywDeviceRecordMapper.updateById(ywDeviceRecord);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwDeviceRecord> ywDeviceRecords) {
+        if (CollectionUtils.isEmpty(ywDeviceRecords)) {
+            return;
+        }
+        for (YwDeviceRecord ywDeviceRecord: ywDeviceRecords) {
+            this.updateById(ywDeviceRecord);
+        }
+    }
+
+    @Override
+    public YwDeviceRecord findById(Integer id) {
+        return ywDeviceRecordMapper.selectById(id);
+    }
+
+    @Override
+    public YwDeviceRecord findOne(YwDeviceRecord ywDeviceRecord) {
+        QueryWrapper<YwDeviceRecord> wrapper = new QueryWrapper<>(ywDeviceRecord);
+        return ywDeviceRecordMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwDeviceRecord> findList(YwDeviceRecord ywDeviceRecord) {
+        QueryWrapper<YwDeviceRecord> wrapper = new QueryWrapper<>(ywDeviceRecord);
+        return ywDeviceRecordMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwDeviceRecord> findPage(PageWrap<YwDeviceRecord> pageWrap) {
+        IPage<YwDeviceRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwDeviceRecord> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwDeviceRecord::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwDeviceRecord::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwDeviceRecord::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getModelNo() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getModelNo, pageWrap.getModel().getModelNo());
+        }
+        if (pageWrap.getModel().getDeviceId() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getDeviceId, pageWrap.getModel().getDeviceId());
+        }
+        if (pageWrap.getModel().getUserId() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getUserId, pageWrap.getModel().getUserId());
+        }
+        if (pageWrap.getModel().getCompany() != null) {
+            queryWrapper.lambda().ge(YwDeviceRecord::getCompany, Utils.Date.getStart(pageWrap.getModel().getCompany()));
+            queryWrapper.lambda().le(YwDeviceRecord::getCompany, Utils.Date.getEnd(pageWrap.getModel().getCompany()));
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().eq(YwDeviceRecord::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getDealDate() != null) {
+            queryWrapper.lambda().ge(YwDeviceRecord::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
+            queryWrapper.lambda().le(YwDeviceRecord::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywDeviceRecordMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwDeviceRecord ywDeviceRecord) {
+        QueryWrapper<YwDeviceRecord> wrapper = new QueryWrapper<>(ywDeviceRecord);
+        return ywDeviceRecordMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
new file mode 100644
index 0000000..77e981f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
@@ -0,0 +1,161 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwDeviceMapper;
+import com.doumee.dao.business.model.YwDevice;
+import com.doumee.service.business.YwDeviceService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮璁惧淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwDeviceServiceImpl implements YwDeviceService {
+
+    @Autowired
+    private YwDeviceMapper ywDeviceMapper;
+
+    @Override
+    public Integer create(YwDevice ywDevice) {
+        ywDeviceMapper.insert(ywDevice);
+        return ywDevice.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywDeviceMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwDevice ywDevice) {
+        UpdateWrapper<YwDevice> deleteWrapper = new UpdateWrapper<>(ywDevice);
+        ywDeviceMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywDeviceMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwDevice ywDevice) {
+        ywDeviceMapper.updateById(ywDevice);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwDevice> ywDevices) {
+        if (CollectionUtils.isEmpty(ywDevices)) {
+            return;
+        }
+        for (YwDevice ywDevice: ywDevices) {
+            this.updateById(ywDevice);
+        }
+    }
+
+    @Override
+    public YwDevice findById(Integer id) {
+        return ywDeviceMapper.selectById(id);
+    }
+
+    @Override
+    public YwDevice findOne(YwDevice ywDevice) {
+        QueryWrapper<YwDevice> wrapper = new QueryWrapper<>(ywDevice);
+        return ywDeviceMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwDevice> findList(YwDevice ywDevice) {
+        QueryWrapper<YwDevice> wrapper = new QueryWrapper<>(ywDevice);
+        return ywDeviceMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwDevice> findPage(PageWrap<YwDevice> pageWrap) {
+        IPage<YwDevice> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwDevice> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwDevice::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwDevice::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwDevice::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwDevice::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwDevice::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwDevice::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwDevice::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwDevice::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwDevice::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwDevice::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwDevice::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwDevice::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getModelNo() != null) {
+            queryWrapper.lambda().eq(YwDevice::getModelNo, pageWrap.getModel().getModelNo());
+        }
+        if (pageWrap.getModel().getCateId() != null) {
+            queryWrapper.lambda().eq(YwDevice::getCateId, pageWrap.getModel().getCateId());
+        }
+        if (pageWrap.getModel().getUserId() != null) {
+            queryWrapper.lambda().eq(YwDevice::getUserId, pageWrap.getModel().getUserId());
+        }
+        if (pageWrap.getModel().getCompany() != null) {
+            queryWrapper.lambda().ge(YwDevice::getCompany, Utils.Date.getStart(pageWrap.getModel().getCompany()));
+            queryWrapper.lambda().le(YwDevice::getCompany, Utils.Date.getEnd(pageWrap.getModel().getCompany()));
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().eq(YwDevice::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(YwDevice::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getAddr() != null) {
+            queryWrapper.lambda().eq(YwDevice::getAddr, pageWrap.getModel().getAddr());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywDeviceMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwDevice ywDevice) {
+        QueryWrapper<YwDevice> wrapper = new QueryWrapper<>(ywDevice);
+        return ywDeviceMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwLinePointServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwLinePointServiceImpl.java
new file mode 100644
index 0000000..767f255
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwLinePointServiceImpl.java
@@ -0,0 +1,142 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwLinePointMapper;
+import com.doumee.dao.business.model.YwLinePoint;
+import com.doumee.service.business.YwLinePointService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃璺嚎鍏宠仈宸℃鐐瑰叧鑱旇〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwLinePointServiceImpl implements YwLinePointService {
+
+    @Autowired
+    private YwLinePointMapper ywLinePointMapper;
+
+    @Override
+    public Integer create(YwLinePoint ywLinePoint) {
+        ywLinePointMapper.insert(ywLinePoint);
+        return ywLinePoint.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywLinePointMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwLinePoint ywLinePoint) {
+        UpdateWrapper<YwLinePoint> deleteWrapper = new UpdateWrapper<>(ywLinePoint);
+        ywLinePointMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywLinePointMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwLinePoint ywLinePoint) {
+        ywLinePointMapper.updateById(ywLinePoint);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwLinePoint> ywLinePoints) {
+        if (CollectionUtils.isEmpty(ywLinePoints)) {
+            return;
+        }
+        for (YwLinePoint ywLinePoint: ywLinePoints) {
+            this.updateById(ywLinePoint);
+        }
+    }
+
+    @Override
+    public YwLinePoint findById(Integer id) {
+        return ywLinePointMapper.selectById(id);
+    }
+
+    @Override
+    public YwLinePoint findOne(YwLinePoint ywLinePoint) {
+        QueryWrapper<YwLinePoint> wrapper = new QueryWrapper<>(ywLinePoint);
+        return ywLinePointMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwLinePoint> findList(YwLinePoint ywLinePoint) {
+        QueryWrapper<YwLinePoint> wrapper = new QueryWrapper<>(ywLinePoint);
+        return ywLinePointMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwLinePoint> findPage(PageWrap<YwLinePoint> pageWrap) {
+        IPage<YwLinePoint> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwLinePoint> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwLinePoint::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwLinePoint::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwLinePoint::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwLinePoint::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getLineId() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getLineId, pageWrap.getModel().getLineId());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getPointId() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getPointId, pageWrap.getModel().getPointId());
+        }
+        if (pageWrap.getModel().getNeedScancode() != null) {
+            queryWrapper.lambda().eq(YwLinePoint::getNeedScancode, pageWrap.getModel().getNeedScancode());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywLinePointMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwLinePoint ywLinePoint) {
+        QueryWrapper<YwLinePoint> wrapper = new QueryWrapper<>(ywLinePoint);
+        return ywLinePointMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
new file mode 100644
index 0000000..9b12603
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
@@ -0,0 +1,142 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwPatrolLineMapper;
+import com.doumee.dao.business.model.YwPatrolLine;
+import com.doumee.service.business.YwPatrolLineService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃璺嚎淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwPatrolLineServiceImpl implements YwPatrolLineService {
+
+    @Autowired
+    private YwPatrolLineMapper ywPatrolLineMapper;
+
+    @Override
+    public Integer create(YwPatrolLine ywPatrolLine) {
+        ywPatrolLineMapper.insert(ywPatrolLine);
+        return ywPatrolLine.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywPatrolLineMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwPatrolLine ywPatrolLine) {
+        UpdateWrapper<YwPatrolLine> deleteWrapper = new UpdateWrapper<>(ywPatrolLine);
+        ywPatrolLineMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywPatrolLineMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwPatrolLine ywPatrolLine) {
+        ywPatrolLineMapper.updateById(ywPatrolLine);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwPatrolLine> ywPatrolLines) {
+        if (CollectionUtils.isEmpty(ywPatrolLines)) {
+            return;
+        }
+        for (YwPatrolLine ywPatrolLine: ywPatrolLines) {
+            this.updateById(ywPatrolLine);
+        }
+    }
+
+    @Override
+    public YwPatrolLine findById(Integer id) {
+        return ywPatrolLineMapper.selectById(id);
+    }
+
+    @Override
+    public YwPatrolLine findOne(YwPatrolLine ywPatrolLine) {
+        QueryWrapper<YwPatrolLine> wrapper = new QueryWrapper<>(ywPatrolLine);
+        return ywPatrolLineMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwPatrolLine> findList(YwPatrolLine ywPatrolLine) {
+        QueryWrapper<YwPatrolLine> wrapper = new QueryWrapper<>(ywPatrolLine);
+        return ywPatrolLineMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwPatrolLine> findPage(PageWrap<YwPatrolLine> pageWrap) {
+        IPage<YwPatrolLine> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwPatrolLine> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolLine::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwPatrolLine::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolLine::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwPatrolLine::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getImgurl() != null) {
+            queryWrapper.lambda().eq(YwPatrolLine::getImgurl, pageWrap.getModel().getImgurl());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywPatrolLineMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwPatrolLine ywPatrolLine) {
+        QueryWrapper<YwPatrolLine> wrapper = new QueryWrapper<>(ywPatrolLine);
+        return ywPatrolLineMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
new file mode 100644
index 0000000..5174aaf
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
@@ -0,0 +1,148 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwPatrolPointMapper;
+import com.doumee.dao.business.model.YwPatrolPoint;
+import com.doumee.service.business.YwPatrolPointService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃鐐逛俊鎭〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwPatrolPointServiceImpl implements YwPatrolPointService {
+
+    @Autowired
+    private YwPatrolPointMapper ywPatrolPointMapper;
+
+    @Override
+    public Integer create(YwPatrolPoint ywPatrolPoint) {
+        ywPatrolPointMapper.insert(ywPatrolPoint);
+        return ywPatrolPoint.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywPatrolPointMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwPatrolPoint ywPatrolPoint) {
+        UpdateWrapper<YwPatrolPoint> deleteWrapper = new UpdateWrapper<>(ywPatrolPoint);
+        ywPatrolPointMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywPatrolPointMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwPatrolPoint ywPatrolPoint) {
+        ywPatrolPointMapper.updateById(ywPatrolPoint);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwPatrolPoint> ywPatrolPoints) {
+        if (CollectionUtils.isEmpty(ywPatrolPoints)) {
+            return;
+        }
+        for (YwPatrolPoint ywPatrolPoint: ywPatrolPoints) {
+            this.updateById(ywPatrolPoint);
+        }
+    }
+
+    @Override
+    public YwPatrolPoint findById(Integer id) {
+        return ywPatrolPointMapper.selectById(id);
+    }
+
+    @Override
+    public YwPatrolPoint findOne(YwPatrolPoint ywPatrolPoint) {
+        QueryWrapper<YwPatrolPoint> wrapper = new QueryWrapper<>(ywPatrolPoint);
+        return ywPatrolPointMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwPatrolPoint> findList(YwPatrolPoint ywPatrolPoint) {
+        QueryWrapper<YwPatrolPoint> wrapper = new QueryWrapper<>(ywPatrolPoint);
+        return ywPatrolPointMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwPatrolPoint> findPage(PageWrap<YwPatrolPoint> pageWrap) {
+        IPage<YwPatrolPoint> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwPatrolPoint> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolPoint::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwPatrolPoint::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolPoint::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwPatrolPoint::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getImgurl() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getImgurl, pageWrap.getModel().getImgurl());
+        }
+        if (pageWrap.getModel().getAreaId() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getAreaId, pageWrap.getModel().getAreaId());
+        }
+        if (pageWrap.getModel().getAddr() != null) {
+            queryWrapper.lambda().eq(YwPatrolPoint::getAddr, pageWrap.getModel().getAddr());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywPatrolPointMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwPatrolPoint ywPatrolPoint) {
+        QueryWrapper<YwPatrolPoint> wrapper = new QueryWrapper<>(ywPatrolPoint);
+        return ywPatrolPointMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
new file mode 100644
index 0000000..2b4e432
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
@@ -0,0 +1,178 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwPatrolSchemeMapper;
+import com.doumee.dao.business.model.YwPatrolScheme;
+import com.doumee.service.business.YwPatrolSchemeService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃璁″垝淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwPatrolSchemeServiceImpl implements YwPatrolSchemeService {
+
+    @Autowired
+    private YwPatrolSchemeMapper ywPatrolSchemeMapper;
+
+    @Override
+    public Integer create(YwPatrolScheme ywPatrolScheme) {
+        ywPatrolSchemeMapper.insert(ywPatrolScheme);
+        return ywPatrolScheme.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywPatrolSchemeMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwPatrolScheme ywPatrolScheme) {
+        UpdateWrapper<YwPatrolScheme> deleteWrapper = new UpdateWrapper<>(ywPatrolScheme);
+        ywPatrolSchemeMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywPatrolSchemeMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwPatrolScheme ywPatrolScheme) {
+        ywPatrolSchemeMapper.updateById(ywPatrolScheme);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwPatrolScheme> ywPatrolSchemes) {
+        if (CollectionUtils.isEmpty(ywPatrolSchemes)) {
+            return;
+        }
+        for (YwPatrolScheme ywPatrolScheme: ywPatrolSchemes) {
+            this.updateById(ywPatrolScheme);
+        }
+    }
+
+    @Override
+    public YwPatrolScheme findById(Integer id) {
+        return ywPatrolSchemeMapper.selectById(id);
+    }
+
+    @Override
+    public YwPatrolScheme findOne(YwPatrolScheme ywPatrolScheme) {
+        QueryWrapper<YwPatrolScheme> wrapper = new QueryWrapper<>(ywPatrolScheme);
+        return ywPatrolSchemeMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwPatrolScheme> findList(YwPatrolScheme ywPatrolScheme) {
+        QueryWrapper<YwPatrolScheme> wrapper = new QueryWrapper<>(ywPatrolScheme);
+        return ywPatrolSchemeMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwPatrolScheme> findPage(PageWrap<YwPatrolScheme> pageWrap) {
+        IPage<YwPatrolScheme> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwPatrolScheme> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolScheme::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwPatrolScheme::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolScheme::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwPatrolScheme::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getTitle() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getLineId() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getLineId, pageWrap.getModel().getLineId());
+        }
+        if (pageWrap.getModel().getUserIds() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getUserIds, pageWrap.getModel().getUserIds());
+        }
+        if (pageWrap.getModel().getDealUserId() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getDealUserId, pageWrap.getModel().getDealUserId());
+        }
+        if (pageWrap.getModel().getDealDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolScheme::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
+            queryWrapper.lambda().le(YwPatrolScheme::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
+        }
+        if (pageWrap.getModel().getDealInfo() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getDealInfo, pageWrap.getModel().getDealInfo());
+        }
+        if (pageWrap.getModel().getCircleType() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getCircleType, pageWrap.getModel().getCircleType());
+        }
+        if (pageWrap.getModel().getCircleDays() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getCircleDays, pageWrap.getModel().getCircleDays());
+        }
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolScheme::getStartDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()));
+            queryWrapper.lambda().le(YwPatrolScheme::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getStartDate()));
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolScheme::getEndDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()));
+            queryWrapper.lambda().le(YwPatrolScheme::getEndDate, Utils.Date.getEnd(pageWrap.getModel().getEndDate()));
+        }
+        if (pageWrap.getModel().getStartTime() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getStartTime, pageWrap.getModel().getStartTime());
+        }
+        if (pageWrap.getModel().getEndTime() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getEndTime, pageWrap.getModel().getEndTime());
+        }
+        if (pageWrap.getModel().getProcessStatus() != null) {
+            queryWrapper.lambda().eq(YwPatrolScheme::getProcessStatus, pageWrap.getModel().getProcessStatus());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywPatrolSchemeMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwPatrolScheme ywPatrolScheme) {
+        QueryWrapper<YwPatrolScheme> wrapper = new QueryWrapper<>(ywPatrolScheme);
+        return ywPatrolSchemeMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
new file mode 100644
index 0000000..20307e3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
@@ -0,0 +1,169 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwPatrolTaskMapper;
+import com.doumee.dao.business.model.YwPatrolTask;
+import com.doumee.service.business.YwPatrolTaskService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮宸℃浠诲姟淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwPatrolTaskServiceImpl implements YwPatrolTaskService {
+
+    @Autowired
+    private YwPatrolTaskMapper ywPatrolTaskMapper;
+
+    @Override
+    public Integer create(YwPatrolTask ywPatrolTask) {
+        ywPatrolTaskMapper.insert(ywPatrolTask);
+        return ywPatrolTask.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywPatrolTaskMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwPatrolTask ywPatrolTask) {
+        UpdateWrapper<YwPatrolTask> deleteWrapper = new UpdateWrapper<>(ywPatrolTask);
+        ywPatrolTaskMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywPatrolTaskMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwPatrolTask ywPatrolTask) {
+        ywPatrolTaskMapper.updateById(ywPatrolTask);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwPatrolTask> ywPatrolTasks) {
+        if (CollectionUtils.isEmpty(ywPatrolTasks)) {
+            return;
+        }
+        for (YwPatrolTask ywPatrolTask: ywPatrolTasks) {
+            this.updateById(ywPatrolTask);
+        }
+    }
+
+    @Override
+    public YwPatrolTask findById(Integer id) {
+        return ywPatrolTaskMapper.selectById(id);
+    }
+
+    @Override
+    public YwPatrolTask findOne(YwPatrolTask ywPatrolTask) {
+        QueryWrapper<YwPatrolTask> wrapper = new QueryWrapper<>(ywPatrolTask);
+        return ywPatrolTaskMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwPatrolTask> findList(YwPatrolTask ywPatrolTask) {
+        QueryWrapper<YwPatrolTask> wrapper = new QueryWrapper<>(ywPatrolTask);
+        return ywPatrolTaskMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwPatrolTask> findPage(PageWrap<YwPatrolTask> pageWrap) {
+        IPage<YwPatrolTask> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwPatrolTask> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolTask::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwPatrolTask::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolTask::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwPatrolTask::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getTitle() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getSchemeId() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getSchemeId, pageWrap.getModel().getSchemeId());
+        }
+        if (pageWrap.getModel().getPointId() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getPointId, pageWrap.getModel().getPointId());
+        }
+        if (pageWrap.getModel().getDealUserId() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getDealUserId, pageWrap.getModel().getDealUserId());
+        }
+        if (pageWrap.getModel().getDealDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolTask::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
+            queryWrapper.lambda().le(YwPatrolTask::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
+        }
+        if (pageWrap.getModel().getDealInfo() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getDealInfo, pageWrap.getModel().getDealInfo());
+        }
+        if (pageWrap.getModel().getCircleType() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getCircleType, pageWrap.getModel().getCircleType());
+        }
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolTask::getStartDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()));
+            queryWrapper.lambda().le(YwPatrolTask::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getStartDate()));
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().ge(YwPatrolTask::getEndDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()));
+            queryWrapper.lambda().le(YwPatrolTask::getEndDate, Utils.Date.getEnd(pageWrap.getModel().getEndDate()));
+        }
+        if (pageWrap.getModel().getDealStatus() != null) {
+            queryWrapper.lambda().eq(YwPatrolTask::getDealStatus, pageWrap.getModel().getDealStatus());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywPatrolTaskMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwPatrolTask ywPatrolTask) {
+        QueryWrapper<YwPatrolTask> wrapper = new QueryWrapper<>(ywPatrolTask);
+        return ywPatrolTaskMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
new file mode 100644
index 0000000..808d9b1
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
@@ -0,0 +1,148 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwProjectMapper;
+import com.doumee.dao.business.model.YwProject;
+import com.doumee.service.business.YwProjectService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮椤圭洰淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwProjectServiceImpl implements YwProjectService {
+
+    @Autowired
+    private YwProjectMapper ywProjectMapper;
+
+    @Override
+    public Integer create(YwProject ywProject) {
+        ywProjectMapper.insert(ywProject);
+        return ywProject.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywProjectMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwProject ywProject) {
+        UpdateWrapper<YwProject> deleteWrapper = new UpdateWrapper<>(ywProject);
+        ywProjectMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywProjectMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwProject ywProject) {
+        ywProjectMapper.updateById(ywProject);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwProject> ywProjects) {
+        if (CollectionUtils.isEmpty(ywProjects)) {
+            return;
+        }
+        for (YwProject ywProject: ywProjects) {
+            this.updateById(ywProject);
+        }
+    }
+
+    @Override
+    public YwProject findById(Integer id) {
+        return ywProjectMapper.selectById(id);
+    }
+
+    @Override
+    public YwProject findOne(YwProject ywProject) {
+        QueryWrapper<YwProject> wrapper = new QueryWrapper<>(ywProject);
+        return ywProjectMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwProject> findList(YwProject ywProject) {
+        QueryWrapper<YwProject> wrapper = new QueryWrapper<>(ywProject);
+        return ywProjectMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwProject> findPage(PageWrap<YwProject> pageWrap) {
+        IPage<YwProject> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwProject> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwProject::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwProject::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwProject::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwProject::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwProject::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwProject::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwProject::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwProject::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwProject::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwProject::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwProject::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwProject::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getImgurl() != null) {
+            queryWrapper.lambda().eq(YwProject::getImgurl, pageWrap.getModel().getImgurl());
+        }
+        if (pageWrap.getModel().getAreaId() != null) {
+            queryWrapper.lambda().eq(YwProject::getAreaId, pageWrap.getModel().getAreaId());
+        }
+        if (pageWrap.getModel().getAddr() != null) {
+            queryWrapper.lambda().eq(YwProject::getAddr, pageWrap.getModel().getAddr());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywProjectMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwProject ywProject) {
+        QueryWrapper<YwProject> wrapper = new QueryWrapper<>(ywProject);
+        return ywProjectMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
new file mode 100644
index 0000000..29fa036
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
@@ -0,0 +1,169 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwRoomMapper;
+import com.doumee.dao.business.model.YwRoom;
+import com.doumee.service.business.YwRoomService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮鎴挎簮淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwRoomServiceImpl implements YwRoomService {
+
+    @Autowired
+    private YwRoomMapper ywRoomMapper;
+
+    @Override
+    public Integer create(YwRoom ywRoom) {
+        ywRoomMapper.insert(ywRoom);
+        return ywRoom.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywRoomMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwRoom ywRoom) {
+        UpdateWrapper<YwRoom> deleteWrapper = new UpdateWrapper<>(ywRoom);
+        ywRoomMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywRoomMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwRoom ywRoom) {
+        ywRoomMapper.updateById(ywRoom);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwRoom> ywRooms) {
+        if (CollectionUtils.isEmpty(ywRooms)) {
+            return;
+        }
+        for (YwRoom ywRoom: ywRooms) {
+            this.updateById(ywRoom);
+        }
+    }
+
+    @Override
+    public YwRoom findById(Integer id) {
+        return ywRoomMapper.selectById(id);
+    }
+
+    @Override
+    public YwRoom findOne(YwRoom ywRoom) {
+        QueryWrapper<YwRoom> wrapper = new QueryWrapper<>(ywRoom);
+        return ywRoomMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwRoom> findList(YwRoom ywRoom) {
+        QueryWrapper<YwRoom> wrapper = new QueryWrapper<>(ywRoom);
+        return ywRoomMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwRoom> findPage(PageWrap<YwRoom> pageWrap) {
+        IPage<YwRoom> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwRoom> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwRoom::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwRoom::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwRoom::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwRoom::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwRoom::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwRoom::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwRoom::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwRoom::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwRoom::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwRoom::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwRoom::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwRoom::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getImgurl() != null) {
+            queryWrapper.lambda().eq(YwRoom::getImgurl, pageWrap.getModel().getImgurl());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(YwRoom::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getRoomNum() != null) {
+            queryWrapper.lambda().eq(YwRoom::getRoomNum, pageWrap.getModel().getRoomNum());
+        }
+        if (pageWrap.getModel().getIsInvestment() != null) {
+            queryWrapper.lambda().eq(YwRoom::getIsInvestment, pageWrap.getModel().getIsInvestment());
+        }
+        if (pageWrap.getModel().getArea() != null) {
+            queryWrapper.lambda().eq(YwRoom::getArea, pageWrap.getModel().getArea());
+        }
+        if (pageWrap.getModel().getFeeArea() != null) {
+            queryWrapper.lambda().eq(YwRoom::getFeeArea, pageWrap.getModel().getFeeArea());
+        }
+        if (pageWrap.getModel().getRentArea() != null) {
+            queryWrapper.lambda().eq(YwRoom::getRentArea, pageWrap.getModel().getRentArea());
+        }
+        if (pageWrap.getModel().getFloor() != null) {
+            queryWrapper.lambda().eq(YwRoom::getFloor, pageWrap.getModel().getFloor());
+        }
+        if (pageWrap.getModel().getProjectId() != null) {
+            queryWrapper.lambda().eq(YwRoom::getProjectId, pageWrap.getModel().getProjectId());
+        }
+        if (pageWrap.getModel().getBuildingId() != null) {
+            queryWrapper.lambda().eq(YwRoom::getBuildingId, pageWrap.getModel().getBuildingId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywRoomMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwRoom ywRoom) {
+        QueryWrapper<YwRoom> wrapper = new QueryWrapper<>(ywRoom);
+        return ywRoomMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
new file mode 100644
index 0000000..0223ac9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
@@ -0,0 +1,200 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwWorkorderMapper;
+import com.doumee.dao.business.model.YwWorkorder;
+import com.doumee.service.business.YwWorkorderService;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 杩愮淮宸ュ崟淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/11/19 16:07
+ */
+@Service
+public class YwWorkorderServiceImpl implements YwWorkorderService {
+
+    @Autowired
+    private YwWorkorderMapper ywWorkorderMapper;
+
+    @Override
+    public Integer create(YwWorkorder ywWorkorder) {
+        ywWorkorderMapper.insert(ywWorkorder);
+        return ywWorkorder.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywWorkorderMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwWorkorder ywWorkorder) {
+        UpdateWrapper<YwWorkorder> deleteWrapper = new UpdateWrapper<>(ywWorkorder);
+        ywWorkorderMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywWorkorderMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwWorkorder ywWorkorder) {
+        ywWorkorderMapper.updateById(ywWorkorder);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwWorkorder> ywWorkorders) {
+        if (CollectionUtils.isEmpty(ywWorkorders)) {
+            return;
+        }
+        for (YwWorkorder ywWorkorder: ywWorkorders) {
+            this.updateById(ywWorkorder);
+        }
+    }
+
+    @Override
+    public YwWorkorder findById(Integer id) {
+        return ywWorkorderMapper.selectById(id);
+    }
+
+    @Override
+    public YwWorkorder findOne(YwWorkorder ywWorkorder) {
+        QueryWrapper<YwWorkorder> wrapper = new QueryWrapper<>(ywWorkorder);
+        return ywWorkorderMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwWorkorder> findList(YwWorkorder ywWorkorder) {
+        QueryWrapper<YwWorkorder> wrapper = new QueryWrapper<>(ywWorkorder);
+        return ywWorkorderMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwWorkorder> findPage(PageWrap<YwWorkorder> pageWrap) {
+        IPage<YwWorkorder> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwWorkorder> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwWorkorder::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwWorkorder::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwWorkorder::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwWorkorder::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getTitle() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getGetDate() != null) {
+            queryWrapper.lambda().ge(YwWorkorder::getGetDate, Utils.Date.getStart(pageWrap.getModel().getGetDate()));
+            queryWrapper.lambda().le(YwWorkorder::getGetDate, Utils.Date.getEnd(pageWrap.getModel().getGetDate()));
+        }
+        if (pageWrap.getModel().getProjectId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getProjectId, pageWrap.getModel().getProjectId());
+        }
+        if (pageWrap.getModel().getBuildingId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getBuildingId, pageWrap.getModel().getBuildingId());
+        }
+        if (pageWrap.getModel().getRoomId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getRoomId, pageWrap.getModel().getRoomId());
+        }
+        if (pageWrap.getModel().getUserId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getUserId, pageWrap.getModel().getUserId());
+        }
+        if (pageWrap.getModel().getPhone() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getPhone, pageWrap.getModel().getPhone());
+        }
+        if (pageWrap.getModel().getSubmitDate() != null) {
+            queryWrapper.lambda().ge(YwWorkorder::getSubmitDate, Utils.Date.getStart(pageWrap.getModel().getSubmitDate()));
+            queryWrapper.lambda().le(YwWorkorder::getSubmitDate, Utils.Date.getEnd(pageWrap.getModel().getSubmitDate()));
+        }
+        if (pageWrap.getModel().getCateId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getCateId, pageWrap.getModel().getCateId());
+        }
+        if (pageWrap.getModel().getAreaType() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getAreaType, pageWrap.getModel().getAreaType());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getDealStatus() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getDealStatus, pageWrap.getModel().getDealStatus());
+        }
+        if (pageWrap.getModel().getDispatchUserId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getDispatchUserId, pageWrap.getModel().getDispatchUserId());
+        }
+        if (pageWrap.getModel().getDispatchDate() != null) {
+            queryWrapper.lambda().ge(YwWorkorder::getDispatchDate, Utils.Date.getStart(pageWrap.getModel().getDispatchDate()));
+            queryWrapper.lambda().le(YwWorkorder::getDispatchDate, Utils.Date.getEnd(pageWrap.getModel().getDispatchDate()));
+        }
+        if (pageWrap.getModel().getDispatchInfo() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getDispatchInfo, pageWrap.getModel().getDispatchInfo());
+        }
+        if (pageWrap.getModel().getDealUserId() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getDealUserId, pageWrap.getModel().getDealUserId());
+        }
+        if (pageWrap.getModel().getDealDate() != null) {
+            queryWrapper.lambda().ge(YwWorkorder::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
+            queryWrapper.lambda().le(YwWorkorder::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
+        }
+        if (pageWrap.getModel().getDealInfo() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getDealInfo, pageWrap.getModel().getDealInfo());
+        }
+        if (pageWrap.getModel().getDealType() != null) {
+            queryWrapper.lambda().eq(YwWorkorder::getDealType, pageWrap.getModel().getDealType());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywWorkorderMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwWorkorder ywWorkorder) {
+        QueryWrapper<YwWorkorder> wrapper = new QueryWrapper<>(ywWorkorder);
+        return ywWorkorderMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/resources/application-testHS.yml.bck b/server/visits/dmvisit_service/src/main/resources/application-testHS.yml.bck
new file mode 100644
index 0000000..2680b48
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/resources/application-testHS.yml.bck
@@ -0,0 +1,81 @@
+spring:
+  # 鏁版嵁婧愰厤缃�
+  datasource:
+    url: jdbc:mysql://10.10.99.63:3306/visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: HS!20240227
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.alibaba.druid.pool.DruidDataSource
+  redis:
+    #    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: huasun618
+    timeout: 5000      # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+
+#rocketmq:
+#  namesrvAddr: rmq-cn-pe335rcnn06.cn-shanghai.rmq.aliyuncs.com:8080
+#  groupId: GID-wakatest
+#  topic: waka-test
+#  username: 4derRb4Sw5EkqUMI
+#  password: v50N97wf4av8Q8I4
+
+knife4j:
+  enable: true
+  basic:
+    enable: true
+    username: admin
+    password: 111111
+
+debug_model: true
+
+# Swagger閰嶇疆
+swagger:
+  host: dmtest.ahapp.net
+  title: ${project.name}鎺ュ彛鏂囨。
+  description: ${project.name}鎺ュ彛鏂囨。
+  enabled: true
+  context-path: /erp_interface
+  # 绂佺敤swagger鏃剁殑閲嶅畾鍚戝湴鍧�
+  redirect-uri: /
+
+########################鍚屾鏁版嵁妯″紡  ########################
+data-sync:
+  org-user-data-origin: 1 #缁勭粐鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
+  visitor-data-origin: 1 #璁垮鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
+  need-deal-img: true #鏄惁闇�瑕佸鐞嗗浘鐗囨暟鎹�
+
+########################寰俊鏀粯鐩稿叧閰嶇疆########################
+wx:
+  pay:
+    appId: wxfab6da18632e28de
+    appSecret: 4ee3b22afa90287834319fc3c1635271
+    mchId: 1229817002
+    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
+    notifyUrl: https://dmtest.ahapp.net/smartmeeting_interface/web/api/wxPayNotify
+    keyPath: /usr/local/apiclient_cert.p12
+
+tencent:
+  map:
+    remoteHost: https://apis.map.qq.com
+    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
+
+
+des_pwd: 123456SDFKDJF
+
+## MQTT##
+mqtt:
+  host: tcp://192.168.10.198:1883
+  userName: root
+  passWord: 123456
+  qos: 1
+  clientId: ClientId_local #ClientId_local蹇呴』鍞竴 姣斿浣犲凡缁忓畾浜嗗彨ABC  閭d綘灏变竴鐩村彨ABC  鍏朵粬鍦版柟灏变笉瑕佷娇鐢ˋBC浜�
+  timeout: 10
+  keepalive: 20
+  topic1: A/pick/warn/#  #绗﹀彿鏄唬琛ㄦ暣涓獁arn涓嬮潰鐨勫叏閮ㄥ瓙涓婚 娌℃湁鐞嗚В鐨勮瘽 鍙互鐧惧害浠旂粏鐞嗚В涓�涓�
+  topic2: A/cmd/resp
+  topic3: ABCF
+  topic4: ABCH
diff --git a/server/visits/dmvisit_service/src/main/resources/application-testYL.yml b/server/visits/dmvisit_service/src/main/resources/application-testYL.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/resources/application-testYL.yml

--
Gitblit v1.9.3