From e067f714c0588407b1c20ddd6b7af3b2043e35f8 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 29 九月 2025 11:29:43 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao

---
 admin/src/views/business/jkCustomer.vue                                                                  |  154 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java                    |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchCustomer.java          |    3 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningCloudController.java             |   29 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/WarningPushMapper.java               |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java                    |    3 
 admin/src/api/business/jkCustomer.js                                                                     |   40 
 admin/src/views/business/warningRule.vue                                                                 |  135 +
 admin/src/components/business/OperaJkSketchLineWindow.vue                                                |   86 
 admin/src/api/business/warningPush.js                                                                    |   40 
 admin/src/assets/style/style.scss                                                                        |    6 
 admin/src/components/business/OperaWarningPushWindow.vue                                                 |  102 +
 admin/src/views/business/jkKeys.vue                                                                      |  139 +
 admin/src/components/business/OperaJkCustomerWindow.vue                                                  |   98 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java         |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java               |   75 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java        |    2 
 admin/src/api/business/jkSketchCustomer.js                                                               |   40 
 admin/src/api/business/jkCabinetGrid.js                                                                  |   40 
 admin/src/views/business/jkCabinetLog.vue                                                                |  154 +
 admin/src/views/business/jkLine.vue                                                                      |  144 +
 admin/src/api/business/warningRuleDetail.js                                                              |   40 
 admin/src/components/business/OperaJkLineWindow.vue                                                      |   90 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java     |   74 
 admin/src/views/business/jkSketch.vue                                                                    |  144 +
 admin/src/views/business/categoryJkLine.vue                                                              |   10 
 admin/src/components/business/OperaJkOrdersWindow.vue                                                    |   90 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Warning.java                   |    4 
 admin/src/api/business/warningRule.js                                                                    |   40 
 admin/src/views/business/warningRuleDetail.vue                                                           |  140 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java              |    3 
 admin/src/components/business/OperaJkCabinetGridWindow.vue                                               |   86 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkOrders.java                  |    3 
 admin/src/components/common/UploadImage.vue                                                              |    6 
 admin/src/components/business/OperaCategoryJkLineWindow.vue                                              |   71 
 admin/src/components/business/OperaJkCabinetLogWindow.vue                                                |   98 +
 admin/src/views/business/jkIccard.vue                                                                    |  134 +
 admin/src/components/business/OperaJkVersionWindow.vue                                                   |   94 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java                |    3 
 admin/src/components/business/OperaJkSketchWindow.vue                                                    |   90 +
 admin/src/api/business/jkKeys.js                                                                         |   40 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java                 |    3 
 admin/src/views/business/categoryJkBanner.vue                                                            |   12 
 admin/src/views/business/jkVersion.vue                                                                   |  149 +
 admin/src/api/business/jkCabinetLog.js                                                                   |   40 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketch.java                  |    3 
 admin/src/components/business/OperaJkSketchCustomerWindow.vue                                            |   86 
 admin/src/components/business/OperaJkIccardWindow.vue                                                    |   82 
 admin/src/views/business/warningPush.vue                                                                 |  154 +
 admin/src/views/business/jkCabinetGrid.vue                                                               |  139 +
 admin/src/views/business/jkSketchCustomer.vue                                                            |  139 +
 admin/src/views/business/jkSketchLine.vue                                                                |  139 +
 admin/public/template/jkOrdersTemplate.xlsx                                                              |    0 
 admin/public/template/jkCustomerTmeplate.xlsx                                                            |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningService.java              |    7 
 admin/src/api/business/jkSketchLine.js                                                                   |   40 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java    |    2 
 admin/src/views/business/jkCabinet.vue                                                                   |  214 ++
 admin/src/api/business/jkSketch.js                                                                       |   40 
 admin/src/api/business/jkLine.js                                                                         |   40 
 admin/src/components/business/OperaWarningRuleWindow.vue                                                 |   82 
 admin/src/components/common/ImageCropper.vue                                                             |   16 
 admin/src/components/business/OperaWarningWindow.vue                                                     |   84 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java                  |    3 
 admin/src/api/business/jkCabinet.js                                                                      |   40 
 admin/src/views/business/warning.vue                                                                     |  161 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java             |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java               |    3 
 admin/public/template/jkLineTemplate.xlsx                                                                |    0 
 admin/src/api/business/jkVersion.js                                                                      |   40 
 admin/src/api/business/warning.js                                                                        |   42 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java                 |    3 
 admin/src/components/business/OperaJkCabinetWindow.vue                                                   |  146 +
 admin/src/components/business/OperaJkKeysWindow.vue                                                      |   86 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningPushServiceImpl.java |   69 
 admin/src/api/business/jkIccard.js                                                                       |   40 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchLine.java              |    3 
 admin/src/components/common/UploadFaceImg.vue                                                            |   32 
 /dev/null                                                                                                |   90 -
 admin/src/components/business/OperaWarningRuleDetailWindow.vue                                           |   86 
 admin/src/views/business/jkOrders.vue                                                                    |  144 +
 admin/src/components/business/OperaCategoryJkBannerWindow.vue                                            |  120 +
 admin/src/api/business/jkOrders.js                                                                       |   40 
 83 files changed, 4,973 insertions(+), 208 deletions(-)

diff --git a/admin/public/template/jkCustomerTmeplate.xlsx b/admin/public/template/jkCustomerTmeplate.xlsx
new file mode 100644
index 0000000..cceb025
--- /dev/null
+++ b/admin/public/template/jkCustomerTmeplate.xlsx
Binary files differ
diff --git a/admin/public/template/jkLineTemplate.xlsx b/admin/public/template/jkLineTemplate.xlsx
new file mode 100644
index 0000000..131a0ee
--- /dev/null
+++ b/admin/public/template/jkLineTemplate.xlsx
Binary files differ
diff --git a/admin/public/template/jkOrdersTemplate.xlsx b/admin/public/template/jkOrdersTemplate.xlsx
new file mode 100644
index 0000000..e11bfd7
--- /dev/null
+++ b/admin/public/template/jkOrdersTemplate.xlsx
Binary files differ
diff --git a/admin/src/api/business/jkCabinet.js b/admin/src/api/business/jkCabinet.js
new file mode 100644
index 0000000..c413215
--- /dev/null
+++ b/admin/src/api/business/jkCabinet.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinet/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinet/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinet/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinet/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkCabinet/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkCabinet/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkCabinetGrid.js b/admin/src/api/business/jkCabinetGrid.js
new file mode 100644
index 0000000..b97ee1f
--- /dev/null
+++ b/admin/src/api/business/jkCabinetGrid.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetGrid/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetGrid/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetGrid/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetGrid/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkCabinetGrid/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkCabinetGrid/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkCabinetLog.js b/admin/src/api/business/jkCabinetLog.js
new file mode 100644
index 0000000..6b2859d
--- /dev/null
+++ b/admin/src/api/business/jkCabinetLog.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetLog/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetLog/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetLog/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCabinetLog/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkCabinetLog/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkCabinetLog/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkCustomer.js b/admin/src/api/business/jkCustomer.js
new file mode 100644
index 0000000..6ea8495
--- /dev/null
+++ b/admin/src/api/business/jkCustomer.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCustomer/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCustomer/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCustomer/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCustomer/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkCustomer/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkCustomer/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkIccard.js b/admin/src/api/business/jkIccard.js
new file mode 100644
index 0000000..de6ea14
--- /dev/null
+++ b/admin/src/api/business/jkIccard.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkIccard/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkIccard/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkIccard/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkIccard/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkIccard/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkIccard/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkKeys.js b/admin/src/api/business/jkKeys.js
new file mode 100644
index 0000000..a54dbfb
--- /dev/null
+++ b/admin/src/api/business/jkKeys.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkKeys/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkKeys/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkKeys/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkKeys/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkKeys/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkKeys/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkLine.js b/admin/src/api/business/jkLine.js
new file mode 100644
index 0000000..95aac40
--- /dev/null
+++ b/admin/src/api/business/jkLine.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkLine/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkLine/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkLine/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkLine/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkLine/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkLine/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkOrders.js b/admin/src/api/business/jkOrders.js
new file mode 100644
index 0000000..292512f
--- /dev/null
+++ b/admin/src/api/business/jkOrders.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkOrders/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkOrders/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkOrders/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkOrders/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkOrders/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkOrders/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkSketch.js b/admin/src/api/business/jkSketch.js
new file mode 100644
index 0000000..6410e0c
--- /dev/null
+++ b/admin/src/api/business/jkSketch.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/jkSketch/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/jkSketch/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/jkSketch/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/jkSketch/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkSketch/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/jkSketch/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkSketchCustomer.js b/admin/src/api/business/jkSketchCustomer.js
new file mode 100644
index 0000000..830f80d
--- /dev/null
+++ b/admin/src/api/business/jkSketchCustomer.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchCustomer/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchCustomer/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchCustomer/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchCustomer/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkSketchCustomer/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkSketchCustomer/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkSketchLine.js b/admin/src/api/business/jkSketchLine.js
new file mode 100644
index 0000000..b0f58cc
--- /dev/null
+++ b/admin/src/api/business/jkSketchLine.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchLine/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchLine/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchLine/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkSketchLine/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkSketchLine/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkSketchLine/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/jkVersion.js b/admin/src/api/business/jkVersion.js
new file mode 100644
index 0000000..9c2df74
--- /dev/null
+++ b/admin/src/api/business/jkVersion.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkVersion/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkVersion/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkVersion/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkVersion/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/jkVersion/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/jkVersion/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/warning.js b/admin/src/api/business/warning.js
new file mode 100644
index 0000000..e81fa5e
--- /dev/null
+++ b/admin/src/api/business/warning.js
@@ -0,0 +1,42 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/warning/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/warning/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+export function updateStatus (data) {
+  return request.post('/visitsAdmin/cloudService/business/warning/updateStatus', data)
+}
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/warning/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/warning/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/warning/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/warning/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/warningPush.js b/admin/src/api/business/warningPush.js
new file mode 100644
index 0000000..3bad017
--- /dev/null
+++ b/admin/src/api/business/warningPush.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningPush/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningPush/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningPush/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningPush/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/warningPush/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/warningPush/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/warningRule.js b/admin/src/api/business/warningRule.js
new file mode 100644
index 0000000..15a1602
--- /dev/null
+++ b/admin/src/api/business/warningRule.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRule/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRule/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRule/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRule/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/warningRule/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/warningRule/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/warningRuleDetail.js b/admin/src/api/business/warningRuleDetail.js
new file mode 100644
index 0000000..6ebad76
--- /dev/null
+++ b/admin/src/api/business/warningRuleDetail.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRuleDetail/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRuleDetail/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRuleDetail/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/warningRuleDetail/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/warningRuleDetail/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/warningRuleDetail/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/assets/style/style.scss b/admin/src/assets/style/style.scss
index 7b95f18..a553c72 100644
--- a/admin/src/assets/style/style.scss
+++ b/admin/src/assets/style/style.scss
@@ -122,6 +122,12 @@
 .status-red{
   color:red;
 }
