From c9ad1f34a86e54b1c690c623ba661cd4131a3d71 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期四, 28 十一月 2024 18:43:32 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/funingyunwei

---
 admin/src/api/Inspection/ywPatrolScheme.js                                                                     |    8 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java                |   18 
 admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue                                            |  196 +
 h5/index.html                                                                                                  |   20 
 h5/static/side/phoneed.png                                                                                     |    0 
 h5/pages/operation/device.vue                                                                                  |  376 ++
 h5/static/side/ic_saoma@2x.png                                                                                 |    0 
 admin/src/api/Inspection/deviceRecord.js                                                                       |   44 
 h5/utils/qrcode.js                                                                                             | 1201 +++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InitServiceImpl.java              |    2 
 h5/pages/login.vue                                                                                             |  225 +
 admin/src/api/business/ywAccount.js                                                                            |   64 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java     |   38 
 h5/pages/polling/point.vue                                                                                     |  378 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java                  |    5 
 server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java                                     |   21 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java            |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java                  |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java                      |   33 
 h5/pages.json                                                                                                  |   87 
 admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue                                             |   54 
 h5/static/checked.png                                                                                          |    0 
 h5/utils/http.api.js                                                                                           |   36 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java            |    1 
 h5/uni.promisify.adaptor.js                                                                                    |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/AreasMapper.java                           |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java        |  457 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java         |  115 
 admin/src/views/project/components/OperaYwProjectWindow.vue                                                    |   73 
 h5/pages/workOrder/list.vue                                                                                    |  188 +
 admin/src/views/business/internalCompany.vue                                                                   |   14 
 server/system_service/src/main/java/com/doumee/dao/system/MultifileMapper.java                                 |    3 
 h5/static/home/ic_fangkeba.png                                                                                 |    0 
 h5/pages/operation/record.vue                                                                                  |  134 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java      |    9 
 h5/static/login_ic_phone@2x.png                                                                                |    0 
 admin/src/views/finance/components/companyEdit.vue                                                             |   10 
 admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue                                              |   23 
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                       |   48 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java             |  460 +++
 h5/pages/workOrder/edit.vue                                                                                    |  258 +
 h5/static/home/ic_fangkebaobei@2x.png                                                                          |    0 
 h5/static/side/ic_dabiao.png                                                                                   |    0 
 h5/static/side/ic_shuiyu@2x.png                                                                                |    0 
 h5/.gitignore                                                                                                  |   29 
 h5/static/side/xunjian.png                                                                                     |    0 
 admin/src/views/project/projectList.vue                                                                        |   14 
 h5/static/home/ic_renwuzhongxin@2x.png                                                                         |    0 
 h5/store/index.js                                                                                              |  105 
 admin/src/views/finance/account.vue                                                                            |   58 
 h5/pages/workOrder/detail.vue                                                                                  |  480 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/AreasService.java                      |  124 
 admin/src/views/business/areas.vue                                                                             |  166 +
 h5/static/side/workordered.png                                                                                 |    0 
 h5/static/logo.png                                                                                             |    0 
 admin/src/components/business/OperaInternalCompanyWindow.vue                                                   |    4 
 h5/static/home/ic_fangkebaobe@2x.png                                                                           |    0 
 server/system_timer/src/main/resources/bootstrap.yml                                                           |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Areas.java                           |  109 
 h5/utils/meetingHttp.js                                                                                        |   69 
 admin/src/views/operation/components/maintainDetail.vue                                                        |  104 
 h5/utils/utils.js                                                                                              |  163 +
 admin/src/api/Inspection/ywPatrolLine.js                                                                       |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java    |   91 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java             |    3 
 admin/src/views/client/components/staffEdit.vue                                                                |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java          |   47 
 h5/pages/polling/detail.vue                                                                                    |  204 +
 h5/main.js                                                                                                     |   36 
 admin/src/views/Inspection/task.vue                                                                            |   20 
 admin/package-lock.json                                                                                        |    2 
 h5/pages/index.vue                                                                                             |  135 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java    |   30 
 admin/src/views/workorder/components/detail.vue                                                                |  152 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java                   |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java                   |    8 
 h5/static/radioed.png                                                                                          |    0 
 admin/src/views/operation/components/maintain.vue                                                              |   55 
 admin/src/api/business/areas.js                                                                                |   43 
 admin/src/api/system/common.js                                                                                 |    4 
 h5/static/check.png                                                                                            |    0 
 admin/src/api/Inspection/ywPatrolTask.js                                                                       |    3 
 h5/api/staff.js                                                                                                |  232 +
 h5/.hbuilderx/launch.json                                                                                      |    9 
 admin/src/views/operation/components/deviceEdit.vue                                                            |   65 
 admin/src/views/operation/device.vue                                                                           |   14 
 h5/static/side/xunjianed.png                                                                                   |    0 
 h5/manifest.json                                                                                               |  153 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java                 |    8 
 h5/uni.scss                                                                                                    |   77 
 admin/src/api/business/member.js                                                                               |    4 
 h5/static/home/home_bg.jpg                                                                                     |    0 
 h5/utils/config.js                                                                                             |   22 
 admin/src/api/project/ywProject.js                                                                             |    4 
 admin/src/components/business/OperaAreasWindow.vue                                                             |   94 
 h5/utils/service.js                                                                                            |   65 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java                      |   35 
 server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java                                        |    2 
 server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java                                 |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java |    5 
 admin/src/views/Inspection/plan.vue                                                                            |   83 
 h5/utils/http.interceptor.js                                                                                   |   40 
 server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java                                  |   69 
 admin/src/views/finance/company.vue                                                                            |   28 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java                 |   11 
 h5/static/side/ic_dabiaoed.png                                                                                 |    0 
 admin/src/api/business/company.js                                                                              |   10 
 h5/utils/login.js                                                                                              |   60 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java                       |   15 
 h5/pages/operation/detail.vue                                                                                  |   92 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java                     |    4 
 h5/pages/polling/task.vue                                                                                      |  213 +
 admin/src/views/client/staffList.vue                                                                           |   16 
 server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java                                 |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java      |    1 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/AreasCloudController.java                     |  115 
 h5/static/side/workorder.png                                                                                   |    0 
 admin/src/views/Inspection/components/taskDetail.vue                                                           |   41 
 h5/static/home/ic_search@2x.png                                                                                |    0 
 h5/static/home/ic_wodehuiyi@2x.png                                                                             |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java    |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java                        |   18 
 admin/src/views/finance/components/accountEdit.vue                                                             |   65 
 h5/api/index.js                                                                                                |   29 
 admin/src/components/common/QueryForm/queryForm.vue                                                            |    4 
 admin/src/views/operation/record.vue                                                                           |   33 
 h5/static/login_ic_password@2x.png                                                                             |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java                  |    4 
 admin/src/api/Inspection/device.js                                                                             |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AreasDto.java                          |   23 
 h5/static/side/scan.png                                                                                        |    0 
 h5/App.vue                                                                                                     |  260 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java           |   16 
 admin/src/views/Inspection/path.vue                                                                            |    1 
 admin/src/views/business/internalMember.vue                                                                    |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectTree.java                        |   93 
 136 files changed, 8,524 insertions(+), 551 deletions(-)

diff --git a/admin/package-lock.json b/admin/package-lock.json
index 8cadb74..4adea74 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -6,7 +6,7 @@
   "dependencies": {
     "@amap/amap-jsapi-loader": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
+      "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
       "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw=="
     },
     "@babel/code-frame": {
diff --git a/admin/src/api/Inspection/device.js b/admin/src/api/Inspection/device.js
index 5098bb4..ec4923a 100644
--- a/admin/src/api/Inspection/device.js
+++ b/admin/src/api/Inspection/device.js
@@ -25,6 +25,10 @@
   return request.post('/visitsAdmin/cloudService/business/ywDevice/updateById', data)
 }
 
+// 璇︽儏
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywDevice/${id}`)
+}
 // 鍒犻櫎
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/ywDevice/delete/${id}`)
diff --git a/admin/src/api/Inspection/deviceRecord.js b/admin/src/api/Inspection/deviceRecord.js
new file mode 100644
index 0000000..741f588
--- /dev/null
+++ b/admin/src/api/Inspection/deviceRecord.js
@@ -0,0 +1,44 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDeviceRecord/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDeviceRecord/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDeviceRecord/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDeviceRecord/updateById', data)
+}
+
+// 璇︽儏
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywDeviceRecord/${id}`)
+}
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywDeviceRecord/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/ywDeviceRecord/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/Inspection/ywPatrolLine.js b/admin/src/api/Inspection/ywPatrolLine.js
index 88ee422..b4ebbd5 100644
--- a/admin/src/api/Inspection/ywPatrolLine.js
+++ b/admin/src/api/Inspection/ywPatrolLine.js
@@ -24,7 +24,10 @@
 export function updateById (data) {
   return request.post('/visitsAdmin/cloudService/business/ywPatrolLine/updateById', data)
 }
-
+// 璇︽儏
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywPatrolLine/${id}`)
+}
 // 鍒犻櫎
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/ywPatrolLine/delete/${id}`)
diff --git a/admin/src/api/Inspection/ywPatrolScheme.js b/admin/src/api/Inspection/ywPatrolScheme.js
index e644a9b..4b67ede 100644
--- a/admin/src/api/Inspection/ywPatrolScheme.js
+++ b/admin/src/api/Inspection/ywPatrolScheme.js
@@ -24,11 +24,19 @@
 export function updateById (data) {
   return request.post('/visitsAdmin/cloudService/business/ywPatrolScheme/updateById', data)
 }
+// 淇敼
+export function updateStatusById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywPatrolScheme/updateStatus', data)
+}
 
 // 鍒犻櫎
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/ywPatrolScheme/delete/${id}`)
 }
+// 鍒犻櫎
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywPatrolScheme/${id}`)
+}
 
 // 鎵归噺鍒犻櫎
 export function deleteByIdInBatch (ids) {
diff --git a/admin/src/api/Inspection/ywPatrolTask.js b/admin/src/api/Inspection/ywPatrolTask.js
index d247bf3..81be50a 100644
--- a/admin/src/api/Inspection/ywPatrolTask.js
+++ b/admin/src/api/Inspection/ywPatrolTask.js
@@ -29,6 +29,9 @@
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/ywPatrolTask/delete/${id}`)
 }
+export function getDetail (data) {
+  return request.post(`/visitsAdmin/cloudService/business/ywPatrolTaskRecord/page`, data)
+}
 
 // 鎵归噺鍒犻櫎
 export function deleteByIdInBatch (ids) {
diff --git a/admin/src/api/business/areas.js b/admin/src/api/business/areas.js
new file mode 100644
index 0000000..803018f
--- /dev/null
+++ b/admin/src/api/business/areas.js
@@ -0,0 +1,43 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  // return request.post('/visitsAdmin/cloudService/business/areas/treeList', data, {
+  //   trim: true
+  // })
+  return request.post('/visitsAdmin/cloudService/business/areas/page', data, {
+    trim: true
+  })
+}
+export function listByParentId (data) {
+  return request.post('/visitsAdmin/cloudService/business/areas/listByParentId', data)
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/areas/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/areas/updateById', data)
+}
+
+// 鏍戝舰
+export function treeList (data) {
+  return request.post('/visitsAdmin/cloudService/business/areas/listByParentId', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/areas/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/areas/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/company.js b/admin/src/api/business/company.js
index da1ff1a..28b67ec 100644
--- a/admin/src/api/business/company.js
+++ b/admin/src/api/business/company.js
@@ -24,6 +24,13 @@
 export function create (data) {
   return request.post('/visitsAdmin/cloudService/business/company/create', data)
 }
+// 鍒涘缓璐㈠姟鍏徃
+export function createFinanceCompany (data) {
+  return request.post('/visitsAdmin/cloudService/business/company/createFinanceCompany', data)
+}
+export function updateFinanceCompany (data) {
+  return request.post('/visitsAdmin/cloudService/business/company/updateFinanceCompany', data)
+}
 
 // 淇敼
 export function updateById (data) {
@@ -50,6 +57,9 @@
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/company/delete/${id}`)
 }
+export function updateStatusById (data) {
+  return request.post('/visitsAdmin/cloudService/business/company/updateStatusById', data)
+}
 
 // 鏍规嵁绫诲瀷鏌ヨ缁勭粐淇℃伅
 export function findCompanyTreePage (type) {
diff --git a/admin/src/api/business/member.js b/admin/src/api/business/member.js
index b83f2b1..1410cc2 100644
--- a/admin/src/api/business/member.js
+++ b/admin/src/api/business/member.js
@@ -46,6 +46,10 @@
 export function updateById (data) {
   return request.post('/visitsAdmin/cloudService/business/member/updateById', data)
 }
+export function updateStatusById (data) {
+  return request.post('/visitsAdmin/cloudService/business/member/updateStatusById', data)
+}
+
 export function updateHead (data) {
   return request.post('/visitsAdmin/cloudService/business/member/updateHead', data)
 }
diff --git a/admin/src/api/business/ywAccount.js b/admin/src/api/business/ywAccount.js
new file mode 100644
index 0000000..904ec72
--- /dev/null
+++ b/admin/src/api/business/ywAccount.js
@@ -0,0 +1,64 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/page', data)
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/create', data)
+}
+// 鍒涘缓璐㈠姟鍏徃
+export function createFinanceywAccount (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/createFinanceywAccount', data)
+}
+export function updateFinanceywAccount (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/updateFinanceywAccount', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/updateById', data)
+}
+export function sort (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/updateSort', data)
+}
+
+// 閮ㄩ棬淇℃伅鍚屾
+export function ywAccountSync (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/syncAll', data)
+}
+// 鍒嗛〉鏌ヨ
+export function ywAccountGetList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/page', data)
+}
+// 鏌ヨ鎵�鏈夐儴闂�
+export function ywAccountGetListPost (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/list', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywAccount/delete/${id}`)
+}
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywAccount/${id}`)
+}
+export function updateStatusById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/updateStatusById', data)
+}
+
+// 鏍规嵁绫诲瀷鏌ヨ缁勭粐淇℃伅
+export function findywAccountTreePage (type) {
+  return request.get(`/visitsAdmin/cloudService/business/ywAccount/findywAccountTreePage?type=${type}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/ywAccount/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/project/ywProject.js b/admin/src/api/project/ywProject.js
index 4338e93..eb71bfc 100644
--- a/admin/src/api/project/ywProject.js
+++ b/admin/src/api/project/ywProject.js
@@ -40,6 +40,10 @@
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/ywProject/delete/${id}`)
 }
+// 鍒犻櫎
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywProject/${id}`)
+}
 
 // 鎵归噺鍒犻櫎
 export function deleteByIdInBatch (ids) {
diff --git a/admin/src/api/system/common.js b/admin/src/api/system/common.js
index 0c4b120..0e99bcf 100644
--- a/admin/src/api/system/common.js
+++ b/admin/src/api/system/common.js
@@ -71,3 +71,7 @@
 export function upload (data) {
   return request.post('/visitsAdmin/cloudService/public/upload', data)
 }
+// 鑾峰彇鐪佸競鍖烘爲
+export function getCityTree (data) {
+  return request.post('/visitsAdmin/cloudService/business/areas/treeList', data)
+}
diff --git a/admin/src/components/business/OperaAreasWindow.vue b/admin/src/components/business/OperaAreasWindow.vue
new file mode 100644
index 0000000..fea3c84
--- /dev/null
+++ b/admin/src/components/business/OperaAreasWindow.vue
@@ -0,0 +1,94 @@
+<template>
+  <GlobalAlertWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" label-width="100px" label-suffix="锛�" :rules="rules">
+      <el-form-item :label="form.type==0?'甯傚悕绉�':'鍘垮尯鍚嶇О'" prop="name">
+        <el-input v-model="form.name" :placeholder="form.type==0?'杈撳叆甯傚悕绉�':'杈撳叆鍘垮尯鍚嶇О'" 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>
+  </GlobalAlertWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
+export default {
+  name: 'OperaAreasWindow',
+  extends: BaseOpera,
+  components: { GlobalAlertWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        parentId: null,
+        name: null,
+        sortnum: '0',
+        type: '',
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/areas',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    // 纭鏂板缓
+    __confirmCreate () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        // 璋冪敤鏂板缓鎺ュ彛
+        this.isWorking = true
+        this.api.create(this.form)
+          .then(() => {
+            this.visible = false
+            this.$message.success('鏂板缓鎴愬姛')
+            this.$emit('success', this.form.parentId)
+          })
+          .catch(e => {
+            this.$message.error(e)
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      })
+    },
+    // 纭淇敼
+    __confirmEdit () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        // 璋冪敤鏂板缓鎺ュ彛
+        this.isWorking = true
+        this.api.updateById(this.form)
+          .then(() => {
+            this.visible = false
+            this.$message.success('淇敼鎴愬姛')
+            this.$emit('success', this.form.parentId)
+          })
+          .catch(e => {
+            this.$message.error(e)
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      })
+    }
+  },
+}
+</script>
diff --git a/admin/src/components/business/OperaInternalCompanyWindow.vue b/admin/src/components/business/OperaInternalCompanyWindow.vue
index ad001b2..9198f65 100644
--- a/admin/src/components/business/OperaInternalCompanyWindow.vue
+++ b/admin/src/components/business/OperaInternalCompanyWindow.vue
@@ -17,7 +17,7 @@
             </el-form-item>
           <el-form-item label="缁勭粐绫诲瀷" prop="type">
             <el-radio-group v-model="form.type" :disabled="form.parentType == 0">
-              <el-radio :label="0">鐩稿叧鏂圭粍缁�</el-radio>
+<!--              <el-radio :label="0">鐩稿叧鏂圭粍缁�</el-radio>-->
               <el-radio :label="1">鍐呴儴缁勭粐</el-radio>
             </el-radio-group>
           </el-form-item>
@@ -74,7 +74,7 @@
       console.log(target)
       this.form= {
         id: null,
-        type: 0,
+        type: 1,
         name: '',
         parentId: null,
         disable: false,
diff --git a/admin/src/components/common/QueryForm/queryForm.vue b/admin/src/components/common/QueryForm/queryForm.vue
index 80e9fc1..a59f002 100644
--- a/admin/src/components/common/QueryForm/queryForm.vue
+++ b/admin/src/components/common/QueryForm/queryForm.vue
@@ -58,8 +58,8 @@
       </template>
       <!-- 鎿嶄綔 -->
       <el-form-item>
-        <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
-        <el-button v-if="showQk" @click="clear">閲嶇疆</el-button>
+        <el-button style="width: 56px" type="primary" @click="handleQuery">鎼滅储</el-button>
+        <el-button style="width: 56px" v-if="showQk" @click="clear">閲嶇疆</el-button>
         <slot name="btns" />
         <template v-if="queryFormConfig.formItems.length > listLength">
           <el-button v-if="!showZk" type="text" @click="zkBtn">灞曞紑<i
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
index d936c67..86de3cb 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
@@ -48,7 +48,7 @@
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
 import { getFetchList } from '@/api/Inspection/ywPatrolPoint'
-import { create } from '@/api/Inspection/ywPatrolLine'
+import { create,detailById } from '@/api/Inspection/ywPatrolLine'
 import { Message } from 'element-ui'
 export default {
   name: 'OperaYwPatrolLineWindow',
@@ -82,13 +82,21 @@
       if (list.length == 0) return Message.warning('璇峰厛閫夋嫨宸℃鐐�')
       form.linePointList = list
       create({ ...form }).then(res => {
-        if (res.code == 200) {
-          Message.success('淇濆瓨鎴愬姛')
-          this.close()
-        }
+        Message.success('淇濆瓨鎴愬姛')
+        this.$emit('success')
+        this.close()
+        
+      })
+    },
+    getDetail(row) {
+      detailById(row.id).then(res => {
+        this.form = res
+        this.list = res.linePointList || []
       })
     },
     initData() {
+      this.list = []
+
       getFetchList({}).then(res => {
         this.pointList = res || []
       })
@@ -130,13 +138,12 @@
           needScancode: '1',
           pointName: i.name,
           pointId: i.id,
-          code: i.code,
-          id: i.id
+          code: i.code
         })
       })
       this.isShowModal = false
     },
-    close(){
+    close() {
       this.visible = false
       this.$emit('success')
     }
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
index 00acdd2..ca12d05 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
@@ -30,7 +30,7 @@
         <el-input type="textarea" :rows="4" v-model="form.content" placeholder="璇疯緭鍏�" />
       </el-form-item>
       <el-form-item label="涓婁紶鍥剧墖" prop="imgurl">
-        <UploadAvatarImage :file="{ 'imgurlfull': form.imgurlfull, 'imgurl': form.imgurl }"
+        <UploadAvatarImage :file="{ 'imgurlfull': form.fileFullUrl, 'imgurl': form.fileurl }"
           :uploadData="{ folder: 'ywPatrol/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
           @uploadBegin="isUploading = true" />
       </el-form-item>
@@ -45,6 +45,7 @@
 import mapDrag from '@/components/common/map/mapDrag.vue'
 import { fetchList } from '@/api/business/category'
 import { detail } from '@/api/Inspection/ywPatrolPoint'
+import { fetchList as getDeiceList } from '@/api/Inspection/device'
 export default {
   name: 'OperaYwPatrolPointWindow',
   extends: BaseOpera,
@@ -81,50 +82,57 @@
     open(title, row) {
       this.title = title
       this.visible = true
+      this.initData()
       if (row && row.id) {
         this.getDetail(row)
       }
     },
     getDetail(row) {
       detail(row.id).then(res => {
-        this.form = { ...res } 
+        this.form = { ...res }
         // this.$set(this.form, 'areaId', res.areaId)
         // console.log('res', res)
         // console.log('res', this.form)
-        this.initData(res.areaId)
+
       })
     },
-    initData(areaId) {
+    initData() {
       fetchList({
         model: { type: 4 },
         capacity: 1000,
         page: 1,
       }).then(res => {
         this.cateList = res.records || []
-        console.log('this.form.areaId', this.form)
-
-        if (areaId) {
-          this.cateList.forEach(item => {
-            if (item.childCategoryList) {
-              item.childCategoryList.forEach(item2 => {
-                if (item2.id == areaId) {
-                  this.$set(this.form, 'areaIds', [item.id, item2.id])
-                  console.log('areaIds', this.form)
-
-                }
-              })
-            }
-          })
-        }
+        setTimeout(() => {
+          const areaId = this.form.areaId
+          if (areaId) {
+            this.cateList.forEach(item => {
+              if (item.childCategoryList) {
+                item.childCategoryList.forEach(item2 => {
+                  if (item2.id == areaId) {
+                    this.$set(this.form, 'areaIds', [item.id, item2.id])
+                  }
+                })
+              }
+            })
+          }
+        }, 1300)
+      })
+      getDeiceList({
+        model: {},
+        capacity: 1000,
+        page: 1,
+      }).then(res => {
+        this.deviceList = res.records
       })
 
     },
     getCenter(data) {
       // console.log(data)
       // this.$set(this.form, 'postion', data.address)
-      if(data.lng){
+      if (data.lng) {
         this.$set(this.form, 'lnglat', data.lng + ',' + data.lat)
-      }else{
+      } else {
         this.$set(this.form, 'lnglat', '')
       }
       this.$set(this.form, 'longitude', data.lng)
@@ -138,8 +146,8 @@
       }
     },
     uploadAvatarSuccess(file) {
-      this.form.imgurl = file.imgurl
-      this.form.imgurlfull = file.imgurlfull
+      this.form.fileurl = file.imgurl
+      this.form.fileFullUrl = file.imgurlfull
     },
   }
 }
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
index 0f933b6..0e58415 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
@@ -1,38 +1,52 @@
 <template>
-  <GlobalWindow width="520px" :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+  <GlobalWindow width="520px" :title="title" @close="close" :visible.sync="visible" :confirm-working="isWorking"
+    @confirm="confirm">
+    <div class="warnning">
+      {{ form.id ? '缂栬緫璁″垝瀵瑰凡鐢熸垚鐨勪换鍔℃棤鏁堬紝浼氬湪涓嬫鐢熸垚浠诲姟鏃剁敓鏁堬紝涓斿綋澶╀笉浼氱敓鎴愪袱涓换鍔�' : '鏂板缓宸℃璁″垝浼氫粠褰撳ぉ寮�濮嬶紝鎸夌収閰嶇疆瑙勫垯浜х敓瀵瑰簲鐨勫贰妫�浠诲姟' }}
+    </div>
     <el-form :model="form" ref="form" :rules="rules">
       <el-form-item label="璁″垝鍚嶇О" prop="title">
         <el-input v-model="form.title" placeholder="璇疯緭鍏ユ爣棰�" v-trim />
       </el-form-item>
-      <el-form-item label="宸℃绾胯矾">
-        <el-select v-model="form.status" filterable clearable>
-          <el-option value="0" label="姣忓ぉ"></el-option>
-          <el-option value="1" label="姣忓懆"></el-option>
-          <el-option value="2" label="姣忔湀"></el-option>
+      <el-form-item label="宸℃绾胯矾" prop="lineId">
+        <el-select v-model="form.lineId" filterable clearable>
+          <el-option v-for="item in lineList" :value="item.id" :label="item.name"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="宸℃璐熻矗浜�">
+      <el-form-item label="宸℃璐熻矗浜�" prop="userIds">
         <el-select v-model="form.userIds" filterable clearable>
-          <el-option value="0" label="姣忓ぉ"></el-option>
-          <el-option value="1" label="姣忓懆"></el-option>
-          <el-option value="2" label="姣忔湀"></el-option>
+          <el-option v-for="item in staffList" :value="item.id" :label="item.realname"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="璁″垝寮�濮嬫棩鏈�-缁撴潫鏃ユ湡">
-        <el-date-picker v-model="form.selDate" is-range range-separator="-" value-format="yyyy-MM-dd" type="daterange"
-          start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" class="w400" />
+      <el-form-item label="璁″垝寮�濮嬫棩鏈�-缁撴潫鏃ユ湡" prop="selDate">
+        <el-date-picker v-model="form.selDate" @change="changeDate" is-range range-separator="-"
+          value-format="yyyy-MM-dd" type="daterange" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" />
       </el-form-item>
       <el-form-item label="璁″垝鎵ц鏃堕棿">
-        <el-time-picker v-model="form.selTime" is-range range-separator="-" format="HH:mm" value-format="HH:mm:ss"
-          start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" placeholder="閫夋嫨鏃堕棿鑼冨洿" class="w400" />
+        <el-time-picker v-model="form.selTime" @change="changeTime" is-range range-separator="-" format="HH:mm"
+          value-format="HH:mm:ss" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" placeholder="閫夋嫨鏃堕棿鑼冨洿" />
       </el-form-item>
-      <el-form-item label="寰幆鍛ㄦ湡">
-        <el-select v-model="form.circleType" filterable clearable>
-          <el-option value="0" label="姣忓ぉ"></el-option>
-          <el-option value="1" label="姣忓懆"></el-option>
-          <el-option value="2" label="姣忔湀"></el-option>
+      <el-form-item label="閲嶅棰戠巼">
+        <el-select v-model="form.circleType" @change="changeType" filterable>
+          <el-option :value="0" label="姣忓ぉ"></el-option>
+          <el-option :value="1" label="姣忓懆"></el-option>
+          <el-option :value="2" label="姣忔湀"></el-option>
         </el-select>
       </el-form-item>
+      <el-form-item v-if="form.circleType == 1" prop="circleDays" label="閲嶅瑙勫垯">
+        <div class="weeks">
+          <div class="week" @click="weekClick(i)" :class="{ active: item.sel }" v-for="item, i in weeks">{{ item.la }}
+          </div>
+        </div>
+      </el-form-item>
+      <el-form-item v-if="form.circleType == 2" prop="circleDays" label="閲嶅瑙勫垯">
+        <div class="weeks">
+          <div class="week" @click="monthClick(i)" :class="{ active: item.sel }" v-for="item, i in monthsList">{{
+            item.la
+            }}</div>
+        </div>
+      </el-form-item>
+
     </el-form>
   </GlobalWindow>
 </template>
@@ -40,6 +54,9 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import { fetchList as getLineList } from '@/api/Inspection/ywPatrolLine'
+import { detailById } from '@/api/Inspection/ywPatrolScheme'
+import { getUserList } from '@/api/system/user'
 export default {
   name: 'OperaYwPatrolSchemeWindow',
   extends: BaseOpera,
@@ -63,7 +80,7 @@
         dealUserId: '',
         dealDate: '',
         dealInfo: '',
-        circleType: '',
+        circleType: 0,
         circleDays: '',
         startDate: '',
         endDate: '',
@@ -71,10 +88,26 @@
         endTime: '',
         processStatus: '',
         selDate: [],
-        selTime: [],
       },
-      // 楠岃瘉瑙勫垯
+      lineList: [],
+      staffList: [],
+      weeks: [
+        { la: '鍛ㄤ竴', va: 1, sel: false },
+        { la: '鍛ㄤ簩', va: 2, sel: false },
+        { la: '鍛ㄤ笁', va: 3, sel: false },
+        { la: '鍛ㄥ洓', va: 4, sel: false },
+        { la: '鍛ㄤ簲', va: 5, sel: false },
+        { la: '鍛ㄥ叚', va: 6, sel: false },
+        { la: '鍛ㄦ棩', va: 7, sel: false },
+      ],
+      monthsList: [],
+      selCircleDays: [],
       rules: {
+        title: [{ required: true, message: '璇疯緭鍏�' }],
+        lineId: [{ required: true, message: '璇烽�夋嫨' }],
+        userIds: [{ required: true, message: '璇烽�夋嫨' }],
+        selDate: [{ type: 'array', required: true, message: '璇烽�夋嫨' }],
+        circleDays: [{ required: true, message: '璇烽�夋嫨' }],
       }
     }
   },
@@ -85,10 +118,125 @@
     })
   },
   methods: {
+    weekClick(i) {
+      this.weeks.forEach((item, index) => {
+        if (i == index) { item.sel = !item.sel }
+      })
+      this.$set(this.form, 'circleDays', this.weeks.filter(j => j.sel).map(a => a.va).join(','))
+    },
+    monthClick(i) {
+      this.monthsList.forEach((item, index) => {
+        if (i == index) { item.sel = !item.sel }
+      })
+      this.$set(this.form, 'circleDays', this.monthsList.filter(j => j.sel).map(a => a.va).join(','))
+    },
+    changeTime(e) {
+      if (e && e.length > 0) {
+        this.$set(this.form, 'startTime', e[0])
+        this.$set(this.form, 'endTime', e[1])
+      } else {
+        this.$set(this.form, 'startTime', '')
+        this.$set(this.form, 'endTime', '')
+      }
+    },
+    changeDate(e) {
+      if (e && e.length > 0) {
+        this.$set(this.form, 'startDate', e[0])
+        this.$set(this.form, 'endDate', e[1])
+      } else {
+        this.$set(this.form, 'startDate', '')
+        this.$set(this.form, 'endDate', '')
+      }
+    },
+    changeType() {
+      this.$set(this.form, 'circleDays', '')
+    },
+    getDetail(id) {
+      detailById(id).then(res => {
+        this.form = res
+        if (res.userIds) {
+          this.$set(this.form, 'userIds', Number(res.userIds))
+        }
+        if (res.startTime) {
+          this.$set(this.form, 'selTime', [res.startTime, res.endTime])
+        }
+        if (res.circleDays) {
+          const circleDays = res.circleDays.split(',')
+          if (res.circleType == 1) {
+            circleDays.forEach(i => {
+              this.weeks.forEach(j => {
+                if (i == j.va) {
+                  j.sel = true
+                }
+              })
+            })
+          } else {
+            setTimeout(() => {
+              circleDays.forEach(i => {
+                this.monthsList.forEach(j => {
+                  if (i == j.va) {
+                    j.sel = true
+                  }
+                })
+              })
+            }, 500)
+          }
+        }
+        this.$set(this.form, 'selDate', [res.startDate, res.endDate])
+      })
+    },
     initData() {
-
+      getLineList({
+        model: {},
+        capacity: 9999,
+        page: 1,
+      }).then(res => {
+        this.lineList = res.records
+      })
+      getUserList({}).then(res => {
+        this.staffList = res
+      })
+      this.monthsList = []
+      for (let i = 1; i < 32; i++) {
+        this.monthsList.push({ la: i, va: i, sel: false })
+      }
+    },
+    close() {
+      this.$refs.form.resetFields()
+      this.visible = false
     }
   }
 
 }
 </script>
+<style lang="scss" scoped>
+@import '@/assets/style/variables.scss';
+.warnning{
+  padding: 6px 10px;
+  background-color: #fcf3e6;
+  font-size: 12px;
+  color: #333333;
+}
+.weeks {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+
+  .week {
+    border: 1px solid #999999;
+    width: 40px;
+    height: 18px;
+    text-align: center;
+    line-height: 18px;
+    font-size: 12px;
+    margin-right: 8px;
+    cursor: pointer;
+    margin-bottom: 6px;
+  }
+
+  .active {
+    color: $primary-color;
+    border: 1px solid $primary-color;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/Inspection/components/taskDetail.vue b/admin/src/views/Inspection/components/taskDetail.vue
index dfe59dc..79fd9ca 100644
--- a/admin/src/views/Inspection/components/taskDetail.vue
+++ b/admin/src/views/Inspection/components/taskDetail.vue
@@ -2,16 +2,22 @@
   <GlobalWindow title="宸℃浠诲姟璇︽儏" :showConfirm="false" :visible.sync="isShowModal">
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="" label="宸℃鐐瑰悕绉�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="鐘舵��" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="宸℃浜�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="宸℃鏃堕棿" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="宸℃缁撴灉" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="宸℃璇存槑" min-width="100" show-overflow-tooltip>
-        <template v-slot="scope">
-          <span>{{ scope.row.billCode || scope.row.contractNum }}</span>
+      <el-table-column prop="pointName" label="宸℃鐐瑰悕绉�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="鐘舵��" min-width="100" show-overflow-tooltip>
+        <template v-slot="{ row }">
+          <span v-if="row.status == 0">寰呭紑濮�</span>
+          <span v-if="row.status == 1">宸插贰妫�</span>
         </template>
       </el-table-column>
+      <el-table-column prop="editor" label="宸℃浜�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="editDate" label="宸℃鏃堕棿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="宸℃缁撴灉" min-width="100" show-overflow-tooltip>
+        <template v-slot="{ row }">
+          <span class="gray" v-if="row.dealStatus == 0">姝e父</span>
+          <span class="red" v-if="row.dealStatus == 1">寮傚父</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="dealInfo" label="宸℃璇存槑" min-width="100" show-overflow-tooltip />
     </el-table>
     <div class="mt20">
       <Pagination @size-change="handleSizeChange" @current-change="getDetail" :pagination="pagination" />
@@ -23,11 +29,12 @@
 import GlobalWindow from '@/components/common/GlobalWindow'
 import QueryForm from '@/components/common/QueryForm'
 import Pagination from '@/components/common/Pagination'
+import { getDetail } from '@/api/Inspection/ywPatrolTask'
 export default {
   components: { GlobalWindow, QueryForm, Pagination },
   data() {
     return {
-      isShowModal: true,
+      isShowModal: false,
       id: '',
       pagination: {
         pageSize: 10,
@@ -40,16 +47,19 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'name',
+            filed: 'pointName',
             type: 'input',
             label: '宸℃鐐瑰悕绉�'
           },
           {
             filed: 'status',
             type: 'select',
-            label: '鎵ц鐘舵��',
+            label: '鐘舵��',
             placeholder: '鍏ㄩ儴',
-            options: []
+            options: [
+              { label: '寰呭紑濮�', value: 0 },
+              { label: '宸插贰妫�', value: 1 },
+            ]
           },
         ],
         online: true
@@ -60,10 +70,10 @@
     getDetail(page) {
       const { pagination, filters, id } = this
       this.loading = true
-      platformLogPage({
+      getDetail({
         model: {
           ...filters,
-          id,
+          taskId: id,
         },
         sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
@@ -71,6 +81,7 @@
       }).then(res => {
         this.loading = false
         this.list = res.records || []
+        this.pagination.total = res.total
         this.list.forEach(item => {
           item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
           item.taskOrigin = 'WMS鑾峰彇'
@@ -94,5 +105,3 @@
   }
 }
 </script>
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/admin/src/views/Inspection/path.vue b/admin/src/views/Inspection/path.vue
index 4854c6b..03e8b95 100644
--- a/admin/src/views/Inspection/path.vue
+++ b/admin/src/views/Inspection/path.vue
@@ -91,6 +91,7 @@
     editClick(row) {
       if (row && row.id) {
         this.$refs.operaYwPatrolLineWindow.open('缂栬緫宸℃绾胯矾')
+        this.$refs.operaYwPatrolLineWindow.getDetail(row)
       } else {
         this.$refs.operaYwPatrolLineWindow.open('鏂板缓宸℃绾胯矾')
       }
diff --git a/admin/src/views/Inspection/plan.vue b/admin/src/views/Inspection/plan.vue
index 55fa79a..2ae79a1 100644
--- a/admin/src/views/Inspection/plan.vue
+++ b/admin/src/views/Inspection/plan.vue
@@ -2,16 +2,12 @@
   <TableLayout :permissions="['business:ywpatrolscheme:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-
-      <el-form-item label="鏍囬" prop="title">
+      <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="寮�濮嬫棩鏈�" prop="startDate">
-        <el-date-picker v-model="searchForm.startDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ紑濮嬫棩鏈�"
-          @change="search" />
-      </el-form-item>
-      <el-form-item label="缁撴潫鏃ユ湡" prop="endDate">
-        <el-date-picker v-model="searchForm.endDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ョ粨鏉熸棩鏈�" @change="search" />
+      <el-form-item label="璁″垝鏃ユ湡" prop="selDate">
+        <el-date-picker type="daterange" v-model="searchForm.selDate" clearable value-format="yyyy-MM-dd"
+          @change="changeDate" />
       </el-form-item>
 
       <section>
@@ -24,7 +20,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywpatrolscheme:create', 'business:ywpatrolscheme:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwPatrolSchemeWindow.open('鏂板缓宸℃璁″垝')" icon="el-icon-plus"
+        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
             v-permissions="['business:ywpatrolscheme:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
             v-permissions="['business:ywpatrolscheme:delete']">鍒犻櫎</el-button></li>
@@ -34,30 +30,36 @@
 
         <el-table-column prop="title" label="璁″垝鍚嶇О" min-width="100px"></el-table-column>
         <el-table-column prop="lineId" label="璁″垝缂栧彿" min-width="100px"></el-table-column>
-        <el-table-column prop="dealDate" label="璐熻矗浜哄憳" min-width="100px"></el-table-column>
+        <el-table-column prop="userName" label="璐熻矗浜哄憳" min-width="100px"></el-table-column>
 
-        <el-table-column prop="startDate" label="璁″垝鏃ユ湡" min-width="100px">
+        <el-table-column prop="startDate" label="璁″垝鏃ユ湡" min-width="150px">
           <template v-slot="scope">
             <span>{{ scope.row.startDate }} - {{ scope.row.endDate }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="startDate" label="鎵ц鏃堕棿" min-width="100px">
+        <el-table-column prop="startDate" label="鎵ц鏃堕棿" min-width="130px">
           <template v-slot="scope">
             <span>{{ scope.row.startTime }} - {{ scope.row.endTime }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="" label="鍒涘缓浜�" min-width="100px"></el-table-column>
-        <el-table-column prop="" label="鎵ц缁撴灉" min-width="100px"></el-table-column>
+        <el-table-column prop="createUserName" label="鍒涘缓浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="" label="鎵ц缁撴灉" min-width="100px">
+          <template v-slot="scope">
+            <span v-if="scope.row.schemeStatus == 0">寰呭紑濮�</span>
+            <span v-if="scope.row.schemeStatus == 1">杩涜涓�</span>
+            <span v-if="scope.row.schemeStatus == 2">宸茬粨鏉�</span>
+          </template>
+        </el-table-column>
         <el-table-column label="鐘舵��" min-width="100px">
           <template v-slot="scope">
-            <el-switch v-model="scope.row.status" @change="changeStatus" active-value="0" inactive-value="1">
+            <el-switch v-model="scope.row.status" @change="e => changeStatus(scope.row)" :active-value="0" :inactive-value="1">
             </el-switch>
           </template>
         </el-table-column>
         <el-table-column v-if="containPermissions(['business:ywpatrolscheme:update', 'business:ywpatrolscheme:delete'])"
           label="鎿嶄綔" min-width="120" fixed="right">
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaYwPatrolSchemeWindow.open('缂栬緫宸℃璁″垝', row)" icon="el-icon-edit"
+            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
               v-permissions="['business:ywpatrolscheme:update']">缂栬緫</el-button>
             <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
               v-permissions="['business:ywpatrolscheme:delete']">鍒犻櫎</el-button>
@@ -77,6 +79,8 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaYwPatrolSchemeWindow from './components/OperaYwPatrolSchemeWindow'
+import { updateStatusById } from '@/api/Inspection/ywPatrolScheme'
+import { Message } from 'element-ui'
 export default {
   name: 'YwPatrolScheme',
   extends: BaseTable,
@@ -85,28 +89,7 @@
     return {
       // 鎼滅储
       searchForm: {
-        id: '',
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        title: '',
-        remark: '',
-        status: '',
-        sortnum: '',
-        lineId: '',
-        userIds: '',
-        dealUserId: '',
-        dealDate: '',
-        dealInfo: '',
-        circleType: '',
-        circleDays: '',
-        startDate: '',
-        endDate: '',
-        startTime: '',
-        endTime: '',
-        processStatus: ''
+       title: ''
       }
     }
   },
@@ -120,9 +103,33 @@
     this.search()
   },
   methods: {
+    changeStatus(e) {
+      console.log(e);
+      updateStatusById(e).then(res => {
+        this.search()
+        Message.success('鐘舵�佷慨鏀规垚鍔�')
+      }, () => {
+        this.search()
+      })
+    },
+    changeDate(e) {
+      if(e && e.length > 0){
+        this.$set(this.searchForm, 'startDate', e[0])
+        this.$set(this.searchForm, 'endDate', e[1])
+      }else{
+        this.$set(this.searchForm, 'startDate', '')
+        this.$set(this.searchForm, 'endDate', '')
+      }
+      
+    },
+    reset() {
+      this.searchForm = {}
+      this.search()
+    },
     editClick(row) {
       if (row && row.id) {
         this.$refs.operaYwPatrolSchemeWindow.open('缂栬緫宸℃璁″垝')
+        this.$refs.operaYwPatrolSchemeWindow.getDetail(row.id)
       } else {
         this.$refs.operaYwPatrolSchemeWindow.open('鏂板缓宸℃璁″垝')
       }
diff --git a/admin/src/views/Inspection/task.vue b/admin/src/views/Inspection/task.vue
index 99b3ea0..e3a57eb 100644
--- a/admin/src/views/Inspection/task.vue
+++ b/admin/src/views/Inspection/task.vue
@@ -2,11 +2,11 @@
   <TableLayout :permissions="['business:ywpatroltask:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="璁″垝鍚嶇О" prop="title">
-        <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ヨ鍒掑悕绉�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="璁″垝鍚嶇О" prop="planTitle">
+        <el-input v-model="searchForm.planTitle" placeholder="璇疯緭鍏ヨ鍒掑悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item >
-        <el-select v-model="searchForm.status" filterable clearable>
+      <el-form-item label="浠诲姟鐘舵��">
+        <el-select v-model="searchForm.status" label="浠诲姟鐘舵��" filterable clearable>
           <el-option value="0" label="寰呭紑濮�"></el-option>
           <el-option value="1" label="杩涜涓�"></el-option>
           <el-option value="2" label="宸茶秴鏈�"></el-option>
@@ -30,11 +30,11 @@
       >
         <el-table-column type="selection" width="55"></el-table-column>
         <el-table-column prop="planTitle" label="璁″垝鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="schemeId" label="璁″垝缂栧彿" min-width="100px"></el-table-column>
+        <el-table-column prop="planCode" label="璁″垝缂栧彿" min-width="100px"></el-table-column>
         <el-table-column prop="code" label="浠诲姟缂栧彿" min-width="100px"></el-table-column>
-        <el-table-column prop="dealDate" label="浠诲姟鏃堕棿" min-width="100px">
+        <el-table-column prop="dealDate" label="浠诲姟鏃堕棿" min-width="140px">
           <template v-slot="scope">
-            <span>{{ scope.row.startDate }} {{ scope.row.endDate }}</span>
+            <span v-if="scope.row.startDate && scope.row.endDate">{{ scope.row.startDate.slice(0, 16) }} - {{ scope.row.endDate.slice(11, 16) }}</span>
           </template>
         </el-table-column>
         <el-table-column prop="dealDate" label="瀹為檯瀹屾垚鏃堕棿" min-width="100px"></el-table-column>
@@ -55,7 +55,8 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">鍙栨秷</el-button>
+            <el-button type="text" @click="handleDetail(row)">鏌ョ湅璇︽儏</el-button>
+            <el-button type="text" @click="cancelById(row)" v-permissions="['business:ywpatroltask:delete']">鍙栨秷</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -104,6 +105,9 @@
       this.$refs.TaskDetailRef.id = row.id
       this.$refs.TaskDetailRef.getDetail()
     },
+    cancelById() {
+
+    },
   }
 }
 </script>
diff --git a/admin/src/views/business/areas.vue b/admin/src/views/business/areas.vue
new file mode 100644
index 0000000..0908620
--- /dev/null
+++ b/admin/src/views/business/areas.vue
@@ -0,0 +1,166 @@
+<template>
+  <TableLayout :permissions="['business:areas:query']">
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <el-table
+        ref="table"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        lazy
+        :load="load"
+        :tree-props="{ children: 'childList', hasChildren: 'hasChildren' }"
+        row-key="id"
+        stripe
+        border
+        :header-row-class-name="'table-header'"
+        class="doumee-element-table"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column prop="name" label="鍦板尯鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" align="center" min-width="140px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" align="center" min-width="140px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:areas:update', 'business:areas:create', 'business:areas:delete'])"
+          label="鎿嶄綔"
+          align="center"
+          min-width="220"
+          fixed="right"
+        >
+          <template slot-scope="{ row }">
+            <el-button type="text" @click="edit(row)" v-permissions="['business:areas:update']">缂栬緫</el-button>
+            <el-button v-if="row.type!=2" type="text" @click="createChild(row)" v-permissions="['business:areas:create']">鏂板缓{{ row.type==0 ? '甯�' : '鍖哄幙' }}</el-button>
+            <el-button type="text" @click="deleteById(row)" v-permissions="['business:areas:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaAreasWindow ref="operaAreasWindow" @success="update"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaAreasWindow from '@/components/business/OperaAreasWindow'
+import { listByParentId } from '@/api/business/areas'
+export default {
+  name: 'Areas',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaAreasWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        type: 0,
+        parentId: ''
+      },
+      treeMaps: new Map(),
+      parentId: null
+    }
+  },
+  created () {
+    this.config({
+      module: '鐪佸競鍖轰俊鎭〃',
+      api: '/business/areas',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+
+    // 椤电爜鍙樻洿澶勭悊
+    handlePageChange (pageIndex) {
+
+      this.isWorking.search = true
+      listByParentId(this.searchForm)
+        .then(data => {
+          this.tableData.list = this.dataAddBool(data)
+        })
+        .catch(e => {
+          console.log(e)
+          this.$tip.error('鎿嶄綔澶辫触')
+        })
+        .finally(() => {
+          this.isWorking.search = false
+        })
+    },
+    dataAddBool(array) {
+      if(array==null){
+        return  []
+      }
+      array.forEach(item => {
+        item.hasChildren = item.type != 2
+        // item.childList = item.childList && this.dataAddBool(item.childList)
+      })
+      return array
+    },
+    load(tree, treeNode, resolve) {
+      this.treeMaps.set(tree.id, { tree, treeNode, resolve })
+      listByParentId({ parentId: tree.id, type: tree.type + 1 })
+        .then(data => {
+          resolve(this.dataAddBool(data || []))
+        })
+        .catch(e => {
+          console.log(e)
+          this.$tip.error('鎿嶄綔澶辫触')
+        })
+        .finally(() => {
+          this.isWorking.search = false
+        })
+    },
+    refreshLoadTree(parentId) {
+      if (this.treeMaps.get(parentId)) {
+        const { tree, treeNode, resolve } = this.treeMaps.get(parentId)
+        this.$set(this.$refs.table.store.states.lazyTreeNodeMap, parentId, [])
+        if (tree) { // 閲嶆柊鎵ц鐖惰妭鐐瑰姞杞藉瓙绾ф搷浣�
+          this.load(tree, treeNode, resolve)
+          if (tree.parentId) { // 鑻ュ瓨鍦ㄧ埛鐖风粨鐐癸紝鍒欐墽琛岀埛鐖疯妭鐐瑰姞杞藉瓙绾ф搷浣滐紝闃叉鏈�鍚庝竴涓瓙鑺傜偣琚垹闄ゅ悗鐖惰妭鐐逛笉鏄剧ず鍒犻櫎鎸夐挳
+            const a = this.treeMaps.get(tree.parentId)
+            this.load(a.tree, a.treeNode, a.resolve)
+          }
+        }
+      } else {
+        this.handlePageChange()
+      }
+    },
+    deleteById (row, childConfirm = true) {
+      // let message = `纭鍒犻櫎${this.module}銆�${row[this.configData['field.main']]}銆戝悧?`
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      if (childConfirm && row.childList != null && row.childList.length > 0) {
+        // message = `纭鍒犻櫎${this.module}銆�${row[this.configData['field.main']]}銆戝強鍏跺瓙${this.module}鍚�?`
+        message = `纭鍒犻櫎璇ヨ褰曞強鍏跺瓙鏁版嵁鍚�?`
+      }
+      this.$dialog.deleteConfirm(message)
+        .then(() => {
+          this.isWorking.delete = true
+          this.api.deleteById(row[this.configData['field.id']])
+            .then(() => {
+              this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
+              this.refreshLoadTree(row.parentId)
+            })
+            .catch(e => {
+              console.log(e)
+              this.$tip.error('鎿嶄綔澶辫触')
+            })
+            .finally(() => {
+              this.isWorking.delete = false
+            })
+        })
+        .catch(() => {})
+    },
+    edit(row) {
+      // this.parentId = row.type==0 ? null : row.type==1 ? '缂栬緫甯�' : '缂栬緫鍖哄幙'
+      this.$refs.operaAreasWindow.open(row.type==0 ? '缂栬緫鐪�' : row.type==1 ? '缂栬緫甯�' : '缂栬緫鍖哄幙', row)
+    },
+    createChild(row) {
+      this.$refs.operaAreasWindow.open(row.type == 0 ? '鏂板缓甯�' : '鏂板缓鍘垮尯', { parentId: row.id, name: '', type: row.type + 1 })
+    },
+    update(parentId) {
+      this.refreshLoadTree(parentId)
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/internalCompany.vue b/admin/src/views/business/internalCompany.vue
index 60279db..82e522b 100644
--- a/admin/src/views/business/internalCompany.vue
+++ b/admin/src/views/business/internalCompany.vue
@@ -17,8 +17,8 @@
         <!-- 琛ㄦ牸鍜屽垎椤� -->
         <template v-slot:table-wrap>
             <ul class="toolbar" v-permissions="['business:company:create', 'business:company:sync']">
-               <li><el-button type="primary" v-permissions="['business:company:create']" @click="$refs.OperaInternalCompanyWindow.open('鏂板缓浼佷笟',null,null)">鏂板缓</el-button></li>
-              <li><el-button @click="sort('top')" :loading="sorting" icon="el-icon-sort-up" v-permissions="['business:company:sort']">涓婄Щ</el-button></li>
+               <li><el-button type="primary" v-permissions="['business:company:create']" @click="$refs.OperaInternalCompanyWindow.open('鏂板缓缁勭粐',null,null)">鏂板缓</el-button></li>
+              <li><el-button @click="sort('top')" :loaing="sorting" icon="el-icon-sort-up" v-permissions="['business:company:sort']">涓婄Щ</el-button></li>
               <li><el-button @click="sort('bottom')" :loading="sorting" icon="el-icon-sort-down" v-permissions="['business:company:sort']">涓嬬Щ</el-button></li>
               <li><el-button type="primary"  v-permissions="['business:company:sync']" :loading="loading" @click="synchronous()">鍚屾</el-button></li>
             </ul>
@@ -29,8 +29,7 @@
                 :tree-props="{children: 'childList',hasChildren: 'hasChildren'}"
                 row-key="id"
                 @selection-change="handleSelectionChange"
-                default-expand-all
-            >
+                default-expand-all>
                 <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="name" label="缁勭粐绫诲瀷" min-width="80px">
@@ -45,10 +44,9 @@
                 <el-table-column
                     label="鎿嶄綔"
                     width="230"
-                    fixed="right"
-                >
+                    fixed="right">
                     <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('缂栬緫浼佷笟淇℃伅',{  id: row.parentId,name:row.parentName,type:row.parentType, companyPath:row.parentCompanyPath}, row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('缂栬緫缁勭粐淇℃伅',{  id: row.parentId,name:row.parentName,type:row.parentType, companyPath:row.parentCompanyPath}, row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
                         <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('鏂板缓瀛愮骇',  row,null)" icon="el-icon-plus">鏂板缓瀛愮骇</el-button>
                         <el-button type="text" @click="deleteById(row)" style="color: red" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
                     </template>
@@ -83,7 +81,7 @@
   },
   created () {
     this.config({
-      module: '浼佷笟淇℃伅琛�',
+      module: '缁勭粐淇℃伅琛�',
       api: '/business/company',
       'field.id': 'id',
       'field.main': 'id'
diff --git a/admin/src/views/business/internalMember.vue b/admin/src/views/business/internalMember.vue
index 956a89c..98ae806 100644
--- a/admin/src/views/business/internalMember.vue
+++ b/admin/src/views/business/internalMember.vue
@@ -53,7 +53,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:member:delete', 'business:member:create,business:empower:create']">
- 
+
         <li><el-button type="primary"
             @click="$refs.OperaMemberWindow.open('鏂板缓鍛樺伐', null, department, searchForm.companyType)" icon="el-icon-plus"
             v-permissions="['business:member:create']">鏂板缓鍛樺伐</el-button></li>
@@ -118,7 +118,7 @@
             </el-switch>
           </template>
         </el-table-column>
-        <el-table-column label="鏄惁鍙嫓璁�">
+<!--        <el-table-column label="鏄惁鍙嫓璁�">
           <template slot-scope="{row}">
             <el-switch @change="changeCanvisit($event, row)" v-model="row.canVisit" active-color="#13ce66"
               inactive-color="#ff4949" :active-value="1" :inactive-value="0">
@@ -162,7 +162,7 @@
             <el-button @click="$refs.cardOpeningRecord.open('寮�鍗¤褰�', row.id)" type="text">{{ row.memberCardCount ||
               '0'}}</el-button>
           </template>
-        </el-table-column>
+        </el-table-column>-->
         <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
         <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
         <el-table-column
@@ -171,8 +171,8 @@
           <template slot-scope="{row}">
             <el-button type="text" icon="el-icon-edit" @click="$refs.OperaMemberWindow.open('缂栬緫鍛樺伐淇℃伅', row, department)"
               v-permissions="['business:empower:update']">缂栬緫</el-button>
-            <el-button type="text" icon="el-icon-plus" @click="empower(row.id)"
-              v-permissions="['business:empower:create']">閲嶆柊鎺堟潈</el-button>
+<!--            <el-button type="text" icon="el-icon-plus" @click="empower(row.id)"
+              v-permissions="['business:empower:create']">閲嶆柊鎺堟潈</el-button>-->
             <el-button type="text" :loading="heading" style="color: red" icon="el-icon-delete"
               @click="updateHead(row, 0)" v-if="row.headStatus == 1"
               v-permissions="['business:member:head']">鍙栨秷涓荤</el-button>
diff --git a/admin/src/views/client/components/staffEdit.vue b/admin/src/views/client/components/staffEdit.vue
index f74bff5..c85f098 100644
--- a/admin/src/views/client/components/staffEdit.vue
+++ b/admin/src/views/client/components/staffEdit.vue
@@ -1,6 +1,6 @@
 <template>
-  <GlobalWindow :title="title" width="900px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
-    <el-form :model="form" ref="form" :rules="rules">
+  <GlobalWindow :title="title" width="820px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+    <el-form :model="form" ref="form" label-position="top" :rules="rules">
       <div class="list">
         <el-form-item label="瀹㈡埛鍚嶇О" prop="customerId">
           <el-select v-model="form.customerId" clearable filterable>
diff --git a/admin/src/views/client/staffList.vue b/admin/src/views/client/staffList.vue
index 6117255..e3be587 100644
--- a/admin/src/views/client/staffList.vue
+++ b/admin/src/views/client/staffList.vue
@@ -37,8 +37,12 @@
           </template>
         </el-table-column>
         <el-table-column prop="status" label="鐘舵��" min-width="100px">
+
           <template slot-scope="{row}">
-            <span :class="{ red: row.status == 1 }">{{ row.status == '0' ? '姝e父' : '绂佺敤' }}</span>
+            <el-switch v-model="row.status" @change="e => changeStatus(row)" :active-value="0"
+              :inactive-value="1">
+            </el-switch>
+            <!-- <span :class="{ red: row.status == 1 }">{{ row.status == '0' ? '姝e父' : '绂佺敤' }}</span> -->
           </template>
         </el-table-column>
         <el-table-column v-if="containPermissions(['business:ywcustomer:update', 'business:ywcustomer:delete'])"
@@ -65,6 +69,8 @@
 import Pagination from '@/components/common/Pagination'
 import OperaYwCustomerWindow from './components/staffEdit.vue'
 import { fetchList } from '@/api/client/ywCustomer'
+import { updateStatusById } from '@/api/business/member'
+import { Message } from 'element-ui'
 export default {
   name: 'YwCustomer',
   extends: BaseTable,
@@ -90,6 +96,14 @@
     this.initData()
   },
   methods: {
+    changeStatus(e) {
+      updateStatusById(e).then(res => {
+        this.search()
+        Message.success('鐘舵�佷慨鏀规垚鍔�')
+      }, () => {
+        this.search()
+      })
+    },
     initData() {
       fetchList({
         capacity: 9000,
diff --git a/admin/src/views/finance/account.vue b/admin/src/views/finance/account.vue
index 3cb9a42..1d60573 100644
--- a/admin/src/views/finance/account.vue
+++ b/admin/src/views/finance/account.vue
@@ -6,15 +6,20 @@
         v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="code" label="鏀舵敮鏉$洰" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="name" label="鏀舵鍏徃" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="璐︽埛绫诲瀷" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="modelNo" label="璐︽埛鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="realName" label="寮�鎴烽摱琛�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="realName" label="閾惰璐﹀彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="title" label="鏀舵敮鏉$洰" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="companyName" label="鏀舵鍏徃" min-width="100" show-overflow-tooltip />
+      <el-table-column label="璐︽埛绫诲瀷" min-width="100" show-overflow-tooltip>
+        <template v-slot="{row}">
+          <span v-if="row.type == 0">瀵瑰叕</span>
+          <span v-if="row.type == 1">涓汉</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="name" label="璐︽埛鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="bankName" label="寮�鎴烽摱琛�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="bankNo" label="閾惰璐﹀彿" min-width="100" show-overflow-tooltip />
       <el-table-column prop="status" label="鐘舵��" min-width="100" show-overflow-tooltip>
         <template v-slot="scope">
-          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
+          <el-switch v-model="scope.row.status" @change="e =>changeStatus(scope.row)" :active-value="0" :inactive-value="1">
           </el-switch>
         </template>
       </el-table-column>
@@ -22,7 +27,7 @@
         <template slot-scope="{row}">
           <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
             v-permissions="['business:category:update']">缂栬緫</el-button>
-          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+          <el-button type="text" @click="handleDel(row)" icon="el-icon-delete"
             v-permissions="['business:category:delete']">鍒犻櫎</el-button>
         </template>
       </el-table-column>
@@ -38,7 +43,9 @@
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
 import Edit from './components/accountEdit.vue'
-import { companyGetList, deleteById } from '@/api/business/company'
+import { fetchList, updateById, deleteById } from '@/api/business/ywAccount'
+import { companyGetList } from '@/api/business/company'
+import { Message } from 'element-ui'
 export default {
   components: {
     Pagination,
@@ -60,14 +67,17 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'name',
+            filed: 'title',
             type: 'input',
             label: '鏀舵敮鏉$洰'
           },
           {
-            filed: 'name',
+            filed: 'companyId',
             type: 'select',
-            label: '鏀舵鍏徃'
+            label: '鏀舵鍏徃',
+            labelCode: 'name',
+            valueCode: 'id',
+            options: []
           },
         ],
         online: true
@@ -76,15 +86,15 @@
   },
   created() {
     this.getList()
+    this.getCompany()
   },
   methods: {
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      companyGetList({
+      fetchList({
         model: {
           ...filters,
-          type: 2
         },
         capacity: pagination.pageSize,
         page: page || pagination.page,
@@ -99,6 +109,23 @@
         this.loading = false
       })
     },
+    changeStatus(row) {
+      updateById(row).then(res => {
+        this.getList()
+        Message.success('鏇存柊鐘舵�佹垚鍔�')
+      }, () => {
+        this.getList()
+      })
+    },
+    getCompany(){
+      companyGetList({
+        model: {type: 2},
+        capacity: 9999,
+        page: 1
+      }).then(res => {
+       this.queryFormConfig.formItems[1].options = res.records || []
+      })
+    },
     handleEdit(row) {
       this.showEdit = true
       this.$nextTick(() => {
@@ -110,10 +137,9 @@
 
     },
     handleDel(row) {
-      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      let message = `纭鍒犻櫎璇ヨ处鎴峰悧?`
       this.$dialog.deleteConfirm(message)
         .then(() => {
-          this.isWorking.delete = true
           deleteById(row.id)
             .then(() => {
               this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
diff --git a/admin/src/views/finance/company.vue b/admin/src/views/finance/company.vue
index 6397411..36e48b1 100644
--- a/admin/src/views/finance/company.vue
+++ b/admin/src/views/finance/company.vue
@@ -6,14 +6,14 @@
         v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="code" label="鍏徃鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="name" label="鍏徃绠�浠�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="绾崇◣璇嗗埆鍙�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="modelNo" label="鍏徃鍦板潃" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="realName" label="鏀舵敮璐︽埛鏁伴噺" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="鍏徃鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="shortName" label="鍏徃绠�浠�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="code" label="绾崇◣璇嗗埆鍙�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="address" label="鍏徃鍦板潃" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="accountNum" label="鏀舵敮璐︽埛鏁伴噺" min-width="100" show-overflow-tooltip />
       <el-table-column prop="status" label="鐘舵��" min-width="100" show-overflow-tooltip>
         <template v-slot="scope">
-          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
+          <el-switch v-model="scope.row.status" @change="e => changeStatus(scope.row)" :active-value="0" :inactive-value="1">
           </el-switch>
         </template>
       </el-table-column>
@@ -21,7 +21,7 @@
         <template slot-scope="{row}">
           <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
             v-permissions="['business:category:update']">缂栬緫</el-button>
-          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+          <el-button type="text" @click="handleDel(row)" icon="el-icon-delete"
             v-permissions="['business:category:delete']">鍒犻櫎</el-button>
         </template>
       </el-table-column>
@@ -37,7 +37,8 @@
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
 import Edit from './components/companyEdit.vue'
-import { companyGetList, deleteById } from '@/api/business/company'
+import { companyGetList, deleteById, updateStatusById } from '@/api/business/company'
+import { Message } from 'element-ui'
 export default {
   components: {
     Pagination,
@@ -72,6 +73,14 @@
     this.getList()
   },
   methods: {
+    changeStatus(row) {
+      updateStatusById(row).then(res => {
+        this.getList()
+        Message.success('鏇存柊鐘舵�佹垚鍔�')
+      }, () => {
+        this.getList()
+      })
+    },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
@@ -104,10 +113,9 @@
 
     },
     handleDel(row) {
-      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      let message = `纭鍒犻櫎璇ュ叕鍙稿悧?`
       this.$dialog.deleteConfirm(message)
         .then(() => {
-          this.isWorking.delete = true
           deleteById(row.id)
             .then(() => {
               this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
diff --git a/admin/src/views/finance/components/accountEdit.vue b/admin/src/views/finance/components/accountEdit.vue
index 7a7fae4..1fdf30d 100644
--- a/admin/src/views/finance/components/accountEdit.vue
+++ b/admin/src/views/finance/components/accountEdit.vue
@@ -1,32 +1,32 @@
 <template>
-  <GlobalWindow :title="param.id ? '缂栬緫鍏徃' : '鏂板缓鍏徃'" :confirmWorking="subLoading" :visible.sync="isShowModal"
+  <GlobalWindow :title="param.id ? '缂栬緫璐︽埛' : '鏂板缓璐︽埛'" :confirmWorking="subLoading" :visible.sync="isShowModal"
     width="600px" @close="close" @confirm="handleSub">
     <el-form :model="param" ref="paramRef" :rules="rules">
-      <el-form-item label="鏀舵敮鏉$洰" prop="name">
-        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+      <el-form-item label="鏀舵敮鏉$洰" prop="title">
+        <el-input v-model="param.title" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
-      <el-form-item label="鏀舵鍏徃" prop="name">
-        <el-select v-model="param.realName" filterable clearable>
-          <el-option value="0" label="xxx"></el-option>
+      <el-form-item label="鏀舵鍏徃" prop="companyId">
+        <el-select v-model="param.companyId" filterable clearable>
+          <el-option v-for="item in comList" :value="item.id" :label="item.name"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="鏀舵绫诲瀷" prop="name">
-        <el-radio-group v-model="param.radio">
+      <el-form-item label="鏀舵绫诲瀷" prop="type">
+        <el-radio-group v-model="param.type">
           <el-radio :label="0">瀵瑰叕</el-radio>
           <el-radio :label="1">涓汉</el-radio>
         </el-radio-group>
       </el-form-item>
-      <el-form-item label="璐︽埛鍚嶇О" prop="desc">
-        <el-input v-model="param.desc" placeholder="璇疯緭鍏�" v-trim />
+      <el-form-item label="璐︽埛鍚嶇О" prop="name">
+        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
-      <el-form-item label="寮�鎴峰悕绉�">
-        <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
+      <el-form-item label="寮�鎴烽摱琛�" prop="bankName">
+        <el-input v-model="param.bankName" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
-      <el-form-item label="閾惰璐﹀彿">
-        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
+      <el-form-item label="閾惰璐﹀彿" prop="bankNo">
+        <el-input v-model="param.bankNo" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
-      <el-form-item label="鐘舵��" prop="code">
-        <el-switch v-model="param.status" active-value="0" inactive-value="1">
+      <el-form-item label="鐘舵��" prop="status">
+        <el-switch v-model="param.status" :active-value="0" :inactive-value="1">
         </el-switch>
       </el-form-item>
     </el-form>
@@ -36,7 +36,8 @@
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import UploadAvatarImage from '@/components/common/UploadAvatarImage'
-import { create, updateById } from '@/api/business/company'
+import { create, updateById, detailById } from '@/api/business/ywAccount'
+import {  companyGetList } from '@/api/business/company'
 import { Message } from 'element-ui'
 export default {
   components: { GlobalWindow, UploadAvatarImage },
@@ -45,18 +46,23 @@
       isShowModal: false,
       subLoading: false,
       param: {
-        type: 2,
-        status: '0'
+        type: 0,
+        status: 0
       },
-      cateList: [],
+      comList: [],
       rules: {
         name: [{ required: true, message: '璇疯緭鍏�' }],
-        desc: [{ required: true, message: '璇疯緭鍏�' }]
+        title: [{ required: true, message: '璇疯緭鍏�' }],
+        bankName: [{ required: true, message: '璇疯緭鍏�' }],
+        bankNo: [{ required: true, message: '璇疯緭鍏�' }],
+        status: [{ required: true, message: '璇烽�夋嫨' }],
+        type: [{ required: true, message: '璇烽�夋嫨' }],
+        companyId: [{ required: true, message: '璇烽�夋嫨' }],
       },
-
     }
   },
   created() {
+    this.getCompany()
   },
   methods: {
     handleSub() {
@@ -76,6 +82,21 @@
         }
       })
     },
+    getDetail(id) {
+      detailById(id).then(res => {
+        this.param = res
+      })
+    },
+    getCompany(){
+      companyGetList({
+        model: {type: 2},
+        capacity: 9999,
+        page: 1
+      }).then(res => {
+       this.comList = res.records || []
+        
+      })
+    },
     changeSel(e) {
       if (e && e.length == 1) {
         this.$set(this.param, 'catePId', e[0])
diff --git a/admin/src/views/finance/components/companyEdit.vue b/admin/src/views/finance/components/companyEdit.vue
index 6c378a8..0ab2eeb 100644
--- a/admin/src/views/finance/components/companyEdit.vue
+++ b/admin/src/views/finance/components/companyEdit.vue
@@ -5,14 +5,14 @@
       <el-form-item label="鍏徃鍚嶇О" prop="name">
         <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
-      <el-form-item label="鍏徃绠�浠�" prop="desc">
-        <el-input v-model="param.desc" placeholder="璇疯緭鍏�" v-trim />
+      <el-form-item label="鍏徃绠�浠�" prop="shortName">
+        <el-input v-model="param.shortName" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
       <el-form-item label="绾崇◣璇嗗埆鍙�">
         <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
       <el-form-item label="鑱旂郴鍦板潃">
-        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
+        <el-input v-model="param.address" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
       <el-form-item label="鐘舵��" prop="code">
         <el-switch v-model="param.status" active-value="0" inactive-value="1">
@@ -25,7 +25,7 @@
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import UploadAvatarImage from '@/components/common/UploadAvatarImage'
-import { create, updateById } from '@/api/business/company'
+import { createFinanceCompany, updateFinanceCompany } from '@/api/business/company'
 import { Message } from 'element-ui'
 export default {
   components: { GlobalWindow, UploadAvatarImage },
@@ -52,7 +52,7 @@
       const { param, subLoading } = this
       this.$refs['paramRef'].validate((valid) => {
         if (valid) {
-          let fn = param.id ? updateById : create
+          let fn = param.id ? updateFinanceCompany : createFinanceCompany
           this.subLoading = true
           fn(param).then(res => {
             this.subLoading = false
diff --git a/admin/src/views/operation/components/deviceEdit.vue b/admin/src/views/operation/components/deviceEdit.vue
index 1f81c25..129cc6d 100644
--- a/admin/src/views/operation/components/deviceEdit.vue
+++ b/admin/src/views/operation/components/deviceEdit.vue
@@ -12,7 +12,7 @@
         <el-input v-model="param.modelNo" placeholder="璇疯緭鍏�" v-trim />
       </el-form-item>
       <el-form-item label="璁惧鍒嗙被" prop="">
-        <el-cascader v-model="param.areaIds" @change="changeSel" placeholder="璇烽�夋嫨璁惧鍒嗙被" clearable :options="cateList"
+        <el-cascader v-model="param.cateIds" @change="changeSel" placeholder="璇烽�夋嫨璁惧鍒嗙被" clearable :options="cateList"
           :props="{
             label: 'name',
             value: 'id',
@@ -20,7 +20,7 @@
           }"></el-cascader>
       </el-form-item>
       <el-form-item label="璁惧绠$悊鍛�" prop="">
-        <el-select v-model="param.userId" clearable filterable class="w400">
+        <el-select v-model="param.userId" clearable filterable>
           <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option>
         </el-select>
       </el-form-item>
@@ -29,27 +29,24 @@
 
       </el-form-item>
       <el-form-item label="渚涘簲鍟�" prop="">
-        <el-input v-model="param.company" placeholder="璇疯緭鍏�" v-trim />
+        <el-input v-model="param.supplier" placeholder="璇疯緭鍏�" v-trim />
 
       </el-form-item>
       <el-form-item label="杩愮淮鍐呭" prop="">
         <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" />
       </el-form-item>
       <el-form-item label="璁惧鐘舵��" prop="">
-        <el-select v-model="param.status" filterable clearable>
-          <el-option value="0" label="姝e父"></el-option>
-          <el-option value="1" label="鎹熷潖"></el-option>
-          <el-option value="2" label="鎶ュ簾"></el-option>
+        <el-select v-model="param.status" filterable>
+          <el-option :value="0" label="姝e父"></el-option>
+          <el-option :value="1" label="鎹熷潖"></el-option>
+          <el-option :value="2" label="鎶ュ簾"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="鐓х墖" prop="">
-        <UploadAvatarImage :file="{ 'imgurlfull': param.imgurlfull, 'imgurl': param.imgurl }"
-          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
+        <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }"
+          :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
           @uploadBegin="isUploading = true" />
       </el-form-item>
-
-
-
     </el-form>
   </GlobalWindow>
 </template>
@@ -58,7 +55,7 @@
 import GlobalWindow from '@/components/common/GlobalWindow'
 import UploadAvatarImage from '@/components/common/UploadAvatarImage'
 import { fetchList } from '@/api/business/category'
-import { create, updateById } from '@/api/Inspection/device'
+import { create, updateById, detailById } from '@/api/Inspection/device'
 import { getUserList } from '@/api/system/user'
 import { Message } from 'element-ui'
 export default {
@@ -67,7 +64,9 @@
     return {
       isShowModal: false,
       subLoading: false,
-      param: {},
+      param: {
+        status: 0
+      },
       cateList: [],
       rules: {
         name: [{ required: true, message: '璇疯緭鍏�' }],
@@ -88,16 +87,34 @@
           let fn = param.id ? updateById : create
           this.subLoading = true
           fn(param).then(res => {
-            if (res.code == 200) {
-              this.subLoading = false
-              this.$emit('success')
-              Message.success('淇濆瓨鎴愬姛')
-              this.close()
-            }
+            this.subLoading = false
+            this.$emit('success')
+            Message.success('淇濆瓨鎴愬姛')
+            this.close()
           }).catch(() => {
             this.subLoading = false
           })
         }
+      })
+    },
+    getDetail(id) {
+      detailById(id).then(res => {
+        this.param = res
+        const cateId = this.param.cateId || ''
+        setTimeout(() => {
+          if (cateId) {
+            this.cateList.forEach(item => {
+              if (item.childCategoryList) {
+                item.childCategoryList.forEach(item2 => {
+                  if (item2.id == cateId) {
+                    this.$set(this.param, 'cateIds', [item.id, item2.id])
+                    console.log('cateId', this.form)
+                  }
+                })
+              }
+            })
+          }
+        },1000)
       })
     },
     getStaff() {
@@ -117,14 +134,14 @@
     },
     changeSel(e) {
       if (e && e.length == 2) {
-        this.$set(this.param, 'areaId', e[1])
+        this.$set(this.param, 'cateId', e[1])
       } else {
-        this.$set(this.param, 'areaId', '')
+        this.$set(this.param, 'cateId', '')
       }
     },
     uploadAvatarSuccess(file) {
-      this.$set(this.param, 'imgurl', file.imgurl)
-      this.$set(this.param, 'imgurlfull', file.imgurlfull)
+      this.$set(this.param, 'fileUrl', file.imgurl)
+      this.$set(this.param, 'fileFullUrl', file.imgurlfull)
     },
     close() {
       this.isShowModal = false
diff --git a/admin/src/views/operation/components/maintain.vue b/admin/src/views/operation/components/maintain.vue
index 5ec2b19..a1d0879 100644
--- a/admin/src/views/operation/components/maintain.vue
+++ b/admin/src/views/operation/components/maintain.vue
@@ -2,21 +2,21 @@
   <GlobalWindow :title="param.id ? '缂栬緫杩愮淮璁板綍' : '鏂板缓杩愮淮璁板綍'" :confirmWorking="subLoading" :visible.sync="isShowModal"
     width="600px" @close="close" @confirm="handleSub">
     <el-form :model="param" ref="paramRef" :rules="rules">
-      <el-form-item label="閫夋嫨璁惧" prop="code">
+      <el-form-item label="閫夋嫨璁惧" prop="deviceId">
         <el-select v-model="param.deviceId" filterable clearable>
-          <el-option v-for="item in deviceList" :value="item" :label="item"></el-option>
+          <el-option v-for="item in deviceList" :value="item.id" :label="item.name"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="杩愮淮浜哄憳" prop="code">
-        <el-select v-model="param.realName" filterable clearable>
-          <el-option v-for="item in 10" :value="item" :label="item"></el-option>
+      <el-form-item label="杩愮淮浜哄憳" prop="userId">
+        <el-select v-model="param.userId" filterable clearable>
+          <el-option v-for="item in staffList" :value="item.id" :label="item.realname"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="璁惧鐘舵��" prop="">
         <el-select v-model="param.status" filterable clearable>
-          <el-option value="0" label="姝e父"></el-option>
-          <el-option value="1" label="鎹熷潖"></el-option>
-          <el-option value="2" label="鎶ュ簾"></el-option>
+          <el-option :value="0" label="姝e父"></el-option>
+          <el-option :value="1" label="鎹熷潖"></el-option>
+          <el-option :value="2" label="鎶ュ簾"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="鐜板満鐓х墖" prop="">
@@ -37,17 +37,13 @@
           </div>
         </div>
       </el-form-item>
-      <el-form-item label="杩愮淮澶囨敞" prop="">
-        <el-input type="textarea" :rows="4" v-model="param.remark" placeholder="璇疯緭鍏�" />
+      <el-form-item label="杩愮淮澶囨敞" prop="content">
+        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" />
       </el-form-item>
-      <el-form-item label="杩愮淮鏃堕棿" prop="">
+      <el-form-item label="杩愮淮鏃堕棿" prop="dealDate">
         <el-date-picker v-model="param.dealDate" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
           type="datetime"></el-date-picker>
       </el-form-item>
-
-
-
-
     </el-form>
   </GlobalWindow>
 </template>
@@ -56,6 +52,8 @@
 import GlobalWindow from '@/components/common/GlobalWindow'
 import UploadAvatarImage from '@/components/common/UploadAvatarImage'
 import { fetchList } from '@/api/Inspection/device'
+import { getUserList } from '@/api/system/user'
+import { create, updateById } from '@/api/Inspection/deviceRecord'
 import { Message, Loading } from 'element-ui'
 export default {
   components: { GlobalWindow, UploadAvatarImage },
@@ -65,9 +63,11 @@
       subLoading: false,
       param: {},
       deviceList: [],
+      staffList: [],
       rules: {
-        name: [{ required: true, message: '璇疯緭鍏�' }],
-        code: [{ required: true, message: '璇疯緭鍏�' }]
+        deviceId: [{ required: true, message: '璇烽�夋嫨' }],
+        content: [{ required: true, message: '璇疯緭鍏�' }],
+        // code: [{ required: true, message: '璇疯緭鍏�' }],
       },
 
       loadingInstance: null,
@@ -84,18 +84,19 @@
   },
   methods: {
     handleSub() {
-      const { param, subLoading } = this
+      const { param, subLoading, fileList } = this
       this.$refs['paramRef'].validate((valid) => {
         if (valid) {
           let fn = param.id ? updateById : create
+          if(fileList && fileList.length > 0){
+            param.multifileList = fileList
+          }
           this.subLoading = true
           fn(param).then(res => {
-            if (res.code == 200) {
-              this.subLoading = false
+            this.subLoading = false
               this.$emit('success')
               Message.success('淇濆瓨鎴愬姛')
               this.close()
-            }
           }).catch(() => {
             this.subLoading = false
           })
@@ -108,9 +109,11 @@
         capacity: 1000,
         page: 1,
       }).then(res => {
-        this.deviceList = res || []
+        this.deviceList = res.records
       })
-
+      getUserList({}).then(res => {
+        this.staffList = res
+      })
     },
     changeSel(e) {
       if (e && e.length == 1) {
@@ -155,12 +158,14 @@
       if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
         this.fileList.push({
           type: 1,
+          objType: 6,
           fileurl: item.imgaddr,
           fileurlFull: item.url
         })
       } else {
         this.fileList.push({
           type: 0,
+          objType: 6,
           fileurl: item.imgaddr,
           fileurlFull: item.url
         })
@@ -184,7 +189,8 @@
 .file_list {
   display: flex;
   flex-wrap: wrap;
-  .avatar-uploader{
+
+  .avatar-uploader {
     width: 92px;
     height: 92px;
     display: flex;
@@ -192,6 +198,7 @@
     align-items: center;
     border: 1px dashed #d9d9d9;
   }
+
   .item {
     width: 92px;
     max-height: 92px;
diff --git a/admin/src/views/operation/components/maintainDetail.vue b/admin/src/views/operation/components/maintainDetail.vue
new file mode 100644
index 0000000..e9d85b1
--- /dev/null
+++ b/admin/src/views/operation/components/maintainDetail.vue
@@ -0,0 +1,104 @@
+<template>
+  <GlobalWindow title="璁惧杩愮淮璇︽儏" :showConfirm="false" :visible.sync="visible" width="800px">
+    <div class="model_wrap">
+      <div class="list">
+        <div class="item">
+          <div class="la">璁惧鍚嶇О</div>
+          <div class="val">{{ info.deviceName }}</div>
+        </div>
+        <div class="item">
+          <div class="la">璁惧缂栧彿</div>
+          <div class="val">{{ info.deviceCode }}</div>
+        </div>
+        <div class="item">
+          <div class="la">璁惧鐘舵��</div>
+          <div class="val" v-if="info.status == 0">姝e父</div>
+          <div class="val" v-if="info.status == 1">鎹熷潖</div>
+          <div class="val" v-if="info.status == 2">鎶ュ簾</div>
+        </div>
+        <div class="item">
+          <div class="la">杩愮淮浜�</div>
+          <div class="val">{{ info.realName }}</div>
+        </div>
+        <div class="item">
+          <div class="la">杩愮淮浜虹數璇�</div>
+          <div class="val">{{ info.mobile }}</div>
+        </div>
+        <div class="item">
+          <div class="la">杩愮淮鏃堕棿</div>
+          <div class="val">{{ info.dealDate }}</div>
+        </div>
+        <div class="item max">
+          <div class="la">杩愮淮澶囨敞</div>
+          <div class="val">{{ info.content }}</div>
+        </div>
+        <div class="item max">
+          <div class="la">鐜板満鐓х墖</div>
+          <div class="value" v-if="info.multifileList == null || !info.multifileList.length">鏃�</div>
+          <div class="value" v-if="info.multifileList != null && info.multifileList.length">
+            <div v-for="item in info.multifileList" :key="item.id" style="display: inline;margin-right: 20px">
+              <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls preload="auto"
+                style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
+              <el-image v-else-if="item.fileurlFull" style="width:80px; height: 80px" :src="item.fileurlFull"
+                :preview-src-list="[item.fileurlFull]">
+              </el-image>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { detailById } from '@/api/Inspection/deviceRecord'
+export default {
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data() {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      info: {},
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    getDetail(id) {
+      detailById(id).then(res => {
+        this.info = res
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.model_wrap {
+  padding-top: 20px;
+  .title {
+    font-size: 18px;
+    font-weight: 600;
+    margin-bottom: 16px;
+  }
+
+  .list {
+    display: flex;
+    flex-wrap: wrap;
+
+    .item {
+      width: 33.33%;
+      margin-bottom: 8px;
+
+      .la {
+        color: #7f7f7f
+      }
+    }
+    .max{
+      width: 100%;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/operation/device.vue b/admin/src/views/operation/device.vue
index 202eccd..5c34d4f 100644
--- a/admin/src/views/operation/device.vue
+++ b/admin/src/views/operation/device.vue
@@ -8,11 +8,17 @@
     <el-table v-loading="loading" :data="list" stripe>
       <el-table-column prop="code" label="璁惧缂栧彿" min-width="100" show-overflow-tooltip />
       <el-table-column prop="name" label="璁惧鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="璁惧鍒嗙被" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="categoryName" label="璁惧鍒嗙被" min-width="100" show-overflow-tooltip />
       <el-table-column prop="modelNo" label="璁惧鍨嬪彿" min-width="100" show-overflow-tooltip />
       <el-table-column prop="realName" label="绠$悊鍛�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="company" label="璁惧渚涘簲鍟�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="status" label="璁惧鐘舵��" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="supplier" label="璁惧渚涘簲鍟�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="status" label="璁惧鐘舵��" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <span v-if="row.status == 0">姝e父</span>
+          <span v-if="row.status == 1">鎹熷潖</span>
+          <span v-if="row.status == 2">鎶ュ簾</span>
+        </template>
+      </el-table-column>
       <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
         <template slot-scope="{row}">
           <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
@@ -104,6 +110,8 @@
       this.$nextTick(() => {
         this.$refs.EditRef.isShowModal = true
         if (row && row.id) {
+          console.log('---');
+          
           this.$refs.EditRef.getDetail(row.id)
         }
       })
diff --git a/admin/src/views/operation/record.vue b/admin/src/views/operation/record.vue
index 53e95ad..37c421a 100644
--- a/admin/src/views/operation/record.vue
+++ b/admin/src/views/operation/record.vue
@@ -7,16 +7,21 @@
       <el-button type="primary" @click="handleEx" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="" label="杩愮淮浜�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="code" label="璁惧缂栧彿" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="name" label="璁惧鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="stautsName" label="璁惧鐘舵��" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="remark" label="杩愮淮澶囨敞" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="realName" label="杩愮淮浜�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="deviceCode" label="璁惧缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="deviceName" label="璁惧鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="status" label="璁惧鐘舵��" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <span v-if="row.status == 0">姝e父</span>
+          <span v-if="row.status == 1">鎹熷潖</span>
+          <span v-if="row.status == 2">鎶ュ簾</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="content" label="杩愮淮澶囨敞" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="140" show-overflow-tooltip />
       <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
         <template slot-scope="{row}">
-          <el-button type="text" @click="handleDetail(row)" icon="el-icon-edit"
-            v-permissions="['business:category:update']">鏌ョ湅</el-button>
+          <el-button type="text" @click="handleDetail(row)" v-permissions="['business:category:update']">鏌ョ湅</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -24,6 +29,7 @@
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
     </div>
     <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+    <Detail ref="DetailRef" />
   </div>
 </template>
 
@@ -31,12 +37,14 @@
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
 import Edit from './components/maintain.vue'
-import { fetchList, deleteById } from '@/api/Inspection/device'
+import Detail from './components/maintainDetail.vue'
+import { fetchList, deleteById } from '@/api/Inspection/deviceRecord'
 export default {
   components: {
     Pagination,
     QueryForm,
-    Edit
+    Edit,
+    Detail
   },
   data() {
     return {
@@ -105,8 +113,9 @@
       })
 
     },
-    handleDetail() {
-
+    handleDetail(row) {
+      this.$refs.DetailRef.visible = true
+      this.$refs.DetailRef.getDetail(row.id)
     },
     handleDel(row) {
       let message = `纭鍒犻櫎璇ヨ褰曞悧?`
diff --git a/admin/src/views/project/components/OperaYwProjectWindow.vue b/admin/src/views/project/components/OperaYwProjectWindow.vue
index 82aba77..70ea6e0 100644
--- a/admin/src/views/project/components/OperaYwProjectWindow.vue
+++ b/admin/src/views/project/components/OperaYwProjectWindow.vue
@@ -1,23 +1,22 @@
 <template>
-  <GlobalWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
-  >
+  <GlobalWindow :title="title" :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-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim />
       </el-form-item>
-      <el-form-item label="鎵�灞炲湴鍧�" prop="addr">
-        <el-input v-model="form.addr" placeholder="璇疯緭鍏ヨ缁嗗湴鍧�"/>
+      <el-form-item label="鎵�灞炲湴鍖�" prop="addr">
+        <el-cascader v-model="form.areaIdT" :props="{
+          label: 'name',
+          value: 'id',
+          children: 'childList'
+        }" :options="treeList" @change="handleChange"></el-cascader>
       </el-form-item>
       <el-form-item label="璇︾粏鍦板潃" prop="addr">
-        <el-input v-model="form.addr" placeholder="璇疯緭鍏ヨ缁嗗湴鍧�"/>
+        <el-input v-model="form.addr" placeholder="璇疯緭鍏ヨ缁嗗湴鍧�" />
       </el-form-item>
       <el-form-item label="椤圭洰绠�浠�" prop="remark">
-        <el-input type="textarea" :rows="4" v-model="form.remark" placeholder="璇疯緭鍏�"/>
+        <el-input type="textarea" :rows="4" v-model="form.remark" placeholder="璇疯緭鍏�" />
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -26,11 +25,13 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import { getCityTree } from '@/api/system/common'
+import { detailById } from '@/api/project/ywProject'
 export default {
   name: 'OperaYwProjectWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
-  data () {
+  data() {
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
@@ -45,23 +46,65 @@
         status: '',
         sortnum: '',
         imgurl: '',
+        areaIdT: '',
+        cityId: '',
         areaId: '',
+        provinceId: '',
         addr: ''
       },
       // 楠岃瘉瑙勫垯
       rules: {
         name: [{ required: true, message: '璇疯緭鍏ラ」鐩悕绉�', trigger: 'blur' }]
       },
-      projectList: []
+      projectList: [],
+      treeList: []
     }
   },
-  created () {
+  created() {
     this.config({
       api: '/project/ywProject',
       'field.id': 'id'
     })
   },
   methods: {
+    open(title, target) {
+      this.title = title
+      this.visible = true
+      this.initData()
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+        this.$set(this.form, 'areaIdT', [target.provinceId, target.cityId, target.areaId,])
+        // console.log(this.form)
+      })
+
+
+
+    },
+    handleChange(e) {
+      if (e && e.length > 0) {
+        if (e.length == 3) {
+          this.$set(this.form, 'areaId', e[2])
+        } else if (e.length == 2) {
+          this.$set(this.form, 'areaId', e[1])
+        } else {
+          this.$set(this.form, 'areaId', e[0])
+        }
+      }
+    },
+    getDetail(id) {
+      detailById(id).then(res => {
+        this.form = res
+      })
+    },
+    initData() {
+      getCityTree({
+        "type": 0
+      }).then(res => {
+        this.treeList = res
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/project/projectList.vue b/admin/src/views/project/projectList.vue
index a6c0ba5..c816ca7 100644
--- a/admin/src/views/project/projectList.vue
+++ b/admin/src/views/project/projectList.vue
@@ -15,7 +15,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywproject:create', 'business:ywproject:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwProjectWindow.open('鏂板缓椤圭洰')" icon="el-icon-plus" v-permissions="['business:ywproject:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus" v-permissions="['business:ywproject:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywproject:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
@@ -36,7 +36,7 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaYwProjectWindow.open('缂栬緫椤圭洰', row)" icon="el-icon-edit" v-permissions="['business:ywproject:update']">缂栬緫</el-button>
+            <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit" v-permissions="['business:ywproject:update']">缂栬緫</el-button>
             <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywproject:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -90,6 +90,16 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    handleEdit(row){
+      if(row && row.id){
+        this.$refs.operaYwProjectWindow.open('缂栬緫椤圭洰', row)
+      }else{
+        this.$refs.operaYwProjectWindow.open('鏂板缓椤圭洰')
+        // this.$refs.operaYwProjectWindow.open('鏂板缓椤圭洰')
+      }
+    }
   }
 }
 </script>
diff --git a/admin/src/views/workorder/components/detail.vue b/admin/src/views/workorder/components/detail.vue
index 7246837..9722c08 100644
--- a/admin/src/views/workorder/components/detail.vue
+++ b/admin/src/views/workorder/components/detail.vue
@@ -1,5 +1,5 @@
 <template>
-  <GlobalWindow width="820px" title="宸ュ崟璇︽儏" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+  <GlobalWindow width="900px" title="宸ュ崟璇︽儏" :visible.sync="visible" :confirm-working="isWorking" @close="close"
     @confirm="confirm">
     <div class="main">
       <div class="title">
@@ -10,49 +10,67 @@
           <div class="status gray" v-if="info.dealStatus == 2">宸插鐞�</div>
         </div>
       </div>
-      <div class="list">
-        <div class="item">
-          <div class="la">浣嶇疆绫诲瀷</div>
-          <div class="val">{{ info.areaType == 0 ? '瀹ゅ唴缁翠慨' : '鍏叡缁翠慨' }}</div>
+      <div class="main_content">
+        <div class="list">
+          <div class="item">
+            <div class="la">浣嶇疆绫诲瀷</div>
+            <div class="val">{{ info.areaType == 0 ? '瀹ゅ唴缁翠慨' : '鍏叡缁翠慨' }}</div>
+          </div>
+          <div class="item">
+            <div class="la">瀵瑰簲浣嶇疆</div>
+            <div class="val">{{ info.buildingName }} / {{ info.roomNum || info.floorName }}</div>
+          </div>
+          <div class="item">
+            <div class="la">宸ュ崟绫诲埆</div>
+            <div class="val">{{ info.categoryName }}</div>
+          </div>
+          <div class="item">
+            <div class="la">涓婃姤浜�</div>
+            <div class="val">{{ info.creatorName }}</div>
+          </div>
+          <div class="item">
+            <div class="la">涓婃姤浜虹數璇�</div>
+            <div class="val">{{ info.creatorPhone }}</div>
+          </div>
+          <div class="item">
+            <div class="la">涓婃姤鏃堕棿</div>
+            <div class="val">{{ info.createDate }}</div>
+          </div>
+          <div class="item max">
+            <div class="la">涓婇棬鏃堕棿</div>
+            <div class="val">{{ info.getDate }}</div>
+          </div>
+          <div class="item max">
+            <div class="la">闂鎻忚堪</div>
+            <div class="val">{{ info.content }}</div>
+          </div>
+          <div class="item max">
+            <div class="la">闂鍥剧墖</div>
+            <div class="value" v-if="info.fileList == null || !info.fileList.length">鏃�</div>
+            <div class="value" v-if="info.fileList != null && info.fileList.length">
+              <div v-for="item in info.fileList" :key="item.id" style="display: inline;margin-right: 20px">
+                <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls
+                  preload="auto" style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
+                <el-image v-else-if="item.fileurlFull" style="width:80px; height: 80px" :src="item.fileurlFull"
+                  :preview-src-list="[item.fileurlFull]">
+                </el-image>
+              </div>
+            </div>
+          </div>
         </div>
-        <div class="item">
-          <div class="la">瀵瑰簲浣嶇疆</div>
-          <div class="val">{{ info.buildingName }} / {{ info.roomNum || info.floorName }}</div>
-        </div>
-        <div class="item">
-          <div class="la">宸ュ崟绫诲埆</div>
-          <div class="val">{{ info.categoryName }}</div>
-        </div>
-        <div class="item">
-          <div class="la">涓婃姤浜�</div>
-          <div class="val">{{ info.creatorName }}</div>
-        </div>
-        <div class="item">
-          <div class="la">涓婃姤浜虹數璇�</div>
-          <div class="val">{{ info.creatorPhone }}</div>
-        </div>
-        <div class="item">
-          <div class="la">涓婃姤鏃堕棿</div>
-          <div class="val">{{ info.createDate }}</div>
-        </div>
-        <div class="item max">
-          <div class="la">涓婇棬鏃堕棿</div>
-          <div class="val">{{ info.getDate }}</div>
-        </div>
-        <div class="item max">
-          <div class="la">闂鎻忚堪</div>
-          <div class="val">{{ info.content }}</div>
-        </div>
-        <div class="item max">
-          <div class="la">闂鍥剧墖</div>
-          <div class="value" v-if="info.fileList == null || !info.fileList.length">鏃�</div>
-          <div class="value" v-if="info.fileList != null && info.fileList.length">
-            <div v-for="item in info.fileList" :key="item.id" style="display: inline;margin-right: 20px">
-              <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls preload="auto"
-                style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
-              <el-image v-else-if="item.fileurlFull" style="width:80px; height: 80px" :src="item.fileurlFull"
-                :preview-src-list="[item.fileurlFull]">
-              </el-image>
+        <div class="side">
+          <div class="title">宸ュ崟娴佽浆璁板綍鍛�</div>
+          <div class="flow_list">
+            <div class="item" v-for="item,i in info.logList">
+              <div class="icon">
+                <div class="dian"></div>
+                <div v-if="i < info.logList.length - 1" class="line"></div>
+              </div>
+              <div class="content">
+                <div class="name">{{ item.title }}</div>
+                <div class="time">鎿嶄綔鏃堕棿锛歿{ item.createDate }}</div>
+                <div class="creator">鎿嶄綔浜猴細{{ item.param1 }}</div>
+              </div>
             </div>
           </div>
         </div>
@@ -85,8 +103,8 @@
           </el-form-item>
           <el-form-item label="鐜板満鍥剧墖">
             <div class="file_list">
-              <el-upload class="avatar-uploader" :data="uploadData" multiple :limit="6" :auto-upload="true" :action="uploadImgUrl"
-                :show-file-list="false" :on-success="uploadAvatarSuccess" :on-error="uploadError"
+              <el-upload class="avatar-uploader" :data="uploadData" multiple :limit="6" :auto-upload="true"
+                :action="uploadImgUrl" :show-file-list="false" :on-success="uploadAvatarSuccess" :on-error="uploadError"
                 :before-upload="beforeUpload">
                 <div class="upload_wrap">
                   <i class="el-icon-plus avatar-uploader-icon"></i>
@@ -178,9 +196,9 @@
         if (valid) {
           const { param, id, dealFileList, info } = this
           let fn = null
-          if(info.dealStatus == 0 || info.dealStatus == null){
+          if (info.dealStatus == 0 || info.dealStatus == null) {
             fn = param.dealType == 0 ? dispatchOrder : dealOrder
-          }else{
+          } else {
             fn = dealOrder
           }
           fn({
@@ -326,6 +344,46 @@
       width: 100%;
     }
   }
+  .main_content{
+    display: flex;
+    .side{
+      width: 240px;
+      .title{
+        font-size: 14px;
+      }
+      .flow_list{
+        .item{
+          display: flex;
+          .icon{
+            width: 28px;
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            .dian{
+              width: 12px;
+              height: 12px;
+              border-radius: 50%;
+              background-color: #e89e42;
+            }
+            .line{
+              width: 1px;
+              height: 100%;
+              background-color: #e89e42;
+            }
+          }
+          .content{
+            font-size: 12px;
+            color: #999999;
+            padding-bottom: 12px;
+            .name{
+              font-size: 13px;
+              color: #333333;
+            }
+          }
+        }
+      }
+    }
+  }
 }
 
 .file_list {
diff --git a/h5/.gitignore b/h5/.gitignore
new file mode 100644
index 0000000..ee6dfa3
--- /dev/null
+++ b/h5/.gitignore
@@ -0,0 +1,29 @@
+.DS_Store
+coderd.json
+node_modules
+uni_modules
+.env.development
+uview-ui
+
+/dist
+/unpackage
+
+
+# local env files
+.env.local
+.env.*.local
+unpackage
+admin
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/h5/.hbuilderx/launch.json b/h5/.hbuilderx/launch.json
new file mode 100644
index 0000000..f5c1c0b
--- /dev/null
+++ b/h5/.hbuilderx/launch.json
@@ -0,0 +1,9 @@
+{
+    "version" : "1.0",
+    "configurations" : [
+        {
+            "openVueDevtools" : false,
+            "type" : "uni-app:h5"
+        }
+    ]
+}
diff --git a/h5/App.vue b/h5/App.vue
new file mode 100644
index 0000000..878bfe5
--- /dev/null
+++ b/h5/App.vue
@@ -0,0 +1,260 @@
+<script>
+export default {
+  onLaunch: function () {
+    
+  },
+  onShow: function () {
+    console.log('App Show')
+  },
+  onHide: function () {
+    console.log('App Hide')
+  }
+}
+</script>
+
+<style lang="scss">
+/*姣忎釜椤甸潰鍏叡css */
+@import "uview-ui/index.scss";
+body{
+	font-size: 28rpx;
+}
+.flex-cb {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.bg{
+	width: 100%;
+	height: 100%;
+	position: absolute;
+	top: 0;
+	left: 0;
+}
+.container {
+  height: 100%;
+  width: 100%;
+  max-width: 800rpx;
+  overflow-y: auto;
+}
+.empty_wrap{
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	color: #666666;
+	min-height: 600rpx;
+	image{
+		width: 300rpx;
+		height: 300rpx;
+	}
+}
+.doumee-container .ivu-tabs-nav {
+  width: 100%;
+}
+
+.doumee-container .ivu-tabs-nav .ivu-tabs-tab {
+  width: calc(100% / 3);
+}
+
+.doumee-container .ivu-tabs-nav .ivu-tabs-tab {
+  margin-right: 0;
+  text-align: center;
+}
+
+.cell {
+  background-color: #fff;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  min-height: 100rpx;
+  padding: 24rpx 30rpx;
+  box-sizing: border-box;
+  border-bottom: 1rpx solid #eee;
+  font-size: 15rpx;
+  position: relative;
+}
+
+.cell .title {
+  flex-shrink: 0;
+  color: #222;
+  line-height: 20rpx;
+  height: 20rpx;
+  width: 28%;
+  margin-right: 5%;
+}
+
+.cell .content {
+  flex: 1;
+  font-size: 28rpx;
+  font-weight: 400;
+  color: #999999;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+
+.cell .content .input {
+  width: 100%;
+  height: 100%;
+  font-size: 28rpx;
+  font-weight: 400;
+  color: #333333;
+  text-align: right;
+}
+
+.cell.is-link::after {
+  content: "";
+  display: block;
+  width: 8rpx;
+  height: 8rpx;
+  transform: rotate(-45deg);
+  border-right: 1rpx solid #999999;
+  border-bottom: 1rpx solid #999999;
+  margin-left: 5rpx;
+}
+
+.card {
+  background-color: #fff;
+  padding: 16rpx;
+  position: relative;
+}
+.red{
+	color: red;
+}
+.card::after {
+  content: "";
+  display: block;
+  position: absolute;
+  width: calc(100% - 32rpx);
+  height: 0;
+  bottom: 0;
+  left: 16rpx;
+  border-bottom: 1rpx solid #f7f7f7;
+}
+
+.card .title {
+  color: #777777;
+  margin-bottom: 12rpx;
+}
+
+.card .content {
+  color: #222;
+}
+
+.placeholder9 {
+  color: #999999 !important;
+  font-size: 28rpx;
+}
+.red{
+	color: red !important;
+}
+
+//璁剧疆鍦嗚
+checkbox .uni-checkbox-input {
+  border-radius: 50%;
+}
+
+checkbox .uni-checkbox-input.uni-checkbox-input-checked {
+  color: #fff !important;
+  border: 1px solid #4d99a8 !important;
+  background-color: #4d99a8 !important;
+}
+
+checkbox .uni-checkbox-input.uni-checkbox-input-checked:before {
+  /* color: #4d99a8 !important;  */
+  /* border: 1px solid #4d99a8 !important; */
+  /* font-size: 58rpx; */
+  /* border-radius: 50%; */
+}
+
+//
+
+view {
+  box-sizing: border-box;
+}
+
+image {
+  box-sizing: border-box;
+  margin: 0;
+  display: flex;
+}
+input {
+  font-size: 30rpx;
+}
+textarea {
+  box-sizing: border-box;
+  // background-color: #f7f7f7;
+  font-size: 30rpx !important;
+  padding: 0;
+  border-radius: 8rpx;
+  color: #333333 !important;
+}
+.u-textarea {
+  padding: 0 !important;
+  color: #333333 !important;
+}
+
+.df_ac {
+  display: flex;
+  align-items: center;
+}
+
+.main_app {
+  padding: 0 30rpx 30rpx;
+  font-size: 28rpx;
+  color: #333333;
+}
+.popupShow {
+  overflow: hidden;
+  position: fixed;
+  width: 100%;
+}
+.placeholder6 {
+  color: #666666;
+  font-size: 28rpx;
+}
+.primaryColor {
+  color: $uni-color-primary;
+}
+.avatar {
+  width: 64rpx;
+  height: 64rpx;
+  border-radius: 50%;
+  margin-right: 20rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: $uni-color-primary;
+  color: #fff;
+  font-size: 30rpx;
+}
+.placeholder9 {
+  color: #999999;
+  font-size: 28rpx;
+}
+.fs24 {
+  font-size: 24rpx;
+}
+.mr24 {
+  margin-right: 24rpx;
+}
+.mt24 {
+  margin-top: 24rpx;
+}
+
+.mr12 {
+  margin-right: 12rpx;
+}
+.ml12 {
+  margin-left: 12rpx;
+}
+.ml6 {
+  margin-left: 6rpx;
+}
+.mt6 {
+  margin-top: 6rpx;
+}
+.mr6 {
+  margin-right: 6rpx;
+}
+</style>
diff --git a/h5/api/index.js b/h5/api/index.js
new file mode 100644
index 0000000..9a7edfe
--- /dev/null
+++ b/h5/api/index.js
@@ -0,0 +1,29 @@
+import { http } from '@/utils/service.js'
+export * from '@/utils/config.js'
+export * from './staff'
+
+
+
+// 鏌ヨ瀛楀吀鍊兼暟鎹�
+export const getSystemDictData = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/other/getSystemDictData',
+    data
+  })
+}
+// 鎺堟潈
+export const wxAuthorize = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/visitor/wxAuthorize',
+    method: 'get',
+    data
+  })
+}
+//  鍙戦�佺煭淇¢獙璇佺爜
+export const sendSms = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/smsEmail/sendSms',
+    method: 'post',
+    data
+  })
+}
\ No newline at end of file
diff --git a/h5/api/staff.js b/h5/api/staff.js
new file mode 100644
index 0000000..ea64d24
--- /dev/null
+++ b/h5/api/staff.js
@@ -0,0 +1,232 @@
+import { http } from '@/utils/service.js'
+
+// login
+export const loginPost = (data) => {
+  return http({
+    url: 'loginH5',
+    method: 'post',
+    data
+  })
+}
+export const loginCaptcha = () => {
+  return http({
+    url: 'captcha',
+    method: 'get'
+  })
+}
+// 鍒锋柊token
+export const refreshToken = () => {
+  return http({
+    url: 'refreshtoken',
+    method: 'post'
+  })
+}
+export const getUserInfo = () => {
+  return http({
+    url: 'getUserInfo',
+    method: 'get'
+  })
+}
+// 鏌ヨ浜哄憳鐩稿叧淇℃伅0鍔冲姟璁垮 1鏅�氳瀹� 2鍐呴儴浜哄憳,绀轰緥鍊�(1)
+export const findTypeMemberInfo = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/member/findTypeMemberInfo',
+    // url: 'visitsAdmin/cloudService/business/member/page',
+    method: 'post',
+    data
+  })
+}
+//  閲嶇疆瀵嗙爜
+export const resetPassword = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/visits/resetPassword',
+    method: 'post',
+    data
+  })
+}
+//  淇敼瀵嗙爜
+export const uploadPassword = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/member/updatePwd',
+    method: 'post',
+    data
+  })
+}
+// loginout
+export const logoutPost = (data) => {
+  return http({
+    url: '/logout',
+    method: 'post',
+    data
+  })
+}
+
+//  闅愭偅闅忔墜鎷� 鍒涘缓
+export const DangerCreate = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/hiddenDanger/create',
+    method: 'post',
+    data
+  })
+}
+// 闅愭偅鍖哄煙
+export const DangerArea = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/hiddenDanger/create',
+    method: 'post',
+    data
+  })
+}
+// 闅愭偅 璇︽儏
+export const hiddenDangerDetail = (id) => {
+  return http({
+    url:  `visitsAdmin/cloudService/business/hiddenDanger/${id}`,
+    method: 'get'
+  })
+}
+// 閮ㄩ棬鍒楄〃
+export const deptListPost = (data) => {
+  return http({
+    url: '/visitsAdmin/cloudService/business/company/list',
+    method: 'post',
+    data
+  })
+}
+// 闅愭偅 绫诲瀷
+export const DangerConfigType = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/hiddenDangerParam/list',
+    method: 'post',
+    data
+  })
+}
+// 闅愭偅 鏌ヨ鍖哄煙鍐呭畨鍏ㄥ憳
+export const findHiddenAreaMemberList = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/hiddenDangerParam/findHiddenAreaMemberList',
+    method: 'post',
+    data
+  })
+}
+// 闅愭偅 澶勭悊
+export const dealHiddenDanger = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/hiddenDanger/dealHiddenDanger',
+    method: 'post',
+    data
+  })
+}
+// 闅愭偅 杞氦
+export const transferHiddenDanger = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/hiddenDanger/transferHiddenDanger',
+    method: 'post',
+    data
+  })
+}
+// 闅愭偅 娴佺▼鍒楄〃
+export const findListFlowDanger = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/hiddenDangerLog/findList',
+    method: 'post',
+    data
+  })
+}
+// 杞﹁締 鍒楄〃
+export const getCarsList = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/cars/list',
+    method: 'post',
+    data
+  })
+}
+// 鏌ヨ杞﹁締鍙绾︽椂娈�
+export const carCanReservationDate = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/carUseBook/carCanReservationDate',
+    method: 'get',
+    data
+  })
+}
+// 鏌ヨ杞﹁締 棰勭害璁板綍
+export const carUseBookList = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/carUseBook/carUseBookList',
+    method: 'post',
+    data
+  })
+}
+
+// 鐢ㄨ溅鐢宠鎻愪氦
+export const carUseBookCraete = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/carUseBook/create',
+    method: 'post',
+    data
+  })
+}
+
+// 鏌ヨ杞﹁締 娲捐溅璁板綍
+export const carUseBookPaiche = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/carUseBook/page',
+    method: 'post',
+    data
+  })
+}
+// 鏌ヨ杞﹁締 娲捐溅璁板綍 璇︽儏
+export const carUseBookDetail = (id) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/carUseBook/'+id,
+    method: 'get'
+  })
+}
+//  瀹℃壒
+export const carUseBookAppr = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/approve/approved',
+    method: 'post',
+    data
+  })
+}
+// 鏌ヨ杞﹁締 娲捐溅璁板綍 鎾ら攢鐢宠
+export const carUseBookBack = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/carUseBook/revoke',
+    method: 'get',
+    data
+  })
+}
+// 鏌ヨ杞﹁締 鍙告満鍒楄〃
+export const driveListPost = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/member/driveList',
+    method: 'post',
+    data
+  })
+}
+
+//  浠诲姟涓績 澶撮儴鏁版嵁
+export const stagingHead = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/staging/taskCenterHead',
+    method: 'get',
+    data
+  })
+}
+//  浠诲姟涓績 鍒嗛〉鏁版嵁
+export const stagingTaskPage = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/staging/taskPage',
+    method: 'post',
+    data
+  })
+}
+//  浠诲姟涓績 鏍囪宸茶
+export const signReadTask = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/staging/signRead',
+    method: 'get',
+    data
+  })
+}
diff --git a/h5/index.html b/h5/index.html
new file mode 100644
index 0000000..c3ff205
--- /dev/null
+++ b/h5/index.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>
diff --git a/h5/main.js b/h5/main.js
new file mode 100644
index 0000000..3250c70
--- /dev/null
+++ b/h5/main.js
@@ -0,0 +1,36 @@
+import App from './App'
+import store from './store/index.js'
+import uView from "uview-ui"
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+
+Vue.config.productionTip = false
+Vue.use(uView)
+Vue.prototype.$store = store
+Vue.prototype.showToast = (str) => {
+	setTimeout(() => {
+		uni.showToast({
+		  title: str,
+		  icon: 'none',
+		  duration: 2000
+		})
+	})
+}
+Vue.prototype.$eventBus = new Vue()
+App.mpType = 'app'
+const app = new Vue({
+  ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif
\ No newline at end of file
diff --git a/h5/manifest.json b/h5/manifest.json
new file mode 100644
index 0000000..2e78cce
--- /dev/null
+++ b/h5/manifest.json
@@ -0,0 +1,153 @@
+{
+    "name" : "laborVisitors",
+    "appid" : "__UNI__BCCF400",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App鐗规湁鐩稿叧 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 妯″潡閰嶇疆 */
+        "modules" : {},
+        /* 搴旂敤鍙戝竷淇℃伅 */
+        "distribute" : {
+            /* android鎵撳寘閰嶇疆 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios鎵撳寘閰嶇疆 */
+            "ios" : {
+                "dSYMs" : false
+            },
+            /* SDK閰嶇疆 */
+            "sdkConfigs" : {
+                "ad" : {}
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "",
+                    "xhdpi" : "",
+                    "xxhdpi" : "",
+                    "xxxhdpi" : ""
+                },
+                "ios" : {
+                    "appstore" : "",
+                    "ipad" : {
+                        "app" : "",
+                        "app@2x" : "",
+                        "notification" : "",
+                        "notification@2x" : "",
+                        "proapp@2x" : "",
+                        "settings" : "",
+                        "settings@2x" : "",
+                        "spotlight" : "",
+                        "spotlight@2x" : ""
+                    },
+                    "iphone" : {
+                        "app@2x" : "",
+                        "app@3x" : "",
+                        "notification@2x" : "",
+                        "notification@3x" : "",
+                        "settings@2x" : "",
+                        "settings@3x" : "",
+                        "spotlight@2x" : "",
+                        "spotlight@3x" : ""
+                    }
+                }
+            }
+        }
+    },
+    /* 蹇簲鐢ㄧ壒鏈夌浉鍏� */
+    "quickapp" : {},
+    /* 灏忕▼搴忕壒鏈夌浉鍏� */
+    "mp-weixin" : {
+        "appid" : "wxcd2b89fd2ff065f8",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : true,
+            "postcss" : true,
+            "minified" : true
+        },
+        "usingComponents" : true,
+        "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ],
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "鐢ㄤ簬鑾峰彇鍛ㄨ竟鎴挎簮浣嶇疆"
+            }
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2",
+    "h5" : {
+        "router" : {
+            "mode" : "hash",
+            "base" : "./"
+        },
+        // "base" : "/h5/"
+        "devServer" : {
+						"open": false,
+            "port" : 8090,
+            "historyApiFallback" : true,
+            "disableHostCheck" : true,
+            "proxy" : {
+                "/gateway_interface" : {
+                    // 杩欎釜瀛楁鍚嶉渶涓庝綘閰嶇疆鐨刡asePrefixUrl涓�鑷达紝绯荤粺璇嗗埆鍒板甫鏈�/dev-api璇锋眰鐨勫湴鍧�鏃讹紝浼氬湪鍓嶉潰鎷兼帴涓婁唬鐞嗘湇鍔″櫒鍦板潃
+                    // "target" : "http://172.20.10.7:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    // "target" : "http://192.168.0.100:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    // "target" : "http://10.50.250.253:8088/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    "target" : "http://192.168.0.173/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    "changeOrigin" : true, // 鍏佽璺ㄥ煙 
+                    "pathRewrite" : {
+                        "^/gateway_interface" : ""
+                    }
+                }
+            },
+            "https" : false
+        },
+        "sdkConfigs" : {
+            "maps" : {
+                "amap" : {
+                    "key" : "d9a554b1808ce10a12a932ed9b0db1d0",
+                    "securityJsCode" : "",
+                    "serviceHost" : ""
+                }
+            }
+        }
+    }
+}
diff --git a/h5/pages.json b/h5/pages.json
new file mode 100644
index 0000000..c288dfa
--- /dev/null
+++ b/h5/pages.json
@@ -0,0 +1,87 @@
+{
+	"easycom": {
+		"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
+	},
+	"pages": [{
+			"path": "pages/index",
+			"style": {
+				"navigationBarTitleText": "棣栭〉",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/login",
+			"style": {
+				"navigationBarTitleText": "鐧诲綍"
+			}
+		},
+		{
+			"path": "pages/workOrder/list",
+			"style": {
+				"navigationBarTitleText": "宸ュ崟鍒楄〃"
+			}
+		},
+		{
+			"path": "pages/workOrder/detail",
+			"style": {
+				"navigationBarTitleText": "宸ュ崟璇︽儏"
+			}
+		},
+		{
+			"path" : "pages/workOrder/edit",
+			"style" : 
+			{
+				"navigationBarTitleText" : "鏂板宸ュ崟"
+			}
+		},
+		{
+			"path" : "pages/operation/record",
+			"style" : 
+			{
+				"navigationBarTitleText" : "杩愮淮璁板綍"
+			}
+		},
+		{
+			"path" : "pages/operation/detail",
+			"style" : 
+			{
+				"navigationBarTitleText" : "杩愮淮璇︽儏"
+			}
+		},
+		{
+			"path" : "pages/operation/device",
+			"style" : 
+			{
+				"navigationBarTitleText" : "璁惧杩愮淮"
+			}
+		},
+		{
+			"path" : "pages/polling/task",
+			"style" : 
+			{
+				"navigationBarTitleText" : "宸℃浠诲姟"
+			}
+		},
+		{
+			"path" : "pages/polling/detail",
+			"style" : 
+			{
+				"navigationBarTitleText" : "杩愮淮璇︽儏"
+			}
+		},
+		{
+			"path" : "pages/polling/point",
+			"style" : 
+			{
+				"navigationBarTitleText" : "宸℃鐐�"
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "",
+		"navigationBarBackgroundColor": "#ffffff",
+		"backgroundColor": "#ffffff"
+	},
+	"uniIdRouter": {}
+}
\ No newline at end of file
diff --git a/h5/pages/index.vue b/h5/pages/index.vue
new file mode 100644
index 0000000..3970282
--- /dev/null
+++ b/h5/pages/index.vue
@@ -0,0 +1,135 @@
+<template>
+	<view class="main_app">
+		<view class="hone_name title">{{ userInfo.name }}锛屾杩庣櫥褰�</view>
+		<view class="home_con">
+			<image class="bg" src="@/static/home/home_bg.jpg" mode=""></image>
+			<view class="h1">闃滃畞鏂囦綋涓績</view>
+			<view class="h2">娆㈣繋浣�</view>
+		</view>
+		<view class="title">涓氬姟鍔炵悊</view>
+		<view class="list">
+			<view v-for="item in list1" class="item" @click="itemClick(item)">
+				<image :src="item.img"></image>
+				<view class="name">{{item.name}}</view>
+			</view>
+		</view>
+		<view class="title">涓氬姟鏌ヨ</view>
+		<view class="list">
+			<view v-for="item in list2" class="item" @click="itemClick(item)">
+				<image :src="item.img"></image>
+				<view class="name">{{item.name}}</view>
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				userInfo: uni.getStorageSync('userInfo') || {},
+				list1: [{
+						name: '鎵爜宸℃',
+						url: '',
+						img: require('@/static/home/ic_fangkebaobei@2x.png'),
+						auth: 'weixin:menu:visitcar'
+					},
+					{
+						name: '宸ュ崟鏈嶅姟',
+						url: '/pages/workOrder/list',
+						img: require('@/static/home/ic_fangkeba.png'),
+						auth: 'weixin:menu:visitcar'
+					},
+					{
+						name: '璁惧杩愮淮',
+						url: '/pages/operation/device',
+						img: require('@/static/home/ic_fangkebaobe@2x.png'),
+						auth: 'weixin:menu:visitcar'
+					},
+				],
+				list2: [{
+						name: '宸℃浠诲姟',
+						url: '/pages/polling/task',
+						img: require('@/static/home/ic_renwuzhongxin@2x.png'),
+						auth: 'weixin:menu:visitcar'
+					},
+					{
+						name: '杩愮淮璁板綍',
+						url: '/pages/operation/record',
+						img: require('@/static/home/ic_wodehuiyi@2x.png'),
+						auth: 'weixin:menu:visitcar'
+					},
+				]
+			}
+		},
+		onLoad() {
+
+		},
+		methods: {
+			itemClick(item) {
+				uni.navigateTo({
+					url: item.url
+				})
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.main_app {
+		padding: 0 30rpx;
+
+		.hone_name {
+
+			height: 90rpx;
+			display: flex;
+			align-items: center;
+		}
+
+		.home_con {
+			width: 690rpx;
+			height: 270rpx;
+			border-radius: 8rpx;
+			margin-bottom: 40rpx;
+			padding: 36rpx 40rpx;
+			position: relative;
+			color: #fff;
+
+			.h1 {
+				font-weight: bold;
+				font-size: 44rpx;
+				margin-bottom: 14rpx;
+			}
+		}
+
+		.title {
+			font-weight: 500;
+			font-size: 34rpx;
+		}
+
+		.list {
+			margin-top: 30rpx;
+			margin-bottom: 80rpx;
+			display: flex;
+
+			.item {
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				width: 25%;
+
+				image {
+					width: 88rpx;
+					height: 88rpx;
+					margin-bottom: 20rpx;
+				}
+
+				.name {
+					font-size: 26rpx;
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/login.vue b/h5/pages/login.vue
new file mode 100644
index 0000000..0b3b772
--- /dev/null
+++ b/h5/pages/login.vue
@@ -0,0 +1,225 @@
+<template>
+  <view class="login">
+    <view class="login_title">娆㈣繋鐧诲綍</view>
+    <view class="login_title login_title2">闃滃畞鏂囦綋涓績</view>
+    <view class="login_list">
+      <view class="login_list_item">
+        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
+        <input v-model="form.username" maxlength="18" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
+      </view>
+<!--      <view class="login_list_item">
+        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
+        <input v-model="form.password" type="password" placeholder="瀵嗙爜" />
+      </view> -->
+      <view class="login_list_item">
+        <image src="@/static/login_ic_password@2x.png" mode="widthFix"></image>
+        <input v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" type="text" />
+        <view class="btn">鑾峰彇楠岃瘉鐮�</view>
+      </view>
+    </view>
+    <view class="login_btn">
+      <view class="login_btn_n" @click="onLogin">鐧诲綍</view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { loginPost, loginCaptcha, getUserInfo, getSystemDictData } from '@/api'
+import { mapState, mapMutations } from 'vuex'
+export default {
+  name: 'login',
+
+  data() {
+    return {
+      form: {
+        // username: '18056814089',
+        username: '',
+        password: '',
+				code: ''
+      },
+      isShowProtocol: false,
+      ProtocolFlag: false,
+      captcha: {},
+      htmlText: ''
+    }
+  },
+
+  onLoad() {
+    this.initCaptcha()
+  },
+  onBackPress(options) {
+    uni.redirectTo({
+      url: '/pages/login/login'
+    })
+    return true
+  },
+  methods: {
+    ...mapMutations(["setToken", "setUserInfo"]),
+    changeFalg() {
+      this.ProtocolFlag = !this.ProtocolFlag
+    },
+    getContent() {
+      getSystemDictData({
+        dictCode: 'SYSTEM',
+        label: 'USER_PROTOCOL'
+      }).then(res => {
+        this.htmlText = res.data.code
+        this.isShowProtocol = true
+      })
+    },
+    showContent() {
+      this.getContent()
+    },
+    initCaptcha() {
+      loginCaptcha().then(res => {
+        this.captcha = res.data
+      })
+    },
+
+    onLogin() {
+      const { form, ProtocolFlag } = this
+      if (!ProtocolFlag) return uni.showToast({
+        title: '璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁�',
+        icon: 'none'
+      })
+      if (!form.username) return uni.showToast({
+        title: '璐﹀彿涓嶈兘涓虹┖',
+        icon: 'none'
+      })
+      if (!form.password) return uni.showToast({
+        title: '瀵嗙爜涓嶈兘涓虹┖',
+        icon: 'none'
+      })
+      if (!form.code) return uni.showToast({
+        title: '楠岃瘉鐮佷笉鑳戒负绌�',
+        icon: 'none'
+      })
+      loginPost({
+        ...form,
+        uuid: this.captcha.uuid,
+        openId: this.$store.state.openId
+      }).then(res => {
+        if (res.code === 200) {
+          this.setToken(res.data)
+          getUserInfo().then(ress => {
+            this.setUserInfo(ress.data)
+            uni.redirectTo({
+              url: "/pages/staff/index"
+            })
+          })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.login {
+  width: 100%;
+  height: 100vh;
+  display: flex;
+  padding-top: 130rpx;
+  box-sizing: border-box;
+  align-items: center;
+  flex-direction: column;
+  background: linear-gradient( 180deg, #C5DDFF 0%, #FFFFFF 100%);
+  .login_title {
+    font-weight: 500;
+    font-size: 52rpx;
+    color: #222222;
+    margin-top: 180rpx;
+		width: 100%;
+		padding-left: 60rpx;
+  }
+	.login_title2{
+		margin-top: 10rpx;
+		margin-bottom: 80rpx;
+	}
+  .login_list {
+    width: 100%;
+    padding: 0 60rpx;
+    box-sizing: border-box;
+    .login_list_item {
+      width: 100%;
+      border-radius: 50rpx;
+      height: 98rpx;
+      padding: 0 40rpx;
+      box-sizing: border-box;
+      background: #ffffff;
+      margin-bottom: 40rpx;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      &:last-child {
+        margin-bottom: 0 !important;
+      }
+      image {
+        flex-shrink: 0;
+        width: 40rpx;
+        height: 40rpx;
+      }
+      .btn{
+      	width: 145rpx;
+      	color:  $primaryColor;
+      }
+      input {
+        flex: 1;
+        height: 100%;
+        color: #666666;
+        margin-left: 24rpx;
+        border: none;
+      }
+    }
+  }
+  .login_btn {
+    width: 100%;
+    padding: 0 60rpx;
+    box-sizing: border-box;
+    margin-top: 60rpx;
+    .for_psd {
+      color: $uni-color-primary;
+      width: 140rpx;
+      text-align: center;
+      margin: 40rpx auto;
+    }
+    .login_btn_n {
+      width: 100%;
+      height: 98rpx;
+      background: $uni-color-primary;
+      box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      color: #ffffff;
+      border-radius: 50rpx;
+			font-weight: 500;
+			font-size: 32rpx;
+    }
+  }
+  .deal_wrap {
+    position: absolute;
+    width: 100%;
+    left: 0;
+    text-align: center;
+    bottom: 88rpx;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    .deal {
+      color: $uni-color-primary;
+    }
+    .checked {
+      width: 48rpx;
+      margin-right: 12rpx;
+    }
+  }
+}
+.modal {
+  width: 690rpx;
+  min-height: 920rpx;
+  max-height: 720px;
+  border-radius: 24rpx;
+  padding: 32rpx;
+}
+</style>
diff --git a/h5/pages/operation/detail.vue b/h5/pages/operation/detail.vue
new file mode 100644
index 0000000..ab1ce29
--- /dev/null
+++ b/h5/pages/operation/detail.vue
@@ -0,0 +1,92 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="name_wrap">
+				<view class="name">xx璁惧</view>
+				<view class="status red">姝e父</view>
+			</view>
+			<view class="line">杩愮淮浜猴細xxx</view>
+			<view class="line">杩愮淮鏃堕棿锛�121212</view>
+		</view>
+		<!--  -->
+		<view class="remark">
+			<view class="title">杩愮淮澶囨敞</view>
+			<view class="file_list">
+				<view class="file">
+					
+				</view>
+			</view>
+			<view class="desc">remark</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			};
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		flex: 1;
+		color: #666666;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		height: 260rpx;
+		padding: 30rpx;
+		border-bottom: 20rpx solid #f7f7f7;
+		.name_wrap {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+
+			.name{
+				font-weight: 600;
+				font-size: 34rpx;
+				color: #222222;
+			}
+
+			.status {
+				color: $primaryColor;
+			}
+		}
+	}
+	.remark{
+		padding: 0 30rpx;
+		.title{
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			height: 104rpx;
+			display: flex;
+			align-items: center;
+		}
+		.file_list{
+			display: flex;
+			flex-wrap: wrap;
+			
+			.file{
+				width: 156rpx;
+				height: 156rpx;
+				border-radius: 12rpx;
+				margin-right: 22rpx;
+				margin-bottom: 22rpx;
+				&:nth-of-type(4n){
+					margin-right: 0;
+				}
+			}
+		}
+		.desc{
+			margin-top: 8rpx;
+			padding: 24rpx 30rpx;
+			background: #F7F7F7;
+			border-radius: 12rpx;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/operation/device.vue b/h5/pages/operation/device.vue
new file mode 100644
index 0000000..125001a
--- /dev/null
+++ b/h5/pages/operation/device.vue
@@ -0,0 +1,376 @@
+<template>
+	<view class="main_app">
+		<view class="list">
+			<view class="item">
+				<view class="la"><text class="red">*</text>閫夋嫨璁惧</view>
+				<view class="line">
+					<view class="sel_wrap" @click="showModal = true">
+						<view class="left" :class="param.name ? '' : 'placeholder9'">{{ param.name ? param.name : '璇烽�夋嫨璁惧' }}</view>
+						<u-icon name="arrow-right" color="#999999" size="17"></u-icon>
+					</view>
+					<image class="icon" src="@/static/side/scan.png" mode=""></image>
+				</view>
+			</view>
+			<view class="item">
+				<view class="la">璁惧鐘舵��</view>
+				<view class="line">
+					<view class="radio_wrap">
+						<view class="ite" :class="{active: param.status == 0}" @click="statusChange(0)">姝e父</view>
+						<view class="ite" :class="{active: param.status == 1}" @click="statusChange(1)">鎹熷潖</view>
+						<view class="ite" :class="{active: param.status == 2}" @click="statusChange(2)">鎶ュ簾</view>
+					</view>
+				</view>
+			</view>
+			<view class="item">
+				<view class="la">涓婁紶瑙嗛/鍥剧墖</view>
+				<view class="upload_wrap">
+					<view class="upload_file" @click="showUpload = true">
+						<u-icon name="plus" color="rgb(153, 153, 153)" size="28"></u-icon>
+						<view class="mt6">鍥剧墖/瑙嗛</view>
+					</view>
+					<view class="upload_file" v-for="(item, i) in dealFileList" :key="i">
+						<u-icon class="close" size="20" name="close-circle-fill" color="red"
+							@click="fileDel('dealBeforeFileList', i)"></u-icon>
+						<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
+						<video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
+					</view>
+				</view>
+			</view>
+			<view class="item">
+				<view class="la">杩愮淮澶囨敞</view>
+				<view class="line">
+					<textarea v-model="param.checkInfo" placeholder="璇疯緭鍏�" placeholder-class="placeholder9" />
+				</view>
+			</view>
+		</view>
+		<view class="sub_btn">
+			鎻愪氦
+		</view>
+		<!--  -->
+		<u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
+			<view class="sel_upload_wrap">
+				<view class="btn" @click="uploadImage">閫夋嫨鍥剧墖</view>
+				<view class="btn" @click="uploadVideo">閫夋嫨瑙嗛</view>
+			</view>
+		</u-popup>
+		<!--  -->
+		<u-popup :show="showModal" @close="showModal = false" :safeAreaInsetBottom="true" :round="10" closeable closeOnClickOverlay>
+			<view class="appr_modal">
+				<view class="title">璇烽�夋嫨璁惧</view>
+				<view class="search_wrap">
+					<image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
+					<input v-model="searchValue" @confirm="getDevice()" type="text" placeholder="鎼滅储璁惧鍚嶇О/缂栧彿" placeholder-class="placeholder9" />
+				</view>
+				<view class="modal_list">
+					<view class="item">
+						<view class="name">璁惧name</view>
+						<image src="@/static/radioed.png" mode=""></image>
+					</view>
+				</view>
+				<view class="sub_btn">
+					纭畾閫夋嫨
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import {
+		uploadUrl
+	} from '@/api'
+	import dayjs from 'dayjs';
+	export default {
+		data() {
+			return {
+				param: {status: 0},
+				showUpload: false,
+				showModal: false,
+				dealFileList: [],
+				
+				searchValue: '',
+				deviceList: [],
+				activeDevice: {}
+			};
+		},
+		methods: {
+			getDevice(){
+				
+			},
+			statusChange(val){
+				this.param.status = val
+			},
+			fileDel(str, i) {
+				this[str].splice(i, 1);
+			},
+			uploadImage() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseImage({
+					count: 4,
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						const tempFilePaths = chooseImageRes.tempFilePaths;
+						let imgs = tempFilePaths.map((value, index) => {
+							return {
+								name: 'file',
+								uri: value
+							};
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							files: imgs,
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							header: {
+								Dm_user_token: token
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 0;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							fail(err) {
+								console.log('err', err);
+							},
+							complete() {
+								uni.hideLoading();
+								// if (i === chooseImageRes.tempFilePaths.length - 1) {
+								//   uni.hideLoading()
+								// }
+							}
+						});
+					}
+				});
+			},
+			uploadVideo() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseVideo({
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							filePath: chooseImageRes.tempFilePath,
+							header: {
+								Dm_user_token: token
+							},
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 1;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							complete() {
+								uni.hideLoading();
+							}
+						});
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.list {
+
+		.item {
+			.la {
+				margin-top: 30rpx;
+			}
+
+			.line {
+				display: flex;
+				align-items: center;
+				.icon{
+					width: 52rpx;
+					height: 52rpx;
+					margin-left: 40rpx;
+				}
+				textarea {
+					box-sizing: border-box;
+					width: 690rpx;
+					min-height: 160rpx;
+					background-color: #f7f7f7;
+					font-size: 28rpx;
+					color: #333333;
+					padding: 24rpx;
+					border-radius: 8rpx;
+					margin-bottom: 30rpx;
+					margin-top: 20rpx;
+				}
+			}
+
+			.sel_wrap {
+				flex: 1;
+				height: 90rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				border-bottom: 1rpx solid #E5E5E5;
+			}
+			.radio_wrap{
+				margin-top: 20rpx;
+				width: 100%;
+				display: flex;
+				justify-content: space-between;
+				.ite{
+					width: 216rpx;
+					height: 68rpx;
+					background: #F7F7F7;
+					border-radius: 36rpx;
+					font-size: 30rpx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+				.active{
+					color: $primaryColor;
+					border-color: $primaryColor;
+					background: rgba(0,104,255,0.1);
+				}
+			}
+			.upload_wrap {
+				display: flex;
+				flex-wrap: wrap;
+				margin-bottom: 30rpx;
+			}
+
+			.upload_file {
+				margin-top: 24rpx;
+				width: 156rpx;
+				height: 156rpx;
+				margin-right: 20rpx;
+				border: 2rpx solid #e5e5e5;
+				background: #f7f7f7;
+				color: #666666;
+				font-size: 22rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				position: relative;
+
+				&:nth-of-type(4n) {
+					margin-right: 0;
+				}
+
+				.close {
+					position: absolute;
+					right: -20rpx;
+					top: -20rpx;
+					z-index: 9999;
+				}
+
+				image {
+					width: 100%;
+					height: 100%;
+				}
+
+				video {
+					width: 100%;
+					height: 100%;
+				}
+			}
+
+		}
+	}
+	.sel_upload_wrap {
+		width: 100%;
+		border-top: 1px solid #333333;
+		box-shadow: 0 1 1 #333333;
+
+		.btn {
+			height: 90rpx;
+			line-height: 90rpx;
+			text-align: center;
+		}
+	}
+	.sub_btn {
+		position: fixed;
+		bottom: 68rpx;
+		left: 40rpx;
+		width: 670rpx;
+		height: 88rpx;
+		background: $primaryColor;
+		box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
+		border-radius: 44rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #FFFFFF;
+	}
+	.appr_modal {
+		padding: 36rpx 30rpx 0;
+		height: calc( 100vh - 120rpx );
+		.title {
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			margin-bottom: 40rpx;
+			text-align: center;
+		}
+		
+		.search_wrap {
+			display: flex;
+			align-items: center;
+			width: 100%;
+			height: 76rpx;
+			background: #f2f2f2;
+			border-radius: 38rpx;
+			padding-left: 30rpx;
+			input{
+				flex: 1;
+			}
+			.search {
+				width: 28rpx;
+				height: 28rpx;
+			}
+		}
+		.modal_list{
+			height: calc( 100% - 360rpx );
+			.item{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				height: 100rpx;
+				font-size: 30rpx;
+				border-bottom: 1px solid #E5E5E5;
+				image{
+					width: 40rpx;
+					height: 40rpx;
+				}
+			}
+			.active{
+				color: $primaryColor;
+			}
+		}
+		
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/operation/record.vue b/h5/pages/operation/record.vue
new file mode 100644
index 0000000..818efb9
--- /dev/null
+++ b/h5/pages/operation/record.vue
@@ -0,0 +1,134 @@
+<template>
+	<view class="main_app">
+		<view class="head_wrap">
+			<view class="search_wrap">
+				<image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
+				<input v-model="param.keyword" @confirm="getList()" type="text" placeholder="鎼滅储璁惧鍚嶇О/缂栧彿" placeholder-class="placeholder9" />
+			</view>
+			<view class="name_wrap" @click="showModal = true">
+				<view class="name">杩愮淮浜�</view>
+				<u-icon :name="showModal  ? 'arrow-right' : 'arrow-down'" color="#999999" size="12"></u-icon>
+			</view>
+		</view>
+		<!--  -->
+		<view class="list">
+			<view class="item" v-for="item in 10" @click="itemClick(item)">
+				<image src="@/static/side/ic_shuiyu@2x.png" class="icon"></image>
+				<view class="content">
+					<view class="name_wrap">
+						<view class="name">
+							<text class="device">xx璁惧</text>
+							<text>D20231</text>
+						</view>
+						<view class="status red">姝e父</view>
+					</view>
+					<view class="line">杩愮淮浜猴細xxx</view>
+					<view class="line">杩愮淮鏃堕棿锛�121212</view>
+				</view>
+
+			</view>
+		</view>
+		<!--  -->
+		<u-picker :show="showModal" keyName="name" @cancel="showModal = false" @confirm='confirm'
+			:columns="columns"></u-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				param: {},
+				columns: [],
+				showModal: false
+			};
+		},
+		methods: {
+			getList() {},
+			confirm() {
+				this.showModal = false
+			},
+			itemClick() {
+				uni.navigateTo({
+					url: '/pages/operation/detail'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.main_app{
+		padding: 0 30rpx;
+	}
+	.head_wrap {
+		display: flex;
+		align-items: center;
+
+		.search_wrap {
+			display: flex;
+			align-items: center;
+			width: 540rpx;
+			height: 76rpx;
+			background: #F7F7F7;
+			border-radius: 38rpx;
+			padding-left: 30rpx;
+			input{
+				flex: 1;
+			}
+			.search {
+				width: 28rpx;
+				height: 28rpx;
+			}
+		}
+
+		.name_wrap {
+			display: flex;
+			align-items: center;
+			margin-left: 12rpx;
+			justify-content: flex-end;
+			flex: 1;
+		}
+	}
+
+	.list {
+		.item {
+			display: flex;
+			height: 228rpx;
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #E5E5E5;
+			.icon {
+				width: 80rpx;
+				height: 80rpx;
+				margin-right: 24rpx;
+			}
+
+			.content {
+				flex: 1;
+				color: #666666;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				.name_wrap{
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					.name{
+						display: flex;
+						align-items: flex-end;
+						font-size: 26rpx;
+						.device{
+							font-weight: 600;
+							font-size: 34rpx;
+							color: #222222;
+							margin-right: 6rpx;
+						}
+					}
+					.status{
+						color: $primaryColor;
+					}
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/polling/detail.vue b/h5/pages/polling/detail.vue
new file mode 100644
index 0000000..e2415e9
--- /dev/null
+++ b/h5/pages/polling/detail.vue
@@ -0,0 +1,204 @@
+<template>
+	<view class="main_app">
+		<view class="head_bg"></view>
+		<view class="info">
+			<image v-if="true" class="icon" src="@/static/side/ic_dabiaoed.png" mode=""></image>
+			<image v-else class="icon" src="@/static/side/ic_dabiao.png" mode=""></image>
+			<view class="head">
+				<view class="name">宸℃璁″垝</view>
+				<view class="status">寰呭紑濮�</view>
+			</view>
+			<view class="line">
+				<view class="la">浠诲姟鏃ユ湡锛�</view>
+				<view class="val">2023-23-23</view>
+			</view>
+			<view class="line">
+				<view class="la">鎵ц鏃堕棿锛�</view>
+				<view class="val">2023-23-23</view>
+			</view>
+			<view class="line">
+				<view class="la">瀹屾垚鎯呭喌锛�</view>
+				<view class="val">2023-23-23</view>
+			</view>
+		</view>
+		<view class="title">宸℃鐐瑰垪琛�(1)</view>
+		<view class="list">
+			<view class="item" v-for="i in 10" @click="itemClick()">
+				<view class="icon"></view>
+				<view class="content">
+					<view class="head">
+						<view>宸℃鐐�10</view>
+						<view class="status">寰呭贰妫�</view>
+					</view>
+					<view class="desc">宸℃鍐呭鏈�澶氬睍绀轰袱琛岋紝澶氱殑鐪佺暐宸℃鍐呭鏈�澶氬睍绀轰袱琛岋紝澶氱殑鐪佺暐宸℃鍐呭鏈�澶氬睍绀轰袱琛岋紝澶氱殑鐪佺暐宸℃鍐呭鏈�澶氬睍绀轰袱琛岋紝澶氱殑鐪佺暐宸℃鍐呭鏈�澶氬睍绀轰袱琛岋紝澶氱殑鐪佺暐宸℃鍐呭鏈�澶氬睍绀轰袱琛岋紝澶氱殑鐪佺暐
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="footer">
+			<view class="sub_btn">鎵爜宸℃</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			itemClick() {
+				uni.navigateTo({
+					url: '/pages/polling/point'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: #F7F7F7;
+	}
+
+	.main_app {
+		padding: 30rpx;
+
+		.head_bg {
+			background: linear-gradient(180deg, #008BFF 0%, rgba(247, 247, 247, 0) 100%);
+			height: 240rpx;
+			width: 750rpx;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+
+		.info {
+			width: 690rpx;
+			box-shadow: 0rpx 4rpx 16rpx 0rpx #E5E5E5;
+			border-radius: 20rpx;
+			opacity: 0.95;
+			padding: 30rpx 30rpx 10rpx;
+			margin-bottom: 40rpx;
+			background: linear-gradient(#FFFFFF 0%, #FFFFFF 48%, #F0F5FF 100%);
+			position: relative;
+			.icon{
+				position: absolute;
+				right: 30rpx;
+				bottom: 30rpx;
+				width: 160rpx;
+				height: 122rpx;
+			}
+			.head {
+				display: flex;
+				justify-content: space-between;
+				margin-bottom: 30rpx;
+
+				.name {
+					font-weight: 600;
+					font-size: 34rpx;
+				}
+
+				.status {
+					color: $primaryColor;
+				}
+			}
+
+			.line {
+				display: flex;
+				margin-bottom: 20rpx;
+
+				.la {
+					color: #666666;
+				}
+			}
+		}
+
+		.title {
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			margin-bottom: 30rpx;
+		}
+
+		.list {
+			height: calc( 100vh - 720rpx ) ;
+			overflow: auto;
+			.item {
+				width: 690rpx;
+				height: 188rpx;
+				background: linear-gradient(#FFFFFF 0%, #FFFFFF 48%, #F0F5FF 100%);
+				box-shadow: 0rpx 4rpx 12rpx 0rpx #E5E5E5;
+				border-radius: 12rpx;
+				opacity: 0.95;
+				display: flex;
+				padding: 20rpx 30rpx 0 16rpx;
+				margin-bottom: 20rpx;
+
+				.icon {
+					width: 10rpx;
+					height: 148rpx;
+					background: $primaryColor;
+					border-radius: 6rpx;
+					margin-right: 24rpx;
+				}
+
+				.content {
+					flex: 1;
+
+					.head {
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						font-weight: 500;
+						font-size: 32rpx;
+						margin-bottom: 16rpx;
+
+						.status {
+							offset-anchor: 28rpx;
+							color: $primaryColor;
+							font-weight: 400;
+						}
+					}
+
+					.desc {
+						font-size: 26rpx;
+						color: #666666;
+						display: -webkit-box;
+						-webkit-line-clamp: 2;
+						-webkit-box-orient: vertical;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						width: 100%;
+					}
+				}
+			}
+		}
+		.footer{
+			position: fixed;
+			bottom: 0rpx;
+			left: 0rpx;
+			width: 750rpx;
+			height: 172rpx;
+			background-color: #fff;
+			padding: 20rpx 40rpx;
+			.sub_btn {
+				
+				width: 670rpx;
+				height: 88rpx;
+				background: $primaryColor;
+				box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
+				border-radius: 44rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-weight: 500;
+				font-size: 32rpx;
+				color: #FFFFFF;
+			}
+		}
+		
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/polling/point.vue b/h5/pages/polling/point.vue
new file mode 100644
index 0000000..6a97c8a
--- /dev/null
+++ b/h5/pages/polling/point.vue
@@ -0,0 +1,378 @@
+<template>
+	<view class="main_app">
+		<view class="info">
+			<view class="head">
+				<view class="">宸℃鐐�</view>
+				<view class="status">宸插贰妫�</view>
+			</view>
+			<template v-if="false">
+				<view class="line">
+					<div class="la">宸℃缁撴灉锛�</div>
+					<div class="val">姝e父</div>
+				</view>
+				<view class="line">
+					<div class="la">宸℃鏃堕棿锛�</div>
+					<div class="val">2022</div>
+				</view>
+			</template>
+			<template v-else>
+				<view class="desc">
+					宸℃鍐呭
+				</view>
+			</template>
+		</view>
+		<!--  -->
+		<view v-if="false" class="content">
+			<view class="title">宸℃璁板綍</view>
+			<view class="desc">宸茬粡鏇存崲鐏场</view>
+			<view class="line line_s">
+				<view class="la">宸℃浜猴細</view>
+				<view class="val">xxx</view>
+			</view>
+			<view class="line line_s">
+				<view class="la">宸℃鏃堕棿锛�</view>
+				<view class="val">xxx</view>
+			</view>
+		</view>
+		<view v-else class="content">
+			<view class="title">宸℃澶勭悊</view>
+			<view class="appr_modal">
+				<view class="df_sb">
+					<view>澶勭悊鏃堕棿</view>
+					<view class="df_ac" @click="isShowHandleDate = true" v-if="handleParam.dealTime">
+						{{ handleParam.dealTime }}
+						<u-icon name="arrow-right"></u-icon>
+					</view>
+					<view @click="isShowHandleDate = true" v-else class="placeholder9 df_ac">
+						璇烽�夋嫨
+						<u-icon name="arrow-right"></u-icon>
+					</view>
+				</view>
+
+				<view class="label">
+					<text>*</text>
+					涓婁紶鍥剧墖/瑙嗛
+				</view>
+				<view class="upload_wrap">
+					<view class="adduser_list_item_ipt1_upload" @click="showUpload = true">
+						<u-icon name="plus" color="rgb(153, 153, 153)" size="28"></u-icon>
+						<view class="mt6">鍥剧墖/瑙嗛</view>
+					</view>
+					<view class="adduser_list_item_ipt1_upload" v-for="(item, i) in dealFileList" :key="i">
+						<u-icon class="close" size="20" name="close-circle-fill" color="red"
+							@click="fileDel('dealBeforeFileList', i)"></u-icon>
+						<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
+						<video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
+					</view>
+				</view>
+
+				<view class="label">澶勭悊璇存槑</view>
+				<textarea v-model="handleParam.checkInfo" placeholder="璇峰~鍐欏鐞嗚鏄�" placeholder-class="placeholder9" />
+			</view>
+		</view>
+		<view class="sub_btn">纭宸℃</view>
+		<!--  -->
+		<u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
+			<view class="sel_upload_wrap">
+				<view class="btn" @click="uploadImage">閫夋嫨鍥剧墖</view>
+				<view class="btn" @click="uploadVideo">閫夋嫨瑙嗛</view>
+			</view>
+		</u-popup>
+		<!--  -->
+		<u-datetime-picker :minDate="new Date().getTime()" :show="isShowHandleDate" @confirm="confirmHandleDate"
+			@cancel="isShowHandleDate = false" mode="datetime"></u-datetime-picker>
+	</view>
+</template>
+
+<script>
+	import {
+		uploadUrl
+	} from '@/api'
+	import dayjs from 'dayjs';
+	export default {
+		data() {
+			return {
+				showUpload: false,
+				isShowHandle: false,
+				isShowHandleDate: false,
+				handleParam: {},
+				dealFileList: []
+			};
+		},
+		methods: {
+			onSubmit() {
+
+			},
+			callPhone() {
+				uni.makePhoneCall({
+					phoneNumber: '114' //浠呬负绀轰緥
+				});
+			},
+			confirmHandleDate(e) {
+				this.$set(this.handleParam, 'dealTime', dayjs(e.value).format('YYYY-MM-DD HH:mm:ss'));
+				this.isShowHandleDate = false;
+			},
+			fileDel(str, i) {
+				this[str].splice(i, 1);
+			},
+			uploadImage() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseImage({
+					count: 4,
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						const tempFilePaths = chooseImageRes.tempFilePaths;
+						let imgs = tempFilePaths.map((value, index) => {
+							return {
+								name: 'file',
+								uri: value
+							};
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							files: imgs,
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							header: {
+								Dm_user_token: token
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 0;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							fail(err) {
+								console.log('err', err);
+							},
+							complete() {
+								uni.hideLoading();
+								// if (i === chooseImageRes.tempFilePaths.length - 1) {
+								//   uni.hideLoading()
+								// }
+							}
+						});
+					}
+				});
+			},
+			uploadVideo() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseVideo({
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							filePath: chooseImageRes.tempFilePath,
+							header: {
+								Dm_user_token: token
+							},
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 1;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							complete() {
+								uni.hideLoading();
+							}
+						});
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.main_app {
+		.info {
+			margin: 0 -30rpx;
+			border-bottom: 14rpx solid #f7f7f7;
+			padding: 30rpx;
+
+			.head {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				font-weight: 600;
+				font-size: 34rpx;
+				margin-bottom: 30rpx;
+
+				.status {
+					font-weight: 400;
+					font-size: 28rpx;
+					color: #999999;
+				}
+			}
+		}
+
+		.line {
+			display: flex;
+			margin-top: 20rpx;
+
+			.la {
+				color: #666666;
+
+			}
+		}
+
+		.desc {
+			padding: 24rpx 30rpx;
+			width: 690rpx;
+			background: #F7F7F7;
+			border-radius: 12rpx;
+		}
+
+		.line_s {
+			justify-content: space-between;
+		}
+
+		.title {
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			margin: 30rpx 0;
+		}
+	}
+
+	.sel_upload_wrap {
+		width: 100%;
+		border-top: 1px solid #333333;
+		box-shadow: 0 1 1 #333333;
+
+		.btn {
+			height: 90rpx;
+			line-height: 90rpx;
+			text-align: center;
+		}
+	}
+	.sub_btn{
+		position: fixed;
+		bottom: 68rpx;
+		left: 40rpx;
+		width: 670rpx;
+		height: 88rpx;
+		background: $primaryColor;
+		box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0,104,255,0.3);
+		border-radius: 44rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #FFFFFF;
+	}
+	.appr_modal {
+		.label {
+			text {
+				color: #ed4545;
+			}
+		}
+
+		.df_sb {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			height: 90rpx;
+			border-bottom: 1rpx solid #e4e4e4;
+			margin-bottom: 30rpx;
+		}
+
+		.back_footer {
+			display: flex;
+
+			.btn {
+				flex: 1;
+				height: 88rpx;
+				line-height: 88rpx;
+				background: #ffffff;
+				border-radius: 44rpx;
+				border: 1rpx solid #999999;
+				font-size: 32rpx;
+				text-align: center;
+				margin: 16rpx 8rpx;
+			}
+
+			.agree {
+				background: $uni-color-primary;
+				color: #fff;
+				border: 1rpx solid $uni-color-primary;
+			}
+		}
+
+		textarea {
+			box-sizing: border-box;
+			width: 690rpx;
+			min-height: 200rpx;
+			background-color: #f7f7f7;
+			font-size: 28rpx;
+			color: #333333;
+			padding: 24rpx;
+			border-radius: 8rpx;
+			margin-bottom: 30rpx;
+		}
+
+		.upload_wrap {
+			display: flex;
+			flex-wrap: wrap;
+			margin-bottom: 30rpx;
+		}
+
+		.adduser_list_item_ipt1_upload {
+			margin-top: 24rpx;
+			width: 156rpx;
+			height: 156rpx;
+			margin-right: 24rpx;
+			border: 2rpx solid #e5e5e5;
+			background: #f7f7f7;
+			color: #666666;
+			font-size: 22rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			position: relative;
+
+			.close {
+				position: absolute;
+				right: -20rpx;
+				top: -20rpx;
+				z-index: 9999;
+			}
+
+			image {
+				width: 100%;
+				height: 100%;
+			}
+
+			video {
+				width: 100%;
+				height: 100%;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/polling/task.vue b/h5/pages/polling/task.vue
new file mode 100644
index 0000000..17f1208
--- /dev/null
+++ b/h5/pages/polling/task.vue
@@ -0,0 +1,213 @@
+<template>
+	<view class="main_app">
+<!-- 		<view class="head_wrap">
+			<view class="search_wrap">
+				<image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
+				<input v-model="param.keyword" @confirm="getList()" type="text" placeholder="鎼滅储妤煎畤/鎴块棿鍚嶇О" placeholder-class="placeholder9" />
+			</view>
+		</view> -->
+		<!--  -->
+		<view class="tabs">
+			<view class="tab" :class="{active: activeTab == 0}" @click="tabsClick(0)">
+				<text>寰呭鐞�</text>
+				<text class="border"></text>
+			</view>
+			<view class="tab" :class="{active: activeTab == 1}" @click="tabsClick(1)">
+				<text>宸插鐞�</text>
+				<text class="border"></text>
+			</view>
+			<view class="tab" @click="allClick">
+				<view class="name">
+					<image v-if="selectAll" class="icon" src="@/static/checked.png" mode=""></image>
+					<image v-else class="icon" src="@/static/check.png" mode=""></image>
+					<text>鏌ョ湅鍏ㄩ儴</text>
+				</view>
+				<text class="border"></text>
+			</view>
+		</view>
+		<!--  -->
+		<view class="list">
+			<view class="item" v-for="item in 10" @click="itemClick(item)">
+				<image v-if="item.stats == 1" src="@/static/side/xunjianed.png" class="icon"></image>
+				<image v-else src="@/static/side/xunjian.png" class="icon"></image>
+				<view class="content">
+					<view class="name_wrap line">
+						<view class="name">宸℃閰掑晩</view>
+						<view class="status">寰呭紑濮�</view>
+					</view>
+					<view class="line">浠诲姟鏃ユ湡锛歺xx</view>
+					<view class="line">鎵ц鏃堕棿锛�121212</view>
+					<view class="line">
+						<view>瀹屾垚鎯呭喌锛�121212</view>
+						<view class="btn">
+							<image src="@/static/side/ic_saoma@2x.png" class="saoma" mode=""></image>
+							<view>鎵爜宸℃</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!--  -->
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				param: {},
+				activeTab: 0,
+				selectAll: false
+			};
+		},
+		methods: {
+			tabsClick(val) {
+				this.activeTab = val
+			},
+			allClick() {
+				this.selectAll = !this.selectAll
+			},
+			itemClick() {
+				uni.navigateTo({
+					url: '/pages/polling/detail'
+				})
+			},
+			getList() {
+				console.log('---');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.main_app{
+		padding: 0 30rpx;
+	}
+	.tabs{
+		display: flex;
+		width: 750rpx;
+		margin: 12rpx -30rpx 0;
+		border-bottom: 1rpx solid #E5E5E5;
+		.tab{
+			font-size: 30rpx;
+			color: #666666;
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: flex-end;
+			height: 88rpx;
+			.name{
+				display: flex;
+				align-items: center;
+			}
+			.icon{
+				width: 28rpx;
+				height: 28rpx;
+				margin-right: 10rpx;
+			}
+			.border{
+				width: 54rpx;
+				height: 6rpx;
+				background-color: #fff;
+				border-radius: 3rpx;
+				margin-top: 24rpx;
+			}
+		}
+		.active{
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			.border{
+				background-color: $primaryColor;
+			}
+			
+		}
+		
+	}
+	.head_wrap {
+		display: flex;
+		align-items: center;
+
+		.search_wrap {
+			display: flex;
+			align-items: center;
+			width: 100%;
+			height: 76rpx;
+			background: #F7F7F7;
+			border-radius: 38rpx;
+			padding-left: 30rpx;
+			input{
+				flex: 1;
+			}
+			.search {
+				width: 28rpx;
+				height: 28rpx;
+			}
+		}
+
+	}
+
+	.list {
+		.item {
+			display: flex;
+			// height: 290rpx;
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #E5E5E5;
+			.icon {
+				width: 80rpx;
+				height: 80rpx;
+				margin-right: 24rpx;
+			}
+
+			.content {
+				flex: 1;
+				color: #666666;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				.line{
+					margin-bottom: 20rpx;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					.btn{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						width: 180rpx;
+						height: 60rpx;
+						background: $primaryColor;
+						color: #fff;
+						font-size: 26rpx;
+						box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0,104,255,0.3);
+						border-radius: 30rpx;
+						.saoma{
+							width: 28rpx;
+							height: 28rpx;
+							margin-right: 8rpx;
+						}
+					}
+					&:nth-last-child(1){
+						margin-bottom: 0;
+					}
+				}
+				.name_wrap{
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					.name{
+						display: flex;
+						align-items: flex-end;
+						font-weight: 600;
+						font-size: 34rpx;
+						color: #222222;
+					}
+					.status{
+						color: $primaryColor;
+					}
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/workOrder/detail.vue b/h5/pages/workOrder/detail.vue
new file mode 100644
index 0000000..1b763a0
--- /dev/null
+++ b/h5/pages/workOrder/detail.vue
@@ -0,0 +1,480 @@
+<template>
+	<view>
+		<view class="main_info">
+			<view class="title">
+				<text>闃滃畞鏂囦綋涓績/A搴�/401</text>
+				<text class="status">寰呭鐞�</text>
+			</view>
+			<view class="desc">瑗胯竟璧板粖鐨勪竴涓《鐏潖浜嗭紝涓嶄寒闇�瑕佺淮淇タ杈�</view>
+			<view class="file_list">
+				<view class="file">
+
+				</view>
+			</view>
+			<view class="content">
+				<view class="line">
+					<view class="la">宸ュ崟绫诲瀷锛�</view>
+					<view class="val">1111</view>
+				</view>
+				<view class="line">
+					<view class="la">涓婃姤浜猴細</view>
+					<view class="val">1111</view>
+				</view>
+				<view class="line">
+					<view class="la">鑱旂郴鐢佃瘽锛�</view>
+					<view class="val">1111</view>
+				</view>
+				<view class="line">
+					<view class="la">涓婃姤鏃堕棿锛�</view>
+					<view class="val">1111</view>
+				</view>
+				<view class="line">
+					<view class="la">涓婇棬鏃堕棿锛�</view>
+					<view class="val">1111</view>
+				</view>
+			</view>
+			<view class="result_wrap">
+				<div class="title">澶勭悊缁撴灉</div>
+				<view class="file_list">
+					<view class="file">
+
+					</view>
+				</view>
+				<view class="content">
+					宸叉洿鎹㈢伅娉″拰鐏僵宸叉洿鎹㈢伅娉″拰鐏僵宸叉洿鎹㈢伅
+				</view>
+				<view class="line">
+					<view class="la">澶勭悊浜猴細</view>
+					<view class="val">{{ 1111 }}</view>
+				</view>
+				<view class="line">
+					<view class="la">澶勭悊鏃堕棿锛�</view>
+					<view class="val">{{ 1111 }}</view>
+				</view>
+			</view>
+		</view>
+		<!--  -->
+		<view class="btns">
+			<view class="btn">
+				<image src="@/static/side/phoneed.png" class="icon"></image>
+				<text>涓婃姤浜�</text>
+			</view>
+			<view class="btn active" @click="isShowHandle = true">鍘诲鐞�</view>
+		</view>
+		<!--  -->
+		<u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
+			<view class="sel_upload_wrap">
+				<view class="btn" @click="uploadImage">閫夋嫨鍥剧墖</view>
+				<view class="btn" @click="uploadVideo">閫夋嫨瑙嗛</view>
+			</view>
+		</u-popup>
+		<!--  -->
+		<!-- 宸ュ崟澶勭悊 -->
+		<u-popup :show="isShowHandle" :round="10" :safeAreaInsetBottom="true" mode="bottom" closeable @close="isShowHandle = false">
+			<view class="appr_modal">
+				<view class="title">宸ュ崟澶勭悊</view>
+				<view class="df_sb">
+					<view>澶勭悊鏃堕棿</view>
+					<view class="df_ac" @click="isShowHandleDate = true" v-if="handleParam.dealTime">
+						{{ handleParam.dealTime }}
+						<u-icon name="arrow-right"></u-icon>
+					</view>
+					<view @click="isShowHandleDate = true" v-else class="placeholder9 df_ac">
+						璇烽�夋嫨
+						<u-icon name="arrow-right"></u-icon>
+					</view>
+				</view>
+
+				<view class="label">
+					<text>*</text>
+					涓婁紶鍥剧墖/瑙嗛
+				</view>
+				<view class="upload_wrap">
+					<view class="adduser_list_item_ipt1_upload" @click="showUpload = true">
+						<u-icon name="plus" color="rgb(153, 153, 153)" size="28"></u-icon>
+						<view class="mt6">鍥剧墖/瑙嗛</view>
+					</view>
+					<view class="adduser_list_item_ipt1_upload" v-for="(item, i) in dealFileList" :key="i">
+						<u-icon class="close" size="20" name="close-circle-fill" color="red"
+							@click="fileDel('dealBeforeFileList', i)"></u-icon>
+						<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
+						<video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
+					</view>
+				</view>
+
+				<view class="label">澶勭悊璇存槑</view>
+				<textarea v-model="handleParam.checkInfo" placeholder="璇峰~鍐欏鐞嗚鏄�" placeholder-class="placeholder9" />
+				<view class="back_footer">
+					<view class="btn" @click="isShowHandle = false">鍙栨秷</view>
+					<view class="btn agree" @click="onSubmit">鎻愪氦</view>
+				</view>
+			</view>
+		</u-popup>
+		<!--  -->
+		<u-datetime-picker :minDate="new Date().getTime()" :show="isShowHandleDate" @confirm="confirmHandleDate"
+			@cancel="isShowHandleDate = false" mode="datetime"></u-datetime-picker>
+		<!--  -->
+	</view>
+</template>
+
+<script>
+	import {
+		uploadUrl
+	} from '@/api'
+	import dayjs from 'dayjs';
+	export default {
+		data() {
+			return {
+				showUpload: false,
+				isShowHandle: false,
+				isShowHandleDate: false,
+				handleParam: {},
+				dealFileList: []
+			};
+		},
+		methods: {
+			onSubmit() {
+
+			},
+			callPhone() {
+				uni.makePhoneCall({
+					phoneNumber: '114' //浠呬负绀轰緥
+				});
+			},
+			confirmHandleDate(e) {
+				this.$set(this.handleParam, 'dealTime', dayjs(e.value).format('YYYY-MM-DD HH:mm:ss'));
+				this.isShowHandleDate = false;
+			},
+			fileDel(str, i) {
+				this[str].splice(i, 1);
+			},
+			uploadImage() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseImage({
+					count: 4,
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						const tempFilePaths = chooseImageRes.tempFilePaths;
+						let imgs = tempFilePaths.map((value, index) => {
+							return {
+								name: 'file',
+								uri: value
+							};
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							files: imgs,
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							header: {
+								Dm_user_token: token
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 0;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							fail(err) {
+								console.log('err', err);
+							},
+							complete() {
+								uni.hideLoading();
+								// if (i === chooseImageRes.tempFilePaths.length - 1) {
+								//   uni.hideLoading()
+								// }
+							}
+						});
+					}
+				});
+			},
+			uploadVideo() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseVideo({
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							filePath: chooseImageRes.tempFilePath,
+							header: {
+								Dm_user_token: token
+							},
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 1;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							complete() {
+								uni.hideLoading();
+							}
+						});
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	page {
+		::v-deep .u-toolbar {
+			border-top: 1rpx solid #cccccc;
+		}
+	}
+
+	.main_info {
+		padding: 0 30rpx;
+
+		.title {
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			height: 90rpx;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+
+			.status {
+				font-weight: 400;
+				font-size: 28rpx;
+				color: $primaryColor;
+			}
+		}
+
+		.file_list {
+			display: flex;
+			flex-wrap: wrap;
+
+			.file {
+				width: 156rpx;
+				height: 156rpx;
+				border-radius: 12rpx;
+				margin-right: 22rpx;
+				margin-bottom: 22rpx;
+
+				&:nth-of-type(4n) {
+					margin-right: 0;
+				}
+			}
+		}
+
+		.desc {
+			margin: 0rpx 0 30rpx;
+		}
+
+		.content {
+			margin-top: 8rpx;
+			padding: 24rpx 30rpx;
+			background: #F7F7F7;
+			border-radius: 12rpx;
+
+			.line {
+				display: flex;
+				margin-bottom: 20rpx;
+				color: #333333;
+
+				&:nth-last-child(1) {
+					margin-bottom: 0;
+				}
+
+				.la {
+					color: #666666;
+					width: 140rpx;
+				}
+			}
+		}
+
+		.result_wrap {
+			border-top: 20rpx solid #f7f7f7;
+			margin: 20rpx -30rpx 0;
+			padding: 0 30rpx;
+
+			.line {
+				margin-top: 30rpx;
+				height: 42rpx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				.la {
+					color: #666666;
+				}
+			}
+		}
+	}
+
+	.btns {
+		position: fixed;
+		bottom: 68rpx;
+		left: 0;
+		width: 750rpx;
+		padding: 0 40rpx;
+		display: flex;
+		justify-content: space-between;
+
+		.btn {
+			width: 224rpx;
+			height: 88rpx;
+			background: #FFFFFF;
+			box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
+			border-radius: 44rpx;
+			border: 2rpx solid $primaryColor;
+			color: $primaryColor;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-weight: 500;
+			font-size: 32rpx;
+
+			.icon {
+				width: 32rpx;
+				height: 32rpx;
+				margin-right: 6rpx;
+			}
+		}
+
+		.active {
+			flex: 1;
+			margin-left: 20rpx;
+			color: #fff;
+			background-color: $primaryColor;
+		}
+	}
+
+	.sel_upload_wrap {
+		width: 100%;
+		border-top: 1px solid #333333;
+		box-shadow: 0 1 1 #333333;
+
+		.btn {
+			height: 90rpx;
+			line-height: 90rpx;
+			text-align: center;
+		}
+	}
+
+	.appr_modal {
+		padding: 36rpx 30rpx 0;
+
+		.title {
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			margin-bottom: 40rpx;
+			text-align: center;
+		}
+
+		.label {
+			text {
+				color: #ed4545;
+			}
+		}
+
+		.df_sb {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			height: 90rpx;
+			border-bottom: 1rpx solid #e4e4e4;
+			margin-bottom: 30rpx;
+		}
+
+		.back_footer {
+			display: flex;
+
+			.btn {
+				flex: 1;
+				height: 88rpx;
+				line-height: 88rpx;
+				background: #ffffff;
+				border-radius: 44rpx;
+				border: 1rpx solid #999999;
+				font-size: 32rpx;
+				text-align: center;
+				margin: 16rpx 8rpx;
+			}
+
+			.agree {
+				background: $uni-color-primary;
+				color: #fff;
+				border: 1rpx solid $uni-color-primary;
+			}
+		}
+
+		textarea {
+			box-sizing: border-box;
+			width: 690rpx;
+			min-height: 200rpx;
+			background-color: #f7f7f7;
+			font-size: 28rpx;
+			color: #333333;
+			padding: 24rpx;
+			border-radius: 8rpx;
+			margin-bottom: 30rpx;
+		}
+
+		.upload_wrap {
+			display: flex;
+			flex-wrap: wrap;
+			margin-bottom: 30rpx;
+		}
+
+		.adduser_list_item_ipt1_upload {
+			margin-top: 24rpx;
+			width: 156rpx;
+			height: 156rpx;
+			margin-right: 24rpx;
+			border: 2rpx solid #e5e5e5;
+			background: #f7f7f7;
+			color: #666666;
+			font-size: 22rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			position: relative;
+
+			.close {
+				position: absolute;
+				right: -20rpx;
+				top: -20rpx;
+				z-index: 9999;
+			}
+
+			image {
+				width: 100%;
+				height: 100%;
+			}
+
+			video {
+				width: 100%;
+				height: 100%;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/workOrder/edit.vue b/h5/pages/workOrder/edit.vue
new file mode 100644
index 0000000..2116212
--- /dev/null
+++ b/h5/pages/workOrder/edit.vue
@@ -0,0 +1,258 @@
+<template>
+	<view class="main_app">
+		<view class="list">
+			<view class="item">
+				<view class="la"><text class="red">*</text>浣嶇疆绫诲瀷</view>
+				<view class="line sel_wrap">
+					<view class="left" :class="param.name ? '' : 'placeholder9'">{{ param.name ? param.name : '璇烽�夋嫨' }}</view>
+					<u-icon name="arrow-right" color="#999999" size="15"></u-icon>
+				</view>
+			</view>
+			<view class="item">
+				<view class="la"><text class="red">*</text>閫夋嫨鍖哄煙</view>
+				<view class="line sel_wrap">
+					<view class="left" :class="param.name ? '' : 'placeholder9'">{{ param.name ? param.name : '璇烽�夋嫨' }}</view>
+					<u-icon name="arrow-right" color="#999999" size="15"></u-icon>
+				</view>
+			</view>
+			<view class="item">
+				<view class="la">涓婇棬鏃堕棿</view>
+				<view class="line sel_wrap">
+					<view class="left" :class="param.name ? '' : 'placeholder9'">{{ param.name ? param.name : '璇烽�夋嫨' }}</view>
+					<u-icon name="arrow-right" color="#999999" size="15"></u-icon>
+				</view>
+			</view>
+			<view class="item">
+				<view class="la">鎻忚堪</view>
+				<view class="line">
+					<textarea v-model="param.checkInfo" placeholder="璇疯緭鍏�" placeholder-class="placeholder9" />
+				</view>
+			</view>
+			<view class="item">
+				<view class="la">鐜板満鐓х墖</view>
+				<view class="upload_wrap">
+					<view class="upload_file" @click="showUpload = true">
+						<u-icon name="plus" color="rgb(153, 153, 153)" size="28"></u-icon>
+						<view class="mt6">鍥剧墖/瑙嗛</view>
+					</view>
+					<view class="upload_file" v-for="(item, i) in dealFileList" :key="i">
+						<u-icon class="close" size="20" name="close-circle-fill" color="red"
+							@click="fileDel('dealBeforeFileList', i)"></u-icon>
+						<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
+						<video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="sub_btn">鎻愪氦</view>
+		<!--  -->
+		<u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
+			<view class="sel_upload_wrap">
+				<view class="btn" @click="uploadImage">閫夋嫨鍥剧墖</view>
+				<view class="btn" @click="uploadVideo">閫夋嫨瑙嗛</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import {
+		uploadUrl
+	} from '@/api'
+	import dayjs from 'dayjs';
+	export default {
+		data() {
+			return {
+				param: {},
+				showUpload: false,
+				dealFileList: [],
+			};
+		},
+		methods: {
+			fileDel(str, i) {
+				this[str].splice(i, 1);
+			},
+			uploadImage() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseImage({
+					count: 4,
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						const tempFilePaths = chooseImageRes.tempFilePaths;
+						let imgs = tempFilePaths.map((value, index) => {
+							return {
+								name: 'file',
+								uri: value
+							};
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							files: imgs,
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							header: {
+								Dm_user_token: token
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 0;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							fail(err) {
+								console.log('err', err);
+							},
+							complete() {
+								uni.hideLoading();
+								// if (i === chooseImageRes.tempFilePaths.length - 1) {
+								//   uni.hideLoading()
+								// }
+							}
+						});
+					}
+				});
+			},
+			uploadVideo() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseVideo({
+					success: chooseImageRes => {
+						uni.showLoading({
+							title: '涓婁紶涓�',
+							mask: true
+						});
+						uni.uploadFile({
+							url: `${uploadUrl}`,
+							filePath: chooseImageRes.tempFilePath,
+							header: {
+								Dm_user_token: token
+							},
+							name: 'file',
+							formData: {
+								folder: 'HIDDEN_DANGER_FILE'
+							},
+							success: uploadFileRes => {
+								let res = JSON.parse(uploadFileRes.data);
+								if (res.data && res.data.length > 0) {
+									res.data.forEach(i => {
+										i.type = 1;
+										i.fileurl = i.imgaddr;
+										i.fileurlFull = i.url;
+										this.submitFileList.push(i);
+									});
+								}
+							},
+							complete() {
+								uni.hideLoading();
+							}
+						});
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.list {
+		
+		.item {
+			.la {
+				margin-top: 30rpx;
+			}
+
+			.line {
+
+				textarea {
+					box-sizing: border-box;
+					width: 690rpx;
+					min-height: 160rpx;
+					background-color: #f7f7f7;
+					font-size: 28rpx;
+					color: #333333;
+					padding: 24rpx;
+					border-radius: 8rpx;
+					margin-bottom: 30rpx;
+					margin-top: 20rpx;
+				}
+			}
+
+			.sel_wrap {
+				height: 90rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				border-bottom: 1rpx solid #E5E5E5;
+			}
+
+			.upload_wrap {
+				display: flex;
+				flex-wrap: wrap;
+				margin-bottom: 30rpx;
+			}
+
+			.upload_file {
+				margin-top: 24rpx;
+				width: 156rpx;
+				height: 156rpx;
+				margin-right: 20rpx;
+				border: 2rpx solid #e5e5e5;
+				background: #f7f7f7;
+				color: #666666;
+				font-size: 22rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				position: relative;
+				&:nth-of-type(4n){
+					margin-right: 0;
+				}
+				.close {
+					position: absolute;
+					right: -20rpx;
+					top: -20rpx;
+					z-index: 9999;
+				}
+
+				image {
+					width: 100%;
+					height: 100%;
+				}
+
+				video {
+					width: 100%;
+					height: 100%;
+				}
+			}
+
+		}
+	}
+	.sub_btn{
+		position: fixed;
+		bottom: 68rpx;
+		left: 40rpx;
+		width: 670rpx;
+		height: 88rpx;
+		background: $primaryColor;
+		box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0,104,255,0.3);
+		border-radius: 44rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #FFFFFF;
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/workOrder/list.vue b/h5/pages/workOrder/list.vue
new file mode 100644
index 0000000..0ea131f
--- /dev/null
+++ b/h5/pages/workOrder/list.vue
@@ -0,0 +1,188 @@
+<template>
+	<view class="main_app">
+		<view class="head_wrap">
+			<view class="search_wrap">
+				<image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
+				<input v-model="param.keyword" @confirm="getList()" type="text" placeholder="鎼滅储妤煎畤/鎴块棿鍚嶇О" placeholder-class="placeholder9" />
+			</view>
+		</view>
+		<!--  -->
+		<view class="tabs">
+			<view class="tab" :class="{active: activeTab == 0}" @click="tabsClick(0)">
+				<text>寰呭鐞�</text>
+				<text class="border"></text>
+			</view>
+			<view class="tab" :class="{active: activeTab == 1}" @click="tabsClick(1)">
+				<text>宸插鐞�</text>
+				<text class="border"></text>
+			</view>
+			<view class="tab" @click="allClick">
+				<view class="name">
+					<image v-if="selectAll" class="icon" src="@/static/checked.png" mode=""></image>
+					<image v-else class="icon" src="@/static/check.png" mode=""></image>
+					<text>鏌ョ湅鍏ㄩ儴</text>
+				</view>
+				<text class="border"></text>
+			</view>
+		</view>
+		<!--  -->
+		<view class="list">
+			<view class="item" v-for="item in 10" @click="itemClick(item)">
+				<image v-if="item.stats == 1" src="@/static/side/workordered.png" class="icon"></image>
+				<image v-else src="@/static/side/workorder.png" class="icon"></image>
+				<view class="content">
+					<view class="name_wrap line">
+						<view class="name">A搴�/401</view>
+						<view class="status">宸插鐞�</view>
+					</view>
+					<view class="line">宸ュ崟绫诲瀷锛歺xx</view>
+					<view class="line">鎶ヤ慨鐗╁搧锛�121212</view>
+					<view class="line">涓婃姤鏃堕棿锛�121212</view>
+					<view class="line">涓婇棬鏃堕棿锛�121212</view>
+				</view>
+			</view>
+		</view>
+		<!--  -->
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				param: {},
+				activeTab: 0,
+				selectAll: false
+			};
+		},
+		methods: {
+			tabsClick(val) {
+				this.activeTab = val
+			},
+			allClick() {
+				this.selectAll = !this.selectAll
+			},
+			itemClick() {
+				uni.navigateTo({
+					url: '/pages/workOrder/detail'
+				})
+			},
+			getList() {
+				console.log('---');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.main_app{
+		padding: 0 30rpx;
+	}
+	.tabs{
+		display: flex;
+		width: 750rpx;
+		margin: 12rpx -30rpx 0;
+		border-bottom: 1rpx solid #E5E5E5;
+		.tab{
+			font-size: 30rpx;
+			color: #666666;
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: flex-end;
+			height: 88rpx;
+			.name{
+				display: flex;
+				align-items: center;
+			}
+			.icon{
+				width: 28rpx;
+				height: 28rpx;
+				margin-right: 10rpx;
+			}
+			.border{
+				width: 54rpx;
+				height: 6rpx;
+				background-color: #fff;
+				border-radius: 3rpx;
+				margin-top: 24rpx;
+			}
+		}
+		.active{
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			.border{
+				background-color: $primaryColor;
+			}
+			
+		}
+		
+	}
+	.head_wrap {
+		display: flex;
+		align-items: center;
+
+		.search_wrap {
+			display: flex;
+			align-items: center;
+			width: 100%;
+			height: 76rpx;
+			background: #F7F7F7;
+			border-radius: 38rpx;
+			padding-left: 30rpx;
+			input{
+				flex: 1;
+			}
+			.search {
+				width: 28rpx;
+				height: 28rpx;
+			}
+		}
+
+	}
+
+	.list {
+		.item {
+			display: flex;
+			// height: 290rpx;
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #E5E5E5;
+			.icon {
+				width: 80rpx;
+				height: 80rpx;
+				margin-right: 24rpx;
+			}
+
+			.content {
+				flex: 1;
+				color: #666666;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				.line{
+					margin-bottom: 20rpx;
+					&:nth-last-child(1){
+						margin-bottom: 0;
+					}
+				}
+				.name_wrap{
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					.name{
+						display: flex;
+						align-items: flex-end;
+						font-weight: 600;
+						font-size: 34rpx;
+						color: #222222;
+					}
+					.status{
+						color: $primaryColor;
+					}
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/static/check.png b/h5/static/check.png
new file mode 100644
index 0000000..e2c908d
--- /dev/null
+++ b/h5/static/check.png
Binary files differ
diff --git a/h5/static/checked.png b/h5/static/checked.png
new file mode 100644
index 0000000..d161c61
--- /dev/null
+++ b/h5/static/checked.png
Binary files differ
diff --git a/h5/static/home/home_bg.jpg b/h5/static/home/home_bg.jpg
new file mode 100644
index 0000000..b2d9297
--- /dev/null
+++ b/h5/static/home/home_bg.jpg
Binary files differ
diff --git a/h5/static/home/ic_fangkeba.png b/h5/static/home/ic_fangkeba.png
new file mode 100644
index 0000000..9c1f1f2
--- /dev/null
+++ b/h5/static/home/ic_fangkeba.png
Binary files differ
diff --git a/h5/static/home/ic_fangkebaobe@2x.png b/h5/static/home/ic_fangkebaobe@2x.png
new file mode 100644
index 0000000..b61db6c
--- /dev/null
+++ b/h5/static/home/ic_fangkebaobe@2x.png
Binary files differ
diff --git a/h5/static/home/ic_fangkebaobei@2x.png b/h5/static/home/ic_fangkebaobei@2x.png
new file mode 100644
index 0000000..2dad112
--- /dev/null
+++ b/h5/static/home/ic_fangkebaobei@2x.png
Binary files differ
diff --git a/h5/static/home/ic_renwuzhongxin@2x.png b/h5/static/home/ic_renwuzhongxin@2x.png
new file mode 100644
index 0000000..eba7ade
--- /dev/null
+++ b/h5/static/home/ic_renwuzhongxin@2x.png
Binary files differ
diff --git a/h5/static/home/ic_search@2x.png b/h5/static/home/ic_search@2x.png
new file mode 100644
index 0000000..4d7c22b
--- /dev/null
+++ b/h5/static/home/ic_search@2x.png
Binary files differ
diff --git a/h5/static/home/ic_wodehuiyi@2x.png b/h5/static/home/ic_wodehuiyi@2x.png
new file mode 100644
index 0000000..b5488a2
--- /dev/null
+++ b/h5/static/home/ic_wodehuiyi@2x.png
Binary files differ
diff --git a/h5/static/login_ic_password@2x.png b/h5/static/login_ic_password@2x.png
new file mode 100644
index 0000000..ea41beb
--- /dev/null
+++ b/h5/static/login_ic_password@2x.png
Binary files differ
diff --git a/h5/static/login_ic_phone@2x.png b/h5/static/login_ic_phone@2x.png
new file mode 100644
index 0000000..b89a086
--- /dev/null
+++ b/h5/static/login_ic_phone@2x.png
Binary files differ
diff --git a/h5/static/logo.png b/h5/static/logo.png
new file mode 100644
index 0000000..b5771e2
--- /dev/null
+++ b/h5/static/logo.png
Binary files differ
diff --git a/h5/static/radioed.png b/h5/static/radioed.png
new file mode 100644
index 0000000..e5ccfbe
--- /dev/null
+++ b/h5/static/radioed.png
Binary files differ
diff --git a/h5/static/side/ic_dabiao.png b/h5/static/side/ic_dabiao.png
new file mode 100644
index 0000000..5205505
--- /dev/null
+++ b/h5/static/side/ic_dabiao.png
Binary files differ
diff --git a/h5/static/side/ic_dabiaoed.png b/h5/static/side/ic_dabiaoed.png
new file mode 100644
index 0000000..037d7d8
--- /dev/null
+++ b/h5/static/side/ic_dabiaoed.png
Binary files differ
diff --git a/h5/static/side/ic_saoma@2x.png b/h5/static/side/ic_saoma@2x.png
new file mode 100644
index 0000000..a81cc12
--- /dev/null
+++ b/h5/static/side/ic_saoma@2x.png
Binary files differ
diff --git a/h5/static/side/ic_shuiyu@2x.png b/h5/static/side/ic_shuiyu@2x.png
new file mode 100644
index 0000000..b3faf39
--- /dev/null
+++ b/h5/static/side/ic_shuiyu@2x.png
Binary files differ
diff --git a/h5/static/side/phoneed.png b/h5/static/side/phoneed.png
new file mode 100644
index 0000000..bffe72f
--- /dev/null
+++ b/h5/static/side/phoneed.png
Binary files differ
diff --git a/h5/static/side/scan.png b/h5/static/side/scan.png
new file mode 100644
index 0000000..50f54fc
--- /dev/null
+++ b/h5/static/side/scan.png
Binary files differ
diff --git a/h5/static/side/workorder.png b/h5/static/side/workorder.png
new file mode 100644
index 0000000..25d11ee
--- /dev/null
+++ b/h5/static/side/workorder.png
Binary files differ
diff --git a/h5/static/side/workordered.png b/h5/static/side/workordered.png
new file mode 100644
index 0000000..c59ed1b
--- /dev/null
+++ b/h5/static/side/workordered.png
Binary files differ
diff --git a/h5/static/side/xunjian.png b/h5/static/side/xunjian.png
new file mode 100644
index 0000000..86961b5
--- /dev/null
+++ b/h5/static/side/xunjian.png
Binary files differ
diff --git a/h5/static/side/xunjianed.png b/h5/static/side/xunjianed.png
new file mode 100644
index 0000000..b00224b
--- /dev/null
+++ b/h5/static/side/xunjianed.png
Binary files differ
diff --git a/h5/store/index.js b/h5/store/index.js
new file mode 100644
index 0000000..a0a9693
--- /dev/null
+++ b/h5/store/index.js
@@ -0,0 +1,105 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+
+const openId = uni.getStorageSync('openId')
+const member = uni.getStorageSync('member')
+
+// meeting
+const navHeight = uni.getStorageSync('navHeight')
+const statusbarHeight = uni.getStorageSync('statusbarHeight')
+const height = uni.getStorageSync('height')
+const token = uni.getStorageSync('token')
+const time = uni.getStorageSync('time')
+const userInfo = uni.getStorageSync('userInfo')
+const driverInfo = uni.getStorageSync('driverInfo')
+const sessionKey = uni.getStorageSync('sessionKey')
+
+const store = new Vuex.Store({
+
+	state: {
+		// openId: openId || '061kuG0006hxcS13TT200w9VIp4kuG09',
+		openId: openId || '123123',
+		member: member || null,
+		statusbarHeight: statusbarHeight || '0',
+		navHeight: navHeight || '0',
+		token: token || null,
+		time: time || null,
+		userInfo: userInfo || {},
+		driverInfo: driverInfo || {},
+		height: height || '0',
+		sessionKey: sessionKey || '',
+		primaryColor: '#279baa'
+	},
+
+	mutations: {
+		// 璁剧疆openId
+		setOpenId(state, val) {
+			state.openId = val
+			uni.setStorageSync('openId', val)
+		},
+		// 璁剧疆鐢ㄦ埛淇℃伅
+		setMember(state, val) {
+			state.member = val
+			uni.setStorageSync('member', val)
+		},
+		// 璁剧疆瀵艰埅鏍忛珮搴�
+		setHeight(state, val) {
+			state.navHeight = val.navHeight
+			state.statusbarHeight = val.statusbarHeight
+			state.height = val.height
+			uni.setStorageSync('navHeight', val.navHeight)
+			uni.setStorageSync('statusbarHeight', val.statusbarHeight)
+			uni.setStorageSync('height', val.height)
+		},
+		// 璁剧疆缂撳瓨token
+		setToken(state, token) {
+			state.token = token
+			uni.setStorageSync('token', token)
+		},
+		// 璁剧疆杩囨湡鏃堕棿鎴�
+		setTimeStamp(state, time) {
+			state.time = time
+			uni.setStorageSync('time', time)
+		},
+		// 璁剧疆鐢ㄦ埛淇℃伅
+		setUserInfo(state, obj) {
+			state.userInfo = obj
+			uni.setStorageSync('userInfo', obj)
+		},
+		// 璁剧疆鍙告満淇℃伅
+		setDriverInfo(state, obj) {
+			state.driverInfo = obj
+			uni.setStorageSync('driverInfo', obj)
+		},
+		// 璁剧疆SessionKey
+		setSessionKey(state, val) {
+			state.sessionKey = val
+			uni.setStorageSync('sessionKey', val)
+		},
+		// 娓呯┖鐧诲綍缂撳瓨
+		empty(state) {
+			state.token = ''
+			state.userInfo = {}
+			state.driverInfo = {}
+			uni.removeStorageSync('userInfo')
+			uni.removeStorageSync('driverInfo')
+			uni.removeStorageSync('token')
+		}
+	},
+	actions: {
+		// 鑾峰彇鐘舵�侀珮搴�
+		getHeight(context) {
+			let res = uni.getMenuButtonBoundingClientRect()
+			let status = uni.getSystemInfoSync()
+			var height = res.height
+			let statusbarHeight = status.statusBarHeight
+			let navHeight = res.height + (res.top - statusbarHeight) * 2
+			context.commit('setHeight', { statusbarHeight, navHeight, height })
+		}
+	}
+
+})
+
+export default store
\ No newline at end of file
diff --git a/h5/uni.promisify.adaptor.js b/h5/uni.promisify.adaptor.js
new file mode 100644
index 0000000..47fbce1
--- /dev/null
+++ b/h5/uni.promisify.adaptor.js
@@ -0,0 +1,10 @@
+uni.addInterceptor({
+  returnValue (res) {
+    if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+      return res;
+    }
+    return new Promise((resolve, reject) => {
+      res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
+    });
+  },
+});
\ No newline at end of file
diff --git a/h5/uni.scss b/h5/uni.scss
new file mode 100644
index 0000000..e83a7b2
--- /dev/null
+++ b/h5/uni.scss
@@ -0,0 +1,77 @@
+/**
+ * 杩欓噷鏄痷ni-app鍐呯疆鐨勫父鐢ㄦ牱寮忓彉閲�
+ *
+ * uni-app 瀹樻柟鎵╁睍鎻掍欢鍙婃彃浠跺競鍦猴紙https://ext.dcloud.net.cn锛変笂寰堝涓夋柟鎻掍欢鍧囦娇鐢ㄤ簡杩欎簺鏍峰紡鍙橀噺
+ * 濡傛灉浣犳槸鎻掍欢寮�鍙戣�咃紝寤鸿浣犱娇鐢╯css棰勫鐞嗭紝骞跺湪鎻掍欢浠g爜涓洿鎺ヤ娇鐢ㄨ繖浜涘彉閲忥紙鏃犻渶 import 杩欎釜鏂囦欢锛夛紝鏂逛究鐢ㄦ埛閫氳繃鎼Н鏈ㄧ殑鏂瑰紡寮�鍙戞暣浣撻鏍间竴鑷寸殑App
+ *
+ */
+
+/**
+ * 濡傛灉浣犳槸App寮�鍙戣�咃紙鎻掍欢浣跨敤鑰咃級锛屼綘鍙互閫氳繃淇敼杩欎簺鍙橀噺鏉ュ畾鍒惰嚜宸辩殑鎻掍欢涓婚锛屽疄鐜拌嚜瀹氫箟涓婚鍔熻兘
+ *
+ * 濡傛灉浣犵殑椤圭洰鍚屾牱浣跨敤浜唖css棰勫鐞嗭紝浣犱篃鍙互鐩存帴鍦ㄤ綘鐨� scss 浠g爜涓娇鐢ㄥ涓嬪彉閲忥紝鍚屾椂鏃犻渶 import 杩欎釜鏂囦欢
+ */
+@import 'uview-ui/theme.scss';
+/* 棰滆壊鍙橀噺 */
+
+/* 琛屼负鐩稿叧棰滆壊 */
+$uni-color-primary: #2b66f6;
+$primaryColor: #2b66f6;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 鏂囧瓧鍩烘湰棰滆壊 */
+$uni-text-color:#333;//鍩烘湰鑹�
+$uni-text-color-inverse:#fff;//鍙嶈壊
+$uni-text-color-grey:#999;//杈呭姪鐏拌壊锛屽鍔犺浇鏇村鐨勬彁绀轰俊鎭�
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 鑳屾櫙棰滆壊 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//鐐瑰嚮鐘舵�侀鑹�
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//閬僵棰滆壊
+
+/* 杈规棰滆壊 */
+$uni-border-color:#c8c7cc;
+
+/* 灏哄鍙橀噺 */
+
+/* 鏂囧瓧灏哄 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 鍥剧墖灏哄 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 姘村钩闂磋窛 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 鍨傜洿闂磋窛 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 閫忔槑搴� */
+$uni-opacity-disabled: 0.3; // 缁勪欢绂佺敤鎬佺殑閫忔槑搴�
+
+/* 鏂囩珷鍦烘櫙鐩稿叧 */
+$uni-color-title: #2C405A; // 鏂囩珷鏍囬棰滆壊
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 浜岀骇鏍囬棰滆壊
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 鏂囩珷娈佃惤棰滆壊
+$uni-font-size-paragraph:15px;
diff --git a/h5/utils/config.js b/h5/utils/config.js
new file mode 100644
index 0000000..d6d6ee5
--- /dev/null
+++ b/h5/utils/config.js
@@ -0,0 +1,22 @@
+
+export const baseUrl = 'gateway_interface/'
+// export const baseUrl = 'http://192.168.0.173/gateway_interface/'
+// export const baseUrl = 'http://10.50.250.253:8088/gateway_interface/'
+
+export const uploadAvatar = `${baseUrl}visitsAdmin/cloudService/web/public/uploadFtp.do`
+export const uploadUrl = `${baseUrl}visitsAdmin/cloudService/public/uploadBatch`
+
+export const statusMap = {
+	0: '寰呯‘璁�',
+	1: '绛夊緟绛惧埌',
+	2: '绛夊緟鍙彿', // 绛夊緟鍙彿
+	3: '鍏ュ洯绛夊緟',
+	4: '鏈堝彴绛夊緟', //宸插彨鍙�
+	5: '浣滀笟涓�',
+	6: '浣滀笟瀹屾垚',
+	7: '杞Щ涓�',
+	8: '寮傚父鎸傝捣',
+	9: '宸叉巿鏉冪鍥�',
+	10: '宸茬鍥�',
+	11: '宸茶繃鍙�',
+}
\ No newline at end of file
diff --git a/h5/utils/http.api.js b/h5/utils/http.api.js
new file mode 100644
index 0000000..471728b
--- /dev/null
+++ b/h5/utils/http.api.js
@@ -0,0 +1,36 @@
+import { baseUrl, uploadUrl } from './config'
+
+const install = (Vue, vm) => {
+
+	uni.$u.http.setConfig((config) => {
+		config.baseURL = baseUrl
+		config.timeout = 60000
+		return config
+	})
+	Vue.prototype.$baseUrl = baseUrl
+	Vue.prototype.$uploadUrl = uploadUrl
+
+	let wxAuthorize = (params = {}) => vm.$u.http.get('visitsAdmin/cloudService/web/visitor/wxAuthorize', { params })	// 璁垮寰俊鎺堟潈
+	let getSystemDictData = (params = {}) => vm.$u.http.get('visitsAdmin/cloudService/web/other/getSystemDictData', { params })	// 鏌ヨ瀛楀吀鍊兼暟鎹�
+	let getProblemsVO = (params = {}) => vm.$u.http.get('visitsAdmin/cloudService/web/problem/getProblemsVO', { params })	// 鑾峰彇棰樼洰鏁版嵁
+	let finishAnswer = (data = {}) => vm.$u.http.post('visitsAdmin/cloudService/web/problem/finishAnswer', data)	// 淇敼褰撳墠鐧诲綍鐨勭敤鎴蜂俊鎭�
+	let deviceRoleList = (params = {}) => vm.$u.http.get('visitsAdmin/cloudService/web/other/deviceRoleList', { params })	// 璁惧缁勫垪琛�
+	let getVisitedMember = (data = {}) => vm.$u.http.post('visitsAdmin/cloudService/web/visitor/getVisitedMember', data)	// 鏌ヨ琚闂汉淇℃伅
+	let createFk = (data = {}) => vm.$u.http.post('visitsAdmin/cloudService/web/visitor/createFk', data)	// 璁垮璁板綍鎻愪氦
+	let detail = (params = {}) => vm.$u.http.get('visitsAdmin/cloudService/web/visitor/detail', { params })	// 璁垮璁板綍璇︽儏
+
+
+
+	vm.$u.api = {
+		wxAuthorize,
+		getSystemDictData,
+		getProblemsVO,
+		finishAnswer,
+		deviceRoleList,
+		getVisitedMember,
+		createFk,
+		detail
+	}
+}
+
+export default { install }
\ No newline at end of file
diff --git a/h5/utils/http.interceptor.js b/h5/utils/http.interceptor.js
new file mode 100644
index 0000000..6d17428
--- /dev/null
+++ b/h5/utils/http.interceptor.js
@@ -0,0 +1,40 @@
+const install = (Vue, vm) => {
+	// 璇锋眰鎷︽埅鍣�
+	uni.$u.http.interceptors.request.use((config) => {
+		uni.showLoading({
+			title: '鍔犺浇涓�',
+			mask: true
+		});
+		// const Headtoken = vm.$store.state.token || ''
+		// if (Headtoken) {
+		// 	config.header['eva-auth-token'] = Headtoken;
+		// }
+		return config
+	}, config => {
+		return Promise.reject(config)
+	})
+	
+	// 鍝嶅簲鎷︽埅鍣�
+	uni.$u.http.interceptors.response.use((response) => {
+		uni.hideLoading();
+		// 鐧诲綍杩囨湡
+		if (response.data.code === 401) {
+			uni.navigateTo({
+				url: '/packageA/loginAgain/loginAgain'
+			});
+		}
+		if (response.data.code !== 200) {
+			uni.showToast({
+				title: response.data.message,
+				icon: "none",
+				duration: 2000
+			});
+		}
+		return response.data;
+	}, (response) => {
+		uni.hideLoading();
+		return Promise.reject(response)
+	})
+}
+
+export default { install }
\ No newline at end of file
diff --git a/h5/utils/login.js b/h5/utils/login.js
new file mode 100644
index 0000000..a9c95b5
--- /dev/null
+++ b/h5/utils/login.js
@@ -0,0 +1,60 @@
+import Vue from 'vue'
+
+// 鍒ゆ柇鏄惁鐧诲綍
+export function isLogin(type) {
+	// console.log('鍒ゆ柇鏄惁鐧诲綍');
+	if (type === 'empty') {
+		loginAction()
+		return
+	}
+	if (!uni.getStorageSync('token')) {
+		console.log('鏈櫥褰�');
+		loginAction()
+	} else {
+		console.log('宸茬櫥褰�');
+		let oldTime = Number(uni.getStorageSync('time'))
+		let s = (new Date().valueOf() - oldTime) / 1000
+		let h = s / 60 / 60
+		console.log(h)
+		if (h >= 120) {
+			console.log('杩囨湡');
+			loginAction()
+		} else {
+			console.log('鏈繃鏈�');
+			Vue.prototype.$reslove()
+		}
+	}
+}
+
+function loginAction() {
+	// console.log('getProvider 鍓�');
+	uni.getProvider({
+		service: 'oauth',
+		
+		success: function(res) {
+			// console.log('鑾峰彇鎺堟潈鎴愬姛');
+			uni.login({
+				provider: res.provider,
+				scopes: 'auth_user',
+				success: function(loginRes) {
+					
+					// #ifdef MP-WEIXIN
+						// wxLogin({ code: loginRes.code })
+						// 	.then(resData => {
+						// 		uni.setStorageSync('token', resData.data.token);
+						// 		uni.setStorageSync('avatarUrl', resData.data.member.avatarUrl);
+						// 		uni.setStorageSync('nickName', resData.data.member.nickName);
+						// 		uni.setStorageSync('realName', resData.data.member.realName);
+						// 		uni.setStorageSync('gender', resData.data.member.gender);
+						// 		uni.setStorageSync('mobile', resData.data.member.mobile);
+						// 		uni.setStorageSync('sessionKey', resData.data.sessionKey);
+						// 		uni.setStorageSync('time', new Date().valueOf());
+						// 		Vue.prototype.$reslove()
+						// 	})
+					// #endif
+				}
+			})
+		}
+	})
+}
+
diff --git a/h5/utils/meetingHttp.js b/h5/utils/meetingHttp.js
new file mode 100644
index 0000000..aacb730
--- /dev/null
+++ b/h5/utils/meetingHttp.js
@@ -0,0 +1,69 @@
+import { baseUrl } from './http.api'
+
+const install = (Vue, vm) => {
+
+	uni.$u.http.setConfig((config) => {
+		config.baseURL = baseUrl
+		config.timeout = 60000
+		return config
+	})
+
+
+	let ordinaryLogin = (params = {}) => uni.$u.http.get('web/account/ordinaryLogin', { params })
+	let wxEmpower = (params = {}) => uni.$u.http.get('web/account/wxEmpower', { params })
+	let editUserInfo = (data = {}) => vm.$u.http.post('web/account/editUserInfo', data)
+	let getUserInfo = (params = {}) => vm.$u.http.get('web/account/getUserInfo', { params })
+	let roomsList = (params = {}) => vm.$u.http.get('web/rooms/roomsList', { params })
+	let getRoomUseTime = (data = {}) => vm.$u.http.post('web/rooms/getRoomUseTime', data)
+	let userPage = (data = {}) => vm.$u.http.post('web/meeting/userPage', data)
+	let getRoomDetail = (params = {}) => vm.$u.http.get('web/rooms/getRoomDetail', { params })
+	let reservationMeeting = (data = {}) => vm.$u.http.post('web/meeting/reservationMeeting', data)
+	let meetingDetail = (params = {}) => vm.$u.http.get('web/meeting/meetingDetail', { params })
+	let getQrCode = (params = {}) => vm.$u.http.get('web/meeting/getQrCode', { params })
+	let reservationCancel = (params = {}) => vm.$u.http.get('web/meeting/reservationCancel', { params })
+	let resetPwd = (data = {}) => vm.$u.http.post('web/account/resetPwd', data)
+	let myMeetingPage = (data = {}) => vm.$u.http.post('web/meeting/myMeetingPage', data)
+	let myRoomsPage = (data = {}) => vm.$u.http.post('web/rooms/myRoomsPage', data)
+	let findNoticePage = (data = {}) => vm.$u.http.post('web/notice/findNoticePage', data)
+	let getMemberDTO = (params = {}) => vm.$u.http.get('web/notice/getMemberDTO', { params })
+	let findNewNotice = (params = {}) => vm.$u.http.get('web/notice/findNewNotice', { params })
+	let monthMeeting = (params = {}) => vm.$u.http.get('web/meeting/monthMeeting', { params })
+	let roomsGetQrCode = (params = {}) => vm.$u.http.get('web/rooms/getQrCode', { params })
+	let getSystemDictData = (params = {}) => vm.$u.http.get('web/util/getSystemDictData', { params })
+	let getQrCodeImg = (params = {}) => vm.$u.http.get('web/meeting/getQrCodeImg', { params })
+	let visitorLogin = (params = {}) => vm.$u.http.get('web/account/visitorLogin', { params })
+	let visitorWxPhone = (data = {}) => vm.$u.http.post('web/account/visitorWxPhone', data)
+	let getNoticeDetail = (params = {}) => vm.$u.http.get('web/notice/getNoticeDetail', { params })
+
+
+
+	vm.$u.api = {
+		ordinaryLogin,
+		wxEmpower,
+		editUserInfo,
+		getUserInfo,
+		roomsList,
+		getRoomUseTime,
+		userPage,
+		getRoomDetail,
+		reservationMeeting,
+		meetingDetail,
+		getQrCode,
+		reservationCancel,
+		resetPwd,
+		myMeetingPage,
+		myRoomsPage,
+		findNoticePage,
+		getMemberDTO,
+		findNewNotice,
+		monthMeeting,
+		roomsGetQrCode,
+		getSystemDictData,
+		getQrCodeImg,
+		visitorLogin,
+		visitorWxPhone,
+		getNoticeDetail
+	}
+}
+
+export default { install }
\ No newline at end of file
diff --git a/h5/utils/qrcode.js b/h5/utils/qrcode.js
new file mode 100644
index 0000000..d1a71f1
--- /dev/null
+++ b/h5/utils/qrcode.js
@@ -0,0 +1,1201 @@
+let QRCode = {};
+(function () {
+    /**
+     * 鑾峰彇鍗曚釜瀛楃鐨剈tf8缂栫爜
+     * unicode BMP骞抽潰绾�65535涓瓧绗�
+     * @param {num} code
+     * return {array}
+     */
+    function unicodeFormat8(code) {
+        // 1 byte
+        var c0, c1, c2;
+        if (code < 128) {
+            return [code];
+            // 2 bytes
+        } else if (code < 2048) {
+            c0 = 192 + (code >> 6);
+            c1 = 128 + (code & 63);
+            return [c0, c1];
+            // 3 bytes
+        } else {
+            c0 = 224 + (code >> 12);
+            c1 = 128 + (code >> 6 & 63);
+            c2 = 128 + (code & 63);
+            return [c0, c1, c2];
+        }
+    }
+    /**
+     * 鑾峰彇瀛楃涓茬殑utf8缂栫爜瀛楄妭涓�
+     * @param {string} string
+     * @return {array}
+     */
+    function getUTF8Bytes(string) {
+        var utf8codes = [];
+        for (var i = 0; i < string.length; i++) {
+            var code = string.charCodeAt(i);
+            var utf8 = unicodeFormat8(code);
+            for (var j = 0; j < utf8.length; j++) {
+                utf8codes.push(utf8[j]);
+            }
+        }
+        return utf8codes;
+    }
+    /**
+     * 浜岀淮鐮佺畻娉曞疄鐜�
+     * @param {string} data              瑕佺紪鐮佺殑淇℃伅瀛楃涓�
+     * @param {num} errorCorrectLevel 绾犻敊绛夌骇
+     */
+    function QRCodeAlg(data, errorCorrectLevel) {
+        this.typeNumber = -1; //鐗堟湰
+        this.errorCorrectLevel = errorCorrectLevel;
+        this.modules = null; //浜岀淮鐭╅樀锛屽瓨鏀炬渶缁堢粨鏋�
+        this.moduleCount = 0; //鐭╅樀澶у皬
+        this.dataCache = null; //鏁版嵁缂撳瓨
+        this.rsBlocks = null; //鐗堟湰鏁版嵁淇℃伅
+        this.totalDataCount = -1; //鍙娇鐢ㄧ殑鏁版嵁閲�
+        this.data = data;
+        this.utf8bytes = getUTF8Bytes(data);
+        this.make();
+    }
+    QRCodeAlg.prototype = {
+        constructor: QRCodeAlg,
+        /**
+         * 鑾峰彇浜岀淮鐮佺煩闃靛ぇ灏�
+         * @return {num} 鐭╅樀澶у皬
+         */
+        getModuleCount: function () {
+            return this.moduleCount;
+        },
+        /**
+         * 缂栫爜
+         */
+        make: function () {
+            this.getRightType();
+            this.dataCache = this.createData();
+            this.createQrcode();
+        },
+        /**
+         * 璁剧疆浜屼綅鐭╅樀鍔熻兘鍥惧舰
+         * @param  {bool} test 琛ㄧず鏄惁鍦ㄥ鎵炬渶濂芥帺鑶滈樁娈�
+         * @param  {num} maskPattern 鎺╄啘鐨勭増鏈�
+         */
+        makeImpl: function (maskPattern) {
+            this.moduleCount = this.typeNumber * 4 + 17;
+            this.modules = new Array(this.moduleCount);
+            for (var row = 0; row < this.moduleCount; row++) {
+                this.modules[row] = new Array(this.moduleCount);
+            }
+            this.setupPositionProbePattern(0, 0);
+            this.setupPositionProbePattern(this.moduleCount - 7, 0);
+            this.setupPositionProbePattern(0, this.moduleCount - 7);
+            this.setupPositionAdjustPattern();
+            this.setupTimingPattern();
+            this.setupTypeInfo(true, maskPattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(true);
+            }
+            this.mapData(this.dataCache, maskPattern);
+        },
+        /**
+         * 璁剧疆浜岀淮鐮佺殑浣嶇疆鎺㈡祴鍥惧舰
+         * @param  {num} row 鎺㈡祴鍥惧舰鐨勪腑蹇冩í鍧愭爣
+         * @param  {num} col 鎺㈡祴鍥惧舰鐨勪腑蹇冪旱鍧愭爣
+         */
+        setupPositionProbePattern: function (row, col) {
+            for (var r = -1; r <= 7; r++) {
+                if (row + r <= -1 || this.moduleCount <= row + r) continue;
+                for (var c = -1; c <= 7; c++) {
+                    if (col + c <= -1 || this.moduleCount <= col + c) continue;
+                    if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r == 6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
+                        this.modules[row + r][col + c] = true;
+                    } else {
+                        this.modules[row + r][col + c] = false;
+                    }
+                }
+            }
+        },
+        /**
+         * 鍒涘缓浜岀淮鐮�
+         * @return {[type]} [description]
+         */
+        createQrcode: function () {
+            var minLostPoint = 0;
+            var pattern = 0;
+            var bestModules = null;
+            for (var i = 0; i < 8; i++) {
+                this.makeImpl(i);
+                var lostPoint = QRUtil.getLostPoint(this);
+                if (i == 0 || minLostPoint > lostPoint) {
+                    minLostPoint = lostPoint;
+                    pattern = i;
+                    bestModules = this.modules;
+                }
+            }
+            this.modules = bestModules;
+            this.setupTypeInfo(false, pattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(false);
+            }
+        },
+        /**
+         * 璁剧疆瀹氫綅鍥惧舰
+         * @return {[type]} [description]
+         */
+        setupTimingPattern: function () {
+            for (var r = 8; r < this.moduleCount - 8; r++) {
+                if (this.modules[r][6] != null) {
+                    continue;
+                }
+                this.modules[r][6] = (r % 2 == 0);
+                if (this.modules[6][r] != null) {
+                    continue;
+                }
+                this.modules[6][r] = (r % 2 == 0);
+            }
+        },
+        /**
+         * 璁剧疆鐭鍥惧舰
+         * @return {[type]} [description]
+         */
+        setupPositionAdjustPattern: function () {
+            var pos = QRUtil.getPatternPosition(this.typeNumber);
+            for (var i = 0; i < pos.length; i++) {
+                for (var j = 0; j < pos.length; j++) {
+                    var row = pos[i];
+                    var col = pos[j];
+                    if (this.modules[row][col] != null) {
+                        continue;
+                    }
+                    for (var r = -2; r <= 2; r++) {
+                        for (var c = -2; c <= 2; c++) {
+                            if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
+                                this.modules[row + r][col + c] = true;
+                            } else {
+                                this.modules[row + r][col + c] = false;
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        /**
+         * 璁剧疆鐗堟湰淇℃伅锛�7浠ヤ笂鐗堟湰鎵嶆湁锛�
+         * @param  {bool} test 鏄惁澶勪簬鍒ゆ柇鏈�浣虫帺鑶滈樁娈�
+         * @return {[type]}      [description]
+         */
+        setupTypeNumber: function (test) {
+            var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
+            for (var i = 0; i < 18; i++) {
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
+                this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
+            }
+        },
+        /**
+         * 璁剧疆鏍煎紡淇℃伅锛堢籂閿欑瓑绾у拰鎺╄啘鐗堟湰锛�
+         * @param  {bool} test
+         * @param  {num} maskPattern 鎺╄啘鐗堟湰
+         * @return {}
+         */
+        setupTypeInfo: function (test, maskPattern) {
+            var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
+            var bits = QRUtil.getBCHTypeInfo(data);
+            // vertical
+            for (var i = 0; i < 15; i++) {
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 6) {
+                    this.modules[i][8] = mod;
+                } else if (i < 8) {
+                    this.modules[i + 1][8] = mod;
+                } else {
+                    this.modules[this.moduleCount - 15 + i][8] = mod;
+                }
+                // horizontal
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 8) {
+                    this.modules[8][this.moduleCount - i - 1] = mod;
+                } else if (i < 9) {
+                    this.modules[8][15 - i - 1 + 1] = mod;
+                } else {
+                    this.modules[8][15 - i - 1] = mod;
+                }
+            }
+            // fixed module
+            this.modules[this.moduleCount - 8][8] = (!test);
+        },
+        /**
+         * 鏁版嵁缂栫爜
+         * @return {[type]} [description]
+         */
+        createData: function () {
+            var buffer = new QRBitBuffer();
+            var lengthBits = this.typeNumber > 9 ? 16 : 8;
+            buffer.put(4, 4); //娣诲姞妯″紡
+            buffer.put(this.utf8bytes.length, lengthBits);
+            for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
+                buffer.put(this.utf8bytes[i], 8);
+            }
+            if (buffer.length + 4 <= this.totalDataCount * 8) {
+                buffer.put(0, 4);
+            }
+            // padding
+            while (buffer.length % 8 != 0) {
+                buffer.putBit(false);
+            }
+            // padding
+            while (true) {
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD0, 8);
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD1, 8);
+            }
+            return this.createBytes(buffer);
+        },
+        /**
+         * 绾犻敊鐮佺紪鐮�
+         * @param  {buffer} buffer 鏁版嵁缂栫爜
+         * @return {[type]}
+         */
+        createBytes: function (buffer) {
+            var offset = 0;
+            var maxDcCount = 0;
+            var maxEcCount = 0;
+            var length = this.rsBlock.length / 3;
+            var rsBlocks = new Array();
+            for (var i = 0; i < length; i++) {
+                var count = this.rsBlock[i * 3 + 0];
+                var totalCount = this.rsBlock[i * 3 + 1];
+                var dataCount = this.rsBlock[i * 3 + 2];
+                for (var j = 0; j < count; j++) {
+                    rsBlocks.push([dataCount, totalCount]);
+                }
+            }
+            var dcdata = new Array(rsBlocks.length);
+            var ecdata = new Array(rsBlocks.length);
+            for (var r = 0; r < rsBlocks.length; r++) {
+                var dcCount = rsBlocks[r][0];
+                var ecCount = rsBlocks[r][1] - dcCount;
+                maxDcCount = Math.max(maxDcCount, dcCount);
+                maxEcCount = Math.max(maxEcCount, ecCount);
+                dcdata[r] = new Array(dcCount);
+                for (var i = 0; i < dcdata[r].length; i++) {
+                    dcdata[r][i] = 0xff & buffer.buffer[i + offset];
+                }
+                offset += dcCount;
+                var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
+                var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
+                var modPoly = rawPoly.mod(rsPoly);
+                ecdata[r] = new Array(rsPoly.getLength() - 1);
+                for (var i = 0; i < ecdata[r].length; i++) {
+                    var modIndex = i + modPoly.getLength() - ecdata[r].length;
+                    ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
+                }
+            }
+            var data = new Array(this.totalDataCount);
+            var index = 0;
+            for (var i = 0; i < maxDcCount; i++) {
+                for (var r = 0; r < rsBlocks.length; r++) {
+                    if (i < dcdata[r].length) {
+                        data[index++] = dcdata[r][i];
+                    }
+                }
+            }
+            for (var i = 0; i < maxEcCount; i++) {
+                for (var r = 0; r < rsBlocks.length; r++) {
+                    if (i < ecdata[r].length) {
+                        data[index++] = ecdata[r][i];
+                    }
+                }
+            }
+            return data;
+
+        },
+        /**
+         * 甯冪疆妯″潡锛屾瀯寤烘渶缁堜俊鎭�
+         * @param  {} data
+         * @param  {} maskPattern
+         * @return {}
+         */
+        mapData: function (data, maskPattern) {
+            var inc = -1;
+            var row = this.moduleCount - 1;
+            var bitIndex = 7;
+            var byteIndex = 0;
+            for (var col = this.moduleCount - 1; col > 0; col -= 2) {
+                if (col == 6) col--;
+                while (true) {
+                    for (var c = 0; c < 2; c++) {
+                        if (this.modules[row][col - c] == null) {
+                            var dark = false;
+                            if (byteIndex < data.length) {
+                                dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
+                            }
+                            var mask = QRUtil.getMask(maskPattern, row, col - c);
+                            if (mask) {
+                                dark = !dark;
+                            }
+                            this.modules[row][col - c] = dark;
+                            bitIndex--;
+                            if (bitIndex == -1) {
+                                byteIndex++;
+                                bitIndex = 7;
+                            }
+                        }
+                    }
+                    row += inc;
+                    if (row < 0 || this.moduleCount <= row) {
+                        row -= inc;
+                        inc = -inc;
+                        break;
+                    }
+                }
+            }
+        }
+    };
+    /**
+     * 濉厖瀛楁
+     */
+    QRCodeAlg.PAD0 = 0xEC;
+    QRCodeAlg.PAD1 = 0x11;
+    //---------------------------------------------------------------------
+    // 绾犻敊绛夌骇瀵瑰簲鐨勭紪鐮�
+    //---------------------------------------------------------------------
+    var QRErrorCorrectLevel = [1, 0, 3, 2];
+    //---------------------------------------------------------------------
+    // 鎺╄啘鐗堟湰
+    //---------------------------------------------------------------------
+    var QRMaskPattern = {
+        PATTERN000: 0,
+        PATTERN001: 1,
+        PATTERN010: 2,
+        PATTERN011: 3,
+        PATTERN100: 4,
+        PATTERN101: 5,
+        PATTERN110: 6,
+        PATTERN111: 7
+    };
+    //---------------------------------------------------------------------
+    // 宸ュ叿绫�
+    //---------------------------------------------------------------------
+    var QRUtil = {
+        /*
+        姣忎釜鐗堟湰鐭鍥惧舰鐨勪綅缃�
+         */
+        PATTERN_POSITION_TABLE: [
+            [],
+            [6, 18],
+            [6, 22],
+            [6, 26],
+            [6, 30],
+            [6, 34],
+            [6, 22, 38],
+            [6, 24, 42],
+            [6, 26, 46],
+            [6, 28, 50],
+            [6, 30, 54],
+            [6, 32, 58],
+            [6, 34, 62],
+            [6, 26, 46, 66],
+            [6, 26, 48, 70],
+            [6, 26, 50, 74],
+            [6, 30, 54, 78],
+            [6, 30, 56, 82],
+            [6, 30, 58, 86],
+            [6, 34, 62, 90],
+            [6, 28, 50, 72, 94],
+            [6, 26, 50, 74, 98],
+            [6, 30, 54, 78, 102],
+            [6, 28, 54, 80, 106],
+            [6, 32, 58, 84, 110],
+            [6, 30, 58, 86, 114],
+            [6, 34, 62, 90, 118],
+            [6, 26, 50, 74, 98, 122],
+            [6, 30, 54, 78, 102, 126],
+            [6, 26, 52, 78, 104, 130],
+            [6, 30, 56, 82, 108, 134],
+            [6, 34, 60, 86, 112, 138],
+            [6, 30, 58, 86, 114, 142],
+            [6, 34, 62, 90, 118, 146],
+            [6, 30, 54, 78, 102, 126, 150],
+            [6, 24, 50, 76, 102, 128, 154],
+            [6, 28, 54, 80, 106, 132, 158],
+            [6, 32, 58, 84, 110, 136, 162],
+            [6, 26, 54, 82, 110, 138, 166],
+            [6, 30, 58, 86, 114, 142, 170]
+        ],
+        G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
+        G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
+        G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
+        /*
+        BCH缂栫爜鏍煎紡淇℃伅
+         */
+        getBCHTypeInfo: function (data) {
+            var d = data << 10;
+            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
+                d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
+            }
+            return ((data << 10) | d) ^ QRUtil.G15_MASK;
+        },
+        /*
+        BCH缂栫爜鐗堟湰淇℃伅
+         */
+        getBCHTypeNumber: function (data) {
+            var d = data << 12;
+            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
+                d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
+            }
+            return (data << 12) | d;
+        },
+        /*
+        鑾峰彇BCH浣嶄俊鎭�
+         */
+        getBCHDigit: function (data) {
+            var digit = 0;
+            while (data != 0) {
+                digit++;
+                data >>>= 1;
+            }
+            return digit;
+        },
+        /*
+        鑾峰彇鐗堟湰瀵瑰簲鐨勭煫姝e浘褰綅缃�
+         */
+        getPatternPosition: function (typeNumber) {
+            return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
+        },
+        /*
+        鎺╄啘绠楁硶
+         */
+        getMask: function (maskPattern, i, j) {
+            switch (maskPattern) {
+                case QRMaskPattern.PATTERN000:
+                    return (i + j) % 2 == 0;
+                case QRMaskPattern.PATTERN001:
+                    return i % 2 == 0;
+                case QRMaskPattern.PATTERN010:
+                    return j % 3 == 0;
+                case QRMaskPattern.PATTERN011:
+                    return (i + j) % 3 == 0;
+                case QRMaskPattern.PATTERN100:
+                    return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
+                case QRMaskPattern.PATTERN101:
+                    return (i * j) % 2 + (i * j) % 3 == 0;
+                case QRMaskPattern.PATTERN110:
+                    return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
+                case QRMaskPattern.PATTERN111:
+                    return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
+                default:
+                    throw new Error("bad maskPattern:" + maskPattern);
+            }
+        },
+        /*
+        鑾峰彇RS鐨勭籂閿欏椤瑰紡
+         */
+        getErrorCorrectPolynomial: function (errorCorrectLength) {
+            var a = new QRPolynomial([1], 0);
+            for (var i = 0; i < errorCorrectLength; i++) {
+                a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
+            }
+            return a;
+        },
+        /*
+        鑾峰彇璇勪环
+         */
+        getLostPoint: function (qrCode) {
+            var moduleCount = qrCode.getModuleCount(),
+                lostPoint = 0,
+                darkCount = 0;
+            for (var row = 0; row < moduleCount; row++) {
+                var sameCount = 0;
+                var head = qrCode.modules[row][0];
+                for (var col = 0; col < moduleCount; col++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 璇勪环
+                    if (col < moduleCount - 6) {
+                        if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
+                            if (col < moduleCount - 10) {
+                                if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (col > 3) {
+                                if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 2 璇勪环
+                    if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
+                        var count = 0;
+                        if (current) count++;
+                        if (qrCode.modules[row + 1][col]) count++;
+                        if (qrCode.modules[row][col + 1]) count++;
+                        if (qrCode.modules[row + 1][col + 1]) count++;
+                        if (count == 0 || count == 4) {
+                            lostPoint += 3;
+                        }
+                    }
+                    //level 1 璇勪环
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                    //level 4 璇勪环
+                    if (current) {
+                        darkCount++;
+                    }
+                }
+            }
+            for (var col = 0; col < moduleCount; col++) {
+                var sameCount = 0;
+                var head = qrCode.modules[0][col];
+                for (var row = 0; row < moduleCount; row++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 璇勪环
+                    if (row < moduleCount - 6) {
+                        if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
+                            if (row < moduleCount - 10) {
+                                if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (row > 3) {
+                                if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 1 璇勪环
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                }
+            }
+            // LEVEL4
+            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+            lostPoint += ratio * 10;
+            return lostPoint;
+        }
+
+    };
+    //---------------------------------------------------------------------
+    // QRMath浣跨敤鐨勬暟瀛﹀伐鍏�
+    //---------------------------------------------------------------------
+    var QRMath = {
+        /*
+        灏唍杞寲涓篴^m
+         */
+        glog: function (n) {
+            if (n < 1) {
+                throw new Error("glog(" + n + ")");
+            }
+            return QRMath.LOG_TABLE[n];
+        },
+        /*
+        灏哸^m杞寲涓簄
+         */
+        gexp: function (n) {
+            while (n < 0) {
+                n += 255;
+            }
+            while (n >= 256) {
+                n -= 255;
+            }
+            return QRMath.EXP_TABLE[n];
+        },
+        EXP_TABLE: new Array(256),
+        LOG_TABLE: new Array(256)
+
+    };
+    for (var i = 0; i < 8; i++) {
+        QRMath.EXP_TABLE[i] = 1 << i;
+    }
+    for (var i = 8; i < 256; i++) {
+        QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
+    }
+    for (var i = 0; i < 255; i++) {
+        QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
+    }
+    //---------------------------------------------------------------------
+    // QRPolynomial 澶氶」寮�
+    //---------------------------------------------------------------------
+    /**
+     * 澶氶」寮忕被
+     * @param {Array} num   绯绘暟
+     * @param {num} shift a^shift
+     */
+    function QRPolynomial(num, shift) {
+        if (num.length == undefined) {
+            throw new Error(num.length + "/" + shift);
+        }
+        var offset = 0;
+        while (offset < num.length && num[offset] == 0) {
+            offset++;
+        }
+        this.num = new Array(num.length - offset + shift);
+        for (var i = 0; i < num.length - offset; i++) {
+            this.num[i] = num[i + offset];
+        }
+    }
+    QRPolynomial.prototype = {
+        get: function (index) {
+            return this.num[index];
+        },
+        getLength: function () {
+            return this.num.length;
+        },
+        /**
+         * 澶氶」寮忎箻娉�
+         * @param  {QRPolynomial} e 琚箻澶氶」寮�
+         * @return {[type]}   [description]
+         */
+        multiply: function (e) {
+            var num = new Array(this.getLength() + e.getLength() - 1);
+            for (var i = 0; i < this.getLength(); i++) {
+                for (var j = 0; j < e.getLength(); j++) {
+                    num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
+                }
+            }
+            return new QRPolynomial(num, 0);
+        },
+        /**
+         * 澶氶」寮忔ā杩愮畻
+         * @param  {QRPolynomial} e 妯″椤瑰紡
+         * @return {}
+         */
+        mod: function (e) {
+            var tl = this.getLength(),
+                el = e.getLength();
+            if (tl - el < 0) {
+                return this;
+            }
+            var num = new Array(tl);
+            for (var i = 0; i < tl; i++) {
+                num[i] = this.get(i);
+            }
+            while (num.length >= el) {
+                var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
+
+                for (var i = 0; i < e.getLength(); i++) {
+                    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+                }
+                while (num[0] == 0) {
+                    num.shift();
+                }
+            }
+            return new QRPolynomial(num, 0);
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // RS_BLOCK_TABLE
+    //---------------------------------------------------------------------
+    /*
+    浜岀淮鐮佸悇涓増鏈俊鎭痆鍧楁暟, 姣忓潡涓殑鏁版嵁鍧楁暟, 姣忓潡涓殑淇℃伅鍧楁暟]
+     */
+    var RS_BLOCK_TABLE = [
+        // L
+        // M
+        // Q
+        // H
+        // 1
+        [1, 26, 19],
+        [1, 26, 16],
+        [1, 26, 13],
+        [1, 26, 9],
+
+        // 2
+        [1, 44, 34],
+        [1, 44, 28],
+        [1, 44, 22],
+        [1, 44, 16],
+
+        // 3
+        [1, 70, 55],
+        [1, 70, 44],
+        [2, 35, 17],
+        [2, 35, 13],
+
+        // 4
+        [1, 100, 80],
+        [2, 50, 32],
+        [2, 50, 24],
+        [4, 25, 9],
+
+        // 5
+        [1, 134, 108],
+        [2, 67, 43],
+        [2, 33, 15, 2, 34, 16],
+        [2, 33, 11, 2, 34, 12],
+
+        // 6
+        [2, 86, 68],
+        [4, 43, 27],
+        [4, 43, 19],
+        [4, 43, 15],
+
+        // 7
+        [2, 98, 78],
+        [4, 49, 31],
+        [2, 32, 14, 4, 33, 15],
+        [4, 39, 13, 1, 40, 14],
+
+        // 8
+        [2, 121, 97],
+        [2, 60, 38, 2, 61, 39],
+        [4, 40, 18, 2, 41, 19],
+        [4, 40, 14, 2, 41, 15],
+
+        // 9
+        [2, 146, 116],
+        [3, 58, 36, 2, 59, 37],
+        [4, 36, 16, 4, 37, 17],
+        [4, 36, 12, 4, 37, 13],
+
+        // 10
+        [2, 86, 68, 2, 87, 69],
+        [4, 69, 43, 1, 70, 44],
+        [6, 43, 19, 2, 44, 20],
+        [6, 43, 15, 2, 44, 16],
+
+        // 11
+        [4, 101, 81],
+        [1, 80, 50, 4, 81, 51],
+        [4, 50, 22, 4, 51, 23],
+        [3, 36, 12, 8, 37, 13],
+
+        // 12
+        [2, 116, 92, 2, 117, 93],
+        [6, 58, 36, 2, 59, 37],
+        [4, 46, 20, 6, 47, 21],
+        [7, 42, 14, 4, 43, 15],
+
+        // 13
+        [4, 133, 107],
+        [8, 59, 37, 1, 60, 38],
+        [8, 44, 20, 4, 45, 21],
+        [12, 33, 11, 4, 34, 12],
+
+        // 14
+        [3, 145, 115, 1, 146, 116],
+        [4, 64, 40, 5, 65, 41],
+        [11, 36, 16, 5, 37, 17],
+        [11, 36, 12, 5, 37, 13],
+
+        // 15
+        [5, 109, 87, 1, 110, 88],
+        [5, 65, 41, 5, 66, 42],
+        [5, 54, 24, 7, 55, 25],
+        [11, 36, 12],
+
+        // 16
+        [5, 122, 98, 1, 123, 99],
+        [7, 73, 45, 3, 74, 46],
+        [15, 43, 19, 2, 44, 20],
+        [3, 45, 15, 13, 46, 16],
+
+        // 17
+        [1, 135, 107, 5, 136, 108],
+        [10, 74, 46, 1, 75, 47],
+        [1, 50, 22, 15, 51, 23],
+        [2, 42, 14, 17, 43, 15],
+
+        // 18
+        [5, 150, 120, 1, 151, 121],
+        [9, 69, 43, 4, 70, 44],
+        [17, 50, 22, 1, 51, 23],
+        [2, 42, 14, 19, 43, 15],
+
+        // 19
+        [3, 141, 113, 4, 142, 114],
+        [3, 70, 44, 11, 71, 45],
+        [17, 47, 21, 4, 48, 22],
+        [9, 39, 13, 16, 40, 14],
+
+        // 20
+        [3, 135, 107, 5, 136, 108],
+        [3, 67, 41, 13, 68, 42],
+        [15, 54, 24, 5, 55, 25],
+        [15, 43, 15, 10, 44, 16],
+
+        // 21
+        [4, 144, 116, 4, 145, 117],
+        [17, 68, 42],
+        [17, 50, 22, 6, 51, 23],
+        [19, 46, 16, 6, 47, 17],
+
+        // 22
+        [2, 139, 111, 7, 140, 112],
+        [17, 74, 46],
+        [7, 54, 24, 16, 55, 25],
+        [34, 37, 13],
+
+        // 23
+        [4, 151, 121, 5, 152, 122],
+        [4, 75, 47, 14, 76, 48],
+        [11, 54, 24, 14, 55, 25],
+        [16, 45, 15, 14, 46, 16],
+
+        // 24
+        [6, 147, 117, 4, 148, 118],
+        [6, 73, 45, 14, 74, 46],
+        [11, 54, 24, 16, 55, 25],
+        [30, 46, 16, 2, 47, 17],
+
+        // 25
+        [8, 132, 106, 4, 133, 107],
+        [8, 75, 47, 13, 76, 48],
+        [7, 54, 24, 22, 55, 25],
+        [22, 45, 15, 13, 46, 16],
+
+        // 26
+        [10, 142, 114, 2, 143, 115],
+        [19, 74, 46, 4, 75, 47],
+        [28, 50, 22, 6, 51, 23],
+        [33, 46, 16, 4, 47, 17],
+
+        // 27
+        [8, 152, 122, 4, 153, 123],
+        [22, 73, 45, 3, 74, 46],
+        [8, 53, 23, 26, 54, 24],
+        [12, 45, 15, 28, 46, 16],
+
+        // 28
+        [3, 147, 117, 10, 148, 118],
+        [3, 73, 45, 23, 74, 46],
+        [4, 54, 24, 31, 55, 25],
+        [11, 45, 15, 31, 46, 16],
+
+        // 29
+        [7, 146, 116, 7, 147, 117],
+        [21, 73, 45, 7, 74, 46],
+        [1, 53, 23, 37, 54, 24],
+        [19, 45, 15, 26, 46, 16],
+
+        // 30
+        [5, 145, 115, 10, 146, 116],
+        [19, 75, 47, 10, 76, 48],
+        [15, 54, 24, 25, 55, 25],
+        [23, 45, 15, 25, 46, 16],
+
+        // 31
+        [13, 145, 115, 3, 146, 116],
+        [2, 74, 46, 29, 75, 47],
+        [42, 54, 24, 1, 55, 25],
+        [23, 45, 15, 28, 46, 16],
+
+        // 32
+        [17, 145, 115],
+        [10, 74, 46, 23, 75, 47],
+        [10, 54, 24, 35, 55, 25],
+        [19, 45, 15, 35, 46, 16],
+
+        // 33
+        [17, 145, 115, 1, 146, 116],
+        [14, 74, 46, 21, 75, 47],
+        [29, 54, 24, 19, 55, 25],
+        [11, 45, 15, 46, 46, 16],
+
+        // 34
+        [13, 145, 115, 6, 146, 116],
+        [14, 74, 46, 23, 75, 47],
+        [44, 54, 24, 7, 55, 25],
+        [59, 46, 16, 1, 47, 17],
+
+        // 35
+        [12, 151, 121, 7, 152, 122],
+        [12, 75, 47, 26, 76, 48],
+        [39, 54, 24, 14, 55, 25],
+        [22, 45, 15, 41, 46, 16],
+
+        // 36
+        [6, 151, 121, 14, 152, 122],
+        [6, 75, 47, 34, 76, 48],
+        [46, 54, 24, 10, 55, 25],
+        [2, 45, 15, 64, 46, 16],
+
+        // 37
+        [17, 152, 122, 4, 153, 123],
+        [29, 74, 46, 14, 75, 47],
+        [49, 54, 24, 10, 55, 25],
+        [24, 45, 15, 46, 46, 16],
+
+        // 38
+        [4, 152, 122, 18, 153, 123],
+        [13, 74, 46, 32, 75, 47],
+        [48, 54, 24, 14, 55, 25],
+        [42, 45, 15, 32, 46, 16],
+
+        // 39
+        [20, 147, 117, 4, 148, 118],
+        [40, 75, 47, 7, 76, 48],
+        [43, 54, 24, 22, 55, 25],
+        [10, 45, 15, 67, 46, 16],
+
+        // 40
+        [19, 148, 118, 6, 149, 119],
+        [18, 75, 47, 31, 76, 48],
+        [34, 54, 24, 34, 55, 25],
+        [20, 45, 15, 61, 46, 16]
+    ];
+
+    /**
+     * 鏍规嵁鏁版嵁鑾峰彇瀵瑰簲鐗堟湰
+     * @return {[type]} [description]
+     */
+    QRCodeAlg.prototype.getRightType = function () {
+        for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
+            var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
+            if (rsBlock == undefined) {
+                throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
+            }
+            var length = rsBlock.length / 3;
+            var totalDataCount = 0;
+            for (var i = 0; i < length; i++) {
+                var count = rsBlock[i * 3 + 0];
+                var dataCount = rsBlock[i * 3 + 2];
+                totalDataCount += dataCount * count;
+            }
+            var lengthBytes = typeNumber > 9 ? 2 : 1;
+            if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
+                this.typeNumber = typeNumber;
+                this.rsBlock = rsBlock;
+                this.totalDataCount = totalDataCount;
+                break;
+            }
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // QRBitBuffer
+    //---------------------------------------------------------------------
+    function QRBitBuffer() {
+        this.buffer = new Array();
+        this.length = 0;
+    }
+    QRBitBuffer.prototype = {
+        get: function (index) {
+            var bufIndex = Math.floor(index / 8);
+            return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
+        },
+        put: function (num, length) {
+            for (var i = 0; i < length; i++) {
+                this.putBit(((num >>> (length - i - 1)) & 1));
+            }
+        },
+        putBit: function (bit) {
+            var bufIndex = Math.floor(this.length / 8);
+            if (this.buffer.length <= bufIndex) {
+                this.buffer.push(0);
+            }
+            if (bit) {
+                this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
+            }
+            this.length++;
+        }
+    };
+
+
+
+    // xzedit
+    let qrcodeAlgObjCache = [];
+    /**
+     * 浜岀淮鐮佹瀯閫犲嚱鏁帮紝涓昏鐢ㄤ簬缁樺埗
+     * @param  {鍙傛暟鍒楄〃} opt 浼犻�掑弬鏁�
+     * @return {}
+     */
+    QRCode = function (opt) {
+        //璁剧疆榛樿鍙傛暟
+        this.options = {
+            text: '',
+            size: 256,
+            correctLevel: 3,
+            background: '#ffffff',
+            foreground: '#000000',
+            pdground: '#000000',
+            image: '',
+            imageSize: 30,
+            canvasId: opt.canvasId,
+            context: opt.context,
+            usingComponents: opt.usingComponents,
+            showLoading: opt.showLoading,
+            loadingText: opt.loadingText,
+        };
+        if (typeof opt === 'string') { // 鍙紪鐮丄SCII瀛楃涓�
+            opt = {
+                text: opt
+            };
+        }
+        if (opt) {
+            for (var i in opt) {
+                this.options[i] = opt[i];
+            }
+        }
+        //浣跨敤QRCodeAlg鍒涘缓浜岀淮鐮佺粨鏋�
+        var qrCodeAlg = null;
+        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
+            if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
+                qrCodeAlg = qrcodeAlgObjCache[i].obj;
+                break;
+            }
+        }
+        if (i == l) {
+            qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
+            qrcodeAlgObjCache.push({
+                text: this.options.text,
+                correctLevel: this.options.correctLevel,
+                obj: qrCodeAlg
+            });
+        }
+        /**
+         * 璁$畻鐭╅樀鐐圭殑鍓嶆櫙鑹�
+         * @param {Obj} config
+         * @param {Number} config.row 鐐箈鍧愭爣
+         * @param {Number} config.col 鐐箉鍧愭爣
+         * @param {Number} config.count 鐭╅樀澶у皬
+         * @param {Number} config.options 缁勪欢鐨刼ptions
+         * @return {String}
+         */
+        let getForeGround = function (config) {
+            var options = config.options;
+            if (options.pdground && (
+                (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
+                (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
+                (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
+            )) {
+                return options.pdground;
+            }
+            return options.foreground;
+        }
+        // 鍒涘缓canvas
+        let createCanvas = function (options) {
+            if (options.showLoading) {
+                uni.showLoading({
+                    title: options.loadingText,
+                    mask: true
+                });
+            }
+            var ctx = uni.createCanvasContext(options.canvasId, options.context);
+            var count = qrCodeAlg.getModuleCount();
+            var ratioSize = options.size;
+            var ratioImgSize = options.imageSize;
+            //璁$畻姣忎釜鐐圭殑闀垮
+            var tileW = (ratioSize / count).toPrecision(4);
+            var tileH = (ratioSize / count).toPrecision(4);
+            //缁樺埗
+            for (var row = 0; row < count; row++) {
+                for (var col = 0; col < count; col++) {
+                    var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
+                    var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
+                    var foreground = getForeGround({
+                        row: row,
+                        col: col,
+                        count: count,
+                        options: options
+                    });
+                    ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
+                    ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
+                }
+            }
+            if (options.image) {
+                var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
+                ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
+                // 鐢诲渾瑙掔煩褰�
+                function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
+                    ctxi.setLineWidth(lineWidth);
+                    ctxi.setFillStyle(options.background);
+                    ctxi.setStrokeStyle(options.background);
+                    ctxi.beginPath(); // draw top and top right corner 
+                    ctxi.moveTo(x + r, y);
+                    ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner 
+                    ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner 
+                    ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner 
+                    ctxi.arcTo(x, y, x + r, y, r);
+                    ctxi.closePath();
+                    if (fill) {
+                        ctxi.fill();
+                    }
+                    if (stroke) {
+                        ctxi.stroke();
+                    }
+                }
+            }
+            setTimeout(() => {
+                ctx.draw(true, () => {
+                    // 淇濆瓨鍒颁复鏃跺尯鍩�
+                    setTimeout(() => {
+                        uni.canvasToTempFilePath({
+                            width: options.width,
+                            height: options.height,
+                            destWidth: options.width,
+                            destHeight: options.height,
+                            canvasId: options.canvasId,
+                            quality: Number(1),
+                            success: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res.tempFilePath)
+                                }
+                            },
+                            fail: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res)
+                                }
+                            },
+                            complete: function () {
+                                if (options.showLoading){
+                                    uni.hideLoading();
+                                }
+                            },
+                        }, options.context);
+                    }, options.text.length + 100);
+                });
+            }, options.usingComponents ? 0 : 150);
+        }
+        createCanvas(this.options);
+        // 绌哄垽瀹�
+        let empty = function (v) {
+            let tp = typeof v,
+                rt = false;
+            if (tp == "number" && String(v) == "") {
+                rt = true
+            } else if (tp == "undefined") {
+                rt = true
+            } else if (tp == "object") {
+                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
+            } else if (tp == "string") {
+                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
+            } else if (tp == "function") {
+                rt = false
+            }
+            return rt
+        }
+    };
+    QRCode.prototype.clear = function (fn) {
+        var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
+        ctx.clearRect(0, 0, this.options.size, this.options.size)
+        ctx.draw(false, () => {
+            if (fn) {
+                fn()
+            }
+        })
+    };
+})()
+
+export default QRCode
\ No newline at end of file
diff --git a/h5/utils/service.js b/h5/utils/service.js
new file mode 100644
index 0000000..70e1617
--- /dev/null
+++ b/h5/utils/service.js
@@ -0,0 +1,65 @@
+import { baseUrl } from "./config.js"
+export const http = function (options) {
+	{
+		return new Promise((resolve, reject) => {
+			let token = uni.getStorageSync('token') || ''
+			// 鍦ㄧ櫥褰曠殑鏃跺�欓渶瑕佸偍瀛� token uni.setStorageSync("authorization","杩欓噷鏄櫥褰曡幏鍙栫殑token鍊�")
+
+			// uni.showLoading({
+			// 	title:"鍔犺浇涓�..."
+			// })
+			uni.showLoading({
+				title: '鍔犺浇涓�',
+				mask: true
+			})
+			uni.request({
+				url: baseUrl + options.url,
+				data: options.data || {},
+				method: options.method || 'GET',
+				header: options.header || {
+					// 鏍规嵁瀹為檯鎺ュ彛璁捐 key 鍙� token 鎴栬�� authorization
+					dm_user_token: token,
+					"content-type": 'application/json'
+				},
+				success: (res) => {
+					let data = res.data
+					// 鎺у埗鍙版樉绀烘暟鎹俊鎭�
+					uni.hideLoading()
+					// 鐧诲綍杩囨湡
+					if (data.code !== 200) {
+						setTimeout(() => {
+							uni.showToast({
+								title: data.message,
+								icon: "none",
+								duration: 2000
+							})
+						})
+						if (data.code === 500 || data.code === 5112) {
+							uni.clearStorageSync()
+							return uni.navigateTo({
+								url: '/pages/login/login'
+							})
+						}
+						return
+					}
+					resolve(data)
+					// return response.data
+				},
+				fail: (err) => {
+					// 椤甸潰涓脊妗嗘樉绀哄け璐�
+					uni.showToast({
+						title: '璇锋眰鎺ュ彛澶辫触'
+					})
+
+					// 杩斿洖閿欒娑堟伅
+					reject(err)
+					uni.hideLoading()
+					return Promise.reject(err)
+				},
+				catch: (e) => {
+					console.log(e)
+				}
+			})
+		})
+	}
+}
\ No newline at end of file
diff --git a/h5/utils/utils.js b/h5/utils/utils.js
new file mode 100644
index 0000000..08378e8
--- /dev/null
+++ b/h5/utils/utils.js
@@ -0,0 +1,163 @@
+/**
+ * 鏃堕棿鍓嶅悗鍚戝墠鎺ㄧ畻鏃堕棿闆嗗悎
+ * @param {string:before|after} timebd锛氳幏鍙栨椂闂村線鍚庢帹锛岃繕鏄線鍓嶆帹锛�
+ * @param {boole} haveCurrentDay锛氬寘涓嶅寘鍚綋澶╂椂闂达紝
+ * @param {number} Days锛氳绠楀嚑澶╃殑鏃堕棿锛�
+ * @param {string:"2023-11-02"} timing锛氭寚瀹氫笉鎸囧畾褰撳ぉ鐨勬棩鏈�
+ * @returns {array}鏁版嵁闆嗗悎
+ */
+export const nextDay = (timebd, haveCurrentDay, Days, timing) => {
+
+    let today = new Date()   //鑾峰彇浠婂ぉ鐨勬棩鏈�
+    if (timing) {
+      today = new Date(timing)
+    }
+    let date2 = new Date(today);  
+    let dateArray = []
+    timebd=timebd ? timebd:"after"
+    haveCurrentDay=haveCurrentDay ? true:false
+    Days=Days ? Days:7
+    function TimestampToDate2(Timestamp) {
+    銆�銆�let now = new Date(Timestamp),
+    銆�銆�y = now.getFullYear(),
+    銆�銆�m = now.getMonth() + 1,
+    銆�銆�d = now.getDate();
+    銆�銆�return y + "-" + (m < 10 ? "0" + m : m) + "-" + (d < 10 ? "0" + d : d);
+    }
+    let fori=haveCurrentDay ? 0:1;
+    let fortotal=haveCurrentDay ? Days:Days+1;
+    for(let i = fori; i < fortotal; i++){
+      let everyDay=""
+      if (timebd=="after") {//鏈潵
+        everyDay=date2.setDate(today.getDate() + i)
+      }else{//杩囧幓
+        everyDay=date2.setDate(today.getDate() - i)
+      }
+      dateArray.push(TimestampToDate2(everyDay))  //鑾峰彇鏈潵7澶╁唴鐨勬棩鏈�
+    }
+    if (timebd=="after") {//鏈潵
+      return dateArray
+    }else{//杩囧幓
+      return dateArray.reverse()
+    }
+  }
+
+/**
+ * 杩斿洖涓や釜鏃ユ湡涔嬪墠鐨勫ぉ鏁�
+ */
+export const getDateByDays = (startDate, endDdate) => {
+	let d1 = Date.parse(new Date(startDate));
+	let d2 = Date.parse(new Date(endDdate));
+    // 鏃堕棿鎴崇浉鍑� / 澶╂暟
+	let day = parseInt((d2 - d1) / (1000 * 60 * 60 * 24));
+	return day
+}
+
+// 鑾峰彇澶氬皯澶╁悗鐨勬棩鏈�
+export const getDaysAfterDate = (date, days) => {
+	if (days === 0) {
+		return '2099-01-01'
+	}
+	const now = new Date(date);
+	now.setDate(now.getDate() + days);
+	const year = now.getFullYear();
+	const month = now.getMonth() + 1; // 鏈堜唤鏄粠0寮�濮嬬殑
+	const day = now.getDate();
+	return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
+}
+
+
+// meeting
+/**
+ * 鑾峰彇褰撳ぉ鏃ユ湡
+ **/
+export const getDay = () => {
+	let date = new Date();
+	var year = date.getFullYear();
+	var month = date.getMonth() + 1;
+	var day = date.getDate();
+	month = (month > 9) ? month : ("0" + month);
+	day = (day < 10) ? ("0" + day) : day;
+	let week = '鏄熸湡' + '鏃ヤ竴浜屼笁鍥涗簲鍏�'.charAt(new Date().getDay())
+	var today = year + "骞�" + month + "鏈�" + day + "鏃�" + " " + week;
+	
+	return {
+		today,
+		date: year + "-" + month + "-" + day,
+		day
+	};
+}
+
+/**
+ * 鑾峰彇涓婁竴澶╂棩鏈�
+ **/
+export const getPreviousDay = (number, val) => {
+	let num = (24*60*60*1000) * number;
+	let date = ''
+	if (val) {
+		date = new Date(new Date(val).getTime() - num);
+	} else {
+		date = new Date(new Date().getTime() - num);
+	}
+	var year = date.getFullYear();
+	var month = date.getMonth() + 1;
+	var day = date.getDate();
+	month = (month > 9) ? month : ("0" + month);
+	day = (day < 10) ? ("0" + day) : day;
+	let week = '鏄熸湡' + '鏃ヤ竴浜屼笁鍥涗簲鍏�'.charAt(date.getDay())
+	var today = year + "骞�" + month + "鏈�" + day + "鏃�" + " " + week;
+	
+	return {
+		today,
+		date: year + "-" + month + "-" + day
+	};
+}
+
+// 鏍煎紡鍖栨棩瀵硅薄
+export const getNowDate = () => {
+  var date = new Date();
+  var sign2 = ":";
+  var year = date.getFullYear() // 骞�
+  var month = date.getMonth() + 1; // 鏈�
+  var day = date.getDate(); // 鏃�
+  var hour = date.getHours(); // 鏃�
+  var minutes = date.getMinutes(); // 鍒�
+  var seconds = date.getSeconds() //绉�
+  var weekArr = ['鏄熸湡涓�', '鏄熸湡浜�', '鏄熸湡涓�', '鏄熸湡鍥�', '鏄熸湡浜�', '鏄熸湡鍏�', '鏄熸湡澶�'];
+  var week = weekArr[date.getDay()];
+  // 缁欎竴浣嶆暟鐨勬暟鎹墠闈㈠姞 鈥�0鈥�
+  if (month >= 1 && month <= 9) {
+    month = "0" + month;
+  }
+  if (day >= 0 && day <= 9) {
+    day = "0" + day;
+  }
+  if (hour >= 0 && hour <= 9) {
+    hour = "0" + hour;
+  }
+  if (minutes >= 0 && minutes <= 9) {
+    minutes = "0" + minutes;
+  }
+  if (seconds >= 0 && seconds <= 9) {
+    seconds = "0" + seconds;
+  }
+  return year + "-" + month + "-" + day + " " + hour + sign2 + minutes + sign2 + seconds;
+}
+
+//蹇呴』涓哄瓧姣嶅姞鏁板瓧涓旈暱搴︿笉灏忎簬8浣�
+export const CheckPassWord = (password) => {	
+   var str = password;
+    if (str == null || str.length <8) {
+        return false;
+    }
+    var reg1 = new RegExp(/^[0-9A-Za-z]+$/);
+    if (!reg1.test(str)) {
+        return false;
+    }
+    var reg = new RegExp(/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/);
+    if (reg.test(str)) {
+        return true;
+    } else {
+        return false;
+    }
+}
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index 336d44e..fcabf72 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -184,6 +184,48 @@
     public static final String TIMEOUT_WARNING = "TIMEOUT_WARNING";
     // FTP鏂囦欢鏈嶅姟鍣ㄨ祫婧愯闂湴鍧�
 
+    /**
+     *    浠樻鍛ㄦ湡绫诲瀷 0=鍏冩瘡骞崇背澶╋紱1=鍏冩瘡骞崇背鏈堬紱2=鍏冩瘡骞崇背骞达紱3=鍏冩瘡澶╋紱4=鍏冩瘡鏈堬紱5=鍏冩瘡骞达紱6=鍏冩瘡鍦猴紱
+     * @param circleType
+     * @return
+     */
+    public static String getUnitTypeByNum(Integer circleType) {
+
+        int zlPayType = Constants.formatIntegerNum(circleType);
+        if(zlPayType == 1){
+            return "鍏�/銕÷锋湀";
+        }else   if(zlPayType == 2){
+            return "鍏�/銕÷峰ぉ";
+        }else  if(zlPayType == 3){
+            return "鍏�/澶�";
+        }else  if(zlPayType == 4){
+            return "鍏�/鏈�";
+        }else  if(zlPayType == 5){
+            return "鍏�/骞�";
+        }else  if(zlPayType == 6){
+            return "鍏�/鍦�";
+        }
+        return "鍏�/銕÷峰ぉ";
+    }
+
+    /**
+     *  鍛ㄦ湡鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�
+     * @param zlPayType
+     * @return
+     */
+    public static String getPayTypeByNum(Integer zlPayType) {
+        if(zlPayType == null){
+            return  "";
+        }
+        if(zlPayType == 1){
+            return "3涓湀涓�浠�";
+        }else   if(zlPayType == 2){
+            return "6涓湀涓�浠�";
+        }else  if(zlPayType == 3){
+            return "1骞翠竴浠�";
+        }
+        return "涓�娆℃�т粯娆�";
+    }
 
     public static String getRandom6Num( ) {
         Random random = new Random();
@@ -1319,9 +1361,9 @@
         WORKORDER_CREATE(0, "宸ュ崟鍒涘缓", "宸ュ崟鍒涘缓"),
         WORKORDER_DISPATCH(1, "宸ュ崟鎸囨淳", "宸ュ崟鎸囨淳"),
         WORKORDER_DEAL(2, "宸ュ崟澶勭悊 ", "宸ュ崟澶勭悊 "),
-        CONTRACT_CREATE(3, "鍚堝悓鍒涘缓 ", "鍚堝悓鍒涘缓 "),
-        CONTRACT_UPDATE(4, "鍚堝悓鍙樻洿 ", "鍚堝悓鍙樻洿 "),
-        CONTRACT_BACK(5, "鍚堝悓閫�绉� ", "鍚堝悓閫�绉� "),
+        CONTRACT_CREATE(3, "鍚堝悓鏂板缓 ", "鏂板缓 "),
+        CONTRACT_UPDATE(4, "鍚堝悓鍙樻洿 ", "鍙樻洿 "),
+        CONTRACT_BACK(5, "鍚堝悓閫�绉� ", "閫�绉� "),
 
         ;
         // 鎴愬憳鍙橀噺
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java b/server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java
index 1335d95..1164e74 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java
@@ -67,14 +67,23 @@
         BigDecimal monthFloat = new BigDecimal(month) ;
 
         int yearDays = day - DateUtil.daysBetweenDates(DateUtil.addYearToDate(fromDate,year),fromDate) ;
-        if(yearDays>0){
+        if(yearDays!=0){
             yearFloat = yearFloat.add(new BigDecimal(yearDays).divide(new BigDecimal(365), 2,RoundingMode.FLOOR));
         }
         int monthDays = day - DateUtil.daysBetweenDates(DateUtil.addMonthToDate(fromDate,month),fromDate) ;
-        if(monthDays>0){
-            monthFloat = monthFloat.add(new BigDecimal(monthDays).divide(new BigDecimal(30), 2,RoundingMode.FLOOR));
+        if(monthDays!=0){
+            monthFloat = monthFloat.add(new BigDecimal(monthDays*12).divide(new BigDecimal(365), 2,RoundingMode.FLOOR));
         }
         return DateCompare.builder().day(day).month(month).year(year).yearFloat(yearFloat).monthFloat(monthFloat).yearDays(yearDays).monthDays(monthDays).build();
+    }
+
+    public static void main(String[] args) {
+        DateCompare dateCompare =   DateCompare.dayCompare(DateUtil.getDateFromString("2024-12-01 00:00:00"),DateUtil.getDateByString("2025-03-01 00:00:00")
+                ,DateUtil.getDateFromString("2024-12-01 00:00:00"),DateUtil.getDateFromString("2024-12-03 00:00:00"));
+        System.out.println(dateCompare.monthFloat);
+        System.out.println(dateCompare.yearFloat);
+        System.out.println(dateCompare.yearFloat);
+        System.out.println(dateCompare.yearFloat);
     }
     public static DateCompare monthYearCompare(Date fromDate,Date toDate ){
         //寮�濮嬫椂闂村線鍚庡欢浼革紝闄ゅ幓鏈夋晥鏃舵湡
@@ -96,12 +105,12 @@
         BigDecimal monthFloat = new BigDecimal(month) ;
 
         int yearDays = day - DateUtil.daysBetweenDates(DateUtil.addYearToDate(fromDate,year),fromDate) ;
-        if(yearDays>0){
+        if(yearDays!=0){
             yearFloat = yearFloat.add(new BigDecimal(yearDays).divide(new BigDecimal(365), 2,RoundingMode.FLOOR));
         }
         int monthDays = day - DateUtil.daysBetweenDates(DateUtil.addMonthToDate(fromDate,month),fromDate) ;
-        if(monthDays>0){
-            monthFloat = monthFloat.add(new BigDecimal(monthDays).divide(new BigDecimal(30), 2,RoundingMode.FLOOR));
+        if(monthDays!=0){
+            monthFloat = monthFloat.add(new BigDecimal(monthDays*12).divide(new BigDecimal(365), 2,RoundingMode.FLOOR));
         }
         return DateCompare.builder().day(day).month(month).year(year).yearFloat(yearFloat).monthFloat(monthFloat).yearDays(yearDays).monthDays(monthDays).build();
     }
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java b/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
index 3e39c9f..51d30ab 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -2851,7 +2851,7 @@
 //            System.out.println(DateUtil.afterMinutesDate(-5));
 
 
-            DateUtil.getBeforDays(new Date(),7);
+          System.out.println(DateUtil.getPlusTime2(addMonthToDate(new Date(),3)));
 
 //            Date startTime = DateUtil.StringToDate("2024-05-01 08:00:00" ,"yyyy-MM-dd HH:mm:ss");
 //            Date endTime = DateUtil.StringToDate("2024-05-01 17:00:00" ,"yyyy-MM-dd HH:mm:ss");
diff --git a/server/system_service/src/main/java/com/doumee/dao/system/MultifileMapper.java b/server/system_service/src/main/java/com/doumee/dao/system/MultifileMapper.java
index 1b1d62b..cedffeb 100644
--- a/server/system_service/src/main/java/com/doumee/dao/system/MultifileMapper.java
+++ b/server/system_service/src/main/java/com/doumee/dao/system/MultifileMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.system.model.Multifile;
+import com.github.yulichang.base.MPJBaseMapper;
 
 import java.util.List;
 
@@ -9,6 +10,6 @@
  * @author 姹熻箘韫�
  * @date 2023/05/04 18:18
  */
-public interface MultifileMapper extends BaseMapper<Multifile> {
+public interface MultifileMapper extends MPJBaseMapper<Multifile> {
 
 }
diff --git a/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java b/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java
index add8c58..b0a6fb3 100644
--- a/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java
+++ b/server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java
@@ -79,6 +79,9 @@
     @TableField(exist = false)
     private String fileurlFull;
 
+    @ApiModelProperty(value = "鍒涘缓浜哄悕绉�")
+    @TableField(exist = false)
+    private String userName;
 
     @ApiModelProperty(value = "鍐呯綉鏂囦欢鍦板潃")
     @TableField(exist = false)
diff --git a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
index cb818f9..cc4a379 100644
--- a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
+++ b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
@@ -86,6 +86,13 @@
     @GetMapping("/timer/sms/sendWaitingSmsNotice")
     ApiResponse sendWaitingSmsNotice();
 
+    @ApiOperation("銆愰槣瀹佽繍缁淬�戝畾鏃跺鐞嗗悎鍚岃处鍗曠紪鐮�")
+    @GetMapping("/timer/yw/ywDealContractBillCodeTimer")
+    ApiResponse ywDealContractBillCodeTimer();
+
+    @ApiOperation("銆愰槣瀹佽繍缁淬�戝畾鏃跺鐞嗗悎鍚岃繃鏈�")
+    @GetMapping("/timer/yw/ywDealContractTimeOutTimer")
+    ApiResponse ywDealContractTimeOutTimer();
 
 
 }
diff --git a/server/system_timer/src/main/resources/bootstrap.yml b/server/system_timer/src/main/resources/bootstrap.yml
index 05a83ce..107b53b 100644
--- a/server/system_timer/src/main/resources/bootstrap.yml
+++ b/server/system_timer/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: pro
+    active: dev
   application:
     name: systemTimer
     # 瀹夊叏閰嶇疆
diff --git a/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
new file mode 100644
index 0000000..bfa5c41
--- /dev/null
+++ b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
@@ -0,0 +1,69 @@
+package com.doumee.api;
+
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.business.model.YwContract;
+import com.doumee.service.business.PlatformJobService;
+import com.doumee.service.business.YwContractBillService;
+import com.doumee.service.business.YwContractService;
+import com.doumee.service.system.SystemDictDataService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/11/28 10:58
+ */
+@Api(tags = "闃滃畞杩愮淮绯荤粺瀹氭椂鍣ㄦ帴鍙�")
+@RestController
+@RequestMapping("/timer/yw")
+public class YwTimerController  extends BaseController {
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private SystemDictDataService systemDictDataService;
+
+    @Autowired
+    private YwContractBillService ywContractBillService;
+
+    @Autowired
+    private YwContractService ywContractService;
+
+
+    @ApiOperation("瀹氭椂澶勭悊鍚堝悓璐﹀崟缂栫爜")
+    @GetMapping("/ywDealContractBillCodeTimer")
+    public ApiResponse ywDealContractBillCodeTimer() {
+        ywContractBillService.dealDayBillCode();
+        return ApiResponse.success("瀹氭椂澶勭悊鍚堝悓璐﹀崟缂栫爜");
+    }
+
+
+    @ApiOperation("瀹氭椂澶勭悊鍚堝悓杩囨湡涓庢墽琛屼腑")
+    @GetMapping("/ywDealContractTimeOutTimer")
+    public ApiResponse ywDealContractTimeOutTimer() {
+        ywContractService.dealTimeOut();
+        return ApiResponse.success("瀹氭椂澶勭悊鍚堝悓杩囨湡涓庢墽琛屼腑");
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/AreasCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/AreasCloudController.java
new file mode 100644
index 0000000..6c0f5a8
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/AreasCloudController.java
@@ -0,0 +1,115 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.dto.AreasDto;
+import com.doumee.dao.business.model.Areas;
+import com.doumee.service.business.AreasService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+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 2023/02/15 08:55
+ */
+@Api(tags = "鐪佸競鍖轰俊鎭〃")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/areas")
+public class AreasCloudController extends BaseController {
+
+    @Autowired
+    private AreasService areasService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:areas:create")
+    public ApiResponse create(@RequestBody Areas areas,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        areas.setLoginUserInfo(getLoginUser(token));
+        return ApiResponse.success(areasService.create(areas));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:areas:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        areasService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:areas:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        areasService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:areas:update")
+    public ApiResponse updateById(@RequestBody Areas areas,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        areas.setLoginUserInfo(getLoginUser(token));
+        areasService.updateById(areas);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+//    @CloudRequiredPermission("business:areas:query")
+    public ApiResponse<PageData<Areas>> findPage (@RequestBody PageWrap<Areas> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(areasService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鍏ㄩ儴鏍戝舰鏌ヨ")
+    @PostMapping("/treeList")
+//    @CloudRequiredPermission("business:areas:query")
+    public ApiResponse<List<Areas>> treeList (@RequestBody AreasDto pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        Areas a = new Areas();
+        BeanUtils.copyProperties(pageWrap,a);
+        return ApiResponse.success(areasService.findList(a));
+    }
+    @ApiOperation("鏍规嵁鐖惰妭鐐规煡涓�")
+    @PostMapping("/listByParentId")
+//    @CloudRequiredPermission("business:areas:query")
+    public ApiResponse<List<Areas>> listByParentId (@RequestBody AreasDto pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        Areas a = new Areas();
+        BeanUtils.copyProperties(pageWrap,a);
+//        PageWrap<Areas> wrap = new PageWrap<>();
+//        wrap.setPage(Constants.ONE);
+//        wrap.setCapacity(9999);
+//        wrap.setModel(a);
+        return ApiResponse.success(areasService.listByParentId(a));
+    }
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:areas:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Areas> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(Areas.class).export(areasService.findPage(pageWrap).getRecords(), "鐪佸競鍖轰俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:areas:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(areasService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java
index d9b57e6..e76ef3f 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java
@@ -151,6 +151,7 @@
     @PostMapping("/updateStatusById")
     @CloudRequiredPermission("business:company:update")
     public ApiResponse updateStatusById(@RequestBody Company company,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        company.setLoginUserInfo(getLoginUser(token));
         companyService.updateStatusById(company);
         return ApiResponse.success(null);
     }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
index 73abf9f..9896571 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
@@ -9,6 +9,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.YwContract;
+import com.doumee.dao.business.model.YwContractBill;
 import com.doumee.service.business.YwContractService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -39,6 +40,14 @@
     public ApiResponse create(@RequestBody YwContract ywContract,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ywContract.setLoginUserInfo(this.getLoginUser(token));
         return ApiResponse.success(ywContractService.create(ywContract));
+    }
+    @PreventRepeat
+    @ApiOperation("鏍规嵁鍙傛暟棰勭敓鎴愯处鍗曚俊鎭�")
+    @PostMapping("/getBillList")
+    @CloudRequiredPermission("business:ywcontract:create")
+    public ApiResponse< List<YwContractBill> > getBillList(@RequestBody YwContract ywContract, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywContract.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywContractService.getBillList(ywContract));
     }
     @PreventRepeat
     @ApiOperation("閫�绉�")
@@ -87,6 +96,15 @@
         return ApiResponse.success(ywContractService.findPage(pageWrap));
     }
 
+
+    @ApiOperation("鍒楄〃")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:ywcontract:query")
+    public ApiResponse<List<YwContract>> list (@RequestBody YwContract model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractService.findList(model));
+    }
+
+
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:ywcontract:exportExcel")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java
index 735b99e..d412d4d 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRoomCloudController.java
@@ -93,6 +93,17 @@
         pageWrap.setLoginUserInfo(this.getLoginUser(token));
         return ApiResponse.success(ywContractRoomService.findList(pageWrap));
     }
+
+
+    @ApiOperation("鏌ヨ鍚堝悓鎴栬处鍗曟埧闂翠俊鎭�")
+    @PostMapping("/getContractRoom")
+    @CloudRequiredPermission("business:ywcontractroom:query")
+    public ApiResponse<List<YwContractRoom>> getContractRoom (@RequestBody  YwContractRoom pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        pageWrap.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(ywContractRoomService.getContractRoom(pageWrap));
+    }
+
+
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:ywcontractroom:query")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
index f71ff2c..02e8e94 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
@@ -9,6 +9,7 @@
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.YwProject;
 import com.doumee.dao.business.model.YwRoom;
+import com.doumee.dao.business.vo.ProjectDataVO;
 import com.doumee.service.business.YwProjectService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -85,6 +86,16 @@
         return ApiResponse.success(ywProjectService.findPage(pageWrap));
     }
 
+
+    @ApiOperation("椤圭洰鏍�")
+    @PostMapping("/tree")
+    @CloudRequiredPermission("business:ywproject:query")
+    public ApiResponse<List<ProjectDataVO>> tree (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywProjectService.projectTree());
+    }
+
+
+
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:ywproject:exportExcel")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/AreasMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/AreasMapper.java
new file mode 100644
index 0000000..6e66e24
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/AreasMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Areas;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+public interface AreasMapper extends BaseMapper<Areas> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AreasDto.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AreasDto.java
new file mode 100644
index 0000000..12db167
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AreasDto.java
@@ -0,0 +1,23 @@
+package com.doumee.dao.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/02/14 11:14
+ */
+@Data
+@ApiModel("鐪佸競鍖烘煡璇㈠弬鏁�")
+public class AreasDto implements Serializable {
+
+    @ApiModelProperty(value = "鍚嶇О" )
+    private String name;
+    @ApiModelProperty(value = "绫诲瀷 0鐪� 1甯� 2鍖哄幙", example = "1")
+    private Integer type;
+    @ApiModelProperty(value = "鐖惰妭鐐圭紪鐮�", example = "1")
+    private Integer parentId;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Areas.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Areas.java
new file mode 100644
index 0000000..4176a9d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Areas.java
@@ -0,0 +1,109 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鐪佸競鍖轰俊鎭〃
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+@Data
+@ApiModel("鐪佸競鍖轰俊鎭〃")
+@TableName("`areas`")
+public class Areas extends LoginUserModel implements Cloneable{
+
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    @TableId(value = "id",type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String info;
+
+    @ApiModelProperty(value = "琛屾斂鍖轰唬鐮�")
+    @ExcelColumn(name="琛屾斂鍖轰唬鐮�")
+    private String code;
+
+    @ApiModelProperty(value = "鐖剁骇缂栫爜锛堝叧鑱攁reas琛級", example = "1")
+    @ExcelColumn(name="鐖剁骇缂栫爜锛堝叧鑱攁reas琛級")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "绫诲瀷 0鐪� 1甯� 2鍖哄幙", example = "1")
+    @ExcelColumn(name="绫诲瀷 0鐪� 1甯� 2鍖哄幙")
+    private Integer type;
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @TableField(exist = false)
+    private List<Areas> childList;
+    @TableField(exist = false)
+    private Integer provinceId;
+    @TableField(exist = false)
+    private String provinceName;
+    @TableField(exist = false)
+    private Integer cityId;
+    @TableField(exist = false)
+    private String cityName;
+    //瀹炵幇Cloneable鐨刢lone鏂规硶锛屽皢clone瀹氫箟涓簆ublic
+    public Areas clone()   {
+        try {
+            return (Areas) super.clone();
+        } catch (CloneNotSupportedException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    @Override
+    public String toString() {
+        return "Areas{" +
+            "id=" + id +
+            ", creator=" + creator +
+            ", createDate=" + createDate +
+            ", editor=" + editor +
+            ", editDate=" + editDate +
+            ", isdeleted=" + isdeleted +
+            ", name='" + name + '\'' +
+            ", info='" + info + '\'' +
+            ", code='" + code + '\'' +
+            ", parentId=" + parentId +
+            ", type=" + type +
+            '}';
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
index 7247bdf..85292b5 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
@@ -54,9 +54,10 @@
     @ExcelColumn(name="鍚堝悓鎽樿")
     private String remark;
 
-    @ApiModelProperty(value = "鐘舵�� 0寰呮墽琛� 1鎵ц涓� 2宸插埌鏈� 3宸查��绉�", example = "1")
-    @ExcelColumn(name="鐘舵�� 0寰呮墽琛� 1鎵ц涓� 2宸插埌鏈� 3宸查��绉�")
+    @ApiModelProperty(value = "鐘舵�� 0寰呮墽琛� 1鎵ц涓� 2宸插埌鏈� 3閫�绉熶腑 4宸查��绉�", example = "1")
+    @ExcelColumn(name="鐘舵�� 0寰呮墽琛� 1鎵ц涓� 2宸插埌鏈� 3閫�绉熶腑 4宸查��绉�")
     private Integer status;
+
     @ApiModelProperty(value = "璐﹀崟缁撴竻鐘舵�侊細 0寰呬粯娆� 1閮ㄥ垎鏀舵 2宸茬粨娓� 3宸插叧闂�", example = "1")
     @ExcelColumn(name="璐﹀崟缁撴竻鐘舵�侊細 0寰呬粯娆� 1閮ㄥ垎鏀舵 2宸茬粨娓� 3宸插叧闂�")
     private Integer billStatus;
@@ -75,14 +76,17 @@
 
     @ApiModelProperty(value = "绛捐鏃ユ湡")
     @ExcelColumn(name="绛捐鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date signDate;
 
     @ApiModelProperty(value = "寮�濮嬫棩鏈�")
     @ExcelColumn(name="寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date startDate;
 
     @ApiModelProperty(value = "缁撴潫鏃ユ湡")
     @ExcelColumn(name="缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date endDate;
 
     @ApiModelProperty(value = "椤圭洰缂栫爜锛堝叧鑱攜w_project)", example = "1")
@@ -126,6 +130,7 @@
 
     @ApiModelProperty(value = "閫�绉熸棩鏈�")
     @ExcelColumn(name="閫�绉熸棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date btDate;
 
     @ApiModelProperty(value = "閫�绉熺粡鍔炰汉缂栫爜", example = "1")
@@ -134,6 +139,7 @@
 
     @ApiModelProperty(value = "閫�绉熺鍒版棩鏈�")
     @ExcelColumn(name="閫�绉熺鍒版棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date btSignDate;
 
     @ApiModelProperty(value = "閫�绉熺粨绠楅噾棰濆悎璁�", example = "1")
@@ -142,6 +148,18 @@
     @ApiModelProperty(value = "绉熻祦鏉℃鎶奸噾锛堝厓锛�", example = "1")
     @ExcelColumn(name="绉熻祦鏉℃鎶奸噾锛堝厓锛�")
     private BigDecimal zlDeposit;
+    @ApiModelProperty(value = "棣栨湡绉熻祦鏉℃鍗曚环锛堝厓锛�", example = "1")
+    @ExcelColumn(name="棣栨湡绉熻祦鏉℃鍗曚环锛堝厓锛�")
+    private BigDecimal zlFirstPrice;
+    @ApiModelProperty(value = "棣栨湡绉熻祦鏉℃浠锋牸鍗曚綅", example = "1")
+    @ExcelColumn(name="棣栨湡绉熻祦鏉℃浠锋牸鍗曚綅")
+    private Integer zlFirstCircle;
+    @ApiModelProperty(value = "鐗╀笟绉熻祦鏉℃鍗曚环锛堝厓锛�", example = "1")
+    @ExcelColumn(name="鐗╀笟绉熻祦鏉℃鍗曚环锛堝厓锛�")
+    private BigDecimal wyFirstPrice;
+    @ApiModelProperty(value = "鐗╀笟绉熻祦鏉℃浠锋牸鍗曚綅", example = "1")
+    @ExcelColumn(name="鐗╀笟绉熻祦鏉℃浠锋牸鍗曚綅")
+    private Integer wyFirstCircle;
 
     @ApiModelProperty(value = "绉熻祦鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�", example = "1")
     @ExcelColumn(name="绉熻祦鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�")
@@ -149,10 +167,12 @@
 
     @ApiModelProperty(value = "绉熻祦鍏嶇鏈熷紑濮嬫棩鏈�")
     @ExcelColumn(name="绉熻祦鍏嶇鏈熷紑濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date zlFreeStartDate;
 
     @ApiModelProperty(value = "绉熻祦鍏嶇鏈熺粨鏉熸棩鏈�")
     @ExcelColumn(name="绉熻祦鍏嶇鏈熺粨鏉熸棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date zlFreeEndDate;
 
     @ApiModelProperty(value = "鐗╀笟鎶奸噾锛堝厓锛�", example = "1")
@@ -165,10 +185,12 @@
 
     @ApiModelProperty(value = "鐗╀笟鍏嶇鏈熷紑濮嬫棩鏈�")
     @ExcelColumn(name="鐗╀笟鍏嶇鏈熷紑濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date wyFreeStartDate;
 
     @ApiModelProperty(value = "鐗╀笟鍏嶇鏈熺粨鏉熸棩鏈�")
     @ExcelColumn(name="鐗╀笟鍏嶇鏈熺粨鏉熸棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date wyFreeEndDate;
 
     @ApiModelProperty(value = "绉熻祦鎬婚噾棰�", example = "1")
@@ -232,7 +254,16 @@
     @ApiModelProperty(value = "閫�娆炬湭缁撴竻璐﹀崟鏁�")
     @TableField(exist = false)
     private int btWaitBill;
+    @ApiModelProperty(value = "鐢熸垚璐﹀崟绫诲瀷 0绉熻祦璐﹀崟  1鐗╀笟璐﹀崟")
+    @TableField(exist = false)
+    private int billType;
 
+    @ApiModelProperty(value = "绉熻祦绉熻祦鏉℃浠锋牸鍗曚綅锛屾蹇靛悕绉�", example = "1")
+    @TableField(exist = false)
+    private String zlFirstCircleStr;
+    @ApiModelProperty(value = "鐗╀笟绉熻祦鏉℃浠锋牸鍗曚綅锛屾蹇靛悕绉�", example = "1")
+    @TableField(exist = false)
+    private String wyFirstCircleStr;
     @ApiModelProperty(value = "閫�绉熸椂鏂板鐨勬敹浠樻璐﹀崟")
     @TableField(exist = false)
     private List<YwContractBill> addBillList;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
index 0dcd404..a5f8bfa 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
@@ -12,6 +12,8 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
 import java.util.Date;
 import java.math.BigDecimal;
 import java.util.List;
@@ -60,9 +62,11 @@
 
     @ApiModelProperty(value = "寮�濮嬫椂闂�")
     @ExcelColumn(name="璁¤垂寮�濮嬫棩鏈�",index = 10,width = 6,dateFormat = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date startDate;
     @ApiModelProperty(value = "缁撴潫鏃堕棿")
     @ExcelColumn(name="璁¤垂缁撴潫鏃ユ湡",index = 11,width = 6,dateFormat = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date endDate;
 
     @ApiModelProperty(value = "瀹為檯浠樻鏃�")
@@ -70,7 +74,8 @@
     private Date actPayDate;
 
     @ApiModelProperty(value = "璁″垝浠樻鏃�")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date planPayDate;
 
     @ApiModelProperty(value = "鍚堝悓鏉℃缂栫爜锛堝叧鑱攜w_contract_detail)", example = "1")
@@ -177,7 +182,7 @@
     @ApiModelProperty(value = "瀹炴敹閲戦")
     @TableField(exist = false)
     @ExcelColumn(name="瀹炴敹閲戦",index = 6,width = 6)
-    private BigDecimal actReceivableFee;
+    private BigDecimal actReceivableFee = BigDecimal.ZERO;
 
     @ApiModelProperty(value = "闇�鏀堕噾棰�")
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
index cff24ae..99f3efe 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
@@ -68,7 +68,7 @@
 
     @ApiModelProperty(value = "璁惧鍨嬪彿", example = "1")
     @ExcelColumn(name="璁惧鍨嬪彿")
-    private Integer modelNo;
+    private String modelNo;
 
     @ApiModelProperty(value = "鎵�灞炲垎绫荤紪鐮侊紙绠$悊category锛�", example = "1")
     @ExcelColumn(name="鎵�灞炲垎绫荤紪鐮侊紙绠$悊category锛�")
@@ -80,8 +80,7 @@
 
     @ApiModelProperty(value = "渚涘簲鍟�")
     @ExcelColumn(name="渚涘簲鍟�")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    private Date company;
+    private String supplier;
 
     @ApiModelProperty(value = "杩愮淮鍐呭")
     @ExcelColumn(name="杩愮淮鍐呭")
@@ -103,7 +102,16 @@
     @TableField(exist = false)
     private String realName;
 
-    @ApiModelProperty(value = "闄勪欢淇℃伅")
+    @ApiModelProperty(value = "鍥剧墖鍦板潃")
     @TableField(exist = false)
-    private Multifile multifile;
+    private String fileUrl;
+
+    @ApiModelProperty(value = "鍥剧墖鍦板潃鍏ㄨ矾寰�")
+    @TableField(exist = false)
+    private String fileFullUrl;
+
+
+//    @ApiModelProperty(value = "闄勪欢淇℃伅")
+//    @TableField(exist = false)
+//    private Multifile multifile;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java
index 9cacb9e..f9c5638 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDeviceRecord.java
@@ -33,14 +33,14 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @ExcelColumn(name="鍒涘缓鏃堕棿",index = 5, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
     private Integer editor;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java
index 54cc29c..cdabeb9 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwLinePoint.java
@@ -73,5 +73,7 @@
     @TableField(exist = false)
     private String pointName;
 
-
+    @ApiModelProperty(value = "宸℃鐐圭紪鐮�")
+    @TableField(exist = false)
+    private String code;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java
index e1e0d05..8b69a5e 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolPoint.java
@@ -107,9 +107,13 @@
     @TableField(exist = false)
     private String deviceName;
 
-    @ApiModelProperty(value = "闄勪欢淇℃伅")
+    @ApiModelProperty(value = "闄勪欢鍦板潃")
     @TableField(exist = false)
-    private Multifile multifile;
+    private String fileUrl;
+
+    @ApiModelProperty(value = "闄勪欢鍏ㄨ矾寰勫湴鍧�")
+    @TableField(exist = false)
+    private String fileFullUrl;
 
     @ApiModelProperty(value = "杩囨护鏁版嵁")
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java
index 7fc920c..dd0675c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProject.java
@@ -82,5 +82,20 @@
     @ApiModelProperty(value = "鍙嫑鍟嗘埧婧愭暟")
     @TableField(exist = false)
     private Integer roomeRentNum;
+    @ApiModelProperty(value = "鍩庡競鍚嶇О")
+    @TableField(exist = false)
+    private String cityName;
+    @ApiModelProperty(value = "鍖哄煙鍚嶇О")
+    @TableField(exist = false)
+    private String areaName;
+    @ApiModelProperty(value = "鍩庡競绶ㄧ⒓")
+    @TableField(exist = false)
+    private Integer cityId;
+    @ApiModelProperty(value = "鐪佷唤鍚嶇О")
+    @TableField(exist = false)
+    private String provinceName;
+    @ApiModelProperty(value = "鐪乮d")
+    @TableField(exist = false)
+    private Integer provinceId;
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java
new file mode 100644
index 0000000..f292cb0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java
@@ -0,0 +1,33 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.dao.business.model.Approve;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/5/23 14:56
+ */
+@Data
+public class ProjectDataVO {
+
+    @ApiModelProperty(value = "涓氬姟涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "涓氬姟鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鐖剁骇涓婚敭")
+    private Integer pId;
+
+    @ApiModelProperty(value = "绾у埆")
+    private Integer lv;
+
+    @ApiModelProperty(value = "瀛愰泦鏁版嵁")
+    private List<ProjectDataVO> projectDataVOList;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectTree.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectTree.java
new file mode 100644
index 0000000..98080fe
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectTree.java
@@ -0,0 +1,93 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.config.DataSyncConfig;
+import com.doumee.core.utils.Constants;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/7/13 10:40
+ */
+public class ProjectTree {
+
+    // 淇濆瓨鍙備笌鏋勫缓鏍戝舰鐨勬墍鏈夋暟鎹紙閫氬父鏁版嵁搴撴煡璇㈢粨鏋滐級
+    public List<ProjectDataVO> nodeList = new ArrayList<>();
+
+
+
+    /**
+     *  鏋勯�犳柟娉�
+     *  @param nodeList 灏嗘暟鎹泦鍚堣祴鍊肩粰nodeList锛屽嵆鎵�鏈夋暟鎹綔涓烘墍鏈夎妭鐐广��
+     */
+    public ProjectTree(List<ProjectDataVO> nodeList){
+        this.nodeList = nodeList;
+    }
+
+
+    /**
+     *   鑾峰彇闇�鏋勫缓鐨勬墍鏈夋牴鑺傜偣锛堥《绾ц妭鐐癸級 "0"
+     *   @return 鎵�鏈夋牴鑺傜偣List闆嗗悎
+     */
+    public List<ProjectDataVO> getRootNode(){
+        // 淇濆瓨鎵�鏈夋牴鑺傜偣锛堟墍鏈夋牴鑺傜偣鐨勬暟鎹級
+        List<ProjectDataVO> rootNodeList = new ArrayList<>();
+        // treeNode锛氭煡璇㈠嚭鐨勬瘡涓�鏉℃暟鎹紙鑺傜偣锛�
+        for (ProjectDataVO treeNode : nodeList){
+            if (Objects.isNull(treeNode.getPId()) && Constants.equalsInteger(treeNode.getLv(),Constants.ZERO)) {
+                // 鏄紝娣诲姞
+                rootNodeList.add(treeNode);
+            }
+        }
+        return rootNodeList;
+    }
+
+
+    /**
+     *  鏍规嵁姣忎竴涓《绾ц妭鐐癸紙鏍硅妭鐐癸級杩涜鏋勫缓鏍戝舰缁撴瀯
+     *  @return  鏋勫缓鏁存5鏍�
+     */
+    public List<ProjectDataVO> buildTree(){
+        // treeNodes锛氫繚瀛樹竴涓《绾ц妭鐐规墍鏋勫缓鍑烘潵鐨勫畬鏁存爲褰�
+        List<ProjectDataVO> treeNodes = new ArrayList<ProjectDataVO>();
+        // getRootNode()锛氳幏鍙栨墍鏈夌殑鏍硅妭鐐�
+        for (ProjectDataVO treeRootNode : getRootNode()) {
+            // 灏嗛《绾ц妭鐐硅繘琛屾瀯寤哄瓙鏍�
+            treeRootNode = buildChildTree(treeRootNode);
+            // 瀹屾垚涓�涓《绾ц妭鐐规墍鏋勫缓鐨勬爲褰紝澧炲姞杩涙潵
+            treeNodes.add(treeRootNode);
+        }
+        return treeNodes;
+    }
+
+    /**
+     *  閫掑綊-----鏋勫缓瀛愭爲褰㈢粨鏋�
+     *  @param  pNode 鏍硅妭鐐癸紙椤剁骇鑺傜偣锛�
+     *  @return 鏁存5鏍�
+     */
+    public ProjectDataVO buildChildTree(ProjectDataVO pNode){
+        List<ProjectDataVO> childTree = new ArrayList<ProjectDataVO>();
+        // nodeList锛氭墍鏈夎妭鐐归泦鍚堬紙鎵�鏈夋暟鎹級
+        for (ProjectDataVO treeNode : nodeList) {
+            // 鍒ゆ柇褰撳墠鑺傜偣鐨勭埗鑺傜偣ID鏄惁绛変簬鏍硅妭鐐圭殑ID锛屽嵆褰撳墠鑺傜偣涓哄叾涓嬬殑瀛愯妭鐐�
+            if (!Objects.isNull(treeNode.getPId())
+                    && Constants.equalsInteger(treeNode.getPId(),pNode.getId())
+                    && Constants.equalsInteger((treeNode.getLv() -  1 ),pNode.getLv())
+            ) {
+                // 鍐嶉�掑綊杩涜鍒ゆ柇褰撳墠鑺傜偣鐨勬儏鍐碉紝璋冪敤鑷韩鏂规硶
+                childTree.add(buildChildTree(treeNode));
+            }
+        }
+        // for寰幆缁撴潫锛屽嵆鑺傜偣涓嬫病鏈変换浣曡妭鐐癸紝鏍戝舰鏋勫缓缁撴潫锛岃缃爲缁撴灉
+        pNode.setProjectDataVOList(childTree);
+        return pNode;
+    }
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/AreasService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/AreasService.java
new file mode 100644
index 0000000..5248c94
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/AreasService.java
@@ -0,0 +1,124 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Areas;
+
+import java.util.List;
+
+/**
+ * 鐪佸競鍖轰俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+public interface AreasService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param areas 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Areas areas);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     */
+    void delete(Areas areas);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     */
+    void updateById(Areas areas);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param areass 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Areas> areass);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Areas
+     */
+    Areas findById(Integer id);
+
+    /**
+     * 鏍规嵁id鍜宼ype鏌ヨ瀵硅薄淇℃伅
+     * @param id
+     * @param type null 鏌ヨ鍏ㄩ儴 0鐪佷唤 1鍩庡競 2鍖哄煙
+     * @return
+     */
+    Areas findById(Integer id,Integer type);
+
+
+    Areas findByName(String name,Integer type);
+    Areas findByNameAndParentId(String name,Integer type,Integer parentId);
+
+    List<Areas> findByParentId(Integer type,Integer parentId);
+
+    List<Areas> findChildByParentId(Integer id,List<Areas>  list);
+
+    boolean isAreaValid(String proName,String cityName,String areaName);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     * @return Areas
+     */
+    Areas findOne(Areas areas);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     * @return List<Areas>
+     */
+    List<Areas> findList(Areas areas);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Areas>
+     */
+    PageData<Areas> findPage(PageWrap<Areas> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Areas areas);
+
+    void cacheData();
+
+    Areas findByCityAndArea(String cityName, String areasName);
+
+    String getAddress(Integer cityId,Integer areaId);
+
+    List<Areas> listByParentId(Areas model);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java
index 23e6024..3aa5a39 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRoomService.java
@@ -79,6 +79,9 @@
      * @return List<YwContractRoom>
      */
     List<YwContractRoom> findList(YwContractRoom ywContractRoom);
+
+    List<YwContractRoom> getContractRoom(YwContractRoom ywContractRoom);
+
   
     /**
      * 鍒嗛〉鏌ヨ
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
index 58af13f..bdd442a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
@@ -4,6 +4,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwContract;
+import com.doumee.dao.business.model.YwContractBill;
+
 import java.util.List;
 
 /**
@@ -20,7 +22,7 @@
      * @return Integer
      */
     Integer create(YwContract ywContract);
-
+    List<YwContractBill> getBillList(YwContract ywContract);
     /**
      * 涓婚敭鍒犻櫎
      *
@@ -97,4 +99,8 @@
     long count(YwContract ywContract);
 
     Integer backRent(YwContract ywContract);
+
+    void dealTimeOut();
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
index f8a8923..d4232c7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
@@ -4,6 +4,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwProject;
+import com.doumee.dao.business.vo.ProjectDataVO;
+
 import java.util.List;
 
 /**
@@ -95,4 +97,7 @@
      * @return long
      */
     long count(YwProject ywProject);
+
+
+    List<ProjectDataVO> projectTree();
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
new file mode 100644
index 0000000..2416bac
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -0,0 +1,460 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.AreasMapper;
+import com.doumee.dao.business.model.Areas;
+import com.doumee.service.business.AreasService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 鐪佸競鍖轰俊鎭〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+@Service
+public class AreasServiceImpl implements AreasService {
+    public static   List<Areas> ALL_AREA_LIST;
+    public static   List<Areas> PROVINCE_LIST;
+    public static   List<Areas> CITY_LIST;
+    public static   List<Areas> AREA_LIST;
+    public static   List<Areas> ALL_AREA_TREE;
+
+    @Autowired
+    private AreasMapper areasMapper;
+
+    @Override
+    public Integer create(Areas areas) {
+        LoginUserInfo user = areas.getLoginUserInfo();
+/*
+
+        if (Objects.isNull(areas.getParentId())){
+            areas.setType(Constants.ZERO);
+        }else {
+            Areas parentArea = areasMapper.selectById(areas.getParentId());
+            if (Objects.isNull(parentArea)){
+                areas.setType(Constants.ZERO);
+            }else {
+                areas.setType(parentArea.getType()+Constants.ONE);
+            }
+        }*/
+        areas.setCreateDate(new Date());
+        areas.setEditDate(new Date());
+        areas.setCreator(user.getId());
+        areas.setEditor(user.getId());
+        areas.setIsdeleted(Constants.ZERO);
+        areasMapper.insert(areas);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+        return areas.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        areasMapper.deleteById(id);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void delete(Areas areas) {
+        UpdateWrapper<Areas> deleteWrapper = new UpdateWrapper<>(areas);
+        areasMapper.delete(deleteWrapper);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        areasMapper.deleteBatchIds(ids);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void updateById(Areas areas) {
+
+        UpdateWrapper<Areas> wrapper = new UpdateWrapper<>();
+        wrapper.lambda().eq(Areas::getId,areas.getId());
+        Areas update = new Areas();
+        update.setName(areas.getName());
+        update.setSortnum(areas.getSortnum());
+        areasMapper.update(update,wrapper);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Areas> areass) {
+        if (CollectionUtils.isEmpty(areass)) {
+            return;
+        }
+        for (Areas areas: areass) {
+            this.updateById(areas);
+        }
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public Areas findById(Integer id) {
+        if(ALL_AREA_LIST!=null){
+            for(Areas a : ALL_AREA_LIST){
+                if(Constants.equalsInteger(a.getId(),id)){
+                    return a;
+                }
+            }
+        }
+   //     return areasMapper.selectById(id);
+        return  null;
+    }
+    @Override
+    public Areas findById(Integer id,Integer type) {
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null){
+            for(Areas a : list){
+                if(Constants.equalsInteger(a.getId(),id)){
+                    return a;
+                }
+            }
+        }
+        return null;
+    }
+
+
+    @Override
+    public Areas findByName(String name,Integer type){
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null){
+            for(Areas a : list){
+                if(StringUtils.equals(name,a.getName())){
+                    return a;
+                }
+            }
+        }
+        return null;
+    }
+    @Override
+    public Areas findByNameAndParentId(String name,Integer type,Integer parentId){
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null){
+            for(Areas a : list){
+                if(StringUtils.equals(name,a.getName()) && Constants.equalsInteger(parentId,a.getParentId())){
+                    return a;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<Areas> findByParentId(Integer type, Integer parentId) {
+
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null){
+            return list.stream().filter(s->Constants.equalsInteger(s.getParentId(),parentId)).collect(Collectors.toList());
+        }
+        return null;
+    }
+
+    @Override
+    public List<Areas> findChildByParentId(Integer id,List<Areas> list){
+        List<Areas> result =null;
+        if(list == null){
+            list = ALL_AREA_LIST;
+        }
+        if(list!=null && list.size()>0){
+            for(Areas model :list){
+                if(Constants.equalsInteger(id,model.getParentId())){
+                    if(result == null){
+                        result = new ArrayList<>();
+                    }
+                    result.add(model );
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public boolean isAreaValid(String proName,String cityName,String areaName){
+        Areas pro = findByName(proName,Constants.ZERO);
+        if(pro == null){
+            return  false;
+        }
+        Areas city = findByName(proName,Constants.ONE);
+        if(city == null && !Constants.equalsInteger(city.getParentId(),pro.getId())){
+            return  false;
+        }
+        Areas area = findByName(proName,Constants.TWO);
+        if(area == null && !Constants.equalsInteger(area.getParentId(),city.getId())){
+            return  false;
+        }
+        return false;
+    }
+    @Override
+    public Areas findOne(Areas areas) {
+        QueryWrapper<Areas> wrapper = new QueryWrapper<>(areas);
+        return areasMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Areas> findList(Areas areas) {
+        List<Areas> list = null;
+        Integer type =areas.getType();
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        List<Areas> result = null;
+        if(StringUtils.isNotBlank(areas.getName())){
+            for(Areas a : list){
+                if(StringUtils.contains(a.getName(),areas.getName())){
+                    if(result == null){
+                        result = new ArrayList<>();
+                    }
+                    result.add(a);
+                }
+            }
+            return  result;
+        }
+        return list;
+    }
+
+    @Override
+    public  List<Areas> listByParentId(Areas areas) {
+        List<Areas> list = null;
+        Integer type =areas.getType();
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        List<Areas> result = null;
+        if(list!=null){
+            for(Areas a : list){
+                if(result == null){
+                    result = new ArrayList<>();
+                }
+                if( areas.getParentId() == null
+                        ||(areas.getParentId() !=null) && Constants.equalsInteger(a.getParentId(),areas.getParentId())){
+                    Areas t = new Areas();
+                    BeanUtils.copyProperties(a,t);
+                    t.setChildList(null);
+                    result.add(t);
+                }
+            }
+        }
+        return result;
+    }
+    @Override
+    @PostConstruct
+    public  void cacheData() {
+       Areas a = new Areas();
+       a.setIsdeleted(Constants.ZERO);
+       ALL_AREA_LIST = null;
+       PROVINCE_LIST =null;
+       CITY_LIST=null;
+       AREA_LIST = null;
+       ALL_AREA_TREE = null;
+       ALL_AREA_LIST =  areasMapper.selectList(new QueryWrapper<>(a).lambda().orderByDesc(Areas::getSortnum));
+       if(ALL_AREA_LIST!=null){
+           for(Areas model : ALL_AREA_LIST){
+                if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
+                    if(PROVINCE_LIST == null){
+                        PROVINCE_LIST = new ArrayList<>();
+                    }
+                    PROVINCE_LIST.add(model);
+                }else if(Constants.equalsInteger(model.getType(),Constants.ONE)){
+                    if(CITY_LIST == null){
+                        CITY_LIST = new ArrayList<>();
+                    }
+                    CITY_LIST.add(model);
+                    if(model.getParentId() != null){
+                        Areas p = findById(model.getParentId());
+                        if(p!=null  ){
+                            model.setProvinceId(p.getId());
+                            model.setProvinceName(p.getName());
+                        }
+                    }
+                }else if(Constants.equalsInteger(model.getType(),Constants.TWO)){
+                    if(AREA_LIST == null){
+                        AREA_LIST = new ArrayList<>();
+                    }
+                    AREA_LIST.add(model);
+                    Areas city = findById(model.getParentId());
+                    if(city!=null  ){
+                        model.setCityId(city.getId());
+                        model.setCityName(city.getName());
+                        if(city!=null && city.getParentId()!=null){
+                            Areas p = findById(city.getParentId());
+                            if(p!=null  ){
+                                model.setProvinceId(p.getId());
+                                model.setProvinceName(p.getName());
+                            }
+                        }
+                    }
+                }
+           }
+       }
+       if(CITY_LIST!=null){
+           for(Areas aa : CITY_LIST){
+               aa.setChildList(findChildByParentId(aa.getId(), AREA_LIST));
+           }
+       }
+       if(PROVINCE_LIST!=null){
+           for(Areas aa : PROVINCE_LIST){
+               aa.setChildList(findChildByParentId(aa.getId(),CITY_LIST));
+           }
+       }
+       System.out.println("=================");
+    }
+
+    @Override
+    public PageData<Areas> findPage(PageWrap<Areas> pageWrap) {
+        IPage<Areas> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Areas> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(Areas::getId, pageWrap.getModel().getId());
+        }
+
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(Areas::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(Areas::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(Areas::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(Areas::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(Areas::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(Areas::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(Areas::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(Areas::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(Areas::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(Areas::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getParentId() != null) {
+            queryWrapper.lambda().eq(Areas::getParentId, pageWrap.getModel().getParentId());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(Areas::getType, pageWrap.getModel().getType());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(areasMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Areas areas) {
+        QueryWrapper<Areas> wrapper = new QueryWrapper<>(areas);
+        return areasMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public Areas findByCityAndArea(String cityName, String areasName) {
+        Areas city = findByName(cityName,Constants.ONE);
+        if(city !=null){
+           return  findByNameAndParentId(areasName,Constants.TWO,city.getId());
+        }
+        return null;
+    }
+
+    @Override
+    public String getAddress(Integer cityId,Integer areaId){
+        Areas cityAreas = findById(cityId, Constants.ONE);
+        Areas areas = findById(areaId, Constants.TWO);
+
+        String cityName = Optional.ofNullable(cityAreas)
+                .map(s -> s.getProvinceName() + s.getName())
+                .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST));
+        String areaName = Optional.ofNullable(areas).map(s -> s.getName()).orElse("");
+
+        return cityName+areaName;
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
index 4cdd677..b056465 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -340,7 +340,7 @@
                         .setSql("hk_company_path=REPLACE(hk_company_path,'"+ model.getCompanyNamePath()+"','"+newName+"')")
                 .likeRight(Company::getCompanyPath,model.getCompanyPath()));
         //涓嬪彂娴峰悍瀹夐槻骞冲彴
-        if(StringUtils.isNotBlank(model.getHkId())){
+      /*  if(StringUtils.isNotBlank(model.getHkId())){
              if(!editHkOrg(company)){
                  throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍚屾涓嬪彂澶辫触锛岃绋嶅悗閲嶈瘯");
              }
@@ -348,7 +348,7 @@
             if(!addHkOrg(company)){
                 throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍚屾涓嬪彂澶辫触锛岃绋嶅悗閲嶈瘯");
             }
-        }
+        }*/
 
     }
 
@@ -492,7 +492,7 @@
             queryWrapper.apply(" t.id in ( select hdp.COMPANY_ID from hidden_danger_param hdp where hdp.ISDELETED = 0 and hdp.STATUS = 0 and hdp.TYPE = 0  ) ");
         }
         queryWrapper.orderByDesc(Company::getCreateDate);
-        queryWrapper.leftJoin(Company.class,Company::getId,Company::getParentId);
+        queryWrapper.leftJoin("company t1 on t1.id=t.parent_id");
         queryWrapper.select(" t.* ")
                 .select("(select count(m.id) from member m where m.COMPANY_ID=t.id and m.ISDELETED=0) as countNum") ;
         queryWrapper.select("t1.name",Company::getParentName);
@@ -500,7 +500,7 @@
         queryWrapper.apply(" t.isdeleted = 0 ") ;
         queryWrapper.eq(Objects.nonNull(company.getStatus()),Company::getStatus,Constants.ZERO);
         queryWrapper.like(StringUtils.isNotBlank(company.getName()),Company::getName,company.getName());
-        queryWrapper.like(StringUtils.isNotBlank(company.getParentName()),"c.name",company.getParentName());
+        queryWrapper.like(StringUtils.isNotBlank(company.getParentName()),"t1.name",company.getParentName());
         return companyMapper.selectList(queryWrapper);
     }
 
@@ -604,9 +604,7 @@
             queryWrapper.le(Company::getFsDate, Utils.Date.getEnd(pageWrap.getModel().getFsDate()));
         }
         queryWrapper.orderByDesc(Company::getCreateDate);
-        queryWrapper.leftJoin(Company.class,Company::getId,Company::getParentId);
-        /*        .leftJoin(Member.class, Member::getId,Company::getHeadId)*/
-      /*  queryWrapper.leftJoin(" company c on c.id=t.parent_id");*/
+        queryWrapper.leftJoin("company t1 on t1.id=t.parant_id");
         queryWrapper.selectAll(Company.class)
                 .select("(select count(m.id) from member m where m.COMPANY_ID=t.id and m.ISDELETED=0) ",Company::getCountNum)
                 .select("(select count(m.id) from yw_account m where m.COMPANY_ID=t.id and m.ISDELETED=0)",Company::getAccountNum) ;
@@ -614,14 +612,14 @@
         queryWrapper.select("t1.company_path",Company::getParentCompanyPath);
         queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getStatus()),Company::getStatus,Constants.ZERO);
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Company::getName,pageWrap.getModel().getName());
-        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getParentName()),"c.name",pageWrap.getModel().getParentName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getParentName()),"t1.name",pageWrap.getModel().getParentName());
         IPage<Company> companyIPage = companyJoinMapper.selectJoinPage(page, Company.class, queryWrapper);
         return PageData.from(companyIPage);
     }
 
     @Override
     public void updateStatusById(Company company) {
-        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        LoginUserInfo loginUserInfo = company.getLoginUserInfo();
         if(loginUserInfo==null){
             loginUserInfo = company.getLoginUserInfo();
         }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InitServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InitServiceImpl.java
index 918b813..50529ff 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InitServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InitServiceImpl.java
@@ -26,7 +26,7 @@
     @Autowired
     private InterfaceLogService interfaceLogService;
 
-    @PostConstruct
+//    @PostConstruct
     public  int  initHkConfig(){
             ArtemisConfig.host = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_HOST).getCode();
             ArtemisConfig.appKey = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_APPKEY).getCode();
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 30f7408..f8c6d15 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -1043,6 +1043,7 @@
             loginUserInfo = member.getLoginUserInfo();
         }
         Member update = new Member();
+        update.setId(model.getId());
         update.setEditDate(new Date());
         update.setEditor(loginUserInfo.getId());
         update.setStatus(member.getStatus());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
index cd31b01..34218a5 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -12,6 +12,7 @@
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.MultifileMapper;
 import com.doumee.dao.system.model.Multifile;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.YwContractBillService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -194,8 +195,12 @@
         ));
 
         //闄勪欢鏁版嵁
-        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
+        List<Multifile> multifileList = multifileMapper.selectJoinList(Multifile.class,new MPJLambdaWrapper<Multifile>()
+                        .selectAll(Multifile.class)
+                        .selectAs(SystemUser::getRealname,Multifile::getUserName)
+                        .leftJoin(SystemUser.class,SystemUser::getId,Multifile::getCreator)
                 .eq(Multifile::getObjId,id)
+                .eq(Multifile::getIsdeleted,Constants.ZERO)
                 .eq(Multifile::getObjType,Constants.MultiFile.FN_CONTRACT_BILL_FILE.getKey()));
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
             String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
@@ -267,25 +272,27 @@
             }
             //妤煎畤鍚嶇О
             List<YwContractRoom> ywContractRoomList = ywContractBill.getYwContractRoomList();
-            StringBuilder roomPathName = new StringBuilder();
-            for (YwContractRoom ywContractRoom:ywContractRoomList) {
-                if(StringUtils.isNotBlank(ywContractRoom.getProjectName())){
-                    roomPathName.append(ywContractRoom.getProjectName());
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRoomList)){
+                StringBuilder roomPathName = new StringBuilder();
+                for (YwContractRoom ywContractRoom:ywContractRoomList) {
+                    if(StringUtils.isNotBlank(ywContractRoom.getProjectName())){
+                        roomPathName.append(ywContractRoom.getProjectName()+"/");
+                    }
+                    if(StringUtils.isNotBlank(ywContractRoom.getBuildingName())){
+                        roomPathName.append(ywContractRoom.getBuildingName()+"/");
+                    }
+                    if(StringUtils.isNotBlank(ywContractRoom.getFloorName())){
+                        roomPathName.append(ywContractRoom.getFloorName()+"/");
+                    }
+                    if(StringUtils.isNotBlank(ywContractRoom.getRoomName())){
+                        roomPathName.append(ywContractRoom.getRoomName());
+                    }
+                    if(StringUtils.isNotBlank(roomPathName)){
+                        roomPathName.append(";");
+                    }
                 }
-                if(StringUtils.isNotBlank(ywContractRoom.getBuildingName())){
-                    roomPathName.append(ywContractRoom.getBuildingName());
-                }
-                if(StringUtils.isNotBlank(ywContractRoom.getFloorName())){
-                    roomPathName.append(ywContractRoom.getFloorName());
-                }
-                if(StringUtils.isNotBlank(ywContractRoom.getRoomName())){
-                    roomPathName.append(ywContractRoom.getRoomName());
-                }
-                if(StringUtils.isNotBlank(roomPathName)){
-                    roomPathName.append(";");
-                }
+                ywContractBill.setRoomPathName(roomPathName.toString());
             }
-            ywContractBill.setRoomPathName(roomPathName.toString());
         }
 
         return PageData.from(iPage);
@@ -295,29 +302,56 @@
         //鏌ヨ璐﹀崟涓嬬殑妤煎畤鏁版嵁
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBillList)){
             //鑾峰彇鎵�鏈夋暟鎹�
-            List<Integer> billIdList = ywContractBillList.stream().map(i->i.getId()).collect(Collectors.toList());
+            List<Integer> billIdList = ywContractBillList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)).map(i->i.getId()).collect(Collectors.toList());
+            List<Integer> contractIdList = ywContractBillList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).map(i->i.getContractId()).collect(Collectors.toList());
+            List<YwContractRoom> ywContractRoomList  = new ArrayList<>();
             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(billIdList)){
-                List<YwContractRoom> ywContractRoomList  = ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
+                ywContractRoomList.addAll( ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
                         .selectAll(YwContractRoom.class)
                         .selectAs(YwProject::getName,YwRoom::getProjectName)
                         .selectAs(YwFloor::getName,YwRoom::getFloorName)
                         .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
-                        .selectAs(YwRoom::getName,YwContractRoom::getRoomName)
+                        .selectAs(YwRoom::getCode,YwContractRoom::getRoomName)
                         .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                         .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                         .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                         .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                         .in(YwContractRoom::getContractId,billIdList)
                         .eq(YwContractRoom::getType,Constants.ONE)
-                );
-                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRoomList)){
-                    for (YwContractBill ywContractBill:ywContractBillList) {
+                ));
+
+            }
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(contractIdList)){
+                ywContractRoomList.addAll( ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
+                        .selectAll(YwContractRoom.class)
+                        .selectAs(YwProject::getName,YwRoom::getProjectName)
+                        .selectAs(YwFloor::getName,YwRoom::getFloorName)
+                        .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
+                        .selectAs(YwRoom::getCode,YwContractRoom::getRoomName)
+                        .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
+                        .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
+                        .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
+                        .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
+                        .in(YwContractRoom::getContractId,contractIdList)
+                        .eq(YwContractRoom::getType,Constants.ZERO)
+                ));
+            }
+
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRoomList)){
+                for (YwContractBill ywContractBill:ywContractBillList) {
+                    if(Constants.equalsInteger(ywContractBill.getType(),Constants.ZERO)){
                         ywContractBill.setYwContractRoomList(
-                                ywContractRoomList.stream().filter(i->Constants.equalsInteger(i.getContractId(),ywContractBill.getId())).collect(Collectors.toList())
+                                ywContractRoomList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)&&Constants.equalsInteger(i.getContractId(),ywContractBill.getContractId())).collect(Collectors.toList())
+                        );
+                    }else{
+                        ywContractBill.setYwContractRoomList(
+                                ywContractRoomList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)&&Constants.equalsInteger(i.getContractId(),ywContractBill.getId())).collect(Collectors.toList())
                         );
                     }
+
                 }
             }
+
         }
     }
 
@@ -355,16 +389,17 @@
                             .isNotNull(YwContractBill::getCode)
                             .apply(" CREATE_DATE like '"+codeDate+"%' ")
                             .orderByDesc(YwContractBill::getId)
+                            .last(" limit  1 ")
                     );
-                    Integer maxCode = Constants.ONE;
+                    Integer maxCode = Constants.ZERO;
                     if(Objects.nonNull(ywContractBill)){
-                        maxCode = Integer.valueOf(ywContractBill.getCode().replace("ZD"+codeDate,""));
+                        maxCode = Integer.valueOf(ywContractBill.getCode().replace(("ZD"+codeDate+"-"),""));
                     }
                     for (YwContractBill contractBill:codeDateBillList) {
                         maxCode = maxCode + 1;
                         contractBill.setCode("ZD" + codeDate + "-" + StringUtils.leftPad(maxCode.toString() , 4,"0"));
                         ywContractBillMapper.update(null, new UpdateWrapper<YwContractBill>().lambda().set(YwContractBill::getCode,contractBill.getCode())
-                                .eq(YwContractBill::getId,ywContractBill.getId()));
+                                .eq(YwContractBill::getId,contractBill.getId()));
                     }
                 }
             }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
index d637c75..b6b00ca 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
@@ -6,6 +6,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.*;
 import com.doumee.dao.business.dao.CompanyMapper;
@@ -322,14 +323,14 @@
         ywContractBillMapper.update(null,new UpdateWrapper<YwContractBill>().lambda()
                 .set(YwContractBill::getPayStatus,ywContractBill.getPayStatus())
                 .set(YwContractBill::getEditor,loginUserInfo.getId())
-                .set(YwContractBill::getEditDate," now() ")
+                .set(YwContractBill::getEditDate, DateUtil.getCurrDateTime())
                 .eq(YwContractBill::getId,ywContractBill.getId())
         );
 
         ywContractRevenueMapper.update(null,new UpdateWrapper<YwContractRevenue>().lambda()
                 .set(YwContractRevenue::getStatus,Constants.ONE)
                 .set(YwContractRevenue::getEditor,loginUserInfo.getId())
-                .set(YwContractRevenue::getEditDate," now() ")
+                .set(YwContractRevenue::getEditDate,DateUtil.getCurrDateTime())
                 .eq(YwContractRevenue::getId,id));
     }
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java
index 521d552..8b4a5c7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRoomServiceImpl.java
@@ -5,17 +5,19 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.YwContractRoomMapper;
-import com.doumee.dao.business.model.YwContractRoom;
+import com.doumee.dao.business.model.*;
 import com.doumee.service.business.YwContractRoomService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 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瀹炵幇
@@ -84,7 +86,31 @@
         QueryWrapper<YwContractRoom> wrapper = new QueryWrapper<>(ywContractRoom);
         return ywContractRoomMapper.selectList(wrapper);
     }
-  
+
+
+
+    @Override
+    public List<YwContractRoom> getContractRoom(YwContractRoom ywContractRoom){
+        List<YwContractRoom> ywContractRoomList  = ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
+                .selectAll(YwContractRoom.class)
+                .selectAs(YwProject::getName, YwRoom::getProjectName)
+                .selectAs(YwFloor::getName,YwRoom::getFloorName)
+                .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
+                .selectAs(YwRoom::getName,YwContractRoom::getRoomName)
+                .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
+                .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
+                .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
+                .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
+                .eq(Objects.nonNull(ywContractRoom.getType()),YwContractRoom::getType,ywContractRoom.getType())
+                .eq(Objects.nonNull(ywContractRoom.getContractId()),YwContractRoom::getContractId,ywContractRoom.getContractId()))
+                ;
+        return ywContractRoomList;
+
+    }
+
+
+
+
     @Override
     public PageData<YwContractRoom> findPage(PageWrap<YwContractRoom> pageWrap) {
         IPage<YwContractRoom> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
index e8e6bbc..d2da52a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -45,6 +45,8 @@
     @Autowired
     private YwContractMapper ywContractMapper;
     @Autowired
+    private YwContractRoomMapper ywContractRoomMapper;
+    @Autowired
     private YwContractDetailMapper ywContractDetailMapper;
     @Autowired
     private YwContractBillMapper ywContractBillMapper;
@@ -82,15 +84,157 @@
         ywContractMapper.insert(model);
         dealDetailListBiz(model);//澶勭悊鏉℃淇℃伅
         dealMultifileBiz(model);//澶勭悊闄勪欢淇℃伅
-        dealLogBiz(model,Constants.YwLogType.CONTRACT_CREATE,null,null);//璁板綍鏂板缓鏃ュ織
+        dealRoomsForContract(model);//澶勭悊鎴挎簮鍏宠仈琛�
+        dealLogBiz(model,Constants.YwLogType.CONTRACT_CREATE,model.getLoginUserInfo().getRealname(),"銆�"+model.getRemark().replace("鍚堝悓鎽樿锛�","")+"銆�");//璁板綍鏂板缓鏃ュ織
+
         return model.getId();
+    }
+
+    private void dealRoomsForContract(YwContract model) {
+        List<YwContractRoom> list = new ArrayList<>();
+        for(YwRoom room :model.getRoomList()){
+            YwContractRoom t = new YwContractRoom();
+            t.setContractId(model.getId());
+            t.setRoomId(room.getId());
+            t.setCreator(model.getCreator());
+            t.setIsdeleted(Constants.ZERO);
+            t.setCreateDate(model.getCreateDate());
+            t.setEditDate(model.getCreateDate());
+            t.setEditor(model.getCreator());
+            t.setType(Constants.ZERO);
+            list.add(t);
+        }
+        ywContractRoomMapper.insert(list);
+    }
+
+    @Override
+    public   List<YwContractBill> getBillList(YwContract model){
+
+        isParamValidForBill(model);
+        model.setCreateDate(new Date());
+        model.setEditDate(model.getCreateDate());
+        dealDetailListBiz(model);//澶勭悊鏉℃淇℃伅
+        return model.getBillList();
+    }
+
+    private void isParamValidForBill(YwContract model) {
+        if(model.getStartDate() == null
+                ||model.getEndDate() == null
+                ||model.getProjectId() == null
+                ||model.getCompanyId() == null
+                ||model.getRoundedUp() == null
+                ||model.getRoomIds() == null
+                ||model.getRoomIds().size() == 0
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓鍚堝悓淇℃伅");
+        }
+        if(model.getEndDate().getTime()<= model.getStartDate().getTime()){
+
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鍚堝悓鏈夋晥鏈熺粨鏉熸椂闂翠笉寰楁棭浜庡紑濮嬫椂闂达紒");
+        }
+
+        if(model.getBillType() ==0 ){
+            //濡傛灉鐢熸垚绉熻祦鏉℃
+            if(  model.getZlDeposit() == null
+                    ||model.getZlPayType() == null
+                    || model.getZlPayType()>3
+                    || model.getZlPayType()<0
+                    ||model.getZlDetailList()==null
+                    ||model.getZlDetailList().size() ==0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓绉熻祦鏉℃淇℃伅");
+            }
+            model.setType(Constants.TWO);
+            model.setWyDetailList(null);
+            if(!(model.getZlFreeEndDate()==null &&  model.getZlFreeStartDate()==null) && (
+                    (model.getZlFreeEndDate()!=null &&  model.getZlFreeStartDate()==null)
+                            ||(model.getZlFreeEndDate()==null &&  model.getZlFreeStartDate()!=null)
+                            ||model.getZlFreeEndDate().getTime()<= model.getZlFreeStartDate().getTime())
+            ){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇烽�夋嫨姝g‘鐨勭璧佹潯娆惧厤绉熸湡淇℃伅锛�");
+            }
+            for(YwContractDetail d :model.getZlDetailList()){
+                if(  d.getStartDate() == null
+                        ||d.getEndDate() == null
+                        ||d.getPrice() == null
+                        ||d.getCircleType() == null
+                        || d.getCircleType()>6
+                        || d.getCircleType()<0
+                ){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓绉熻祦鏉℃淇℃伅!");
+                }
+                if(d.getEndDate().getTime()<= d.getStartDate().getTime()){
+
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绉熻祦鏉℃鏈夋晥鏈熺粨鏉熸椂闂翠笉寰楁棭浜庡紑濮嬫椂闂达紒");
+                }
+                if(!Constants.equalsInteger(model.getWyPayType(),Constants.ZERO) &&
+                        Constants.equalsInteger(d.getCircleType(),Constants.SIX)){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绉熻祦鏉℃鍙湁閫夋嫨涓�娆℃�т粯娆炬椂锛屾墠鑳介�夋嫨璇ユ寜姣忓満鏀惰垂锛�");
+                }
+            }
+        }
+        if(model.getBillType() == 1 ){
+            //濡傛灉鐢熸垚鐗╀笟鏉℃
+            if(  model.getWyDeposit() == null
+                    ||model.getWyPayType() == null
+                    || model.getWyPayType()>3
+                    || model.getWyPayType()<0
+                    ||model.getWyDetailList()==null
+                    ||model.getWyDetailList().size() ==0
+            ){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓鐗╀笟鏉℃淇℃伅");
+            }
+            model.setType(Constants.ONE);
+            model.setZlDetailList(null);
+            if(!(model.getWyFreeEndDate()==null &&  model.getWyFreeStartDate()==null) && (
+                    (model.getWyFreeEndDate()!=null &&  model.getWyFreeStartDate()==null)
+                            ||(model.getWyFreeEndDate()==null &&  model.getWyFreeStartDate()!=null)
+                            ||model.getWyFreeEndDate().getTime()<= model.getWyFreeStartDate().getTime())){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇烽�夋嫨姝g‘鐨勭墿涓氭潯娆惧厤绉熸湡淇℃伅锛�");
+            }
+            for(YwContractDetail d :model.getWyDetailList()){
+                if(  d.getStartDate() == null
+                        ||d.getEditDate() == null
+                        ||d.getPrice() == null
+                        ||d.getCircleType() == null
+                        || d.getCircleType()>6
+                        || d.getCircleType()<0
+                ){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓鐗╀笟鏉℃淇℃伅!");
+                }
+                if(d.getEndDate().getTime()<= d.getStartDate().getTime()){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鐗╀笟鏉℃鏈夋晥鏈熺粨鏉熸椂闂翠笉寰楁棭浜庡紑濮嬫椂闂达紒");
+                }
+                if(!Constants.equalsInteger(model.getWyPayType(),Constants.ZERO) &&
+                        Constants.equalsInteger(d.getCircleType(),Constants.SIX)){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鐗╀笟鏉℃鍙湁閫夋嫨涓�娆℃�т粯娆炬椂锛屾墠鑳介�夋嫨璇ユ寜姣忓満鏀惰垂锛�");
+                }
+            }
+        }
+
+        YwProject project = projectMapper.selectById(model.getProjectId());
+        if(project ==null || Constants.equalsInteger(project.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝璇烽�夋嫨姝g‘鐨勯」鐩俊鎭紒");
+        }
+        List<YwRoom> rooms = roomMapper.selectList(new QueryWrapper<YwRoom>().lambda()
+                .eq(YwRoom::getIsdeleted,Constants.ZERO)
+                .in(YwRoom::getId,model.getRoomIds())
+                .eq(YwRoom::getProjectId,model.getProjectId())  );
+        if(rooms ==null || rooms.size()==0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇烽�夋嫨瀵瑰簲椤圭洰涓嬫纭殑鎴挎簮淇℃伅");
+        }
+        if(rooms.size() != rooms.size()){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝瀛樺湪鏃犳晥鐨勬埧婧愪俊鎭紒");
+        }
+        model.setTotalArea(new BigDecimal(0));
+        for(YwRoom r : rooms){
+            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
+        }
+        model.setRoomList(rooms);
     }
 
     private String getRemarlByParam(YwContract model) {
 
         String str = "";
-        YwContractDetail zl = model.getZlDetailList()!=null&&model.getZlDetailList().size()>0?model.getZlDetailList().get(0):null;
-        YwContractDetail yw = model.getWyDetailList()!=null&&model.getWyDetailList().size()>0?model.getWyDetailList().get(0):null;
         //璧风鏃�2024/06/01锛岀璧佹暟涓�500銕°�傞鏈熺璧佷笁鏈堜竴浠橈紝绉熼噾鍗曚环35鍏�/銕÷锋湀銆傞鏈熺墿涓氫笁鏈堜竴浠橈紝鐗╀笟鍗曚环4.3鍏�/銕÷锋湀
         String str0 = "鍚堝悓鎽樿锛氳捣绉熸棩{param1}锛岀璧佹暟涓簕param2}銕°�傞鏈熺璧亄param3}锛岀閲戝崟浠穥param4}鍏儃param5}銆傞鏈熺墿涓歿param6}锛岀墿涓氬崟浠穥param7}{param8}";
         String str1 = "鍚堝悓鎽樿锛氳捣绉熸棩{param1}锛岀璧佹暟涓簕param2}銕°�傞鏈熺璧亄param3}锛岀閲戝崟浠穥param4}鍏儃param5}銆�";
@@ -98,20 +242,20 @@
         if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
             str= str0;
         }
-        if(Constants.equalsInteger(model.getType(),Constants.ONE)){
+        if(Constants.equalsInteger(model.getType(),Constants.TWO)){
             str= str1;
         }
-        if(Constants.equalsInteger(model.getType(),Constants.TWO)){
+        if(Constants.equalsInteger(model.getType(),Constants.ONE)){
             str= str2;
         }
         str = str.replace("{param1}",DateUtil.getDateLongSlash(model.getStartDate()))
                 .replace("{param2}",model.getTotalArea().intValue()+"")
-                .replace("{param3}",getPayTypeByNum(model.getZlPayType()))
-                .replace("{param4}",zl!=null&&zl.getPrice()!=null?(zl.getPrice().intValue()+""):"0")
-                .replace("{param5}",getPayTypeByNum(model.getWyPayType()))
-                .replace("{param6}",getUnitTypeByNum(zl))
-                .replace("{param7}",zl!=null&&yw.getPrice()!=null?(zl.getPrice().intValue()+""):"0")
-                .replace("{param8}",getUnitTypeByNum(yw));
+                .replace("{param3}",Constants.getPayTypeByNum(model.getZlPayType()))
+                .replace("{param4}",Constants.formatBigdecimal(model.getZlFirstPrice()).intValue()+"")
+                .replace("{param5}",Constants.getUnitTypeByNum(model.getZlFirstCircle())
+                .replace("{param6}",Constants.getPayTypeByNum(model.getWyPayType()))
+                .replace("{param7}",Constants.formatBigdecimal(model.getWyFirstPrice()).intValue()+"")
+                .replace("{param8}",Constants.getUnitTypeByNum(model.getWyFirstCircle())));
         return  str;
     }
     private String getbackRentRemarkByParam(YwContract model) {
@@ -125,40 +269,15 @@
                         :(Constants.formatBigdecimal(model.getBtFee()).intValue() * -1))+"" );
         return  str;
     }
-
-    private CharSequence getUnitTypeByNum(YwContractDetail zl) {
-        if(zl==null){
-            return "";
-        }
-     //   浠樻鍛ㄦ湡绫诲瀷 0=鍏冩瘡骞崇背澶╋紱1=鍏冩瘡骞崇背鏈堬紱2=鍏冩瘡骞崇背骞达紱3=鍏冩瘡澶╋紱4=鍏冩瘡鏈堬紱5=鍏冩瘡骞达紱6=鍏冩瘡鍦猴紱
-        int zlPayType = Constants.formatIntegerNum(zl.getCircleType());
-        if(zlPayType == 1){
-            return "鍏�/銕÷锋湀";
-        }else   if(zlPayType == 2){
-            return "鍏�/銕÷峰ぉ";
-        }else  if(zlPayType == 3){
-            return "鍏�/澶�";
-        }else  if(zlPayType == 4){
-            return "鍏�/鏈�";
-        }else  if(zlPayType == 5){
-            return "鍏�/骞�";
-        }else  if(zlPayType == 6){
-            return "鍏�/鍦�";
-        }
-        return "鍏�/銕÷峰ぉ";
+    private String getbackRentLogByParam(YwContract model) {
+        BigDecimal fee = Constants.formatBigdecimal(model.getBtFee());
+        String str = "銆愰��绉熸棩{param1}锛岄��绉熷師鍥狅細{param2},閫�绉熷崗璁腑缁熻鐨勮垂鐢ㄦ�昏{param3}鍏冦�傘��";
+        str = str.replace("{param1}",DateUtil.getDateLongSlash(model.getBtDate()))
+                .replace("{param2}",StringUtils.defaultString(model.getBtInfo(),""))
+                .replace("{param3}",Constants.formatBigdecimal2Float(model.getBtFee()).doubleValue()+"");
+        return  str;
     }
 
-    private CharSequence getPayTypeByNum(Integer zlPayType) {
-        //绉熻祦鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�
-        if(zlPayType == 1){
-            return "3涓湀涓�浠�";
-        }else   if(zlPayType == 2){
-            return "6涓湀涓�浠�";
-        }else  if(zlPayType == 3){
-            return "1骞翠竴浠�";
-        }
-        return "涓�娆℃�т粯娆�";
-    }
 
 
     /**
@@ -175,11 +294,16 @@
         //澶勭悊
         dealBackRentBillBiz(param);
         YwContract update = new YwContract();
+        update.setId(param.getId());
         update.setEditDate(new Date());
         update.setEditor(param.getLoginUserInfo().getId());
         update.setBtActDate(update.getEditDate());
         update.setBtActUserId(update.getEditor());
-        update.setStatus(Constants.THREE);
+        if(Objects.nonNull(param.getBtWaitBill()) && param.getBtWaitBill() > Constants.ZERO){
+            update.setStatus(Constants.THREE);
+        }else{
+            update.setStatus(Constants.FOUR);
+        }
         update.setBtInfo(param.getBtInfo());
         update.setBtDate(param.getBtDate());
         update.setBtType(param.getBtType());
@@ -187,8 +311,32 @@
         update.setBtFee(param.getBtFee());
         update.setBtRemark(getbackRentRemarkByParam(param));
         ywContractMapper.updateById(update);
-        dealLogBiz(param,Constants.YwLogType.CONTRACT_BACK,null,null);
+        dealLogBiz(param,Constants.YwLogType.CONTRACT_BACK, param.getLoginUserInfo().getRealname(),getbackRentLogByParam(param));
         return param.getId();
+    }
+
+
+    @Override
+    public  void dealTimeOut(){
+        //瀹氭椂澶勭悊鍚堝悓鎵ц涓�
+        ywContractMapper.update(new UpdateWrapper<YwContract>()
+                .lambda()
+                .set(YwContract::getStatus,Constants.ONE)
+                .set(YwContract::getEditDate,DateUtil.getCurrDateTime())
+                .eq(YwContract::getIsdeleted,Constants.ZERO)
+                .in(YwContract::getStatus,Constants.ZERO)
+                .apply(" START_DATE < NOW()  AND END_DATE > NOW() ")
+        );
+        //瀹氭椂澶勭悊鍚堝悓宸茶繃鏈�
+        ywContractMapper.update(new UpdateWrapper<YwContract>()
+                        .lambda()
+                .set(YwContract::getStatus,Constants.TWO)
+                .set(YwContract::getEditDate,DateUtil.getCurrDateTime())
+                .eq(YwContract::getIsdeleted,Constants.ZERO)
+                .in(YwContract::getStatus,Constants.ONE,Constants.ZERO)
+                .apply(" END_DATE < NOW() ")
+        );
+
     }
 
     private void dealBackRentBillBiz(YwContract param) {
@@ -209,7 +357,7 @@
                 //浠樻鐘舵�侊細0=寰呮敹娆撅紱1=宸茬粨娓咃紱2=閮ㄥ垎缁撴竻锛�3=寰呬粯娆撅紱4=寰呴��娆撅紱5=宸插叧闂�
                 // 濡傛灉鏄娂閲戞垨鑰呬繚璇侀噾锛屼笉鏀寔閫�娆撅紝淇濇寔鍘熸潵鐨勭姸鎬侊紝 0=绉熻祦璐癸紱1=鐗╀笟璐癸紱2=绉熻祦鎶奸噾锛�3=鐗╀笟鎶奸噾锛�4=姘寸數璐癸紱5=鏉傞」璐癸紱6=鍏朵粬;7=淇濊瘉閲�
                 if(Constants.equalsInteger(Constants.THREE,bill.getCostType())
-                        ||  Constants.equalsInteger(Constants.FOUR,bill.getCostType())
+                        ||  Constants.equalsInteger(Constants.TWO,bill.getCostType())
                         ||Constants.equalsInteger(Constants.SEVEN,bill.getCostType())){
                     //鎶奸噾鍜屼繚璇侀噾
                     yjBills.add(bill);
@@ -347,7 +495,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝鍚堝悓淇℃伅涓嶅瓨鍦紝璇疯繑鍥炲垪琛ㄥ埛鏂伴噸璇曪紒");
         }
 
-        SystemUser user = systemUserMapper.selectById(param.getUserId());
+        SystemUser user = systemUserMapper.selectById(param.getBtUserId());
         if(user ==null ||  (user.getDeleted()!=null&& user.getDeleted() )){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝缁忓姙浜轰俊鎭笉瀛樺湪锛�");
         }
@@ -370,10 +518,11 @@
     }
 
     private void dealDetailListBiz(YwContract model) {
-        List<YwContractDetail> details = new ArrayList<>();
+        List<YwContractDetail> details1 = new ArrayList<>();
+        List<YwContractDetail> details2 = new ArrayList<>();
         int num = 0;
         if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                || Constants.equalsInteger(model.getType(),Constants.ONE)){
+                || Constants.equalsInteger(model.getType(),Constants.TWO)){
             for(YwContractDetail d :model.getZlDetailList()){
                d.setCreateDate(model.getEditDate());
                d.setCreator(model.getEditor());
@@ -382,12 +531,12 @@
                d.setType(Constants.ZERO);
                d.setSortnum(num++);
                d.setStatus(Constants.ZERO);
-               details.add(d);
+               details1.add(d);
             }
         }
         num = 0;
         if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                || Constants.equalsInteger(model.getType(),Constants.TWO)){
+                || Constants.equalsInteger(model.getType(),Constants.ONE)){
             for(YwContractDetail d :model.getWyDetailList()){
                 d.setCreateDate(model.getEditDate());
                 d.setCreator(model.getEditor());
@@ -396,71 +545,97 @@
                 d.setContractId(model.getId());
                 d.setSortnum(num++);
                 d.setStatus(Constants.ZERO);
-                details.add(d);
+                details2.add(d);
             }
         }
-        ywContractDetailMapper.insert(details);//鎵归噺鎻掑叆鏉℃淇℃伅淇℃伅
+        if(model.getId()!=null){
+            if(details1.size()>0){
+                ywContractDetailMapper.insert(details1);//鎵归噺鎻掑叆鏉℃淇℃伅淇℃伅
+            }
+            if(details2.size()>0){
+                ywContractDetailMapper.insert(details2);//鎵归噺鎻掑叆鏉℃淇℃伅淇℃伅
+            }
+        }
         //澶勭悊璐﹀崟淇℃伅
-        dealBillListBiz(model,details);
+        dealBillListBiz(model,details1,details2);
     }
 
     /**
      * 鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�
      * @param model
-     * @param details
+     * @param details1 绉熻祦鏉℃
+     * @param details2 鐗╀笟鏉℃
      */
-    private void dealBillListBiz(YwContract model, List<YwContractDetail> details) {
-        List<YwContractBill> billList = new ArrayList<>();
+    private void dealBillListBiz(YwContract model, List<YwContractDetail> details1, List<YwContractDetail> details2) {
+        List<YwContractBill> billList1 = new ArrayList<>();
+        List<YwContractBill> billList2 = new ArrayList<>();
         if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                || Constants.equalsInteger(model.getType(),Constants.ONE)){
+                || Constants.equalsInteger(model.getType(),Constants.TWO)){
             //濡傛灉鏈夌璧佹潯娆�
             if(Constants.formatBigdecimal(model.getZlDeposit()).compareTo(new BigDecimal(0))>0){
                     //濡傛灉鏈夌璧佹娂閲�
-                billList.add(initDepoistBill(Constants.THREE,model));
+                billList1.add(initDepoistBill(Constants.TWO,model));
             }
             if(Constants.equalsInteger(model.getZlPayType(), Constants.ZERO)){
                 //濡傛灉鏄竴娆℃�т粯娓�
-                billList.addAll(getBillsByParamOnce(model,details,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
+                billList1.addAll(getBillsByParamOnce(model,details1,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
             }else if(Constants.equalsInteger(model.getZlPayType(), Constants.ONE)){
                 //濡傛灉姣忎笁涓湀涓�浠�
-                billList.addAll(getBillsByParam3Months(model,details,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
+                billList1.addAll(getBillsByParam3Months(model,details1,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
             }else if(Constants.equalsInteger(model.getZlPayType(), Constants.TWO)){
                 //濡傛灉鍏釜鏈堜竴浠�
-                billList.addAll(getBillsByParam6Months(model,details,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
+                billList1.addAll(getBillsByParam6Months(model,details1,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
             }else if(Constants.equalsInteger(model.getZlPayType(), Constants.THREE)){
                 //濡傛灉涓�骞翠竴浠�
-                billList.addAll(getBillsByParam1Year(model,details,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
+                billList1.addAll(getBillsByParam1Year(model,details1,model.getZlFreeStartDate(),model.getZlFreeEndDate()));
             }
         }
         if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                || Constants.equalsInteger(model.getType(),Constants.TWO)){
+                || Constants.equalsInteger(model.getType(),Constants.ONE)){
             //濡傛灉鐗╀笟鏉℃
             if(Constants.formatBigdecimal(model.getWyDeposit()).compareTo(new BigDecimal(0))>0){
                 //濡傛灉鏈夌璧佹娂閲�
-                billList.add(initDepoistBill(Constants.FOUR,model));
+                billList2.add(initDepoistBill(Constants.THREE,model));
             }
             if(Constants.equalsInteger(model.getWyPayType(), Constants.ZERO)){
                 //濡傛灉鏄竴娆℃�т粯娓�
-                billList.addAll(getBillsByParamOnce(model,details,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
+                billList2.addAll(getBillsByParamOnce(model,details2,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
             }else if(Constants.equalsInteger(model.getWyPayType(), Constants.ONE)){
                 //濡傛灉姣忎笁涓湀涓�浠�
-                billList.addAll(getBillsByParam3Months(model,details,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
+                billList2.addAll(getBillsByParam3Months(model,details2,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
             }else if(Constants.equalsInteger(model.getWyPayType(), Constants.TWO)){
                 //濡傛灉鍏釜鏈堜竴浠�
-                billList.addAll(getBillsByParam6Months(model,details,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
+                billList2.addAll(getBillsByParam6Months(model,details2,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
             }else if(Constants.equalsInteger(model.getWyPayType(), Constants.THREE)){
                 //濡傛灉涓�骞翠竴浠�
-                billList.addAll(getBillsByParam1Year(model,details,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
+                billList2.addAll(getBillsByParam1Year(model,details2,model.getWyFreeStartDate(),model.getWyFreeEndDate()));
             }
         }
-        for(int i=0;i<billList.size();i++){
-            billList.get(i).setSortnum(i+1);
-        }
-        ywContractBillMapper.insert(billList);
 
+        if(model.getBillType() == 0){
+            model.setBillList(billList1);
+        }else  if(model.getBillType() == 1){
+            model.setBillList(billList2);
+        }
+        int num =1;
+        for(int i=0;i<billList1.size();i++){
+            if(Constants.equalsInteger( billList1.get(i).getCostType(),Constants.ZERO)){
+                billList1.get(i).setSortnum(num++);
+            }
+        }
+          num =1;
+        for(int i=0;i<billList2.size();i++){
+            if(Constants.equalsInteger( billList2.get(i).getCostType(),Constants.ONE)){
+                billList2.get(i).setSortnum(num++);
+            }
+        }
+        if(model.getId()!=null){
+            ywContractBillMapper.insert(billList1);
+            ywContractBillMapper.insert(billList2);
+        }
     }
 
-    private YwContractBill initDepoistBill(int type,  YwContract model) {
+    private YwContractBill initDepoistBill(int type,  YwContract model ) {
         YwContractBill bill  = new YwContractBill();
         bill.setCreateDate(model.getEditDate());
         bill.setCreator(model.getEditor());
@@ -473,8 +648,13 @@
         bill.setEndDate(model.getEndDate());
         bill.setType(Constants.ZERO);
         bill.setCostType(type);
+        bill.setPlanPayDate(bill.getStartDate());
         bill.setTotleFee(type==Constants.THREE?model.getZlDeposit():model.getWyDeposit());//鎶奸噾璐圭敤
+        bill.setReceivableFee(bill.getTotleFee());
+        bill.setBillType(Constants.ZERO);
+        bill.setPayStatus(Constants.ZERO);
         bill.setSortnum(0);
+        bill.setCompanyId(model.getCompanyId());
         return bill;
     }
 
@@ -521,13 +701,12 @@
         int monthSix = months / 6;//6涓湀缁村害鏁伴噺
         int restMonth = months % 6;//鍓╀綑鐨勬暣鏈�
         int monthDays =   dateCompare.getMonthDays();//涓嶆弧涓�涓湀鐨勫ぉ鏁�
-        Date date = new Date();
         List<Date> list = new ArrayList<>();
         for (int i = 0; i < monthSix; i++) {
-            list.add(DateUtil.addMonthToDate(date,i*6));
+            list.add(DateUtil.addMonthToDate(startDate,i*6));
         }
         if(restMonth>0 || monthDays>0){
-            list.add(DateUtil.addDaysToDate(date,monthSix));
+            list.add(DateUtil.addMonthToDate(startDate,monthSix*6));
         }
         return list;
     }
@@ -537,13 +716,12 @@
         int monthThree = months / 3;//3涓湀缁村害鏁伴噺
         int restMonth = months % 3;//鍓╀綑鐨勬暣鏈�
         int monthDays =   dateCompare.getMonthDays();//涓嶆弧涓�涓湀鐨勫ぉ鏁�
-        Date date = new Date();
         List<Date> list = new ArrayList<>();
         for (int i = 0; i < monthThree; i++) {
-            list.add(DateUtil.addMonthToDate(date,i*3));
+            list.add(DateUtil.addMonthToDate(startDate,i*3));
         }
         if(restMonth>0 || monthDays>0){
-            list.add(DateUtil.addDaysToDate(date,monthThree));
+            list.add(DateUtil.addMonthToDate(startDate,monthThree*3));
         }
         return list;
     }
@@ -568,30 +746,36 @@
     }
 
     private void dealCircleDateBillBiz(  List<Date> dateList ,YwContract model, YwContractDetail d, Date freeStart, Date freeEnd, List<YwContractBill> list ) {
+        int temp = 0;
         for(Date start : dateList){
-            Date end = DateUtil.addDaysToDate(DateUtil.addYearToDate(start,1),-1);//缁撴潫鏃ユ湡涓轰笅涓�涓懆鏈熺殑鍓嶄竴澶�
-            if(end.getTime()> d.getEndDate().getTime() ){
-                end = d.getEndDate();
+            Date end = d.getEndDate();
+            if(temp+1 < dateList.size()){
+                end =DateUtil.addDaysToDate(dateList.get(temp+1),-1);
             }
+            temp++;
             YwContractBill bill = initCreateBillModel(model,d );
             bill.setStartDate(start);//璐﹀崟寮�濮�
             bill.setEndDate(end);//璐﹀崟缁撴潫
-            bill.setPlanPayDate(DateUtil.addDaysToDate(d.getStartDate(),Constants.formatIntegerNum(d.getAdvanceDays()) * -1));
-            BigDecimal totalFee =getTotalFeeByStartEnd(model,d,freeStart,freeEnd);
+            Date planPayDate = DateUtil.addDaysToDate(bill.getStartDate(),Constants.formatIntegerNum(d.getAdvanceDays()) * -1);
+            bill.setPlanPayDate(planPayDate.getTime()>System.currentTimeMillis()?planPayDate:new Date());
+            BigDecimal totalFee =getTotalFeeByStartEnd(model,d,bill,freeStart,freeEnd);
             bill.setTotleFee(totalFee);
+            bill.setReceivableFee(totalFee);
+            bill.setBillType(Constants.ZERO);
 
+
+            bill.setCompanyId(model.getCompanyId());
             list.add(bill);
         }
     }
 
 
-
-    private BigDecimal getTotalFeeByStartEnd(YwContract model, YwContractDetail d,Date freeStart,Date freeEnd) {
+    private BigDecimal getTotalFeeByStartEnd(YwContract model, YwContractDetail d, YwContractBill bill,Date freeStart,Date freeEnd) {
         BigDecimal totalFee = new BigDecimal(0);
-        DateCompare dateCompare =   DateCompare.dayCompare(d.getStartDate(),d.getEndDate(),freeStart,freeEnd);
+        DateCompare dateCompare =   DateCompare.dayCompare(bill.getStartDate(),DateUtil.addDaysToDate(bill.getEndDate(),1),freeStart,DateUtil.addDaysToDate(freeEnd,1));
         if(Constants.equalsInteger(d.getCircleType(),Constants.ZERO)){
             //0=鍏冩瘡骞崇背澶�
-            int days = dateCompare.getDay();
+            int days = dateCompare.getDay() ;
             BigDecimal areas = getAreasNumBYRooms(model.getRoomList());
             totalFee = new BigDecimal(days).multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//鎬讳环鏍�
         }else  if(Constants.equalsInteger(d.getCircleType(),Constants.ONE)){
@@ -606,7 +790,7 @@
             totalFee = year.multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//鎬讳环鏍�
         }else  if(Constants.equalsInteger(d.getCircleType(),Constants.THREE)){
             //3=鍏冩瘡澶�
-            int days = dateCompare.getDay();
+            int days = dateCompare.getDay() ;
             totalFee = new BigDecimal(days).multiply(Constants.formatBigdecimal(d.getPrice()));//鎬讳环鏍�
         }else  if(Constants.equalsInteger(d.getCircleType(),Constants.FOUR)){
             //4=鍏冩瘡鏈�
@@ -634,13 +818,12 @@
         DateCompare dateCompare =   DateCompare.monthYearCompare(startDate, endDate );
         int years = dateCompare.getYear();
         int yeardays = dateCompare.getYearDays();
-        Date date = new Date();
         List<Date> list = new ArrayList<>();
         for (int i = 0; i < years; i++) {
-            list.add(DateUtil.addYearToDate(date,i));
+            list.add(DateUtil.addYearToDate(startDate,i));
         }
         if(yeardays>0){
-            list.add(DateUtil.addYearToDate(date,years));
+            list.add(DateUtil.addYearToDate(startDate,years));
         }
         return list;
     }
@@ -658,8 +841,10 @@
             YwContractBill bill = initCreateBillModel(model,d);
             bill.setStartDate(d.getStartDate());//璐﹀崟寮�濮�
             bill.setEndDate(d.getEndDate());//璐﹀崟缁撴潫
-            bill.setPlanPayDate(DateUtil.addDaysToDate(d.getStartDate(),Constants.formatIntegerNum(d.getAdvanceDays()) * -1));
-            bill.setTotleFee(getTotalFeeByStartEnd(model,d,freeStart,freeEnd));
+            bill.setPlanPayDate(DateUtil.addDaysToDate(bill.getStartDate(),Constants.formatIntegerNum(d.getAdvanceDays()) * -1));
+            bill.setTotleFee(getTotalFeeByStartEnd(model,d,bill,freeStart,freeEnd));
+            bill.setReceivableFee(bill.getTotleFee());
+            bill.setBillType(Constants.ZERO);
             list.add(bill);
         }
         return list;
@@ -675,6 +860,7 @@
         bill.setIsdeleted(Constants.ZERO);
         bill.setContractId(model.getId());
         bill.setStatus(Constants.ZERO);
+        bill.setPayStatus(Constants.ZERO);
         bill.setDetailId(d.getId());
         bill.setCostType(d.getType());
         bill.setType(Constants.ZERO);
@@ -684,15 +870,21 @@
 
     private BigDecimal getAreasNumBYRooms(List<YwRoom> roomList) {
         BigDecimal data= new BigDecimal(0);
-        for(YwRoom r :roomList){
-            data = data.add(Constants.formatBigdecimal(r.getArea()));
+        if(roomList!=null){
+            for(YwRoom r :roomList){
+                data = data.add(Constants.formatBigdecimal(r.getArea()));
+            }
         }
+
         return  data;
     }
 
     private void initFiles(YwContract model) {
-        List<Multifile> multifiles = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
-                .eq(Multifile::getObjId, model.getId() )
+        List<Multifile> multifiles = multifileMapper.selectJoinList(Multifile.class,new MPJLambdaWrapper<Multifile>()
+                .selectAll(Multifile.class)
+                .selectAs(SystemUser::getRealname,Multifile::getUserName)
+                .leftJoin(SystemUser.class,SystemUser::getId,Multifile::getCreator)
+                .eq(Multifile::getObjId,model.getId())
                 .in(Multifile::getObjType, Arrays.asList(new Integer[]{Constants.MultiFile.YW_CONTRACT_FILE.getKey()}))
                 .eq(Multifile::getIsdeleted,Constants.ZERO));
         if(multifiles!=null){
@@ -758,9 +950,8 @@
 
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鍚堝悓鏈夋晥鏈熺粨鏉熸椂闂翠笉寰楁棭浜庡紑濮嬫椂闂达紒");
         }
-
         if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                || Constants.equalsInteger(model.getType(),Constants.ONE)){
+                || Constants.equalsInteger(model.getType(),Constants.TWO)){
             if(  model.getZlDeposit() == null
                     ||model.getZlPayType() == null
                     || model.getZlPayType()>3
@@ -769,12 +960,18 @@
                     ||model.getZlDetailList().size() ==0){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓绉熻祦鏉℃淇℃伅");
             }
+
             if(!(model.getZlFreeEndDate()==null &&  model.getZlFreeStartDate()==null) && (
                         (model.getZlFreeEndDate()!=null &&  model.getZlFreeStartDate()==null)
                         ||(model.getZlFreeEndDate()==null &&  model.getZlFreeStartDate()!=null)
                         ||model.getZlFreeEndDate().getTime()<= model.getZlFreeStartDate().getTime())
                   ){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇烽�夋嫨姝g‘鐨勭璧佹潯娆惧厤绉熸湡淇℃伅锛�");
+            }
+            if((model.getZlFreeStartDate()!=null && model.getZlFreeEndDate()!=null)
+                    && (model.getZlFreeEndDate().getTime()>model.getEndDate().getTime()
+                    || model.getZlFreeStartDate().getTime()<model.getStartDate().getTime())){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鍏嶇鏈熷紑濮嬫棩鏈熷拰缁撴潫鏃ユ湡闄愬埗鍦ㄥ悎鍚屾椂闂磋寖鍥村唴锛�");
             }
             for(YwContractDetail d :model.getZlDetailList()){
                 if(  d.getStartDate() == null
@@ -787,17 +984,23 @@
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓绉熻祦鏉℃淇℃伅!");
                 }
                 if(d.getEndDate().getTime()<= d.getStartDate().getTime()){
-
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绉熻祦鏉℃鏈夋晥鏈熺粨鏉熸椂闂翠笉寰楁棭浜庡紑濮嬫椂闂达紒");
+                }
+                if(d.getEndDate().getTime()>model.getEndDate().getTime() ||d.getStartDate().getTime()<model.getStartDate().getTime()){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏉℃寮�濮嬫棩鏈熷拰缁撴潫鏃ユ湡闄愬埗鍦ㄥ悎鍚屾椂闂磋寖鍥村唴锛�");
                 }
                 if(!Constants.equalsInteger(model.getWyPayType(),Constants.ZERO) &&
                         Constants.equalsInteger(d.getCircleType(),Constants.SIX)){
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绉熻祦鏉℃鍙湁閫夋嫨涓�娆℃�т粯娆炬椂锛屾墠鑳介�夋嫨璇ユ寜姣忓満鏀惰垂锛�");
                 }
+                if(model.getZlFirstCircle() == null){//棣栨湡淇℃伅
+                    model.setZlFirstPrice(d.getPrice());
+                    model.setZlFirstCircle(d.getCircleType());
+                }
             }
         }
         if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                || Constants.equalsInteger(model.getType(),Constants.TWO)){
+                || Constants.equalsInteger(model.getType(),Constants.ONE)){
             if(  model.getWyDeposit() == null
                     ||model.getWyPayType() == null
                     || model.getWyPayType()>3
@@ -807,15 +1010,21 @@
             ){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇锋寜椤甸潰瑕佹眰濉啓鐗╀笟鏉℃淇℃伅");
             }
+
             if(!(model.getWyFreeEndDate()==null &&  model.getWyFreeStartDate()==null) && (
                     (model.getWyFreeEndDate()!=null &&  model.getWyFreeStartDate()==null)
                             ||(model.getWyFreeEndDate()==null &&  model.getWyFreeStartDate()!=null)
                             ||model.getWyFreeEndDate().getTime()<= model.getWyFreeStartDate().getTime())){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇烽�夋嫨姝g‘鐨勭墿涓氭潯娆惧厤绉熸湡淇℃伅锛�");
             }
+            if((model.getWyFreeStartDate()!=null && model.getWyFreeEndDate()!=null)
+                    && (model.getWyFreeEndDate().getTime()>model.getEndDate().getTime()
+                    || model.getWyFreeStartDate().getTime()<model.getStartDate().getTime())){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鍏嶇鏈熷紑濮嬫棩鏈熷拰缁撴潫鏃ユ湡闄愬埗鍦ㄥ悎鍚屾椂闂磋寖鍥村唴锛�");
+            }
             for(YwContractDetail d :model.getWyDetailList()){
                 if(  d.getStartDate() == null
-                        ||d.getEditDate() == null
+                        ||d.getEndDate() == null
                         ||d.getPrice() == null
                         ||d.getCircleType() == null
                         || d.getCircleType()>6
@@ -826,14 +1035,22 @@
                 if(d.getEndDate().getTime()<= d.getStartDate().getTime()){
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鐗╀笟鏉℃鏈夋晥鏈熺粨鏉熸椂闂翠笉寰楁棭浜庡紑濮嬫椂闂达紒");
                 }
+                if(d.getEndDate().getTime()>model.getEndDate().getTime() ||d.getStartDate().getTime()<model.getStartDate().getTime()){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏉℃寮�濮嬫棩鏈熷拰缁撴潫鏃ユ湡闄愬埗鍦ㄥ悎鍚屾椂闂磋寖鍥村唴锛�");
+                }
                 if(!Constants.equalsInteger(model.getWyPayType(),Constants.ZERO) &&
                         Constants.equalsInteger(d.getCircleType(),Constants.SIX)){
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鐗╀笟鏉℃鍙湁閫夋嫨涓�娆℃�т粯娆炬椂锛屾墠鑳介�夋嫨璇ユ寜姣忓満鏀惰垂锛�");
                 }
+                if(model.getWyFirstCircle() == null){
+                    //棣栨湡淇℃伅
+                    model.setWyFirstPrice(d.getPrice());
+                    model.setWyFirstCircle(d.getCircleType());
+                }
             }
         }
 
-        YwProject project = projectMapper.selectById(model.getCompanyId());
+        YwProject project = projectMapper.selectById(model.getProjectId());
         if(project ==null || Constants.equalsInteger(project.getIsdeleted(),Constants.ONE)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝璇烽�夋嫨姝g‘鐨勯」鐩俊鎭紒");
         }
@@ -851,6 +1068,7 @@
         for(YwRoom r : rooms){
             model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
         }
+        model.setRoomList(rooms);
         YwCustomer customer = customerMapper.selectById(model.getRenterId());
         if(customer ==null || Constants.equalsInteger(customer.getIsdeleted(),Constants.ONE)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝閫夋嫨绉熷淇℃伅涓嶅瓨鍦紝璇疯繑鍥炲埛鏂伴噸璇曪紒");
@@ -919,6 +1137,7 @@
         log.setObjType(type.getKey());
         log.setParam1(param1);
         log.setParam2(param2);
+        log.setContent(param2);
         log.setTitle(type.getNoteinfo());
         ywWorkorderLogMapper.insert(log);
     }
@@ -930,12 +1149,14 @@
                 .selectAs(SystemUser::getRealname,YwContract::getUserName )
                 .selectAs(YwCustomer::getName,YwContract::getRenterName )
                 .selectAs(YwProject::getName,YwContract::getProjectName )
-                .select("t4.realname",YwContract::getCreatorName )
+                .select("t3.realname",YwContract::getCreatorName )
+                .select("(select sum(r.area) from yw_contract_room cr left join yw_room r on r.id = cr.room_id where r.isdeleted=0 and cr.contract_id =t.id)",YwContract::getTotalArea )
                 .leftJoin(Company.class,Company::getId,YwContract::getCompanyId)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwContract::getUserId)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwContract::getCreator)
                 .leftJoin(YwProject.class,YwProject::getId,YwContract::getProjectId)
-                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId);
+                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
+                .eq( YwContract::getId,id);
         YwContract model = ywContractMapper.selectJoinOne(YwContract.class,queryWrapper);
         if(model != null){
             //鍚堝悓闄勪欢
@@ -950,9 +1171,10 @@
                     .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                     .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                     .eq(YwRoom::getIsdeleted,Constants.ZERO)
-                    .exists("(select a.id from yw_contract_room a where a.isdeleted=1 and a.room_id=t.id and a.contract_id="+model.getId()+")");
+                    .exists("(select a.id from yw_contract_room a where a.isdeleted=0 and a.type=0 and a.room_id=t.id and a.contract_id="+model.getId()+")");
             model.setRoomList(roomMapper.selectJoinList(YwRoom.class,rw));
-
+            model.setWyFirstCircleStr(Constants.getUnitTypeByNum(model.getWyFirstCircle()));
+            model.setZlFirstCircleStr(Constants.getUnitTypeByNum(model.getZlFirstCircle()));
             //鏌ヨ绉熻硟鏉℃淇℃伅
             MPJLambdaWrapper<YwContractDetail> dw = new MPJLambdaWrapper<>();
             dw.selectAll(YwContractDetail.class )
@@ -1026,7 +1248,9 @@
 
     @Override
     public List<YwContract> findList(YwContract ywContract) {
-        QueryWrapper<YwContract> wrapper = new QueryWrapper<>(ywContract);
+        QueryWrapper<YwContract> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(YwContract::getIsdeleted,Constants.ZERO);
+        wrapper.lambda().in(YwContract::getStatus,Constants.ZERO,Constants.ONE,Constants.TWO);
         return ywContractMapper.selectList(wrapper);
     }
   
@@ -1036,8 +1260,10 @@
         MPJLambdaWrapper<YwContract> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.selectAll(YwContract.class )
                 .selectAs(Company::getName,YwContract::getCompanyName )
+                .selectAs(YwCustomer::getName,YwContract::getRenterName )
                 .select("(select sum(r.area) from yw_contract_room cr left join yw_room r on r.id = cr.room_id where r.isdeleted=0 and cr.contract_id =t.id)",YwContract::getTotalArea )
-                .leftJoin(Company.class,Company::getId,YwContract::getCompanyId);
+                .leftJoin(Company.class,Company::getId,YwContract::getCompanyId)
+                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId);
         Utils.MP.blankToNull(pageWrap.getModel());
         if (pageWrap.getModel().getId() != null) {
             queryWrapper.eq(YwContract::getId, pageWrap.getModel().getId());
@@ -1142,7 +1368,14 @@
         queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getQueryStartTime()), YwContract::getStartDate, pageWrap.getModel().getQueryStartTime())
                         .le(Objects.nonNull(pageWrap.getModel().getQueryEndTime()), YwContract::getEndDate, pageWrap.getModel().getQueryEndTime());
         queryWrapper.orderByDesc(YwContract::getCreateDate );
-        return PageData.from(ywContractMapper.selectJoinPage(page, YwContract.class,queryWrapper));
+        PageData<YwContract> data = PageData.from(ywContractMapper.selectJoinPage(page, YwContract.class,queryWrapper));
+        if(data!=null && data.getRecords()!=null){
+            for(YwContract model : data.getRecords()){
+                model.setWyFirstCircleStr(Constants.getUnitTypeByNum(model.getWyFirstCircle()));
+                model.setZlFirstCircleStr(Constants.getUnitTypeByNum(model.getZlFirstCircle()));
+            }
+        }
+        return data;
     }
 
     @Override
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
index 1b4b13a..70cac05 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
@@ -7,6 +7,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.YwDeviceMapper;
 import com.doumee.dao.business.model.Category;
@@ -64,27 +65,20 @@
         if(ywDeviceMapper.selectCount(new QueryWrapper<YwDevice>().lambda().eq(YwDevice::getIsdeleted,Constants.ZERO).eq(YwDevice::getCode,ywDevice.getCode()))>Constants.ZERO){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁惧缂栧彿閲嶅!");
         }
-//        if(StringUtils.isBlank(ywDevice.getCode())){
-//            String code = this.getMaxAutoMaticDeviceCode();
-//            while (ywDeviceMapper.selectCount(new QueryWrapper<YwDevice>().lambda().eq(YwDevice::getIsdeleted,Constants.ZERO).eq(YwDevice::getCode,code))>Constants.ZERO){
-//                code = this.getMaxAutoMaticDeviceCode();
-//            }
-//             ywDevice.setCode(code);
-//        }else{
-//
-//        }
         ywDevice.setCreateDate(new Date());
         ywDevice.setCreator(loginUserInfo.getId());
         ywDevice.setIsdeleted(Constants.ZERO);
         ywDeviceMapper.insert(ywDevice);
 
-        if(Objects.nonNull(ywDevice.getMultifile())){
-            ywDevice.getMultifile().setCreator(loginUserInfo.getId());
-            ywDevice.getMultifile().setCreateDate(new Date());
-            ywDevice.getMultifile().setIsdeleted(Constants.ZERO);
-            ywDevice.getMultifile().setObjType(Constants.MultiFile.FN_DEVICE_FILE.getKey());
-            ywDevice.getMultifile().setObjId(ywDevice.getId());
-            multifileMapper.insert(ywDevice.getMultifile());
+        if(Objects.nonNull(ywDevice.getFileUrl())){
+            Multifile multifile = new Multifile();
+            multifile.setCreator(loginUserInfo.getId());
+            multifile.setCreateDate(new Date());
+            multifile.setIsdeleted(Constants.ZERO);
+            multifile.setObjType(Constants.MultiFile.FN_DEVICE_FILE.getKey());
+            multifile.setObjId(ywDevice.getId());
+            multifile.setFileurl(ywDevice.getFileUrl());
+            multifileMapper.insert(multifile);
         }
 
         return ywDevice.getId();
@@ -93,7 +87,7 @@
     @Override
     public void deleteById(Integer id, LoginUserInfo user) {
         ywDeviceMapper.update(new UpdateWrapper<YwDevice>().lambda().set(YwDevice::getIsdeleted,Constants.ONE)
-                .set(YwDevice::getEditDate," now() ")
+                .set(YwDevice::getEditDate, DateUtil.getCurrDateTime())
                 .set(YwDevice::getEditor,user.getId())
                 .eq(YwDevice::getId,user.getId())
         );
@@ -135,13 +129,15 @@
                 .eq(Multifile::getObjId,ywDevice.getId())
                 .eq(Multifile::getObjType,Constants.MultiFile.FN_DEVICE_FILE.getKey())
         );
-        if(Objects.nonNull(ywDevice.getMultifile())){
-            ywDevice.getMultifile().setCreator(loginUserInfo.getId());
-            ywDevice.getMultifile().setCreateDate(new Date());
-            ywDevice.getMultifile().setIsdeleted(Constants.ZERO);
-            ywDevice.getMultifile().setObjType(Constants.MultiFile.FN_DEVICE_FILE.getKey());
-            ywDevice.getMultifile().setObjId(ywDevice.getId());
-            multifileMapper.insert(ywDevice.getMultifile());
+        if(Objects.nonNull(ywDevice.getFileUrl())){
+            Multifile multifile = new Multifile();
+            multifile.setCreator(loginUserInfo.getId());
+            multifile.setCreateDate(new Date());
+            multifile.setIsdeleted(Constants.ZERO);
+            multifile.setObjType(Constants.MultiFile.FN_DEVICE_FILE.getKey());
+            multifile.setObjId(ywDevice.getId());
+            multifile.setFileurl(ywDevice.getFileUrl());
+            multifileMapper.insert(multifile);
         }
 
 
@@ -169,8 +165,7 @@
         if(Objects.nonNull(multifile)){
             String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                     +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_DEVICE).getCode();
-            multifile.setFileurlFull(path + multifile.getFileurl());
-            ywDevice.setMultifile(multifile);
+            ywDevice.setFileFullUrl(path + multifile.getFileurl());
         }
         return ywDevice;
     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
index f5b6603..51e298f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
@@ -65,10 +65,11 @@
             ){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"宸℃鐐归厤缃敊璇�");
             }
+            ywLinePoint.setId(null);
             ywLinePoint.setCreateDate(new Date());
             ywLinePoint.setCreator(loginUserInfo.getId());
             ywLinePoint.setIsdeleted(Constants.ZERO);
-            ywLinePoint.setLineId(ywLinePoint.getId());
+            ywLinePoint.setLineId(ywPatrolLine.getId());
         }
         ywLinePointMapper.insert(ywLinePointList);
         return ywPatrolLine.getId();
@@ -117,7 +118,8 @@
             ){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"宸℃鐐归厤缃敊璇�");
             }
-            ywLinePoint.setLineId(ywLinePoint.getId());
+            ywLinePoint.setId(null);
+            ywLinePoint.setLineId(ywPatrolLine.getId());
             ywLinePoint.setCreateDate(new Date());
             ywLinePoint.setCreator(loginUserInfo.getId());
             ywLinePoint.setIsdeleted(Constants.ZERO);
@@ -148,7 +150,8 @@
         List<YwLinePoint> ywLinePointList = ywLinePointMapper.selectJoinList(YwLinePoint.class,new MPJLambdaWrapper<YwLinePoint>()
                 .selectAll(YwLinePoint.class)
                 .selectAs(YwPatrolPoint::getName,YwLinePoint::getPointName)
-                .leftJoin(YwPatrolLine.class,YwPatrolLine::getId,YwLinePoint::getPointId)
+                .selectAs(YwPatrolPoint::getCode,YwLinePoint::getCode)
+                .leftJoin(YwPatrolPoint.class,YwPatrolPoint::getId,YwLinePoint::getPointId)
                 .eq(YwLinePoint::getLineId,id)
                 .orderByAsc(YwLinePoint::getSortnum)
         );
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
index 948ccf5..0674afb 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
@@ -7,6 +7,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.YwPatrolPointMapper;
 import com.doumee.dao.business.model.Category;
@@ -65,13 +66,15 @@
         ywPatrolPointMapper.insert(ywPatrolPoint);
 
 
-        if(Objects.nonNull(ywPatrolPoint.getMultifile())){
-            ywPatrolPoint.getMultifile().setCreator(loginUserInfo.getId());
-            ywPatrolPoint.getMultifile().setCreateDate(new Date());
-            ywPatrolPoint.getMultifile().setIsdeleted(Constants.ZERO);
-            ywPatrolPoint.getMultifile().setObjType(Constants.MultiFile.FN_PATROL_POINT_FILE.getKey());
-            ywPatrolPoint.getMultifile().setObjId(ywPatrolPoint.getId());
-            multifileMapper.insert(ywPatrolPoint.getMultifile());
+        if(Objects.nonNull(ywPatrolPoint.getFileUrl())){
+            Multifile multifile = new Multifile();
+            multifile.setCreator(loginUserInfo.getId());
+            multifile.setCreateDate(new Date());
+            multifile.setIsdeleted(Constants.ZERO);
+            multifile.setObjType(Constants.MultiFile.FN_PATROL_POINT_FILE.getKey());
+            multifile.setObjId(ywPatrolPoint.getId());
+            multifile.setFileurl(ywPatrolPoint.getFileUrl());
+            multifileMapper.insert(multifile);
         }
 
         return ywPatrolPoint.getId();
@@ -80,7 +83,7 @@
     @Override
     public void deleteById(Integer id, LoginUserInfo user) {
         ywPatrolPointMapper.update(new UpdateWrapper<YwPatrolPoint>().lambda().set(YwPatrolPoint::getIsdeleted,Constants.ONE)
-                .set(YwPatrolPoint::getEditDate," now() ")
+                .set(YwPatrolPoint::getEditDate, DateUtil.getCurrDateTime())
                 .set(YwPatrolPoint::getEditor,user.getId())
                 .eq(YwPatrolPoint::getId,user.getId())
         );
@@ -123,13 +126,15 @@
                 .eq(Multifile::getObjType,Constants.MultiFile.FN_PATROL_POINT_FILE.getKey())
         );
 
-        if(Objects.nonNull(ywPatrolPoint.getMultifile())){
-            ywPatrolPoint.getMultifile().setCreator(loginUserInfo.getId());
-            ywPatrolPoint.getMultifile().setCreateDate(new Date());
-            ywPatrolPoint.getMultifile().setIsdeleted(Constants.ZERO);
-            ywPatrolPoint.getMultifile().setObjType(Constants.MultiFile.FN_PATROL_POINT_FILE.getKey());
-            ywPatrolPoint.getMultifile().setObjId(ywPatrolPoint.getId());
-            multifileMapper.insert(ywPatrolPoint.getMultifile());
+        if(Objects.nonNull(ywPatrolPoint.getFileUrl())){
+            Multifile multifile = new Multifile();
+            multifile.setCreator(loginUserInfo.getId());
+            multifile.setCreateDate(new Date());
+            multifile.setIsdeleted(Constants.ZERO);
+            multifile.setObjType(Constants.MultiFile.FN_PATROL_POINT_FILE.getKey());
+            multifile.setObjId(ywPatrolPoint.getId());
+            multifile.setFileurl(ywPatrolPoint.getFileUrl());
+            multifileMapper.insert(multifile);
         }
 
     }
@@ -157,8 +162,7 @@
         if(Objects.nonNull(multifile)){
             String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                     +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_PATROL).getCode();
-            multifile.setFileurlFull(path + multifile.getFileurl());
-            ywPatrolPoint.setMultifile(multifile);
+            ywPatrolPoint.setFileFullUrl(path + multifile.getFileurl());
         }
         return ywPatrolPoint;
     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
index d85a2fe..6f532e1 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
@@ -26,6 +26,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
@@ -51,6 +52,7 @@
     private RedisTemplate<String, Object> redisTemplate;
 
     @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public Integer create(YwPatrolScheme ywPatrolScheme) {
         if(Objects.isNull(ywPatrolScheme)
         || StringUtils.isBlank(ywPatrolScheme.getTitle())
@@ -122,9 +124,10 @@
             //姣忔湀鏍规嵁鏃ユ湡鐢熸垚 鏍规嵁鏃ユ湡鑾峰彇鏄摢澶�
             List<String> days = Arrays.asList(ywPatrolScheme.getCircleDays().split(","));
             String dayStr = DateUtil.getFomartDate(schemeDate,"dd");
-            if(Objects.isNull(days.stream().filter(i->StringUtils.equals(i,dayStr)).findFirst().get())){
+            Optional<String>  optional = days.stream().filter(i->StringUtils.equals(i,dayStr)).findAny();
+            if(Objects.isNull(optional)){
                 return;
-            };
+            }
         }
         String schemeDateStr = DateUtil.getDate(schemeDate,"yyyy-MM-dd");
         //鏌ヨ褰撳ぉ鏄惁鐢熸垚杩囨暟鎹�
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
index 3bfe5a0..ec9f16f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
@@ -121,6 +121,7 @@
         YwPatrolTask model = pageWrap.getModel();
         queryWrapper.selectAll(YwPatrolTask.class)
                 .selectAs(YwPatrolScheme::getCode,YwPatrolTask::getPlanCode)
+                .selectAs(YwPatrolScheme::getTitle,YwPatrolTask::getPlanTitle)
                 .selectAs(SystemUser::getRealname,YwPatrolTask::getUserName)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolTask::getDealUserId)
                 .leftJoin(YwPatrolScheme.class,YwPatrolScheme::getId,YwPatrolTask::getSchemeId)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
index 5e27677..7c9d35f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
@@ -5,18 +5,27 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwBuildingMapper;
+import com.doumee.dao.business.YwFloorMapper;
 import com.doumee.dao.business.YwProjectMapper;
-import com.doumee.dao.business.model.Company;
-import com.doumee.dao.business.model.YwProject;
+import com.doumee.dao.business.YwRoomMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.business.vo.CompanyTree;
+import com.doumee.dao.business.vo.ProjectDataVO;
+import com.doumee.dao.business.vo.ProjectTree;
+import com.doumee.service.business.AreasService;
 import com.doumee.service.business.YwProjectService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -30,6 +39,17 @@
 
     @Autowired
     private YwProjectMapper ywProjectMapper;
+    @Autowired
+    private AreasService areasService;
+
+    @Autowired
+    private YwFloorMapper ywFloorMapper;
+
+    @Autowired
+    private YwRoomMapper ywRoomMapper;
+
+    @Autowired
+    private YwBuildingMapper ywBuildingMapper;
 
     @Override
     public Integer create(YwProject  model) {
@@ -154,7 +174,22 @@
             queryWrapper.lambda().eq(YwProject::getAddr, pageWrap.getModel().getAddr());
         }
         queryWrapper.lambda().orderByDesc(YwProject::getCreateDate);
-        return PageData.from(ywProjectMapper.selectPage(page, queryWrapper));
+        PageData<YwProject> data = PageData.from(ywProjectMapper.selectPage(page, queryWrapper));
+        if(data!=null && data.getRecords()!=null){
+            for(YwProject model :data.getRecords()){
+                    if(model.getAreaId()!=null){
+                        Areas a = areasService.findById(model.getAreaId(),Constants.TWO);
+                        if(a != null){
+                            model.setAreaName(a.getName());
+                            model.setCityId(a.getCityId());
+                            model.setCityName(a.getCityName());
+                            model.setProvinceId(a.getProvinceId());
+                            model.setProvinceName(a.getProvinceName());
+                        }
+                    }
+            }
+        }
+        return data;
     }
 
     @Override
@@ -162,4 +197,78 @@
         QueryWrapper<YwProject> wrapper = new QueryWrapper<>(ywProject);
         return ywProjectMapper.selectCount(wrapper);
     }
+
+
+    @Override
+    public List<ProjectDataVO> projectTree(){
+        List<ProjectDataVO> projectDataVOList = new ArrayList<>();
+        List<YwProject>  ywProjectList = ywProjectMapper.selectList(new QueryWrapper<YwProject>().lambda()
+                .eq(YwProject::getIsdeleted,Constants.ZERO)
+                .eq(YwProject::getStatus,Constants.ZERO)
+                .orderByAsc(YwProject::getSortnum)
+        );
+        for (YwProject ywProject:ywProjectList) {
+            ProjectDataVO projectDataVO = new ProjectDataVO();
+            BeanUtils.copyProperties(ywProject,projectDataVO);
+            projectDataVO.setLv(Constants.ZERO);
+            projectDataVOList.add(projectDataVO);
+        }
+
+        List<YwBuilding>  ywBuildingList = ywBuildingMapper.selectList(new QueryWrapper<YwBuilding>().lambda()
+                .eq(YwBuilding::getIsdeleted,Constants.ZERO)
+                .eq(YwBuilding::getStatus,Constants.ZERO)
+                .orderByAsc(YwBuilding::getSortnum)
+        );
+
+        for (YwBuilding data:ywBuildingList) {
+            ProjectDataVO projectDataVO = new ProjectDataVO();
+            BeanUtils.copyProperties(data,projectDataVO);
+            projectDataVO.setPId(data.getProjectId());
+            projectDataVO.setLv(Constants.ONE);
+            projectDataVOList.add(projectDataVO);
+        }
+
+
+        List<YwFloor>  ywFloorList = ywFloorMapper.selectList(new QueryWrapper<YwFloor>().lambda()
+                .eq(YwFloor::getIsdeleted,Constants.ZERO)
+                .eq(YwFloor::getStatus,Constants.ZERO)
+                .orderByAsc(YwFloor::getSortnum)
+        );
+
+        for (YwFloor data:ywFloorList) {
+            ProjectDataVO projectDataVO = new ProjectDataVO();
+            BeanUtils.copyProperties(data,projectDataVO);
+            projectDataVO.setPId(data.getBuildingId());
+            projectDataVO.setLv(Constants.TWO);
+            projectDataVOList.add(projectDataVO);
+        }
+
+
+
+        List<YwRoom>  ywRoomList = ywRoomMapper.selectList(new QueryWrapper<YwRoom>().lambda()
+                .eq(YwRoom::getIsdeleted,Constants.ZERO)
+                .eq(YwRoom::getStatus,Constants.ZERO)
+                .orderByAsc(YwRoom::getSortnum)
+        );
+
+
+        for (YwRoom data:ywRoomList) {
+            ProjectDataVO projectDataVO = new ProjectDataVO();
+            BeanUtils.copyProperties(data,projectDataVO);
+            projectDataVO.setName(data.getCode());
+            projectDataVO.setPId(data.getFloor());
+            projectDataVO.setLv(Constants.THREE);
+            projectDataVOList.add(projectDataVO);
+        }
+
+        ProjectTree treeBuild = new ProjectTree(projectDataVOList);
+        projectDataVOList = treeBuild.buildTree();
+        return  projectDataVOList;
+
+    }
+
+
+
+
+
 }

--
Gitblit v1.9.3