From 534219a0336019451f1761b279eadce2c32b650b Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期日, 28 九月 2025 10:08:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao

---
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleDetailServiceImpl.java |  148 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java                |   91 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningCloudController.java                   |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkKeysService.java                     |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java               |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetGridController.java                 |   90 
 server/db/business.jk_sketch_customer.permissions.sql                                                          |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java                    |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchLineServiceImpl.java      |  149 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningController.java                       |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleDetailCloudController.java         |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchMapper.java                        |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkOrdersServiceImpl.java          |  152 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java            |  151 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java           |  167 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java                 |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchCustomerController.java              |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java                 |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java                   |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java                    |   89 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkOrdersController.java                      |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkOrders.java                        |   82 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java          |  152 +
 server/db/business.jk_sketch_line.permissions.sql                                                              |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java             |   91 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCloudController.java                  |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetMapper.java                       |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchCustomerServiceImpl.java  |  149 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketch.java                        |   82 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java            |  148 +
 server/db/business.warning_rule_detail.permissions.sql                                                         |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkIccardMapper.java                        |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchLineMapper.java                    |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningService.java                    |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleMapper.java                     |   12 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleController.java                   |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java                          |   12 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningPushCloudController.java               |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java                          |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningPushService.java                |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java                   |   77 
 server/db/business.jk_keys.permissions.sql                                                                     |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCustomerController.java                    |   90 
 server/db/business.jk_cabinet.permissions.sql                                                                  |    6 
 server/db/business.jk_sketch.permissions.sql                                                                   |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningPushServiceImpl.java       |  161 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java              |  100 
 server/db/business.jk_cabinet_log.permissions.sql                                                              |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningPushController.java                   |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleDetailMapper.java               |   12 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetLogController.java                  |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningMapper.java                         |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkVersionServiceImpl.java         |  154 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkVersionCloudController.java                 |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchLineService.java               |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleServiceImpl.java       |  145 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java                          |   81 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchCustomer.java                |   78 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java              |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningPushMapper.java                     |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java                          |   77 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchCustomerMapper.java                |   12 
 server/db/business.jk_orders.permissions.sql                                                                   |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkIccardController.java                      |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java               |   77 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java                     |   94 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkOrdersService.java                   |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkOrdersMapper.java                        |   12 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchLineController.java                  |   90 
 server/db/business.jk_customer.permissions.sql                                                                 |    6 
 server/db/business.jk_cabinet_grid.permissions.sql                                                             |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Warning.java                         |  102 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkLineController.java                        |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleCloudController.java               |   91 
 server/db/business.warning_push.permissions.sql                                                                |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java          |  145 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java        |  157 +
 server/db/business.warning.permissions.sql                                                                     |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCustomerCloudController.java          |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java                    |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java                      |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java                       |   85 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkVersionService.java                  |   97 
 server/db/business.warning_rule.permissions.sql                                                                |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkVersionMapper.java                       |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java      |  157 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java                    |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleDetailService.java          |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleDetailController.java             |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java     |  148 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java                        |   73 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchService.java                   |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java                      |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java                     |   73 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchController.java                      |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkOrdersCloudController.java                  |   91 
 server/db/business.jk_version.permissions.sql                                                                  |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java                   |   97 
 server/db/business.jk_line.permissions.sql                                                                     |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java                       |  139 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java         |  194 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetController.java                     |   90 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchCustomerService.java           |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchLine.java                    |   78 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleService.java                |   97 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java                     |   97 
 server/db/business.jk_iccard.permissions.sql                                                                   |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkVersionController.java                     |   90 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchLineCloudController.java              |   91 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkIccardCloudController.java                  |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java                  |   97 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkKeysController.java                        |   90 
 112 files changed, 8,593 insertions(+), 0 deletions(-)