+.status-yellow{
+  color: orange;
+}
+.status-grey{
+  color:#999;
+}
 .tip-warn {
   margin: 4px 0 25px 0;
   font-size: 12px;
diff --git a/admin/src/components/business/OperaCategoryJkBannerWindow.vue b/admin/src/components/business/OperaCategoryJkBannerWindow.vue
new file mode 100644
index 0000000..5002b13
--- /dev/null
+++ b/admin/src/components/business/OperaCategoryJkBannerWindow.vue
@@ -0,0 +1,120 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="骞垮憡鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ箍鍛婂悕绉�" v-trim />
+      </el-form-item>
+      <el-form-item label="骞垮憡鍥�" prop="imgurl">
+        <div class="upload_wrap">
+          <UploadFaceImg :file="{ 'imgurlfull': form.imgurlFull, 'imgurl': form.imgurl }" :uploadData="uploadData" :auto-crop=" { width: 500, height: 800 }"
+                         @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false" @uploadBegin="isUploading = true" />
+        </div>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮侊紙闄嶅簭锛�" prop="sortnum">
+        <el-input type="number" v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim />
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim />
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadFaceImg from '@/components/common/UploadFaceImg'
+import ImageCropper from '@/components/common/ImageCropper'
+export default {
+  name: 'OperaCategoryFileWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow ,UploadFaceImg,ImageCropper},
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        name: '',
+        type: 3,
+        imgurl: null,
+        imgurlFull: null,
+        sortnum: null,
+        remark: null,
+      },
+      isUploading: false,
+      uploadData: {
+        folder: 'banners'
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ュ箍鍛婂悕绉�', trigger: 'blur' },
+        ],
+        imgurl: [
+          { required: true, message: '璇蜂笂浼犲箍鍛婂浘', trigger: 'blur' },
+        ]
+      },
+      dataList: []
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    // 涓婁紶鍥剧墖
+    uploadAvatarSuccess(file) {
+      this.form.imgurl = file.imgurl
+      this.form.imgurlFull = file.imgurlfull
+    },
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      // 鏂板缓缁勭粐
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+          this.form.type = 3
+        })
+
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    },
+  }
+}
+</script>
+<style lang="scss" scoped>
+.upload_wrap {
+  display: flex;
+  align-items: center;
+
+  .avatar-uploader {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+  ::v-deep .avatar {
+    max-width: 90px;
+    max-height: 90px;
+  }
+
+  .content {
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    font-size: 12px;
+    color: #999999;
+    margin-left: 12px;
+    line-height: 24px;
+  }
+}
+</style>
diff --git a/admin/src/components/business/OperaCategoryJkLineWindow.vue b/admin/src/components/business/OperaCategoryJkLineWindow.vue
new file mode 100644
index 0000000..f4f4cdb
--- /dev/null
+++ b/admin/src/components/business/OperaCategoryJkLineWindow.vue
@@ -0,0 +1,71 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="涓荤嚎璺悕绉�" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ垎绫诲悕绉�" v-trim />
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮侊紙闄嶅簭锛�" prop="sortnum">
+        <el-input type="number" v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim />
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim />
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaCategoryJkLineWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        name: '',
+        type: 4,
+        sortnum: null,
+        remark: null
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ョ嚎璺悕绉�', trigger: 'blur' }
+        ]
+      },
+      dataList: []
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      // 鏂板缓缁勭粐
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+          this.form.type = 4
+        })
+
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkCabinetGridWindow.vue b/admin/src/components/business/OperaJkCabinetGridWindow.vue
new file mode 100644
index 0000000..a1d7f5b
--- /dev/null
+++ b/admin/src/components/business/OperaJkCabinetGridWindow.vue
@@ -0,0 +1,86 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" prop="cabinetId">
+        <el-input v-model="form.cabinetId" placeholder="璇疯緭鍏ラ挜鍖欐煖缂栫爜锛堝叧鑱攋k_cabinet)" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵缂栫爜锛堝叧鑱攋k_keys)" prop="keyId">
+        <el-input v-model="form.keyId" placeholder="璇疯緭鍏ラ挜鍖欑紪鐮侊紙鍏宠仈jk_keys)" v-trim/>
+      </el-form-item>
+      <el-form-item label="搴忓垪鍙�" prop="serialNo">
+        <el-input v-model="form.serialNo" placeholder="璇疯緭鍏ュ簭鍒楀彿" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" v-trim/>
+      </el-form-item>
+      <el-form-item label="杩愯鐘舵��" prop="workingStatus">
+        <el-input v-model="form.workingStatus" placeholder="璇疯緭鍏ヨ繍琛岀姸鎬�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkCabinetGridWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        cabinetId: '',
+        code: '',
+        keyId: '',
+        serialNo: '',
+        status: '',
+        workingStatus: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkCabinetGrid',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkCabinetLogWindow.vue b/admin/src/components/business/OperaJkCabinetLogWindow.vue
new file mode 100644
index 0000000..ab38572
--- /dev/null
+++ b/admin/src/components/business/OperaJkCabinetLogWindow.vue
@@ -0,0 +1,98 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" prop="cabinetId">
+        <el-input v-model="form.cabinetId" placeholder="璇疯緭鍏ラ挜鍖欐煖缂栫爜锛堝叧鑱攋k_cabinet)" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滄牸缂栫爜(鍏宠仈jk_cabinet_grid)" prop="gridId">
+        <el-input v-model="form.gridId" placeholder="璇疯緭鍏ラ挜鍖欐煖鏍肩紪鐮�(鍏宠仈jk_cabinet_grid)" v-trim/>
+      </el-form-item>
+      <el-form-item label="楠岃瘉鏂瑰紡 0鍒疯劯 1鍒峰崱" prop="authType">
+        <el-input v-model="form.authType" placeholder="璇疯緭鍏ラ獙璇佹柟寮� 0鍒疯劯 1鍒峰崱" v-trim/>
+      </el-form-item>
+      <el-form-item label="杞﹁締缂栫爜锛堝叧鑱攃ars)" prop="carId">
+        <el-input v-model="form.carId" placeholder="璇疯緭鍏ヨ溅杈嗙紪鐮侊紙鍏宠仈cars)" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵缂栫爜(鍏宠仈jk_keys)" prop="keyId">
+        <el-input v-model="form.keyId" placeholder="璇疯緭鍏ラ挜鍖欑紪鐮�(鍏宠仈jk_keys)" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵淇℃伅锛堣溅鐗屽彿-閽ュ寵缂栫爜锛�" prop="keyInfo">
+        <el-input v-model="form.keyInfo" placeholder="璇疯緭鍏ラ挜鍖欎俊鎭紙杞︾墝鍙�-閽ュ寵缂栫爜锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟" prop="roleType">
+        <el-input v-model="form.roleType" placeholder="璇疯緭鍏ラ鍙栬鍒� 0闅忚溅 1闅忔淳杞﹀崟" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鎴愬姛 1澶辫触" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鎴愬姛 1澶辫触" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkCabinetLogWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        cabinetId: '',
+        gridId: '',
+        authType: '',
+        carId: '',
+        keyId: '',
+        memberId: '',
+        keyInfo: '',
+        roleType: '',
+        status: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkCabinetLog',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkCabinetWindow.vue b/admin/src/components/business/OperaJkCabinetWindow.vue
new file mode 100644
index 0000000..ee63049
--- /dev/null
+++ b/admin/src/components/business/OperaJkCabinetWindow.vue
@@ -0,0 +1,146 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璁惧缂栧彿" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璁惧鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ヨ澶囧悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璁惧ID" prop="devId">
+        <el-input v-model="form.devId" placeholder="璇疯緭鍏ヨ澶嘔D" v-trim/>
+      </el-form-item>
+      <el-form-item label="搴忓垪鍙�" prop="serialNo">
+        <el-input v-model="form.serialNo" placeholder="璇疯緭鍏ュ簭鍒楀彿" v-trim/>
+      </el-form-item>
+      <el-form-item label="閫氳鍦板潃" prop="linkAddr">
+        <el-input v-model="form.linkAddr" placeholder="璇疯緭鍏ラ�氳鍦板潃" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" v-trim/>
+      </el-form-item>
+      <el-form-item label="绔彛" prop="port">
+        <el-input v-model="form.port" placeholder="璇疯緭鍏ョ鍙�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member)" prop="managerId">
+        <el-input v-model="form.managerId" placeholder="璇疯緭鍏ヨ澶囩鐞嗗憳缂栫爜锛堝叧鑱攎ember)" v-trim/>
+      </el-form-item>
+      <el-form-item label="浣跨敤鏃堕暱(绉�)" prop="useTime">
+        <el-input v-model="form.useTime" placeholder="璇疯緭鍏ヤ娇鐢ㄦ椂闀�(绉�)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍙岄噸楠岃瘉 0鍚� 1鏄�" prop="doubleAuth">
+        <el-input v-model="form.doubleAuth" placeholder="璇疯緭鍏ユ槸鍚﹀弻閲嶉獙璇� 0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="楠岃瘉浜虹紪鐮侊紙鍏宠仈member)" prop="authMemberId">
+        <el-input v-model="form.authMemberId" placeholder="璇疯緭鍏ラ獙璇佷汉缂栫爜锛堝叧鑱攎ember)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掓暟" prop="rowNum">
+        <el-input v-model="form.rowNum" placeholder="璇疯緭鍏ユ帓鏁�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒楁暟" prop="columnNum">
+        <el-input v-model="form.columnNum" placeholder="璇疯緭鍏ュ垪鏁�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏈�鍚庨�氳鏃堕棿" prop="haertTime">
+        <el-date-picker v-model="form.haertTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ渶鍚庨�氳鏃堕棿"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="lacation">
+        <el-input v-model="form.lacation" placeholder="璇疯緭鍏ユ墍鍦ㄤ綅缃�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缁忓害" prop="longitude">
+        <el-input v-model="form.longitude" placeholder="璇疯緭鍏ョ粡搴�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缁村害" prop="latitude">
+        <el-input v-model="form.latitude" placeholder="璇疯緭鍏ョ淮搴�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜鏂瑰紡 0鑷姩缂栫爜 1鎵嬪姩缂栫爜" prop="noType">
+        <el-input v-model="form.noType" placeholder="璇疯緭鍏ョ紪鐮佹柟寮� 0鑷姩缂栫爜 1鎵嬪姩缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜鍓嶇紑" prop="noPrefix">
+        <el-input v-model="form.noPrefix" placeholder="璇疯緭鍏ョ紪鐮佸墠缂�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜浣嶆暟" prop="noLength">
+        <el-input v-model="form.noLength" placeholder="璇疯緭鍏ョ紪鐮佷綅鏁�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璧峰缂栫爜" prop="noIndex">
+        <el-input v-model="form.noIndex" placeholder="璇疯緭鍏ヨ捣濮嬬紪鐮�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkCabinetWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        code: '',
+        name: '',
+        devId: '',
+        serialNo: '',
+        linkAddr: '',
+        status: '',
+        port: '',
+        managerId: '',
+        useTime: '',
+        doubleAuth: '',
+        authMemberId: '',
+        rowNum: '',
+        columnNum: '',
+        haertTime: '',
+        lacation: '',
+        longitude: '',
+        latitude: '',
+        noType: '',
+        noPrefix: '',
+        noLength: '',
+        noIndex: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkCabinet',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkCustomerWindow.vue b/admin/src/components/business/OperaJkCustomerWindow.vue
new file mode 100644
index 0000000..b75f350
--- /dev/null
+++ b/admin/src/components/business/OperaJkCustomerWindow.vue
@@ -0,0 +1,98 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="lacation">
+        <el-input v-model="form.lacation" placeholder="璇疯緭鍏ユ墍鍦ㄤ綅缃�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缁忓害" prop="longitude">
+        <el-input v-model="form.longitude" placeholder="璇疯緭鍏ョ粡搴�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缁村害" prop="latitude">
+        <el-input v-model="form.latitude" placeholder="璇疯緭鍏ョ淮搴�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閰嶉�佸懆鏈�" prop="weeks">
+        <el-input v-model="form.weeks" placeholder="璇疯緭鍏ラ厤閫佸懆鏈�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
+        <el-input v-model="form.lineId" placeholder="璇疯緭鍏ラ�佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0姝e父 绂佺敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 绂佺敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkCustomerWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        name: '',
+        code: '',
+        lacation: '',
+        longitude: '',
+        latitude: '',
+        weeks: '',
+        lineId: '',
+        status: '',
+        sortnum: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkCustomer',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkIccardWindow.vue b/admin/src/components/business/OperaJkIccardWindow.vue
new file mode 100644
index 0000000..6136bb1
--- /dev/null
+++ b/admin/src/components/business/OperaJkIccardWindow.vue
@@ -0,0 +1,82 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜哄憳缂栫爜缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮佺紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0绂佺敤 1鍚敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0绂佺敤 1鍚敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍗″悕绉�" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ崱鍚嶇О" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" prop="cabinetId">
+        <el-input v-model="form.cabinetId" placeholder="璇疯緭鍏ラ挜鍖欐煖缂栫爜锛堝叧鑱攋k_cabinet)" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkIccardWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        memberId: '',
+        code: '',
+        status: '',
+        name: '',
+        cabinetId: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkIccard',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkKeysWindow.vue b/admin/src/components/business/OperaJkKeysWindow.vue
new file mode 100644
index 0000000..9fbb1bf
--- /dev/null
+++ b/admin/src/components/business/OperaJkKeysWindow.vue
@@ -0,0 +1,86 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閽ュ寵缂栧彿" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ラ挜鍖欑紪鍙�" v-trim/>
+      </el-form-item>
+      <el-form-item label="杞︾墝鍙�" prop="carCode">
+        <el-input v-model="form.carCode" placeholder="璇疯緭鍏ヨ溅鐗屽彿" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�灞炶溅杈�(鍏宠仈cars)" prop="carId">
+        <el-input v-model="form.carId" placeholder="璇疯緭鍏ユ墍灞炶溅杈�(鍏宠仈cars)" v-trim/>
+      </el-form-item>
+      <el-form-item label="RFID鏍囩" prop="rfidLable">
+        <el-input v-model="form.rfidLable" placeholder="璇疯緭鍏FID鏍囩" v-trim/>
+      </el-form-item>
+      <el-form-item label="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟" prop="roleType">
+        <el-input v-model="form.roleType" placeholder="璇疯緭鍏ラ鍙栬鍒� 0闅忚溅 1闅忔淳杞﹀崟" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkKeysWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        code: '',
+        carCode: '',
+        carId: '',
+        rfidLable: '',
+        roleType: '',
+        status: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkKeys',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkLineWindow.vue b/admin/src/components/business/OperaJkLineWindow.vue
new file mode 100644
index 0000000..e77d48a
--- /dev/null
+++ b/admin/src/components/business/OperaJkLineWindow.vue
@@ -0,0 +1,90 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐝粍缂栫爜锛堝叧鑱攃ategory锛�" prop="categoryId">
+        <el-input v-model="form.categoryId" placeholder="璇疯緭鍏ョ彮缁勭紪鐮侊紙鍏宠仈category锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�灞炶溅杈�(鍏宠仈cars)" prop="carId">
+        <el-input v-model="form.carId" placeholder="璇疯緭鍏ユ墍灞炶溅杈�(鍏宠仈cars)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏈�澶у鎴烽噺" prop="maxCustomer">
+        <el-input v-model="form.maxCustomer" placeholder="璇疯緭鍏ユ渶澶у鎴烽噺" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏈�澶ц鍗曢噺" prop="maxOrder">
+        <el-input v-model="form.maxOrder" placeholder="璇疯緭鍏ユ渶澶ц鍗曢噺" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkLineWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        name: '',
+        categoryId: '',
+        carId: '',
+        maxCustomer: '',
+        maxOrder: '',
+        status: '',
+        sortnum: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkLine',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkOrdersWindow.vue b/admin/src/components/business/OperaJkOrdersWindow.vue
new file mode 100644
index 0000000..d1dd6bf
--- /dev/null
+++ b/admin/src/components/business/OperaJkOrdersWindow.vue
@@ -0,0 +1,90 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閿�閲�" prop="num">
+        <el-input v-model="form.num" placeholder="璇疯緭鍏ラ攢閲�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
+        <el-input v-model="form.lineId" placeholder="璇疯緭鍏ラ�佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0姝e父 绂佺敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 绂佺敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="form.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鍚岀彮缁勯棿瀹㈡埛浣嶇疆璺濈鏁扮粍锛孾{a:12,b:100},{a:13,b:200},...],a锛氬鎴风紪鐮侊紝b锛氫笌瀹㈡埛a涔嬮棿鐨勮窛绂�" prop="distances">
+        <el-input v-model="form.distances" placeholder="璇疯緭鍏ュ悓鐝粍闂村鎴蜂綅缃窛绂绘暟缁勶紝[{a:12,b:100},{a:13,b:200},...],a锛氬鎴风紪鐮侊紝b锛氫笌瀹㈡埛a涔嬮棿鐨勮窛绂�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkOrdersWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        name: '',
+        num: '',
+        lineId: '',
+        status: '',
+        sortnum: '',
+        dateInfo: '',
+        distances: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkOrders',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkSketchCustomerWindow.vue b/admin/src/components/business/OperaJkSketchCustomerWindow.vue
new file mode 100644
index 0000000..7719a25
--- /dev/null
+++ b/admin/src/components/business/OperaJkSketchCustomerWindow.vue
@@ -0,0 +1,86 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绾胯矾缂栫爜锛堝叧鑱攋k_sketch_line)" prop="sketchLineId">
+        <el-input v-model="form.sketchLineId" placeholder="璇疯緭鍏ョ嚎璺紪鐮侊紙鍏宠仈jk_sketch_line)" v-trim/>
+      </el-form-item>
+      <el-form-item label="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)" prop="sketchId">
+        <el-input v-model="form.sketchId" placeholder="璇疯緭鍏ョ嚎璺紭鍖栫紪鐮侊紙鍏宠仈jk_sketch)" v-trim/>
+      </el-form-item>
+      <el-form-item label="閫佽揣閲�" prop="totalNum">
+        <el-input v-model="form.totalNum" placeholder="璇疯緭鍏ラ�佽揣閲�" v-trim/>
+      </el-form-item>
+      <el-form-item label="瀹㈡埛鏁�" prop="orderNum">
+        <el-input v-model="form.orderNum" placeholder="璇疯緭鍏ュ鎴锋暟" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="form.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�"></el-date-picker>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkSketchCustomerWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        sketchLineId: '',
+        sketchId: '',
+        totalNum: '',
+        orderNum: '',
+        sortnum: '',
+        dateInfo: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkSketchCustomer',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkSketchLineWindow.vue b/admin/src/components/business/OperaJkSketchLineWindow.vue
new file mode 100644
index 0000000..0b96166
--- /dev/null
+++ b/admin/src/components/business/OperaJkSketchLineWindow.vue
@@ -0,0 +1,86 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绾胯矾缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
+        <el-input v-model="form.lineId" placeholder="璇疯緭鍏ョ嚎璺紪鐮侊紙鍏宠仈jk_line)" v-trim/>
+      </el-form-item>
+      <el-form-item label="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)" prop="sketchId">
+        <el-input v-model="form.sketchId" placeholder="璇疯緭鍏ョ嚎璺紭鍖栫紪鐮侊紙鍏宠仈jk_sketch)" v-trim/>
+      </el-form-item>
+      <el-form-item label="閫佽揣閲�" prop="totalNum">
+        <el-input v-model="form.totalNum" placeholder="璇疯緭鍏ラ�佽揣閲�" v-trim/>
+      </el-form-item>
+      <el-form-item label="瀹㈡埛鏁�" prop="orderNum">
+        <el-input v-model="form.orderNum" placeholder="璇疯緭鍏ュ鎴锋暟" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="form.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�"></el-date-picker>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkSketchLineWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        lineId: '',
+        sketchId: '',
+        totalNum: '',
+        orderNum: '',
+        sortnum: '',
+        dateInfo: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkSketchLine',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkSketchWindow.vue b/admin/src/components/business/OperaJkSketchWindow.vue
new file mode 100644
index 0000000..9fa4b61
--- /dev/null
+++ b/admin/src/components/business/OperaJkSketchWindow.vue
@@ -0,0 +1,90 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="涓荤嚎璺紪鐮侊紙鍏宠仈category)" prop="categoryId">
+        <el-input v-model="form.categoryId" placeholder="璇疯緭鍏ヤ富绾胯矾缂栫爜锛堝叧鑱攃ategory)" v-trim/>
+      </el-form-item>
+      <el-form-item label="閫佽揣閲�" prop="totalNum">
+        <el-input v-model="form.totalNum" placeholder="璇疯緭鍏ラ�佽揣閲�" v-trim/>
+      </el-form-item>
+      <el-form-item label="瀹㈡埛鏁�" prop="orderNum">
+        <el-input v-model="form.orderNum" placeholder="璇疯緭鍏ュ鎴锋暟" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈紭鍖� 1浼樺寲涓� 2宸蹭紭鍖�" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈紭鍖� 1浼樺寲涓� 2宸蹭紭鍖�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="form.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="浼樺寲璁板綍缂栫爜(浣滀负key鍊煎瓨redis锛�" prop="jobId">
+        <el-input v-model="form.jobId" placeholder="璇疯緭鍏ヤ紭鍖栬褰曠紪鐮�(浣滀负key鍊煎瓨redis锛�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkSketchWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        categoryId: '',
+        totalNum: '',
+        orderNum: '',
+        status: '',
+        sortnum: '',
+        dateInfo: '',
+        jobId: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkSketch',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaJkVersionWindow.vue b/admin/src/components/business/OperaJkVersionWindow.vue
new file mode 100644
index 0000000..101b354
--- /dev/null
+++ b/admin/src/components/business/OperaJkVersionWindow.vue
@@ -0,0 +1,94 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐗堟湰鍙�" prop="versionInfo">
+        <el-input v-model="form.versionInfo" placeholder="璇疯緭鍏ョ増鏈彿" v-trim/>
+      </el-form-item>
+      <el-form-item label="瀹夎鍖呰矾寰�" prop="fileUrl">
+        <el-input v-model="form.fileUrl" placeholder="璇疯緭鍏ュ畨瑁呭寘璺緞" v-trim/>
+      </el-form-item>
+      <el-form-item label="瀹夎鐗堝悕绉�" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ畨瑁呯増鍚嶇О" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鎻忚堪" prop="content">
+        <el-input v-model="form.content" placeholder="璇疯緭鍏ユ洿鏂版弿杩�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏍囬" prop="title">
+        <el-input v-model="form.title" placeholder="璇疯緭鍏ユ洿鏂版爣棰�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁寮哄埗鏇存柊 0鍚� 1鏄�" prop="isForce">
+        <el-input v-model="form.isForce" placeholder="璇疯緭鍏ユ槸鍚﹀己鍒舵洿鏂� 0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="骞冲彴绫诲瀷 0Android 1IOS" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ュ钩鍙扮被鍨� 0Android 1IOS" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkVersionWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        versionInfo: '',
+        fileUrl: '',
+        name: '',
+        content: '',
+        sortnum: '',
+        title: '',
+        isForce: '',
+        type: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/jkVersion',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaWarningPushWindow.vue b/admin/src/components/business/OperaWarningPushWindow.vue
new file mode 100644
index 0000000..b9637b3
--- /dev/null
+++ b/admin/src/components/business/OperaWarningPushWindow.vue
@@ -0,0 +1,102 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜嬩欢缂栫爜(鍏宠仈warning锛�" prop="warningId">
+        <el-input v-model="form.warningId" placeholder="璇疯緭鍏ヤ簨浠剁紪鐮�(鍏宠仈warning锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎶ヨ鏍囬" prop="title">
+        <el-input v-model="form.title" placeholder="璇疯緭鍏ユ姤璀︽爣棰�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎶ヨ鍐呭" prop="content">
+        <el-input v-model="form.content" placeholder="璇疯緭鍏ユ姤璀﹀唴瀹�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈帹閫� 1鎺ㄩ�佹垚鍔�2鎺ㄩ�佸け璐�" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈帹閫� 1鎺ㄩ�佹垚鍔�2鎺ㄩ�佸け璐�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺ㄩ�佺粨鏋�" prop="pushInfo">
+        <el-input v-model="form.pushInfo" placeholder="璇疯緭鍏ユ帹閫佺粨鏋�" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜嬩欢鍐呭" prop="eventInfo">
+        <el-input v-model="form.eventInfo" placeholder="璇疯緭鍏ヤ簨浠跺唴瀹�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺ㄩ�佹爣璇�" prop="pushId">
+        <el-input v-model="form.pushId" placeholder="璇疯緭鍏ユ帹閫佹爣璇�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺ㄩ�佹椂闂�" prop="pushDate">
+        <el-date-picker v-model="form.pushDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ帹閫佹椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡" prop="pushType">
+        <el-input v-model="form.pushType" placeholder="璇疯緭鍏ユ帹閫佹柟寮� 0閽夐拤閫氱煡" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaWarningPushWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        memberId: '',
+        warningId: '',
+        title: '',
+        content: '',
+        status: '',
+        pushInfo: '',
+        eventInfo: '',
+        pushId: '',
+        pushDate: '',
+        pushType: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/warningPush',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaWarningRuleDetailWindow.vue b/admin/src/components/business/OperaWarningRuleDetailWindow.vue
new file mode 100644
index 0000000..f05e34f
--- /dev/null
+++ b/admin/src/components/business/OperaWarningRuleDetailWindow.vue
@@ -0,0 +1,86 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="瑙勫垯缂栫爜锛堝叧鑱攚arning_rule)" prop="ruleId">
+        <el-input v-model="form.ruleId" placeholder="璇疯緭鍏ヨ鍒欑紪鐮侊紙鍏宠仈warning_rule)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�" prop="warningId">
+        <el-input v-model="form.warningId" placeholder="璇疯緭鍏ユ姤璀︾被鍨嬬紪鐮�(鍏宠仈warning锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶氳鍒欓棿闅旀椂闂�(绉掞級" prop="regionCode">
+        <el-input v-model="form.regionCode" placeholder="璇疯緭鍏ュ瑙勫垯闂撮殧鏃堕棿(绉掞級" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍖哄煙鍚嶇О" prop="regionName">
+        <el-input v-model="form.regionName" placeholder="璇疯緭鍏ュ尯鍩熷悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍖哄煙涓婚敭" prop="regionId">
+        <el-input v-model="form.regionId" placeholder="璇疯緭鍏ュ尯鍩熶富閿�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaWarningRuleDetailWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        ruleId: '',
+        warningId: '',
+        regionCode: '',
+        sortnum: '',
+        regionName: '',
+        regionId: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/warningRuleDetail',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaWarningRuleWindow.vue b/admin/src/components/business/OperaWarningRuleWindow.vue
new file mode 100644
index 0000000..5635278
--- /dev/null
+++ b/admin/src/components/business/OperaWarningRuleWindow.vue
@@ -0,0 +1,82 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍐呴儴浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ュ唴閮ㄤ汉鍛樼紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶氳鍒欓棿闅旀椂闂�(绉掞級" prop="intervalSec">
+        <el-input v-model="form.intervalSec" placeholder="璇疯緭鍏ュ瑙勫垯闂撮殧鏃堕棿(绉掞級" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0绂佺敤 1鍚敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0绂佺敤 1鍚敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�" prop="warningId">
+        <el-input v-model="form.warningId" placeholder="璇疯緭鍏ユ姤璀︾被鍨嬬紪鐮�(鍏宠仈warning锛�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaWarningRuleWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        memberId: '',
+        intervalSec: '',
+        sortnum: '',
+        status: '',
+        warningId: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/warningRule',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaWarningWindow.vue b/admin/src/components/business/OperaWarningWindow.vue
new file mode 100644
index 0000000..38ed596
--- /dev/null
+++ b/admin/src/components/business/OperaWarningWindow.vue
@@ -0,0 +1,84 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    width="50%"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍛婅绫诲瀷" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ヤ簨浠剁被鍨�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�灞炲垎绫�" prop="type">
+        <el-select v-model="form.type" placeholder="璇烽�夋嫨"  >
+          <el-option label="瀹夐槻浜嬩欢" :value="0"></el-option>
+          <el-option label="娑堥槻浜嬩欢" :value="1"></el-option>
+          <el-option label="杞﹁浇浜嬩欢" :value="2"></el-option>
+          <el-option label="閽ュ寵鏌滀簨浠�" :value="3"></el-option>
+          <el-option label="澶╂皵棰勮" :value="4"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="浜嬩欢缂栧彿" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ叧鑱斿璞$紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜嬩欢绛夌骇" prop="level">
+        <el-radio-group v-model="form.level">
+          <el-radio :label="0">浣�</el-radio>
+          <el-radio :label="1">涓�</el-radio>
+          <el-radio :label="2">楂�</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="status">
+        <el-radio-group v-model="form.status">
+          <el-radio :label="0">绂佺敤</el-radio>
+          <el-radio :label="1">鍚敤</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input type="number" v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" type="textarea" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaWarningWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        info: '',
+        type: 0,
+        code: '',
+        sortnum: '',
+        level: 0,
+        status: 0
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏ヤ簨浠剁被鍨�', trigger: 'blur' }],
+        level: [{ required: true, message: '璇疯緭鍏ヤ簨浠剁瓑绾�', trigger: 'blur' }],
+        status: [{ required: true, message: '璇疯緭鍏ョ姸鎬�', trigger: 'blur' }],
+        type: [{ required: true, message: '璇烽�夋嫨鎵�灞炲垎绫�', trigger: 'blur' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/warning',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/common/ImageCropper.vue b/admin/src/components/common/ImageCropper.vue
index 5ef77d9..a58eedc 100644
--- a/admin/src/components/common/ImageCropper.vue
+++ b/admin/src/components/common/ImageCropper.vue
@@ -13,8 +13,8 @@
               :canMove="options.canMove"
               :output-size="options.outputSize"
               :centerBox="options.centerBox"
-              :autoCropWidth="options.autoCropWidth"
-              :autoCropHeight="options.autoCropHeight"
+              :autoCropWidth="autoCrop.width || options.autoCropWidth"
+              :autoCropHeight="autoCrop.height || options.autoCropHeight"
               @realTime="realTime"
           ></vue-cropper>
         </div>
@@ -28,7 +28,7 @@
 
 <script>
 import { VueCropper } from 'vue-cropper'
-import {upload} from "@/api/system/common";
+import { upload } from '@/api/system/common'
 export default {
   name: 'ImageCropper',
   components: { VueCropper },
@@ -36,6 +36,12 @@
     imgSrc: {
       type: String,
       default: ''
+    },
+    autoCrop: {
+      type: Object,
+      default () {
+        return { width: 500, height: 500 }
+      }
     },
     // 鍥炴樉涓婃淇濆瓨鐨勬埅鍥剧殑浣嶇疆
     location: {
@@ -76,7 +82,7 @@
         centerBox: true,
         height: 500,
         width: 500,
-        outputSize:{width: 500, height: 500 },
+        outputSize: 1,
         autoCropWidth: 500,
         autoCropHeight: 500,
         fixed: true,
@@ -94,7 +100,7 @@
   watch: {
   },
   methods: {
-    getImagecropper(){
+    getImagecropper () {
       return this.$refs.cropper
     },
     // 瀛︿範鎴浘妗嗗彉鍖栦簨浠�
diff --git a/admin/src/components/common/UploadFaceImg.vue b/admin/src/components/common/UploadFaceImg.vue
index 98e2dd1..467f672 100644
--- a/admin/src/components/common/UploadFaceImg.vue
+++ b/admin/src/components/common/UploadFaceImg.vue
@@ -21,7 +21,7 @@
         :visible.sync="updateImg"
         width="1000px"
         class="icon-dialog-wrapper dialong-com-style">
-      <ImageCropper ref="iconShot" v-if="updateImg" :imgSrc="img" >
+      <ImageCropper ref="iconShot" v-if="updateImg" :imgSrc="img"  :auto-crop="autoCrop">
       </ImageCropper>
       <span slot="footer" class="dialog-footer">
             <el-button v-if="loading">鍙� 娑�</el-button>
@@ -42,7 +42,17 @@
       type: Object,
       default: () => {}
     },
-    tipsLabel: '',
+    autoCrop: {
+      type: Object,
+      default () {
+        return { width: 500, height: 500 }
+      }
+    },
+    // eslint-disable-next-line vue/require-prop-type-constructor
+    tipsLabel: {
+      type: String,
+      default: ''
+    },
     customStyle: {
       type: String,
       default: 'width: 90px; height: 90px;'
@@ -52,7 +62,7 @@
   data () {
     return {
       loading: false,
-      fileInfo:{},
+      fileInfo: {},
       img: null,
       updateImg: false,
       imageSrc: null,
@@ -68,17 +78,17 @@
         console.log(fileData)
         const formData = new FormData()
 
-        formData.append('folder', 'member')
-        if(this.uploadData.isFace || this.uploadData.isFace == 0){
+        formData.append('folder', this.uploadData.folder || 'member')
+        if (this.uploadData.isFace || this.uploadData.isFace == 0) {
           formData.append('isFace', 0)
         }
         formData.append(
-            'file',
-            new File(
-                [fileData], // 灏咮lob绫诲瀷杞寲鎴怓ile绫诲瀷
-                this.fileInfo.name, // 璁剧疆File绫诲瀷鐨勬枃浠跺悕绉�
-                { type: this.fileInfo.type } // 璁剧疆File绫诲瀷鐨勬枃浠剁被鍨�
-            )
+          'file',
+          new File(
+            [fileData], // 灏咮lob绫诲瀷杞寲鎴怓ile绫诲瀷
+            this.fileInfo.name, // 璁剧疆File绫诲瀷鐨勬枃浠跺悕绉�
+            { type: this.fileInfo.type } // 璁剧疆File绫诲瀷鐨勬枃浠剁被鍨�
+          )
         )
         this.loading = true
         upload(formData).then(res => {
diff --git a/admin/src/components/common/UploadImage.vue b/admin/src/components/common/UploadImage.vue
index c0bb2bb..289d49b 100644
--- a/admin/src/components/common/UploadImage.vue
+++ b/admin/src/components/common/UploadImage.vue
@@ -59,12 +59,11 @@
   },
   data() {
     return {
-      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadLocal',
-
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload',
       realList: [],
       srcList: [],
       tempIndex: 0,
-      showViewer: false,
+      showViewer: false
     }
   },
   watch: {
@@ -81,7 +80,6 @@
   },
   methods: {
     beforeUpload(file) {
-
       this.$emit('beginUpload')
       return true
     },
diff --git a/admin/src/views/business/categoryJkBanner.vue b/admin/src/views/business/categoryJkBanner.vue
index 9a091d8..9d52097 100644
--- a/admin/src/views/business/categoryJkBanner.vue
+++ b/admin/src/views/business/categoryJkBanner.vue
@@ -13,7 +13,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create','business:category:delete']">
-        <li><el-button type="primary" @click="$refs.OperaCategoryFileWindow.open('鏂板缓骞垮憡')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="$refs.OperaCategoryJkBannerWindow.open('鏂板缓骞垮憡')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
         <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
       </ul>
       <el-table
@@ -41,7 +41,7 @@
             fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaCategoryFileWindow.open('缂栬緫骞垮憡',row)" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaCategoryJkBannerWindow.open('缂栬緫骞垮憡',row)" v-permissions="['business:category:update']">缂栬緫</el-button>
             <el-button  type="text"  icon="el-icon-delete" @click="deleteById(row)" style="color: red" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -54,7 +54,7 @@
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaCategoryFileWindow ref="OperaCategoryFileWindow" @success="handlePageChange"/>
+    <OperaCategoryJkBannerWindow ref="OperaCategoryJkBannerWindow" @success="handlePageChange"/>
   </TableLayout>
 </template>
 
@@ -62,17 +62,17 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
-import OperaCategoryFileWindow from '@/components/business/OperaCategoryFileWindow'
+import OperaCategoryJkBannerWindow from '@/components/business/OperaCategoryJkBannerWindow'
 export default {
   name: 'areaSet',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaCategoryFileWindow },
+  components: { TableLayout, Pagination, OperaCategoryJkBannerWindow },
   data () {
     return {
       // 鎼滅储
       searchForm: {
         name: '',
-        type: 4
+        type: 3
       }
     }
   },
diff --git a/admin/src/views/business/categoryJkLine.vue b/admin/src/views/business/categoryJkLine.vue
index f1a7a9d..46db5ee 100644
--- a/admin/src/views/business/categoryJkLine.vue
+++ b/admin/src/views/business/categoryJkLine.vue
@@ -13,7 +13,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create','business:category:delete']">
-        <li><el-button type="primary" @click="$refs.OperaCategoryFileWindow.open('鏂板缓涓荤嚎璺�')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="$refs.OperaCategoryJkLineWindow.open('鏂板缓涓荤嚎璺�')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
         <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
       </ul>
       <el-table
@@ -34,7 +34,7 @@
             fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaCategoryFileWindow.open('缂栬緫涓荤嚎璺�',row)" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaCategoryJkLineWindow.open('缂栬緫涓荤嚎璺�',row)" v-permissions="['business:category:update']">缂栬緫</el-button>
             <el-button  type="text"  icon="el-icon-delete" @click="deleteById(row)" style="color: red" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -47,7 +47,7 @@
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaCategoryFileWindow ref="OperaCategoryFileWindow" @success="handlePageChange"/>
+    <OperaCategoryJkLineWindow ref="OperaCategoryJkLineWindow" @success="handlePageChange"/>
   </TableLayout>
 </template>
 
@@ -55,11 +55,11 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
-import OperaCategoryFileWindow from '@/components/business/OperaCategoryFileWindow'
+import OperaCategoryJkLineWindow from '@/components/business/OperaCategoryJkLineWindow'
 export default {
   name: 'areaSet',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaCategoryFileWindow },
+  components: { TableLayout, Pagination, OperaCategoryJkLineWindow },
   data () {
     return {
       // 鎼滅储
diff --git a/admin/src/views/business/jkCabinet.vue b/admin/src/views/business/jkCabinet.vue
new file mode 100644
index 0000000..6feef3f
--- /dev/null
+++ b/admin/src/views/business/jkCabinet.vue
@@ -0,0 +1,214 @@
+<template>
+  <TableLayout :permissions="['business:jkcabinet:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="璁惧缂栧彿" prop="code">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="璁惧鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ヨ澶囧悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="璁惧ID" prop="devId">
+        <el-input v-model="searchForm.devId" placeholder="璇疯緭鍏ヨ澶嘔D" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="搴忓垪鍙�" prop="serialNo">
+        <el-input v-model="searchForm.serialNo" placeholder="璇疯緭鍏ュ簭鍒楀彿" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閫氳鍦板潃" prop="linkAddr">
+        <el-input v-model="searchForm.linkAddr" placeholder="璇疯緭鍏ラ�氳鍦板潃" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="绔彛" prop="port">
+        <el-input v-model="searchForm.port" placeholder="璇疯緭鍏ョ鍙�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member)" prop="managerId">
+        <el-input v-model="searchForm.managerId" placeholder="璇疯緭鍏ヨ澶囩鐞嗗憳缂栫爜锛堝叧鑱攎ember)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="浣跨敤鏃堕暱(绉�)" prop="useTime">
+        <el-input v-model="searchForm.useTime" placeholder="璇疯緭鍏ヤ娇鐢ㄦ椂闀�(绉�)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏄惁鍙岄噸楠岃瘉 0鍚� 1鏄�" prop="doubleAuth">
+        <el-input v-model="searchForm.doubleAuth" placeholder="璇疯緭鍏ユ槸鍚﹀弻閲嶉獙璇� 0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="楠岃瘉浜虹紪鐮侊紙鍏宠仈member)" prop="authMemberId">
+        <el-input v-model="searchForm.authMemberId" placeholder="璇疯緭鍏ラ獙璇佷汉缂栫爜锛堝叧鑱攎ember)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掓暟" prop="rowNum">
+        <el-input v-model="searchForm.rowNum" placeholder="璇疯緭鍏ユ帓鏁�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒楁暟" prop="columnNum">
+        <el-input v-model="searchForm.columnNum" placeholder="璇疯緭鍏ュ垪鏁�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏈�鍚庨�氳鏃堕棿" prop="haertTime">
+        <el-date-picker v-model="searchForm.haertTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ渶鍚庨�氳鏃堕棿" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="lacation">
+        <el-input v-model="searchForm.lacation" placeholder="璇疯緭鍏ユ墍鍦ㄤ綅缃�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缁忓害" prop="longitude">
+        <el-input v-model="searchForm.longitude" placeholder="璇疯緭鍏ョ粡搴�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缁村害" prop="latitude">
+        <el-input v-model="searchForm.latitude" placeholder="璇疯緭鍏ョ淮搴�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缂栫爜鏂瑰紡 0鑷姩缂栫爜 1鎵嬪姩缂栫爜" prop="noType">
+        <el-input v-model="searchForm.noType" placeholder="璇疯緭鍏ョ紪鐮佹柟寮� 0鑷姩缂栫爜 1鎵嬪姩缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缂栫爜鍓嶇紑" prop="noPrefix">
+        <el-input v-model="searchForm.noPrefix" placeholder="璇疯緭鍏ョ紪鐮佸墠缂�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缂栫爜浣嶆暟" prop="noLength">
+        <el-input v-model="searchForm.noLength" placeholder="璇疯緭鍏ョ紪鐮佷綅鏁�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="璧峰缂栫爜" prop="noIndex">
+        <el-input v-model="searchForm.noIndex" placeholder="璇疯緭鍏ヨ捣濮嬬紪鐮�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkcabinet:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkcabinet:create', 'business:jkcabinet:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkCabinetWindow.open('鏂板缓閽ュ寵鏌滃熀鏈俊鎭〃')" icon="el-icon-plus" v-permissions="['business:jkcabinet:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcabinet:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="璁惧缂栧彿" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="璁惧鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="devId" label="璁惧ID" min-width="100px"></el-table-column>
+        <el-table-column prop="serialNo" label="搴忓垪鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="linkAddr" label="閫氳鍦板潃" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" min-width="100px"></el-table-column>
+        <el-table-column prop="port" label="绔彛" min-width="100px"></el-table-column>
+        <el-table-column prop="managerId" label="璁惧绠$悊鍛樼紪鐮侊紙鍏宠仈member)" min-width="100px"></el-table-column>
+        <el-table-column prop="useTime" label="浣跨敤鏃堕暱(绉�)" min-width="100px"></el-table-column>
+        <el-table-column prop="doubleAuth" label="鏄惁鍙岄噸楠岃瘉 0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="authMemberId" label="楠岃瘉浜虹紪鐮侊紙鍏宠仈member)" min-width="100px"></el-table-column>
+        <el-table-column prop="rowNum" label="鎺掓暟" min-width="100px"></el-table-column>
+        <el-table-column prop="columnNum" label="鍒楁暟" min-width="100px"></el-table-column>
+        <el-table-column prop="haertTime" label="鏈�鍚庨�氳鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="lacation" label="鎵�鍦ㄤ綅缃�" min-width="100px"></el-table-column>
+        <el-table-column prop="longitude" label="缁忓害" min-width="100px"></el-table-column>
+        <el-table-column prop="latitude" label="缁村害" min-width="100px"></el-table-column>
+        <el-table-column prop="noType" label="缂栫爜鏂瑰紡 0鑷姩缂栫爜 1鎵嬪姩缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="noPrefix" label="缂栫爜鍓嶇紑" min-width="100px"></el-table-column>
+        <el-table-column prop="noLength" label="缂栫爜浣嶆暟" min-width="100px"></el-table-column>
+        <el-table-column prop="noIndex" label="璧峰缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkcabinet:update', 'business:jkcabinet:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkCabinetWindow.open('缂栬緫閽ュ寵鏌滃熀鏈俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:jkcabinet:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcabinet:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkCabinetWindow ref="operaJkCabinetWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkCabinetWindow from '@/components/business/OperaJkCabinetWindow'
+export default {
+  name: 'JkCabinet',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkCabinetWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        code: '',
+        name: '',
+        devId: '',
+        serialNo: '',
+        linkAddr: '',
+        status: '',
+        port: '',
+        managerId: '',
+        useTime: '',
+        doubleAuth: '',
+        authMemberId: '',
+        rowNum: '',
+        columnNum: '',
+        haertTime: '',
+        lacation: '',
+        longitude: '',
+        latitude: '',
+        noType: '',
+        noPrefix: '',
+        noLength: '',
+        noIndex: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '閽ュ寵鏌滃熀鏈俊鎭〃',
+      api: '/business/jkCabinet',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkCabinetGrid.vue b/admin/src/views/business/jkCabinetGrid.vue
new file mode 100644
index 0000000..2f79e0e
--- /dev/null
+++ b/admin/src/views/business/jkCabinetGrid.vue
@@ -0,0 +1,139 @@
+<template>
+  <TableLayout :permissions="['business:jkcabinetgrid:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" prop="cabinetId">
+        <el-input v-model="searchForm.cabinetId" placeholder="璇疯緭鍏ラ挜鍖欐煖缂栫爜锛堝叧鑱攋k_cabinet)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鐮�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵缂栫爜锛堝叧鑱攋k_keys)" prop="keyId">
+        <el-input v-model="searchForm.keyId" placeholder="璇疯緭鍏ラ挜鍖欑紪鐮侊紙鍏宠仈jk_keys)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="搴忓垪鍙�" prop="serialNo">
+        <el-input v-model="searchForm.serialNo" placeholder="璇疯緭鍏ュ簭鍒楀彿" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="杩愯鐘舵��" prop="workingStatus">
+        <el-input v-model="searchForm.workingStatus" placeholder="璇疯緭鍏ヨ繍琛岀姸鎬�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkcabinetgrid:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkcabinetgrid:create', 'business:jkcabinetgrid:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkCabinetGridWindow.open('鏂板缓閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃')" icon="el-icon-plus" v-permissions="['business:jkcabinetgrid:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcabinetgrid:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="cabinetId" label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="keyId" label="閽ュ寵缂栫爜锛堝叧鑱攋k_keys)" min-width="100px"></el-table-column>
+        <el-table-column prop="serialNo" label="搴忓垪鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" min-width="100px"></el-table-column>
+        <el-table-column prop="workingStatus" label="杩愯鐘舵��" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkcabinetgrid:update', 'business:jkcabinetgrid:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkCabinetGridWindow.open('缂栬緫閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:jkcabinetgrid:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcabinetgrid:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkCabinetGridWindow ref="operaJkCabinetGridWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkCabinetGridWindow from '@/components/business/OperaJkCabinetGridWindow'
+export default {
+  name: 'JkCabinetGrid',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkCabinetGridWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        cabinetId: '',
+        code: '',
+        keyId: '',
+        serialNo: '',
+        status: '',
+        workingStatus: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃',
+      api: '/business/jkCabinetGrid',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkCabinetLog.vue b/admin/src/views/business/jkCabinetLog.vue
new file mode 100644
index 0000000..17d5c87
--- /dev/null
+++ b/admin/src/views/business/jkCabinetLog.vue
@@ -0,0 +1,154 @@
+<template>
+  <TableLayout :permissions="['business:jkcabinetlog:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" prop="cabinetId">
+        <el-input v-model="searchForm.cabinetId" placeholder="璇疯緭鍏ラ挜鍖欐煖缂栫爜锛堝叧鑱攋k_cabinet)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滄牸缂栫爜(鍏宠仈jk_cabinet_grid)" prop="gridId">
+        <el-input v-model="searchForm.gridId" placeholder="璇疯緭鍏ラ挜鍖欐煖鏍肩紪鐮�(鍏宠仈jk_cabinet_grid)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="楠岃瘉鏂瑰紡 0鍒疯劯 1鍒峰崱" prop="authType">
+        <el-input v-model="searchForm.authType" placeholder="璇疯緭鍏ラ獙璇佹柟寮� 0鍒疯劯 1鍒峰崱" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="杞﹁締缂栫爜锛堝叧鑱攃ars)" prop="carId">
+        <el-input v-model="searchForm.carId" placeholder="璇疯緭鍏ヨ溅杈嗙紪鐮侊紙鍏宠仈cars)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵缂栫爜(鍏宠仈jk_keys)" prop="keyId">
+        <el-input v-model="searchForm.keyId" placeholder="璇疯緭鍏ラ挜鍖欑紪鐮�(鍏宠仈jk_keys)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵淇℃伅锛堣溅鐗屽彿-閽ュ寵缂栫爜锛�" prop="keyInfo">
+        <el-input v-model="searchForm.keyInfo" placeholder="璇疯緭鍏ラ挜鍖欎俊鎭紙杞︾墝鍙�-閽ュ寵缂栫爜锛�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟" prop="roleType">
+        <el-input v-model="searchForm.roleType" placeholder="璇疯緭鍏ラ鍙栬鍒� 0闅忚溅 1闅忔淳杞﹀崟" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鎴愬姛 1澶辫触" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鎴愬姛 1澶辫触" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkcabinetlog:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkcabinetlog:create', 'business:jkcabinetlog:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkCabinetLogWindow.open('鏂板缓閽ュ寵鏌滃紑鍏抽棬璁板綍')" icon="el-icon-plus" v-permissions="['business:jkcabinetlog:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcabinetlog:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="cabinetId" label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" min-width="100px"></el-table-column>
+        <el-table-column prop="gridId" label="閽ュ寵鏌滄牸缂栫爜(鍏宠仈jk_cabinet_grid)" min-width="100px"></el-table-column>
+        <el-table-column prop="authType" label="楠岃瘉鏂瑰紡 0鍒疯劯 1鍒峰崱" min-width="100px"></el-table-column>
+        <el-table-column prop="carId" label="杞﹁締缂栫爜锛堝叧鑱攃ars)" min-width="100px"></el-table-column>
+        <el-table-column prop="keyId" label="閽ュ寵缂栫爜(鍏宠仈jk_keys)" min-width="100px"></el-table-column>
+        <el-table-column prop="memberId" label="浜哄憳缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="keyInfo" label="閽ュ寵淇℃伅锛堣溅鐗屽彿-閽ュ寵缂栫爜锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="roleType" label="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鎴愬姛 1澶辫触" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkcabinetlog:update', 'business:jkcabinetlog:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkCabinetLogWindow.open('缂栬緫閽ュ寵鏌滃紑鍏抽棬璁板綍', row)" icon="el-icon-edit" v-permissions="['business:jkcabinetlog:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcabinetlog:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkCabinetLogWindow ref="operaJkCabinetLogWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkCabinetLogWindow from '@/components/business/OperaJkCabinetLogWindow'
+export default {
+  name: 'JkCabinetLog',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkCabinetLogWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        cabinetId: '',
+        gridId: '',
+        authType: '',
+        carId: '',
+        keyId: '',
+        memberId: '',
+        keyInfo: '',
+        roleType: '',
+        status: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '閽ュ寵鏌滃紑鍏抽棬璁板綍',
+      api: '/business/jkCabinetLog',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkCustomer.vue b/admin/src/views/business/jkCustomer.vue
new file mode 100644
index 0000000..3fcc724
--- /dev/null
+++ b/admin/src/views/business/jkCustomer.vue
@@ -0,0 +1,154 @@
+<template>
+  <TableLayout :permissions="['business:jkcustomer:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鐮�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="lacation">
+        <el-input v-model="searchForm.lacation" placeholder="璇疯緭鍏ユ墍鍦ㄤ綅缃�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缁忓害" prop="longitude">
+        <el-input v-model="searchForm.longitude" placeholder="璇疯緭鍏ョ粡搴�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缁村害" prop="latitude">
+        <el-input v-model="searchForm.latitude" placeholder="璇疯緭鍏ョ淮搴�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閰嶉�佸懆鏈�" prop="weeks">
+        <el-input v-model="searchForm.weeks" placeholder="璇疯緭鍏ラ厤閫佸懆鏈�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
+        <el-input v-model="searchForm.lineId" placeholder="璇疯緭鍏ラ�佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0姝e父 绂佺敤" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 绂佺敤" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkcustomer:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkcustomer:create', 'business:jkcustomer:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkCustomerWindow.open('鏂板缓浜ゆ帶-瀹㈡埛淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jkcustomer:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcustomer:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="lacation" label="鎵�鍦ㄤ綅缃�" min-width="100px"></el-table-column>
+        <el-table-column prop="longitude" label="缁忓害" min-width="100px"></el-table-column>
+        <el-table-column prop="latitude" label="缁村害" min-width="100px"></el-table-column>
+        <el-table-column prop="weeks" label="閰嶉�佸懆鏈�" min-width="100px"></el-table-column>
+        <el-table-column prop="lineId" label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0姝e父 绂佺敤" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkcustomer:update', 'business:jkcustomer:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkCustomerWindow.open('缂栬緫浜ゆ帶-瀹㈡埛淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:jkcustomer:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcustomer:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkCustomerWindow ref="operaJkCustomerWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkCustomerWindow from '@/components/business/OperaJkCustomerWindow'
+export default {
+  name: 'JkCustomer',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkCustomerWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        name: '',
+        code: '',
+        lacation: '',
+        longitude: '',
+        latitude: '',
+        weeks: '',
+        lineId: '',
+        status: '',
+        sortnum: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜ゆ帶-瀹㈡埛淇℃伅琛�',
+      api: '/business/jkCustomer',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkIccard.vue b/admin/src/views/business/jkIccard.vue
new file mode 100644
index 0000000..3577834
--- /dev/null
+++ b/admin/src/views/business/jkIccard.vue
@@ -0,0 +1,134 @@
+<template>
+  <TableLayout :permissions="['business:jkiccard:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="浜哄憳缂栫爜缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮佺紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鐮�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0绂佺敤 1鍚敤" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0绂佺敤 1鍚敤" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍗″悕绉�" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ崱鍚嶇О" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" prop="cabinetId">
+        <el-input v-model="searchForm.cabinetId" placeholder="璇疯緭鍏ラ挜鍖欐煖缂栫爜锛堝叧鑱攋k_cabinet)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkiccard:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkiccard:create', 'business:jkiccard:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkIccardWindow.open('鏂板缓閽ュ寵鏌淚C鍗′俊鎭〃')" icon="el-icon-plus" v-permissions="['business:jkiccard:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkiccard:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="memberId" label="浜哄憳缂栫爜缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0绂佺敤 1鍚敤" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鍗″悕绉�" min-width="100px"></el-table-column>
+        <el-table-column prop="cabinetId" label="閽ュ寵鏌滅紪鐮侊紙鍏宠仈jk_cabinet)" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkiccard:update', 'business:jkiccard:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkIccardWindow.open('缂栬緫閽ュ寵鏌淚C鍗′俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:jkiccard:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkiccard:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkIccardWindow ref="operaJkIccardWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkIccardWindow from '@/components/business/OperaJkIccardWindow'
+export default {
+  name: 'JkIccard',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkIccardWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        memberId: '',
+        code: '',
+        status: '',
+        name: '',
+        cabinetId: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '閽ュ寵鏌淚C鍗′俊鎭〃',
+      api: '/business/jkIccard',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkKeys.vue b/admin/src/views/business/jkKeys.vue
new file mode 100644
index 0000000..dd82388
--- /dev/null
+++ b/admin/src/views/business/jkKeys.vue
@@ -0,0 +1,139 @@
+<template>
+  <TableLayout :permissions="['business:jkkeys:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閽ュ寵缂栧彿" prop="code">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ラ挜鍖欑紪鍙�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="杞︾墝鍙�" prop="carCode">
+        <el-input v-model="searchForm.carCode" placeholder="璇疯緭鍏ヨ溅鐗屽彿" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎵�灞炶溅杈�(鍏宠仈cars)" prop="carId">
+        <el-input v-model="searchForm.carId" placeholder="璇疯緭鍏ユ墍灞炶溅杈�(鍏宠仈cars)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="RFID鏍囩" prop="rfidLable">
+        <el-input v-model="searchForm.rfidLable" placeholder="璇疯緭鍏FID鏍囩" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟" prop="roleType">
+        <el-input v-model="searchForm.roleType" placeholder="璇疯緭鍏ラ鍙栬鍒� 0闅忚溅 1闅忔淳杞﹀崟" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkkeys:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkkeys:create', 'business:jkkeys:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkKeysWindow.open('鏂板缓閽ュ寵鍩烘湰淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jkkeys:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkkeys:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="閽ュ寵缂栧彿" min-width="100px"></el-table-column>
+        <el-table-column prop="carCode" label="杞︾墝鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="carId" label="鎵�灞炶溅杈�(鍏宠仈cars)" min-width="100px"></el-table-column>
+        <el-table-column prop="rfidLable" label="RFID鏍囩" min-width="100px"></el-table-column>
+        <el-table-column prop="roleType" label="棰嗗彇瑙勫垯 0闅忚溅 1闅忔淳杞﹀崟" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkkeys:update', 'business:jkkeys:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkKeysWindow.open('缂栬緫閽ュ寵鍩烘湰淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:jkkeys:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkkeys:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkKeysWindow ref="operaJkKeysWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkKeysWindow from '@/components/business/OperaJkKeysWindow'
+export default {
+  name: 'JkKeys',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkKeysWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        code: '',
+        carCode: '',
+        carId: '',
+        rfidLable: '',
+        roleType: '',
+        status: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '閽ュ寵鍩烘湰淇℃伅琛�',
+      api: '/business/jkKeys',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkLine.vue b/admin/src/views/business/jkLine.vue
new file mode 100644
index 0000000..0eb2e07
--- /dev/null
+++ b/admin/src/views/business/jkLine.vue
@@ -0,0 +1,144 @@
+<template>
+  <TableLayout :permissions="['business:jkline:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐝粍缂栫爜锛堝叧鑱攃ategory锛�" prop="categoryId">
+        <el-input v-model="searchForm.categoryId" placeholder="璇疯緭鍏ョ彮缁勭紪鐮侊紙鍏宠仈category锛�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎵�灞炶溅杈�(鍏宠仈cars)" prop="carId">
+        <el-input v-model="searchForm.carId" placeholder="璇疯緭鍏ユ墍灞炶溅杈�(鍏宠仈cars)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏈�澶у鎴烽噺" prop="maxCustomer">
+        <el-input v-model="searchForm.maxCustomer" placeholder="璇疯緭鍏ユ渶澶у鎴烽噺" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏈�澶ц鍗曢噺" prop="maxOrder">
+        <el-input v-model="searchForm.maxOrder" placeholder="璇疯緭鍏ユ渶澶ц鍗曢噺" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkline:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkline:create', 'business:jkline:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkLineWindow.open('鏂板缓浜ゆ帶-绾胯矾淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jkline:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkline:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="categoryId" label="鐝粍缂栫爜锛堝叧鑱攃ategory锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="carId" label="鎵�灞炶溅杈�(鍏宠仈cars)" min-width="100px"></el-table-column>
+        <el-table-column prop="maxCustomer" label="鏈�澶у鎴烽噺" min-width="100px"></el-table-column>
+        <el-table-column prop="maxOrder" label="鏈�澶ц鍗曢噺" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkline:update', 'business:jkline:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkLineWindow.open('缂栬緫浜ゆ帶-绾胯矾淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:jkline:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkline:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkLineWindow ref="operaJkLineWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkLineWindow from '@/components/business/OperaJkLineWindow'
+export default {
+  name: 'JkLine',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkLineWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        name: '',
+        categoryId: '',
+        carId: '',
+        maxCustomer: '',
+        maxOrder: '',
+        status: '',
+        sortnum: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜ゆ帶-绾胯矾淇℃伅琛�',
+      api: '/business/jkLine',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkOrders.vue b/admin/src/views/business/jkOrders.vue
new file mode 100644
index 0000000..1554889
--- /dev/null
+++ b/admin/src/views/business/jkOrders.vue
@@ -0,0 +1,144 @@
+<template>
+  <TableLayout :permissions="['business:jkorders:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閿�閲�" prop="num">
+        <el-input v-model="searchForm.num" placeholder="璇疯緭鍏ラ攢閲�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
+        <el-input v-model="searchForm.lineId" placeholder="璇疯緭鍏ラ�佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0姝e父 绂佺敤" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 绂佺敤" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="searchForm.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鍚岀彮缁勯棿瀹㈡埛浣嶇疆璺濈鏁扮粍锛孾{a:12,b:100},{a:13,b:200},...],a锛氬鎴风紪鐮侊紝b锛氫笌瀹㈡埛a涔嬮棿鐨勮窛绂�" prop="distances">
+        <el-input v-model="searchForm.distances" placeholder="璇疯緭鍏ュ悓鐝粍闂村鎴蜂綅缃窛绂绘暟缁勶紝[{a:12,b:100},{a:13,b:200},...],a锛氬鎴风紪鐮侊紝b锛氫笌瀹㈡埛a涔嬮棿鐨勮窛绂�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkorders:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkorders:create', 'business:jkorders:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkOrdersWindow.open('鏂板缓浜ゆ帶-閿�鍞鍗曚俊鎭〃')" icon="el-icon-plus" v-permissions="['business:jkorders:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkorders:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="num" label="閿�閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="lineId" label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0姝e父 绂佺敤" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="dateInfo" label="鏃ユ湡" min-width="100px"></el-table-column>
+        <el-table-column prop="distances" label="鍚岀彮缁勯棿瀹㈡埛浣嶇疆璺濈鏁扮粍锛孾{a:12,b:100},{a:13,b:200},...],a锛氬鎴风紪鐮侊紝b锛氫笌瀹㈡埛a涔嬮棿鐨勮窛绂�" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkorders:update', 'business:jkorders:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkOrdersWindow.open('缂栬緫浜ゆ帶-閿�鍞鍗曚俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:jkorders:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkorders:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkOrdersWindow ref="operaJkOrdersWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkOrdersWindow from '@/components/business/OperaJkOrdersWindow'
+export default {
+  name: 'JkOrders',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkOrdersWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        name: '',
+        num: '',
+        lineId: '',
+        status: '',
+        sortnum: '',
+        dateInfo: '',
+        distances: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜ゆ帶-閿�鍞鍗曚俊鎭〃',
+      api: '/business/jkOrders',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkSketch.vue b/admin/src/views/business/jkSketch.vue
new file mode 100644
index 0000000..8dc4322
--- /dev/null
+++ b/admin/src/views/business/jkSketch.vue
@@ -0,0 +1,144 @@
+<template>
+  <TableLayout :permissions="['business:jksketch:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="涓荤嚎璺紪鐮侊紙鍏宠仈category)" prop="categoryId">
+        <el-input v-model="searchForm.categoryId" placeholder="璇疯緭鍏ヤ富绾胯矾缂栫爜锛堝叧鑱攃ategory)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閫佽揣閲�" prop="totalNum">
+        <el-input v-model="searchForm.totalNum" placeholder="璇疯緭鍏ラ�佽揣閲�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="瀹㈡埛鏁�" prop="orderNum">
+        <el-input v-model="searchForm.orderNum" placeholder="璇疯緭鍏ュ鎴锋暟" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鏈紭鍖� 1浼樺寲涓� 2宸蹭紭鍖�" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈紭鍖� 1浼樺寲涓� 2宸蹭紭鍖�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="searchForm.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="浼樺寲璁板綍缂栫爜(浣滀负key鍊煎瓨redis锛�" prop="jobId">
+        <el-input v-model="searchForm.jobId" placeholder="璇疯緭鍏ヤ紭鍖栬褰曠紪鐮�(浣滀负key鍊煎瓨redis锛�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jksketch:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jksketch:create', 'business:jksketch:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkSketchWindow.open('鏂板缓浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jksketch:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jksketch:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="categoryId" label="涓荤嚎璺紪鐮侊紙鍏宠仈category)" min-width="100px"></el-table-column>
+        <el-table-column prop="totalNum" label="閫佽揣閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="orderNum" label="瀹㈡埛鏁�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鏈紭鍖� 1浼樺寲涓� 2宸蹭紭鍖�" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="dateInfo" label="鏃ユ湡" min-width="100px"></el-table-column>
+        <el-table-column prop="jobId" label="浼樺寲璁板綍缂栫爜(浣滀负key鍊煎瓨redis锛�" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jksketch:update', 'business:jksketch:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkSketchWindow.open('缂栬緫浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:jksketch:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jksketch:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkSketchWindow ref="operaJkSketchWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkSketchWindow from '@/components/business/OperaJkSketchWindow'
+export default {
+  name: 'JkSketch',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkSketchWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        categoryId: '',
+        totalNum: '',
+        orderNum: '',
+        status: '',
+        sortnum: '',
+        dateInfo: '',
+        jobId: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�',
+      api: '/business/jkSketch',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkSketchCustomer.vue b/admin/src/views/business/jkSketchCustomer.vue
new file mode 100644
index 0000000..2ca6d94
--- /dev/null
+++ b/admin/src/views/business/jkSketchCustomer.vue
@@ -0,0 +1,139 @@
+<template>
+  <TableLayout :permissions="['business:jksketchcustomer:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="绾胯矾缂栫爜锛堝叧鑱攋k_sketch_line)" prop="sketchLineId">
+        <el-input v-model="searchForm.sketchLineId" placeholder="璇疯緭鍏ョ嚎璺紪鐮侊紙鍏宠仈jk_sketch_line)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)" prop="sketchId">
+        <el-input v-model="searchForm.sketchId" placeholder="璇疯緭鍏ョ嚎璺紭鍖栫紪鐮侊紙鍏宠仈jk_sketch)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閫佽揣閲�" prop="totalNum">
+        <el-input v-model="searchForm.totalNum" placeholder="璇疯緭鍏ラ�佽揣閲�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="瀹㈡埛鏁�" prop="orderNum">
+        <el-input v-model="searchForm.orderNum" placeholder="璇疯緭鍏ュ鎴锋暟" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="searchForm.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�" @change="search"/>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jksketchcustomer:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jksketchcustomer:create', 'business:jksketchcustomer:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkSketchCustomerWindow.open('鏂板缓浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jksketchcustomer:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jksketchcustomer:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="sketchLineId" label="绾胯矾缂栫爜锛堝叧鑱攋k_sketch_line)" min-width="100px"></el-table-column>
+        <el-table-column prop="sketchId" label="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)" min-width="100px"></el-table-column>
+        <el-table-column prop="totalNum" label="閫佽揣閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="orderNum" label="瀹㈡埛鏁�" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="dateInfo" label="鏃ユ湡" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jksketchcustomer:update', 'business:jksketchcustomer:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkSketchCustomerWindow.open('缂栬緫浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:jksketchcustomer:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jksketchcustomer:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkSketchCustomerWindow ref="operaJkSketchCustomerWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkSketchCustomerWindow from '@/components/business/OperaJkSketchCustomerWindow'
+export default {
+  name: 'JkSketchCustomer',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkSketchCustomerWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        sketchLineId: '',
+        sketchId: '',
+        totalNum: '',
+        orderNum: '',
+        sortnum: '',
+        dateInfo: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�',
+      api: '/business/jkSketchCustomer',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkSketchLine.vue b/admin/src/views/business/jkSketchLine.vue
new file mode 100644
index 0000000..c3c7e05
--- /dev/null
+++ b/admin/src/views/business/jkSketchLine.vue
@@ -0,0 +1,139 @@
+<template>
+  <TableLayout :permissions="['business:jksketchline:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="绾胯矾缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
+        <el-input v-model="searchForm.lineId" placeholder="璇疯緭鍏ョ嚎璺紪鐮侊紙鍏宠仈jk_line)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)" prop="sketchId">
+        <el-input v-model="searchForm.sketchId" placeholder="璇疯緭鍏ョ嚎璺紭鍖栫紪鐮侊紙鍏宠仈jk_sketch)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閫佽揣閲�" prop="totalNum">
+        <el-input v-model="searchForm.totalNum" placeholder="璇疯緭鍏ラ�佽揣閲�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="瀹㈡埛鏁�" prop="orderNum">
+        <el-input v-model="searchForm.orderNum" placeholder="璇疯緭鍏ュ鎴锋暟" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="dateInfo">
+        <el-date-picker v-model="searchForm.dateInfo" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ棩鏈�" @change="search"/>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jksketchline:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jksketchline:create', 'business:jksketchline:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkSketchLineWindow.open('鏂板缓浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jksketchline:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jksketchline:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="lineId" label="绾胯矾缂栫爜锛堝叧鑱攋k_line)" min-width="100px"></el-table-column>
+        <el-table-column prop="sketchId" label="绾胯矾浼樺寲缂栫爜锛堝叧鑱攋k_sketch)" min-width="100px"></el-table-column>
+        <el-table-column prop="totalNum" label="閫佽揣閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="orderNum" label="瀹㈡埛鏁�" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="dateInfo" label="鏃ユ湡" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jksketchline:update', 'business:jksketchline:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkSketchLineWindow.open('缂栬緫浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:jksketchline:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jksketchline:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkSketchLineWindow ref="operaJkSketchLineWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkSketchLineWindow from '@/components/business/OperaJkSketchLineWindow'
+export default {
+  name: 'JkSketchLine',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkSketchLineWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        lineId: '',
+        sketchId: '',
+        totalNum: '',
+        orderNum: '',
+        sortnum: '',
+        dateInfo: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�',
+      api: '/business/jkSketchLine',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/jkVersion.vue b/admin/src/views/business/jkVersion.vue
new file mode 100644
index 0000000..18e08f8
--- /dev/null
+++ b/admin/src/views/business/jkVersion.vue
@@ -0,0 +1,149 @@
+<template>
+  <TableLayout :permissions="['business:jkversion:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐗堟湰鍙�" prop="versionInfo">
+        <el-input v-model="searchForm.versionInfo" placeholder="璇疯緭鍏ョ増鏈彿" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="瀹夎鍖呰矾寰�" prop="fileUrl">
+        <el-input v-model="searchForm.fileUrl" placeholder="璇疯緭鍏ュ畨瑁呭寘璺緞" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="瀹夎鐗堝悕绉�" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ畨瑁呯増鍚嶇О" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鎻忚堪" prop="content">
+        <el-input v-model="searchForm.content" placeholder="璇疯緭鍏ユ洿鏂版弿杩�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏍囬" prop="title">
+        <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ユ洿鏂版爣棰�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏄惁寮哄埗鏇存柊 0鍚� 1鏄�" prop="isForce">
+        <el-input v-model="searchForm.isForce" placeholder="璇疯緭鍏ユ槸鍚﹀己鍒舵洿鏂� 0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="骞冲彴绫诲瀷 0Android 1IOS" prop="type">
+        <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ュ钩鍙扮被鍨� 0Android 1IOS" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jkversion:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:jkversion:create', 'business:jkversion:delete']">
+        <li><el-button type="primary" @click="$refs.operaJkVersionWindow.open('鏂板缓浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃')" icon="el-icon-plus" v-permissions="['business:jkversion:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkversion:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="versionInfo" label="鐗堟湰鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="fileUrl" label="瀹夎鍖呰矾寰�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="瀹夎鐗堝悕绉�" min-width="100px"></el-table-column>
+        <el-table-column prop="content" label="鏇存柊鎻忚堪" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="title" label="鏇存柊鏍囬" min-width="100px"></el-table-column>
+        <el-table-column prop="isForce" label="鏄惁寮哄埗鏇存柊 0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="骞冲彴绫诲瀷 0Android 1IOS" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:jkversion:update', 'business:jkversion:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaJkVersionWindow.open('缂栬緫浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:jkversion:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkversion:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaJkVersionWindow ref="operaJkVersionWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaJkVersionWindow from '@/components/business/OperaJkVersionWindow'
+export default {
+  name: 'JkVersion',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaJkVersionWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        versionInfo: '',
+        fileUrl: '',
+        name: '',
+        content: '',
+        sortnum: '',
+        title: '',
+        isForce: '',
+        type: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃',
+      api: '/business/jkVersion',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/warning.vue b/admin/src/views/business/warning.vue
new file mode 100644
index 0000000..3c0b76e
--- /dev/null
+++ b/admin/src/views/business/warning.vue
@@ -0,0 +1,161 @@
+<template>
+  <TableLayout :permissions="['business:warning:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ユ椂闂村悕绉�" clearable  @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎶ヨ鍒嗙被" prop="type">
+        <el-select v-model="searchForm.type" placeholder="璇烽�夋嫨" clearable @change="search">
+          <el-option label="瀹夐槻浜嬩欢" value="0"></el-option>
+          <el-option label="娑堥槻浜嬩欢" value="1"></el-option>
+          <el-option label="杞﹁浇浜嬩欢" value="2"></el-option>
+          <el-option label="閽ュ寵鏌滀簨浠�" value="3"></el-option>
+          <el-option label="澶╂皵棰勮" value="4"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎶ヨ鍒嗙被" prop="level" >
+        <el-select v-model="searchForm.level" placeholder="璇烽�夋嫨" clearable @change="search">
+          <el-option label="浣�" value="0"></el-option>
+          <el-option label="涓�" value="1"></el-option>
+          <el-option label="楂�" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="璁㈤槄鐘舵��" prop="status" >
+          <el-select v-model="searchForm.level" placeholder="璇烽�夋嫨" clearable @change="search">
+            <el-option label="鏈闃�" value="0"></el-option>
+            <el-option label="宸茶闃�" value="1"></el-option>
+          </el-select>
+      </el-form-item>
+      <el-form-item label="璁㈤槄缁撴灉" prop="subscribeStatus" @change="search">
+        <el-select v-model="searchForm.subscribeStatus" placeholder="璇烽�夋嫨" clearable @change="search">
+          <el-option label="鏈闃�" value="0"></el-option>
+          <el-option label="璁㈤槄鎴愬姛" value="1"></el-option>
+          <el-option label="璁㈤槄澶辫触" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:warning:create', 'business:warning:delete']">
+        <li><el-button type="primary" @click="$refs.operaWarningWindow.open('鏂板缓鎶ヨ璁板綍淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:warning:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:warning:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+          :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鎶ヨ绫诲瀷" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="鎶ヨ鍒嗙被" min-width="120px">
+          <template slot-scope="{row}">
+            <span v-if="row.type === 0">瀹夐槻浜嬩欢</span>
+            <span v-if="row.type === 1"  >娑堥槻浜嬩欢</span>
+            <span v-if="row.type === 2"  >杞﹁浇浜嬩欢</span>
+            <span v-if="row.type === 3"  >閽ュ寵鏌滀簨浠�</span>
+            <span v-if="row.type === 4"  >澶╂皵棰勮</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="level" label="鎶ヨ绛夌骇" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.level === 0" class="status-grey">浣�</span>
+            <span v-if="row.level === 1"  class="status-yellow" >涓�</span>
+            <span v-if="row.level === 2"  class="status-red">楂�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="status" label="璁㈤槄鐘舵��" min-width="160px">
+          <template slot-scope="{row}">
+            <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
+                       inactive-color="#ff4949" :active-value="1" :inactive-value="0" >
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column prop="subscribeStatus" label="璁㈤槄缁撴灉" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="!row.subscribeStatus || row.subscribeStatus === 0" class="status-grey">鏈闃�</span>
+            <span v-if="row.subscribeStatus === 1"  class="status-yellow" >璁㈤槄鎴愬姛</span>
+            <span v-if="row.subscribeStatus === 2"  class="status-red">璁㈤槄澶辫触</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:warning:update', 'business:warning:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWarningWindow.open('缂栬緫鎶ヨ璁板綍淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:warning:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:warning:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWarningWindow ref="operaWarningWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaWarningWindow from '@/components/business/OperaWarningWindow'
+export default {
+  name: 'Warning',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaWarningWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        type: '',
+        level: '',
+        status: '',
+        subscribeStatus: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鎶ヨ璁板綍淇℃伅琛�',
+      api: '/business/warning',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    changeStatus (e, row) {
+      this.working = true
+      this.api.updateStatus({ id: row.id, status: e })
+        .then(res => {
+          this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
+          this.search()
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.working = false
+        })
+        .catch(() => { })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/warningPush.vue b/admin/src/views/business/warningPush.vue
new file mode 100644
index 0000000..0c0b205
--- /dev/null
+++ b/admin/src/views/business/warningPush.vue
@@ -0,0 +1,154 @@
+<template>
+  <TableLayout :permissions="['business:warningpush:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="鎶ヨ绫诲瀷" prop="warningId">
+        <el-select v-model="searchForm.warningId" placeholder="璇烽�夋嫨" clearable @change="search">
+          <el-option label="鏈帹閫�" value="0"></el-option>
+          <el-option label="鎺ㄩ�佹垚鍔�" value="1"></el-option>
+          <el-option label="鎺ㄩ�佸け璐�" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎶ヨ鍒嗙被" prop="warningType">
+        <el-select v-model="searchForm.warningType" placeholder="璇烽�夋嫨" clearable  @change="search">
+          <el-option label="瀹夐槻浜嬩欢" value="0"></el-option>
+          <el-option label="娑堥槻浜嬩欢" value="1"></el-option>
+          <el-option label="杞﹁浇浜嬩欢" value="2"></el-option>
+          <el-option label="閽ュ寵鏌滀簨浠�" value="3"></el-option>
+          <el-option label="澶╂皵棰勮" value="4"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎶ヨ鏍囬" prop="title">
+        <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ユ姤璀︽爣棰�" clearable @keypress.enter.native="search" ></el-input>
+      </el-form-item>
+      <el-form-item label="鎶ヨ鍐呭" prop="content">
+        <el-input v-model="searchForm.content" placeholder="璇疯緭鍏ユ姤璀﹀唴瀹�" clearable @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="閫氱煡鐘舵�� " prop="status">
+        <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨"   clearable @change="search">
+          <el-option label="鏈�氱煡" value="0"></el-option>
+          <el-option label="閫氱煡鎴愬姛" value="1"></el-option>
+          <el-option label="閫氱煡澶辫触" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鍙戠敓鏃堕棿" prop="date">
+        <el-date-picker
+            v-model="searchForm.queryStarttime"
+            type="datetime"
+            clearable
+            value-format="yyyy-MM-dd HH:mm:ss"
+            class="w200"
+            placeholder="寮�濮嬫椂闂�" />
+        <el-date-picker
+            v-model="searchForm.queryEndtime"
+            type="datetime"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            class="w200"
+            clearable
+            placeholder="缁撴潫鏃堕棿" />
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:warningpush:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:warningpush:create', 'business:warningpush:delete']">
+        <li><el-button type="primary" @click="$refs.operaWarningPushWindow.open('鏂板缓鎶ヨ鎺ㄩ�佽褰�')" icon="el-icon-plus" v-permissions="['business:warningpush:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:warningpush:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="createDate" label="鍙戠敓鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column prop="warningName" label="鎶ヨ绫诲瀷" min-width="120px" show-tooltip-when-overflow></el-table-column>
+        <el-table-column prop="warningType" label="鎶ヨ鍒嗙被" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.warningType === 0">瀹夐槻浜嬩欢</span>
+            <span v-if="row.warningType === 1"  >娑堥槻浜嬩欢</span>
+            <span v-if="row.warningType === 2"  >杞﹁浇浜嬩欢</span>
+            <span v-if="row.warningType === 3"  >閽ュ寵鏌滀簨浠�</span>
+            <span v-if="row.warningType === 4"  >澶╂皵棰勮</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="warningLevel" label="鎶ヨ绛夌骇" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.warningLevel === 0" class="status-grey">浣�</span>
+            <span v-if="row.warningLevel === 1"  class="status-yellow" >涓�</span>
+            <span v-if="row.warningLevel === 2"  class="status-red">楂�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="region" label="鎵�鍦ㄤ綅缃�" min-width="120px" show-tooltip-when-overflow></el-table-column>
+        <el-table-column prop="content" label="鎶ヨ鍐呭" min-width="180px" show-tooltip-when-overflow></el-table-column>
+        <el-table-column prop="memberName" label="閫氱煡浜哄憳" min-width="100px" show-tooltip-when-overflow></el-table-column>
+        <el-table-column prop="status" label="閫氱煡鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <span style="color: rgba(245, 154, 35, 0.996);" v-if="row.status === 0">鏈�氱煡</span>
+            <span v-if="row.status === 1" style="color: rgba(245, 154, 35, 0.996);">閫氱煡鎴愬姛</span>
+            <span v-if="row.status === 2" style="color: rgba(245, 154, 35, 0.996);">鍚屽織澶辫触</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:warningpush:update', 'business:warningpush:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+<!--          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWarningPushWindow.open('缂栬緫鎶ヨ鎺ㄩ�佽褰�', row)" icon="el-icon-edit" v-permissions="['business:warningpush:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:warningpush:delete']">鍒犻櫎</el-button>
+          </template>-->
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWarningPushWindow ref="operaWarningPushWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaWarningPushWindow from '@/components/business/OperaWarningPushWindow'
+export default {
+  name: 'WarningPush',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaWarningPushWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        warningId: '',
+        warningType: null,
+        title: '',
+        content: '',
+        status: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鎶ヨ鎺ㄩ�佽褰�',
+      api: '/business/warningPush',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/warningRule.vue b/admin/src/views/business/warningRule.vue
new file mode 100644
index 0000000..c0511a1
--- /dev/null
+++ b/admin/src/views/business/warningRule.vue
@@ -0,0 +1,135 @@
+<template>
+  <TableLayout :permissions="['business:warningrule:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍐呴儴浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ュ唴閮ㄤ汉鍛樼紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶氳鍒欓棿闅旀椂闂�(绉掞級" prop="intervalSec">
+        <el-input v-model="searchForm.intervalSec" placeholder="璇疯緭鍏ュ瑙勫垯闂撮殧鏃堕棿(绉掞級" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0绂佺敤 1鍚敤" prop="status">
+        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0绂佺敤 1鍚敤" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�" prop="warningId">
+        <el-input v-model="searchForm.warningId" placeholder="璇疯緭鍏ユ姤璀︾被鍨嬬紪鐮�(鍏宠仈warning锛�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:warningrule:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:warningrule:create', 'business:warningrule:delete']">
+        <li><el-button type="primary" @click="$refs.operaWarningRuleWindow.open('鏂板缓鎶ヨ瑙勫垯閰嶇疆琛�')" icon="el-icon-plus" v-permissions="['business:warningrule:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:warningrule:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+          :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="memberId" label="鍐呴儴浜哄憳缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="intervalSec" label="澶氳鍒欓棿闅旀椂闂�(绉掞級" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0绂佺敤 1鍚敤" min-width="100px"></el-table-column>
+        <el-table-column prop="warningId" label="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:warningrule:update', 'business:warningrule:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWarningRuleWindow.open('缂栬緫鎶ヨ瑙勫垯閰嶇疆琛�', row)" icon="el-icon-edit" v-permissions="['business:warningrule:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:warningrule:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWarningRuleWindow ref="operaWarningRuleWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaWarningRuleWindow from '@/components/business/OperaWarningRuleWindow'
+export default {
+  name: 'WarningRule',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaWarningRuleWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        memberId: '',
+        intervalSec: '',
+        sortnum: '',
+        status: '',
+        warningId: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鎶ヨ瑙勫垯閰嶇疆琛�',
+      api: '/business/warningRule',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/warningRuleDetail.vue b/admin/src/views/business/warningRuleDetail.vue
new file mode 100644
index 0000000..9ef4dc0
--- /dev/null
+++ b/admin/src/views/business/warningRuleDetail.vue
@@ -0,0 +1,140 @@
+<template>
+  <TableLayout :permissions="['business:warningruledetail:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="涓婚敭" prop="id">
+        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="瑙勫垯缂栫爜锛堝叧鑱攚arning_rule)" prop="ruleId">
+        <el-input v-model="searchForm.ruleId" placeholder="璇疯緭鍏ヨ鍒欑紪鐮侊紙鍏宠仈warning_rule)" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�" prop="warningId">
+        <el-input v-model="searchForm.warningId" placeholder="璇疯緭鍏ユ姤璀︾被鍨嬬紪鐮�(鍏宠仈warning锛�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="澶氳鍒欓棿闅旀椂闂�(绉掞級" prop="regionCode">
+        <el-input v-model="searchForm.regionCode" placeholder="璇疯緭鍏ュ瑙勫垯闂撮殧鏃堕棿(绉掞級" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍖哄煙鍚嶇О" prop="regionName">
+        <el-input v-model="searchForm.regionName" placeholder="璇疯緭鍏ュ尯鍩熷悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="鍖哄煙涓婚敭" prop="regionId">
+        <el-input v-model="searchForm.regionId" placeholder="璇疯緭鍏ュ尯鍩熶富閿�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:warningruledetail:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:warningruledetail:create', 'business:warningruledetail:delete']">
+        <li><el-button type="primary" @click="$refs.operaWarningRuleDetailWindow.open('鏂板缓鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�')" icon="el-icon-plus" v-permissions="['business:warningruledetail:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:warningruledetail:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+          :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="ruleId" label="瑙勫垯缂栫爜锛堝叧鑱攚arning_rule)" min-width="100px"></el-table-column>
+        <el-table-column prop="warningId" label="鎶ヨ绫诲瀷缂栫爜(鍏宠仈warning锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="regionCode" label="澶氳鍒欓棿闅旀椂闂�(绉掞級" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="regionName" label="鍖哄煙鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="regionId" label="鍖哄煙涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:warningruledetail:update', 'business:warningruledetail:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWarningRuleDetailWindow.open('缂栬緫鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�', row)" icon="el-icon-edit" v-permissions="['business:warningruledetail:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:warningruledetail:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWarningRuleDetailWindow ref="operaWarningRuleDetailWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaWarningRuleDetailWindow from '@/components/business/OperaWarningRuleDetailWindow'
+export default {
+  name: 'WarningRuleDetail',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaWarningRuleDetailWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        info: '',
+        ruleId: '',
+        warningId: '',
+        regionCode: '',
+        sortnum: '',
+        regionName: '',
+        regionId: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�',
+      api: '/business/warningRuleDetail',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
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
deleted file mode 100644
index 960d4e4..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 5e5e626..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetGridController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 1ef4779..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCabinetLogController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 84fba8f..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkCustomerController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index a7a6dab..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkIccardController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index e4ce914..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkKeysController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 316eccd..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkLineController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index ccfe9c3..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkOrdersController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 93d162e..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 3f75e9f..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchCustomerController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 6eb157d..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkSketchLineController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index c6a479a..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JkVersionController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index c0be405..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index b77254d..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningPushController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index aac7e49..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index cc35d12..0000000
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/WarningRuleDetailController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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/WarningCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/WarningCloudController.java
index 556f7c3..2a11d69 100644
--- 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
@@ -5,6 +5,7 @@
 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.Member;
 import com.doumee.dao.business.model.Warning;
 import com.doumee.service.business.WarningService;
 import com.doumee.service.business.third.model.ApiResponse;
@@ -35,35 +36,45 @@
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
     @CloudRequiredPermission("business:warning:create")
-    public ApiResponse create(@RequestBody Warning warning) {
+    public ApiResponse create(@RequestBody Warning warning, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        warning.setLoginUserInfo(this.getLoginUser(token));
         return ApiResponse.success(warningService.create(warning));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:warning:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
-        warningService.deleteById(id);
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        warningService.deleteById(id,this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鏍规嵁ID 绂佸惎鐢�  ")
+    @PostMapping("/updateStatus")
+    @CloudRequiredPermission("business:warning:update")
+    public ApiResponse updateStatus(@RequestBody Warning param, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        param.setLoginUserInfo(this.getLoginUser(token));
+        warningService.updateStatus(param);
         return ApiResponse.success(null);
     }
 
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
     @CloudRequiredPermission("business:warning:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         String [] idArray = ids.split(",");
         List<Integer> idList = new ArrayList<>();
         for (String id : idArray) {
             idList.add(Integer.valueOf(id));
         }
-        warningService.deleteByIdInBatch(idList);
+        warningService.deleteByIdInBatch(idList,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
 
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:warning:update")
-    public ApiResponse updateById(@RequestBody Warning warning) {
+    public ApiResponse updateById(@RequestBody Warning warning, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        warning.setLoginUserInfo(this.getLoginUser(token));
         warningService.updateById(warning);
         return ApiResponse.success(null);
     }
@@ -71,21 +82,21 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:warning:query")
-    public ApiResponse<PageData<Warning>> findPage (@RequestBody PageWrap<Warning> pageWrap) {
+    public ApiResponse<PageData<Warning>> findPage (@RequestBody PageWrap<Warning> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(warningService.findPage(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:warning:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<Warning> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<Warning> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(Warning.class).export(warningService.findPage(pageWrap).getRecords(), "鎶ヨ璁板綍淇℃伅琛�", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:warning:query")
-    public ApiResponse findById(@PathVariable Integer id) {
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(warningService.findById(id));
     }
 }
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
index 187d218..a326505 100644
--- 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
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.WarningPush;
+import com.github.yulichang.base.MPJBaseMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/09/28 09:01
  */
-public interface WarningPushMapper extends BaseMapper<WarningPush> {
+public interface WarningPushMapper extends MPJBaseMapper<WarningPush> {
 
 }
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
index 5ac7ad0..7e187cb 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -19,7 +20,7 @@
 @Data
 @ApiModel("閽ュ寵鏌滃熀鏈俊鎭〃")
 @TableName("`jk_cabinet`")
-public class JkCabinet {
+public class JkCabinet  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index 46ec0bf..0e9402f 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("閽ュ寵鏌滄煖鏍煎熀鏈俊鎭〃")
 @TableName("`jk_cabinet_grid`")
-public class JkCabinetGrid {
+public class JkCabinetGrid  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index d999ccd..5b6b703 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("閽ュ寵鏌滃紑鍏抽棬璁板綍")
 @TableName("`jk_cabinet_log`")
-public class JkCabinetLog {
+public class JkCabinetLog  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index 3941aec..59b7ae3 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -19,7 +20,7 @@
 @Data
 @ApiModel("浜ゆ帶-瀹㈡埛淇℃伅琛�")
 @TableName("`jk_customer`")
-public class JkCustomer {
+public class JkCustomer  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index ec888cf..bb6ee97 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("閽ュ寵鏌淚C鍗′俊鎭〃")
 @TableName("`jk_iccard`")
-public class JkIccard {
+public class JkIccard  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index a7e98e3..fe19998 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("閽ュ寵鍩烘湰淇℃伅琛�")
 @TableName("`jk_keys`")
-public class JkKeys {
+public class JkKeys  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index c7bb257..ba54cbb 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("浜ゆ帶-绾胯矾淇℃伅琛�")
 @TableName("`jk_line`")
-public class JkLine {
+public class JkLine  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index 74bcb58..8666c3e 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("浜ゆ帶-閿�鍞鍗曚俊鎭〃")
 @TableName("`jk_orders`")
-public class JkOrders {
+public class JkOrders  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index 711ceb5..95a47d7 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("浜ゆ帶-绾胯矾浼樺寲璁板綍淇℃伅琛�")
 @TableName("`jk_sketch`")
-public class JkSketch {
+public class JkSketch  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index bb7eac3..f267cf5 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("浜ゆ帶-绾胯矾浼樺寲绾胯矾瀹㈡埛璁板綍淇℃伅琛�")
 @TableName("`jk_sketch_customer`")
-public class JkSketchCustomer {
+public class JkSketchCustomer  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index 24f400c..c700662 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("浜ゆ帶-绾胯矾浼樺寲绾胯矾璁板綍淇℃伅琛�")
 @TableName("`jk_sketch_line`")
-public class JkSketchLine {
+public class JkSketchLine  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index c2402c0..234c566 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("浜ゆ帶-閽ュ寵鏌滅粓绔増鏈俊鎭〃")
 @TableName("`jk_version`")
-public class JkVersion {
+public class JkVersion  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index fb33896..1d79ddc 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("鎶ヨ璁板綍淇℃伅琛�")
 @TableName("`warning`")
-public class Warning {
+public class Warning  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
@@ -99,4 +100,5 @@
     @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
index 77dc897..11d4da6 100644
--- 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
@@ -1,6 +1,8 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,77 +20,106 @@
 @Data
 @ApiModel("鎶ヨ鎺ㄩ�佽褰�")
 @TableName("`warning_push`")
-public class WarningPush {
+public class WarningPush  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
-    @ExcelColumn(name="涓婚敭")
+    //@ExcelColumn(name="涓婚敭")
     private Integer id;
 
     @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    //@ExcelColumn(name="鍒涘缓浜虹紪鐮�")
     private Integer creator;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelColumn(name="鍙戠敓浜嬩欢",dateFormat = "yyyy-MM-dd HH:mm:ss",index = 1)
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    //@ExcelColumn(name="鏇存柊浜虹紪鐮�")
     private Integer editor;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @ExcelColumn(name="鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    //@ExcelColumn(name="鏇存柊鏃堕棿")
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
-    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    //@ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
     private Integer isdeleted;
 
     @ApiModelProperty(value = "澶囨敞")
-    @ExcelColumn(name="澶囨敞")
+    //@ExcelColumn(name="澶囨敞")
     private String info;
 
     @ApiModelProperty(value = "浜哄憳缂栫爜锛堝叧鑱攎ember)", example = "1")
-    @ExcelColumn(name="浜哄憳缂栫爜锛堝叧鑱攎ember)")
+    //@ExcelColumn(name="浜哄憳缂栫爜锛堝叧鑱攎ember)")
     private Integer memberId;
 
     @ApiModelProperty(value = "浜嬩欢缂栫爜(鍏宠仈warning锛�", example = "1")
-    @ExcelColumn(name="浜嬩欢缂栫爜(鍏宠仈warning锛�")
+    //@ExcelColumn(name="浜嬩欢缂栫爜(鍏宠仈warning锛�")
     private Integer warningId;
 
     @ApiModelProperty(value = "鎶ヨ鏍囬")
-    @ExcelColumn(name="鎶ヨ鏍囬")
+    //@ExcelColumn(name="鎶ヨ鏍囬")
     private String title;
 
     @ApiModelProperty(value = "鎶ヨ鍐呭")
-    @ExcelColumn(name="鎶ヨ鍐呭")
+    //@ExcelColumn(name="鎶ヨ鍐呭")
     private String content;
 
     @ApiModelProperty(value = "鐘舵�� 0鏈帹閫� 1鎺ㄩ�佹垚鍔�2鎺ㄩ�佸け璐�", example = "1")
-    @ExcelColumn(name="鐘舵�� 0鏈帹閫� 1鎺ㄩ�佹垚鍔�2鎺ㄩ�佸け璐�")
+    @ExcelColumn(name="閫氱煡鐘舵��",valueMapping = "0=鏈�氱煡;1=閫氱煡鎴愬姛;2=閫氱煡澶辫触;",index = 7)
     private Integer status;
 
     @ApiModelProperty(value = "鎺ㄩ�佺粨鏋�", example = "1")
-    @ExcelColumn(name="鎺ㄩ�佺粨鏋�")
+    //@ExcelColumn(name="鎺ㄩ�佺粨鏋�")
     private Integer pushInfo;
 
     @ApiModelProperty(value = "浜嬩欢鍐呭")
-    @ExcelColumn(name="浜嬩欢鍐呭")
+    //@ExcelColumn(name="浜嬩欢鍐呭")
     private String eventInfo;
 
-    @ApiModelProperty(value = "鎺ㄩ�佹爣璇�")
-    @ExcelColumn(name="鎺ㄩ�佹爣璇�")
+    @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
+    //@ExcelColumn(name="鎺ㄩ�佹爣璇�")
     private String pushId;
+    @ApiModelProperty(value = "鎺ㄩ�佹爣璇�")
+    @ExcelColumn(name="鎵�鍦ㄤ綅缃�",index = 5)
+    private String region;
 
     @ApiModelProperty(value = "鎺ㄩ�佹椂闂�")
-    @ExcelColumn(name="鎺ㄩ�佹椂闂�")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    //@ExcelColumn(name="鎺ㄩ�佹椂闂�")
     private Date pushDate;
 
     @ApiModelProperty(value = "鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡", example = "1")
-    @ExcelColumn(name="鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡")
+    //@ExcelColumn(name="鎺ㄩ�佹柟寮� 0閽夐拤閫氱煡")
     private Integer pushType;
 
+    @ApiModelProperty(value = "浜嬩欢鍒嗙被 0=瀹夐槻浜嬩欢锛�1=娑堥槻浜嬩欢锛�2=杞﹁浇浜嬩欢锛�3=閽ュ寵鏌滀簨浠讹紱 4=澶╂皵棰勮锛�", example = "1")
+    @ExcelColumn(name="浜嬩欢鍒嗙被",valueMapping = "0=瀹夐槻浜嬩欢;1=娑堥槻浜嬩欢;2=杞﹁浇浜嬩欢;3=閽ュ寵鏌滀簨浠�;4=澶╂皵棰勮;",index = 3)
+    @TableField(exist = false)
+    private Integer warningType;
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷", example = "1")
+    @ExcelColumn(name="浜嬩欢绫诲瀷",index = 2)
+    @TableField(exist = false)
+    private String warningName;
+    @ApiModelProperty(value = "浜嬩欢绛夌骇 0浣� 1涓� 2楂�", example = "1")
+    @ExcelColumn(name="浜嬩欢绛夌骇",valueMapping = "0=浣�;1=涓�;2=楂�;",index = 4)
+    @TableField(exist = false)
+    private Integer warningLevel;
+    @ApiModelProperty(value = "閫氱煡浜哄憳", example = "1")
+    @ExcelColumn(name="閫氱煡浜哄憳",index = 6)
+    @TableField(exist = false)
+    private String memberName;
+
+
+
+    @ApiModelProperty(value = "鏌ヨ鏃堕棿寮�濮� 鏃ユ湡鏍煎紡锛歽yyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private Date queryStarttime;
+
+    @ApiModelProperty(value = "鏌ヨ鏃堕棿缁撴潫 鏃ユ湡鏍煎紡锛歽yyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private Date queryEndtime;
+
 }
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
index 33fbff5..f383679 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("鎶ヨ瑙勫垯閰嶇疆琛�")
 @TableName("`warning_rule`")
-public class WarningRule {
+public class WarningRule  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index 938879a..09d8952 100644
--- 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
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -18,7 +19,7 @@
 @Data
 @ApiModel("鎶ヨ瑙勫垯閰嶇疆鏄庣粏琛�")
 @TableName("`warning_rule_detail`")
-public class WarningRuleDetail {
+public class WarningRuleDetail  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
     @ExcelColumn(name="涓婚敭")
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
index 9238c23..db51aba 100644
--- 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
@@ -1,5 +1,6 @@
 package com.doumee.service.business;
 
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.dao.business.model.Warning;
@@ -25,7 +26,7 @@
      *
      * @param id 涓婚敭
      */
-    void deleteById(Integer id);
+    void deleteById(Integer id, LoginUserInfo user);
 
     /**
      * 鍒犻櫎
@@ -39,7 +40,7 @@
      *
      * @param ids 涓婚敭闆�
      */
-    void deleteByIdInBatch(List<Integer> ids);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
 
     /**
      * 涓婚敭鏇存柊
@@ -94,4 +95,6 @@
      * @return long
      */
     long count(Warning warning);
+
+    void updateStatus(Warning param);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
index cc6c81d..50ff9f0 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
@@ -108,9 +108,9 @@
         model.setCreateDate(new Date());
         model.setCreator(loginUserInfo.getId());
         model.setEditDate(new Date());
+        model.setIsdeleted(Constants.ZERO);
         model.setEdirot(loginUserInfo.getId());
         model.setStatus(Constants.ZERO);
-        model.setIsdeleted(Constants.ZERO);
         model.setHkStatus(Constants.ZERO);
         model.setAuthStatus(Constants.ZERO);
         model.setRemark("");
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index cd7d2f9..f1808a3 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -238,7 +238,7 @@
 
         List<Category> categories = categoryMapper.selectList(wrapper);
         if (org.apache.commons.collections.CollectionUtils.isNotEmpty(categories)){
-            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"鍒嗙被淇℃伅宸插瓨鍦�");
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"淇℃伅宸插瓨鍦�");
         }
     }
 }
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
index d1cb6d2..afc5810 100644
--- 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
@@ -1,20 +1,27 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.Visits;
+import com.doumee.dao.business.model.Warning;
 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.dao.business.model.Member;
 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 com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 鎶ヨ鎺ㄩ�佽褰昐ervice瀹炵幇
@@ -83,65 +90,78 @@
         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<>();
+        MPJLambdaWrapper<WarningPush> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        queryWrapper.selectAll(WarningPush.class )
+                .selectAs(Member::getName,WarningPush::getMemberName)
+                .selectAs(Warning::getName,WarningPush::getWarningName)
+                .selectAs(Warning::getType,WarningPush::getWarningType)
+                .selectAs(Warning::getLevel,WarningPush::getWarningLevel)
+                .leftJoin(Member.class,Member::getId,WarningPush::getMemberId)
+                .leftJoin(Warning.class,Warning::getId,WarningPush::getWarningId);
+        queryWrapper.eq(pageWrap.getModel().getWarningType()!=null,Warning::getType, pageWrap.getModel().getWarningType());
+        queryWrapper.eq(pageWrap.getModel().getWarningLevel()!=null,Warning::getLevel, pageWrap.getModel().getWarningLevel());
+        queryWrapper.eq(pageWrap.getModel().getWarningLevel()!=null,Warning::getLevel, pageWrap.getModel().getWarningLevel());
+        queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getQueryStarttime()), WarningPush::getCreateDate,Utils.Date.getStart(pageWrap.getModel().getQueryStarttime()));
+        queryWrapper.le(Objects.nonNull(pageWrap.getModel().getQueryEndtime()),WarningPush::getCreateDate,Utils.Date.getEnd(pageWrap.getModel().getQueryEndtime()));
         if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(WarningPush::getId, pageWrap.getModel().getId());
+            queryWrapper.eq(WarningPush::getId, pageWrap.getModel().getId());
         }
         if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(WarningPush::getCreator, pageWrap.getModel().getCreator());
+            queryWrapper.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()));
+            queryWrapper.ge(WarningPush::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.le(WarningPush::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
         }
         if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(WarningPush::getEditor, pageWrap.getModel().getEditor());
+            queryWrapper.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()));
+            queryWrapper.ge(WarningPush::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.le(WarningPush::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
         }
         if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(WarningPush::getIsdeleted, pageWrap.getModel().getIsdeleted());
+            queryWrapper.eq(WarningPush::getIsdeleted, pageWrap.getModel().getIsdeleted());
         }
         if (pageWrap.getModel().getInfo() != null) {
-            queryWrapper.lambda().eq(WarningPush::getInfo, pageWrap.getModel().getInfo());
+            queryWrapper.eq(WarningPush::getInfo, pageWrap.getModel().getInfo());
         }
         if (pageWrap.getModel().getMemberId() != null) {
-            queryWrapper.lambda().eq(WarningPush::getMemberId, pageWrap.getModel().getMemberId());
+            queryWrapper.eq(WarningPush::getMemberId, pageWrap.getModel().getMemberId());
         }
         if (pageWrap.getModel().getWarningId() != null) {
-            queryWrapper.lambda().eq(WarningPush::getWarningId, pageWrap.getModel().getWarningId());
+            queryWrapper.eq(WarningPush::getWarningId, pageWrap.getModel().getWarningId());
         }
         if (pageWrap.getModel().getTitle() != null) {
-            queryWrapper.lambda().eq(WarningPush::getTitle, pageWrap.getModel().getTitle());
+            queryWrapper.like(WarningPush::getTitle, pageWrap.getModel().getTitle());
         }
         if (pageWrap.getModel().getContent() != null) {
-            queryWrapper.lambda().eq(WarningPush::getContent, pageWrap.getModel().getContent());
+            queryWrapper.like(WarningPush::getContent, pageWrap.getModel().getContent());
         }
         if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(WarningPush::getStatus, pageWrap.getModel().getStatus());
+            queryWrapper.eq(WarningPush::getStatus, pageWrap.getModel().getStatus());
         }
         if (pageWrap.getModel().getPushInfo() != null) {
-            queryWrapper.lambda().eq(WarningPush::getPushInfo, pageWrap.getModel().getPushInfo());
+            queryWrapper.eq(WarningPush::getPushInfo, pageWrap.getModel().getPushInfo());
         }
         if (pageWrap.getModel().getEventInfo() != null) {
-            queryWrapper.lambda().eq(WarningPush::getEventInfo, pageWrap.getModel().getEventInfo());
+            queryWrapper.eq(WarningPush::getEventInfo, pageWrap.getModel().getEventInfo());
         }
         if (pageWrap.getModel().getPushId() != null) {
-            queryWrapper.lambda().eq(WarningPush::getPushId, pageWrap.getModel().getPushId());
+            queryWrapper.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()));
+            queryWrapper.ge(WarningPush::getPushDate, Utils.Date.getStart(pageWrap.getModel().getPushDate()));
+            queryWrapper.le(WarningPush::getPushDate, Utils.Date.getEnd(pageWrap.getModel().getPushDate()));
         }
         if (pageWrap.getModel().getPushType() != null) {
-            queryWrapper.lambda().eq(WarningPush::getPushType, pageWrap.getModel().getPushType());
+            queryWrapper.eq(WarningPush::getPushType, pageWrap.getModel().getPushType());
         }
         for(PageWrap.SortData sortData: pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
@@ -150,7 +170,10 @@
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
         }
-        return PageData.from(warningPushMapper.selectPage(page, queryWrapper));
+
+        queryWrapper.orderByDesc(WarningPush::getCreateDate);
+        IPage<WarningPush> result = warningPushMapper.selectJoinPage(page, WarningPush.class,queryWrapper);
+        return PageData.from(result);
     }
 
     @Override
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
index d84e165..bfa22f9 100644
--- 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
@@ -1,5 +1,11 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.PlatformGroup;
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.core.utils.Utils;
@@ -14,6 +20,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -29,31 +36,62 @@
 
     @Override
     public Integer create(Warning warning) {
+        if(warningMapper.selectCount(new QueryWrapper<Warning>().lambda()
+                .eq(Warning::getIsdeleted,Constants.ZERO)
+                .eq(Warning::getName,warning.getName()) )>0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝浜嬩欢绫诲瀷宸插瓨鍦紝璇疯繑鍥炲埛鏂伴〉闈㈡煡鐪嬶紒");
+        }
+        warning.setStatus(Constants.formatIntegerNum(warning.getStatus()));
+        warning.setIsdeleted(Constants.ZERO);
+        warning.setCreator(warning.getLoginUserInfo().getId());
+        warning.setCreateDate(new Date());
+        warning.setSubscribeStatus(Constants.ZERO);
+        warning.setEditDate(warning.getCreateDate());
+        warning.setEditor(warning.getCreator());
         warningMapper.insert(warning);
+
         return warning.getId();
     }
 
     @Override
-    public void deleteById(Integer id) {
-        warningMapper.deleteById(id);
+    public void deleteById(Integer id, LoginUserInfo user) {
+        warningMapper.update(null,new UpdateWrapper<Warning>().lambda()
+                .set(Warning::getIsdeleted,Constants.ONE)
+                .set(Warning::getEditor,user.getId())
+                .set(Warning::getEditDate,new Date())
+                .eq(Warning::getId,id)
+        );
     }
 
     @Override
-    public void delete(Warning warning) {
+    public void delete(Warning warning ) {
         UpdateWrapper<Warning> deleteWrapper = new UpdateWrapper<>(warning);
         warningMapper.delete(deleteWrapper);
     }
 
     @Override
-    public void deleteByIdInBatch(List<Integer> ids) {
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
         if (CollectionUtils.isEmpty(ids)) {
             return;
         }
-        warningMapper.deleteBatchIds(ids);
+        warningMapper.update(null,new UpdateWrapper<Warning>().lambda()
+                .set(Warning::getEditor,user.getId())
+                .set(Warning::getEditDate,new Date())
+                .set(Warning::getIsdeleted,Constants.ONE)
+                .in(Warning::getId,ids)
+        );
     }
 
     @Override
     public void updateById(Warning warning) {
+        if(warningMapper.selectCount(new QueryWrapper<Warning>().lambda()
+                .ne(Warning::getId,warning.getId())
+                .eq(Warning::getIsdeleted,Constants.ZERO)
+                .eq(Warning::getName,warning.getName()) )>0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝浜嬩欢绫诲瀷宸插瓨鍦紝璇疯繑鍥炲埛鏂伴〉闈㈡煡鐪嬶紒");
+        }
+        warning.setEditDate(warning.getCreateDate());
+        warning.setEditor(warning.getCreator());
         warningMapper.updateById(warning);
     }
 
@@ -89,6 +127,7 @@
         IPage<Warning> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         QueryWrapper<Warning> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
         if (pageWrap.getModel().getId() != null) {
             queryWrapper.lambda().eq(Warning::getId, pageWrap.getModel().getId());
         }
@@ -110,7 +149,7 @@
             queryWrapper.lambda().eq(Warning::getIsdeleted, pageWrap.getModel().getIsdeleted());
         }
         if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().eq(Warning::getName, pageWrap.getModel().getName());
+            queryWrapper.lambda().like(Warning::getName, pageWrap.getModel().getName());
         }
         if (pageWrap.getModel().getInfo() != null) {
             queryWrapper.lambda().eq(Warning::getInfo, pageWrap.getModel().getInfo());
@@ -149,13 +188,8 @@
         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());
-            }
-        }
+        queryWrapper.lambda().orderByDesc(Warning::getSortnum);
+
         return PageData.from(warningMapper.selectPage(page, queryWrapper));
     }
 
@@ -164,4 +198,18 @@
         QueryWrapper<Warning> wrapper = new QueryWrapper<>(warning);
         return warningMapper.selectCount(wrapper);
     }
+    @Override
+    public  void updateStatus(Warning param) {
+        Warning model = warningMapper.selectById(param.getId());
+        if (model==null || Constants.equalsInteger(model.getIsdeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(Constants.equalsInteger(model.getStatus(),param.getStatus())){
+            return;
+        }
+        model.setStatus(param.getStatus());
+        model.setEditDate(new Date());
+        model.setEditor(param.getLoginUserInfo().getId());
+        warningMapper.updateById(model);
+    }
 }

--
Gitblit v1.9.3