diff --git a/server/db/business.jk_cabinet.permissions.sql b/server/db/business.jk_cabinet.permissions.sql
new file mode 100644
index 0000000..86ac27b
--- /dev/null
+++ b/server/db/business.jk_cabinet.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:jkcabinet: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:jkcabinet: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:jkcabinet: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:jkcabinet: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:jkcabinet:exportExcel', '瀵煎嚭閽ュ寵鏌滃熀鏈俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_cabinet_grid.permissions.sql b/server/db/business.jk_cabinet_grid.permissions.sql
new file mode 100644
index 0000000..95ce5f9
--- /dev/null
+++ b/server/db/business.jk_cabinet_grid.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:jkcabinetgrid: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:jkcabinetgrid: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:jkcabinetgrid: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:jkcabinetgrid: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:jkcabinetgrid:exportExcel', '瀵煎嚭閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_cabinet_log.permissions.sql b/server/db/business.jk_cabinet_log.permissions.sql
new file mode 100644
index 0000000..1018480
--- /dev/null
+++ b/server/db/business.jk_cabinet_log.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:jkcabinetlog: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:jkcabinetlog: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:jkcabinetlog: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:jkcabinetlog: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:jkcabinetlog:exportExcel', '瀵煎嚭閽ュ寵鏌滃紑鍏抽棬璁板綍(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_customer.permissions.sql b/server/db/business.jk_customer.permissions.sql
new file mode 100644
index 0000000..5d33ec2
--- /dev/null
+++ b/server/db/business.jk_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:jkcustomer: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:jkcustomer: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:jkcustomer: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:jkcustomer: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:jkcustomer:exportExcel', '瀵煎嚭浜ゆ帶-瀹㈡埛淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_iccard.permissions.sql b/server/db/business.jk_iccard.permissions.sql
new file mode 100644
index 0000000..9771b08
--- /dev/null
+++ b/server/db/business.jk_iccard.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:jkiccard:create', '鏂板缓閽ュ寵鏌淚C鍗′俊鎭〃', '', 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:jkiccard:delete', '鍒犻櫎閽ュ寵鏌淚C鍗′俊鎭〃', '', 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:jkiccard:update', '淇敼閽ュ寵鏌淚C鍗′俊鎭〃', '', 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:jkiccard:query', '鏌ヨ閽ュ寵鏌淚C鍗′俊鎭〃', '', 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:jkiccard:exportExcel', '瀵煎嚭閽ュ寵鏌淚C鍗′俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_keys.permissions.sql b/server/db/business.jk_keys.permissions.sql
new file mode 100644
index 0000000..95fbde4
--- /dev/null
+++ b/server/db/business.jk_keys.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:jkkeys: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:jkkeys: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:jkkeys: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:jkkeys: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:jkkeys:exportExcel', '瀵煎嚭閽ュ寵鍩烘湰淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_line.permissions.sql b/server/db/business.jk_line.permissions.sql
new file mode 100644
index 0000000..2ed4abf
--- /dev/null
+++ b/server/db/business.jk_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:jkline: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:jkline: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:jkline: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:jkline: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:jkline:exportExcel', '瀵煎嚭浜ゆ帶-绾胯矾淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_orders.permissions.sql b/server/db/business.jk_orders.permissions.sql
new file mode 100644
index 0000000..4423bce
--- /dev/null
+++ b/server/db/business.jk_orders.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:jkorders: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:jkorders: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:jkorders: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:jkorders: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:jkorders:exportExcel', '瀵煎嚭浜ゆ帶-閿�鍞鍗曚俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_sketch.permissions.sql b/server/db/business.jk_sketch.permissions.sql
new file mode 100644
index 0000000..7a57bcf
--- /dev/null
+++ b/server/db/business.jk_sketch.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:jksketch: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:jksketch: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:jksketch: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:jksketch: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:jksketch:exportExcel', '瀵煎嚭浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_sketch_customer.permissions.sql b/server/db/business.jk_sketch_customer.permissions.sql
new file mode 100644
index 0000000..ac3c9f3
--- /dev/null
+++ b/server/db/business.jk_sketch_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:jksketchcustomer: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:jksketchcustomer: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:jksketchcustomer: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:jksketchcustomer: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:jksketchcustomer:exportExcel', '瀵煎嚭浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_sketch_line.permissions.sql b/server/db/business.jk_sketch_line.permissions.sql
new file mode 100644
index 0000000..3c91fcd
--- /dev/null
+++ b/server/db/business.jk_sketch_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:jksketchline: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:jksketchline: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:jksketchline: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:jksketchline: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:jksketchline:exportExcel', '瀵煎嚭浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.jk_version.permissions.sql b/server/db/business.jk_version.permissions.sql
new file mode 100644
index 0000000..bd312ea
--- /dev/null
+++ b/server/db/business.jk_version.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:jkversion: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:jkversion: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:jkversion: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:jkversion: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:jkversion:exportExcel', '瀵煎嚭浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.warning.permissions.sql b/server/db/business.warning.permissions.sql
new file mode 100644
index 0000000..ad64372
--- /dev/null
+++ b/server/db/business.warning.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:warning: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:warning: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:warning: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:warning: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:warning:exportExcel', '瀵煎嚭鎶ヨ璁板綍淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.warning_push.permissions.sql b/server/db/business.warning_push.permissions.sql
new file mode 100644
index 0000000..efbb388
--- /dev/null
+++ b/server/db/business.warning_push.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:warningpush: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:warningpush: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:warningpush: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:warningpush: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:warningpush:exportExcel', '瀵煎嚭鎶ヨ鎺ㄩ�佽褰�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.warning_rule.permissions.sql b/server/db/business.warning_rule.permissions.sql
new file mode 100644
index 0000000..dd7d01b
--- /dev/null
+++ b/server/db/business.warning_rule.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:warningrule: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:warningrule: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:warningrule: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:warningrule: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:warningrule:exportExcel', '瀵煎嚭鎶ヨ瑙勫垯閰嶇疆琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.warning_rule_detail.permissions.sql b/server/db/business.warning_rule_detail.permissions.sql
new file mode 100644
index 0000000..bbaeeff
--- /dev/null
+++ b/server/db/business.warning_rule_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:warningruledetail: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:warningruledetail: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:warningruledetail: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:warningruledetail: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:warningruledetail:exportExcel', '瀵煎嚭鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetController.java
new file mode 100644
index 0000000..960d4e4
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkCabinet;
+import com.doumee.service.business.JkCabinetService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌滃熀鏈俊鎭〃")
+@RestController
+@RequestMapping("/business/jkCabinet")
+public class JkCabinetController extends BaseController {
+
+    @Autowired
+    private JkCabinetService jkCabinetService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkcabinet:create")
+    public ApiResponse create(@RequestBody JkCabinet jkCabinet) {
+        return ApiResponse.success(jkCabinetService.create(jkCabinet));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkcabinet:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCabinetService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkcabinet: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));
+        }
+        jkCabinetService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkcabinet:update")
+    public ApiResponse updateById(@RequestBody JkCabinet jkCabinet) {
+        jkCabinetService.updateById(jkCabinet);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkcabinet:query")
+    public ApiResponse<PageData<JkCabinet>> findPage (@RequestBody PageWrap<JkCabinet> pageWrap) {
+        return ApiResponse.success(jkCabinetService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkcabinet:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCabinet> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCabinet.class).export(jkCabinetService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滃熀鏈俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkcabinet:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCabinetService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetGridController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetGridController.java
new file mode 100644
index 0000000..5e5e626
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetGridController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkCabinetGrid;
+import com.doumee.service.business.JkCabinetGridService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃")
+@RestController
+@RequestMapping("/business/jkCabinetGrid")
+public class JkCabinetGridController extends BaseController {
+
+    @Autowired
+    private JkCabinetGridService jkCabinetGridService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkcabinetgrid:create")
+    public ApiResponse create(@RequestBody JkCabinetGrid jkCabinetGrid) {
+        return ApiResponse.success(jkCabinetGridService.create(jkCabinetGrid));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkcabinetgrid:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCabinetGridService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkcabinetgrid: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));
+        }
+        jkCabinetGridService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkcabinetgrid:update")
+    public ApiResponse updateById(@RequestBody JkCabinetGrid jkCabinetGrid) {
+        jkCabinetGridService.updateById(jkCabinetGrid);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkcabinetgrid:query")
+    public ApiResponse<PageData<JkCabinetGrid>> findPage (@RequestBody PageWrap<JkCabinetGrid> pageWrap) {
+        return ApiResponse.success(jkCabinetGridService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkcabinetgrid:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCabinetGrid> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCabinetGrid.class).export(jkCabinetGridService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkcabinetgrid:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCabinetGridService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetLogController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetLogController.java
new file mode 100644
index 0000000..1ef4779
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetLogController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkCabinetLog;
+import com.doumee.service.business.JkCabinetLogService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌滃紑鍏抽棬璁板綍")
+@RestController
+@RequestMapping("/business/jkCabinetLog")
+public class JkCabinetLogController extends BaseController {
+
+    @Autowired
+    private JkCabinetLogService jkCabinetLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkcabinetlog:create")
+    public ApiResponse create(@RequestBody JkCabinetLog jkCabinetLog) {
+        return ApiResponse.success(jkCabinetLogService.create(jkCabinetLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkcabinetlog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCabinetLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkcabinetlog: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));
+        }
+        jkCabinetLogService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkcabinetlog:update")
+    public ApiResponse updateById(@RequestBody JkCabinetLog jkCabinetLog) {
+        jkCabinetLogService.updateById(jkCabinetLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkcabinetlog:query")
+    public ApiResponse<PageData<JkCabinetLog>> findPage (@RequestBody PageWrap<JkCabinetLog> pageWrap) {
+        return ApiResponse.success(jkCabinetLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkcabinetlog:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCabinetLog> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCabinetLog.class).export(jkCabinetLogService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滃紑鍏抽棬璁板綍", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkcabinetlog:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCabinetLogService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCustomerController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCustomerController.java
new file mode 100644
index 0000000..84fba8f
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCustomerController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkCustomer;
+import com.doumee.service.business.JkCustomerService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-瀹㈡埛淇℃伅琛�")
+@RestController
+@RequestMapping("/business/jkCustomer")
+public class JkCustomerController extends BaseController {
+
+    @Autowired
+    private JkCustomerService jkCustomerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkcustomer:create")
+    public ApiResponse create(@RequestBody JkCustomer jkCustomer) {
+        return ApiResponse.success(jkCustomerService.create(jkCustomer));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkcustomer:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCustomerService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkcustomer: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));
+        }
+        jkCustomerService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkcustomer:update")
+    public ApiResponse updateById(@RequestBody JkCustomer jkCustomer) {
+        jkCustomerService.updateById(jkCustomer);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkcustomer:query")
+    public ApiResponse<PageData<JkCustomer>> findPage (@RequestBody PageWrap<JkCustomer> pageWrap) {
+        return ApiResponse.success(jkCustomerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkcustomer:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCustomer> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCustomer.class).export(jkCustomerService.findPage(pageWrap).getRecords(), "浜ゆ帶-瀹㈡埛淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkcustomer:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCustomerService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkIccardController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkIccardController.java
new file mode 100644
index 0000000..a7a6dab
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkIccardController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkIccard;
+import com.doumee.service.business.JkIccardService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌淚C鍗′俊鎭〃")
+@RestController
+@RequestMapping("/business/jkIccard")
+public class JkIccardController extends BaseController {
+
+    @Autowired
+    private JkIccardService jkIccardService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkiccard:create")
+    public ApiResponse create(@RequestBody JkIccard jkIccard) {
+        return ApiResponse.success(jkIccardService.create(jkIccard));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkiccard:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkIccardService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkiccard: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));
+        }
+        jkIccardService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkiccard:update")
+    public ApiResponse updateById(@RequestBody JkIccard jkIccard) {
+        jkIccardService.updateById(jkIccard);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkiccard:query")
+    public ApiResponse<PageData<JkIccard>> findPage (@RequestBody PageWrap<JkIccard> pageWrap) {
+        return ApiResponse.success(jkIccardService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkiccard:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkIccard> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkIccard.class).export(jkIccardService.findPage(pageWrap).getRecords(), "閽ュ寵鏌淚C鍗′俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkiccard:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkIccardService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkKeysController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkKeysController.java
new file mode 100644
index 0000000..e4ce914
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkKeysController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkKeys;
+import com.doumee.service.business.JkKeysService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鍩烘湰淇℃伅琛�")
+@RestController
+@RequestMapping("/business/jkKeys")
+public class JkKeysController extends BaseController {
+
+    @Autowired
+    private JkKeysService jkKeysService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkkeys:create")
+    public ApiResponse create(@RequestBody JkKeys jkKeys) {
+        return ApiResponse.success(jkKeysService.create(jkKeys));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkkeys:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkKeysService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkkeys: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));
+        }
+        jkKeysService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkkeys:update")
+    public ApiResponse updateById(@RequestBody JkKeys jkKeys) {
+        jkKeysService.updateById(jkKeys);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkkeys:query")
+    public ApiResponse<PageData<JkKeys>> findPage (@RequestBody PageWrap<JkKeys> pageWrap) {
+        return ApiResponse.success(jkKeysService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkkeys:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkKeys> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkKeys.class).export(jkKeysService.findPage(pageWrap).getRecords(), "閽ュ寵鍩烘湰淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkkeys:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkKeysService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkLineController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkLineController.java
new file mode 100644
index 0000000..316eccd
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkLineController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkLine;
+import com.doumee.service.business.JkLineService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾淇℃伅琛�")
+@RestController
+@RequestMapping("/business/jkLine")
+public class JkLineController extends BaseController {
+
+    @Autowired
+    private JkLineService jkLineService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkline:create")
+    public ApiResponse create(@RequestBody JkLine jkLine) {
+        return ApiResponse.success(jkLineService.create(jkLine));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkline:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkLineService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkline: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));
+        }
+        jkLineService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkline:update")
+    public ApiResponse updateById(@RequestBody JkLine jkLine) {
+        jkLineService.updateById(jkLine);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkline:query")
+    public ApiResponse<PageData<JkLine>> findPage (@RequestBody PageWrap<JkLine> pageWrap) {
+        return ApiResponse.success(jkLineService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkline:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkLine> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkLine.class).export(jkLineService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkline:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkLineService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkOrdersController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkOrdersController.java
new file mode 100644
index 0000000..ccfe9c3
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkOrdersController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkOrders;
+import com.doumee.service.business.JkOrdersService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-閿�鍞鍗曚俊鎭〃")
+@RestController
+@RequestMapping("/business/jkOrders")
+public class JkOrdersController extends BaseController {
+
+    @Autowired
+    private JkOrdersService jkOrdersService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkorders:create")
+    public ApiResponse create(@RequestBody JkOrders jkOrders) {
+        return ApiResponse.success(jkOrdersService.create(jkOrders));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkorders:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkOrdersService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkorders: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));
+        }
+        jkOrdersService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkorders:update")
+    public ApiResponse updateById(@RequestBody JkOrders jkOrders) {
+        jkOrdersService.updateById(jkOrders);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkorders:query")
+    public ApiResponse<PageData<JkOrders>> findPage (@RequestBody PageWrap<JkOrders> pageWrap) {
+        return ApiResponse.success(jkOrdersService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkorders:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkOrders> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkOrders.class).export(jkOrdersService.findPage(pageWrap).getRecords(), "浜ゆ帶-閿�鍞鍗曚俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkorders:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkOrdersService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchController.java
new file mode 100644
index 0000000..93d162e
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkSketch;
+import com.doumee.service.business.JkSketchService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping("/business/jkSketch")
+public class JkSketchController extends BaseController {
+
+    @Autowired
+    private JkSketchService jkSketchService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jksketch:create")
+    public ApiResponse create(@RequestBody JkSketch jkSketch) {
+        return ApiResponse.success(jkSketchService.create(jkSketch));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jksketch:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkSketchService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jksketch: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));
+        }
+        jkSketchService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jksketch:update")
+    public ApiResponse updateById(@RequestBody JkSketch jkSketch) {
+        jkSketchService.updateById(jkSketch);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jksketch:query")
+    public ApiResponse<PageData<JkSketch>> findPage (@RequestBody PageWrap<JkSketch> pageWrap) {
+        return ApiResponse.success(jkSketchService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jksketch:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkSketch> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkSketch.class).export(jkSketchService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jksketch:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkSketchService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchCustomerController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchCustomerController.java
new file mode 100644
index 0000000..3f75e9f
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchCustomerController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkSketchCustomer;
+import com.doumee.service.business.JkSketchCustomerService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping("/business/jkSketchCustomer")
+public class JkSketchCustomerController extends BaseController {
+
+    @Autowired
+    private JkSketchCustomerService jkSketchCustomerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jksketchcustomer:create")
+    public ApiResponse create(@RequestBody JkSketchCustomer jkSketchCustomer) {
+        return ApiResponse.success(jkSketchCustomerService.create(jkSketchCustomer));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jksketchcustomer:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkSketchCustomerService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jksketchcustomer: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));
+        }
+        jkSketchCustomerService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jksketchcustomer:update")
+    public ApiResponse updateById(@RequestBody JkSketchCustomer jkSketchCustomer) {
+        jkSketchCustomerService.updateById(jkSketchCustomer);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jksketchcustomer:query")
+    public ApiResponse<PageData<JkSketchCustomer>> findPage (@RequestBody PageWrap<JkSketchCustomer> pageWrap) {
+        return ApiResponse.success(jkSketchCustomerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jksketchcustomer:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkSketchCustomer> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkSketchCustomer.class).export(jkSketchCustomerService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jksketchcustomer:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkSketchCustomerService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchLineController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchLineController.java
new file mode 100644
index 0000000..6eb157d
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchLineController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkSketchLine;
+import com.doumee.service.business.JkSketchLineService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping("/business/jkSketchLine")
+public class JkSketchLineController extends BaseController {
+
+    @Autowired
+    private JkSketchLineService jkSketchLineService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jksketchline:create")
+    public ApiResponse create(@RequestBody JkSketchLine jkSketchLine) {
+        return ApiResponse.success(jkSketchLineService.create(jkSketchLine));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jksketchline:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkSketchLineService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jksketchline: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));
+        }
+        jkSketchLineService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jksketchline:update")
+    public ApiResponse updateById(@RequestBody JkSketchLine jkSketchLine) {
+        jkSketchLineService.updateById(jkSketchLine);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jksketchline:query")
+    public ApiResponse<PageData<JkSketchLine>> findPage (@RequestBody PageWrap<JkSketchLine> pageWrap) {
+        return ApiResponse.success(jkSketchLineService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jksketchline:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkSketchLine> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkSketchLine.class).export(jkSketchLineService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jksketchline:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkSketchLineService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkVersionController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkVersionController.java
new file mode 100644
index 0000000..c6a479a
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkVersionController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.JkVersion;
+import com.doumee.service.business.JkVersionService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃")
+@RestController
+@RequestMapping("/business/jkVersion")
+public class JkVersionController extends BaseController {
+
+    @Autowired
+    private JkVersionService jkVersionService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:jkversion:create")
+    public ApiResponse create(@RequestBody JkVersion jkVersion) {
+        return ApiResponse.success(jkVersionService.create(jkVersion));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:jkversion:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkVersionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:jkversion: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));
+        }
+        jkVersionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:jkversion:update")
+    public ApiResponse updateById(@RequestBody JkVersion jkVersion) {
+        jkVersionService.updateById(jkVersion);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:jkversion:query")
+    public ApiResponse<PageData<JkVersion>> findPage (@RequestBody PageWrap<JkVersion> pageWrap) {
+        return ApiResponse.success(jkVersionService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:jkversion:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkVersion> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkVersion.class).export(jkVersionService.findPage(pageWrap).getRecords(), "浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:jkversion:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkVersionService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningController.java
new file mode 100644
index 0000000..c0be405
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.Warning;
+import com.doumee.service.business.WarningService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping("/business/warning")
+public class WarningController extends BaseController {
+
+    @Autowired
+    private WarningService warningService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:warning:create")
+    public ApiResponse create(@RequestBody Warning warning) {
+        return ApiResponse.success(warningService.create(warning));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:warning:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:warning: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));
+        }
+        warningService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:warning:update")
+    public ApiResponse updateById(@RequestBody Warning warning) {
+        warningService.updateById(warning);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:warning:query")
+    public ApiResponse<PageData<Warning>> findPage (@RequestBody PageWrap<Warning> pageWrap) {
+        return ApiResponse.success(warningService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:warning:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Warning> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Warning.class).export(warningService.findPage(pageWrap).getRecords(), "鎶ヨ璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:warning:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningPushController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningPushController.java
new file mode 100644
index 0000000..b77254d
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningPushController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.WarningPush;
+import com.doumee.service.business.WarningPushService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ鎺ㄩ�佽褰�")
+@RestController
+@RequestMapping("/business/warningPush")
+public class WarningPushController extends BaseController {
+
+    @Autowired
+    private WarningPushService warningPushService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:warningpush:create")
+    public ApiResponse create(@RequestBody WarningPush warningPush) {
+        return ApiResponse.success(warningPushService.create(warningPush));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:warningpush:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningPushService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:warningpush: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));
+        }
+        warningPushService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:warningpush:update")
+    public ApiResponse updateById(@RequestBody WarningPush warningPush) {
+        warningPushService.updateById(warningPush);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:warningpush:query")
+    public ApiResponse<PageData<WarningPush>> findPage (@RequestBody PageWrap<WarningPush> pageWrap) {
+        return ApiResponse.success(warningPushService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:warningpush:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<WarningPush> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(WarningPush.class).export(warningPushService.findPage(pageWrap).getRecords(), "鎶ヨ鎺ㄩ�佽褰�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:warningpush:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningPushService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleController.java
new file mode 100644
index 0000000..aac7e49
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.WarningRule;
+import com.doumee.service.business.WarningRuleService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ瑙勫垯閰嶇疆琛�")
+@RestController
+@RequestMapping("/business/warningRule")
+public class WarningRuleController extends BaseController {
+
+    @Autowired
+    private WarningRuleService warningRuleService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:warningrule:create")
+    public ApiResponse create(@RequestBody WarningRule warningRule) {
+        return ApiResponse.success(warningRuleService.create(warningRule));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:warningrule:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningRuleService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:warningrule: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));
+        }
+        warningRuleService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:warningrule:update")
+    public ApiResponse updateById(@RequestBody WarningRule warningRule) {
+        warningRuleService.updateById(warningRule);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:warningrule:query")
+    public ApiResponse<PageData<WarningRule>> findPage (@RequestBody PageWrap<WarningRule> pageWrap) {
+        return ApiResponse.success(warningRuleService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:warningrule:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<WarningRule> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(WarningRule.class).export(warningRuleService.findPage(pageWrap).getRecords(), "鎶ヨ瑙勫垯閰嶇疆琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:warningrule:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningRuleService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleDetailController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleDetailController.java
new file mode 100644
index 0000000..cc35d12
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleDetailController.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.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.dao.business.model.WarningRuleDetail;
+import com.doumee.service.business.WarningRuleDetailService;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�")
+@RestController
+@RequestMapping("/business/warningRuleDetail")
+public class WarningRuleDetailController extends BaseController {
+
+    @Autowired
+    private WarningRuleDetailService warningRuleDetailService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:warningruledetail:create")
+    public ApiResponse create(@RequestBody WarningRuleDetail warningRuleDetail) {
+        return ApiResponse.success(warningRuleDetailService.create(warningRuleDetail));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:warningruledetail:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningRuleDetailService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:warningruledetail: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));
+        }
+        warningRuleDetailService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:warningruledetail:update")
+    public ApiResponse updateById(@RequestBody WarningRuleDetail warningRuleDetail) {
+        warningRuleDetailService.updateById(warningRuleDetail);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:warningruledetail:query")
+    public ApiResponse<PageData<WarningRuleDetail>> findPage (@RequestBody PageWrap<WarningRuleDetail> pageWrap) {
+        return ApiResponse.success(warningRuleDetailService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:warningruledetail:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<WarningRuleDetail> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(WarningRuleDetail.class).export(warningRuleDetailService.findPage(pageWrap).getRecords(), "鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:warningruledetail:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningRuleDetailService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java
new file mode 100644
index 0000000..5000734
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkCabinet;
+import com.doumee.service.business.JkCabinetService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌滃熀鏈俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkCabinet")
+public class JkCabinetCloudController extends BaseController {
+
+    @Autowired
+    private JkCabinetService jkCabinetService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkcabinet:create")
+    public ApiResponse create(@RequestBody JkCabinet jkCabinet) {
+        return ApiResponse.success(jkCabinetService.create(jkCabinet));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkcabinet:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCabinetService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkcabinet: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));
+        }
+        jkCabinetService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkcabinet:update")
+    public ApiResponse updateById(@RequestBody JkCabinet jkCabinet) {
+        jkCabinetService.updateById(jkCabinet);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkcabinet:query")
+    public ApiResponse<PageData<JkCabinet>> findPage (@RequestBody PageWrap<JkCabinet> pageWrap) {
+        return ApiResponse.success(jkCabinetService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkcabinet:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCabinet> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCabinet.class).export(jkCabinetService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滃熀鏈俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkcabinet:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCabinetService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java
new file mode 100644
index 0000000..0b9de85
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkCabinetGrid;
+import com.doumee.service.business.JkCabinetGridService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkCabinetGrid")
+public class JkCabinetGridCloudController extends BaseController {
+
+    @Autowired
+    private JkCabinetGridService jkCabinetGridService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkcabinetgrid:create")
+    public ApiResponse create(@RequestBody JkCabinetGrid jkCabinetGrid) {
+        return ApiResponse.success(jkCabinetGridService.create(jkCabinetGrid));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkcabinetgrid:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCabinetGridService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkcabinetgrid: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));
+        }
+        jkCabinetGridService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkcabinetgrid:update")
+    public ApiResponse updateById(@RequestBody JkCabinetGrid jkCabinetGrid) {
+        jkCabinetGridService.updateById(jkCabinetGrid);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkcabinetgrid:query")
+    public ApiResponse<PageData<JkCabinetGrid>> findPage (@RequestBody PageWrap<JkCabinetGrid> pageWrap) {
+        return ApiResponse.success(jkCabinetGridService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkcabinetgrid:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCabinetGrid> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCabinetGrid.class).export(jkCabinetGridService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkcabinetgrid:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCabinetGridService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java
new file mode 100644
index 0000000..0299c8e
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkCabinetLog;
+import com.doumee.service.business.JkCabinetLogService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌滃紑鍏抽棬璁板綍")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkCabinetLog")
+public class JkCabinetLogCloudController extends BaseController {
+
+    @Autowired
+    private JkCabinetLogService jkCabinetLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkcabinetlog:create")
+    public ApiResponse create(@RequestBody JkCabinetLog jkCabinetLog) {
+        return ApiResponse.success(jkCabinetLogService.create(jkCabinetLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkcabinetlog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCabinetLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkcabinetlog: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));
+        }
+        jkCabinetLogService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkcabinetlog:update")
+    public ApiResponse updateById(@RequestBody JkCabinetLog jkCabinetLog) {
+        jkCabinetLogService.updateById(jkCabinetLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkcabinetlog:query")
+    public ApiResponse<PageData<JkCabinetLog>> findPage (@RequestBody PageWrap<JkCabinetLog> pageWrap) {
+        return ApiResponse.success(jkCabinetLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkcabinetlog:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCabinetLog> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCabinetLog.class).export(jkCabinetLogService.findPage(pageWrap).getRecords(), "閽ュ寵鏌滃紑鍏抽棬璁板綍", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkcabinetlog:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCabinetLogService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java
new file mode 100644
index 0000000..8b31ffb
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkCustomer;
+import com.doumee.service.business.JkCustomerService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-瀹㈡埛淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkCustomer")
+public class JkCustomerCloudController extends BaseController {
+
+    @Autowired
+    private JkCustomerService jkCustomerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkcustomer:create")
+    public ApiResponse create(@RequestBody JkCustomer jkCustomer) {
+        return ApiResponse.success(jkCustomerService.create(jkCustomer));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkcustomer:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkCustomerService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkcustomer: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));
+        }
+        jkCustomerService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkcustomer:update")
+    public ApiResponse updateById(@RequestBody JkCustomer jkCustomer) {
+        jkCustomerService.updateById(jkCustomer);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkcustomer:query")
+    public ApiResponse<PageData<JkCustomer>> findPage (@RequestBody PageWrap<JkCustomer> pageWrap) {
+        return ApiResponse.success(jkCustomerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkcustomer:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkCustomer> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkCustomer.class).export(jkCustomerService.findPage(pageWrap).getRecords(), "浜ゆ帶-瀹㈡埛淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkcustomer:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkCustomerService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkIccardCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkIccardCloudController.java
new file mode 100644
index 0000000..c8657a1
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkIccardCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkIccard;
+import com.doumee.service.business.JkIccardService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鏌淚C鍗′俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkIccard")
+public class JkIccardCloudController extends BaseController {
+
+    @Autowired
+    private JkIccardService jkIccardService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkiccard:create")
+    public ApiResponse create(@RequestBody JkIccard jkIccard) {
+        return ApiResponse.success(jkIccardService.create(jkIccard));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkiccard:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkIccardService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkiccard: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));
+        }
+        jkIccardService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkiccard:update")
+    public ApiResponse updateById(@RequestBody JkIccard jkIccard) {
+        jkIccardService.updateById(jkIccard);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkiccard:query")
+    public ApiResponse<PageData<JkIccard>> findPage (@RequestBody PageWrap<JkIccard> pageWrap) {
+        return ApiResponse.success(jkIccardService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkiccard:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkIccard> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkIccard.class).export(jkIccardService.findPage(pageWrap).getRecords(), "閽ュ寵鏌淚C鍗′俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkiccard:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkIccardService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java
new file mode 100644
index 0000000..4fe9b33
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkKeys;
+import com.doumee.service.business.JkKeysService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "閽ュ寵鍩烘湰淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkKeys")
+public class JkKeysCloudController extends BaseController {
+
+    @Autowired
+    private JkKeysService jkKeysService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkkeys:create")
+    public ApiResponse create(@RequestBody JkKeys jkKeys) {
+        return ApiResponse.success(jkKeysService.create(jkKeys));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkkeys:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkKeysService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkkeys: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));
+        }
+        jkKeysService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkkeys:update")
+    public ApiResponse updateById(@RequestBody JkKeys jkKeys) {
+        jkKeysService.updateById(jkKeys);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkkeys:query")
+    public ApiResponse<PageData<JkKeys>> findPage (@RequestBody PageWrap<JkKeys> pageWrap) {
+        return ApiResponse.success(jkKeysService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkkeys:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkKeys> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkKeys.class).export(jkKeysService.findPage(pageWrap).getRecords(), "閽ュ寵鍩烘湰淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkkeys:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkKeysService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java
new file mode 100644
index 0000000..e404a4b
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkLine;
+import com.doumee.service.business.JkLineService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkLine")
+public class JkLineCloudController extends BaseController {
+
+    @Autowired
+    private JkLineService jkLineService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkline:create")
+    public ApiResponse create(@RequestBody JkLine jkLine) {
+        return ApiResponse.success(jkLineService.create(jkLine));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkline:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkLineService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkline: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));
+        }
+        jkLineService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkline:update")
+    public ApiResponse updateById(@RequestBody JkLine jkLine) {
+        jkLineService.updateById(jkLine);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkline:query")
+    public ApiResponse<PageData<JkLine>> findPage (@RequestBody PageWrap<JkLine> pageWrap) {
+        return ApiResponse.success(jkLineService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkline:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkLine> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkLine.class).export(jkLineService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkline:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkLineService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkOrdersCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkOrdersCloudController.java
new file mode 100644
index 0000000..e7f9053
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkOrdersCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkOrders;
+import com.doumee.service.business.JkOrdersService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-閿�鍞鍗曚俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkOrders")
+public class JkOrdersCloudController extends BaseController {
+
+    @Autowired
+    private JkOrdersService jkOrdersService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkorders:create")
+    public ApiResponse create(@RequestBody JkOrders jkOrders) {
+        return ApiResponse.success(jkOrdersService.create(jkOrders));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkorders:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkOrdersService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkorders: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));
+        }
+        jkOrdersService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkorders:update")
+    public ApiResponse updateById(@RequestBody JkOrders jkOrders) {
+        jkOrdersService.updateById(jkOrders);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkorders:query")
+    public ApiResponse<PageData<JkOrders>> findPage (@RequestBody PageWrap<JkOrders> pageWrap) {
+        return ApiResponse.success(jkOrdersService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkorders:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkOrders> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkOrders.class).export(jkOrdersService.findPage(pageWrap).getRecords(), "浜ゆ帶-閿�鍞鍗曚俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkorders:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkOrdersService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCloudController.java
new file mode 100644
index 0000000..7053160
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkSketch;
+import com.doumee.service.business.JkSketchService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkSketch")
+public class JkSketchCloudController extends BaseController {
+
+    @Autowired
+    private JkSketchService jkSketchService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jksketch:create")
+    public ApiResponse create(@RequestBody JkSketch jkSketch) {
+        return ApiResponse.success(jkSketchService.create(jkSketch));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jksketch:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkSketchService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jksketch: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));
+        }
+        jkSketchService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jksketch:update")
+    public ApiResponse updateById(@RequestBody JkSketch jkSketch) {
+        jkSketchService.updateById(jkSketch);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jksketch:query")
+    public ApiResponse<PageData<JkSketch>> findPage (@RequestBody PageWrap<JkSketch> pageWrap) {
+        return ApiResponse.success(jkSketchService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jksketch:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkSketch> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkSketch.class).export(jkSketchService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jksketch:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkSketchService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCustomerCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCustomerCloudController.java
new file mode 100644
index 0000000..1f145ab
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCustomerCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkSketchCustomer;
+import com.doumee.service.business.JkSketchCustomerService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkSketchCustomer")
+public class JkSketchCustomerCloudController extends BaseController {
+
+    @Autowired
+    private JkSketchCustomerService jkSketchCustomerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jksketchcustomer:create")
+    public ApiResponse create(@RequestBody JkSketchCustomer jkSketchCustomer) {
+        return ApiResponse.success(jkSketchCustomerService.create(jkSketchCustomer));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jksketchcustomer:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkSketchCustomerService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jksketchcustomer: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));
+        }
+        jkSketchCustomerService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jksketchcustomer:update")
+    public ApiResponse updateById(@RequestBody JkSketchCustomer jkSketchCustomer) {
+        jkSketchCustomerService.updateById(jkSketchCustomer);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jksketchcustomer:query")
+    public ApiResponse<PageData<JkSketchCustomer>> findPage (@RequestBody PageWrap<JkSketchCustomer> pageWrap) {
+        return ApiResponse.success(jkSketchCustomerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jksketchcustomer:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkSketchCustomer> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkSketchCustomer.class).export(jkSketchCustomerService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jksketchcustomer:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkSketchCustomerService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchLineCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchLineCloudController.java
new file mode 100644
index 0000000..06d15d9
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchLineCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkSketchLine;
+import com.doumee.service.business.JkSketchLineService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkSketchLine")
+public class JkSketchLineCloudController extends BaseController {
+
+    @Autowired
+    private JkSketchLineService jkSketchLineService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jksketchline:create")
+    public ApiResponse create(@RequestBody JkSketchLine jkSketchLine) {
+        return ApiResponse.success(jkSketchLineService.create(jkSketchLine));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jksketchline:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkSketchLineService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jksketchline: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));
+        }
+        jkSketchLineService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jksketchline:update")
+    public ApiResponse updateById(@RequestBody JkSketchLine jkSketchLine) {
+        jkSketchLineService.updateById(jkSketchLine);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jksketchline:query")
+    public ApiResponse<PageData<JkSketchLine>> findPage (@RequestBody PageWrap<JkSketchLine> pageWrap) {
+        return ApiResponse.success(jkSketchLineService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jksketchline:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkSketchLine> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkSketchLine.class).export(jkSketchLineService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jksketchline:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkSketchLineService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkVersionCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkVersionCloudController.java
new file mode 100644
index 0000000..ef9edbc
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkVersionCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.JkVersion;
+import com.doumee.service.business.JkVersionService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/jkVersion")
+public class JkVersionCloudController extends BaseController {
+
+    @Autowired
+    private JkVersionService jkVersionService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:jkversion:create")
+    public ApiResponse create(@RequestBody JkVersion jkVersion) {
+        return ApiResponse.success(jkVersionService.create(jkVersion));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:jkversion:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        jkVersionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:jkversion: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));
+        }
+        jkVersionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:jkversion:update")
+    public ApiResponse updateById(@RequestBody JkVersion jkVersion) {
+        jkVersionService.updateById(jkVersion);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:jkversion:query")
+    public ApiResponse<PageData<JkVersion>> findPage (@RequestBody PageWrap<JkVersion> pageWrap) {
+        return ApiResponse.success(jkVersionService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:jkversion:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<JkVersion> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(JkVersion.class).export(jkVersionService.findPage(pageWrap).getRecords(), "浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:jkversion:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(jkVersionService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningCloudController.java
new file mode 100644
index 0000000..556f7c3
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.Warning;
+import com.doumee.service.business.WarningService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ璁板綍淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/warning")
+public class WarningCloudController extends BaseController {
+
+    @Autowired
+    private WarningService warningService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:warning:create")
+    public ApiResponse create(@RequestBody Warning warning) {
+        return ApiResponse.success(warningService.create(warning));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:warning:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:warning: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));
+        }
+        warningService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:warning:update")
+    public ApiResponse updateById(@RequestBody Warning warning) {
+        warningService.updateById(warning);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:warning:query")
+    public ApiResponse<PageData<Warning>> findPage (@RequestBody PageWrap<Warning> pageWrap) {
+        return ApiResponse.success(warningService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:warning:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Warning> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Warning.class).export(warningService.findPage(pageWrap).getRecords(), "鎶ヨ璁板綍淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:warning:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningPushCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningPushCloudController.java
new file mode 100644
index 0000000..389964a
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningPushCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.WarningPush;
+import com.doumee.service.business.WarningPushService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ鎺ㄩ�佽褰�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/warningPush")
+public class WarningPushCloudController extends BaseController {
+
+    @Autowired
+    private WarningPushService warningPushService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:warningpush:create")
+    public ApiResponse create(@RequestBody WarningPush warningPush) {
+        return ApiResponse.success(warningPushService.create(warningPush));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:warningpush:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningPushService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:warningpush: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));
+        }
+        warningPushService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:warningpush:update")
+    public ApiResponse updateById(@RequestBody WarningPush warningPush) {
+        warningPushService.updateById(warningPush);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:warningpush:query")
+    public ApiResponse<PageData<WarningPush>> findPage (@RequestBody PageWrap<WarningPush> pageWrap) {
+        return ApiResponse.success(warningPushService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:warningpush:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<WarningPush> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(WarningPush.class).export(warningPushService.findPage(pageWrap).getRecords(), "鎶ヨ鎺ㄩ�佽褰�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:warningpush:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningPushService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleCloudController.java
new file mode 100644
index 0000000..0e5342b
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.WarningRule;
+import com.doumee.service.business.WarningRuleService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ瑙勫垯閰嶇疆琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/warningRule")
+public class WarningRuleCloudController extends BaseController {
+
+    @Autowired
+    private WarningRuleService warningRuleService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:warningrule:create")
+    public ApiResponse create(@RequestBody WarningRule warningRule) {
+        return ApiResponse.success(warningRuleService.create(warningRule));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:warningrule:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningRuleService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:warningrule: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));
+        }
+        warningRuleService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:warningrule:update")
+    public ApiResponse updateById(@RequestBody WarningRule warningRule) {
+        warningRuleService.updateById(warningRule);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:warningrule:query")
+    public ApiResponse<PageData<WarningRule>> findPage (@RequestBody PageWrap<WarningRule> pageWrap) {
+        return ApiResponse.success(warningRuleService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:warningrule:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<WarningRule> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(WarningRule.class).export(warningRuleService.findPage(pageWrap).getRecords(), "鎶ヨ瑙勫垯閰嶇疆琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:warningrule:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningRuleService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleDetailCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleDetailCloudController.java
new file mode 100644
index 0000000..0130971
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningRuleDetailCloudController.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.utils.Constants;
+import com.doumee.dao.business.model.WarningRuleDetail;
+import com.doumee.service.business.WarningRuleDetailService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+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 2025/09/28 09:01
+ */
+@Api(tags = "鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/warningRuleDetail")
+public class WarningRuleDetailCloudController extends BaseController {
+
+    @Autowired
+    private WarningRuleDetailService warningRuleDetailService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:warningruledetail:create")
+    public ApiResponse create(@RequestBody WarningRuleDetail warningRuleDetail) {
+        return ApiResponse.success(warningRuleDetailService.create(warningRuleDetail));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:warningruledetail:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        warningRuleDetailService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:warningruledetail: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));
+        }
+        warningRuleDetailService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:warningruledetail:update")
+    public ApiResponse updateById(@RequestBody WarningRuleDetail warningRuleDetail) {
+        warningRuleDetailService.updateById(warningRuleDetail);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:warningruledetail:query")
+    public ApiResponse<PageData<WarningRuleDetail>> findPage (@RequestBody PageWrap<WarningRuleDetail> pageWrap) {
+        return ApiResponse.success(warningRuleDetailService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:warningruledetail:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<WarningRuleDetail> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(WarningRuleDetail.class).export(warningRuleDetailService.findPage(pageWrap).getRecords(), "鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:warningruledetail:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(warningRuleDetailService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java
new file mode 100644
index 0000000..69cdf93
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkCabinetGrid;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCabinetGridMapper extends BaseMapper<JkCabinetGrid> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java
new file mode 100644
index 0000000..63566fe
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkCabinetLog;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCabinetLogMapper extends BaseMapper<JkCabinetLog> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetMapper.java
new file mode 100644
index 0000000..b1b73e2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkCabinet;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCabinetMapper extends BaseMapper<JkCabinet> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java
new file mode 100644
index 0000000..19b331b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkCustomer;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCustomerMapper extends BaseMapper<JkCustomer> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkIccardMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkIccardMapper.java
new file mode 100644
index 0000000..571c5e3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkIccardMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkIccard;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkIccardMapper extends BaseMapper<JkIccard> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java
new file mode 100644
index 0000000..b854736
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkKeys;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkKeysMapper extends BaseMapper<JkKeys> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java
new file mode 100644
index 0000000..7504edd
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkLine;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkLineMapper extends BaseMapper<JkLine> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkOrdersMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkOrdersMapper.java
new file mode 100644
index 0000000..c8bf20a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkOrdersMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkOrders;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkOrdersMapper extends BaseMapper<JkOrders> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchCustomerMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchCustomerMapper.java
new file mode 100644
index 0000000..903630a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchCustomerMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkSketchCustomer;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkSketchCustomerMapper extends BaseMapper<JkSketchCustomer> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchLineMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchLineMapper.java
new file mode 100644
index 0000000..81a3cb9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchLineMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkSketchLine;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkSketchLineMapper extends BaseMapper<JkSketchLine> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchMapper.java
new file mode 100644
index 0000000..e95e915
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkSketch;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkSketchMapper extends BaseMapper<JkSketch> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkVersionMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkVersionMapper.java
new file mode 100644
index 0000000..0e6ef61
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkVersionMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.JkVersion;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkVersionMapper extends BaseMapper<JkVersion> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningMapper.java
new file mode 100644
index 0000000..a33f848
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Warning;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningMapper extends BaseMapper<Warning> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningPushMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningPushMapper.java
new file mode 100644
index 0000000..187d218
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningPushMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.WarningPush;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningPushMapper extends BaseMapper<WarningPush> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleDetailMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleDetailMapper.java
new file mode 100644
index 0000000..cd65c05
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleDetailMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.WarningRuleDetail;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningRuleDetailMapper extends BaseMapper<WarningRuleDetail> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleMapper.java
new file mode 100644
index 0000000..b1bb01c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningRuleMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.WarningRule;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningRuleMapper extends BaseMapper<WarningRule> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
new file mode 100644
index 0000000..5ac7ad0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
@@ -0,0 +1,139 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("閽ュ寵鏌滃熀鏈俊鎭〃")
+@TableName("`jk_cabinet`")
+public class JkCabinet {
+
+    @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 info;
+
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    @ExcelColumn(name="璁惧缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    @ExcelColumn(name="璁惧鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "璁惧ID")
+    @ExcelColumn(name="璁惧ID")
+    private String devId;
+
+    @ApiModelProperty(value = "搴忓垪鍙�")
+    @ExcelColumn(name="搴忓垪鍙�")
+    private String serialNo;
+
+    @ApiModelProperty(value = "閫氳鍦板潃")
+    @ExcelColumn(name="閫氳鍦板潃")
+    private String linkAddr;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    private Integer status;
+
+    @ApiModelProperty(value = "绔彛", example = "1")
+    @ExcelColumn(name="绔彛")
+    private Integer port;
+
+    @ApiModelProperty(value = "璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member)", example = "1")
+    @ExcelColumn(name="璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member)")
+    private Integer managerId;
+
+    @ApiModelProperty(value = "浣跨敤鏃堕暱(绉�)", example = "1")
+    @ExcelColumn(name="浣跨敤鏃堕暱(绉�)")
+    private Integer useTime;
+
+    @ApiModelProperty(value = "鏄惁鍙岄噸楠岃瘉 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍙岄噸楠岃瘉 0鍚� 1鏄�")
+    private Integer doubleAuth;
+
+    @ApiModelProperty(value = "楠岃瘉浜虹紪鐮侊紙鍏宠仈member)", example = "1")
+    @ExcelColumn(name="楠岃瘉浜虹紪鐮侊紙鍏宠仈member)")
+    private Integer authMemberId;
+
+    @ApiModelProperty(value = "鎺掓暟", example = "1")
+    @ExcelColumn(name="鎺掓暟")
+    private Integer rowNum;
+
+    @ApiModelProperty(value = "鍒楁暟", example = "1")
+    @ExcelColumn(name="鍒楁暟")
+    private Integer columnNum;
+
+    @ApiModelProperty(value = "鏈�鍚庨�氳鏃堕棿")
+    @ExcelColumn(name="鏈�鍚庨�氳鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date haertTime;
+
+    @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
+    @ExcelColumn(name="鎵�鍦ㄤ綅缃�")
+    private String lacation;
+
+    @ApiModelProperty(value = "缁忓害", example = "1")
+    @ExcelColumn(name="缁忓害")
+    private BigDecimal longitude;
+
+    @ApiModelProperty(value = "缁村害", example = "1")
+    @ExcelColumn(name="缁村害")
+    private BigDecimal latitude;
+
+    @ApiModelProperty(value = "缂栫爜鏂瑰紡 0鑷姩缂栫爜 1鎵嬪姩缂栫爜", example = "1")
+    @ExcelColumn(name="缂栫爜鏂瑰紡 0鑷姩缂栫爜 1鎵嬪姩缂栫爜")
+    private Integer noType;
+
+    @ApiModelProperty(value = "缂栫爜鍓嶇紑")
+    @ExcelColumn(name="缂栫爜鍓嶇紑")
+    private String noPrefix;
+
+    @ApiModelProperty(value = "缂栫爜浣嶆暟", example = "1")
+    @ExcelColumn(name="缂栫爜浣嶆暟")
+    private Integer noLength;
+
+    @ApiModelProperty(value = "璧峰缂栫爜", example = "1")
+    @ExcelColumn(name="璧峰缂栫爜")
+    private Integer noIndex;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java
new file mode 100644
index 0000000..46ec0bf
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java
@@ -0,0 +1,77 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃")
+@TableName("`jk_cabinet_grid`")
+public class JkCabinetGrid {
+
+    @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 info;
+
+    @ApiModelProperty(value = "閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)", example = "1")
+    @ExcelColumn(name="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)")
+    private Integer cabinetId;
+
+    @ApiModelProperty(value = "缂栫爜")
+    @ExcelColumn(name="缂栫爜")
+    private String code;
+
+    @ApiModelProperty(value = "閽ュ寵缂栫爜锛堝叧鑱攋k_keys)", example = "1")
+    @ExcelColumn(name="閽ュ寵缂栫爜锛堝叧鑱攋k_keys)")
+    private Integer keyId;
+
+    @ApiModelProperty(value = "搴忓垪鍙�")
+    @ExcelColumn(name="搴忓垪鍙�")
+    private String serialNo;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    private Integer status;
+
+    @ApiModelProperty(value = "杩愯鐘舵��", example = "1")
+    @ExcelColumn(name="杩愯鐘舵��")
+    private Integer workingStatus;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
new file mode 100644
index 0000000..d999ccd
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
@@ -0,0 +1,89 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("閽ュ寵鏌滃紑鍏抽棬璁板綍")
+@TableName("`jk_cabinet_log`")
+public class JkCabinetLog {
+
+    @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 info;
+
+    @ApiModelProperty(value = "閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)", example = "1")
+    @ExcelColumn(name="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)")
+    private Integer cabinetId;
+
+    @ApiModelProperty(value = "閽ュ寵鏌滄牸缂栫爜(鍏宠仈jk_cabinet_grid)", example = "1")
+    @ExcelColumn(name="閽ュ寵鏌滄牸缂栫爜(鍏宠仈jk_cabinet_grid)")
+    private Integer gridId;
+
+    @ApiModelProperty(value = "楠岃瘉鏂瑰紡 0鍒疯劯 1鍒峰崱", example = "1")
+    @ExcelColumn(name="楠岃瘉鏂瑰紡 0鍒疯劯 1鍒峰崱")
+    private Integer authType;
+
+    @ApiModelProperty(value = "杞﹁締缂栫爜锛堝叧鑱攃ars)", example = "1")
+    @ExcelColumn(name="杞﹁締缂栫爜锛堝叧鑱攃ars)")
+    private Integer carId;
+
+    @ApiModelProperty(value = "閽ュ寵缂栫爜(鍏宠仈jk_keys)", example = "1")
+    @ExcelColumn(name="閽ュ寵缂栫爜(鍏宠仈jk_keys)")
+    private Integer keyId;
+
+    @ApiModelProperty(value = "浜哄憳缂栫爜锛堝叧鑱攎ember)", example = "1")
+    @ExcelColumn(name="浜哄憳缂栫爜锛堝叧鑱攎ember)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "閽ュ寵淇℃伅锛堣溅鐗屽彿-閽ュ寵缂栫爜锛�")
+    @ExcelColumn(name="閽ュ寵淇℃伅锛堣溅鐗屽彿-閽ュ寵缂栫爜锛�")
+    private String keyInfo;
+
+    @ApiModelProperty(value = "棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟", example = "1")
+    @ExcelColumn(name="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟")
+    private Integer roleType;
+
+    @ApiModelProperty(value = "鐘舵�� 0鎴愬姛 1澶辫触", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鎴愬姛 1澶辫触")
+    private Integer status;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
new file mode 100644
index 0000000..3941aec
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
@@ -0,0 +1,90 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("浜ゆ帶-瀹㈡埛淇℃伅琛�")
+@TableName("`jk_customer`")
+public class JkCustomer {
+
+    @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 info;
+
+    @ApiModelProperty(value = "鍚嶇О", example = "1")
+    @ExcelColumn(name="鍚嶇О")
+    private Integer name;
+
+    @ApiModelProperty(value = "缂栫爜", example = "1")
+    @ExcelColumn(name="缂栫爜")
+    private Integer code;
+
+    @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
+    @ExcelColumn(name="鎵�鍦ㄤ綅缃�")
+    private String lacation;
+
+    @ApiModelProperty(value = "缁忓害", example = "1")
+    @ExcelColumn(name="缁忓害")
+    private BigDecimal longitude;
+
+    @ApiModelProperty(value = "缁村害", example = "1")
+    @ExcelColumn(name="缁村害")
+    private BigDecimal latitude;
+
+    @ApiModelProperty(value = "閰嶉�佸懆鏈�")
+    @ExcelColumn(name="閰嶉�佸懆鏈�")
+    private String weeks;
+
+    @ApiModelProperty(value = "閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)", example = "1")
+    @ExcelColumn(name="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)")
+    private Integer lineId;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父 绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java
new file mode 100644
index 0000000..ec888cf
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java
@@ -0,0 +1,73 @@
+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;
+
+/**
+ * 閽ュ寵鏌淚C鍗′俊鎭〃
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+@Data
+@ApiModel("閽ュ寵鏌淚C鍗′俊鎭〃")
+@TableName("`jk_iccard`")
+public class JkIccard {
+
+    @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 info;
+
+    @ApiModelProperty(value = "浜哄憳缂栫爜缂栫爜锛堝叧鑱攎ember)", example = "1")
+    @ExcelColumn(name="浜哄憳缂栫爜缂栫爜锛堝叧鑱攎ember)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "缂栫爜")
+    @ExcelColumn(name="缂栫爜")
+    private String code;
+
+    @ApiModelProperty(value = "鐘舵�� 0绂佺敤 1鍚敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0绂佺敤 1鍚敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍗″悕绉�")
+    @ExcelColumn(name="鍗″悕绉�")
+    private String name;
+
+    @ApiModelProperty(value = "閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)", example = "1")
+    @ExcelColumn(name="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)")
+    private Integer cabinetId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
new file mode 100644
index 0000000..a7e98e3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
@@ -0,0 +1,77 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("閽ュ寵鍩烘湰淇℃伅琛�")
+@TableName("`jk_keys`")
+public class JkKeys {
+
+    @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 info;
+
+    @ApiModelProperty(value = "閽ュ寵缂栧彿", example = "1")
+    @ExcelColumn(name="閽ュ寵缂栧彿")
+    private Integer code;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    @ExcelColumn(name="杞︾墝鍙�")
+    private String carCode;
+
+    @ApiModelProperty(value = "鎵�灞炶溅杈�(鍏宠仈cars)", example = "1")
+    @ExcelColumn(name="鎵�灞炶溅杈�(鍏宠仈cars)")
+    private Integer carId;
+
+    @ApiModelProperty(value = "RFID鏍囩")
+    @ExcelColumn(name="RFID鏍囩")
+    private String rfidLable;
+
+    @ApiModelProperty(value = "棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟", example = "1")
+    @ExcelColumn(name="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟")
+    private Integer roleType;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    private Integer status;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java
new file mode 100644
index 0000000..c7bb257
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java
@@ -0,0 +1,81 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("浜ゆ帶-绾胯矾淇℃伅琛�")
+@TableName("`jk_line`")
+public class JkLine {
+
+    @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 info;
+
+    @ApiModelProperty(value = "鍚嶇О", example = "1")
+    @ExcelColumn(name="鍚嶇О")
+    private Integer name;
+
+    @ApiModelProperty(value = "鐝粍缂栫爜锛堝叧鑱攃ategory锛�", example = "1")
+    @ExcelColumn(name="鐝粍缂栫爜锛堝叧鑱攃ategory锛�")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "鎵�灞炶溅杈�(鍏宠仈cars)", example = "1")
+    @ExcelColumn(name="鎵�灞炶溅杈�(鍏宠仈cars)")
+    private Integer carId;
+
+    @ApiModelProperty(value = "鏈�澶у鎴烽噺", example = "1")
+    @ExcelColumn(name="鏈�澶у鎴烽噺")
+    private Integer maxCustomer;
+
+    @ApiModelProperty(value = "鏈�澶ц鍗曢噺", example = "1")
+    @ExcelColumn(name="鏈�澶ц鍗曢噺")
+    private Integer maxOrder;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkOrders.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkOrders.java
new file mode 100644
index 0000000..74bcb58
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkOrders.java
@@ -0,0 +1,82 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("浜ゆ帶-閿�鍞鍗曚俊鎭〃")
+@TableName("`jk_orders`")
+public class JkOrders {
+
+    @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 info;
+
+    @ApiModelProperty(value = "鍚嶇О", example = "1")
+    @ExcelColumn(name="鍚嶇О")
+    private Integer name;
+
+    @ApiModelProperty(value = "閿�閲�", example = "1")
+    @ExcelColumn(name="閿�閲�")
+    private Integer num;
+
+    @ApiModelProperty(value = "閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)", example = "1")
+    @ExcelColumn(name="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)")
+    private Integer lineId;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 绂佺敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父 绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鏃ユ湡")
+    @ExcelColumn(name="鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dateInfo;
+
+    @ApiModelProperty(value = "鍚岀彮缁勯棿瀹㈡埛浣嶇疆璺濈鏁扮粍锛孾{a:12,b:100},{a:13,b:200},...],a锛氬鎴风紪鐮侊紝b锛氫笌瀹㈡埛a涔嬮棿鐨勮窛绂�")
+    @ExcelColumn(name="鍚岀彮缁勯棿瀹㈡埛浣嶇疆璺濈鏁扮粍锛孾{a:12,b:100},{a:13,b:200},...],a锛氬鎴风紪鐮侊紝b锛氫笌瀹㈡埛a涔嬮棿鐨勮窛绂�")
+    private String distances;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketch.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketch.java
new file mode 100644
index 0000000..711ceb5
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketch.java
@@ -0,0 +1,82 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�")
+@TableName("`jk_sketch`")
+public class JkSketch {
+
+    @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 info;
+
+    @ApiModelProperty(value = "涓荤嚎璺紪鐮侊紙鍏宠仈category)", example = "1")
+    @ExcelColumn(name="涓荤嚎璺紪鐮侊紙鍏宠仈category)")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "閫佽揣閲�", example = "1")
+    @ExcelColumn(name="閫佽揣閲�")
+    private Integer totalNum;
+
+    @ApiModelProperty(value = "瀹㈡埛鏁�", example = "1")
+    @ExcelColumn(name="瀹㈡埛鏁�")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈紭鍖� 1浼樺寲涓� 2宸蹭紭鍖�", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈紭鍖� 1浼樺寲涓� 2宸蹭紭鍖�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鏃ユ湡")
+    @ExcelColumn(name="鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dateInfo;
+
+    @ApiModelProperty(value = "浼樺寲璁板綍缂栫爜(浣滀负key鍊煎瓨redis锛�")
+    @ExcelColumn(name="浼樺寲璁板綍缂栫爜(浣滀负key鍊煎瓨redis锛�")
+    private String jobId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchCustomer.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchCustomer.java
new file mode 100644
index 0000000..bb7eac3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchCustomer.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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�")
+@TableName("`jk_sketch_customer`")
+public class JkSketchCustomer {
+
+    @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 info;
+
+    @ApiModelProperty(value = "绾胯矾缂栫爜锛堝叧鑱攋k_sketch_line)", example = "1")
+    @ExcelColumn(name="绾胯矾缂栫爜锛堝叧鑱攋k_sketch_line)")
+    private Integer sketchLineId;
+
+    @ApiModelProperty(value = "绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)", example = "1")
+    @ExcelColumn(name="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)")
+    private Integer sketchId;
+
+    @ApiModelProperty(value = "閫佽揣閲�", example = "1")
+    @ExcelColumn(name="閫佽揣閲�")
+    private Integer totalNum;
+
+    @ApiModelProperty(value = "瀹㈡埛鏁�", example = "1")
+    @ExcelColumn(name="瀹㈡埛鏁�")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鏃ユ湡")
+    @ExcelColumn(name="鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dateInfo;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchLine.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchLine.java
new file mode 100644
index 0000000..24f400c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchLine.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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�")
+@TableName("`jk_sketch_line`")
+public class JkSketchLine {
+
+    @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 info;
+
+    @ApiModelProperty(value = "绾胯矾缂栫爜锛堝叧鑱攋k_line)", example = "1")
+    @ExcelColumn(name="绾胯矾缂栫爜锛堝叧鑱攋k_line)")
+    private Integer lineId;
+
+    @ApiModelProperty(value = "绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)", example = "1")
+    @ExcelColumn(name="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)")
+    private Integer sketchId;
+
+    @ApiModelProperty(value = "閫佽揣閲�", example = "1")
+    @ExcelColumn(name="閫佽揣閲�")
+    private Integer totalNum;
+
+    @ApiModelProperty(value = "瀹㈡埛鏁�", example = "1")
+    @ExcelColumn(name="瀹㈡埛鏁�")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鏃ユ湡")
+    @ExcelColumn(name="鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date dateInfo;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java
new file mode 100644
index 0000000..c2402c0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.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;
+
+/**
+ * 浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+@Data
+@ApiModel("浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃")
+@TableName("`jk_version`")
+public class JkVersion {
+
+    @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 info;
+
+    @ApiModelProperty(value = "鐗堟湰鍙�")
+    @ExcelColumn(name="鐗堟湰鍙�")
+    private String versionInfo;
+
+    @ApiModelProperty(value = "瀹夎鍖呰矾寰�")
+    @ExcelColumn(name="瀹夎鍖呰矾寰�")
+    private String fileUrl;
+
+    @ApiModelProperty(value = "瀹夎鐗堝悕绉�")
+    @ExcelColumn(name="瀹夎鐗堝悕绉�")
+    private String name;
+
+    @ApiModelProperty(value = "鏇存柊鎻忚堪")
+    @ExcelColumn(name="鏇存柊鎻忚堪")
+    private String content;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鏇存柊鏍囬")
+    @ExcelColumn(name="鏇存柊鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "鏄惁寮哄埗鏇存柊 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁寮哄埗鏇存柊 0鍚� 1鏄�")
+    private Integer isForce;
+
+    @ApiModelProperty(value = "骞冲彴绫诲瀷 0Android 1IOS", example = "1")
+    @ExcelColumn(name="骞冲彴绫诲瀷 0Android 1IOS")
+    private Integer type;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Warning.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Warning.java
new file mode 100644
index 0000000..fb33896
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Warning.java
@@ -0,0 +1,102 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("鎶ヨ璁板綍淇℃伅琛�")
+@TableName("`warning`")
+public class Warning {
+
+    @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 info;
+
+    @ApiModelProperty(value = "绫诲瀷 0=瀹夐槻浜嬩欢锛�1=娑堥槻浜嬩欢锛�2=杞﹁浇浜嬩欢锛�3=閽ュ寵鏌滀簨浠讹紱 4=澶╂皵棰勮锛�", example = "1")
+    @ExcelColumn(name="绫诲瀷 0=瀹夐槻浜嬩欢锛�1=娑堥槻浜嬩欢锛�2=杞﹁浇浜嬩欢锛�3=閽ュ寵鏌滀簨浠讹紱 4=澶╂皵棰勮锛�")
+    private Integer type;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄缂栫爜", example = "1")
+    @ExcelColumn(name="鍏宠仈瀵硅薄缂栫爜")
+    private Integer objId;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷", example = "1")
+    @ExcelColumn(name="鍏宠仈瀵硅薄绫诲瀷")
+    private Integer objType;
+
+    @ApiModelProperty(value = "缂栫爜")
+    @ExcelColumn(name="缂栫爜")
+    private String code;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private String sortnum;
+
+    @ApiModelProperty(value = "浜嬩欢绛夌骇 0浣� 1涓� 2楂�", example = "1")
+    @ExcelColumn(name="浜嬩欢绛夌骇 0浣� 1涓� 2楂�")
+    private Integer level;
+
+    @ApiModelProperty(value = "鐘舵�� 0绂佺敤 1鍚敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0绂佺敤 1鍚敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "璁㈤槄鐘舵�� 0鏈闃� 1璁㈤槄鎴愬姛 2璁㈤槄澶辫触", example = "1")
+    @ExcelColumn(name="璁㈤槄鐘舵�� 0鏈闃� 1璁㈤槄鎴愬姛 2璁㈤槄澶辫触")
+    private Integer subscribeStatus;
+
+    @ApiModelProperty(value = "璁㈤槄鏃堕棿")
+    @ExcelColumn(name="璁㈤槄鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date subscribeDate;
+
+    @ApiModelProperty(value = "璁㈤槄澶囨敞")
+    @ExcelColumn(name="璁㈤槄澶囨敞")
+    private String subscribeInfo;
+
+    @ApiModelProperty(value = "璁㈤槄鐢ㄦ埛(鍏宠仈member)", example = "1")
+    @ExcelColumn(name="璁㈤槄鐢ㄦ埛(鍏宠仈member)")
+    private Integer subscribeMemberId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java
new file mode 100644
index 0000000..77dc897
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java
@@ -0,0 +1,94 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("鎶ヨ鎺ㄩ�佽褰�")
+@TableName("`warning_push`")
+public class WarningPush {
+
+    @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 info;
+
+    @ApiModelProperty(value = "浜哄憳缂栫爜锛堝叧鑱攎ember)", example = "1")
+    @ExcelColumn(name="浜哄憳缂栫爜锛堝叧鑱攎ember)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "浜嬩欢缂栫爜(鍏宠仈warning锛�", example = "1")
+    @ExcelColumn(name="浜嬩欢缂栫爜(鍏宠仈warning锛�")
+    private Integer warningId;
+
+    @ApiModelProperty(value = "鎶ヨ鏍囬")
+    @ExcelColumn(name="鎶ヨ鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "鎶ヨ鍐呭")
+    @ExcelColumn(name="鎶ヨ鍐呭")
+    private String content;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈帹閫� 1鎺ㄩ�佹垚鍔�2鎺ㄩ�佸け璐�", example = "1")
+    @ExcelColumn(name="鐘舵�� 0鏈帹閫� 1鎺ㄩ�佹垚鍔�2鎺ㄩ�佸け璐�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺ㄩ�佺粨鏋�", example = "1")
+    @ExcelColumn(name="鎺ㄩ�佺粨鏋�")
+    private Integer pushInfo;
+
+    @ApiModelProperty(value = "浜嬩欢鍐呭")
+    @ExcelColumn(name="浜嬩欢鍐呭")
+    private String eventInfo;
+
+    @ApiModelProperty(value = "鎺ㄩ�佹爣璇�")
+    @ExcelColumn(name="鎺ㄩ�佹爣璇�")
+    private String pushId;
+
+    @ApiModelProperty(value = "鎺ㄩ�佹椂闂�")
+    @ExcelColumn(name="鎺ㄩ�佹椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date pushDate;
+
+    @ApiModelProperty(value = "鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡", example = "1")
+    @ExcelColumn(name="鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡")
+    private Integer pushType;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java
new file mode 100644
index 0000000..33fbff5
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java
@@ -0,0 +1,73 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("鎶ヨ瑙勫垯閰嶇疆琛�")
+@TableName("`warning_rule`")
+public class WarningRule {
+
+    @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 info;
+
+    @ApiModelProperty(value = "鍐呴儴浜哄憳缂栫爜锛堝叧鑱攎ember)", example = "1")
+    @ExcelColumn(name="鍐呴儴浜哄憳缂栫爜锛堝叧鑱攎ember)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "澶氳鍒欓棿闅旀椂闂�(绉掞級", example = "1")
+    @ExcelColumn(name="澶氳鍒欓棿闅旀椂闂�(绉掞級")
+    private Integer intervalSec;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private String sortnum;
+
+    @ApiModelProperty(value = "鐘舵�� 0绂佺敤 1鍚敤", example = "1")
+    @ExcelColumn(name="鐘舵�� 0绂佺敤 1鍚敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�", example = "1")
+    @ExcelColumn(name="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�")
+    private Integer warningId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
new file mode 100644
index 0000000..938879a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
@@ -0,0 +1,77 @@
+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 2025/09/28 09:01
+ */
+@Data
+@ApiModel("鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�")
+@TableName("`warning_rule_detail`")
+public class WarningRuleDetail {
+
+    @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 info;
+
+    @ApiModelProperty(value = "瑙勫垯缂栫爜锛堝叧鑱攚arning_rule)", example = "1")
+    @ExcelColumn(name="瑙勫垯缂栫爜锛堝叧鑱攚arning_rule)")
+    private Integer ruleId;
+
+    @ApiModelProperty(value = "鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�", example = "1")
+    @ExcelColumn(name="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�")
+    private Integer warningId;
+
+    @ApiModelProperty(value = "澶氳鍒欓棿闅旀椂闂�(绉掞級", example = "1")
+    @ExcelColumn(name="澶氳鍒欓棿闅旀椂闂�(绉掞級")
+    private Integer regionCode;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private String sortnum;
+
+    @ApiModelProperty(value = "鍖哄煙鍚嶇О")
+    @ExcelColumn(name="鍖哄煙鍚嶇О")
+    private String regionName;
+
+    @ApiModelProperty(value = "鍖哄煙涓婚敭")
+    @ExcelColumn(name="鍖哄煙涓婚敭")
+    private String regionId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java
new file mode 100644
index 0000000..508b858
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java
@@ -0,0 +1,100 @@
+package com.doumee.service.business;
+
+//import com.doumee.service.business.third.model.PageData;
+//import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkCabinetGrid;
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+
+import java.util.List;
+
+/**
+ * 閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCabinetGridService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkCabinetGrid 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkCabinetGrid jkCabinetGrid);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkCabinetGrid 瀹炰綋瀵硅薄
+     */
+    void delete(JkCabinetGrid jkCabinetGrid);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkCabinetGrid 瀹炰綋瀵硅薄
+     */
+    void updateById(JkCabinetGrid jkCabinetGrid);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkCabinetGrids 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkCabinetGrid> jkCabinetGrids);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkCabinetGrid
+     */
+    JkCabinetGrid findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkCabinetGrid 瀹炰綋瀵硅薄
+     * @return JkCabinetGrid
+     */
+    JkCabinetGrid findOne(JkCabinetGrid jkCabinetGrid);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkCabinetGrid 瀹炰綋瀵硅薄
+     * @return List<JkCabinetGrid>
+     */
+    List<JkCabinetGrid> findList(JkCabinetGrid jkCabinetGrid);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkCabinetGrid>
+     */
+    PageData<JkCabinetGrid> findPage(PageWrap<JkCabinetGrid> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkCabinetGrid 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkCabinetGrid jkCabinetGrid);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java
new file mode 100644
index 0000000..1256e97
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkCabinetLog;
+import java.util.List;
+
+/**
+ * 閽ュ寵鏌滃紑鍏抽棬璁板綍Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCabinetLogService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkCabinetLog 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkCabinetLog jkCabinetLog);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkCabinetLog 瀹炰綋瀵硅薄
+     */
+    void delete(JkCabinetLog jkCabinetLog);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkCabinetLog 瀹炰綋瀵硅薄
+     */
+    void updateById(JkCabinetLog jkCabinetLog);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkCabinetLogs 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkCabinetLog> jkCabinetLogs);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkCabinetLog
+     */
+    JkCabinetLog findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkCabinetLog 瀹炰綋瀵硅薄
+     * @return JkCabinetLog
+     */
+    JkCabinetLog findOne(JkCabinetLog jkCabinetLog);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkCabinetLog 瀹炰綋瀵硅薄
+     * @return List<JkCabinetLog>
+     */
+    List<JkCabinetLog> findList(JkCabinetLog jkCabinetLog);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkCabinetLog>
+     */
+    PageData<JkCabinetLog> findPage(PageWrap<JkCabinetLog> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkCabinetLog 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkCabinetLog jkCabinetLog);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java
new file mode 100644
index 0000000..ad0bc17
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkCabinet;
+import java.util.List;
+
+/**
+ * 閽ュ寵鏌滃熀鏈俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCabinetService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkCabinet 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkCabinet jkCabinet);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkCabinet 瀹炰綋瀵硅薄
+     */
+    void delete(JkCabinet jkCabinet);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkCabinet 瀹炰綋瀵硅薄
+     */
+    void updateById(JkCabinet jkCabinet);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkCabinets 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkCabinet> jkCabinets);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkCabinet
+     */
+    JkCabinet findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkCabinet 瀹炰綋瀵硅薄
+     * @return JkCabinet
+     */
+    JkCabinet findOne(JkCabinet jkCabinet);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkCabinet 瀹炰綋瀵硅薄
+     * @return List<JkCabinet>
+     */
+    List<JkCabinet> findList(JkCabinet jkCabinet);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkCabinet>
+     */
+    PageData<JkCabinet> findPage(PageWrap<JkCabinet> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkCabinet 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkCabinet jkCabinet);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java
new file mode 100644
index 0000000..9ff9578
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkCustomer;
+import java.util.List;
+
+/**
+ * 浜ゆ帶-瀹㈡埛淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkCustomerService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkCustomer 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkCustomer jkCustomer);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkCustomer 瀹炰綋瀵硅薄
+     */
+    void delete(JkCustomer jkCustomer);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkCustomer 瀹炰綋瀵硅薄
+     */
+    void updateById(JkCustomer jkCustomer);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkCustomers 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkCustomer> jkCustomers);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkCustomer
+     */
+    JkCustomer findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkCustomer 瀹炰綋瀵硅薄
+     * @return JkCustomer
+     */
+    JkCustomer findOne(JkCustomer jkCustomer);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkCustomer 瀹炰綋瀵硅薄
+     * @return List<JkCustomer>
+     */
+    List<JkCustomer> findList(JkCustomer jkCustomer);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkCustomer>
+     */
+    PageData<JkCustomer> findPage(PageWrap<JkCustomer> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkCustomer 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkCustomer jkCustomer);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java
new file mode 100644
index 0000000..b209b97
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkIccard;
+import java.util.List;
+
+/**
+ * 閽ュ寵鏌淚C鍗′俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkIccardService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkIccard 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkIccard jkIccard);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkIccard 瀹炰綋瀵硅薄
+     */
+    void delete(JkIccard jkIccard);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkIccard 瀹炰綋瀵硅薄
+     */
+    void updateById(JkIccard jkIccard);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkIccards 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkIccard> jkIccards);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkIccard
+     */
+    JkIccard findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkIccard 瀹炰綋瀵硅薄
+     * @return JkIccard
+     */
+    JkIccard findOne(JkIccard jkIccard);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkIccard 瀹炰綋瀵硅薄
+     * @return List<JkIccard>
+     */
+    List<JkIccard> findList(JkIccard jkIccard);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkIccard>
+     */
+    PageData<JkIccard> findPage(PageWrap<JkIccard> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkIccard 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkIccard jkIccard);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkKeysService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkKeysService.java
new file mode 100644
index 0000000..8f9ff71
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkKeysService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkKeys;
+import java.util.List;
+
+/**
+ * 閽ュ寵鍩烘湰淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkKeysService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkKeys 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkKeys jkKeys);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkKeys 瀹炰綋瀵硅薄
+     */
+    void delete(JkKeys jkKeys);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkKeys 瀹炰綋瀵硅薄
+     */
+    void updateById(JkKeys jkKeys);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkKeyss 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkKeys> jkKeyss);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkKeys
+     */
+    JkKeys findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkKeys 瀹炰綋瀵硅薄
+     * @return JkKeys
+     */
+    JkKeys findOne(JkKeys jkKeys);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkKeys 瀹炰綋瀵硅薄
+     * @return List<JkKeys>
+     */
+    List<JkKeys> findList(JkKeys jkKeys);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkKeys>
+     */
+    PageData<JkKeys> findPage(PageWrap<JkKeys> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkKeys 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkKeys jkKeys);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java
new file mode 100644
index 0000000..4405246
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkLine;
+import java.util.List;
+
+/**
+ * 浜ゆ帶-绾胯矾淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkLineService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkLine 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkLine jkLine);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkLine 瀹炰綋瀵硅薄
+     */
+    void delete(JkLine jkLine);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkLine 瀹炰綋瀵硅薄
+     */
+    void updateById(JkLine jkLine);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkLines 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkLine> jkLines);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkLine
+     */
+    JkLine findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkLine 瀹炰綋瀵硅薄
+     * @return JkLine
+     */
+    JkLine findOne(JkLine jkLine);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkLine 瀹炰綋瀵硅薄
+     * @return List<JkLine>
+     */
+    List<JkLine> findList(JkLine jkLine);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkLine>
+     */
+    PageData<JkLine> findPage(PageWrap<JkLine> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkLine 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkLine jkLine);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkOrdersService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkOrdersService.java
new file mode 100644
index 0000000..6b9736d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkOrdersService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkOrders;
+import java.util.List;
+
+/**
+ * 浜ゆ帶-閿�鍞鍗曚俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkOrdersService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkOrders 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkOrders jkOrders);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkOrders 瀹炰綋瀵硅薄
+     */
+    void delete(JkOrders jkOrders);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkOrders 瀹炰綋瀵硅薄
+     */
+    void updateById(JkOrders jkOrders);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkOrderss 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkOrders> jkOrderss);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkOrders
+     */
+    JkOrders findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkOrders 瀹炰綋瀵硅薄
+     * @return JkOrders
+     */
+    JkOrders findOne(JkOrders jkOrders);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkOrders 瀹炰綋瀵硅薄
+     * @return List<JkOrders>
+     */
+    List<JkOrders> findList(JkOrders jkOrders);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkOrders>
+     */
+    PageData<JkOrders> findPage(PageWrap<JkOrders> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkOrders 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkOrders jkOrders);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchCustomerService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchCustomerService.java
new file mode 100644
index 0000000..355b865
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchCustomerService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkSketchCustomer;
+import java.util.List;
+
+/**
+ * 浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkSketchCustomerService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkSketchCustomer 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkSketchCustomer jkSketchCustomer);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkSketchCustomer 瀹炰綋瀵硅薄
+     */
+    void delete(JkSketchCustomer jkSketchCustomer);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkSketchCustomer 瀹炰綋瀵硅薄
+     */
+    void updateById(JkSketchCustomer jkSketchCustomer);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkSketchCustomers 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkSketchCustomer> jkSketchCustomers);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkSketchCustomer
+     */
+    JkSketchCustomer findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkSketchCustomer 瀹炰綋瀵硅薄
+     * @return JkSketchCustomer
+     */
+    JkSketchCustomer findOne(JkSketchCustomer jkSketchCustomer);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkSketchCustomer 瀹炰綋瀵硅薄
+     * @return List<JkSketchCustomer>
+     */
+    List<JkSketchCustomer> findList(JkSketchCustomer jkSketchCustomer);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkSketchCustomer>
+     */
+    PageData<JkSketchCustomer> findPage(PageWrap<JkSketchCustomer> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkSketchCustomer 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkSketchCustomer jkSketchCustomer);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchLineService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchLineService.java
new file mode 100644
index 0000000..4766a7b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchLineService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkSketchLine;
+import java.util.List;
+
+/**
+ * 浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkSketchLineService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkSketchLine 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkSketchLine jkSketchLine);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkSketchLine 瀹炰綋瀵硅薄
+     */
+    void delete(JkSketchLine jkSketchLine);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkSketchLine 瀹炰綋瀵硅薄
+     */
+    void updateById(JkSketchLine jkSketchLine);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkSketchLines 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkSketchLine> jkSketchLines);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkSketchLine
+     */
+    JkSketchLine findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkSketchLine 瀹炰綋瀵硅薄
+     * @return JkSketchLine
+     */
+    JkSketchLine findOne(JkSketchLine jkSketchLine);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkSketchLine 瀹炰綋瀵硅薄
+     * @return List<JkSketchLine>
+     */
+    List<JkSketchLine> findList(JkSketchLine jkSketchLine);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkSketchLine>
+     */
+    PageData<JkSketchLine> findPage(PageWrap<JkSketchLine> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkSketchLine 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkSketchLine jkSketchLine);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchService.java
new file mode 100644
index 0000000..f2cc256
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkSketch;
+import java.util.List;
+
+/**
+ * 浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkSketchService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkSketch 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkSketch jkSketch);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkSketch 瀹炰綋瀵硅薄
+     */
+    void delete(JkSketch jkSketch);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkSketch 瀹炰綋瀵硅薄
+     */
+    void updateById(JkSketch jkSketch);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkSketchs 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkSketch> jkSketchs);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkSketch
+     */
+    JkSketch findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkSketch 瀹炰綋瀵硅薄
+     * @return JkSketch
+     */
+    JkSketch findOne(JkSketch jkSketch);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkSketch 瀹炰綋瀵硅薄
+     * @return List<JkSketch>
+     */
+    List<JkSketch> findList(JkSketch jkSketch);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkSketch>
+     */
+    PageData<JkSketch> findPage(PageWrap<JkSketch> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkSketch 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkSketch jkSketch);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkVersionService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkVersionService.java
new file mode 100644
index 0000000..a9dd9d9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkVersionService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.JkVersion;
+import java.util.List;
+
+/**
+ * 浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface JkVersionService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param jkVersion 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(JkVersion jkVersion);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param jkVersion 瀹炰綋瀵硅薄
+     */
+    void delete(JkVersion jkVersion);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param jkVersion 瀹炰綋瀵硅薄
+     */
+    void updateById(JkVersion jkVersion);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param jkVersions 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<JkVersion> jkVersions);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return JkVersion
+     */
+    JkVersion findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param jkVersion 瀹炰綋瀵硅薄
+     * @return JkVersion
+     */
+    JkVersion findOne(JkVersion jkVersion);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param jkVersion 瀹炰綋瀵硅薄
+     * @return List<JkVersion>
+     */
+    List<JkVersion> findList(JkVersion jkVersion);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<JkVersion>
+     */
+    PageData<JkVersion> findPage(PageWrap<JkVersion> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param jkVersion 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(JkVersion jkVersion);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningPushService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningPushService.java
new file mode 100644
index 0000000..e3b5136
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningPushService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.WarningPush;
+import java.util.List;
+
+/**
+ * 鎶ヨ鎺ㄩ�佽褰昐ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningPushService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param warningPush 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(WarningPush warningPush);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param warningPush 瀹炰綋瀵硅薄
+     */
+    void delete(WarningPush warningPush);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param warningPush 瀹炰綋瀵硅薄
+     */
+    void updateById(WarningPush warningPush);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param warningPushs 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<WarningPush> warningPushs);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return WarningPush
+     */
+    WarningPush findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param warningPush 瀹炰綋瀵硅薄
+     * @return WarningPush
+     */
+    WarningPush findOne(WarningPush warningPush);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param warningPush 瀹炰綋瀵硅薄
+     * @return List<WarningPush>
+     */
+    List<WarningPush> findList(WarningPush warningPush);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<WarningPush>
+     */
+    PageData<WarningPush> findPage(PageWrap<WarningPush> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param warningPush 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(WarningPush warningPush);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleDetailService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleDetailService.java
new file mode 100644
index 0000000..c471154
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleDetailService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.WarningRuleDetail;
+import java.util.List;
+
+/**
+ * 鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningRuleDetailService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param warningRuleDetail 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(WarningRuleDetail warningRuleDetail);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param warningRuleDetail 瀹炰綋瀵硅薄
+     */
+    void delete(WarningRuleDetail warningRuleDetail);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param warningRuleDetail 瀹炰綋瀵硅薄
+     */
+    void updateById(WarningRuleDetail warningRuleDetail);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param warningRuleDetails 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<WarningRuleDetail> warningRuleDetails);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return WarningRuleDetail
+     */
+    WarningRuleDetail findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param warningRuleDetail 瀹炰綋瀵硅薄
+     * @return WarningRuleDetail
+     */
+    WarningRuleDetail findOne(WarningRuleDetail warningRuleDetail);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param warningRuleDetail 瀹炰綋瀵硅薄
+     * @return List<WarningRuleDetail>
+     */
+    List<WarningRuleDetail> findList(WarningRuleDetail warningRuleDetail);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<WarningRuleDetail>
+     */
+    PageData<WarningRuleDetail> findPage(PageWrap<WarningRuleDetail> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param warningRuleDetail 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(WarningRuleDetail warningRuleDetail);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleService.java
new file mode 100644
index 0000000..b553486
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningRuleService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.WarningRule;
+import java.util.List;
+
+/**
+ * 鎶ヨ瑙勫垯閰嶇疆琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningRuleService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param warningRule 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(WarningRule warningRule);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param warningRule 瀹炰綋瀵硅薄
+     */
+    void delete(WarningRule warningRule);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param warningRule 瀹炰綋瀵硅薄
+     */
+    void updateById(WarningRule warningRule);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param warningRules 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<WarningRule> warningRules);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return WarningRule
+     */
+    WarningRule findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param warningRule 瀹炰綋瀵硅薄
+     * @return WarningRule
+     */
+    WarningRule findOne(WarningRule warningRule);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param warningRule 瀹炰綋瀵硅薄
+     * @return List<WarningRule>
+     */
+    List<WarningRule> findList(WarningRule warningRule);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<WarningRule>
+     */
+    PageData<WarningRule> findPage(PageWrap<WarningRule> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param warningRule 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(WarningRule warningRule);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningService.java
new file mode 100644
index 0000000..9238c23
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.dao.business.model.Warning;
+import java.util.List;
+
+/**
+ * 鎶ヨ璁板綍淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+public interface WarningService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param warning 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Warning warning);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param warning 瀹炰綋瀵硅薄
+     */
+    void delete(Warning warning);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param warning 瀹炰綋瀵硅薄
+     */
+    void updateById(Warning warning);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param warnings 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Warning> warnings);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Warning
+     */
+    Warning findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param warning 瀹炰綋瀵硅薄
+     * @return Warning
+     */
+    Warning findOne(Warning warning);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param warning 瀹炰綋瀵硅薄
+     * @return List<Warning>
+     */
+    List<Warning> findList(Warning warning);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Warning>
+     */
+    PageData<Warning> findPage(PageWrap<Warning> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param warning 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Warning warning);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java
new file mode 100644
index 0000000..d197518
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java
@@ -0,0 +1,148 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkCabinetGridMapper;
+import com.doumee.dao.business.model.JkCabinetGrid;
+import com.doumee.service.business.JkCabinetGridService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.service.business.third.model.PageWrap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+@Service
+public class JkCabinetGridServiceImpl implements JkCabinetGridService {
+
+    @Autowired
+    private JkCabinetGridMapper jkCabinetGridMapper;
+
+    @Override
+    public Integer create(JkCabinetGrid jkCabinetGrid) {
+        jkCabinetGridMapper.insert(jkCabinetGrid);
+        return jkCabinetGrid.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkCabinetGridMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkCabinetGrid jkCabinetGrid) {
+        UpdateWrapper<JkCabinetGrid> deleteWrapper = new UpdateWrapper<>(jkCabinetGrid);
+        jkCabinetGridMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkCabinetGridMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkCabinetGrid jkCabinetGrid) {
+        jkCabinetGridMapper.updateById(jkCabinetGrid);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkCabinetGrid> jkCabinetGrids) {
+        if (CollectionUtils.isEmpty(jkCabinetGrids)) {
+            return;
+        }
+        for (JkCabinetGrid jkCabinetGrid: jkCabinetGrids) {
+            this.updateById(jkCabinetGrid);
+        }
+    }
+
+    @Override
+    public JkCabinetGrid findById(Integer id) {
+        return jkCabinetGridMapper.selectById(id);
+    }
+
+    @Override
+    public JkCabinetGrid findOne(JkCabinetGrid jkCabinetGrid) {
+        QueryWrapper<JkCabinetGrid> wrapper = new QueryWrapper<>(jkCabinetGrid);
+        return jkCabinetGridMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkCabinetGrid> findList(JkCabinetGrid jkCabinetGrid) {
+        QueryWrapper<JkCabinetGrid> wrapper = new QueryWrapper<>(jkCabinetGrid);
+        return jkCabinetGridMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkCabinetGrid> findPage(PageWrap<JkCabinetGrid> pageWrap) {
+        IPage<JkCabinetGrid> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkCabinetGrid> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkCabinetGrid::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkCabinetGrid::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkCabinetGrid::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkCabinetGrid::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getCabinetId() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getCabinetId, pageWrap.getModel().getCabinetId());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getKeyId() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getKeyId, pageWrap.getModel().getKeyId());
+        }
+        if (pageWrap.getModel().getSerialNo() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getSerialNo, pageWrap.getModel().getSerialNo());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getWorkingStatus() != null) {
+            queryWrapper.lambda().eq(JkCabinetGrid::getWorkingStatus, pageWrap.getModel().getWorkingStatus());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkCabinetGridMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkCabinetGrid jkCabinetGrid) {
+        QueryWrapper<JkCabinetGrid> wrapper = new QueryWrapper<>(jkCabinetGrid);
+        return jkCabinetGridMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java
new file mode 100644
index 0000000..bb3b8da
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java
@@ -0,0 +1,157 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkCabinetLogMapper;
+import com.doumee.dao.business.model.JkCabinetLog;
+import com.doumee.service.business.JkCabinetLogService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkCabinetLogServiceImpl implements JkCabinetLogService {
+
+    @Autowired
+    private JkCabinetLogMapper jkCabinetLogMapper;
+
+    @Override
+    public Integer create(JkCabinetLog jkCabinetLog) {
+        jkCabinetLogMapper.insert(jkCabinetLog);
+        return jkCabinetLog.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkCabinetLogMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkCabinetLog jkCabinetLog) {
+        UpdateWrapper<JkCabinetLog> deleteWrapper = new UpdateWrapper<>(jkCabinetLog);
+        jkCabinetLogMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkCabinetLogMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkCabinetLog jkCabinetLog) {
+        jkCabinetLogMapper.updateById(jkCabinetLog);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkCabinetLog> jkCabinetLogs) {
+        if (CollectionUtils.isEmpty(jkCabinetLogs)) {
+            return;
+        }
+        for (JkCabinetLog jkCabinetLog: jkCabinetLogs) {
+            this.updateById(jkCabinetLog);
+        }
+    }
+
+    @Override
+    public JkCabinetLog findById(Integer id) {
+        return jkCabinetLogMapper.selectById(id);
+    }
+
+    @Override
+    public JkCabinetLog findOne(JkCabinetLog jkCabinetLog) {
+        QueryWrapper<JkCabinetLog> wrapper = new QueryWrapper<>(jkCabinetLog);
+        return jkCabinetLogMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkCabinetLog> findList(JkCabinetLog jkCabinetLog) {
+        QueryWrapper<JkCabinetLog> wrapper = new QueryWrapper<>(jkCabinetLog);
+        return jkCabinetLogMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkCabinetLog> findPage(PageWrap<JkCabinetLog> pageWrap) {
+        IPage<JkCabinetLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkCabinetLog> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkCabinetLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkCabinetLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkCabinetLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkCabinetLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getCabinetId() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getCabinetId, pageWrap.getModel().getCabinetId());
+        }
+        if (pageWrap.getModel().getGridId() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getGridId, pageWrap.getModel().getGridId());
+        }
+        if (pageWrap.getModel().getAuthType() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getAuthType, pageWrap.getModel().getAuthType());
+        }
+        if (pageWrap.getModel().getCarId() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getCarId, pageWrap.getModel().getCarId());
+        }
+        if (pageWrap.getModel().getKeyId() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getKeyId, pageWrap.getModel().getKeyId());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getKeyInfo() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getKeyInfo, pageWrap.getModel().getKeyInfo());
+        }
+        if (pageWrap.getModel().getRoleType() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getRoleType, pageWrap.getModel().getRoleType());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkCabinetLog::getStatus, pageWrap.getModel().getStatus());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkCabinetLogMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkCabinetLog jkCabinetLog) {
+        QueryWrapper<JkCabinetLog> wrapper = new QueryWrapper<>(jkCabinetLog);
+        return jkCabinetLogMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
new file mode 100644
index 0000000..ace6b04
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
@@ -0,0 +1,194 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkCabinetMapper;
+import com.doumee.dao.business.model.JkCabinet;
+import com.doumee.service.business.JkCabinetService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkCabinetServiceImpl implements JkCabinetService {
+
+    @Autowired
+    private JkCabinetMapper jkCabinetMapper;
+
+    @Override
+    public Integer create(JkCabinet jkCabinet) {
+        jkCabinetMapper.insert(jkCabinet);
+        return jkCabinet.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkCabinetMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkCabinet jkCabinet) {
+        UpdateWrapper<JkCabinet> deleteWrapper = new UpdateWrapper<>(jkCabinet);
+        jkCabinetMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkCabinetMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkCabinet jkCabinet) {
+        jkCabinetMapper.updateById(jkCabinet);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkCabinet> jkCabinets) {
+        if (CollectionUtils.isEmpty(jkCabinets)) {
+            return;
+        }
+        for (JkCabinet jkCabinet: jkCabinets) {
+            this.updateById(jkCabinet);
+        }
+    }
+
+    @Override
+    public JkCabinet findById(Integer id) {
+        return jkCabinetMapper.selectById(id);
+    }
+
+    @Override
+    public JkCabinet findOne(JkCabinet jkCabinet) {
+        QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
+        return jkCabinetMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkCabinet> findList(JkCabinet jkCabinet) {
+        QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
+        return jkCabinetMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkCabinet> findPage(PageWrap<JkCabinet> pageWrap) {
+        IPage<JkCabinet> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkCabinet> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkCabinet::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkCabinet::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkCabinet::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkCabinet::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getDevId() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getDevId, pageWrap.getModel().getDevId());
+        }
+        if (pageWrap.getModel().getSerialNo() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getSerialNo, pageWrap.getModel().getSerialNo());
+        }
+        if (pageWrap.getModel().getLinkAddr() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getLinkAddr, pageWrap.getModel().getLinkAddr());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getPort() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getPort, pageWrap.getModel().getPort());
+        }
+        if (pageWrap.getModel().getManagerId() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getManagerId, pageWrap.getModel().getManagerId());
+        }
+        if (pageWrap.getModel().getUseTime() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getUseTime, pageWrap.getModel().getUseTime());
+        }
+        if (pageWrap.getModel().getDoubleAuth() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getDoubleAuth, pageWrap.getModel().getDoubleAuth());
+        }
+        if (pageWrap.getModel().getAuthMemberId() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getAuthMemberId, pageWrap.getModel().getAuthMemberId());
+        }
+        if (pageWrap.getModel().getRowNum() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getRowNum, pageWrap.getModel().getRowNum());
+        }
+        if (pageWrap.getModel().getColumnNum() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getColumnNum, pageWrap.getModel().getColumnNum());
+        }
+        if (pageWrap.getModel().getHaertTime() != null) {
+            queryWrapper.lambda().ge(JkCabinet::getHaertTime, Utils.Date.getStart(pageWrap.getModel().getHaertTime()));
+            queryWrapper.lambda().le(JkCabinet::getHaertTime, Utils.Date.getEnd(pageWrap.getModel().getHaertTime()));
+        }
+        if (pageWrap.getModel().getLacation() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getLacation, pageWrap.getModel().getLacation());
+        }
+        if (pageWrap.getModel().getLongitude() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getLongitude, pageWrap.getModel().getLongitude());
+        }
+        if (pageWrap.getModel().getLatitude() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getLatitude, pageWrap.getModel().getLatitude());
+        }
+        if (pageWrap.getModel().getNoType() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getNoType, pageWrap.getModel().getNoType());
+        }
+        if (pageWrap.getModel().getNoPrefix() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getNoPrefix, pageWrap.getModel().getNoPrefix());
+        }
+        if (pageWrap.getModel().getNoLength() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getNoLength, pageWrap.getModel().getNoLength());
+        }
+        if (pageWrap.getModel().getNoIndex() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getNoIndex, pageWrap.getModel().getNoIndex());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkCabinetMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkCabinet jkCabinet) {
+        QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
+        return jkCabinetMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java
new file mode 100644
index 0000000..82e889a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java
@@ -0,0 +1,157 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkCustomerMapper;
+import com.doumee.dao.business.model.JkCustomer;
+import com.doumee.service.business.JkCustomerService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkCustomerServiceImpl implements JkCustomerService {
+
+    @Autowired
+    private JkCustomerMapper jkCustomerMapper;
+
+    @Override
+    public Integer create(JkCustomer jkCustomer) {
+        jkCustomerMapper.insert(jkCustomer);
+        return jkCustomer.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkCustomerMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkCustomer jkCustomer) {
+        UpdateWrapper<JkCustomer> deleteWrapper = new UpdateWrapper<>(jkCustomer);
+        jkCustomerMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkCustomerMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkCustomer jkCustomer) {
+        jkCustomerMapper.updateById(jkCustomer);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkCustomer> jkCustomers) {
+        if (CollectionUtils.isEmpty(jkCustomers)) {
+            return;
+        }
+        for (JkCustomer jkCustomer: jkCustomers) {
+            this.updateById(jkCustomer);
+        }
+    }
+
+    @Override
+    public JkCustomer findById(Integer id) {
+        return jkCustomerMapper.selectById(id);
+    }
+
+    @Override
+    public JkCustomer findOne(JkCustomer jkCustomer) {
+        QueryWrapper<JkCustomer> wrapper = new QueryWrapper<>(jkCustomer);
+        return jkCustomerMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkCustomer> findList(JkCustomer jkCustomer) {
+        QueryWrapper<JkCustomer> wrapper = new QueryWrapper<>(jkCustomer);
+        return jkCustomerMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkCustomer> findPage(PageWrap<JkCustomer> pageWrap) {
+        IPage<JkCustomer> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkCustomer> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkCustomer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkCustomer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkCustomer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkCustomer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getLacation() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getLacation, pageWrap.getModel().getLacation());
+        }
+        if (pageWrap.getModel().getLongitude() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getLongitude, pageWrap.getModel().getLongitude());
+        }
+        if (pageWrap.getModel().getLatitude() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getLatitude, pageWrap.getModel().getLatitude());
+        }
+        if (pageWrap.getModel().getWeeks() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getWeeks, pageWrap.getModel().getWeeks());
+        }
+        if (pageWrap.getModel().getLineId() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getLineId, pageWrap.getModel().getLineId());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkCustomer::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(JkCustomer::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(jkCustomerMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkCustomer jkCustomer) {
+        QueryWrapper<JkCustomer> wrapper = new QueryWrapper<>(jkCustomer);
+        return jkCustomerMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java
new file mode 100644
index 0000000..0964dc4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java
@@ -0,0 +1,145 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkIccardMapper;
+import com.doumee.dao.business.model.JkIccard;
+import com.doumee.service.business.JkIccardService;
+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;
+
+/**
+ * 閽ュ寵鏌淚C鍗′俊鎭〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/09/28 09:01
+ */
+@Service
+public class JkIccardServiceImpl implements JkIccardService {
+
+    @Autowired
+    private JkIccardMapper jkIccardMapper;
+
+    @Override
+    public Integer create(JkIccard jkIccard) {
+        jkIccardMapper.insert(jkIccard);
+        return jkIccard.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkIccardMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkIccard jkIccard) {
+        UpdateWrapper<JkIccard> deleteWrapper = new UpdateWrapper<>(jkIccard);
+        jkIccardMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkIccardMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkIccard jkIccard) {
+        jkIccardMapper.updateById(jkIccard);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkIccard> jkIccards) {
+        if (CollectionUtils.isEmpty(jkIccards)) {
+            return;
+        }
+        for (JkIccard jkIccard: jkIccards) {
+            this.updateById(jkIccard);
+        }
+    }
+
+    @Override
+    public JkIccard findById(Integer id) {
+        return jkIccardMapper.selectById(id);
+    }
+
+    @Override
+    public JkIccard findOne(JkIccard jkIccard) {
+        QueryWrapper<JkIccard> wrapper = new QueryWrapper<>(jkIccard);
+        return jkIccardMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkIccard> findList(JkIccard jkIccard) {
+        QueryWrapper<JkIccard> wrapper = new QueryWrapper<>(jkIccard);
+        return jkIccardMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkIccard> findPage(PageWrap<JkIccard> pageWrap) {
+        IPage<JkIccard> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkIccard> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkIccard::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkIccard::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkIccard::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkIccard::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkIccard::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkIccard::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkIccard::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkIccard::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkIccard::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(JkIccard::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(JkIccard::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkIccard::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(JkIccard::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getCabinetId() != null) {
+            queryWrapper.lambda().eq(JkIccard::getCabinetId, pageWrap.getModel().getCabinetId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkIccardMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkIccard jkIccard) {
+        QueryWrapper<JkIccard> wrapper = new QueryWrapper<>(jkIccard);
+        return jkIccardMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java
new file mode 100644
index 0000000..dcb7279
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java
@@ -0,0 +1,148 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkKeysMapper;
+import com.doumee.dao.business.model.JkKeys;
+import com.doumee.service.business.JkKeysService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkKeysServiceImpl implements JkKeysService {
+
+    @Autowired
+    private JkKeysMapper jkKeysMapper;
+
+    @Override
+    public Integer create(JkKeys jkKeys) {
+        jkKeysMapper.insert(jkKeys);
+        return jkKeys.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkKeysMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkKeys jkKeys) {
+        UpdateWrapper<JkKeys> deleteWrapper = new UpdateWrapper<>(jkKeys);
+        jkKeysMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkKeysMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkKeys jkKeys) {
+        jkKeysMapper.updateById(jkKeys);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkKeys> jkKeyss) {
+        if (CollectionUtils.isEmpty(jkKeyss)) {
+            return;
+        }
+        for (JkKeys jkKeys: jkKeyss) {
+            this.updateById(jkKeys);
+        }
+    }
+
+    @Override
+    public JkKeys findById(Integer id) {
+        return jkKeysMapper.selectById(id);
+    }
+
+    @Override
+    public JkKeys findOne(JkKeys jkKeys) {
+        QueryWrapper<JkKeys> wrapper = new QueryWrapper<>(jkKeys);
+        return jkKeysMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkKeys> findList(JkKeys jkKeys) {
+        QueryWrapper<JkKeys> wrapper = new QueryWrapper<>(jkKeys);
+        return jkKeysMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkKeys> findPage(PageWrap<JkKeys> pageWrap) {
+        IPage<JkKeys> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkKeys> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkKeys::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkKeys::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkKeys::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkKeys::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkKeys::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkKeys::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkKeys::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkKeys::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkKeys::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(JkKeys::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getCarCode() != null) {
+            queryWrapper.lambda().eq(JkKeys::getCarCode, pageWrap.getModel().getCarCode());
+        }
+        if (pageWrap.getModel().getCarId() != null) {
+            queryWrapper.lambda().eq(JkKeys::getCarId, pageWrap.getModel().getCarId());
+        }
+        if (pageWrap.getModel().getRfidLable() != null) {
+            queryWrapper.lambda().eq(JkKeys::getRfidLable, pageWrap.getModel().getRfidLable());
+        }
+        if (pageWrap.getModel().getRoleType() != null) {
+            queryWrapper.lambda().eq(JkKeys::getRoleType, pageWrap.getModel().getRoleType());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkKeys::getStatus, pageWrap.getModel().getStatus());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkKeysMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkKeys jkKeys) {
+        QueryWrapper<JkKeys> wrapper = new QueryWrapper<>(jkKeys);
+        return jkKeysMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java
new file mode 100644
index 0000000..ff6161e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java
@@ -0,0 +1,151 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkLineMapper;
+import com.doumee.dao.business.model.JkLine;
+import com.doumee.service.business.JkLineService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkLineServiceImpl implements JkLineService {
+
+    @Autowired
+    private JkLineMapper jkLineMapper;
+
+    @Override
+    public Integer create(JkLine jkLine) {
+        jkLineMapper.insert(jkLine);
+        return jkLine.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkLineMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkLine jkLine) {
+        UpdateWrapper<JkLine> deleteWrapper = new UpdateWrapper<>(jkLine);
+        jkLineMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkLineMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkLine jkLine) {
+        jkLineMapper.updateById(jkLine);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkLine> jkLines) {
+        if (CollectionUtils.isEmpty(jkLines)) {
+            return;
+        }
+        for (JkLine jkLine: jkLines) {
+            this.updateById(jkLine);
+        }
+    }
+
+    @Override
+    public JkLine findById(Integer id) {
+        return jkLineMapper.selectById(id);
+    }
+
+    @Override
+    public JkLine findOne(JkLine jkLine) {
+        QueryWrapper<JkLine> wrapper = new QueryWrapper<>(jkLine);
+        return jkLineMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkLine> findList(JkLine jkLine) {
+        QueryWrapper<JkLine> wrapper = new QueryWrapper<>(jkLine);
+        return jkLineMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkLine> findPage(PageWrap<JkLine> pageWrap) {
+        IPage<JkLine> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkLine> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkLine::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkLine::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkLine::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkLine::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkLine::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkLine::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkLine::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkLine::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkLine::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(JkLine::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getCategoryId() != null) {
+            queryWrapper.lambda().eq(JkLine::getCategoryId, pageWrap.getModel().getCategoryId());
+        }
+        if (pageWrap.getModel().getCarId() != null) {
+            queryWrapper.lambda().eq(JkLine::getCarId, pageWrap.getModel().getCarId());
+        }
+        if (pageWrap.getModel().getMaxCustomer() != null) {
+            queryWrapper.lambda().eq(JkLine::getMaxCustomer, pageWrap.getModel().getMaxCustomer());
+        }
+        if (pageWrap.getModel().getMaxOrder() != null) {
+            queryWrapper.lambda().eq(JkLine::getMaxOrder, pageWrap.getModel().getMaxOrder());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkLine::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(JkLine::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(jkLineMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkLine jkLine) {
+        QueryWrapper<JkLine> wrapper = new QueryWrapper<>(jkLine);
+        return jkLineMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkOrdersServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkOrdersServiceImpl.java
new file mode 100644
index 0000000..d88ff6a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkOrdersServiceImpl.java
@@ -0,0 +1,152 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkOrdersMapper;
+import com.doumee.dao.business.model.JkOrders;
+import com.doumee.service.business.JkOrdersService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkOrdersServiceImpl implements JkOrdersService {
+
+    @Autowired
+    private JkOrdersMapper jkOrdersMapper;
+
+    @Override
+    public Integer create(JkOrders jkOrders) {
+        jkOrdersMapper.insert(jkOrders);
+        return jkOrders.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkOrdersMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkOrders jkOrders) {
+        UpdateWrapper<JkOrders> deleteWrapper = new UpdateWrapper<>(jkOrders);
+        jkOrdersMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkOrdersMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkOrders jkOrders) {
+        jkOrdersMapper.updateById(jkOrders);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkOrders> jkOrderss) {
+        if (CollectionUtils.isEmpty(jkOrderss)) {
+            return;
+        }
+        for (JkOrders jkOrders: jkOrderss) {
+            this.updateById(jkOrders);
+        }
+    }
+
+    @Override
+    public JkOrders findById(Integer id) {
+        return jkOrdersMapper.selectById(id);
+    }
+
+    @Override
+    public JkOrders findOne(JkOrders jkOrders) {
+        QueryWrapper<JkOrders> wrapper = new QueryWrapper<>(jkOrders);
+        return jkOrdersMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkOrders> findList(JkOrders jkOrders) {
+        QueryWrapper<JkOrders> wrapper = new QueryWrapper<>(jkOrders);
+        return jkOrdersMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkOrders> findPage(PageWrap<JkOrders> pageWrap) {
+        IPage<JkOrders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkOrders> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkOrders::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkOrders::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkOrders::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkOrders::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkOrders::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkOrders::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkOrders::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkOrders::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkOrders::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(JkOrders::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getNum() != null) {
+            queryWrapper.lambda().eq(JkOrders::getNum, pageWrap.getModel().getNum());
+        }
+        if (pageWrap.getModel().getLineId() != null) {
+            queryWrapper.lambda().eq(JkOrders::getLineId, pageWrap.getModel().getLineId());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkOrders::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(JkOrders::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getDateInfo() != null) {
+            queryWrapper.lambda().ge(JkOrders::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
+            queryWrapper.lambda().le(JkOrders::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
+        }
+        if (pageWrap.getModel().getDistances() != null) {
+            queryWrapper.lambda().eq(JkOrders::getDistances, pageWrap.getModel().getDistances());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkOrdersMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkOrders jkOrders) {
+        QueryWrapper<JkOrders> wrapper = new QueryWrapper<>(jkOrders);
+        return jkOrdersMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchCustomerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchCustomerServiceImpl.java
new file mode 100644
index 0000000..c58701d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchCustomerServiceImpl.java
@@ -0,0 +1,149 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkSketchCustomerMapper;
+import com.doumee.dao.business.model.JkSketchCustomer;
+import com.doumee.service.business.JkSketchCustomerService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkSketchCustomerServiceImpl implements JkSketchCustomerService {
+
+    @Autowired
+    private JkSketchCustomerMapper jkSketchCustomerMapper;
+
+    @Override
+    public Integer create(JkSketchCustomer jkSketchCustomer) {
+        jkSketchCustomerMapper.insert(jkSketchCustomer);
+        return jkSketchCustomer.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkSketchCustomerMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkSketchCustomer jkSketchCustomer) {
+        UpdateWrapper<JkSketchCustomer> deleteWrapper = new UpdateWrapper<>(jkSketchCustomer);
+        jkSketchCustomerMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkSketchCustomerMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkSketchCustomer jkSketchCustomer) {
+        jkSketchCustomerMapper.updateById(jkSketchCustomer);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkSketchCustomer> jkSketchCustomers) {
+        if (CollectionUtils.isEmpty(jkSketchCustomers)) {
+            return;
+        }
+        for (JkSketchCustomer jkSketchCustomer: jkSketchCustomers) {
+            this.updateById(jkSketchCustomer);
+        }
+    }
+
+    @Override
+    public JkSketchCustomer findById(Integer id) {
+        return jkSketchCustomerMapper.selectById(id);
+    }
+
+    @Override
+    public JkSketchCustomer findOne(JkSketchCustomer jkSketchCustomer) {
+        QueryWrapper<JkSketchCustomer> wrapper = new QueryWrapper<>(jkSketchCustomer);
+        return jkSketchCustomerMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkSketchCustomer> findList(JkSketchCustomer jkSketchCustomer) {
+        QueryWrapper<JkSketchCustomer> wrapper = new QueryWrapper<>(jkSketchCustomer);
+        return jkSketchCustomerMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkSketchCustomer> findPage(PageWrap<JkSketchCustomer> pageWrap) {
+        IPage<JkSketchCustomer> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkSketchCustomer> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkSketchCustomer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkSketchCustomer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkSketchCustomer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkSketchCustomer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getSketchLineId() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getSketchLineId, pageWrap.getModel().getSketchLineId());
+        }
+        if (pageWrap.getModel().getSketchId() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getSketchId, pageWrap.getModel().getSketchId());
+        }
+        if (pageWrap.getModel().getTotalNum() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getTotalNum, pageWrap.getModel().getTotalNum());
+        }
+        if (pageWrap.getModel().getOrderNum() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getOrderNum, pageWrap.getModel().getOrderNum());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(JkSketchCustomer::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getDateInfo() != null) {
+            queryWrapper.lambda().ge(JkSketchCustomer::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
+            queryWrapper.lambda().le(JkSketchCustomer::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkSketchCustomerMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkSketchCustomer jkSketchCustomer) {
+        QueryWrapper<JkSketchCustomer> wrapper = new QueryWrapper<>(jkSketchCustomer);
+        return jkSketchCustomerMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchLineServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchLineServiceImpl.java
new file mode 100644
index 0000000..becfce2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchLineServiceImpl.java
@@ -0,0 +1,149 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkSketchLineMapper;
+import com.doumee.dao.business.model.JkSketchLine;
+import com.doumee.service.business.JkSketchLineService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkSketchLineServiceImpl implements JkSketchLineService {
+
+    @Autowired
+    private JkSketchLineMapper jkSketchLineMapper;
+
+    @Override
+    public Integer create(JkSketchLine jkSketchLine) {
+        jkSketchLineMapper.insert(jkSketchLine);
+        return jkSketchLine.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkSketchLineMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkSketchLine jkSketchLine) {
+        UpdateWrapper<JkSketchLine> deleteWrapper = new UpdateWrapper<>(jkSketchLine);
+        jkSketchLineMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkSketchLineMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkSketchLine jkSketchLine) {
+        jkSketchLineMapper.updateById(jkSketchLine);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkSketchLine> jkSketchLines) {
+        if (CollectionUtils.isEmpty(jkSketchLines)) {
+            return;
+        }
+        for (JkSketchLine jkSketchLine: jkSketchLines) {
+            this.updateById(jkSketchLine);
+        }
+    }
+
+    @Override
+    public JkSketchLine findById(Integer id) {
+        return jkSketchLineMapper.selectById(id);
+    }
+
+    @Override
+    public JkSketchLine findOne(JkSketchLine jkSketchLine) {
+        QueryWrapper<JkSketchLine> wrapper = new QueryWrapper<>(jkSketchLine);
+        return jkSketchLineMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkSketchLine> findList(JkSketchLine jkSketchLine) {
+        QueryWrapper<JkSketchLine> wrapper = new QueryWrapper<>(jkSketchLine);
+        return jkSketchLineMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkSketchLine> findPage(PageWrap<JkSketchLine> pageWrap) {
+        IPage<JkSketchLine> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkSketchLine> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkSketchLine::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkSketchLine::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkSketchLine::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkSketchLine::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getLineId() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getLineId, pageWrap.getModel().getLineId());
+        }
+        if (pageWrap.getModel().getSketchId() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getSketchId, pageWrap.getModel().getSketchId());
+        }
+        if (pageWrap.getModel().getTotalNum() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getTotalNum, pageWrap.getModel().getTotalNum());
+        }
+        if (pageWrap.getModel().getOrderNum() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getOrderNum, pageWrap.getModel().getOrderNum());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(JkSketchLine::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getDateInfo() != null) {
+            queryWrapper.lambda().ge(JkSketchLine::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
+            queryWrapper.lambda().le(JkSketchLine::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkSketchLineMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkSketchLine jkSketchLine) {
+        QueryWrapper<JkSketchLine> wrapper = new QueryWrapper<>(jkSketchLine);
+        return jkSketchLineMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
new file mode 100644
index 0000000..3bab1bb
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
@@ -0,0 +1,152 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkSketchMapper;
+import com.doumee.dao.business.model.JkSketch;
+import com.doumee.service.business.JkSketchService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkSketchServiceImpl implements JkSketchService {
+
+    @Autowired
+    private JkSketchMapper jkSketchMapper;
+
+    @Override
+    public Integer create(JkSketch jkSketch) {
+        jkSketchMapper.insert(jkSketch);
+        return jkSketch.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkSketchMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkSketch jkSketch) {
+        UpdateWrapper<JkSketch> deleteWrapper = new UpdateWrapper<>(jkSketch);
+        jkSketchMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkSketchMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkSketch jkSketch) {
+        jkSketchMapper.updateById(jkSketch);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkSketch> jkSketchs) {
+        if (CollectionUtils.isEmpty(jkSketchs)) {
+            return;
+        }
+        for (JkSketch jkSketch: jkSketchs) {
+            this.updateById(jkSketch);
+        }
+    }
+
+    @Override
+    public JkSketch findById(Integer id) {
+        return jkSketchMapper.selectById(id);
+    }
+
+    @Override
+    public JkSketch findOne(JkSketch jkSketch) {
+        QueryWrapper<JkSketch> wrapper = new QueryWrapper<>(jkSketch);
+        return jkSketchMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkSketch> findList(JkSketch jkSketch) {
+        QueryWrapper<JkSketch> wrapper = new QueryWrapper<>(jkSketch);
+        return jkSketchMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkSketch> findPage(PageWrap<JkSketch> pageWrap) {
+        IPage<JkSketch> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkSketch> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkSketch::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkSketch::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkSketch::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkSketch::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkSketch::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkSketch::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkSketch::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkSketch::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkSketch::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getCategoryId() != null) {
+            queryWrapper.lambda().eq(JkSketch::getCategoryId, pageWrap.getModel().getCategoryId());
+        }
+        if (pageWrap.getModel().getTotalNum() != null) {
+            queryWrapper.lambda().eq(JkSketch::getTotalNum, pageWrap.getModel().getTotalNum());
+        }
+        if (pageWrap.getModel().getOrderNum() != null) {
+            queryWrapper.lambda().eq(JkSketch::getOrderNum, pageWrap.getModel().getOrderNum());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(JkSketch::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(JkSketch::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getDateInfo() != null) {
+            queryWrapper.lambda().ge(JkSketch::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
+            queryWrapper.lambda().le(JkSketch::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
+        }
+        if (pageWrap.getModel().getJobId() != null) {
+            queryWrapper.lambda().eq(JkSketch::getJobId, pageWrap.getModel().getJobId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkSketchMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkSketch jkSketch) {
+        QueryWrapper<JkSketch> wrapper = new QueryWrapper<>(jkSketch);
+        return jkSketchMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkVersionServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkVersionServiceImpl.java
new file mode 100644
index 0000000..9a360c2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkVersionServiceImpl.java
@@ -0,0 +1,154 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.JkVersionMapper;
+import com.doumee.dao.business.model.JkVersion;
+import com.doumee.service.business.JkVersionService;
+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 2025/09/28 09:01
+ */
+@Service
+public class JkVersionServiceImpl implements JkVersionService {
+
+    @Autowired
+    private JkVersionMapper jkVersionMapper;
+
+    @Override
+    public Integer create(JkVersion jkVersion) {
+        jkVersionMapper.insert(jkVersion);
+        return jkVersion.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        jkVersionMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(JkVersion jkVersion) {
+        UpdateWrapper<JkVersion> deleteWrapper = new UpdateWrapper<>(jkVersion);
+        jkVersionMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        jkVersionMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(JkVersion jkVersion) {
+        jkVersionMapper.updateById(jkVersion);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<JkVersion> jkVersions) {
+        if (CollectionUtils.isEmpty(jkVersions)) {
+            return;
+        }
+        for (JkVersion jkVersion: jkVersions) {
+            this.updateById(jkVersion);
+        }
+    }
+
+    @Override
+    public JkVersion findById(Integer id) {
+        return jkVersionMapper.selectById(id);
+    }
+
+    @Override
+    public JkVersion findOne(JkVersion jkVersion) {
+        QueryWrapper<JkVersion> wrapper = new QueryWrapper<>(jkVersion);
+        return jkVersionMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<JkVersion> findList(JkVersion jkVersion) {
+        QueryWrapper<JkVersion> wrapper = new QueryWrapper<>(jkVersion);
+        return jkVersionMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<JkVersion> findPage(PageWrap<JkVersion> pageWrap) {
+        IPage<JkVersion> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<JkVersion> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(JkVersion::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(JkVersion::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(JkVersion::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(JkVersion::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(JkVersion::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(JkVersion::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(JkVersion::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(JkVersion::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(JkVersion::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getVersionInfo() != null) {
+            queryWrapper.lambda().eq(JkVersion::getVersionInfo, pageWrap.getModel().getVersionInfo());
+        }
+        if (pageWrap.getModel().getFileUrl() != null) {
+            queryWrapper.lambda().eq(JkVersion::getFileUrl, pageWrap.getModel().getFileUrl());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(JkVersion::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().eq(JkVersion::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(JkVersion::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getTitle() != null) {
+            queryWrapper.lambda().eq(JkVersion::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getIsForce() != null) {
+            queryWrapper.lambda().eq(JkVersion::getIsForce, pageWrap.getModel().getIsForce());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(JkVersion::getType, pageWrap.getModel().getType());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(jkVersionMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(JkVersion jkVersion) {
+        QueryWrapper<JkVersion> wrapper = new QueryWrapper<>(jkVersion);
+        return jkVersionMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningPushServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningPushServiceImpl.java
new file mode 100644
index 0000000..d1cb6d2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningPushServiceImpl.java
@@ -0,0 +1,161 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.WarningPushMapper;
+import com.doumee.dao.business.model.WarningPush;
+import com.doumee.service.business.WarningPushService;
+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 2025/09/28 09:01
+ */
+@Service
+public class WarningPushServiceImpl implements WarningPushService {
+
+    @Autowired
+    private WarningPushMapper warningPushMapper;
+
+    @Override
+    public Integer create(WarningPush warningPush) {
+        warningPushMapper.insert(warningPush);
+        return warningPush.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        warningPushMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(WarningPush warningPush) {
+        UpdateWrapper<WarningPush> deleteWrapper = new UpdateWrapper<>(warningPush);
+        warningPushMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        warningPushMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(WarningPush warningPush) {
+        warningPushMapper.updateById(warningPush);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<WarningPush> warningPushs) {
+        if (CollectionUtils.isEmpty(warningPushs)) {
+            return;
+        }
+        for (WarningPush warningPush: warningPushs) {
+            this.updateById(warningPush);
+        }
+    }
+
+    @Override
+    public WarningPush findById(Integer id) {
+        return warningPushMapper.selectById(id);
+    }
+
+    @Override
+    public WarningPush findOne(WarningPush warningPush) {
+        QueryWrapper<WarningPush> wrapper = new QueryWrapper<>(warningPush);
+        return warningPushMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<WarningPush> findList(WarningPush warningPush) {
+        QueryWrapper<WarningPush> wrapper = new QueryWrapper<>(warningPush);
+        return warningPushMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<WarningPush> findPage(PageWrap<WarningPush> pageWrap) {
+        IPage<WarningPush> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<WarningPush> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(WarningPush::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(WarningPush::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(WarningPush::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(WarningPush::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(WarningPush::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(WarningPush::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(WarningPush::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(WarningPush::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(WarningPush::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(WarningPush::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getWarningId() != null) {
+            queryWrapper.lambda().eq(WarningPush::getWarningId, pageWrap.getModel().getWarningId());
+        }
+        if (pageWrap.getModel().getTitle() != null) {
+            queryWrapper.lambda().eq(WarningPush::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().eq(WarningPush::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(WarningPush::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getPushInfo() != null) {
+            queryWrapper.lambda().eq(WarningPush::getPushInfo, pageWrap.getModel().getPushInfo());
+        }
+        if (pageWrap.getModel().getEventInfo() != null) {
+            queryWrapper.lambda().eq(WarningPush::getEventInfo, pageWrap.getModel().getEventInfo());
+        }
+        if (pageWrap.getModel().getPushId() != null) {
+            queryWrapper.lambda().eq(WarningPush::getPushId, pageWrap.getModel().getPushId());
+        }
+        if (pageWrap.getModel().getPushDate() != null) {
+            queryWrapper.lambda().ge(WarningPush::getPushDate, Utils.Date.getStart(pageWrap.getModel().getPushDate()));
+            queryWrapper.lambda().le(WarningPush::getPushDate, Utils.Date.getEnd(pageWrap.getModel().getPushDate()));
+        }
+        if (pageWrap.getModel().getPushType() != null) {
+            queryWrapper.lambda().eq(WarningPush::getPushType, pageWrap.getModel().getPushType());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(warningPushMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(WarningPush warningPush) {
+        QueryWrapper<WarningPush> wrapper = new QueryWrapper<>(warningPush);
+        return warningPushMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleDetailServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleDetailServiceImpl.java
new file mode 100644
index 0000000..c6a6216
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleDetailServiceImpl.java
@@ -0,0 +1,148 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.WarningRuleDetailMapper;
+import com.doumee.dao.business.model.WarningRuleDetail;
+import com.doumee.service.business.WarningRuleDetailService;
+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 2025/09/28 09:01
+ */
+@Service
+public class WarningRuleDetailServiceImpl implements WarningRuleDetailService {
+
+    @Autowired
+    private WarningRuleDetailMapper warningRuleDetailMapper;
+
+    @Override
+    public Integer create(WarningRuleDetail warningRuleDetail) {
+        warningRuleDetailMapper.insert(warningRuleDetail);
+        return warningRuleDetail.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        warningRuleDetailMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(WarningRuleDetail warningRuleDetail) {
+        UpdateWrapper<WarningRuleDetail> deleteWrapper = new UpdateWrapper<>(warningRuleDetail);
+        warningRuleDetailMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        warningRuleDetailMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(WarningRuleDetail warningRuleDetail) {
+        warningRuleDetailMapper.updateById(warningRuleDetail);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<WarningRuleDetail> warningRuleDetails) {
+        if (CollectionUtils.isEmpty(warningRuleDetails)) {
+            return;
+        }
+        for (WarningRuleDetail warningRuleDetail: warningRuleDetails) {
+            this.updateById(warningRuleDetail);
+        }
+    }
+
+    @Override
+    public WarningRuleDetail findById(Integer id) {
+        return warningRuleDetailMapper.selectById(id);
+    }
+
+    @Override
+    public WarningRuleDetail findOne(WarningRuleDetail warningRuleDetail) {
+        QueryWrapper<WarningRuleDetail> wrapper = new QueryWrapper<>(warningRuleDetail);
+        return warningRuleDetailMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<WarningRuleDetail> findList(WarningRuleDetail warningRuleDetail) {
+        QueryWrapper<WarningRuleDetail> wrapper = new QueryWrapper<>(warningRuleDetail);
+        return warningRuleDetailMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<WarningRuleDetail> findPage(PageWrap<WarningRuleDetail> pageWrap) {
+        IPage<WarningRuleDetail> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<WarningRuleDetail> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(WarningRuleDetail::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(WarningRuleDetail::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(WarningRuleDetail::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(WarningRuleDetail::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getRuleId() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getRuleId, pageWrap.getModel().getRuleId());
+        }
+        if (pageWrap.getModel().getWarningId() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getWarningId, pageWrap.getModel().getWarningId());
+        }
+        if (pageWrap.getModel().getRegionCode() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getRegionCode, pageWrap.getModel().getRegionCode());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getRegionName() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getRegionName, pageWrap.getModel().getRegionName());
+        }
+        if (pageWrap.getModel().getRegionId() != null) {
+            queryWrapper.lambda().eq(WarningRuleDetail::getRegionId, pageWrap.getModel().getRegionId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(warningRuleDetailMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(WarningRuleDetail warningRuleDetail) {
+        QueryWrapper<WarningRuleDetail> wrapper = new QueryWrapper<>(warningRuleDetail);
+        return warningRuleDetailMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleServiceImpl.java
new file mode 100644
index 0000000..9b713aa
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningRuleServiceImpl.java
@@ -0,0 +1,145 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.WarningRuleMapper;
+import com.doumee.dao.business.model.WarningRule;
+import com.doumee.service.business.WarningRuleService;
+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 2025/09/28 09:01
+ */
+@Service
+public class WarningRuleServiceImpl implements WarningRuleService {
+
+    @Autowired
+    private WarningRuleMapper warningRuleMapper;
+
+    @Override
+    public Integer create(WarningRule warningRule) {
+        warningRuleMapper.insert(warningRule);
+        return warningRule.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        warningRuleMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(WarningRule warningRule) {
+        UpdateWrapper<WarningRule> deleteWrapper = new UpdateWrapper<>(warningRule);
+        warningRuleMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        warningRuleMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(WarningRule warningRule) {
+        warningRuleMapper.updateById(warningRule);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<WarningRule> warningRules) {
+        if (CollectionUtils.isEmpty(warningRules)) {
+            return;
+        }
+        for (WarningRule warningRule: warningRules) {
+            this.updateById(warningRule);
+        }
+    }
+
+    @Override
+    public WarningRule findById(Integer id) {
+        return warningRuleMapper.selectById(id);
+    }
+
+    @Override
+    public WarningRule findOne(WarningRule warningRule) {
+        QueryWrapper<WarningRule> wrapper = new QueryWrapper<>(warningRule);
+        return warningRuleMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<WarningRule> findList(WarningRule warningRule) {
+        QueryWrapper<WarningRule> wrapper = new QueryWrapper<>(warningRule);
+        return warningRuleMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<WarningRule> findPage(PageWrap<WarningRule> pageWrap) {
+        IPage<WarningRule> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<WarningRule> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(WarningRule::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(WarningRule::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(WarningRule::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(WarningRule::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(WarningRule::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(WarningRule::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(WarningRule::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(WarningRule::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(WarningRule::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(WarningRule::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getIntervalSec() != null) {
+            queryWrapper.lambda().eq(WarningRule::getIntervalSec, pageWrap.getModel().getIntervalSec());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(WarningRule::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(WarningRule::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getWarningId() != null) {
+            queryWrapper.lambda().eq(WarningRule::getWarningId, pageWrap.getModel().getWarningId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(warningRuleMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(WarningRule warningRule) {
+        QueryWrapper<WarningRule> wrapper = new QueryWrapper<>(warningRule);
+        return warningRuleMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java
new file mode 100644
index 0000000..d84e165
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java
@@ -0,0 +1,167 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.service.business.third.model.PageData;
+import com.doumee.service.business.third.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.WarningMapper;
+import com.doumee.dao.business.model.Warning;
+import com.doumee.service.business.WarningService;
+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 2025/09/28 09:01
+ */
+@Service
+public class WarningServiceImpl implements WarningService {
+
+    @Autowired
+    private WarningMapper warningMapper;
+
+    @Override
+    public Integer create(Warning warning) {
+        warningMapper.insert(warning);
+        return warning.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        warningMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Warning warning) {
+        UpdateWrapper<Warning> deleteWrapper = new UpdateWrapper<>(warning);
+        warningMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        warningMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Warning warning) {
+        warningMapper.updateById(warning);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Warning> warnings) {
+        if (CollectionUtils.isEmpty(warnings)) {
+            return;
+        }
+        for (Warning warning: warnings) {
+            this.updateById(warning);
+        }
+    }
+
+    @Override
+    public Warning findById(Integer id) {
+        return warningMapper.selectById(id);
+    }
+
+    @Override
+    public Warning findOne(Warning warning) {
+        QueryWrapper<Warning> wrapper = new QueryWrapper<>(warning);
+        return warningMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Warning> findList(Warning warning) {
+        QueryWrapper<Warning> wrapper = new QueryWrapper<>(warning);
+        return warningMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Warning> findPage(PageWrap<Warning> pageWrap) {
+        IPage<Warning> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Warning> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(Warning::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(Warning::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(Warning::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(Warning::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(Warning::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(Warning::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(Warning::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(Warning::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(Warning::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(Warning::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(Warning::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getObjId() != null) {
+            queryWrapper.lambda().eq(Warning::getObjId, pageWrap.getModel().getObjId());
+        }
+        if (pageWrap.getModel().getObjType() != null) {
+            queryWrapper.lambda().eq(Warning::getObjType, pageWrap.getModel().getObjType());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(Warning::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(Warning::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getLevel() != null) {
+            queryWrapper.lambda().eq(Warning::getLevel, pageWrap.getModel().getLevel());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(Warning::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSubscribeStatus() != null) {
+            queryWrapper.lambda().eq(Warning::getSubscribeStatus, pageWrap.getModel().getSubscribeStatus());
+        }
+        if (pageWrap.getModel().getSubscribeDate() != null) {
+            queryWrapper.lambda().ge(Warning::getSubscribeDate, Utils.Date.getStart(pageWrap.getModel().getSubscribeDate()));
+            queryWrapper.lambda().le(Warning::getSubscribeDate, Utils.Date.getEnd(pageWrap.getModel().getSubscribeDate()));
+        }
+        if (pageWrap.getModel().getSubscribeInfo() != null) {
+            queryWrapper.lambda().eq(Warning::getSubscribeInfo, pageWrap.getModel().getSubscribeInfo());
+        }
+        if (pageWrap.getModel().getSubscribeMemberId() != null) {
+            queryWrapper.lambda().eq(Warning::getSubscribeMemberId, pageWrap.getModel().getSubscribeMemberId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(warningMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Warning warning) {
+        QueryWrapper<Warning> wrapper = new QueryWrapper<>(warning);
+        return warningMapper.selectCount(wrapper);
+    }
+}

--
Gitblit v1.9.3