From d492850f1cc64ddcfaf43798af9c76c2505414fd Mon Sep 17 00:00:00 2001
From: renkang <8417338+k94314517@user.noreply.gitee.com>
Date: 星期五, 24 一月 2025 18:24:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/2.0.1' into 2.0.1

---
 admin/src/views/contract/components/contractEdit.vue                |   97 
 admin/src/views/contract/components/pendingBills.vue                |   45 
 admin/src/api/workorder/ywWorkorder.js                              |    5 
 admin/src/views/finance/components/batchCall.vue                    |   90 
 admin/src/views/stock/check.vue                                     |  115 
 h5/pages/polling/detail.vue                                         |   21 
 admin/src/api/project/ywRoom.js                                     |   10 
 admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue |   52 
 admin/src/views/stock/in.vue                                        |  108 
 h5/pages/inventory/detail.vue                                       |  683 ++++
 admin/src/views/workorder/components/problemReportingDetails.vue    |   89 
 h5/pages/operation/device.vue                                       |   13 
 h5/pages/workOrder/wait.vue                                         |  431 ++
 admin/src/views/stock/components/InEdit.vue                         |  119 
 admin/package-lock.json                                             |  287 +
 h5/pages/index.vue                                                  |   45 
 h5/pages/login.vue                                                  |   82 
 h5/static/side/ic_pandian@2x.png                                    |    0 
 admin/src/views/workorder/components/detail.vue                     |   96 
 admin/src/views/workorder/problemReporting.vue                      |   70 
 admin/src/views/stock/components/newWarehouse.vue                   |   54 
 admin/src/views/operation/components/deviceDetail.vue               |  281 +
 h5/pages/polling/point.vue                                          |   89 
 admin/src/api/system/common.js                                      |    4 
 admin/src/views/stock/components/AssetSel.vue                       |   62 
 admin/src/views/stock/components/CateEdit.vue                       |   20 
 h5/api/staff.js                                                     |    7 
 admin/src/views/operation/components/deviceEdit.vue                 |  356 ++
 admin/src/views/operation/device.vue                                |    2 
 admin/src/views/contract/components/terminationAgreement.vue        |   55 
 h5/manifest.json                                                    |    6 
 h5/pages/inventory/index.vue                                        |  222 +
 admin/src/api/index.js                                              |    1 
 h5/pages.json                                                       |   35 
 admin/src/views/project/components/houseDetails.vue                 |  641 +++-
 admin/src/views/stock/components/config.js                          |   18 
 h5/utils/config.js                                                  |    3 
 admin/src/api/project/ywProject.js                                  |    5 
 admin/src/views/contract/components/terminateLease.vue              |   23 
 admin/src/api/ywMaterial.js                                         |   28 
 admin/src/api/ywProblem.js                                          |   38 
 admin/src/views/stock/components/newMaterial.vue                    |  196 
 admin/src/api/ywTempConfig.js                                       |   15 
 admin/package.json                                                  |    5 
 admin/src/views/stock/components/inventoryDetails.vue               |  112 
 admin/src/views/index.vue                                           |  285 +
 admin/src/views/stock/components/InDetail.vue                       |   58 
 admin/src/components/common/GlobalWindow.vue                        |    9 
 admin/src/views/stock/components/OutEdit.vue                        |  122 
 admin/.env.test                                                     |    4 
 admin/src/api/ywWorkDesk.js                                         |   26 
 h5/pages/workOrder/problemEdit.vue                                  |  313 ++
 admin/src/views/stock/out.vue                                       |  112 
 admin/src/views/stock/assetList.vue                                 |  107 
 h5/static/home/ic_pandian@2x.png                                    |    0 
 admin/src/views/stock/record.vue                                    |  158 
 admin/src/views/stock/asset.vue                                     |   93 
 h5/static/side/btn_jia@3x.png                                       |    0 
 admin/src/views/workorder/components/OperaYwWorkorderWindow.vue     |  137 
 h5/static/side/xiaoxi_ic_tongzhi@2x.png                             |    0 
 admin/src/api/ywContractBill.js                                     |   42 
 admin/src/views/finance/collectionSettings.vue                      |   98 
 h5/static/side/btn_jian_grey@2x.png                                 |    0 
 h5/static/ic_paysuccess@2x.png                                      |    0 
 admin/src/api/ywStock.js                                            |    8 
 admin/src/views/stock/assetCate.vue                                 |   16 
 admin/src/api/ywStocktaking.js                                      |   46 
 admin/src/views/contract/components/contractDetail.vue              |   20 
 admin/src/views/workorder/components/handleProblem.vue              |  338 +
 h5/pages/polling/task.vue                                           |    4 
 h5/api/yw.js                                                        |   55 
 admin/src/views/finance/components/templateKeywords.vue             |   50 
 h5/pages/workOrder/detail.vue                                       |    2 
 admin/src/views/workorder/workorderList.vue                         |   13 
 admin/src/api/ywWarehouse.js                                        |   33 
 admin/src/components/business/commonFunctions.vue                   |  116 
 h5/pages/workOrder/result.vue                                       |   39 
 h5/static/side/btn_jian@3x.png                                      |    0 
 admin/src/views/stock/components/newInventory.vue                   |   70 
 admin/src/views/finance/components/call.vue                         |   96 
 h5/static/side/ic_pandian_grey@2x.png                               |    0 
 admin/src/api/store/index.js                                        |   44 
 admin/src/views/project/housingList.vue                             |    2 
 h5/static/home/ic_daiban@2x.png                                     |    0 
 admin/src/api/Inspection/device.js                                  |   10 
 admin/src/views/roomStatus/index.vue                                | 1286 +++++---
 admin/src/views/finance/overdueBills.vue                            |   35 
 admin/src/views/finance/components/bullDetail.vue                   |   43 
 admin/src/views/stock/query.vue                                     |   87 
 admin/src/views/stock/components/OutDetail.vue                      |   52 
 90 files changed, 6,829 insertions(+), 1,936 deletions(-)

diff --git a/admin/.env.test b/admin/.env.test
index 074e999..da78780 100644
--- a/admin/.env.test
+++ b/admin/.env.test
@@ -4,10 +4,10 @@
 # VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
 
 # 浠诲悍
-# VUE_APP_API_URL  = 'http://192.168.0.137:10010/'
+VUE_APP_API_URL  = 'http://192.168.0.133:10010'
 
 # 钀嶅
 # VUE_APP_API_URL  = 'http://192.168.0.108:10010/'
 
 # 娴嬭瘯鏈嶅姟
-VUE_APP_API_URL  = 'https://dmtest.ahapp.net/gateway_interface'
+# VUE_APP_API_URL  = 'https://dmtest.ahapp.net/gateway_interface'
diff --git a/admin/package-lock.json b/admin/package-lock.json
index 6d328d1..2a619e8 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.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
       "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw=="
     },
     "@babel/code-frame": {
@@ -410,8 +410,7 @@
     "@babel/helper-string-parser": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
-      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
-      "dev": true
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
     },
     "@babel/helper-validator-identifier": {
       "version": "7.14.0",
@@ -2046,8 +2045,7 @@
     "@jridgewell/sourcemap-codec": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
-      "dev": true
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
     },
     "@jridgewell/trace-mapping": {
       "version": "0.3.25",
@@ -2915,6 +2913,63 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "ssri": {
           "version": "8.0.1",
           "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -2922,6 +2977,28 @@
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
           }
         }
       }
@@ -2950,7 +3027,6 @@
       "version": "3.5.13",
       "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
       "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
-      "dev": true,
       "requires": {
         "@babel/parser": "^7.25.3",
         "@vue/shared": "3.5.13",
@@ -2962,14 +3038,12 @@
         "@babel/helper-validator-identifier": {
           "version": "7.25.9",
           "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
-          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
-          "dev": true
+          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
         },
         "@babel/parser": {
           "version": "7.26.2",
           "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
           "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
-          "dev": true,
           "requires": {
             "@babel/types": "^7.26.0"
           }
@@ -2978,7 +3052,6 @@
           "version": "7.26.0",
           "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
           "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
-          "dev": true,
           "requires": {
             "@babel/helper-string-parser": "^7.25.9",
             "@babel/helper-validator-identifier": "^7.25.9"
@@ -2987,8 +3060,7 @@
         "entities": {
           "version": "4.5.0",
           "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
-          "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
-          "dev": true
+          "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
         }
       }
     },
@@ -2996,7 +3068,6 @@
       "version": "3.5.13",
       "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
       "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
-      "dev": true,
       "requires": {
         "@vue/compiler-core": "3.5.13",
         "@vue/shared": "3.5.13"
@@ -3006,7 +3077,6 @@
       "version": "3.5.13",
       "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
       "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
-      "dev": true,
       "requires": {
         "@babel/parser": "^7.25.3",
         "@vue/compiler-core": "3.5.13",
@@ -3022,14 +3092,12 @@
         "@babel/helper-validator-identifier": {
           "version": "7.25.9",
           "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
-          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
-          "dev": true
+          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
         },
         "@babel/parser": {
           "version": "7.26.2",
           "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
           "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
-          "dev": true,
           "requires": {
             "@babel/types": "^7.26.0"
           }
@@ -3038,7 +3106,6 @@
           "version": "7.26.0",
           "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
           "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
-          "dev": true,
           "requires": {
             "@babel/helper-string-parser": "^7.25.9",
             "@babel/helper-validator-identifier": "^7.25.9"
@@ -3048,7 +3115,6 @@
           "version": "8.4.49",
           "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
           "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
-          "dev": true,
           "requires": {
             "nanoid": "^3.3.7",
             "picocolors": "^1.1.1",
@@ -3061,7 +3127,6 @@
       "version": "3.5.13",
       "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
       "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
-      "dev": true,
       "requires": {
         "@vue/compiler-dom": "3.5.13",
         "@vue/shared": "3.5.13"
@@ -3131,11 +3196,47 @@
       "integrity": "sha1-zrkktOyzucQ4ccekKaAvhCPmIas=",
       "dev": true
     },
+    "@vue/reactivity": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+      "requires": {
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "@vue/runtime-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+      "requires": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "@vue/runtime-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+      "requires": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/runtime-core": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "csstype": "^3.1.3"
+      }
+    },
+    "@vue/server-renderer": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+      "requires": {
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
     "@vue/shared": {
       "version": "3.5.13",
       "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
-      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
-      "dev": true
+      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
     },
     "@vue/web-component-wrapper": {
       "version": "1.3.0",
@@ -5801,6 +5902,11 @@
         }
       }
     },
+    "csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
     "currently-unhandled": {
       "version": "0.4.1",
       "resolved": "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz",
@@ -7275,8 +7381,7 @@
     "estree-walker": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "dev": true
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
     "esutils": {
       "version": "2.0.3",
@@ -10369,7 +10474,6 @@
       "version": "0.30.13",
       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz",
       "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==",
-      "dev": true,
       "requires": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
       }
@@ -11786,8 +11890,7 @@
     "picocolors": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
-      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
-      "dev": true
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
     },
     "picomatch": {
       "version": "2.2.3",
@@ -14319,6 +14422,11 @@
         }
       }
     },
+    "sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
     "source-list-map": {
       "version": "2.0.1",
       "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz",
@@ -14334,8 +14442,7 @@
     "source-map-js": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
-      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
-      "dev": true
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
     },
     "source-map-resolve": {
       "version": "0.5.3",
@@ -15657,6 +15764,11 @@
       "resolved": "https://registry.npmjs.org/vue-awesome/-/vue-awesome-4.5.0.tgz",
       "integrity": "sha512-pbtZkRecXLm3fg0eVkwObDRM9YNU1BW5wDsL4mMoSvUXZbTnS+N2E4CahAwKJL5OPbqmhJQgZPekQoJrID7dcQ=="
     },
+    "vue-calendar-component": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmmirror.com/vue-calendar-component/-/vue-calendar-component-2.8.2.tgz",
+      "integrity": "sha512-BJh7xOBzM7QVcapcN4EbPQ1eZ8Pii1/oy+dzqjZTilRSIDD7SRPdFpnUJwZvs8lCrhtBAyJbYFsdm2SogXWHVQ=="
+    },
     "vue-class-component": {
       "version": "7.2.6",
       "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.6.tgz",
@@ -15669,9 +15781,9 @@
       "dev": true
     },
     "vue-clipboard2": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.1.tgz",
-      "integrity": "sha1-blUft704SImyiw2jsSKJ7WvKSJQ=",
+      "version": "0.3.3",
+      "resolved": "https://registry.npmmirror.com/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz",
+      "integrity": "sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw==",
       "requires": {
         "clipboard": "^2.0.0"
       }
@@ -15742,87 +15854,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-property-decorator": {
       "version": "8.5.1",
       "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz",
@@ -15835,6 +15866,28 @@
       "version": "3.5.1",
       "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1620899536020&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
       "integrity": "sha1-7fPPSQeVLR4Fg+B5I3Igxf9utsk="
+    },
+    "vue-simple-calendar": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/vue-simple-calendar/-/vue-simple-calendar-7.1.0.tgz",
+      "integrity": "sha512-WNbvRVGQQJlStaLPvvpe2ZsB/E1n8eFgUh4hD931ljp2czPA8xT81i4jGD5+jKZT1OHDFpON5mNn0KwO2QC9rA==",
+      "requires": {
+        "vue": "^3.4.15"
+      },
+      "dependencies": {
+        "vue": {
+          "version": "3.5.13",
+          "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+          "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+          "requires": {
+            "@vue/compiler-dom": "3.5.13",
+            "@vue/compiler-sfc": "3.5.13",
+            "@vue/runtime-dom": "3.5.13",
+            "@vue/server-renderer": "3.5.13",
+            "@vue/shared": "3.5.13"
+          }
+        }
+      }
     },
     "vue-style-loader": {
       "version": "4.1.3",
@@ -15870,6 +15923,14 @@
       "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=",
       "dev": true
     },
+    "vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "requires": {
+        "sortablejs": "1.10.2"
+      }
+    },
     "vuescroll": {
       "version": "4.17.3",
       "resolved": "https://registry.npm.taobao.org/vuescroll/download/vuescroll-4.17.3.tgz",
diff --git a/admin/package.json b/admin/package.json
index 5405124..8af7393 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -29,10 +29,13 @@
     "path": "^0.12.7",
     "qrcodejs2": "0.0.2",
     "vue": "^2.6.11",
-    "vue-clipboard2": "^0.3.1",
+    "vue-calendar-component": "^2.8.2",
+    "vue-clipboard2": "^0.3.3",
     "vue-cropper": "^0.6.5",
     "vue-json-viewer": "^2.2.22",
     "vue-router": "^3.5.1",
+    "vue-simple-calendar": "^7.1.0",
+    "vuedraggable": "^2.24.3",
     "vuescroll": "^4.17.3",
     "vuex": "^3.4.0"
   },
diff --git a/admin/src/api/Inspection/device.js b/admin/src/api/Inspection/device.js
index ec4923a..d565e90 100644
--- a/admin/src/api/Inspection/device.js
+++ b/admin/src/api/Inspection/device.js
@@ -42,3 +42,13 @@
     }
   })
 }
+
+// 璁惧鐘舵�佺粺璁�
+export function getDeviceStatus (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDevice/getDeviceStatus', data)
+}
+
+// 璁惧鏁伴噺鍒嗙被缁熻
+export function getDeviceCateData (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDevice/getDeviceCateData', data)
+}
diff --git a/admin/src/api/index.js b/admin/src/api/index.js
index dc952c6..05f4504 100644
--- a/admin/src/api/index.js
+++ b/admin/src/api/index.js
@@ -3,3 +3,4 @@
 export * from './business/index'
 export * from './other/other'
 export * from './workbench/index'
+export * from './store/index'
diff --git a/admin/src/api/project/ywProject.js b/admin/src/api/project/ywProject.js
index eb71bfc..56cfae7 100644
--- a/admin/src/api/project/ywProject.js
+++ b/admin/src/api/project/ywProject.js
@@ -45,6 +45,11 @@
   return request.get(`/visitsAdmin/cloudService/business/ywProject/${id}`)
 }
 
+// 鏍规嵁ID鏌ヨ
+export function getProjectById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywProject/${id}`)
+}
+
 // 鎵归噺鍒犻櫎
 export function deleteByIdInBatch (ids) {
   return request.get('/visitsAdmin/cloudService/business/ywProject/delete/batch', {
diff --git a/admin/src/api/project/ywRoom.js b/admin/src/api/project/ywRoom.js
index d46c912..3213682 100644
--- a/admin/src/api/project/ywRoom.js
+++ b/admin/src/api/project/ywRoom.js
@@ -29,6 +29,16 @@
   return request.post('/visitsAdmin/cloudService/business/ywRoom/updateById', data)
 }
 
+// 鏌ヨ鎴块棿鎬佸娍鏁版嵁
+export function getRoomStatusList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywRoom/getRoomStatusList', data)
+}
+
+// 鏌ヨ鎴块棿绉熻祦淇℃伅
+export function getRoomContract (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywRoom/getRoomContract', data)
+}
+
 // 鍒犻櫎
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/ywRoom/delete/${id}`)
diff --git a/admin/src/api/store/index.js b/admin/src/api/store/index.js
new file mode 100644
index 0000000..bcd9b21
--- /dev/null
+++ b/admin/src/api/store/index.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+export function ywOutinboundPage (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywOutinbound/page', data, {
+    trim: true
+  })
+}
+export function ywOutinboundEx (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywOutinbound/exportExcel', data, {
+    trim: true
+  })
+}
+export function ywOutinboundDetail (id) {
+  return request.get('/visitsAdmin/cloudService/business/ywOutinbound/' + id)
+}
+
+export function ywOutinboundCreate (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywOutinbound/create', data, {
+    trim: true
+  })
+}
+
+// 搴撳瓨鏌ヨ
+export function ywStockPage (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywStock/page', data, {
+    trim: true
+  })
+}
+export function ywStockPageEx (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywStock/exportExcel', data, {
+    trim: true
+  })
+}
+
+export function ywOutinboundRecord (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywOutinboundRecord/page', data, {
+    trim: true
+  })
+}
+export function ywOutinboundRecordEx (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywOutinboundRecord/exportExcel', data, {
+    trim: true
+  })
+}
\ No newline at end of file
diff --git a/admin/src/api/system/common.js b/admin/src/api/system/common.js
index 0e99bcf..d0b2af7 100644
--- a/admin/src/api/system/common.js
+++ b/admin/src/api/system/common.js
@@ -71,6 +71,10 @@
 export function upload (data) {
   return request.post('/visitsAdmin/cloudService/public/upload', data)
 }
+// 鎵归噺涓婁紶鏂囦欢鍒癋TP
+export function uploadBatch (data) {
+  return request.post('/visitsAdmin/cloudService/public/uploadBatch', data)
+}
 // 鑾峰彇鐪佸競鍖烘爲
 export function getCityTree (data) {
   return request.post('/visitsAdmin/cloudService/business/areas/treeList', data)
diff --git a/admin/src/api/workorder/ywWorkorder.js b/admin/src/api/workorder/ywWorkorder.js
index fc54054..7513175 100644
--- a/admin/src/api/workorder/ywWorkorder.js
+++ b/admin/src/api/workorder/ywWorkorder.js
@@ -32,6 +32,11 @@
   return request.post('/visitsAdmin/cloudService/business/ywWorkorder/updateById', data)
 }
 
+// 鑾峰彇宸ュ崟鏁伴噺淇℃伅
+export function getDataVO (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywWorkorder/getDataVO', data)
+}
+
 // 鍒犻櫎
 export function deleteById (id) {
   return request.get(`/visitsAdmin/cloudService/business/ywWorkorder/delete/${id}`)
diff --git a/admin/src/api/ywContractBill.js b/admin/src/api/ywContractBill.js
new file mode 100644
index 0000000..024b344
--- /dev/null
+++ b/admin/src/api/ywContractBill.js
@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractBill/findPageForOverdue', data, {
+    trim: true
+  })
+}
+
+// 鑾峰彇鎵归噺鍌即鏁版嵁
+export function getNoticeCustomerData (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractBill/getNoticeCustomerData', data, {
+    trim: true
+  })
+}
+
+// 鍙戦�佸偓缂存暟鎹�
+export function sendNoticeCustomerData (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractBill/sendNoticeCustomerData', data, {
+    trim: true
+  })
+}
+
+// 涓嬭浇鍌垂鏂囦欢
+export function downloadCallFeeDoc (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractBill/downloadCallFeeDoc', data, {
+    download: true,
+    trim: true
+  })
+}
+
+// 鍙戦�佺煭淇′笌閭欢
+export function sendSmsEmail (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractBill/sendSmsEmail', data, {
+    trim: true
+  })
+}
+
+// 鑾峰彇寰呭鐞嗚处鍗�
+export function getWaitDealList (contractId) {
+  return request.get(`/visitsAdmin/cloudService/business/ywContractBill/getWaitDealList?contractId=${contractId}`)
+}
diff --git a/admin/src/api/ywMaterial.js b/admin/src/api/ywMaterial.js
new file mode 100644
index 0000000..e7da119
--- /dev/null
+++ b/admin/src/api/ywMaterial.js
@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywMaterial/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywMaterial/create', data)
+}
+
+// 鏍规嵁ID淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywMaterial/updateById', data)
+}
+
+// 鏍规嵁ID淇敼鐘舵��
+export function updateStatus (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywMaterial/updateStatus', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywMaterial/delete/${id}`)
+}
diff --git a/admin/src/api/ywProblem.js b/admin/src/api/ywProblem.js
new file mode 100644
index 0000000..ad11b9d
--- /dev/null
+++ b/admin/src/api/ywProblem.js
@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywProblem/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywProblem/create', data)
+}
+
+// 鏍规嵁ID淇敼
+export function editProblem (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywProblem/editProblem', data)
+}
+
+// 鏍规嵁ID淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywProblem/updateById', data)
+}
+
+// 鏍规嵁ID鏌ヨ
+export function getById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywProblem/${id}`)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywProblem/delete/${id}`)
+}
+
+// 鏍规嵁宸ュ崟鏌ヨ
+export function getByWorkorderId (workorderId) {
+  return request.get(`/visitsAdmin/cloudService/business/ywProblem/getByWorkorderId?workorderId=${workorderId}`)
+}
diff --git a/admin/src/api/ywStock.js b/admin/src/api/ywStock.js
new file mode 100644
index 0000000..7ef5388
--- /dev/null
+++ b/admin/src/api/ywStock.js
@@ -0,0 +1,8 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywStock/page', data, {
+    trim: true
+  })
+}
diff --git a/admin/src/api/ywStocktaking.js b/admin/src/api/ywStocktaking.js
new file mode 100644
index 0000000..00c5235
--- /dev/null
+++ b/admin/src/api/ywStocktaking.js
@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywStocktaking/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywStocktaking/create', data)
+}
+
+// 鏍规嵁ID淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywStocktaking/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/delete/${id}`)
+}
+
+// 鏍规嵁ID鏌ヨ
+export function getById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/${id}`)
+}
+
+// 鍙栨秷鐩樼偣鍗�
+export function cancelById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/cancelById?id=${id}`)
+}
+
+// 瀹屾垚鐩樼偣鍗�
+export function finishById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/finishById?id=${id}`)
+}
+
+// 鏌ヨ
+export function ywStocktakingRecordPage (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywStocktakingRecord/page', data, {
+    trim: true
+  })
+}
+
diff --git a/admin/src/api/ywTempConfig.js b/admin/src/api/ywTempConfig.js
new file mode 100644
index 0000000..c0947e0
--- /dev/null
+++ b/admin/src/api/ywTempConfig.js
@@ -0,0 +1,15 @@
+import request from '@/utils/request'
+
+// 鑾峰彇鏁版嵁
+export function getCallTemp (data) {
+  return request.get('/visitsAdmin/cloudService/business/ywTempConfig/getCallTemp', data, {
+    trim: true
+  })
+}
+
+// 鏇存柊閰嶇疆妯℃澘淇℃伅
+export function updTempConfig (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywTempConfig/updTempConfig', data, {
+    trim: true
+  })
+}
diff --git a/admin/src/api/ywWarehouse.js b/admin/src/api/ywWarehouse.js
new file mode 100644
index 0000000..a4b3168
--- /dev/null
+++ b/admin/src/api/ywWarehouse.js
@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/create', data)
+}
+
+// 鍒楄〃
+export function list (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/list', data)
+}
+
+// 鏍规嵁ID淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/updateById', data)
+}
+
+// 鏍规嵁ID淇敼鐘舵��
+export function updateStatusById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/updateStatusById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywWarehouse/delete/${id}`)
+}
diff --git a/admin/src/api/ywWorkDesk.js b/admin/src/api/ywWorkDesk.js
new file mode 100644
index 0000000..11b291f
--- /dev/null
+++ b/admin/src/api/ywWorkDesk.js
@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+// 鑾峰彇蹇嵎鑿滃崟妯″潡淇℃伅
+export function getYwQuickList () {
+  return request.get('/visitsAdmin/cloudService/business/ywWorkDesk/getYwQuickList')
+}
+
+// 鏇存柊蹇嵎妯″潡鏁版嵁
+export function updMyYwQuickModel (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywWorkDesk/updMyYwQuickModel', data)
+}
+
+// 鑾峰彇榛樿蹇嵎鑿滃崟妯″潡淇℃伅
+export function getDefaultYwQuickList () {
+  return request.get('/visitsAdmin/cloudService/business/ywWorkDesk/getDefaultYwQuickList')
+}
+
+// 鑾峰彇鏃ョ▼鏁版嵁
+export function getMonthNotices (yearMonth) {
+  return request.get(`/visitsAdmin/cloudService/business/ywWorkDesk/getMonthNotices?yearMonth=${yearMonth}`)
+}
+
+// 鑾峰彇寰呭姙鏁版嵁
+export function workDeskData () {
+  return request.get('/visitsAdmin/cloudService/business/ywWorkDesk/workDeskData')
+}
diff --git a/admin/src/components/business/commonFunctions.vue b/admin/src/components/business/commonFunctions.vue
new file mode 100644
index 0000000..15ce0d7
--- /dev/null
+++ b/admin/src/components/business/commonFunctions.vue
@@ -0,0 +1,116 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        width="60%"
+        :visible.sync="visible"
+        @confirm="confirm"
+    >
+        <div class="Analysis">
+            <span>璇锋牴鎹娇鐢ㄤ範鎯嚜瀹氫箟甯哥敤鍔熻兘锛屾敮鎸佹嫋鍔ㄦ帓</span>
+            <draggable v-model="filterList" chosenClass="chosen" forceFallback="true" group="people" animation="1000">
+                <transition-group class="dra">
+                    <div class="list" v-for="(item, index) in filterList" :key="index">
+                        <div class="list_checkbox">
+                            <el-checkbox v-model="item.checked"> </el-checkbox>
+                        </div>
+                        <img :src="item.icoPath" />
+                        <div class="list_title">{{ item.name }}</div>
+                    </div>
+                </transition-group>
+            </draggable>
+        </div>
+    </GlobalWindow>
+</template>
+
+<script>
+  import BaseOpera from '@/components/base/BaseOpera'
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import { updMyYwQuickModel, getDefaultYwQuickList } from '@/api/ywWorkDesk'
+  import draggable from 'vuedraggable'
+  export default {
+    name: 'commonFunctions',
+    extends: BaseOpera,
+    components: { GlobalWindow, draggable },
+    data () {
+      return {
+        filterList: []
+      }
+    },
+    methods: {
+      open (title) {
+        this.title = title
+        getDefaultYwQuickList({})
+          .then(res => {
+            res.forEach(item => {
+              item.checked = false
+            })
+            this.filterList = res
+            this.visible = true
+          })
+      },
+      confirm () {
+        this.isWorking = true
+        let arr = this.filterList.filter(item => item.checked)
+        updMyYwQuickModel(arr.map(item => item.id))
+          .then(() => {
+            this.visible = false
+            this.$tip.apiSuccess('淇敼鎴愬姛')
+            this.$emit('success')
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+    .Analysis {
+        width: 100%;
+        margin-top: 20px;
+        display: flex;
+        flex-direction: column;
+        span {
+            font-weight: 400;
+            font-size: 14px;
+            color: #333333;
+            margin-bottom: 20px;
+        }
+        .dra {
+            display: flex;
+            flex-wrap: wrap;
+            justify-content: space-between;
+        }
+        .list {
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            width: 24%;
+            height: 80px;
+            background: #FFFFFF;
+            border-radius: 8px;
+            border: 1px solid #DFE2E8;
+            margin-bottom: 10px;
+            padding: 0 20px;
+            box-sizing: border-box;
+            position: relative;
+            .list_checkbox {
+                position: absolute;
+                right: 10px;
+                top: 10px;
+            }
+            img {
+                width: 40px;
+                height: 40px;
+                user-select: none;
+                margin-right: 10px;
+            }
+            .list_title {
+                width: 130px;
+                font-size: 11px;
+                user-select: none;
+            }
+        }
+    }
+</style>
diff --git a/admin/src/components/common/GlobalWindow.vue b/admin/src/components/common/GlobalWindow.vue
index b734be2..504f62f 100644
--- a/admin/src/components/common/GlobalWindow.vue
+++ b/admin/src/components/common/GlobalWindow.vue
@@ -22,6 +22,7 @@
       <slot name="footer">
         <el-button v-if="showConfirm" @click="confirm" :loading="confirmWorking" type="primary">{{text}}</el-button>
         <slot name="btns" />
+        <el-button type="primary" v-if="isDownload" @click="downloadFile">涓嬭浇鍌即閫氱煡鍗�</el-button>
         <el-button @click="close">{{ backText }}</el-button>
       </slot>
     </div>
@@ -68,6 +69,11 @@
     visible: {
       type: Boolean,
       required: true
+    },
+    // 鏄惁鏄剧ず涓嬭浇鎸夐挳
+    isDownload: {
+      type: Boolean,
+      required: false
     }
   },
   methods: {
@@ -77,6 +83,9 @@
     close () {
       this.$emit('close')
       this.$emit('update:visible', false)
+    },
+    downloadFile() {
+      this.$emit('downloadFile')
     }
   }
 }
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
index 0e58415..343b02b 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
@@ -14,7 +14,7 @@
         </el-select>
       </el-form-item>
       <el-form-item label="宸℃璐熻矗浜�" prop="userIds">
-        <el-select v-model="form.userIds" filterable clearable>
+        <el-select v-model="form.userIds" multiple filterable clearable>
           <el-option v-for="item in staffList" :value="item.id" :label="item.realname"></el-option>
         </el-select>
       </el-form-item>
@@ -76,7 +76,7 @@
         status: '',
         sortnum: '',
         lineId: '',
-        userIds: '',
+        userIds: [],
         dealUserId: '',
         dealDate: '',
         dealInfo: '',
@@ -118,6 +118,52 @@
     })
   },
   methods: {
+    __confirmCreate () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        let obj = JSON.parse(JSON.stringify(this.form))
+        obj.userIds = obj.userIds.join(',')
+        // 璋冪敤鏂板缓鎺ュ彛
+        this.isWorking = true
+        this.api.create(obj)
+          .then(() => {
+            this.visible = false
+            this.$tip.apiSuccess('鏂板缓鎴愬姛')
+            this.$emit('success')
+          })
+          .catch(e => {
+            // this.$tip.apiFailed(e)
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      })
+    },
+    __confirmEdit () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        let obj = JSON.parse(JSON.stringify(this.form))
+        obj.userIds = obj.userIds.join(',')
+        // 璋冪敤鏂板缓鎺ュ彛
+        this.isWorking = true
+        this.api.updateById(obj)
+          .then(() => {
+            this.visible = false
+            this.$tip.apiSuccess('淇敼鎴愬姛')
+            this.$emit('success')
+          })
+          .catch(e => {
+            // this.$tip.apiFailed(e)
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      })
+    },
     weekClick(i) {
       this.weeks.forEach((item, index) => {
         if (i == index) { item.sel = !item.sel }
@@ -239,4 +285,4 @@
     border: 1px solid $primary-color;
   }
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/admin/src/views/contract/components/contractDetail.vue b/admin/src/views/contract/components/contractDetail.vue
index 64cb0d9..5683288 100644
--- a/admin/src/views/contract/components/contractDetail.vue
+++ b/admin/src/views/contract/components/contractDetail.vue
@@ -17,8 +17,8 @@
           <el-tag type="info" v-if="info.status === 4">宸查��绉�</el-tag>
         </div>
         <div>
-          <el-button type="primary" @click="$refs.pendingBills.open('寰呭鐞嗚处鍗�')">鏌ョ湅寰呭鐞嗚处鍗�</el-button>
-          <el-button @click="$refs.terminationAgreement.open('閫�绉熷崗璁�')">鏌ョ湅閫�绉熷崗璁�</el-button>
+          <el-button type="primary" @click="$refs.pendingBills.open('寰呭鐞嗚处鍗�', id)" v-if="info.status === 3">鏌ョ湅寰呭鐞嗚处鍗�</el-button>
+          <el-button @click="$refs.terminationAgreement.open('閫�绉熷崗璁�', id)" v-if="[3,4].includes(info.status)">鏌ョ湅閫�绉熷崗璁�</el-button>
           <el-button plain type="danger" v-if="[0, 1, 2].includes(info.status)" @click="refund">閫�绉�</el-button>
         </div>
       </div>
@@ -197,6 +197,13 @@
         v-loading="loading"
         style="width: 100%">
         <el-table-column
+          width="150"
+          label="璐﹀崟缂栧彿">
+          <template slot-scope="{row}">
+            <el-button type="text" @click="openBill(row.id)">{{row.code}}</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column
           label="璐圭敤绫诲瀷">
           <template slot-scope="{row}">
             <span v-if="row.costType === 0">绉熻祦璐�</span>
@@ -327,6 +334,8 @@
     <PendingBills ref="pendingBills" />
     <!--  閫�绉熷崗璁�  -->
     <TerminationAgreement ref="terminationAgreement" />
+    <!--  璐﹀崟璇︽儏  -->
+    <BullDetail ref="bullDetail" />
   </GlobalWindow>
 </template>
 
@@ -336,6 +345,7 @@
 import TerminateLease from './terminateLease'
 import PendingBills from './pendingBills'
 import TerminationAgreement from './terminationAgreement'
+import BullDetail from '../../finance/components/bullDetail'
 import { getById } from '@/api/contract'
 import { fetchList } from '@/api/bill'
 export default {
@@ -343,7 +353,8 @@
     GlobalWindow,
     TerminateLease,
     PendingBills,
-    TerminationAgreement
+    TerminationAgreement,
+    BullDetail
   },
   extends: BaseOpera,
   data() {
@@ -375,6 +386,9 @@
     xiazai (url) {
       window.open(url)
     },
+    openBill(id) {
+      this.$refs.bullDetail.open('璐﹀崟璇︽儏', id)
+    },
     returnUnit (type) {
       switch (type) {
         case 0:
diff --git a/admin/src/views/contract/components/contractEdit.vue b/admin/src/views/contract/components/contractEdit.vue
index 84a9fe8..6867919 100644
--- a/admin/src/views/contract/components/contractEdit.vue
+++ b/admin/src/views/contract/components/contractEdit.vue
@@ -178,8 +178,15 @@
           </div>
         </div>
         <el-button style="width: 100%;height: 48px;" type="primary" plain @click="generateZL">鐢熸垚璐﹀崟鏄庣粏</el-button>
+        <div style="width: 100%; text-align: right; margin-bottom: 10px; margin-top: 15px;" v-if="zlList.length > 0">
+          <el-button icon="el-icon-edit" v-if="!isShow" @click="changeEdit(1)">缂栬緫</el-button>
+          <el-popconfirm v-if="isShow" title="鏄惁鏀惧純鎵嬪姩淇敼鎵�濉殑鏁版嵁锛�" @confirm="isShow = false">
+            <el-button slot="reference" style="margin-right: 15px;">鍙栨秷</el-button>
+          </el-popconfirm>
+          <el-button type="primary" v-if="isShow" @click="changeNum(1)">淇濆瓨</el-button>
+        </div>
         <el-table :data="zlList" class="mt20" stripe>
-          <el-table-column label="璐圭敤绫诲瀷" align="center" show-overflow-tooltip>
+          <el-table-column label="璐圭敤绫诲瀷" align="center" :key="Date.now()" show-overflow-tooltip>
             <template slot-scope="{row}">
               <span v-if="row.costType === 0">绉熻祦璐�</span>
               <span v-if="row.costType === 1">鐗╀笟璐�</span>
@@ -191,20 +198,26 @@
               <span v-if="row.costType === 7">淇濊瘉閲�</span>
             </template>
           </el-table-column>
-          <el-table-column label="鏈熸暟" align="center" show-overflow-tooltip>
+          <el-table-column label="鏈熸暟" align="center" :key="Date.now()" show-overflow-tooltip>
             <template slot-scope="{row}">
               <el-tag type="success" v-if="row.sortnum > 0">{{ row.sortnum }}</el-tag>
             </template>
           </el-table-column>
-          <el-table-column label="鍖洪棿" align="center" show-overflow-tooltip>
+          <el-table-column label="鍖洪棿" align="center" :key="Date.now()" show-overflow-tooltip>
             <template slot-scope="{row}">
               {{ row.startDate }} ~ {{ row.endDate }}
             </template>
           </el-table-column>
-          <el-table-column prop="planPayDate" label="浠樻鏃�" align="center" show-overflow-tooltip />
-          <el-table-column label="搴旀敹" align="center" show-overflow-tooltip>
+          <el-table-column prop="planPayDate" label="浠樻鏃�" align="center" :key="Date.now()" show-overflow-tooltip />
+          <el-table-column label="搴旀敹" align="center" :key="Date.now()" show-overflow-tooltip>
             <template slot-scope="{row}">
-              {{ row.receivableFee }}鍏�
+              <span v-if="[2,3].includes(row.costType)">{{ row.totleFee }}鍏�</span>
+              <template v-else>
+                <span v-if="!isShow">{{ row.totleFee }}鍏�</span>
+                <div style="display: flex; align-items: center;" v-if="isShow">
+                  <el-input v-model="row.totleFeeCopy" placeholder="璇疯緭鍏�"></el-input>鍏�
+                </div>
+              </template>
             </template>
           </el-table-column>
         </el-table>
@@ -273,8 +286,15 @@
           </div>
         </div>
         <el-button style="width: 100%;height: 48px;" type="primary" plain @click="generateWY">鐢熸垚璐﹀崟鏄庣粏</el-button>
+        <div style="width: 100%; text-align: right; margin-bottom: 10px; margin-top: 15px;">
+          <el-button icon="el-icon-edit" v-if="!isShow" @click="changeEdit(1)">缂栬緫</el-button>
+          <el-popconfirm v-if="isShow" title="鏄惁鏀惧純鎵嬪姩淇敼鎵�濉殑鏁版嵁锛�" @confirm="isShow = false">
+            <el-button slot="reference" style="margin-right: 15px;">鍙栨秷</el-button>
+          </el-popconfirm>
+          <el-button type="primary" v-if="isShow" @click="changeNum(2)">淇濆瓨</el-button>
+        </div>
         <el-table :data="wyList" class="mt20" stripe>
-          <el-table-column label="璐圭敤绫诲瀷" align="center" show-overflow-tooltip>
+          <el-table-column label="璐圭敤绫诲瀷" align="center" :key="Date.now()" show-overflow-tooltip>
             <template slot-scope="{row}">
               <span v-if="row.costType === 0">绉熻祦璐�</span>
               <span v-if="row.costType === 1">鐗╀笟璐�</span>
@@ -286,20 +306,26 @@
               <span v-if="row.costType === 7">淇濊瘉閲�</span>
             </template>
           </el-table-column>
-          <el-table-column label="鏈熸暟" align="center" show-overflow-tooltip>
+          <el-table-column label="鏈熸暟" align="center" :key="Date.now()" show-overflow-tooltip>
             <template slot-scope="{row}">
               <el-tag type="success" v-if="row.sortnum > 0">{{ row.sortnum }}</el-tag>
             </template>
           </el-table-column>
-          <el-table-column label="鍖洪棿" align="center" show-overflow-tooltip>
+          <el-table-column label="鍖洪棿" align="center" :key="Date.now()" show-overflow-tooltip>
             <template slot-scope="{row}">
               {{ row.startDate }} ~ {{ row.endDate }}
             </template>
           </el-table-column>
-          <el-table-column prop="planPayDate" label="浠樻鏃�" align="center" show-overflow-tooltip />
-          <el-table-column prop="receivableFee" label="搴旀敹" align="center" show-overflow-tooltip>
+          <el-table-column prop="planPayDate" label="浠樻鏃�" :key="Date.now()" align="center" show-overflow-tooltip />
+          <el-table-column label="搴旀敹" :key="Date.now()" align="center" show-overflow-tooltip>
             <template slot-scope="{row}">
-              {{ row.receivableFee }}鍏�
+              <span v-if="[2,3].includes(row.costType)">{{ row.totleFee }}鍏�</span>
+              <template v-else>
+                <span v-if="!isShow">{{ row.totleFee }}鍏�</span>
+                <div style="display: flex; align-items: center;" v-if="isShow">
+                  <el-input v-model="row.totleFeeCopy" placeholder="璇疯緭鍏�"></el-input>鍏�
+                </div>
+              </template>
             </template>
           </el-table-column>
         </el-table>
@@ -309,6 +335,7 @@
         </div>
       </div>
     </div>
+    <div style="width: 100%; height: 50px;"></div>
     <div class="window__footer">
       <slot name="footer">
         <el-button @click="confirm" :loading="confirmWorking" type="primary">{{ activeTabs === 0 ? '涓嬩竴姝�' :
@@ -378,7 +405,6 @@
             advanceDays: ''
           }
         ],
-
 
         wyDeposit: '',
         wyPayType: '',
@@ -450,7 +476,8 @@
       ],
 
 
-      houseLvThree: []
+      houseLvThree: [],
+      isShow: false
     }
   },
   methods: {
@@ -502,6 +529,39 @@
         this.form.roundedUp = 0
         // this.getHouseTree()
       })
+    },
+    changeEdit(type) {
+      if (type === 1) {
+        this.zlList.forEach(item => {
+          item.totleFeeCopy = JSON.parse(JSON.stringify(item.totleFee))
+        })
+        this.isShow = true
+      } else if (type === 2) {
+        this.isShow = false
+      }
+    },
+    changeNum(type) {
+      // 绉熻祦璁$畻
+      if (type === 1) {
+        let num = 0
+        this.zlList.forEach(item => {
+          if (item.costType !== 2) {
+            num += Number(item.totleFeeCopy)
+            item.totleFee = JSON.parse(JSON.stringify(item.totleFeeCopy))
+          }
+        })
+        this.zlPrice = num
+      } else if (type === 2) {
+        let num = 0
+        this.wyList.forEach(item => {
+          if (item.costType !== 3) {
+            num += Number(item.totleFeeCopy)
+            item.totleFee = JSON.parse(JSON.stringify(item.totleFeeCopy))
+          }
+        })
+        this.wyPrice = num
+      }
+      this.isShow = false
     },
     changePayType(e) {
       if (e === 0) {
@@ -653,7 +713,7 @@
     submit() {
       // 璋冪敤鏂板缓鎺ュ彛
       this.isWorking = true
-      create({ ...this.form })
+      create({ ...this.form, ywContractBillDTOList: [...this.wyList, ...this.zlList] })
         .then(res => {
           this.visible = false
           this.$tip.apiSuccess('鍒涘缓鎴愬姛')
@@ -711,8 +771,9 @@
           let zlPrice = 0
           let arr = []
           res.forEach(item => {
+            item.totleFeeCopy = JSON.parse(JSON.stringify(item.totleFee))
             if (item.costType === 0) {
-              zlPrice += item.receivableFee
+              zlPrice += item.totleFee
             }
             arr.push(item)
           })
@@ -728,7 +789,8 @@
           let arr = []
           res.forEach(item => {
             if (item.costType === 1) {
-              zlPrice += item.receivableFee
+              zlPrice += item.totleFee
+              item.totleFeeCopy = JSON.parse(JSON.stringify(item.totleFee))
             }
             arr.push(item)
           })
@@ -817,6 +879,7 @@
       this.activeTabs = val
     },
     ctabsClick(val) {
+      this.isShow = false
       this.cactiveTabs = val
     },
     handleRent() {
diff --git a/admin/src/views/contract/components/pendingBills.vue b/admin/src/views/contract/components/pendingBills.vue
index 1ecd98f..b694d96 100644
--- a/admin/src/views/contract/components/pendingBills.vue
+++ b/admin/src/views/contract/components/pendingBills.vue
@@ -10,19 +10,19 @@
             <div class="zd_list">
                 <div class="zd_list_row">
                     <span>寰呮敹娆捐处鍗曟暟</span>
-                    <span>2</span>
+                    <span>{{info.inAmount || 0}}</span>
                 </div>
                 <div class="zd_list_row">
                     <span>寰呮敹娆鹃噾棰�</span>
-                    <span>锟�247.00</span>
+                    <span>锟{info.inFee || 0}}</span>
                 </div>
                 <div class="zd_list_row">
                     <span>寰呬粯娆捐处鍗曟暟</span>
-                    <span>3</span>
+                    <span>{{info.payAmount || 0}}</span>
                 </div>
                 <div class="zd_list_row">
                     <span>寰呬粯娆鹃噾棰�</span>
-                    <span>锟�247.00</span>
+                    <span>锟{info.payFee || 0}}</span>
                 </div>
             </div>
             <div class="zd_content">
@@ -30,7 +30,7 @@
                     <span>璐﹀崟</span>
                 </div>
                 <el-table
-                    :data="tableData"
+                    :data="info.ywContractBillList"
                     border
                     style="width: 100%">
                     <el-table-column
@@ -38,27 +38,38 @@
                         label="璐﹀崟缂栧彿">
                     </el-table-column>
                     <el-table-column
-                        prop="name"
                         label="璐圭敤绫诲瀷">
+                        <template slot-scope="{row}">
+                            <span v-if="row.costType === 0">绉熻祦璐�</span>
+                            <span v-if="row.costType === 1">鐗╀笟璐�</span>
+                            <span v-if="row.costType === 2">绉熻祦鎶奸噾</span>
+                            <span v-if="row.costType === 3">鐗╀笟鎶奸噾</span>
+                            <span v-if="row.costType === 4">姘寸數璐�</span>
+                            <span v-if="row.costType === 5">鏉傞」璐�</span>
+                            <span v-if="row.costType === 6">鍏朵粬</span>
+                            <span v-if="row.costType === 7">淇濊瘉閲�</span>
+                        </template>
                     </el-table-column>
                     <el-table-column
-                        prop="address"
                         label="璁¤垂鍛ㄦ湡">
+                        <template slot-scope="{row}">
+                            {{row.startDate}}~{{row.endDate}}
+                        </template>
                     </el-table-column>
                     <el-table-column
-                        prop="address"
+                        prop="receivableFee"
                         label="搴旀敹浠橀噾棰�/鍘熷搴旀敹浠�">
                     </el-table-column>
                     <el-table-column
-                        prop="address"
+                        prop="actReceivableFee"
                         label="瀹炴敹/浠橀噾棰�">
                     </el-table-column>
                     <el-table-column
-                        prop="address"
+                        prop="needReceivableFee"
                         label="闇�鏀�/浠橀噾棰�">
                     </el-table-column>
                     <el-table-column
-                        prop="address"
+                        prop="receivableFee"
                         label="搴旀敹/浠樻棩鏈�">
                     </el-table-column>
                 </el-table>
@@ -70,6 +81,7 @@
 <script>
   import GlobalWindow from '@/components/common/GlobalWindow'
   import BaseOpera from '@/components/base/BaseOpera'
+  import { getWaitDealList } from '@/api/ywContractBill'
   export default {
     name: 'pendingBills',
     components: {
@@ -78,11 +90,18 @@
     extends: BaseOpera,
     data () {
       return {
-        tableData: []
+        info: []
       }
     },
     methods: {
-    
+      open (title, contractId) {
+        this.title = title
+        getWaitDealList(contractId)
+            .then(res => {
+              this.info = res
+              this.visible = true
+            })
+      }
     }
   }
 </script>
diff --git a/admin/src/views/contract/components/terminateLease.vue b/admin/src/views/contract/components/terminateLease.vue
index 3748d6f..0f0fd5d 100644
--- a/admin/src/views/contract/components/terminateLease.vue
+++ b/admin/src/views/contract/components/terminateLease.vue
@@ -86,12 +86,19 @@
                 <el-table-column
                     width="100"
                     label="璐圭敤绫诲瀷">
-                    <template slot-scope="{row}">
-                        <span v-if="row.costType === 0">绉熻祦璐�</span>
-                        <span v-if="row.costType === 1">鐗╀笟璐�</span>
-                        <span v-if="row.costType === 4">姘寸數璐�</span>
-                        <span v-if="row.costType === 5">鏉傞」璐�</span>
-                        <span v-if="row.costType === 6">鍏朵粬</span>
+                    <template slot-scope="scope">
+                        <div style="display: flex; align-items: center;">
+                            <span v-if="scope.row.costType === 0">绉熻祦璐�</span>
+                            <span v-if="scope.row.costType === 1">鐗╀笟璐�</span>
+                            <span v-if="scope.row.costType === 4">姘寸數璐�</span>
+                            <span v-if="scope.row.costType === 5">鏉傞」璐�</span>
+                            <span v-if="scope.row.costType === 6">鍏朵粬</span>
+                            <i class="el-icon-delete"
+                               style="color: red; margin-left: 10px; font-size: 18px; cursor: pointer;"
+                               @click="deleRow(scope.$index)"
+                               v-if="scope.row.date && scope.row.date.length !==0">
+                            </i>
+                        </div>
                     </template>
                 </el-table-column>
                 <el-table-column
@@ -270,6 +277,10 @@
         this.changeBtDate(this.form.btDate)
         this.visible = true
       },
+      deleRow(index) {
+        this.info.terminateList.splice(index, 1)
+        this.countData()
+      },
       getDayTime () {
         const today = new Date();
         const year = today.getFullYear();
diff --git a/admin/src/views/contract/components/terminationAgreement.vue b/admin/src/views/contract/components/terminationAgreement.vue
index 9b02d5c..835fe12 100644
--- a/admin/src/views/contract/components/terminationAgreement.vue
+++ b/admin/src/views/contract/components/terminationAgreement.vue
@@ -8,40 +8,47 @@
         @confirm="confirm">
         <div class="main">
             <div class="main_head">
-                <span>绉熷锛氫箳涔撶悆淇变箰閮�</span>
-                <span>鍚堝悓缂栧彿锛� 2024-04-001-202405-0019</span>
+                <span>绉熷锛歿{info.renterName}}</span>
+                <span>鍚堝悓缂栧彿锛� {{info.code}}</span>
+            </div>
+            <div class="title">鎴挎簮淇℃伅</div>
+            <div class="list">
+                <el-table :data="info.roomList" stripe>
+                    <el-table-column prop="projectName" label="椤圭洰鍚嶇О" show-overflow-tooltip />
+                    <el-table-column prop="buildingName" label="妤煎畤鍚嶇О" show-overflow-tooltip />
+                    <el-table-column label="妤煎眰/鎴垮彿" show-overflow-tooltip>
+                        <template slot-scope="{row}">
+                            {{row.floorName}}{{row.roomNum}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="area" label="闈㈢Н" show-overflow-tooltip></el-table-column>
+                </el-table>
             </div>
             <div class="title">閫�绉熶俊鎭�</div>
             <div class="list">
                 <div class="item">
                     <div class="la">閫�绉熺被鍨�</div>
-                    <div class="val">{{ info.code }}</div>
+                    <div class="val" v-if="info.btType === 0">鍒版湡閫�绉�</div>
+                    <div class="val" v-if="info.btType === 1">鎹㈡埧閫�绉�</div>
+                    <div class="val" v-if="info.btType === 2">杩濈害閫�绉�</div>
+                    <div class="val" v-if="info.btType === 3">鍗忓晢閫�绉�</div>
                 </div>
                 <div class="item">
                     <div class="la">閫�绉熸棩鏈�</div>
-                    <div class="val">{{ info.userName }}</div>
+                    <div class="val">{{ info.btDate }}</div>
                 </div>
                 <div class="item">
                     <div class="la">缁忓姙浜�</div>
-                    <div class="val">{{ info.creatorName }}</div>
+                    <div class="val">{{ info.userName }}</div>
                 </div>
                 <div class="item">
                     <div class="la">鍗忚绛捐鏃ユ湡</div>
-                    <div class="val">{{ info.totalArea }}銕�</div>
+                    <div class="val">{{ info.signDate }}銕�</div>
                 </div>
                 <div class="item">
                     <div class="la">閫�绉熷師鍥�</div>
-                    <div class="val">{{ info.companyName }}</div>
+                    <div class="val">{{ info.btInfo }}</div>
                 </div>
-            </div>
-            <div class="title">鎴挎簮淇℃伅</div>
-            <div class="list">
-                <el-table :data="roomList" stripe>
-                    <el-table-column prop="projectName" label="椤圭洰鍚嶇О" show-overflow-tooltip />
-                    <el-table-column prop="buildingName" label="妤煎畤鍚嶇О" show-overflow-tooltip />
-                    <el-table-column prop="buildingName" label="妤煎眰/鎴垮彿" show-overflow-tooltip></el-table-column>
-                    <el-table-column prop="area" label="闈㈢Н" show-overflow-tooltip></el-table-column>
-                </el-table>
             </div>
         </div>
     </GlobalWindow>
@@ -50,6 +57,7 @@
 <script>
   import GlobalWindow from '@/components/common/GlobalWindow'
   import BaseOpera from '@/components/base/BaseOpera'
+  import { getById } from '@/api/contract'
   export default {
     name: "terminationAgreement",
     components: {
@@ -58,12 +66,23 @@
     extends: BaseOpera,
     data() {
       return {
-        roomList: [],
+        id: null,
         info: {}
       }
     },
     methods: {
-    
+      open (title, id) {
+        this.title = title
+        this.id = id
+        this.getData()
+      },
+      getData () {
+        getById(this.id)
+          .then(res => {
+            this.info = res
+            this.visible = true
+          })
+      },
     }
   }
 </script>
diff --git a/admin/src/views/finance/collectionSettings.vue b/admin/src/views/finance/collectionSettings.vue
index 6e428e0..9a1ec04 100644
--- a/admin/src/views/finance/collectionSettings.vue
+++ b/admin/src/views/finance/collectionSettings.vue
@@ -5,15 +5,46 @@
                 <el-form ref="form" :model="form" label-width="120px">
                     <el-form-item label="鐭俊妯℃澘">
                         <div style="display: flex; align-items: self-start;">
-                            <el-input type="textarea" rows="5" v-model="form.desc"></el-input>
-                            <el-button type="primary" style="margin-left: 10px;">淇濆瓨</el-button>
+                            <el-input type="textarea" rows="5" v-model="form.smsTemp.title"></el-input>
+<!--                            <el-button type="primary" style="margin-left: 10px;">淇濆瓨</el-button>-->
                         </div>
                     </el-form-item>
                     <el-form-item label="閭妯℃澘">
                         <div style="display: flex; align-items: self-start;">
-                            <el-input type="textarea" rows="5" v-model="form.desc"></el-input>
-                            <el-button type="primary" style="margin-left: 10px;">淇濆瓨</el-button>
+                            <el-input type="textarea" rows="5" v-model="form.emailTemp.title"></el-input>
+<!--                            <el-button type="primary" style="margin-left: 10px;">淇濆瓨</el-button>-->
                         </div>
+                    </el-form-item>
+                    <el-form-item label="绉熻祦閫氱煡鍗曟ā鏉�">
+                        <div style="display: flex; align-items: self-start;">
+                            <el-tooltip style="margin-right: 10px; margin-top: 10px; flex-shrink: 0;" effect="dark" content="鍖呭惈绉熻祦璐广�佺墿涓氳垂銆佺璧佹娂閲戙�佺墿涓氭娂閲�" placement="bottom-start">
+                                <i class="el-icon-question"></i>
+                            </el-tooltip>
+                            <el-upload
+                                style="flex: 1;"
+                                class="upload-demo"
+                                :action="uploadImgUrl"
+                                :data="uploadData"
+                                :on-success="uploadAvatarSuccess"
+                                :on-remove="handleRemove"
+                                :file-list="form.leaseTemp">
+                                <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+                            </el-upload>
+                        </div>
+                    </el-form-item>
+                    <el-form-item label="鍏朵粬閫氱煡鍗曟ā鏉�">
+                        <el-upload
+                            class="upload-demo"
+                            :action="uploadImgUrl"
+                            :data="uploadData"
+                            :on-success="uploadAvatarSuccess1"
+                            :on-remove="handleRemove1"
+                            :file-list="form.otherTemp">
+                            <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+                        </el-upload>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" @click="submit" :disabled="loading" :loading="loading">淇濆瓨</el-button>
                     </el-form-item>
                 </el-form>
             </div>
@@ -25,16 +56,67 @@
 
 <script>
     import templateKeywords from './components/templateKeywords'
+    import { getCallTemp, updTempConfig } from '@/api/ywTempConfig'
   export default {
     name: 'collectionSettings',
     data() {
       return {
+        uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
+        uploadData: {
+          folder: 'TEMP_CONFIG'
+        },
         form: {
-          desc: ''
-        }
+          emailTemp: {},
+          smsTemp: {},
+          leaseTemp: [],
+          otherTemp: []
+        },
+        loading: false
       }
     },
-    components: { templateKeywords }
+    components: { templateKeywords },
+    created () {
+      this.getCallTempVal()
+    },
+    methods: {
+      submit() {
+        this.loading = true
+        updTempConfig({
+          emailTemp: this.form.emailTemp,
+          smsTemp: this.form.smsTemp,
+          leaseTemp: this.form.leaseTemp[0],
+          otherTemp: this.form.otherTemp[0]
+        }).then(res => {
+          this.$message.success('鏇存柊鎴愬姛锛�')
+          this.getCallTempVal()
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      handleRemove(e) {
+        this.form.leaseTemp = []
+      },
+      uploadAvatarSuccess(file) {
+        const item = file.data[0]
+        this.form.leaseTemp = [{ ...item, name: item.originname }]
+      },
+      handleRemove1(e) {
+        this.form.otherTemp = []
+      },
+      uploadAvatarSuccess1(file) {
+        const item = file.data[0]
+        this.form.otherTemp = [{ ...item, name: item.originname }]
+      },
+      getCallTempVal() {
+        getCallTemp({})
+            .then(res => {
+              this.form.smsTemp = res.smsTemp
+              this.form.emailTemp = res.emailTemp
+              this.form.leaseTemp = [{ url: res.leaseTemp.url, name: res.leaseTemp.title }]
+              this.form.otherTemp = [{ url: res.otherTemp.url, name: res.otherTemp.title }]
+            })
+      }
+    }
   }
 </script>
 
@@ -52,7 +134,7 @@
             align-items: self-start;
             justify-content: space-between;
             .content_form {
-                width: 60%;
+                width: 70%;
             }
         }
     }
diff --git a/admin/src/views/finance/components/batchCall.vue b/admin/src/views/finance/components/batchCall.vue
new file mode 100644
index 0000000..adeab27
--- /dev/null
+++ b/admin/src/views/finance/components/batchCall.vue
@@ -0,0 +1,90 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :isDownload="true"
+        width="100%"
+        @downloadFile="downloadFile"
+        @confirm="confirm">
+        <el-form :model="form" label-position="top" ref="paramRef">
+            <el-form-item label="閫氱煡鏂瑰紡">
+                <el-checkbox-group v-model="form.type">
+                    <el-checkbox label="鐭俊"></el-checkbox>
+                    <el-checkbox label="閭欢"></el-checkbox>
+                </el-checkbox-group>
+            </el-form-item>
+            <el-form-item label="閫氱煡鎺ユ敹浜�">
+                <div style="display: flex; align-items: center; margin-bottom: 10px;" v-for="(item, index) in userList" :key="index">
+                    <span style="margin-right: 15px; font-size: 15px; color: #222222;">{{item.customerName}}</span>
+                    <el-select v-model="item.userId" placeholder="璇烽�夋嫨">
+                        <el-option
+                            v-for="(item, index) in item.memberList"
+                            :key="index"
+                            :label="item.name"
+                            :value="item.id" />
+                    </el-select>
+                </div>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import BaseOpera from '@/components/base/BaseOpera'
+  import { getNoticeCustomerData, downloadCallFeeDoc, sendSmsEmail } from '@/api/ywContractBill'
+  export default {
+    name: "batchCall",
+    components: { GlobalWindow },
+    extends: BaseOpera,
+    data() {
+      return {
+        ids: null,
+        form: {
+          type: []
+        },
+        userList: []
+      }
+    },
+    methods: {
+      open (title, ids) {
+        this.title = title
+        this.ids = ids
+        this.form.type = []
+        this.userList = []
+        this.visible = true
+        this.getUser()
+      },
+      downloadFile() {
+        downloadCallFeeDoc(this.ids)
+          .then(response => {
+            this.download(response)
+          })
+          .catch(e => {
+            this.$tip.apiFailed(e)
+          })
+      },
+      getUser() {
+        getNoticeCustomerData(this.ids)
+          .then(res => {
+            this.userList = res
+          })
+      },
+      confirm() {
+        if (this.form.type.length === 0) return this.$message.warning('閫氱煡鏂瑰紡涓嶈兘涓虹┖')
+          let arr = this.userList.map(item => {
+            return {
+              billId: item.billId,
+              sendEmail: this.form.type.includes('閭欢') ? 1 : 0,
+              sendSms: this.form.type.includes('鐭俊') ? 1 : 0,
+              userId: item.userId
+            }
+          })
+          sendSmsEmail(arr).then(res => {
+            this.$message.success('鍙戦�佹垚鍔燂紒')
+            this.visible = false
+          })
+      }
+    }
+  }
+</script>
diff --git a/admin/src/views/finance/components/bullDetail.vue b/admin/src/views/finance/components/bullDetail.vue
index ac60691..976f0a0 100644
--- a/admin/src/views/finance/components/bullDetail.vue
+++ b/admin/src/views/finance/components/bullDetail.vue
@@ -8,23 +8,26 @@
           <el-tag type="success" v-if="info.status === 0">寮�鍚�</el-tag>
           <el-tag type="info" v-if="info.status === 1">鍏抽棴</el-tag>
         </div>
-        <el-button plain type="primary" v-if="![1].includes(info.payStatus)" @click="$refs.flowingWater.open('鍒涘缓鏀舵敮娴佹按', {
-          billType: returnBillType(),
-          billId: info.id,
-          costType: info.costType,
-          receivableFee: Math.abs(info.needReceivableFee),
-          costTypeName: returnText(info.costType),
-          contractCode: info.contractCode,
-          contractId: info.contractId,
-          startDate: info.startDate,
-          endDate: info.endDate,
-          multifileList: [],
-          date: `${info.startDate} ~ ${info.endDate}`,
-          companyId: info.companyId,
-          companyName: info.companyName,
-          actReceivableFee: Math.abs(info.needReceivableFee),
-          needReceivableFeeCopy: info.needReceivableFee
-        })">鏂板缓鏀舵敮娴佹按</el-button>
+        <div style="display: flex; align-items: center;">
+          <el-button @click="$refs.call.open('鍙戦�佸偓缂撮�氱煡', [info.id])">鍙戦�佺即璐归�氱煡</el-button>
+          <el-button plain type="primary" v-if="![1].includes(info.payStatus)" @click="$refs.flowingWater.open('鍒涘缓鏀舵敮娴佹按', {
+            billType: returnBillType(),
+            billId: info.id,
+            costType: info.costType,
+            receivableFee: Math.abs(info.needReceivableFee),
+            costTypeName: returnText(info.costType),
+            contractCode: info.contractCode,
+            contractId: info.contractId,
+            startDate: info.startDate,
+            endDate: info.endDate,
+            multifileList: [],
+            date: `${info.startDate} ~ ${info.endDate}`,
+            companyId: info.companyId,
+            companyName: info.companyName,
+            actReceivableFee: Math.abs(info.needReceivableFee),
+            needReceivableFeeCopy: info.needReceivableFee
+          })">鏂板缓鏀舵敮娴佹按</el-button>
+        </div>
       </div>
       <div class="line"></div>
       <div class="main">
@@ -190,6 +193,8 @@
     <FlowingWater ref="flowingWater" @success="getDetails" @refresh="Refresh" />
     <!--  鍚堝悓璇︽儏  -->
     <ContractDetail ref="ContractDetailRef" />
+    <!--  鍙戦�佺即璐归�氱煡  -->
+    <Call ref="call" />
   </GlobalWindow>
 </template>
 
@@ -197,13 +202,15 @@
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
 import FlowingWater from './flowingWater'
+import Call from './call'
 import ContractDetail from '../../contract/components/contractDetail'
 import { getYwContractBillById } from '@/api/contract'
 export default {
   components: {
     GlobalWindow,
     FlowingWater,
-    ContractDetail
+    ContractDetail,
+    Call
   },
   extends: BaseOpera,
   data() {
diff --git a/admin/src/views/finance/components/call.vue b/admin/src/views/finance/components/call.vue
index 7bf84c1..2660506 100644
--- a/admin/src/views/finance/components/call.vue
+++ b/admin/src/views/finance/components/call.vue
@@ -1,33 +1,28 @@
 <template>
     <GlobalWindow
-        :title="title"
-        :visible.sync="visible"
-        width="100%">
-        <el-form :model="form" label-position="top" ref="paramRef" :rules="rules">
-            <el-form-item label="閫氱煡鏂瑰紡" prop="title">
-                <el-checkbox-group v-model="form.title">
-                    <el-checkbox label="缇庨/椁愬巺绾夸笂娲诲姩" name="1"></el-checkbox>
-                    <el-checkbox label="鍦版帹娲诲姩" name="2"></el-checkbox>
-                    <el-checkbox label="绾夸笅涓婚娲诲姩" name="3"></el-checkbox>
-                    <el-checkbox label="鍗曠函鍝佺墝鏇濆厜" name="4"></el-checkbox>
+            :title="title"
+            :visible.sync="visible"
+            :isDownload="true"
+            width="100%"
+            @downloadFile="downloadFile"
+            @confirm="confirm">
+        <el-form :model="form" label-position="top" ref="paramRef">
+            <el-form-item label="閫氱煡鏂瑰紡">
+                <el-checkbox-group v-model="form.type">
+                    <el-checkbox label="鐭俊"></el-checkbox>
+                    <el-checkbox label="閭欢"></el-checkbox>
                 </el-checkbox-group>
             </el-form-item>
-            <el-form-item label="閫氱煡鎺ユ敹浜�" prop="companyId">
-                <div style="display: flex; flex-direction: column;">
-                    <div style="display: flex; align-items: center; margin-bottom: 20px;">
-                        <span style="font-size: 14px; color: black; margin-right: 10px;">寮犱笁</span>
-                        <el-select v-model="form.companyId" placeholder="璇烽�夋嫨">
-                            <el-option label="鍖哄煙涓�" value="0"></el-option>
-                            <el-option label="鍖哄煙浜�" value="1"></el-option>
-                        </el-select>
-                    </div>
-                    <div style="display: flex; align-items: center;">
-                        <span style="font-size: 14px; color: black; margin-right: 10px;">XXXX鍏徃</span>
-                        <el-select v-model="form.companyId" placeholder="璇烽�夋嫨">
-                            <el-option label="鍖哄煙涓�" value="0"></el-option>
-                            <el-option label="鍖哄煙浜�" value="1"></el-option>
-                        </el-select>
-                    </div>
+            <el-form-item label="閫氱煡鎺ユ敹浜�">
+                <div style="display: flex; align-items: center; margin-bottom: 10px;" v-for="(item, index) in userList" :key="index">
+                    <span style="margin-right: 15px; font-size: 15px; color: #222222;">{{item.customerName}}</span>
+                    <el-select v-model="item.userId" placeholder="璇烽�夋嫨">
+                        <el-option
+                                v-for="(item, index) in item.memberList"
+                                :key="index"
+                                :label="item.name"
+                                :value="item.id" />
+                    </el-select>
                 </div>
             </el-form-item>
         </el-form>
@@ -37,24 +32,59 @@
 <script>
   import GlobalWindow from '@/components/common/GlobalWindow'
   import BaseOpera from '@/components/base/BaseOpera'
+  import { getNoticeCustomerData, downloadCallFeeDoc, sendSmsEmail } from '@/api/ywContractBill'
   export default {
     name: "call",
     components: { GlobalWindow },
     extends: BaseOpera,
     data() {
       return {
+        ids: null,
         form: {
-          title: '1',
-          companyId: '0'
+          type: []
         },
-        rules: {
-          title: [{ required: true, message: '璇疯緭鍏�' }],
-          companyId: [{ required: true, message: '璇烽�夋嫨' }],
-        }
+        userList: []
       }
     },
     methods: {
-    
+      open (title, ids) {
+        this.title = title
+        this.ids = ids
+        this.form.type = []
+        this.userList = []
+        this.visible = true
+        this.getUser()
+      },
+      downloadFile() {
+        downloadCallFeeDoc(this.ids)
+          .then(response => {
+            this.download(response)
+          })
+          .catch(e => {
+            this.$tip.apiFailed(e)
+          })
+      },
+      getUser() {
+        getNoticeCustomerData(this.ids)
+          .then(res => {
+            this.userList = res
+          })
+      },
+      confirm() {
+        if (this.form.type.length === 0) return this.$message.warning('閫氱煡鏂瑰紡涓嶈兘涓虹┖')
+        let arr = this.userList.map(item => {
+          return {
+            billId: item.billId,
+            sendEmail: this.form.type.includes('閭欢') ? 1 : 0,
+            sendSms: this.form.type.includes('鐭俊') ? 1 : 0,
+            userId: item.userId
+          }
+        })
+        sendSmsEmail(arr).then(res => {
+          this.$message.success('鍙戦�佹垚鍔燂紒')
+          this.visible = false
+        })
+      }
     }
   }
 </script>
diff --git a/admin/src/views/finance/components/templateKeywords.vue b/admin/src/views/finance/components/templateKeywords.vue
index 1d748b1..b88022e 100644
--- a/admin/src/views/finance/components/templateKeywords.vue
+++ b/admin/src/views/finance/components/templateKeywords.vue
@@ -1,32 +1,21 @@
 <template>
     <GlobalWindow
         :title="title"
+        :withFooter="false"
         :visible.sync="visible"
         width="100%">
         <div class="main">
             <div class="title">璐﹀崟淇℃伅</div>
             <div class="list">
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${璐圭敤鍚嶇О}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${璁¤垂鍛ㄦ湡}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${鍗曚环}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${鍗曚綅}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${搴旀敹鏃ユ湡}</el-tag>
+                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px; cursor: pointer;" @click="copy(item.title)" v-for="(item, index) in billTempList" :key="index">{{item.title}}</el-tag>
             </div>
             <div class="title">鍚堝悓淇℃伅</div>
             <div class="list">
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${璐圭敤鍚嶇О}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${璁¤垂鍛ㄦ湡}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${鍗曚环}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${鍗曚綅}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${搴旀敹鏃ユ湡}</el-tag>
+                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px; cursor: pointer;" @click="copy(item.title)" v-for="(item, index) in contractTempList" :key="index">{{item.title}}</el-tag>
             </div>
             <div class="title">鍏朵粬淇℃伅</div>
             <div class="list">
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${璐圭敤鍚嶇О}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${璁¤垂鍛ㄦ湡}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${鍗曚环}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${鍗曚綅}</el-tag>
-                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${搴旀敹鏃ユ湡}</el-tag>
+                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px; cursor: pointer;" @click="copy(item.title)" v-for="(item, index) in otherTempList" :key="index">{{item.title}}</el-tag>
             </div>
         </div>
     </GlobalWindow>
@@ -35,17 +24,44 @@
 <script>
   import GlobalWindow from '@/components/common/GlobalWindow'
   import BaseOpera from '@/components/base/BaseOpera'
+  import { getCallTemp } from '@/api/ywTempConfig'
   export default {
     name: "templateKeywords",
     components: { GlobalWindow },
     extends: BaseOpera,
     data() {
       return {
-      
+        billTempList: [],
+        contractTempList: [],
+        otherTempList: []
       }
     },
+    created () {
+      this.getCallTempVal()
+    },
     methods: {
-
+      open (title) {
+        this.title = title
+        this.visible = true
+      },
+      getCallTempVal() {
+        getCallTemp({})
+          .then(res => {
+            this.billTempList = res.billTempList
+            this.contractTempList = res.contractTempList
+            this.otherTempList = res.otherTempList
+          })
+      },
+      copy(val) {
+        this.$copyText(val).then(
+          (e) => {
+            this.$message.success('澶嶅埗鎴愬姛锛�')
+          },
+          (err) => {
+            this.$message.error('澶嶅埗鎴愬姛锛�')
+          }
+        );
+      }
     }
   }
 </script>
diff --git a/admin/src/views/finance/overdueBills.vue b/admin/src/views/finance/overdueBills.vue
index 8d64cc1..41c000b 100644
--- a/admin/src/views/finance/overdueBills.vue
+++ b/admin/src/views/finance/overdueBills.vue
@@ -7,10 +7,14 @@
                 <div class="tab" :class="{ active: billType === 1 }" @click="tabsClick(1)">閫炬湡浠樻璐﹀崟</div>
             </div>
             <div class="btns">
-                <el-button @click="$refs.call.open('鎵归噺鍌即')">鎵归噺鍌即</el-button>
+                <el-button :disabled="ids.length === 0" @click="batchCall">鎵归噺鍌即</el-button>
             </div>
         </div>
-        <el-table v-loading="loading" :data="list" stripe>
+        <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange" stripe>
+            <el-table-column
+                type="selection"
+                width="55">
+            </el-table-column>
             <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
             <el-table-column label="鎴块棿" min-width="170" show-overflow-tooltip>
                 <template slot-scope="{row}">
@@ -64,14 +68,14 @@
             </el-table-column>
             <el-table-column label="鐭俊鍙戦�佺姸鎬�" min-width="100" fixed="right" show-overflow-tooltip>
                 <template slot-scope="{row}">
-                    <span v-if="row.status === 0">寮�鍚�</span>
-                    <span v-if="row.status === 1" style="color: red;">鍏抽棴</span>
+                    <span v-if="row.isSendSms === 0">鍚�</span>
+                    <span v-if="row.isSendSms === 1">鏄�</span>
                 </template>
             </el-table-column>
             <el-table-column label="閭欢鍙戦�佺姸鎬�" min-width="100" fixed="right" show-overflow-tooltip>
                 <template slot-scope="{row}">
-                    <span v-if="row.status === 0">寮�鍚�</span>
-                    <span v-if="row.status === 1" style="color: red;">鍏抽棴</span>
+                    <span v-if="row.isSendEmail === 0">鍚�</span>
+                    <span v-if="row.isSendEmail === 1">鏄�</span>
                 </template>
             </el-table-column>
             <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
@@ -86,7 +90,7 @@
         <Edit ref="EditRef" @success="getList" />
         <Detail ref="DetailRef" @success="getList" />
         <BullEditFu ref="BullEditFu" @success="getList" />
-        <Call ref="call" @success="getList" />
+        <BatchCall ref="batchCall" @success="getList" />
     </div>
 </template>
 
@@ -96,8 +100,8 @@
   import Edit from './components/bullEdit.vue'
   import BullEditFu from './components/bullEditFu.vue'
   import Detail from './components/bullDetail.vue'
-  import Call from './components/call.vue'
-  import { fetchList } from '@/api/bill'
+  import BatchCall from './components/batchCall.vue'
+  import { fetchList } from '@/api/ywContractBill'
   export default {
     components: {
       Pagination,
@@ -105,7 +109,7 @@
       Edit,
       Detail,
       BullEditFu,
-      Call
+      BatchCall
     },
     data () {
       return {
@@ -115,6 +119,7 @@
           page: 1,
           total: 0
         },
+        ids: [],
         billType: 0,
         filters: {
           status: 0
@@ -153,6 +158,13 @@
       this.getList()
     },
     methods: {
+      batchCall() {
+        if (!this.ids) return this.$message.warning('璇峰厛閫夋嫨璐﹀崟')
+        this.$refs.batchCall.open('鎵归噺鍌即', this.ids)
+      },
+      handleSelectionChange(e) {
+        this.ids = e.map(item => item.id)
+      },
       addOpen () {
         if (this.billType === 0) {
           this.$refs.EditRef.open('鍒涘缓鏀舵璐﹀崟')
@@ -178,9 +190,6 @@
         }).then(res => {
           this.loading = false
           this.list = res.records || []
-          this.list.forEach(item => {
-            item.statusName = item.status === 1 ? '鎹熷潖' : item.status === 2 ? '鎶ュ簾' : '姝e父'
-          })
           this.pagination.total = res.total || 0
         }, () => {
           this.loading = false
diff --git a/admin/src/views/index.vue b/admin/src/views/index.vue
index 0e87c1c..32818b0 100644
--- a/admin/src/views/index.vue
+++ b/admin/src/views/index.vue
@@ -5,24 +5,24 @@
         <div class="head_item">
           <div class="head_item_left">
             <span>寰呭姙宸ュ崟</span>
-            <span>12</span>
-            <span>鏌ョ湅鏇村</span>
+            <span>{{obj.waitDealWorkOrderSize || 0}}</span>
+            <span @click="jump(1)">鏌ョ湅鏇村</span>
           </div>
           <img class="head_item_icon" src="@/assets/indexIcon/ic_daibangongdan@2x.png" />
         </div>
         <div class="head_item">
           <div class="head_item_left">
             <span>寰呭贰妫�</span>
-            <span>12</span>
-            <span>鏌ョ湅鏇村</span>
+            <span>{{obj.waitTaskSize || 0}}</span>
+            <span @click="jump(2)">鏌ョ湅鏇村</span>
           </div>
           <img class="head_item_icon" src="@/assets/indexIcon/ic_daixuncha@2x.png" />
         </div>
         <div class="head_item">
           <div class="head_item_left">
             <span>寰呯洏鐐�</span>
-            <span>12</span>
-            <span>鏌ョ湅鏇村</span>
+            <span>{{obj.stocktakingSize || 0}}</span>
+            <span @click="jump(3)">鏌ョ湅鏇村</span>
           </div>
           <img class="head_item_icon" src="@/assets/indexIcon/ic_daipandian@2x.png" />
         </div>
@@ -30,15 +30,15 @@
       <div class="main_left_menu">
         <div class="main_left_menu_title">
           <span>甯哥敤鍔熻兘</span>
-          <div class="main_left_menu_title_edit">
+          <div class="main_left_menu_title_edit" @click="$refs.commonFunctions.open('甯哥敤鍔熻兘绠$悊')">
             <img src="@/assets/indexIcon/ic_daibangongdan@2x.png" />
             <span>鑷畾涔夊姛鑳�</span>
           </div>
         </div>
         <div class="main_left_menu_list">
-          <div class="list_item" v-for="(item, index) in menu" :key="index">
+          <div class="list_item" v-for="(item, index) in list" :key="index" @click="jump1(item.path)">
             <div class="list_item_left">
-              <img :src="item.icon" />
+              <img :src="item.icoPath" />
               <span>{{item.name}}</span>
             </div>
             <i class="el-icon-arrow-right"></i>
@@ -49,65 +49,163 @@
     <div class="main_right">
       <div class="main_right_title">鏃ョ▼</div>
       <div class="main_right_search">
-        <el-select v-model="value" style="width: 150px; margin-right: 15px;" placeholder="璇烽�夋嫨">
+        <el-select v-model="nian" style="width: 150px; margin-right: 15px;" @change="getMonthNoticess" placeholder="璇烽�夋嫨">
           <el-option
-            v-for="item in options"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
+            v-for="item in yearList"
+            :key="item.val"
+            :label="item.name"
+            :value="item.val">
           </el-option>
         </el-select>
-        <el-select v-model="value" style="width: 150px;" placeholder="璇烽�夋嫨">
+        <el-select v-model="yue" style="width: 150px;" @change="getMonthNoticess" placeholder="璇烽�夋嫨">
           <el-option
-            v-for="item in options"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
+            v-for="(item, index) in 12"
+            :key="index"
+            :label="item + '鏈�'"
+            :value="item > 9 ? item : `0${item}`">
           </el-option>
         </el-select>
       </div>
-      
+      <div class="main_right_date">
+        <Calendar
+          ref="Calendar"
+          v-on:choseDay="clickDay"
+          :markDateMore="markDateMore"
+        ></Calendar>
+      </div>
+      <div class="main_right_rc">
+        <div class="main_right_rc_title">褰撴棩鏃ョ▼锛坽{dataList.length}}锛�</div>
+        <div class="main_right_rc_list">
+          <div class="main_right_rc_list_row" v-for="(item, index) in dataList" :key="index">
+            <div class="top">
+              <div class="top_left">
+                <div class="top_left_dian"></div>
+                <div class="top_left_title">{{item.title}}</div>
+              </div>
+              <div class="top_date">{{item.createDate}}</div>
+            </div>
+            <div class="bottom">
+              {{item.content}}
+            </div>
+          </div>
+        </div>
+      </div>
     </div>
+    <CommonFunctions ref="commonFunctions" @success="getYwQuickLists" />
   </div>
 </template>
 
 <script>
+import CommonFunctions from '@/components/business/commonFunctions'
+import { getYwQuickList, getMonthNotices, workDeskData } from '@/api/ywWorkDesk'
+import Calendar from 'vue-calendar-component'
 export default {
   data() {
     return {
-      menu: [
-        { name: '鎴挎�佺鐞�', icon: require('@/assets/indexIcon/ic_fangtaiguanli@2x.png') },
-        { name: '宸ュ崟鍒楄〃', icon: require('@/assets/indexIcon/ic_gongdanliebiao@2x.png') },
-        { name: '闂涓婃姤', icon: require('@/assets/indexIcon/ic_wentishangbao@2x.png') },
-        { name: '鏂板缓宸ュ崟', icon: require('@/assets/indexIcon/ic_xinjiangongdan@2x.png') },
-        { name: '璁惧绠$悊', icon: require('@/assets/indexIcon/ic_shebeiguanli@2x.png') },
-        { name: '宸℃浠诲姟', icon: require('@/assets/indexIcon/ic_xunjianrenwu@2x.png') },
-        { name: '鍚堝悓鍒楄〃', icon: require('@/assets/indexIcon/ic_hetongliebiao@2x.png') },
-        { name: '搴撳瓨鏌ヨ', icon: require('@/assets/indexIcon/ic_kucunchaxun@2x.png') },
-        { name: '璐﹀崟鍒楄〃', icon: require('@/assets/indexIcon/ic_zhangdanliebiao@2x.png') },
-        { name: '鏂板鍏ュ簱鍗�', icon: require('@/assets/indexIcon/ic_xinzengruku@2x.png') },
-        { name: '鏂板鍑哄簱鍗�', icon: require('@/assets/indexIcon/ic_xinzengchuku@2x.png') },
-        { name: '璧勪骇娓呭崟', icon: require('@/assets/indexIcon/ic_zichan@2x.png') },
-      ],
-      options: [],
-      value: ''
+      list: [],
+      value: new Date(),
+      yearList: [],
+      markDateMore: [],
+      nian: '',
+      yue: '',
+      obj: {},
+      dataList: []
     }
   },
+  components: { CommonFunctions, Calendar },
+  created () {
+    this.getWorkDeskData()
+    this.getYwQuickLists()
+    this.getYear()
+  },
   methods: {
+    getYear() {
+      let currentYear = new Date().getFullYear();
+      let currentMonth = new Date().getMonth() + 1;
+      this.nian = currentYear
+      this.yue = currentMonth > 9 ? currentMonth : `0${currentMonth}`
+      for (let i = currentYear - 10; i <= currentYear; i++) {
+        this.yearList.unshift({ name: i + '骞�', val: i })
+      }
+      this.getMonthNoticess()
+    },
+    // 鑾峰彇浠e姙
+    getWorkDeskData() {
+      workDeskData({})
+        .then(res => {
+          this.obj = res
+        })
+    },
+    clickDay(e) {
+      let date = e.replace("/\\//g", "-")
+      let arr = this.markDateMore.filter(item => {
+        if (item.date === date) {
+          return item
+        }
+      })
+      if (arr.length > 0) {
+        this.dataList = arr[0].noticeList
+      } else {
+        this.dataList = []
+      }
+    },
+    // 鑾峰彇鏃ョ▼
+    getMonthNoticess() {
+      getMonthNotices(this.nian + '-' + this.yue).then(res => {
+        let arr = res.filter(item => {
+          if (item.noticeList && item.noticeList.length > 0) {
+            return item
+          }
+        })
+        this.markDateMore = arr.map(item => {
+          return { date: item.monthDate.replace("/-0/g", "-"), className: 'markRed', noticeList: item.noticeList }
+        })
+        let toDay = this.getDay()
+        this.markDateMore.forEach(item => {
+          if (item.date === toDay) {
+            this.dataList = item.noticeList
+          }
+        })
+        this.$refs.Calendar.ChoseMonth(`${this.nian}-${this.yue}`, false)
+      })
+    },
+    getYwQuickLists() {
+      getYwQuickList({})
+        .then(res => {
+          this.list = res
+        })
+    },
+    getDay() {
+      let date = new Date();
+      let year = date.getFullYear();  // 鑾峰彇骞翠唤
+      let month = String(date.getMonth() + 1).padStart(2, '0');  // 鑾峰彇鏈堜唤锛屽苟琛ラ浂
+      let day = String(date.getDate()).padStart(2, '0');  // 鑾峰彇鏃ユ湡锛屽苟琛ラ浂
   
+      return `${year}-${month}-${day}`;
+    },
+    jump(type) {
+      if (type === 1) {
+        this.$router.push({ path: '/workorder/workorderList' })
+      } else if (type === 2) {
+        this.$router.push({ path: '/Inspection/task' })
+      } else if (type === 3) {
+        this.$router.push({ path: '/stock/check' })
+      }
+    },
+    jump1(path) {
+      this.$router.push({ path })
+    }
   }
 }
 </script>
-
 <style lang="scss" scoped>
   .main {
     width: 100%;
-    height: calc(100vh - 48px - 56px - 35px);
     padding: 15px;
     box-sizing: border-box;
     background: #F4F7FC;
     display: flex;
-    align-items: center;
+    align-items: self-start;
     justify-content: space-between;
     .main_left {
       flex: 1;
@@ -158,6 +256,7 @@
                 font-weight: 400;
                 font-size: 13px;
                 color: #999999;
+                cursor: pointer;
               }
             }
           }
@@ -186,6 +285,7 @@
             color: #222222;
           }
           .main_left_menu_title_edit {
+            cursor: pointer;
             display: flex;
             align-items: center;
             img {
@@ -253,6 +353,113 @@
         color: #222222;
         margin-bottom: 12px;
       }
+      .main_right_rc {
+        width: 100%;
+        display: flex;
+        flex-direction: column;
+        .main_right_rc_title {
+          font-weight: 500;
+          font-size: 16px;
+          color: #222222;
+          margin-bottom: 15px;
+        }
+        .main_right_rc_list {
+          width: 100%;
+          height: 300px;
+          overflow-y: scroll;
+          .main_right_rc_list_row {
+            width: 100%;
+            padding: 15px;
+            box-sizing: border-box;
+            background: #F4F7FC;
+            border-radius: 2px;
+            margin-bottom: 10px;
+            .top {
+              width: 100%;
+              display: flex;
+              align-items: center;
+              justify-content: space-between;
+              .top_left {
+                display: flex;
+                align-items: center;
+                .top_left_dian {
+                  width: 10px;
+                  height: 10px;
+                  border-radius: 50%;
+                  background: #FF9E00;
+                  margin-right: 10px;
+                }
+                .top_left_title {
+                  font-weight: 500;
+                  font-size: 15px;
+                  color: #222222;
+                }
+              }
+              .top_date {
+                font-weight: 400;
+                font-size: 12px;
+                color: #999999;
+              }
+            }
+            .bottom {
+              font-weight: 400;
+              font-size: 13px;
+              color: #666666;
+              margin-top: 8px;
+            }
+          }
+        }
+      }
+      .main_right_date {
+        width: 100%;
+        padding-top: 15px;
+        box-sizing: border-box;
+        ::v-deep .wh_content_item {
+          height: 50px;
+          color: #222222;
+          font-weight: 400;
+          font-size: 15px;
+        }
+        ::v-deep .wh_item_date {
+          width: 30px;
+          height: 30px;
+          font-size: 15px;
+        }
+        ::v-deep .wh_content_all {
+          background-color: #ffffff;
+        }
+        ::v-deep .wh_top_changge {
+          display: none;
+        }
+        ::v-deep .wh_container {
+          max-width: 100%;
+        }
+        ::v-deep .wh_content_item .wh_isToday {
+          background-color: #3E80EF;
+          color: #fff;
+        }
+        ::v-deep .wh_item_date:hover {
+          background-color: #3E80EF;
+          border-radius: 50%;
+          color: #ffffff;
+        }
+        ::v-deep .wh_content_item .wh_chose_day {
+          background: #3E80EF;
+          color: #fff;
+        }
+        ::v-deep .markRed {
+          position: relative;
+        }
+        ::v-deep .markRed::after {
+          content: '鈼�';
+          color: #FF9E00;
+          font-size: 11px;
+          position: absolute;
+          bottom: -30px;
+          left: 50%;
+          transform: translate(-50%, 0);
+        }
+      }
     }
   }
 </style>
diff --git a/admin/src/views/operation/components/deviceDetail.vue b/admin/src/views/operation/components/deviceDetail.vue
index f3181aa..02633b3 100644
--- a/admin/src/views/operation/components/deviceDetail.vue
+++ b/admin/src/views/operation/components/deviceDetail.vue
@@ -1,7 +1,14 @@
 <template>
-  <GlobalWindow width="720px" title="璁惧璇︽儏" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+  <GlobalWindow width="100%" title="璁惧璇︽儏" :withFooter="false" :visible.sync="visible" :confirm-working="isWorking" @close="close"
     @confirm="confirm">
-    <div class="main">
+    <div style="width: 100%; position: sticky; top: 0; left: 0; z-index: 999; background: #ffffff;">
+      <div class="tabs">
+        <div class="tab" :class="{ active: activeTabs === 0 }" @click="tabsClick(0)">璁惧淇℃伅</div>
+        <div class="tab" :class="{ active: activeTabs === 1 }" @click="tabsClick(1)">杩愮淮璁板綍</div>
+        <div class="tab" :class="{ active: activeTabs === 2 }" @click="tabsClick(2)">宸℃璁板綍</div>
+      </div>
+    </div>
+    <div class="main" v-if="activeTabs === 0">
       <div class="title">
         <span>鍩虹淇℃伅</span>
       </div>
@@ -32,6 +39,18 @@
             <div class="val">{{ info.addr }}</div>
           </div>
           <div class="item">
+            <div class="la">鎵�灞為」鐩�</div>
+            <div class="val">{{ info.projectName }}</div>
+          </div>
+          <div class="item">
+            <div class="la">鍏宠仈鎴挎簮</div>
+            <div class="val">{{ info.buildingName }} / {{ info.floorName }} / {{info.roomName}}</div>
+          </div>
+          <div class="item">
+            <div class="la">璐叆鏃堕棿</div>
+            <div class="val">{{ info.buyDate }}</div>
+          </div>
+          <div class="item">
             <div class="la">璁惧鐘舵��</div>
             <spa class="val" v-if="info.status == 0">姝e父</spa>
             <spa class="val" v-if="info.status == 1">鎹熷潖</spa>
@@ -48,24 +67,189 @@
           <div v-if="info.fileFullUrl" class="item" style="width: 100%;">
             <div class="la">鐓х墖</div>
             <div class="val">
-              <img class="photo" :src="info.fileFullUrl" alt="">
+              <el-image
+                style="width: 100px; height: 100px"
+                :src="info.fileFullUrl"
+                :preview-src-list="[info.fileFullUrl]">
+              </el-image>
+            </div>
+          </div>
+          <div class="item" style="width: 100%;">
+            <div class="la">闄勪欢</div>
+            <div class="val">
+              <el-table
+                :data="info.multifileList ? info.multifileList : []"
+                border
+                style="width: 100%">
+                <el-table-column
+                  prop="name"
+                  label="闄勪欢鍚嶇О">
+                </el-table-column>
+                <el-table-column
+                  prop="userName"
+                  label="鎿嶄綔浜�">
+                </el-table-column>
+                <el-table-column
+                  prop="createDate"
+                  label="鎿嶄綔鏃堕棿">
+                </el-table-column>
+              </el-table>
             </div>
           </div>
         </div>
       </div>
+      <div class="title">
+        <span>渚涘簲鍟嗕俊鎭�</span>
+      </div>
+      <div class="main_content">
+        <div class="list">
+          <div class="item">
+            <div class="la">渚涘簲鍟�</div>
+            <div class="val">{{info.supplier}}</div>
+          </div>
+          <div class="item">
+            <div class="la">鑱旂郴浜�</div>
+            <div class="val">{{info.supplierLinker}}</div>
+          </div>
+          <div class="item">
+            <div class="la">鑱旂郴鏂瑰紡</div>
+            <div class="val">{{info.supplierPhone}}</div>
+          </div>
+        </div>
+      </div>
+      <div class="title">
+        <span>缁翠繚淇℃伅</span>
+      </div>
+      <div class="main_content">
+        <div class="list">
+          <div class="item">
+            <div class="la">缁翠繚璐熻矗浜�</div>
+            <div class="val">{{info.maintenanceUserName}}</div>
+          </div>
+          <div class="item">
+            <div class="la">缁翠繚鍒版湡鏃�</div>
+            <div class="val">{{info.maintenanceOverDate}}</div>
+          </div>
+          <div class="item" style="width: 100%;">
+            <div class="la">缁翠繚璇存槑</div>
+            <div class="val">{{info.maintenanceContent}}</div>
+          </div>
+        </div>
+      </div>
     </div>
+    <div class="main" v-if="activeTabs === 1">
+      <el-table
+        :data="infoList"
+        border
+        style="width: 100%">
+        <el-table-column
+          prop="realName"
+          label="杩愮淮浜哄憳">
+        </el-table-column>
+        <el-table-column
+          label="璁惧鐘舵��">
+          <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="remark"
+          label="杩愮淮澶囨敞">
+        </el-table-column>
+        <el-table-column
+          prop="dealDate"
+          label="杩愮淮鏃堕棿">
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔">
+          <template slot-scope="{row}">
+            <el-button type="text" @click="handleDetail(row)">鏌ョ湅璇︽儏</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page="page"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+    <div class="main" v-if="activeTabs === 2">
+      <el-table
+        :data="infoList"
+        border
+        style="width: 100%">
+        <el-table-column
+          prop="schemeTitle"
+          label="璁″垝鍚嶇О">
+        </el-table-column>
+        <el-table-column
+          prop="taskCode"
+          label="浠诲姟缂栧彿">
+        </el-table-column>
+        <el-table-column
+          label="浠诲姟鏃堕棿">
+          <template slot-scope="{row}">
+            {{row.startDate}} ~ {{row.endDate}}
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="realname"
+          label="宸℃浜�">
+        </el-table-column>
+        <el-table-column
+          label="宸℃缁撴灉">
+          <template slot-scope="{row}">
+            <span v-if="row.dealStatus === 0">姝e父</span>
+            <span v-if="row.dealStatus === 1">寮傚父</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="宸℃闄勪欢">
+          <template slot-scope="{row}">
+            <el-image
+              v-if="row.multifileList && row.multifileList.length > 0"
+              style="width: 100px; height: 100px"
+              :src="row.multifileList[0].fileurlFull"
+              :preview-src-list="[row.multifileList[0].fileurlFull]">
+            </el-image>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="content"
+          label="宸℃璇存槑">
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page="page"
+        :page-sizes="[10, 20, 30, 40]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+    <Detail ref="DetailRef" />
   </GlobalWindow>
 </template>
 
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
+import Detail from './maintainDetail'
 import { detailById } from '@/api/Inspection/device.js'
-import { getUserList } from '@/api/system/user'
-import { Message, Loading } from 'element-ui'
+import { fetchList } from '@/api/Inspection/deviceRecord.js'
+import { getDetail } from '@/api/Inspection/ywPatrolTask.js'
 export default {
   components: {
-    GlobalWindow
+    GlobalWindow,
+    Detail
   },
   extends: BaseOpera,
   data() {
@@ -73,19 +257,83 @@
       id: '',
       visible: false,
       info: {},
-
+      activeTabs: 0,
+      fileList: [],
+  
+      infoList: [],
+      total: 0,
+      pageSize: 10,
+      page: 1
     }
   },
   methods: {
+    handleSizeChange(e) {
+      this.pageSize = e
+      if (this.activeTabs === 1) {
+        this.getyunwei()
+      } else if (this.activeTabs === 2) {
+        this.getXunJian()
+      }
+    },
+    handleCurrentChange(e) {
+      this.page = e
+      if (this.activeTabs === 1) {
+        this.getyunwei()
+      } else if (this.activeTabs === 2) {
+        this.getXunJian()
+      }
+    },
     getDetail() {
+      this.this.activeTabs = 0
       const { id } = this
       detailById(id).then(res => {
         this.info = res
       })
     },
+    handleDetail(row) {
+      this.$refs.DetailRef.visible = true
+      this.$refs.DetailRef.getDetail(row.id)
+    },
     close() {
       this.visible = false
       this.$emit('close')
+    },
+    tabsClick(val) {
+      this.activeTabs = val
+      this.pageSize = 10
+      this.page = 1
+      this.infoList = []
+      if (val === 1) {
+        this.getyunwei()
+      } else if (val === 2) {
+        this.getXunJian()
+      }
+    },
+    // 鑾峰彇璁惧杩愮淮璁板綍
+    getyunwei() {
+      fetchList({
+        capacity: this.pageSize,
+        page: this.page,
+        model: {
+          deviceId: this.id
+        }
+      }).then(res => {
+        this.infoList = res.records
+        this.total = res.total
+      })
+    },
+    // 宸℃璁板綍
+    getXunJian() {
+      getDetail({
+        capacity: this.pageSize,
+        page: this.page,
+        model: {
+          deviceId: this.id
+        }
+      }).then(res => {
+        this.infoList = res.records
+        this.total = res.total
+      })
     }
   }
 }
@@ -93,7 +341,24 @@
 
 <style lang="scss" scoped>
 @import '@/assets/style/variables.scss';
-
+.tabs {
+  border-bottom: 1px solid #DFE2E8;
+  display: flex;
+  .tab {
+    height: 58px;
+    line-height: 58px;
+    font-size: 16px;
+    color: #666666;
+    margin-right: 30px;
+    cursor: pointer;
+  }
+  
+  .active {
+    font-weight: 500;
+    color: $primary-color;
+    border-bottom: 2px solid $primary-color;
+  }
+}
 .main {
   padding-top: 20px;
 
diff --git a/admin/src/views/operation/components/deviceEdit.vue b/admin/src/views/operation/components/deviceEdit.vue
index 4c5c8f7..1b125ed 100644
--- a/admin/src/views/operation/components/deviceEdit.vue
+++ b/admin/src/views/operation/components/deviceEdit.vue
@@ -1,52 +1,170 @@
 <template>
   <GlobalWindow :title="param.id ? '缂栬緫璁惧' : '鏂板缓璁惧'" :confirmWorking="subLoading" :visible.sync="isShowModal"
-    width="600px" @close="close" @confirm="handleSub">
+    width="100%" @close="close" @confirm="handleSub">
     <el-form :model="param" ref="paramRef" :rules="rules">
-      <el-form-item label="璁惧缂栫爜" prop="code">
-        <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
-      </el-form-item>
-      <el-form-item label="璁惧鍚嶇О" prop="name">
-        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
-      </el-form-item>
-      <el-form-item label="璁惧鍨嬪彿" prop="">
-        <el-input v-model="param.modelNo" placeholder="璇疯緭鍏�" v-trim />
-      </el-form-item>
-      <el-form-item label="璁惧鍒嗙被" prop="cateId">
-        <el-cascader v-model="param.cateIds" @change="changeSel" placeholder="璇烽�夋嫨璁惧鍒嗙被" clearable :options="cateList"
-          :props="{
-            label: 'name',
-            value: 'id',
-            children: 'childCategoryList'
-          }"></el-cascader>
-      </el-form-item>
-      <el-form-item label="璁惧绠$悊鍛�" prop="">
-        <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>
-      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="">
-        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
-
-      </el-form-item>
-      <el-form-item label="渚涘簲鍟�" prop="">
-        <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>
-          <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.fileFullUrl, 'imgurl': param.fileUrl }"
-          :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
-          @uploadBegin="isUploading = true" />
-      </el-form-item>
+      <div style="width: 100%; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; padding-top: 20px; box-sizing: border-box;">
+        <div class="title">鍩虹淇℃伅</div>
+        <div style="width: 31%;">
+          <el-form-item label="璁惧缂栫爜" prop="code">
+            <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="璁惧鍚嶇О" prop="name">
+            <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="璁惧鍨嬪彿" prop="modelNo">
+            <el-input v-model="param.modelNo" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="璁惧鍒嗙被" prop="cateIds">
+            <el-cascader v-model="param.cateIds" @change="changeSel" placeholder="璇烽�夋嫨璁惧鍒嗙被" clearable :options="cateList"
+             :props="{
+              label: 'name',
+              value: 'id',
+              children: 'childCategoryList'
+            }"></el-cascader>
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="璁惧绠$悊鍛�" prop="userId">
+            <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>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="鎵�鍦ㄤ綅缃�" prop="addr">
+            <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="鎵�灞為」鐩�" prop="projectId">
+            <el-select v-model="param.projectId" @change="changeProject" filterable>
+              <el-option v-for="item in projectList" :label="item.name" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="鍏宠仈鎴挎簮" prop="rooms">
+            <el-cascader v-model="param.rooms" :disabled="!param.projectId" ref="cascader" @change="getHouseVal" placeholder="璇烽�夋嫨鍏宠仈鎴挎簮" :options="houseList"
+             :props="{
+              label: 'name',
+              value: 'id',
+              children: 'projectDataVOList'
+            }"></el-cascader>
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="璐叆鏃堕棿" prop="buyDate">
+            <el-date-picker
+              v-model="param.buyDate"
+              type="date"
+              value-format="yyyy-MM-dd"
+              placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="璁惧鐘舵��" prop="status">
+            <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>
+        </div>
+        <div style="width: 100%;">
+          <el-form-item label="杩愮淮鍐呭" prop="content">
+            <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </div>
+        <div style="width: 100%;">
+          <el-form-item label="鐓х墖" prop="">
+            <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }"
+             :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
+             @uploadBegin="isUploading = true" />
+            <div style="width: 100%; height: 40px;"></div>
+          </el-form-item>
+        </div>
+        <div style="width: 100%;">
+          <el-form-item label="闄勪欢" prop="multifileList">
+            <div style="display: flex; flex-direction: column; align-items: flex-start;">
+              <el-button type="text" @click="$refs.uploadFile.click()">+娣诲姞闄勪欢</el-button>
+              <el-table
+                :data="param.multifileList"
+                border
+                style="width: 100%">
+                <el-table-column
+                  prop="name"
+                  label="闄勪欢鍚嶇О">
+                </el-table-column>
+                <el-table-column
+                  prop="createUserName"
+                  label="鎿嶄綔浜�">
+                </el-table-column>
+                <el-table-column
+                  prop="createTime"
+                  label="鎿嶄綔鏃堕棿">
+                </el-table-column>
+                <el-table-column
+                  label="鎿嶄綔">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="deleFile(scope.$index)">鍒犻櫎</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </el-form-item>
+        </div>
+  
+        <div class="title">渚涘簲鍟嗕俊鎭�</div>
+        <div style="width: 31%;">
+          <el-form-item label="渚涘簲鍟�" prop="supplier">
+            <el-input v-model="param.supplier" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="鑱旂郴浜�" prop="supplierLinker">
+            <el-input v-model="param.supplierLinker" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="鑱旂郴鏂瑰紡" prop="supplierPhone">
+            <el-input v-model="param.supplierPhone" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+  
+        <div class="title">缁翠繚淇℃伅</div>
+        <div style="width: 31%;">
+          <el-form-item label="缁翠繚璐熻矗浜�" prop="maintenanceUserId">
+            <el-select v-model="param.maintenanceUserId" clearable filterable>
+              <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </div>
+        <div style="width: 31%;">
+          <el-form-item label="缁翠繚鍒版湡鏃�" prop="maintenanceOverDate">
+            <el-date-picker
+              v-model="param.maintenanceOverDate"
+              type="date"
+              value-format="yyyy-MM-dd"
+              placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+        </div>
+        <div style="width: 31%;"></div>
+        <div style="width: 100%;">
+          <el-form-item label="缁翠繚璇存槑" prop="maintenanceContent">
+            <el-input v-model="param.maintenanceContent" type="textarea" placeholder="璇疯緭鍏�" v-trim />
+          </el-form-item>
+        </div>
+      </div>
     </el-form>
+    <input type="file" ref="uploadFile" style="position: fixed; top: -20px; left: 0;" @change="getFile" />
   </GlobalWindow>
 </template>
 
@@ -56,7 +174,10 @@
 import { fetchList } from '@/api/business/category'
 import { create, updateById, detailById } from '@/api/Inspection/device'
 import { getUserList } from '@/api/system/user'
-import { Message } from 'element-ui'
+import { uploadBatch } from '@/api/system/common'
+import { getProjectList, tree } from '@/api/project/ywProject'
+import { Loading, Message } from 'element-ui'
+import { mapState } from 'vuex'
 export default {
   components: { GlobalWindow, UploadAvatarImage },
   data() {
@@ -64,22 +185,126 @@
       isShowModal: false,
       subLoading: false,
       param: {
-        status: 0
+        code: '',
+        name: '',
+        modelNo: '',
+        cateIds: '',
+        userId: '',
+        addr: '',
+        projectId: '',
+        rooms: [],
+        buildingId: '',
+        floorId: '',
+        roomId: '',
+        
+        supplier: [],
+        buyDate: '',
+        content: '',
+        supplierLinker: '',
+        supplierPhone: '',
+        maintenanceUserId: '',
+        maintenanceOverDate: '',
+        maintenanceContent: '',
+        status: 0,
+        multifileList: []
       },
-      cateList: [],
       rules: {
-        name: [{ required: true, message: '璇疯緭鍏�' }],
-        code: [{ required: true, message: '璇疯緭鍏�' }],
-        cateId: [{ required: true, message: '璇烽�夋嫨' }],
+        name: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+        code: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+        cateId: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+        projectId: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+        rooms: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }]
       },
-      staffList: []
-
+      loadings: false,
+      cateList: [],
+      houseList: [],
+      staffList: [],
+      projectList: []
     }
+  },
+  computed: {
+    ...mapState(['userInfo'])
   },
   created() {
     this.initData()
+    this.getProjectLists()
+    console.log(this.userInfo)
   },
   methods: {
+    getHouseVal(e) {
+      this.param.buildingId = e[1]
+      this.param.floorId = e[2]
+      this.param.roomId = e[3]
+    },
+    changeProject(e) {
+      this.getHouseTree()
+    },
+    getHouseTree() {
+      tree({
+        projectId: this.param.projectId
+      }).then(res => {
+        this.addParamToArray(res)
+        this.houseList = res
+      })
+    },
+    addParamToArray(arr) {
+      for (let i = 0; i < arr.length; i++) {
+        const currentItem = arr[i].projectDataVOList
+        if (currentItem && currentItem.length >= 0) {
+          currentItem.forEach(item => {
+            if (item.lv === 3) {
+              delete item.projectDataVOList
+            }
+          })
+        }
+        if (currentItem && currentItem.length > 0) {
+          this.addParamToArray(currentItem)
+        }
+      }
+    },
+    deleFile(index) {
+      this.param.multifileList.splice(index, 1)
+    },
+    // 鑾峰彇椤圭洰
+    getProjectLists() {
+      getProjectList({})
+        .then(res => {
+          this.projectList = res
+        })
+    },
+    // 涓婁紶闄勪欢
+    getFile(e) {
+      this.loadings = Loading.service({
+        lock: true,
+        text: 'Loading',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      let formDate = new FormData()
+      formDate.append('folder', 'YW_DEVICE')
+      formDate.append('file', e.target.files[0])
+      uploadBatch(formDate)
+        .then(res => {
+          this.param.multifileList.push({ ...res[0], fileurl: res[0].imgaddr, name: res[0].originname, createUserName: this.userInfo.realname, createTime: this.getDate() })
+        })
+        .finally(() => {
+          e.target.files = null
+          this.loadings.close()
+        })
+    },
+    getDate() {
+      const currentDate = new Date();
+
+      const year = currentDate.getFullYear(); // 鑾峰彇褰撳墠骞翠唤
+      const month = currentDate.getMonth() + 1; // 鑾峰彇褰撳墠鏈堜唤 (0-11锛屾墍浠ラ渶瑕� +1)
+      const day = currentDate.getDate(); // 鑾峰彇褰撳墠鏃ユ湡
+      const hours = currentDate.getHours(); // 鑾峰彇褰撳墠灏忔椂
+      const minutes = currentDate.getMinutes(); // 鑾峰彇褰撳墠鍒嗛挓
+      const seconds = currentDate.getSeconds(); // 鑾峰彇褰撳墠绉掗挓
+      
+      return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day} `
+              + `${hours < 10 ? '0' + hours : hours}:${minutes < 10 ? '0' + minutes : minutes}:${seconds < 10 ? '0' + seconds : seconds}`;
+    },
     handleSub() {
       const { param, subLoading } = this
       this.$refs['paramRef'].validate((valid) => {
@@ -100,6 +325,15 @@
     getDetail(id) {
       detailById(id).then(res => {
         this.param = res
+        this.param.rooms = [res.projectId, res.buildingId, res.floorId, res.roomId]
+        this.param.multifileList = res.multifileList.map(item => {
+          return {
+            ...item,
+            createUserName: item.userName,
+            createTime: item.createDate
+          }
+        })
+        this.getHouseTree()
         const cateId = this.param.cateId || ''
         setTimeout(() => {
           if (cateId) {
@@ -108,7 +342,6 @@
                 item.childCategoryList.forEach(item2 => {
                   if (item2.id == cateId) {
                     this.$set(this.param, 'cateIds', [item.id, item2.id])
-                    console.log('cateId', this.form)
                   }
                 })
               }
@@ -149,4 +382,17 @@
     }
   }
 }
-</script>
\ No newline at end of file
+</script>
+
+<style lang="scss" scoped>
+  @import '@/assets/style/variables.scss';
+  .title {
+    width: 100%;
+    font-weight: 500;
+    font-size: 18px;
+    color: $primary-color;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+  }
+</style>
diff --git a/admin/src/views/operation/device.vue b/admin/src/views/operation/device.vue
index 770219c..43a7339 100644
--- a/admin/src/views/operation/device.vue
+++ b/admin/src/views/operation/device.vue
@@ -120,8 +120,6 @@
       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/project/components/houseDetails.vue b/admin/src/views/project/components/houseDetails.vue
index 5e61c5c..394d64a 100644
--- a/admin/src/views/project/components/houseDetails.vue
+++ b/admin/src/views/project/components/houseDetails.vue
@@ -1,11 +1,16 @@
 <template>
     <GlobalWindow
-        title="妤煎畤璇︽儏"
+        :title="title"
         :showConfirm="false"
         :visible.sync="visible"
-        width="800px">
+        width="100%">
         <div class="right">
-            <div class="right_head">椤圭洰鍚嶇О</div>
+            <div class="right_head">
+                <span>{{info.roomNum}}</span>
+                <el-tag type="success" v-if="info.leaseStatus === 0">寰呯璧�</el-tag>
+                <el-tag type="success" v-if="info.leaseStatus === 1">宸茬璧�</el-tag>
+                <el-tag type="success" v-if="info.leaseStatus === 2">鏈紑鍚璧�</el-tag>
+            </div>
             <div class="right_cate">
                 <el-tabs v-model="activeName" @tab-click="handleClick">
                     <el-tab-pane label="鎴挎簮淇℃伅" name="houseinfo">
@@ -17,39 +22,40 @@
                                 <div class="xm_info">
                                     <div class="xm_info_row" style="width: 25%;">
                                         <span>鎵�灞為」鐩�</span>
-                                        <span>XXXXXXXXXX</span>
+                                        <span>{{info.projectName}}</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%;">
                                         <span>妤煎畤</span>
-                                        <span>缁煎悎妤�</span>
+                                        <span>{{info.buildingName}}</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%;">
                                         <span>妤煎眰</span>
-                                        <span>1</span>
+                                        <span>{{info.floorName}}</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%;">
                                         <span>鎴垮彿</span>
-                                        <span>101娲诲姩瀹�</span>
+                                        <span>{{info.roomNum}}</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                         <span>鎴块棿缂栧彿</span>
-                                        <span>101</span>
+                                        <span>{{info.code}}</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                         <span>鏄惁鎷涘晢</span>
-                                        <span>鍚�</span>
+                                        <span v-if="info.isInvestment === 0">鍚�</span>
+                                        <span v-if="info.isInvestment === 1">鏄�</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                         <span>寤虹瓚闈㈢Н</span>
-                                        <span>50銕�</span>
+                                        <span>{{info.area}}銕�</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                         <span>璁$闈㈢Н</span>
-                                        <span>50銕�</span>
+                                        <span>{{info.rentArea}}銕�</span>
                                     </div>
                                     <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                         <span>璁¤垂闈㈢Н</span>
-                                        <span>45銕�</span>
+                                        <span>{{info.feeArea}}銕�</span>
                                     </div>
                                 </div>
                             </el-card>
@@ -62,37 +68,51 @@
                                     <span>褰撳墠鍦ㄧ鍚堝悓</span>
                                 </div>
                                 <div class="xm_table">
-                                    <el-input v-model="input" style="width: 300px; margin-bottom: 15px;" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�"></el-input>
+                                    <div style="width: 100%; display: flex; align-items: center; margin-bottom: 15px;">
+                                        <el-input v-model="form.code" style="width: 300px;" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�"></el-input>
+                                        <el-button type="primary" style="margin-left: 15px;" @click="getTenantContract()">鎼滅储</el-button>
+                                    </div>
                                     <el-table
                                         :data="tableData"
                                         border
+                                        v-loading="loading"
                                         style="width: 100%">
                                         <el-table-column
-                                            prop="date"
                                             label="鍚堝悓缂栧彿">
+                                            <template slot-scope="{row}">
+                                                <el-button type="text" @click="$refs.ContractDetailRef.open('鍚堝悓璇︽儏', row.id)" v-if="row.status === 1">{{row.code}}</el-button>
+                                                <el-button type="text" v-else>{{row.code}}</el-button>
+                                            </template>
                                         </el-table-column>
                                         <el-table-column
-                                            prop="name"
+                                            prop="renterName"
                                             label="瀹㈡埛鍚嶇О">
                                         </el-table-column>
                                         <el-table-column
-                                            prop="address"
+                                            prop="startDate"
                                             label="寮�濮嬫棩鏈�">
                                         </el-table-column>
                                         <el-table-column
-                                            prop="address"
+                                            prop="endDate"
                                             label="缁撴潫鏃ユ湡">
                                         </el-table-column>
                                         <el-table-column
-                                            prop="address"
                                             label="绉熻祦鍗曚环">
+                                            <template slot-scope="{row}">
+                                                <div style="display: flex; align-items: center;">
+                                                    <span>{{row.zlFirstPrice || row.wyFirstPrice}}</span>
+                                                    <span>{{row.zlFirstCircleStr || row.wyFirstCircleStr}}</span>
+                                                </div>
+                                            </template>
                                         </el-table-column>
                                         <el-table-column
-                                            prop="address"
                                             label="绉熻祦闈㈢Н锛堛帯锛�">
+                                            <template slot-scope="{row}">
+                                                {{row.totalArea}}銕�
+                                            </template>
                                         </el-table-column>
                                         <el-table-column
-                                            prop="address"
+                                            prop="signDate"
                                             label="绛捐鏃�">
                                         </el-table-column>
                                         <el-table-column
@@ -100,8 +120,14 @@
                                             label="鍚堝悓鏉ユ簮">
                                         </el-table-column>
                                         <el-table-column
-                                            prop="address"
                                             label="鍚堝悓鐘舵��">
+                                            <template slot-scope="{row}">
+                                                <span class="primaryColor" v-if="row.status === 0">寰呮墽琛�</span>
+                                                <span class="green" v-if="row.status === 1">姝e父鎵ц涓�</span>
+                                                <span class="gary" v-if="row.status === 2">宸插埌鏈�</span>
+                                                <span class="gary" v-if="row.status === 3">閫�绉熺粨绠椾腑</span>
+                                                <span class="gary" v-if="row.status === 4">宸查��绉�</span>
+                                            </template>
                                         </el-table-column>
                                     </el-table>
                                     <div class="xm_table_f">
@@ -125,84 +151,93 @@
                                 <div class="xm_one1">
                                     <div class="xm_one_row">
                                         <span>寰呮寚娲炬暟閲�</span>
-                                        <span>15</span>
+                                        <span>{{numObj.waitAssignAmount || 0}}</span>
                                     </div>
                                     <div class="xm_one_row">
                                         <span>寰呭鐞嗘暟閲�</span>
-                                        <span>15</span>
+                                        <span>{{numObj.waitDealAmount || 0}}</span>
                                     </div>
                                     <div class="xm_one_row">
                                         <span>鏈湀宸ュ崟鏁�</span>
-                                        <span>15</span>
+                                        <span>{{numObj.monthAmount || 0}}</span>
                                     </div>
                                     <div class="xm_one_row">
                                         <span>绱宸ュ崟鏁�</span>
-                                        <span>15</span>
+                                        <span>{{numObj.amount || 0}}</span>
                                     </div>
                                 </div>
                             </el-card>
                             <el-card style="margin-top: 20px;">
                                 <div class="xm_table">
                                     <div class="xm_table_search">
-                                        <el-select v-model="value" style="width: 300px; margin-right: 15px;" placeholder="浣嶇疆绫诲瀷">
-                                            <el-option
-                                                    v-for="item in options"
-                                                    :key="item.value"
-                                                    :label="item.label"
-                                                    :value="item.value">
-                                            </el-option>
-                                        </el-select>
-                                        <el-select v-model="value" style="width: 300px;" placeholder="宸ュ崟鍒嗙被">
-                                            <el-option
-                                                    v-for="item in options"
-                                                    :key="item.value"
-                                                    :label="item.label"
-                                                    :value="item.value">
-                                            </el-option>
-                                        </el-select>
+                                        <div>
+                                            <el-cascader style="width: 150px; margin-right: 15px;" v-model="form.areaIds" @change="changeSel" placeholder="璇烽�夋嫨宸ュ崟鍒嗙被" clearable
+                                                :options="cateList" :props="{
+                                                    label: 'name',
+                                                    value: 'id',
+                                                    children: 'childCategoryList'
+                                                }" />
+                                            <el-select v-model="form.status" style="width: 150px; margin-right: 15px;" placeholder="宸ュ崟鐘舵��">
+                                                <el-option label="鍚敤" :value="0"></el-option>
+                                                <el-option label="绂佺敤" :value="1"></el-option>
+                                            </el-select>
+                                            <el-button type="primary" @click="getFetchList">鏌ヨ</el-button>
+                                            <el-button @click="clear">娓呯┖</el-button>
+                                        </div>
+                                        <el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('鏂板缓宸ュ崟')">鏂板宸ュ崟</el-button>
                                     </div>
                                     <el-table
-                                            :data="tableData"
-                                            border
-                                            style="width: 100%">
+                                        :data="tableData"
+                                        border
+                                        v-loading="loading"
+                                        style="width: 100%">
                                         <el-table-column
-                                                prop="date"
-                                                label="宸ュ崟鍒嗙被">
+                                            prop="categoryName"
+                                            label="宸ュ崟鍒嗙被">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="name"
-                                                label="鎶ヤ慨鍖哄煙">
+                                            label="鎶ヤ慨鍖哄煙">
+                                            <template v-slot="scope">
+                                                <span>{{ scope.row.buildingName }} / {{ scope.row.areaType == 0 ? scope.row.roomNum : scope.row.floorName
+                                                  }}</span>
+                                            </template>
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="涓婃姤浜�">
+                                            prop="creatorName"
+                                            label="涓婃姤浜�">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="涓婃姤鏃堕棿">
+                                            prop="createDate"
+                                            label="涓婃姤鏃堕棿">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="澶勭悊浜�">
+                                            prop="dealUserName"
+                                            label="澶勭悊浜�">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="宸ュ崟鐘舵��">
+                                            label="宸ュ崟鐘舵��">
+                                            <template slot-scope="{row}">
+                                                <span v-if="row.dealStatus === 0">寰呮寚娲�</span>
+                                                <span v-if="row.dealStatus === 1">宸叉寚娲�</span>
+                                                <span v-if="row.dealStatus === 2">宸插鐞�</span>
+                                            </template>
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="鎿嶄綔">
+                                            label="鎿嶄綔">
+                                            <template slot-scope="{row}">
+                                                <el-button type="text" @click="handleDetail(row)">鏌ョ湅璇︽儏</el-button>
+                                            </template>
                                         </el-table-column>
                                     </el-table>
                                     <div class="xm_table_f">
                                         <el-pagination
-                                                @size-change="handleSizeChange"
-                                                @current-change="handleCurrentChange"
-                                                :current-page="page"
-                                                :page-sizes="[10, 20, 30, 40]"
-                                                :page-size="pageTotal"
-                                                layout="total, sizes, prev, pager, next, jumper"
-                                                :total="total">
+                                            @size-change="handleSizeChange"
+                                            @current-change="handleCurrentChange"
+                                            :current-page="page"
+                                            :page-sizes="[10, 20, 30, 40]"
+                                            :page-size="pageTotal"
+                                            layout="total, sizes, prev, pager, next, jumper"
+                                            :total="total">
                                         </el-pagination>
                                     </div>
                                 </div>
@@ -223,62 +258,64 @@
                                 <div class="xm_table">
                                     <div class="xm_table_search">
                                         <div class="xm_table_search_left">
-                                            <el-input v-model="input" placeholder="璇疯緭鍏ヨ澶囧悕绉�/缂栫爜" style="width: 200px; margin-right: 15px;"></el-input>
-                                            <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="璁惧鐘舵��">
-                                                <el-option
-                                                        v-for="item in options"
-                                                        :key="item.value"
-                                                        :label="item.label"
-                                                        :value="item.value">
-                                                </el-option>
+                                            <el-input v-model="form.name" placeholder="璇疯緭鍏ヨ澶囧悕绉�/缂栫爜" style="width: 200px; margin-right: 15px;"></el-input>
+                                            <el-select v-model="form.status" style="width: 150px; margin-right: 15px;" placeholder="璁惧鐘舵��">
+                                                <el-option label="姝e父" :value="0"></el-option>
+                                                <el-option label="鎹熷潖" :value="1"></el-option>
+                                                <el-option label="鎶ュ簾" :value="2"></el-option>
                                             </el-select>
-                                            <el-button type="primary">鏌ヨ</el-button>
-                                            <el-button>娓呯┖</el-button>
+                                            <el-button type="primary" @click="getDevicePage">鏌ヨ</el-button>
+                                            <el-button @click="clear">娓呯┖</el-button>
                                         </div>
-                                        <el-button type="primary">鏂板</el-button>
+                                        <el-button type="primary" @click="handleEdit">鏂板</el-button>
                                     </div>
                                     <el-table
-                                            :data="tableData"
-                                            border
-                                            style="width: 100%">
+                                        :data="tableData"
+                                        border
+                                        v-loading="loading"
+                                        style="width: 100%">
                                         <el-table-column
-                                                prop="date"
-                                                label="宸ュ崟鍒嗙被">
+                                            prop="code"
+                                            label="璁惧缂栫爜">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="name"
-                                                label="鎶ヤ慨鍖哄煙">
+                                            prop="name"
+                                            label="璁惧鍚嶇О">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="涓婃姤浜�">
+                                            prop="categoryName"
+                                            label="璁惧鍒嗙被">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="涓婃姤鏃堕棿">
+                                            prop="modelNo"
+                                            label="璁惧鍨嬪彿">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="澶勭悊浜�">
+                                            prop="realName"
+                                            label="璁惧绠$悊鍛�">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="宸ュ崟鐘舵��">
+                                            prop="supplier"
+                                            label="璁惧渚涘簲鍟�">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="鎿嶄綔">
+                                            label="璁惧鐘舵��">
+                                            <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>
                                     <div class="xm_table_f">
                                         <el-pagination
-                                                @size-change="handleSizeChange"
-                                                @current-change="handleCurrentChange"
-                                                :current-page="page"
-                                                :page-sizes="[10, 20, 30, 40]"
-                                                :page-size="pageTotal"
-                                                layout="total, sizes, prev, pager, next, jumper"
-                                                :total="total">
+                                            @size-change="handleSizeChange"
+                                            @current-change="handleCurrentChange"
+                                            :current-page="page"
+                                            :page-sizes="[10, 20, 30, 40]"
+                                            :page-size="pageTotal"
+                                            layout="total, sizes, prev, pager, next, jumper"
+                                            :total="total">
                                         </el-pagination>
                                     </div>
                                 </div>
@@ -294,62 +331,65 @@
                                 <div class="xm_table">
                                     <div class="xm_table_search">
                                         <div class="xm_table_search_left">
-                                            <el-input v-model="input" placeholder="璇疯緭鍏ヨ祫浜у悕绉�/缂栫爜" style="width: 200px; margin-right: 15px;"></el-input>
+                                            <el-input v-model="form.code" placeholder="璇疯緭鍏ヨ祫浜у悕绉�/缂栫爜" style="width: 200px; margin-right: 15px;"></el-input>
                                             <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="璧勪骇鍒嗙被">
                                                 <el-option
-                                                        v-for="item in options"
-                                                        :key="item.value"
-                                                        :label="item.label"
-                                                        :value="item.value">
+                                                    v-for="item in options"
+                                                    :key="item.value"
+                                                    :label="item.label"
+                                                    :value="item.value">
                                                 </el-option>
                                             </el-select>
-                                            <el-button type="primary">鏌ヨ</el-button>
-                                            <el-button>娓呯┖</el-button>
+                                            <el-button type="primary" @click="getPropertyLists">鏌ヨ</el-button>
+                                            <el-button @click="clear">娓呯┖</el-button>
                                         </div>
-                                        <el-button type="primary">鏂板</el-button>
+                                        <el-button type="primary" @click="$refs.newMaterial.open('鏂板缓鐗╂枡')">鏂板</el-button>
                                     </div>
                                     <el-table
-                                            :data="tableData"
-                                            border
-                                            style="width: 100%">
+                                        :data="tableData"
+                                        border
+                                        v-loading="loading"
+                                        style="width: 100%">
                                         <el-table-column
-                                                prop="date"
-                                                label="璧勪骇缂栫爜">
+                                            prop="code"
+                                            label="璧勪骇缂栫爜">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="name"
-                                                label="璧勪骇鍚嶇О">
+                                            prop="name"
+                                            label="璧勪骇鍚嶇О">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="鏉$爜">
+                                            prop="qrcode"
+                                            label="鏉$爜">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="鍝佺墝">
+                                            prop="brand"
+                                            label="鍝佺墝">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="瑙勬牸鍨嬪彿">
+                                            prop="attr"
+                                            label="瑙勬牸鍨嬪彿">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="鍗曚綅">
+                                            prop="unitName"
+                                            label="鍗曚綅">
                                         </el-table-column>
                                         <el-table-column
-                                                prop="address"
-                                                label="搴撳瓨鏁伴噺">
+                                            label="搴撳瓨鏁伴噺">
+                                            <template v-slot="scope">
+                                                <span>{{ scope.row.maxStock }} ~ {{ scope.row.minStock }}</span>
+                                            </template>
                                         </el-table-column>
                                     </el-table>
                                     <div class="xm_table_f">
                                         <el-pagination
-                                                @size-change="handleSizeChange"
-                                                @current-change="handleCurrentChange"
-                                                :current-page="page"
-                                                :page-sizes="[10, 20, 30, 40]"
-                                                :page-size="pageTotal"
-                                                layout="total, sizes, prev, pager, next, jumper"
-                                                :total="total">
+                                            @size-change="handleSizeChange"
+                                            @current-change="handleCurrentChange"
+                                            :current-page="page"
+                                            :page-sizes="[10, 20, 30, 40]"
+                                            :page-size="pageTotal"
+                                            layout="total, sizes, prev, pager, next, jumper"
+                                            :total="total">
                                         </el-pagination>
                                     </div>
                                 </div>
@@ -359,34 +399,222 @@
                 </el-tabs>
             </div>
         </div>
+        <!--    鍚堝悓璇︽儏    -->
+        <ContractDetail ref="ContractDetailRef" />
+        <!--    宸ュ崟璇︽儏    -->
+        <Detail v-if="showDetail" ref="DetailRef" @close="showDetail = false" />
+        <!--    鏂板缓宸ュ崟    -->
+        <OperaYwWorkorderWindow ref="operaYwWorkorderWindow" @success="getFetchList" />
+        <!--    鏂板缓璁惧    -->
+        <Edit v-if="showEdit1" ref="EditRef" @success="getDevicePage" @close="showEdit1 = false" />
+        <!--    鏂板缓璧勪骇    -->
+        <newMaterial ref="newMaterial" @success="getPropertyLists" />
     </GlobalWindow>
 </template>
 
 <script>
   import BaseOpera from '@/components/base/BaseOpera'
   import GlobalWindow from '@/components/common/GlobalWindow'
+  import newMaterial from '../../stock/components/newMaterial'
   import * as echarts from 'echarts';
+  import { detailById } from '@/api/project/ywRoom'
+  import { fetchList as TenantContract } from '@/api/contract'
+  import { getDataVO, fetchList } from '@/api/workorder/ywWorkorder'
+  import ContractDetail from '../../contract/components/contractDetail'
+  import { fetchList as getCateList } from '@/api/business/category.js'
+  import { fetchList as getPropertyList } from '@/api/ywMaterial'
+  import { getDeviceStatus, getDeviceCateData, fetchList as devicePage } from '@/api/Inspection/device'
+  import Detail from '../../workorder/components/detail'
+  import OperaYwWorkorderWindow from '../../workorder/components/OperaYwWorkorderWindow'
+  import Edit from '../../operation/components/deviceEdit'
   export default {
     name: "houseDetails",
     extends: BaseOpera,
-    components: { GlobalWindow },
+    components: { GlobalWindow, ContractDetail, Detail, OperaYwWorkorderWindow, Edit, newMaterial },
     data() {
       return {
         info: {},
+        houseId: '',
+        propsName: '',
         activeName: 'houseinfo',
         total: 0,
         pageTotal: 10,
         page: 1,
-        tableData: []
+        numObj: {},
+        tableData: [],
+        loading: false,
+        form: {
+          code: '',
+          areaIds: [],
+          cateId: '',
+          status: '',
+          name: ''
+        },
+        cateList: [],
+        categaryList: [],
+        deviceList: [],
+        showDetail: false,
+        showEdit1: false
       }
     },
     methods: {
-      open (title, target) {
+      open (title, id) {
         this.title = title
-        this.visible = true
+        this.houseId = id
+        detailById(id)
+          .then(res => {
+            this.info = res
+            this.visible = true
+          })
+      },
+      handleEdit(row) {
+        this.showEdit1 = true
         this.$nextTick(() => {
-          this.reand()
-          this.reand1()
+          this.$refs.EditRef.isShowModal = true
+        })
+      },
+      handleDetail(row) {
+        this.showDetail = true
+        this.$nextTick(() => {
+          this.$refs.DetailRef.visible = true
+          this.$refs.DetailRef.id = row.id
+          this.$refs.DetailRef.getDetail()
+        })
+      },
+      // 鑾峰彇璁惧鐘舵��
+      getDevice() {
+        getDeviceStatus({ roomId: this.houseId })
+            .then(res => {
+              this.$nextTick(() => {
+                this.deviceList = [
+                  { value: res.workAmount || 0, name: '姝e父' },
+                  { value: res.exceptionAmount || 0, name: '寮傚父' },
+                  { value: res.errAmount || 0, name: '鎶ュ簾' }
+                ]
+                this.reand()
+              })
+            })
+      },
+      // 璁惧鏁伴噺鍒嗗竷缁熻
+      getDeviceCateDatas() {
+        getDeviceCateData({
+          roomId: this.houseId
+        }).then(res => {
+          this.categaryList = res
+          this.$nextTick(() => {
+            this.reand1()
+          })
+        })
+      },
+      // 鑾峰彇璁惧鍒嗛〉
+      getDevicePage() {
+        this.loading = true
+        devicePage({
+          capacity: this.pageTotal,
+          page: this.page,
+          model: {
+            roomId: this.houseId,
+            status: this.form.status,
+            name: this.form.name
+          }
+        }).then(res => {
+          this.tableData = res.records
+          this.total = res.total
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      // 鑾峰彇璧勪骇鍒楄〃
+      getPropertyLists() {
+        this.loading = true
+        getPropertyList({
+          capacity: this.pageTotal,
+          page: this.page,
+          model: {
+            roomId: this.houseId,
+            name: this.form.name
+          }
+        }).then(res => {
+          this.tableData = res.records
+          this.total = res.total
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      getCate() {
+        getCateList({
+          model: { type: 3 },
+          capacity: 1000,
+          page: 1,
+        }).then(res => {
+          this.cateList = res.records || []
+        })
+      },
+      changeSel(e) {
+        if (e && e.length == 2) {
+          this.$set(this.form, 'cateId', e[1])
+        } else {
+          this.$set(this.form, 'cateId', '')
+        }
+      },
+      clear() {
+        this.page = 1
+        this.form.status = ''
+        this.form.areaIds = []
+        this.form.cateId = ''
+        this.form.name = ''
+        if (this.propsName === 'project') {
+          this.getTenantContract()
+        } else if (this.propsName === 'second') {
+          this.getFetchList()
+        } else if (this.propsName === 'third') {
+          this.getDevicePage()
+        } else if (this.propsName === 'fourth') {
+          this.getPropertyLists()
+        }
+      },
+      // 鑾峰彇宸ュ崟鏁�
+      getDataVOs() {
+        getDataVO({
+          queryId: this.houseId,
+          queryType: 3
+        }).then(res => {
+          this.numObj = res
+        })
+      },
+      // 鑾峰彇宸ュ崟鍒楄〃
+      getFetchList() {
+        this.loading = true
+        fetchList({
+          capacity: 10,
+          page: 1,
+          model: {
+            roomId: this.houseId,
+            status: this.form.status,
+            cateId: this.form.cateId
+          }
+        }).then(res => {
+          this.tableData = res.records
+          this.total = res.total
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      // 鑾峰彇鍚堝悓鍒嗛〉
+      getTenantContract() {
+        this.loading = true
+        TenantContract({
+          capacity: this.pageTotal,
+          page: this.page,
+          model: {
+            roomIds: [this.houseId],
+            code: this.form.code
+          }
+        }).then(res => {
+          this.tableData = res.records
+          this.total = res.total
+        }).finally(() => {
+          this.loading = false
         })
       },
       reand() {
@@ -394,38 +622,29 @@
         var myChart = echarts.init(chartDom);
         var option;
         option = {
+          title: {
+            text: '璁惧鐘舵��'
+          },
           tooltip: {
             trigger: 'item'
           },
           legend: {
-            top: '5%',
-            left: 'center'
+            left: 'right',
+            top: 'middle',
+            width: '80'
           },
           series: [
             {
-              name: 'Access From',
+              name: '璁惧鐘舵��',
               type: 'pie',
               radius: ['40%', '80%'],
-              avoidLabelOverlap: false,
               label: {
-                show: false,
-                position: 'center'
+                show: true,
+                position: 'center',
+                fontWeight: 'bold',
+                fontSize: 22
               },
-              emphasis: {
-                label: {
-                  show: true,
-                  fontSize: 40,
-                  fontWeight: 'bold'
-                }
-              },
-              labelLine: {
-                show: false
-              },
-              data: [
-                { value: 1048, name: '姝e父' },
-                { value: 735, name: '寮傚父' },
-                { value: 580, name: '鎶ュ簾' }
-              ]
+              data: this.deviceList
             }
           ]
         };
@@ -435,7 +654,6 @@
         var chartDom = document.getElementById('chat2');
         var myChart = echarts.init(chartDom);
         var option;
-        // There should not be negative values in rawData
         const rawData = [
           [100, 302, 301, 334, 390, 330, 320],
           [320, 132, 101, 134, 90, 230, 210],
@@ -451,12 +669,6 @@
           }
           totalData.push(sum);
         }
-        const grid = {
-          left: 100,
-          right: 100,
-          top: 50,
-          bottom: 50
-        };
         const series = [
           'Direct',
           'Mail Ad',
@@ -469,41 +681,103 @@
             type: 'bar',
             stack: 'total',
             barWidth: '60%',
-            label: {
-              show: true,
-              formatter: (params) => Math.round(params.value * 1000) / 10 + '%'
-            },
             data: rawData[sid].map((d, did) =>
               totalData[did] <= 0 ? 0 : d / totalData[did]
             )
           };
         });
+        let seriesArr = this.categaryList.map(item => {
+          return {
+            name: item.cateName,
+            type: 'bar',
+            stack: 'total',
+            barWidth: '60%',
+            data: item.ywDeviceCateDataVOList.map((child) =>
+              child.deviceAmount
+            )
+          }
+        })
+        let xAxisData = this.categaryList.map(item => item.cateName)
+        console.log(series)
+        console.log(seriesArr)
+        console.log(xAxisData)
         option = {
-          legend: {
-            selectedMode: false
+          title: {
+            text: '璁惧鏁伴噺鍒嗙被缁熻'
           },
-          grid,
+          grid: {
+            left: 50,
+            right: 50,
+            top: 50,
+            bottom: 50
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              type: 'shadow'
+            }
+          },
           yAxis: {
             type: 'value'
           },
           xAxis: {
             type: 'category',
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+            data: xAxisData
           },
-          series
+          series: seriesArr
         };
 
         option && myChart.setOption(option);
       },
-      handleClick(tab, event) {
-        console.log(tab, event);
+      handleClick(tab) {
+        this.page = 1
+        this.pageTotal = 10
+        this.tableData = []
+        this.total = 0
+        this.form.code = ''
+        this.form.areaIds = []
+        this.form.cateId = ''
+        this.form.status = ''
+        this.form.name = ''
+        this.propsName = tab._props.name
+        if (tab._props.name === 'project') {
+          this.getTenantContract()
+        } else if (tab._props.name === 'second') {
+          this.getDataVOs()
+          this.getCate()
+          this.getFetchList()
+        } else if (tab._props.name === 'third') {
+          this.getDevice()
+          this.getDeviceCateDatas()
+          this.getDevicePage()
+        } else if (this.propsName === 'fourth') {
+          this.getPropertyLists()
+        }
       },
       handleCurrentChange(page) {
         this.page = page
+        if (this.propsName === 'project') {
+          this.getTenantContract()
+        } else if (this.propsName === 'second') {
+          this.getFetchList()
+        } else if (tab._props.name === 'third') {
+          this.getDevicePage()
+        } else if (this.propsName === 'fourth') {
+          this.getPropertyLists()
+        }
       },
       handleSizeChange(pageTotal) {
         this.pageTotal = pageTotal
-      },
+        if (this.propsName === 'project') {
+          this.getTenantContract()
+        } else if (this.propsName === 'second') {
+          this.getFetchList()
+        } else if (tab._props.name === 'third') {
+          this.getDevicePage()
+        } else if (this.propsName === 'fourth') {
+          this.getPropertyLists()
+        }
+      }
     }
   }
 </script>
@@ -517,10 +791,13 @@
             width: 100%;
             padding: 20px;
             box-sizing: border-box;
-            font-size: 16px;
-            font-weight: bold;
-            color: black;
-            background: #ffffff;
+            span {
+                font-size: 16px;
+                font-weight: bold;
+                color: black;
+                background: #ffffff;
+                margin-right: 10px;
+            }
         }
         .right_cate {
             width: 100%;
diff --git a/admin/src/views/project/housingList.vue b/admin/src/views/project/housingList.vue
index fabf9e7..7d0d874 100644
--- a/admin/src/views/project/housingList.vue
+++ b/admin/src/views/project/housingList.vue
@@ -54,7 +54,7 @@
         <el-table-column v-if="containPermissions(['business:ywroom:update', 'business:ywroom:delete'])" label="鎿嶄綔"
           min-width="140" fixed="right">
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.houseDetails.open('鎴挎簮璇︽儏')">鏌ョ湅璇︽儏</el-button>
+            <el-button type="text" @click="$refs.houseDetails.open('鎴挎簮璇︽儏', row.id)">鏌ョ湅璇︽儏</el-button>
             <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
               v-permissions="['business:ywroom:update']">缂栬緫</el-button>
             <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
diff --git a/admin/src/views/roomStatus/index.vue b/admin/src/views/roomStatus/index.vue
index bff1757..3ef5bef 100644
--- a/admin/src/views/roomStatus/index.vue
+++ b/admin/src/views/roomStatus/index.vue
@@ -2,37 +2,58 @@
     <div class="box">
         <div class="box_content">
             <div class="left">
-                <el-input v-model="input" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+                <el-input v-model="filterText" placeholder="鎼滅储"></el-input>
                 <div style="width: 100%; height: 20px;"></div>
-                <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
+                <el-tree
+                    ref="tree"
+                    :data="houseList"
+                    node-key="id"
+                    :default-expanded-keys="ids"
+                    highlight-current
+                    @node-click="nodeClick"
+                    :default-checked-keys="ids"
+                    :filter-node-method="filterNode"
+                    :props="{ children: 'projectDataVOList', label: 'name' }">
+                    <span class="custom-tree-node" style="width: 100%; display: flex; align-items: center; justify-content: space-between;" slot-scope="{ node, data }">
+                      <span>{{ data.name }}</span>
+                      <span style="color: #2080f7;" v-if="data.lv === 3">
+                        {{data.leaseStatus === 0 ? '寰呯璧�' : data.leaseStatus === 1 ? '宸茬璧�' : data.leaseStatus === 2 ? '鏈紑鍚璧�' : ''}}
+                      </span>
+                    </span>
+                </el-tree>
             </div>
             <div class="right">
-                <div class="right_head">椤圭洰鍚嶇О</div>
+                <div class="right_head">
+                    {{title}}
+                    <el-tag type="info" v-if="leaseStatus === 0" style="margin-left: 10px;">寰呯璧�</el-tag>
+                    <el-tag type="success" v-if="leaseStatus === 1" style="margin-left: 10px;">宸茬璧�</el-tag>
+                    <el-tag type="warning" v-if="leaseStatus === 2" style="margin-left: 10px;">鏈紑鍚璧�</el-tag>
+                </div>
                 <div class="right_cate">
                     <el-tabs v-model="activeName" @tab-click="handleClick">
-                        <el-tab-pane label="椤圭洰姒傚喌" name="first">
+                        <el-tab-pane label="椤圭洰姒傚喌" name="first" v-if="lv === 0">
                             <div class="xm">
                                 <el-card>
                                     <div class="xm_one">
                                         <div class="xm_one_row">
                                             <span>鍦ㄧ鍚堝悓鏁�</span>
-                                            <span>4</span>
-                                            <span>鍦ㄧ鎴挎簮鏁帮細5</span>
+                                            <span>{{projectNums.leaseContractAmount}}</span>
+                                            <span>鍦ㄧ鎴挎簮鏁帮細{{projectNums.leaseRoomAmount}}</span>
                                         </div>
                                         <div class="xm_one_row">
                                             <span>鍙嫑鍟嗛潰绉�</span>
-                                            <span>50000銕�</span>
-                                            <span>鍙嫑鍟嗘埧婧愭暟锛�15</span>
+                                            <span>{{projectNums.investmentArea}}銕�</span>
+                                            <span>鍙嫑鍟嗘埧婧愭暟锛歿{projectNums.investmentRoomAmount}}</span>
                                         </div>
                                         <div class="xm_one_row">
                                             <span>鍦ㄧ瀹炴椂鍧囦环</span>
-                                            <span>145.75鍏�/m虏路澶�</span>
-                                            <span>鍦ㄧ闈㈢Н锛�900.00m虏</span>
+                                            <span>{{projectNums.leasePrice}}鍏�/m虏路澶�</span>
+                                            <span>鍦ㄧ闈㈢Н锛歿{projectNums.leaseArea}}m虏</span>
                                         </div>
                                         <div class="xm_one_row">
                                             <span>鍑虹鐜�</span>
-                                            <span>50.00%</span>
-                                            <span>寰呯闈㈢Н锛�700.00m虏</span>
+                                            <span>{{(projectNums.leaseRoomAmount / projectNums.investmentRoomAmount).toFixed(2)}}%</span>
+                                            <span>寰呯闈㈢Н锛歿{projectNums.investmentArea - projectNums.leaseArea}}m虏</span>
                                         </div>
                                     </div>
                                 </el-card>
@@ -43,19 +64,19 @@
                                     <div class="xm_info">
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>椤圭洰鍚嶇О</span>
-                                            <span>XXXXXXXXXX</span>
+                                            <span>{{projectInfo.name}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>鎵�灞炲湴鍖�</span>
-                                            <span>瀹夊窘鐪�-鍚堣偉甯�-铚�灞卞尯</span>
+                                            <span>{{projectInfo.provinceName}}-{{projectInfo.cityName}}-{{projectInfo.areaName}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 50%;">
                                             <span>璇︾粏鍦板潃</span>
-                                            <span>Lorem ipsum dolor sit amet, consectetur</span>
+                                            <span>{{projectInfo.addr}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 100%; margin-top: 15px;">
                                             <span>椤圭洰绠�浠�</span>
-                                            <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum</span>
+                                            <span>{{projectInfo.remark}}</span>
                                         </div>
                                     </div>
                                 </el-card>
@@ -64,34 +85,53 @@
                                         <span>褰撳墠鍦ㄧ鍚堝悓</span>
                                     </div>
                                     <div class="xm_table">
-                                        <el-input v-model="input" style="width: 300px; margin-bottom: 15px;" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+                                        <div style="display: flex; align-items: center; margin-bottom: 15px;">
+                                            <el-input v-model="form.code" style="width: 150px; margin-right: 15px;" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�"></el-input>
+                                            <el-button type="primary" @click="getFetchList">鎼滅储</el-button>
+                                            <el-button @click="clear">閲嶇疆</el-button>
+                                        </div>
                                         <el-table
                                             :data="tableData"
                                             border
+                                            v-loading="loading"
                                             style="width: 100%">
                                             <el-table-column
-                                                prop="date"
                                                 label="鍚堝悓缂栧彿">
+                                                <template slot-scope="{row}">
+                                                    <el-button type="text">{{row.code}}</el-button>
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="name"
+                                                prop="renterName"
                                                 label="绉熷">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
                                                 label="绉熻祦鍗曚环">
+                                                <template slot-scope="{row}">
+                                                    <div style="display: flex; align-items: center;">
+                                                        <span>{{row.leasePrice || 0}}鍏�/銕÷峰ぉ</span>
+                                                    </div>
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
+                                                prop="leaseDays"
                                                 label="绉熻祦澶╂暟">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
                                                 label="绉熻祦闈㈢Н">
+                                                <template slot-scope="{row}">
+                                                    {{row.totalArea}}銕�
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
                                                 label="鎴挎簮">
+                                                <template slot-scope="{row}">
+                                                    <div style="display: flex; flex-direction: column;">
+                                                        <span v-for="(item, index) in row.roomList" :key="index">
+                                                            {{item.projectName}}/{{item.buildingName}}/{{item.floorName}}/{{item.roomNum}}
+                                                        </span>
+                                                    </div>
+                                                </template>
                                             </el-table-column>
                                         </el-table>
                                         <div class="xm_table_f">
@@ -109,7 +149,7 @@
                                 </el-card>
                             </div>
                         </el-tab-pane>
-                        <el-tab-pane label="鎴挎簮淇℃伅" name="houseinfo">
+                        <el-tab-pane label="鎴挎簮淇℃伅" name="houseinfo" v-if="[3].includes(lv)">
                             <div class="xm">
                                 <el-card style="margin-top: 20px;">
                                     <div slot="header" class="clearfix">
@@ -118,91 +158,99 @@
                                     <div class="xm_info">
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>鎵�灞為」鐩�</span>
-                                            <span>XXXXXXXXXX</span>
+                                            <span>{{roomInfo.projectName}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>妤煎畤</span>
-                                            <span>缁煎悎妤�</span>
+                                            <span>{{roomInfo.buildingName}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>妤煎眰</span>
-                                            <span>1</span>
+                                            <span>{{roomInfo.floorName}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>鎴垮彿</span>
-                                            <span>101娲诲姩瀹�</span>
+                                            <span>{{roomInfo.roomNum}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>鎴块棿缂栧彿</span>
-                                            <span>101</span>
+                                            <span>{{roomInfo.code}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>鏄惁鎷涘晢</span>
-                                            <span>鍚�</span>
+                                            <span v-if="roomInfo.isInvestment === 0">鍚�</span>
+                                            <span v-if="roomInfo.isInvestment === 1">鏄�</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>寤虹瓚闈㈢Н</span>
-                                            <span>50銕�</span>
+                                            <span>{{roomInfo.area}}銕�</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>璁$闈㈢Н</span>
-                                            <span>50銕�</span>
+                                            <span>{{roomInfo.rentArea}}銕�</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>璁¤垂闈㈢Н</span>
-                                            <span>45銕�</span>
+                                            <span>{{roomInfo.feeArea}}銕�</span>
                                         </div>
                                     </div>
                                 </el-card>
                             </div>
                         </el-tab-pane>
-                        <el-tab-pane label="绉熷鍚堝悓" name="project">
+                        <el-tab-pane label="绉熷鍚堝悓" name="project" v-if="[3].includes(lv)">
                             <div class="xm">
                                 <el-card style="margin-top: 20px;">
                                     <div slot="header" class="clearfix">
                                         <span>褰撳墠鍦ㄧ鍚堝悓</span>
                                     </div>
                                     <div class="xm_table">
-                                        <el-input v-model="input" style="width: 300px; margin-bottom: 15px;" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�"></el-input>
+                                        <div style="display: flex; align-items: center; margin-bottom: 15px;">
+                                            <el-input v-model="form.code" style="width: 150px; margin-right: 15px;" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�"></el-input>
+                                            <el-button type="primary" @click="getFetchList">鎼滅储</el-button>
+                                            <el-button @click="clear">閲嶇疆</el-button>
+                                        </div>
                                         <el-table
                                             :data="tableData"
                                             border
+                                            v-loading="loading"
                                             style="width: 100%">
                                             <el-table-column
-                                                prop="date"
                                                 label="鍚堝悓缂栧彿">
+                                                <template slot-scope="{row}">
+                                                    <el-button type="text">{{row.code}}</el-button>
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="name"
-                                                label="瀹㈡埛鍚嶇О">
+                                                prop="renterName"
+                                                label="绉熷">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="寮�濮嬫棩鏈�">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="缁撴潫鏃ユ湡">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
                                                 label="绉熻祦鍗曚环">
+                                                <template slot-scope="{row}">
+                                                    <div style="display: flex; align-items: center;">
+                                                        <span>{{row.leasePrice || 0}}鍏�/銕÷峰ぉ</span>
+                                                    </div>
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="绉熻祦闈㈢Н锛堛帯锛�">
+                                                prop="leaseDays"
+                                                label="绉熻祦澶╂暟">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="绛捐鏃�">
+                                                label="绉熻祦闈㈢Н">
+                                                <template slot-scope="{row}">
+                                                    {{row.totalArea}}銕�
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="鍚堝悓鏉ユ簮">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="鍚堝悓鐘舵��">
+                                                label="鎴挎簮">
+                                                <template slot-scope="{row}">
+                                                    <div style="display: flex; flex-direction: column;">
+                                                        <span v-for="(item, index) in row.roomList" :key="index">
+                                                            {{item.projectName}}/{{item.buildingName}}/{{item.floorName}}/{{item.roomNum}}
+                                                        </span>
+                                                    </div>
+                                                </template>
                                             </el-table-column>
                                         </el-table>
                                         <div class="xm_table_f">
@@ -220,29 +268,70 @@
                                 </el-card>
                             </div>
                         </el-tab-pane>
-                        <el-tab-pane label="妤煎畤姒傚喌" name="louyu">
+                        <el-tab-pane label="鎴挎�佺鐞�" name="house" v-if="[1,2].includes(lv)">
+                            <div class="xm">
+                                <div class="xm_house">
+                                    <div class="xm_house_tips">
+                                        <div class="xm_house_tips_row">
+                                            <div class="xm_house_tips_row_d" style="background: rgba(0,186,146,0.1);"></div>
+                                            <span>宸插嚭绉�</span>
+                                        </div>
+                                        <div class="xm_house_tips_row">
+                                            <div class="xm_house_tips_row_d" style="background: #F7F7F7;"></div>
+                                            <span>鏈嚭绉�</span>
+                                        </div>
+                                        <div class="xm_house_tips_row">
+                                            <div class="xm_house_tips_row_d" style="background: rgba(255,158,0,0.14);"></div>
+                                            <span>90鏃ュ唴鍒版湡</span>
+                                        </div>
+                                    </div>
+                                    <div class="xm_house_list" v-for="(item, index) in roomStatus" :key="index">
+                                        <div class="xm_house_list_left">
+                                            <div class="xm_house_list_left_row">
+                                                <span>{{item.floorName}}</span>
+                                                <span>{{item.floorArea}}銕�</span>
+                                            </div>
+                                        </div>
+                                        <div class="xm_house_list_right">
+                                            <div class="xm_house_list_right_row" :style="{ width: ifWidth(child.roomRentArea), backgroundColor: ifBackground(child.roomStatus) }" v-for="(child, i) in item.ywRoomStatusDataVOList" :key="i">
+                                                <div class="ft">
+                                                    <span>{{child.roomCode}}</span>
+                                                    <span>锛坽{child.roomRentArea}}銕★級</span>
+                                                </div>
+                                                <div class="xm_house_list_right_row_info" v-if="child.roomStatus !== 0">
+                                                    <span>{{child.customerName}}</span>
+                                                    <span>{{child.overData.substring(0, 10)}}鍒版湡</span>
+                                                </div>
+                                                <div class="xm_house_list_right_row_day" v-if="child.roomStatus === 0">鏈嚭绉燂綔绌虹疆{{child.freeDayAmount}}澶�</div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </el-tab-pane>
+                        <el-tab-pane label="妤煎畤姒傚喌" name="louyu" v-if="lv === 1">
                             <div class="xm">
                                 <el-card>
                                     <div class="xm_one">
                                         <div class="xm_one_row">
                                             <span>鍦ㄧ鍚堝悓鏁�</span>
-                                            <span>4</span>
-                                            <span>鍦ㄧ鎴挎簮鏁帮細5</span>
+                                            <span>{{projectNums.leaseContractAmount}}</span>
+                                            <span>鍦ㄧ鎴挎簮鏁帮細{{projectNums.leaseRoomAmount}}</span>
                                         </div>
                                         <div class="xm_one_row">
                                             <span>鍙嫑鍟嗛潰绉�</span>
-                                            <span>50000銕�</span>
-                                            <span>鍙嫑鍟嗘埧婧愭暟锛�15</span>
+                                            <span>{{projectNums.investmentArea}}銕�</span>
+                                            <span>鍙嫑鍟嗘埧婧愭暟锛歿{projectNums.investmentRoomAmount}}</span>
                                         </div>
                                         <div class="xm_one_row">
                                             <span>鍦ㄧ瀹炴椂鍧囦环</span>
-                                            <span>145.75鍏�/m虏路澶�</span>
-                                            <span>鍦ㄧ闈㈢Н锛�900.00m虏</span>
+                                            <span>{{projectNums.leasePrice}}鍏�/m虏路澶�</span>
+                                            <span>鍦ㄧ闈㈢Н锛歿{projectNums.leaseArea}}m虏</span>
                                         </div>
                                         <div class="xm_one_row">
                                             <span>鍑虹鐜�</span>
-                                            <span>50.00%</span>
-                                            <span>寰呯闈㈢Н锛�700.00m虏</span>
+                                            <span>{{(projectNums.leaseRoomAmount / projectNums.investmentRoomAmount).toFixed(2)}}%</span>
+                                            <span>寰呯闈㈢Н锛歿{projectNums.investmentArea - projectNums.leaseArea}}m虏</span>
                                         </div>
                                     </div>
                                 </el-card>
@@ -253,43 +342,43 @@
                                     <div class="xm_info">
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>鎵�灞為」鐩�</span>
-                                            <span>闃滃畞鏂囦綋涓績</span>
+                                            <span>{{buildingInfo.projectName}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>妤煎畤鍚嶇О</span>
-                                            <span>A搴�</span>
+                                            <span>{{buildingInfo.name}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>妤煎畤缂栫爜</span>
-                                            <span>A-</span>
+                                            <span>{{buildingInfo.code}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%;">
                                             <span>璇︾粏鍦板潃</span>
-                                            <span>闃滃畞鏂囦綋涓績瑗垮崡瑙�</span>
+                                            <span>{{buildingInfo.addr}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 100%; margin-top: 15px;">
-                                            <span>璇︾粏鍦板潃</span>
-                                            <span>闃滃畞鏂囦綋涓績瑗垮崡瑙�</span>
+                                            <span>妤煎畤绠�浠�</span>
+                                            <span>{{buildingInfo.remark}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>寤虹瓚闈㈢Н</span>
-                                            <span>1000銕�</span>
+                                            <span>{{buildingInfo.cqArea}}銕�</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>璁$闈㈢Н</span>
-                                            <span>1000銕�</span>
+                                            <span>{{buildingInfo.roomRentArea}}銕�</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 50%; margin-top: 15px;">
                                             <span>璁¤垂闈㈢Н</span>
-                                            <span>1000銕�</span>
+                                            <span>{{buildingInfo.roomFeeArea}}銕�</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>鍦颁笂灞傛暟</span>
-                                            <span>5</span>
+                                            <span>{{buildingInfo.onFloor}}</span>
                                         </div>
                                         <div class="xm_info_row" style="width: 25%; margin-top: 15px;">
                                             <span>鍦颁笅灞傛暟</span>
-                                            <span>2</span>
+                                            <span>{{buildingInfo.underFloor}}</span>
                                         </div>
                                     </div>
                                 </el-card>
@@ -298,184 +387,53 @@
                                         <span>褰撳墠鍦ㄧ鍚堝悓</span>
                                     </div>
                                     <div class="xm_table">
-                                        <el-input v-model="input" style="width: 300px; margin-bottom: 15px;" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
-                                        <el-table
-                                                :data="tableData"
-                                                border
-                                                style="width: 100%">
-                                            <el-table-column
-                                                    prop="date"
-                                                    label="鍚堝悓缂栧彿">
-                                            </el-table-column>
-                                            <el-table-column
-                                                    prop="name"
-                                                    label="绉熷">
-                                            </el-table-column>
-                                            <el-table-column
-                                                    prop="address"
-                                                    label="绉熻祦鍗曚环">
-                                            </el-table-column>
-                                            <el-table-column
-                                                    prop="address"
-                                                    label="绉熻祦澶╂暟">
-                                            </el-table-column>
-                                            <el-table-column
-                                                    prop="address"
-                                                    label="绉熻祦闈㈢Н">
-                                            </el-table-column>
-                                            <el-table-column
-                                                    prop="address"
-                                                    label="鎴挎簮">
-                                            </el-table-column>
-                                        </el-table>
-                                        <div class="xm_table_f">
-                                            <el-pagination
-                                                    @size-change="handleSizeChange"
-                                                    @current-change="handleCurrentChange"
-                                                    :current-page="page"
-                                                    :page-sizes="[10, 20, 30, 40]"
-                                                    :page-size="pageTotal"
-                                                    layout="total, sizes, prev, pager, next, jumper"
-                                                    :total="total">
-                                            </el-pagination>
-                                        </div>
-                                    </div>
-                                </el-card>
-                            </div>
-                        </el-tab-pane>
-                        <el-tab-pane label="鎴挎�佺鐞�" name="house">
-                            <div class="xm">
-                                <div class="xm_house">
-                                    <div class="xm_house_tips">
-                                        <div class="xm_house_tips_row">
-                                            <div class="xm_house_tips_row_d"></div>
-                                            <span>宸插嚭绉�</span>
-                                        </div>
-                                        <div class="xm_house_tips_row">
-                                            <div class="xm_house_tips_row_d"></div>
-                                            <span>鏈嚭绉�</span>
-                                        </div>
-                                        <div class="xm_house_tips_row">
-                                            <div class="xm_house_tips_row_d"></div>
-                                            <span>90鏃ュ唴鍒版湡</span>
-                                        </div>
-                                    </div>
-                                    <div class="xm_house_list">
-                                        <div class="xm_house_list_left">
-                                            <div class="xm_house_list_left_row">
-                                                <span>1F</span>
-                                                <span>600銕�</span>
-                                            </div>
-                                        </div>
-                                        <div class="xm_house_list_right">
-                                            <div class="item">
-                                                <div class="xm_house_list_right_row">
-                                                    <span>101锛�600銕★級</span>
-                                                    <div class="xm_house_list_right_row_info">
-                                                        <span>绉熷鍚嶇О</span>
-                                                        <span>2024-08-16鍒版湡</span>
-                                                    </div>
-                                                </div>
-                                                <div class="xm_house_list_right_row">
-                                                    <span>101锛�600銕★級</span>
-                                                    <div class="xm_house_list_right_row_info">
-                                                        <span>绉熷鍚嶇О</span>
-                                                        <span>2024-08-16鍒版湡</span>
-                                                    </div>
-                                                </div>
-                                                <div class="xm_house_list_right_row">
-                                                    <span>101锛�600銕★級</span>
-                                                    <div class="xm_house_list_right_row_info">
-                                                        <span>绉熷鍚嶇О</span>
-                                                        <span>2024-08-16鍒版湡</span>
-                                                    </div>
-                                                </div>
-                                                <div class="xm_house_list_right_row">
-                                                    <span>101锛�600銕★級</span>
-                                                    <div class="xm_house_list_right_row_info">
-                                                        <span>绉熷鍚嶇О</span>
-                                                        <span>2024-08-16鍒版湡</span>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </el-tab-pane>
-                        <el-tab-pane label="宸ュ崟璁板綍" name="second">
-                            <div class="xm">
-                                <el-card>
-                                    <div class="xm_one1">
-                                        <div class="xm_one_row">
-                                            <span>寰呮寚娲炬暟閲�</span>
-                                            <span>15</span>
-                                        </div>
-                                        <div class="xm_one_row">
-                                            <span>寰呭鐞嗘暟閲�</span>
-                                            <span>15</span>
-                                        </div>
-                                        <div class="xm_one_row">
-                                            <span>鏈湀宸ュ崟鏁�</span>
-                                            <span>15</span>
-                                        </div>
-                                        <div class="xm_one_row">
-                                            <span>绱宸ュ崟鏁�</span>
-                                            <span>15</span>
-                                        </div>
-                                    </div>
-                                </el-card>
-                                <el-card style="margin-top: 20px;">
-                                    <div class="xm_table">
-                                        <div class="xm_table_search">
-                                            <el-select v-model="value" style="width: 300px; margin-right: 15px;" placeholder="浣嶇疆绫诲瀷">
-                                                <el-option
-                                                    v-for="item in options"
-                                                    :key="item.value"
-                                                    :label="item.label"
-                                                    :value="item.value">
-                                                </el-option>
-                                            </el-select>
-                                            <el-select v-model="value" style="width: 300px;" placeholder="宸ュ崟鍒嗙被">
-                                                <el-option
-                                                    v-for="item in options"
-                                                    :key="item.value"
-                                                    :label="item.label"
-                                                    :value="item.value">
-                                                </el-option>
-                                            </el-select>
+                                        <div style="display: flex; align-items: center; margin-bottom: 15px;">
+                                            <el-input v-model="form.code" style="width: 150px; margin-right: 15px;" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�"></el-input>
+                                            <el-button type="primary" @click="getFetchList">鎼滅储</el-button>
+                                            <el-button @click="clear">閲嶇疆</el-button>
                                         </div>
                                         <el-table
                                             :data="tableData"
                                             border
+                                            v-loading="loading"
                                             style="width: 100%">
                                             <el-table-column
-                                                prop="date"
-                                                label="宸ュ崟鍒嗙被">
+                                                label="鍚堝悓缂栧彿">
+                                                <template slot-scope="{row}">
+                                                    <el-button type="text">{{row.code}}</el-button>
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="name"
-                                                label="鎶ヤ慨鍖哄煙">
+                                                prop="renterName"
+                                                label="绉熷">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="涓婃姤浜�">
+                                                label="绉熻祦鍗曚环">
+                                                <template slot-scope="{row}">
+                                                    <div style="display: flex; align-items: center;">
+                                                        <span>{{row.leasePrice || 0}}鍏�/銕÷峰ぉ</span>
+                                                    </div>
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="涓婃姤鏃堕棿">
+                                                prop="leaseDays"
+                                                label="绉熻祦澶╂暟">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="澶勭悊浜�">
+                                                label="绉熻祦闈㈢Н">
+                                                <template slot-scope="{row}">
+                                                    {{row.totalArea}}銕�
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="宸ュ崟鐘舵��">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="鎿嶄綔">
+                                                label="鎴挎簮">
+                                                <template slot-scope="{row}">
+                                                    <div style="display: flex; flex-direction: column;">
+                                                        <span v-for="(item, index) in row.roomList" :key="index">
+                                                            {{item.projectName}}/{{item.buildingName}}/{{item.floorName}}/{{item.roomNum}}
+                                                        </span>
+                                                    </div>
+                                                </template>
                                             </el-table-column>
                                         </el-table>
                                         <div class="xm_table_f">
@@ -493,7 +451,107 @@
                                 </el-card>
                             </div>
                         </el-tab-pane>
-                        <el-tab-pane label="璁惧淇℃伅" name="third">
+                        <el-tab-pane label="宸ュ崟璁板綍" name="second" v-if="[0,2,3].includes(lv)">
+                            <div class="xm">
+                                <el-card>
+                                    <div class="xm_one1">
+                                        <div class="xm_one_row">
+                                            <span>寰呮寚娲炬暟閲�</span>
+                                            <span>{{workOrderNums.waitAssignAmount || 0}}</span>
+                                        </div>
+                                        <div class="xm_one_row">
+                                            <span>寰呭鐞嗘暟閲�</span>
+                                            <span>{{workOrderNums.waitDealAmount || 0}}</span>
+                                        </div>
+                                        <div class="xm_one_row">
+                                            <span>鏈湀宸ュ崟鏁�</span>
+                                            <span>{{workOrderNums.monthAmount || 0}}</span>
+                                        </div>
+                                        <div class="xm_one_row">
+                                            <span>绱宸ュ崟鏁�</span>
+                                            <span>{{workOrderNums.amount || 0}}</span>
+                                        </div>
+                                    </div>
+                                </el-card>
+                                <el-card style="margin-top: 20px;">
+                                    <div class="xm_table">
+                                        <div class="xm_table_search">
+                                            <div>
+                                                <el-cascader style="width: 150px; margin-right: 15px;" v-model="form.areaIds" @change="changeSel" placeholder="璇烽�夋嫨宸ュ崟鍒嗙被" clearable
+                                                 :options="cateList" :props="{
+                                                    label: 'name',
+                                                    value: 'id',
+                                                    children: 'childCategoryList'
+                                                }" />
+                                                <el-select v-model="form.dealStatus" style="width: 150px; margin-right: 15px;" placeholder="宸ュ崟鐘舵��">
+                                                    <el-option label="寰呮寚娲�" :value="0"></el-option>
+                                                    <el-option label="宸叉寚娲�" :value="1"></el-option>
+                                                    <el-option label="宸插鐞�" :value="2"></el-option>
+                                                </el-select>
+                                                <el-button type="primary" @click="getWorkOrderList">鏌ヨ</el-button>
+                                                <el-button @click="clear">娓呯┖</el-button>
+                                            </div>
+                                            <el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('鏂板缓宸ュ崟')">鏂板宸ュ崟</el-button>
+                                        </div>
+                                        <el-table
+                                            :data="tableData"
+                                            border
+                                            v-lading="loading"
+                                            style="width: 100%">
+                                            <el-table-column
+                                                prop="categoryName"
+                                                label="宸ュ崟鍒嗙被">
+                                            </el-table-column>
+                                            <el-table-column
+                                                label="鎶ヤ慨鍖哄煙">
+                                                <template v-slot="scope">
+                                                <span>{{ scope.row.buildingName }} / {{ scope.row.areaType == 0 ? scope.row.roomNum : scope.row.floorName
+                                                  }}</span>
+                                                </template>
+                                            </el-table-column>
+                                            <el-table-column
+                                                prop="creatorName"
+                                                label="涓婃姤浜�">
+                                            </el-table-column>
+                                            <el-table-column
+                                                prop="createDate"
+                                                label="涓婃姤鏃堕棿">
+                                            </el-table-column>
+                                            <el-table-column
+                                                prop="dealUserName"
+                                                label="澶勭悊浜�">
+                                            </el-table-column>
+                                            <el-table-column
+                                                label="宸ュ崟鐘舵��">
+                                                <template slot-scope="{row}">
+                                                    <span v-if="row.dealStatus === 0">寰呮寚娲�</span>
+                                                    <span v-if="row.dealStatus === 1">宸叉寚娲�</span>
+                                                    <span v-if="row.dealStatus === 2">宸插鐞�</span>
+                                                </template>
+                                            </el-table-column>
+                                            <el-table-column
+                                                label="鎿嶄綔">
+                                                <template slot-scope="{row}">
+                                                    <el-button type="text" @click="handleDetail(row)">鏌ョ湅璇︽儏</el-button>
+                                                </template>
+                                            </el-table-column>
+                                        </el-table>
+                                        <div class="xm_table_f">
+                                            <el-pagination
+                                                @size-change="handleSizeChange"
+                                                @current-change="handleCurrentChange"
+                                                :current-page="page"
+                                                :page-sizes="[10, 20, 30, 40]"
+                                                :page-size="pageTotal"
+                                                layout="total, sizes, prev, pager, next, jumper"
+                                                :total="total">
+                                            </el-pagination>
+                                        </div>
+                                    </div>
+                                </el-card>
+                            </div>
+                        </el-tab-pane>
+                        <el-tab-pane label="璁惧淇℃伅" name="third" v-if="[0,1,2,3].includes(lv)">
                             <div class="xm">
                                 <div class="xm_chat">
                                     <el-card class="xm_chat_row">
@@ -507,122 +565,55 @@
                                     <div class="xm_table">
                                         <div class="xm_table_search">
                                             <div class="xm_table_search_left">
-                                                <el-input v-model="input" placeholder="璇疯緭鍏ヨ澶囧悕绉�/缂栫爜" style="width: 200px; margin-right: 15px;"></el-input>
-                                                <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="璁惧鐘舵��">
-                                                    <el-option
-                                                        v-for="item in options"
-                                                        :key="item.value"
-                                                        :label="item.label"
-                                                        :value="item.value">
-                                                    </el-option>
+                                                <el-input v-model="form.name" placeholder="璇疯緭鍏ヨ澶囧悕绉�/缂栫爜" style="width: 150px; margin-right: 15px;"></el-input>
+                                                <el-select v-model="form.status" style="width: 150px; margin-right: 15px;" placeholder="璁惧鐘舵��">
+                                                    <el-option label="姝e父" :value="0"></el-option>
+                                                    <el-option label="鎹熷潖" :value="1"></el-option>
+                                                    <el-option label="鎶ュ簾" :value="2"></el-option>
                                                 </el-select>
-                                                <el-button type="primary">鏌ヨ</el-button>
-                                                <el-button>娓呯┖</el-button>
+                                                <el-button type="primary" @click="getDevicePage">鏌ヨ</el-button>
+                                                <el-button @click="clear">娓呯┖</el-button>
                                             </div>
-                                            <el-button type="primary">鏂板</el-button>
+                                            <el-button type="primary" @click="handleEdit">鏂板</el-button>
                                         </div>
                                         <el-table
                                             :data="tableData"
                                             border
+                                            v-loading="loading"
                                             style="width: 100%">
                                             <el-table-column
-                                                prop="date"
-                                                label="宸ュ崟鍒嗙被">
+                                                label="璁惧缂栫爜">
+                                                <template slot-scope="{row}">
+                                                    <el-button type="text">{{row.code}}</el-button>
+                                                </template>
                                             </el-table-column>
                                             <el-table-column
                                                 prop="name"
-                                                label="鎶ヤ慨鍖哄煙">
+                                                label="璁惧鍚嶇О">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="涓婃姤浜�">
+                                                prop="categoryName"
+                                                label="璁惧鍒嗙被">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="涓婃姤鏃堕棿">
+                                                prop="modelNo"
+                                                label="璁惧鍨嬪彿">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="澶勭悊浜�">
+                                                prop="realName"
+                                                label="璁惧绠$悊鍛�">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="宸ュ崟鐘舵��">
+                                                prop="supplier"
+                                                label="璁惧渚涘簲鍟�">
                                             </el-table-column>
                                             <el-table-column
-                                                prop="address"
-                                                label="鎿嶄綔">
-                                            </el-table-column>
-                                        </el-table>
-                                        <div class="xm_table_f">
-                                            <el-pagination
-                                                @size-change="handleSizeChange"
-                                                @current-change="handleCurrentChange"
-                                                :current-page="page"
-                                                :page-sizes="[10, 20, 30, 40]"
-                                                :page-size="pageTotal"
-                                                layout="total, sizes, prev, pager, next, jumper"
-                                                :total="total">
-                                            </el-pagination>
-                                        </div>
-                                    </div>
-                                </el-card>
-                            </div>
-                        </el-tab-pane>
-                        <el-tab-pane label="璧勪骇淇℃伅" name="fourth">
-                            <div class="xm">
-                                <el-card>
-                                    <div slot="header" class="clearfix">
-                                        <span>璧勪骇娓呭崟</span>
-                                    </div>
-                                    <div class="xm_table">
-                                        <div class="xm_table_search">
-                                            <div class="xm_table_search_left">
-                                                <el-input v-model="input" placeholder="璇疯緭鍏ヨ祫浜у悕绉�/缂栫爜" style="width: 200px; margin-right: 15px;"></el-input>
-                                                <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="璧勪骇鍒嗙被">
-                                                    <el-option
-                                                        v-for="item in options"
-                                                        :key="item.value"
-                                                        :label="item.label"
-                                                        :value="item.value">
-                                                    </el-option>
-                                                </el-select>
-                                                <el-button type="primary">鏌ヨ</el-button>
-                                                <el-button>娓呯┖</el-button>
-                                            </div>
-                                            <el-button type="primary">鏂板</el-button>
-                                        </div>
-                                        <el-table
-                                            :data="tableData"
-                                            border
-                                            style="width: 100%">
-                                            <el-table-column
-                                                prop="date"
-                                                label="璧勪骇缂栫爜">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="name"
-                                                label="璧勪骇鍚嶇О">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="鏉$爜">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="鍝佺墝">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="瑙勬牸鍨嬪彿">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="鍗曚綅">
-                                            </el-table-column>
-                                            <el-table-column
-                                                prop="address"
-                                                label="搴撳瓨鏁伴噺">
+                                                label="璁惧鐘舵��">
+                                                <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>
                                         <div class="xm_table_f">
@@ -644,56 +635,37 @@
                 </div>
             </div>
         </div>
+        <!--    鏂板缓宸ュ崟    -->
+        <OperaYwWorkorderWindow ref="operaYwWorkorderWindow" />
+        <!--    宸ュ崟璇︽儏    -->
+        <Detail v-if="showDetail" ref="DetailRef" @close="showDetail = false" />
+        <!--    鏂板缓璁惧    -->
+        <Edit v-if="showEdit1" ref="EditRef" @success="getDevicePage" @close="showEdit1 = false" />
     </div>
 </template>
 
 <script>
   import * as echarts from 'echarts';
+  import { tree, getProjectById } from '@/api/project/ywProject'
+  import { getRoomContract, getRoomStatusList, detailById as roomDetailById } from '@/api/project/ywRoom'
+  import { fetchList } from '@/api/contract'
+  import OperaYwWorkorderWindow from '../workorder/components/OperaYwWorkorderWindow'
+  import { fetchList as getCateList } from '@/api/business/category'
+  import { getDataVO, fetchList as workderList } from '@/api/workorder/ywWorkorder'
+  import { detailById } from '@/api/project/ywBuilding'
+  import Detail from '../workorder/components/detail'
+  import { fetchList as devicePage, getDeviceCateData, getDeviceStatus } from '@/api/Inspection/device'
+  import Edit from '../operation/components/deviceEdit'
   export default {
     name: 'index',
+    components: { OperaYwWorkorderWindow, Detail, Edit },
     data() {
       return {
-        input: '',
+        showDetail: false,
+        showEdit1: false,
+        filterText: '',
         tableData: [],
-        data: [{
-          label: '涓�绾� 1',
-          children: [{
-            label: '浜岀骇 1-1',
-            children: [{
-              label: '涓夌骇 1-1-1'
-            }]
-          }]
-        }, {
-          label: '涓�绾� 2',
-          children: [{
-            label: '浜岀骇 2-1',
-            children: [{
-              label: '涓夌骇 2-1-1'
-            }]
-          }, {
-            label: '浜岀骇 2-2',
-            children: [{
-              label: '涓夌骇 2-2-1'
-            }]
-          }]
-        }, {
-          label: '涓�绾� 3',
-          children: [{
-            label: '浜岀骇 3-1',
-            children: [{
-              label: '涓夌骇 3-1-1'
-            }]
-          }, {
-            label: '浜岀骇 3-2',
-            children: [{
-              label: '涓夌骇 3-2-1'
-            }]
-          }]
-        }],
-        defaultProps: {
-          children: 'children',
-          label: 'label'
-        },
+        houseList: [],
         activeName: 'first',
         total: 0,
         pageTotal: 10,
@@ -701,66 +673,357 @@
         options: [{
           value: '閫夐」1',
           label: '榛勯噾绯�'
-        }, {
-          value: '閫夐」2',
-          label: '鍙岀毊濂�'
-        }, {
-          value: '閫夐」3',
-          label: '铓典粩鐓�'
-        }, {
-          value: '閫夐」4',
-          label: '榫欓』闈�'
-        }, {
-          value: '閫夐」5',
-          label: '鍖椾含鐑ら腑'
         }],
-        value: ''
+        value: '',
+        form: {
+          name: '',
+          status: '',
+          project: '',
+          buildingId: '',
+          floorId: '',
+          roomId: '',
+          code: '',
+          areaIds: [],
+          cateId: '',
+          dealStatus: ''
+        },
+        title: '',
+        cateList: [],
+        deviceList: [],
+        categaryList: [],
+        roomStatus: [],
+        projectInfo: {},
+        projectNums: {},
+        workOrderNums: {},
+        buildingInfo: {},
+        roomInfo: {},
+        loading: false,
+        lv: 0,
+        leaseStatus: ''
       }
     },
     created () {
-      this.$nextTick(() => {
-        this.reand()
-        this.reand1()
-      })
+      this.getHouseTree()
+    },
+    watch: {
+      filterText(val) {
+        this.$refs.tree.filter(val);
+      }
     },
     methods: {
+      nodeClick(e) {
+        this.tableData = []
+        this.pageSize = 10
+        this.page = 1
+        this.form.project = ''
+        this.form.buildingId = ''
+        this.form.floorId = ''
+        this.form.roomId = ''
+        this.leaseStatus = ''
+        this.lv = e.lv
+        this.title = e.name
+        if (e.lv === 0) {
+          this.activeName = 'first'
+          this.form.project = e.id
+          this.getProjectByIds()
+        } else if (e.lv === 1) {
+          this.activeName = 'house'
+          this.form.buildingId = e.id
+          this.getRoomStatusLists()
+        } else if (e.lv === 2) {
+          this.activeName = 'house'
+          this.form.floorId = e.id
+          this.getRoomStatusLists()
+        } else if (e.lv === 3) {
+          this.activeName = 'houseinfo'
+          this.form.roomId = e.id
+          this.leaseStatus = e.leaseStatus
+          this.roomDetailByIds()
+        }
+      },
+      // 鎼滅储鏍�
+      filterNode(value, data) {
+        if (!value) return true;
+        return data.name.indexOf(value) !== -1;
+      },
+      // 鍒ゆ柇鎴挎�佸搴�
+      ifWidth(num) {
+        if (num >= 0 && num <= 100) {
+          return '150px'
+        } else if (num >= 101 && num <= 200) {
+          return '180px'
+        } else if (num >= 201 && num <= 300) {
+          return '210px'
+        } else if (num >= 301 && num <= 400) {
+          return '240px'
+        } else if (num >= 401 && num <= 500) {
+          return '270px'
+        } else {
+          return '300px'
+        }
+      },
+      // 鍒ゆ柇鎴挎�佽儗鏅壊
+      ifBackground(type) {
+        if (type === 0) {
+          return '#F7F7F7'
+        } else if (type === 1) {
+          return 'rgba(0,186,146,0.14)'
+        } else if (type === 2) {
+          return 'rgba(255,158,0,0.14)'
+        }
+      },
+      // 鑾峰彇鎴挎簮璇︽儏
+      roomDetailByIds() {
+        roomDetailById(this.form.roomId)
+            .then(res => {
+              this.roomInfo = res
+            })
+      },
+      // 鑾峰彇妤煎畤璇︽儏
+      getDetailById() {
+        detailById(this.form.buildingId)
+            .then(res => {
+              console.log(res)
+              this.buildingInfo = res
+            })
+      },
+      // 鎴挎�佹暟鎹�
+      getRoomStatusLists() {
+        getRoomStatusList({
+          buildingId: this.form.buildingId,
+          floor: this.form.floorId
+        }).then(res => {
+          this.roomStatus = res
+        })
+      },
+      // 鑾峰彇璁惧鐘舵��
+      getDevice() {
+        getDeviceStatus({
+          projectId: this.form.project,
+          buildingId: this.form.buildingId,
+          floorId: this.form.floorId,
+          roomId: this.form.roomId
+        })
+          .then(res => {
+            this.$nextTick(() => {
+              this.deviceList = [
+                { value: res.workAmount || 0, name: '姝e父' },
+                { value: res.exceptionAmount || 0, name: '寮傚父' },
+                { value: res.errAmount || 0, name: '鎶ュ簾' }
+              ]
+              this.reand()
+            })
+          })
+      },
+      // 璁惧鏁伴噺鍒嗗竷缁熻
+      getDeviceCateDatas() {
+        getDeviceCateData({
+          projectId: this.form.project,
+          buildingId: this.form.buildingId,
+          floorId: this.form.floorId,
+          roomId: this.form.roomId
+        }).then(res => {
+          this.categaryList = res
+          this.$nextTick(() => {
+            this.reand1()
+          })
+        })
+      },
+      handleEdit(row) {
+        this.showEdit1 = true
+        this.$nextTick(() => {
+          this.$refs.EditRef.isShowModal = true
+        })
+      },
+      // 鑾峰彇璁惧鍒嗛〉
+      getDevicePage() {
+        this.loading = true
+        devicePage({
+          capacity: this.pageTotal,
+          page: this.page,
+          model: {
+            projectId: this.form.project,
+            buildingId: this.form.buildingId,
+            floorId: this.form.floorId,
+            roomId: this.form.roomId,
+            status: this.form.status,
+            name: this.form.name
+          }
+        }).then(res => {
+          this.tableData = res.records
+          this.total = res.total
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      handleDetail(row) {
+        this.showDetail = true
+        this.$nextTick(() => {
+          this.$refs.DetailRef.visible = true
+          this.$refs.DetailRef.id = row.id
+          this.$refs.DetailRef.getDetail()
+        })
+      },
+      // 鑾峰彇宸ュ崟鍒楄〃
+      getWorkOrderList() {
+        this.loading = true
+        workderList({
+          capacity: this.pageTotal,
+          page: this.page,
+          model: {
+            projectId: this.form.project,
+            buildingId: this.form.buildingId,
+            floorId: this.form.floorId,
+            roomId: this.form.roomId,
+            dealStatus: this.form.dealStatus,
+            cateId: this.form.cateId
+          }
+        }).then(res => {
+          this.tableData = res.records
+          this.total = res.total
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      getCate() {
+        getCateList({
+          model: { type: 3 },
+          capacity: 1000,
+          page: 1,
+        }).then(res => {
+          this.cateList = res.records || []
+        })
+      },
+      // 鑾峰彇椤圭洰淇℃伅
+      getProjectByIds() {
+        getProjectById(this.form.project)
+            .then(res => {
+              this.projectInfo = res
+            })
+        this.getGK()
+        this.getFetchList()
+      },
+      //椤圭洰姒傚喌
+      getGK() {
+        getRoomContract({
+          projectId: this.form.project,
+          buildingId: this.form.buildingId,
+          floorId: this.form.floorId,
+          roomId: this.form.roomId,
+        }).then(res => {
+          this.projectNums = res
+        })
+      },
+      changeSel(e) {
+        if (e && e.length == 2) {
+          this.$set(this.form, 'cateId', e[1])
+        } else {
+          this.$set(this.form, 'cateId', '')
+        }
+      },
+      // 鑾峰彇宸ュ崟鏁伴噺
+      getDataVOs() {
+        let queryType = ''
+        let queryId = ''
+        if (this.lv === 0) {
+          queryType = 1
+          queryId = this.form.project
+        } else if (this.lv === 2) {
+          queryType = 2
+          queryId = this.form.floorId
+        } else if (this.lv === 3) {
+          queryType = 3
+          queryId = this.form.roomId
+        }
+        getDataVO({
+          queryType,
+          queryId
+        }).then(res => {
+          this.workOrderNums = res
+        })
+      },
+      clear() {
+        this.form.code = ''
+        this.form.name = ''
+        this.form.status = ''
+        this.form.dealStatus = ''
+        this.form.cateId = ''
+        this.form.areaIds = []
+        if (['first', 'louyu', 'houseinfo'].includes(this.activeName)) {
+          this.getFetchList()
+        } else if (this.activeName === 'second') {
+          this.getWorkOrderList()
+        } else if (this.activeName === 'third') {
+          this.getDevicePage()
+        }
+      },
+      // 鑾峰彇褰撳墠鍦ㄧ鍚堝悓
+      getFetchList() {
+        this.loading = true
+        fetchList({
+          capacity: this.pageSize,
+          page: this.page,
+          model: {
+            projectId: this.form.project,
+            buildingId: this.form.buildingId,
+            floorId: this.form.floorId,
+            roomId: this.form.roomId,
+            code: this.form.code
+          }
+        }).then(res => {
+          this.tableData = res.records
+          this.total = res.total
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      getHouseTree() {
+        tree({})
+          .then(res => {
+            this.addParamToArray(res)
+            this.form.project = res[0].id
+            this.title = res[0].name
+            this.houseList = res
+            this.getProjectByIds()
+          })
+      },
+      addParamToArray(arr) {
+        for (let i = 0; i < arr.length; i++) {
+          const currentItem = arr[i].projectDataVOList
+          arr[i].idd = arr[i].lv + '-' + arr[i].id
+          if (currentItem.length > 0) {
+            this.addParamToArray(currentItem)
+          }
+        }
+      },
       reand() {
         var chartDom = document.getElementById('chat1');
         var myChart = echarts.init(chartDom);
         var option;
         option = {
+          title: {
+            text: '璁惧鐘舵��'
+          },
           tooltip: {
             trigger: 'item'
           },
           legend: {
-            top: '5%',
-            left: 'center'
+            left: 'right',
+            top: 'middle',
+            width: '80'
           },
           series: [
             {
-              name: 'Access From',
+              name: '璁惧鐘舵��',
               type: 'pie',
               radius: ['40%', '80%'],
-              avoidLabelOverlap: false,
               label: {
-                show: false,
-                position: 'center'
+                show: true,
+                position: 'center',
+                fontWeight: 'bold',
+                fontSize: 22
               },
-              emphasis: {
-                label: {
-                  show: true,
-                  fontSize: 40,
-                  fontWeight: 'bold'
-                }
-              },
-              labelLine: {
-                show: false
-              },
-              data: [
-                { value: 1048, name: '姝e父' },
-                { value: 735, name: '寮傚父' },
-                { value: 580, name: '鎶ュ簾' }
-              ]
+              data: this.deviceList
             }
           ]
         };
@@ -770,7 +1033,6 @@
         var chartDom = document.getElementById('chat2');
         var myChart = echarts.init(chartDom);
         var option;
-        // There should not be negative values in rawData
         const rawData = [
           [100, 302, 301, 334, 390, 330, 320],
           [320, 132, 101, 134, 90, 230, 210],
@@ -786,12 +1048,6 @@
           }
           totalData.push(sum);
         }
-        const grid = {
-          left: 100,
-          right: 100,
-          top: 50,
-          bottom: 50
-        };
         const series = [
           'Direct',
           'Mail Ad',
@@ -804,43 +1060,100 @@
             type: 'bar',
             stack: 'total',
             barWidth: '60%',
-            label: {
-              show: true,
-              formatter: (params) => Math.round(params.value * 1000) / 10 + '%'
-            },
             data: rawData[sid].map((d, did) =>
               totalData[did] <= 0 ? 0 : d / totalData[did]
             )
           };
         });
+        let seriesArr = this.categaryList.map(item => {
+          return {
+            name: item.cateName,
+            type: 'bar',
+            stack: 'total',
+            barWidth: '60%',
+            data: item.ywDeviceCateDataVOList.map((child) =>
+              child.deviceAmount
+            )
+          }
+        })
+        let xAxisData = this.categaryList.map(item => item.cateName)
+        console.log(series)
+        console.log(seriesArr)
+        console.log(xAxisData)
         option = {
-          legend: {
-            selectedMode: false
+          title: {
+            text: '璁惧鏁伴噺鍒嗙被缁熻'
           },
-          grid,
+          grid: {
+            left: 50,
+            right: 50,
+            top: 50,
+            bottom: 50
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              type: 'shadow'
+            }
+          },
           yAxis: {
             type: 'value'
           },
           xAxis: {
             type: 'category',
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+            data: xAxisData
           },
-          series
+          series: seriesArr
         };
 
         option && myChart.setOption(option);
       },
       handleCurrentChange(page) {
         this.page = page
+        if (['first', 'louyu', 'houseinfo'].includes(this.activeName)) {
+          this.getFetchList()
+        } else if (this.activeName === 'second') {
+          this.getWorkOrderList()
+        } else if (tab.name === 'third') {
+          this.getDevicePage()
+        }
       },
       handleSizeChange(pageTotal) {
         this.pageTotal = pageTotal
+        if (['first', 'louyu', 'houseinfo'].includes(this.activeName)) {
+          this.getFetchList()
+        } else if (this.activeName === 'second') {
+          this.getWorkOrderList()
+        } else if (tab.name === 'third') {
+          this.getDevicePage()
+        }
       },
-      handleNodeClick(data) {
-        console.log(data);
-      },
-      handleClick(tab, event) {
-        console.log(tab, event);
+      handleClick(tab) {
+        this.page = 1
+        this.pageSize = 10
+        this.activeName = tab.name
+        this.tableData = []
+        if (tab.name === 'first') {
+          this.getFetchList()
+        } else if (tab.name === 'second') {
+          this.getDataVOs()
+          this.getCate()
+          this.getWorkOrderList()
+        } else if (tab.name === 'third') {
+          this.getDevicePage()
+          this.getDevice()
+          this.getDeviceCateDatas()
+        } else if (tab.name === 'louyu') {
+          this.getGK()
+          this.getFetchList()
+          this.getDetailById()
+        } else if (tab.name === 'house') {
+          this.getRoomStatusLists()
+        } else if (tab.name === 'houseinfo') {
+          this.roomDetailByIds()
+        } else if (tab.name === 'project') {
+          this.getFetchList()
+        }
       }
     }
   }
@@ -866,6 +1179,10 @@
                 display: flex;
                 flex-direction: column;
                 background: #ffffff;
+                ::v-deep .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{
+                    background-color: #f0f7ff;
+                    color: rgb(65, 107, 255)
+                }
             }
             .right {
                 flex: 1;
@@ -875,10 +1192,12 @@
                     width: 100%;
                     padding: 20px;
                     box-sizing: border-box;
+                    display: flex;
+                    align-items: center;
+                    background: #ffffff;
                     font-size: 16px;
                     font-weight: bold;
                     color: black;
-                    background: #ffffff;
                 }
                 .right_cate {
                     width: 100%;
@@ -893,7 +1212,6 @@
                             width: 100%;
                             display: flex;
                             flex-direction: column;
-                            align-items: self-end;
                             .xm_house_list {
                                 width: 100%;
                                 display: flex;
@@ -903,12 +1221,12 @@
                                     flex-shrink: 0;
                                     width: 100px;
                                     display: flex;
-                                    margin-right: 20px;
+                                    margin-right: 15px;
                                     flex-direction: column;
                                     .xm_house_list_left_row {
                                         width: 100px;
                                         height: 100px;
-                                        background: rgba(242, 242, 242, 1);
+                                        background: #F4F7FC;
                                         padding: 20px 0;
                                         box-sizing: border-box;
                                         margin-bottom: 20px;
@@ -921,56 +1239,66 @@
                                         }
                                         span {
                                             &:nth-child(1) {
+                                                font-weight: 500;
                                                 font-size: 18px;
-                                                color: #333333;
-                                                font-weight: 400;
+                                                color: #000000;
                                             }
                                             &:nth-child(2) {
-                                                font-size: 12px;
-                                                color: #929292;
+                                                font-weight: 400;
+                                                font-size: 14px;
+                                                color: #999999;
+                                                margin-top: 10px;
                                             }
                                         }
                                     }
                                 }
                                 .xm_house_list_right {
-                                    width: calc(100% - 130px);
                                     display: flex;
-                                    flex-direction: column;
-                                    .item {
-                                        width: calc(100% - 130px);
+                                    align-items: center;
+                                    .xm_house_list_right_row {
+                                        height: 100px;
+                                        padding: 12px 15px;
+                                        box-sizing: border-box;
                                         display: flex;
-                                        align-items: center;
-                                        margin-bottom: 20px;
+                                        flex-direction: column;
+                                        justify-content: space-between;
+                                        margin-right: 10px;
                                         &:last-child {
-                                            margin-bottom: 0;
+                                            margin: 0 !important;
                                         }
-                                        .xm_house_list_right_row {
-                                            height: 100px;
-                                            width: 300px;
-                                            background: rgba(198, 224, 167, 0.34509803921568627);
-                                            padding: 10px 0;
-                                            box-sizing: border-box;
+                                        .ft {
                                             display: flex;
                                             align-items: center;
-                                            flex-direction: column;
-                                            justify-content: space-between;
                                             span {
-                                                font-size: 14px;
-                                                color: #000000;
+                                                &:nth-child(1) {
+                                                    font-weight: 500;
+                                                    font-size: 18px;
+                                                    color: #000000;
+                                                }
+                                                &:nth-child(2) {
+                                                    font-weight: 400;
+                                                    font-size: 14px;
+                                                    color: #999999;
+                                                }
                                             }
-                                            .xm_house_list_right_row_info {
-                                                display: flex;
-                                                flex-direction: column;
-                                                span {
-                                                    &:nth-child(1) {
-                                                        color: #000000;
-                                                        font-size: 14px;
-                                                    }
-                                                    &:nth-child(2) {
-                                                        color: #A5A5A5;
-                                                        font-size: 12px;
-                                                        margin-top: 3px;
-                                                    }
+                                        }
+                                        .xm_house_list_right_row_day {
+                                            font-weight: 400;
+                                            font-size: 13px;
+                                            color: #999999;
+                                        }
+                                        .xm_house_list_right_row_info {
+                                            display: flex;
+                                            flex-direction: column;
+                                            span {
+                                                &:nth-child(1) {
+                                                    color: #000000;
+                                                    font-size: 14px;
+                                                }
+                                                &:nth-child(2) {
+                                                    color: #A5A5A5;
+                                                    font-size: 12px;
+                                                    margin-top: 3px;
                                                 }
                                             }
                                         }
@@ -981,18 +1309,20 @@
                                 display: flex;
                                 align-items: center;
                                 .xm_house_tips_row {
-                                    margin-left: 30px;
                                     display: flex;
                                     align-items: center;
+                                    margin-right: 30px;
                                     .xm_house_tips_row_d {
-                                        width: 10px;
-                                        height: 10px;
+                                        width: 20px;
+                                        height: 20px;
                                         background: orange;
-                                        margin-right: 5px;
+                                        margin-right: 8px;
+                                        border-radius: 2px;
                                     }
                                     span {
-                                        font-size: 16px;
-                                        color: black;
+                                        font-weight: 400;
+                                        font-size: 13px;
+                                        color: #333333;
                                     }
                                 }
                             }
diff --git a/admin/src/views/stock/asset.vue b/admin/src/views/stock/asset.vue
index d3880e6..8f78846 100644
--- a/admin/src/views/stock/asset.vue
+++ b/admin/src/views/stock/asset.vue
@@ -5,16 +5,27 @@
       <el-button type="primary" @click="$refs.newWarehouse.open('鏂板缓浠撳簱鍚嶇О')">鏂板</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="platformName" label="浠撳簱鍚嶇О" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="platformGroupName" label="璐熻矗浜�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeFront" label="浠撳簱浣嶇疆" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeBack" label="鎺掑簭鐮�" min-width="110" show-overflow-tooltip />
-      <el-table-column prop="param1" label="澶囨敞" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="param2" label="鐘舵��" min-width="90" show-overflow-tooltip />
+      <el-table-column prop="name" label="浠撳簱鍚嶇О" min-width="120" show-overflow-tooltip />
+      <el-table-column prop="userName" label="璐熻矗浜�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="position" label="浠撳簱浣嶇疆" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="110" show-overflow-tooltip />
+      <el-table-column prop="remark" label="澶囨敞" min-width="120" show-overflow-tooltip />
+      <el-table-column label="鐘舵��" min-width="90">
+        <template v-slot="{ row }">
+          <el-switch
+            v-model="row.status"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            @change="changeStatus($event, row)"
+            :active-value="0"
+            :inactive-value="1">
+          </el-switch>
+        </template>
+      </el-table-column>
       <el-table-column prop="workTime" label="鎿嶄綔" min-width="100" show-overflow-tooltip>
         <template v-slot="{ row }">
-          <span class="primaryColor pointer">鏌ョ湅璇︽儏</span>
-          <span class="red pointer">鍒犻櫎</span>
+          <el-button type="text" @click="$refs.newWarehouse.open('鏂板缓浠撳簱鍚嶇О', row)">缂栬緫</el-button>
+          <el-button type="text" @click="dele(row.id)">鍒犻櫎</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -32,7 +43,7 @@
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+import { fetchList, deleteById, updateStatusById } from '@/api/ywWarehouse'
 export default {
   components: {
     Pagination,
@@ -53,15 +64,18 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'carCodeFront',
+            filed: 'name',
             type: 'input',
             label: '浠撳簱鍚嶇О',
           },
           {
-            filed: 'platformGroupId',
+            filed: 'status',
             type: 'select',
             label: '浠撳簱鐘舵��',
-            options: []
+            options: [
+              { value: 0, label: '鍚敤' },
+              { value: 1, label: '绂佺敤' }
+            ]
           }
         ],
         online: true
@@ -69,50 +83,21 @@
     }
   },
   created() {
-    // this.getList()
-    // this.getGroupList()
+    this.getList()
   },
   methods: {
-    handleSub() {
-      this.$refs.ruleForm.validate((valid) => {
-        if (valid) {
-          alert('submit!')
-        }
-      })
-    },
-    handleEx() { },
-    getGroupList() {
-      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
-        this.queryFormConfig.formItems[1].options = res.map(i => {
-          return {
-            value: i.id,
-            label: i.name
-          }
-        })
-        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '鍏ㄩ儴鏈堝彴缁�' })
-      })
-    },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      platformLogPage({
+      fetchList({
         model: {
-          ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          ...filters
         },
-        sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
         page: page || pagination.page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
-        this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
-        })
         this.pagination.total = res.total || 0
       }, () => {
         this.loading = false
@@ -124,6 +109,26 @@
       this.pagination.page = 1
       this.getList()
     },
+    changeStatus(e, row) {
+      updateStatusById({ id: row.id, status: e })
+        .then(res => {
+          this.getList()
+        })
+    },
+    dele(id) {
+      this.$confirm('鏄惁纭鍒犻櫎璇ヤ粨搴�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteById(id)
+          .then(res => {
+            this.getList()
+          })
+      }).catch(() => {
+      
+      });
+    },
     handleSizeChange(capacity) {
       this.pagination.pageSize = capacity
       this.getList()
diff --git a/admin/src/views/stock/assetCate.vue b/admin/src/views/stock/assetCate.vue
index 375678f..cfa31b6 100644
--- a/admin/src/views/stock/assetCate.vue
+++ b/admin/src/views/stock/assetCate.vue
@@ -1,16 +1,13 @@
 <template>
   <TableLayout>
     <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
-            v-permissions="['business:category:create']">鏂板缓</el-button></li>
-        <li v-permissions="['business:category:exportExcel']"><el-button type="primary"
-            @click="exportExcel">瀵煎嚭</el-button></li>
+      <ul class="toolbar">
+        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="exportExcel">瀵煎嚭</el-button></li>
       </ul>
       <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
         :data="dataList" stripe @selection-change="handleSelectionChange">
         <el-table-column prop="name" label="璧勪骇鍒嗙被" min-width="100px"></el-table-column>
-        <!-- <el-table-column prop="parentName" label="鎵�灞炲垎绫�" min-width="100px"></el-table-column> -->
         <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
         <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])" label="鎿嶄綔"
           min-width="120" fixed="right">
@@ -46,6 +43,9 @@
       filters: {
         parentId: ''
       },
+      form: {
+        type: 7
+      },
       isShowEdit: false,
       loading: false,
       pagination: {
@@ -58,7 +58,7 @@
   },
   created() {
     this.config({
-      module: '杞﹁締淇℃伅琛�',
+      module: '鍒嗙被淇℃伅琛�',
       api: '/business/category',
       'field.id': 'id',
       'field.main': 'id'
@@ -93,7 +93,7 @@
       const { pagination, filters } = this
       this.loading = true
       fetchList({
-        model: { ...filters, type: 5 },
+        model: { ...filters, type: 7 },
         capacity: pagination.pageSize,
         page: pagination.page,
       }).then(res => {
diff --git a/admin/src/views/stock/assetList.vue b/admin/src/views/stock/assetList.vue
index b3b5894..1b28a25 100644
--- a/admin/src/views/stock/assetList.vue
+++ b/admin/src/views/stock/assetList.vue
@@ -7,19 +7,30 @@
       <el-button>瀵煎叆</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="platformName" label="璧勪骇缂栫爜" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="platformGroupName" label="璧勪骇鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeFront" label="鏉$爜" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeBack" label="鍝佺墝" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="param1" label="瑙勬牸鍨嬪彿" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="param2" label="鍗曚綅" min-width="70" show-overflow-tooltip />
-      <el-table-column prop="param2" label="瀹夊叏搴撳瓨(涓嬮檺)" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="param2" label="瀹夊叏搴撳瓨(涓婇檺)" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="param2" label="鐘舵��" min-width="80" 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="qrcode" label="鏉$爜" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="brand" label="鍝佺墝" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="attr" label="瑙勬牸鍨嬪彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="unitName" label="鍗曚綅" min-width="70" show-overflow-tooltip />
+      <el-table-column prop="minStock" label="瀹夊叏搴撳瓨(涓嬮檺)" min-width="120" show-overflow-tooltip />
+      <el-table-column prop="maxStock" label="瀹夊叏搴撳瓨(涓婇檺)" min-width="120" show-overflow-tooltip />
+      <el-table-column label="鐘舵��" min-width="80">
+        <template v-slot="{ row }">
+          <el-switch
+            v-model="row.status"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            @change="changeStatus($event, row)"
+            :active-value="0"
+            :inactive-value="1">
+          </el-switch>
+        </template>
+      </el-table-column>
       <el-table-column prop="workTime" label="鎿嶄綔" min-width="100" show-overflow-tooltip>
         <template v-slot="{ row }">
-          <span class="primaryColor pointer">缂栬緫</span>
-          <span class="red pointer">鍒犻櫎</span>
+          <el-button type="text" @click="$refs.newMaterial.open('缂栬緫鐗╂枡', {...row, cateArr: [row.parentCateId, row.cateId] })">缂栬緫</el-button>
+          <el-button type="text" @click="dele(row.id)">鍒犻櫎</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -37,7 +48,7 @@
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+import { fetchList, updateStatus, deleteById } from '@/api/ywMaterial'
 export default {
   components: {
     Pagination,
@@ -58,77 +69,61 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'carCodeFront',
+            filed: 'code',
             type: 'input',
-            label: '璧勪骇淇℃伅',
-            placeholder: '璇疯緭鍏ヨ祫浜у悕绉�/缂栫爜'
+            label: '鍚嶇О/缂栫爜',
+            placeholder: '璇疯緭鍏ュ悕绉�/缂栫爜'
           },
           {
-            filed: 'carCodeFront',
+            filed: 'attr',
             type: 'input',
             label: '瑙勬牸鍨嬪彿',
-          },
-          {
-            filed: 'platformGroupId',
-            type: 'select',
-            label: '鎵�灞為」鐩�',
-            options: []
           }
-        ],
-        online: true
+        ]
       }
     }
   },
   created() {
-    // this.getList()
-    // this.getGroupList()
+    this.getList()
   },
   methods: {
-    handleSub() {
-      this.$refs.ruleForm.validate((valid) => {
-        if (valid) {
-          alert('submit!')
-        }
-      })
-    },
-    handleEx() { },
-    getGroupList() {
-      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
-        this.queryFormConfig.formItems[1].options = res.map(i => {
-          return {
-            value: i.id,
-            label: i.name
-          }
-        })
-        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '鍏ㄩ儴鏈堝彴缁�' })
-      })
-    },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      platformLogPage({
+      fetchList({
         model: {
-          ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          ...filters
         },
-        sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
         page: page || pagination.page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
-        this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
-        })
         this.pagination.total = res.total || 0
       }, () => {
         this.loading = false
       })
     },
+    dele(id) {
+      this.$confirm('鏄惁纭鍒犻櫎璇ョ墿鏂�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteById(id)
+          .then(res => {
+            this.getList()
+          })
+      }).catch(() => {
+      
+      });
+    },
+    changeStatus(e, row) {
+      updateStatus({ id: row.id, status: e })
+        .then(res => {
+          this.getList()
+        })
+    },
     clear() {
       this.filters = {}
       this.pagination.pageSize = 10
diff --git a/admin/src/views/stock/check.vue b/admin/src/views/stock/check.vue
index eaebf2d..49018c2 100644
--- a/admin/src/views/stock/check.vue
+++ b/admin/src/views/stock/check.vue
@@ -2,41 +2,54 @@
   <div class="main_app">
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <div class="mt20">
-      <el-button type="primary" @click="handleEx()" v-permissions="['business:ywpatrolline:create']">娣诲姞</el-button>
+      <el-button type="primary" @click="$refs.newInventory.open('鏂板缓鐩樼偣鍗�')" v-permissions="['business:ywpatrolline:create']">娣诲姞</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="platformName" label="鐩樼偣鍗曞悕绉�" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="platformGroupName" label="鐩樼偣浠撳簱" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeFront" label="鐩樼偣鍛�" min-width="80" show-overflow-tooltip />
-      <el-table-column prop="carCodeBack" label="鐩樼偣鏃ユ湡" min-width="110" show-overflow-tooltip />
-      <el-table-column prop="param1" label="鍒涘缓浜�" min-width="80" show-overflow-tooltip />
-      <el-table-column prop="param2" label="鍒涘缓鏃堕棿" min-width="140" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="鐩樼偣鐘舵��" min-width="80" show-overflow-tooltip />
+      <el-table-column prop="name" label="鐩樼偣鍗曞悕绉�" min-width="120" show-overflow-tooltip />
+      <el-table-column prop="warehouseName" label="鐩樼偣浠撳簱" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="userName" label="鐩樼偣鍛�" min-width="80" show-overflow-tooltip />
+      <el-table-column prop="planDate" label="鐩樼偣鏃ユ湡" min-width="110" show-overflow-tooltip />
+      <el-table-column prop="createName" label="鍒涘缓浜�" min-width="80" show-overflow-tooltip />
+      <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="140" show-overflow-tooltip />
+      <el-table-column label="鐩樼偣鐘舵��" min-width="80">
+        <template v-slot="{ row }">
+          <span v-if="row.status === 0">鏈紑濮�</span>
+          <span v-if="row.status === 1">杩涜涓�</span>
+          <span v-if="row.status === 2">宸插畬鎴�</span>
+          <span v-if="row.status === 3">宸插彇娑�</span>
+        </template>
+      </el-table-column>
       <el-table-column prop="workTime" label="鎿嶄綔" min-width="140" show-overflow-tooltip>
         <template v-slot="{ row }">
-          <span class="primaryColor pointer">鏌ョ湅璇︽儏</span>
-          <span class="primaryColor pointer">鍙栨秷</span>
-          <span class="primaryColor pointer">鍒犻櫎</span>
+          <el-button type="text" @click="$refs.inventoryDetails.open('鐩樼偣璇︾粏', row.id)">鏌ョ湅璇︽儏</el-button>
+          <el-button type="text" v-if="[0,1].includes(row.status)" @click="cancel(row.id)">鍙栨秷</el-button>
+          <el-button type="text" v-if="[0,3].includes(row.status)" @click="dele(row.id)">鍒犻櫎</el-button>
         </template>
       </el-table-column>
     </el-table>
     <div class="mt20">
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
     </div>
+    <NewInventory ref="newInventory" @success="getList" />
+    <InventoryDetails ref="inventoryDetails" />
   </div>
 </template>
 
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
+import NewInventory from './components/newInventory'
+import InventoryDetails from './components/inventoryDetails'
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+import { fetchList, cancelById, deleteById } from '@/api/ywStocktaking'
 export default {
   components: {
     Pagination,
-    QueryForm
+    QueryForm,
+    NewInventory,
+    InventoryDetails
   },
   data() {
     return {
@@ -52,15 +65,20 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'carCodeFront',
+            filed: 'name',
             type: 'input',
-            label: '鐩樼偣鍗�',
+            label: '鐩樼偣鍗曞悕绉�',
           },
           {
-            filed: 'platformGroupId',
+            filed: 'status',
             type: 'select',
             label: '鐩樼偣鐘舵��',
-            options: []
+            options: [
+              { value: 0, label: '鏈紑濮�' },
+              { value: 1, label: '杩涜涓�' },
+              { value: 2, label: '宸插畬鎴�' },
+              { value: 3, label: '宸插彇娑�' }
+            ]
           },
         ],
         online: true
@@ -68,55 +86,54 @@
     }
   },
   created() {
-    // this.getList()
-    // this.getGroupList()
+    this.getList()
   },
   methods: {
-    handleSub() {
-      this.$refs.ruleForm.validate((valid) => {
-        if (valid) {
-          alert('submit!')
-        }
-      })
-    },
-    handleEx() { },
-    getGroupList() {
-      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
-        this.queryFormConfig.formItems[1].options = res.map(i => {
-          return {
-            value: i.id,
-            label: i.name
-          }
-        })
-        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '鍏ㄩ儴鏈堝彴缁�' })
-      })
-    },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      platformLogPage({
+      fetchList({
         model: {
-          ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          ...filters
         },
-        sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
         page: page || pagination.page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
-        this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
-        })
         this.pagination.total = res.total || 0
       }, () => {
         this.loading = false
       })
     },
+    cancel(id) {
+      this.$confirm('鏄惁纭鍙栨秷?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        cancelById(id)
+          .then(res => {
+            this.getList()
+          })
+      }).catch(() => {
+      
+      });
+    },
+    dele(id) {
+      this.$confirm('鏄惁纭鍒犻櫎?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteById(id)
+          .then(res => {
+            this.getList()
+          })
+      }).catch(() => {
+      
+      });
+    },
     clear() {
       this.filters = {}
       this.pagination.pageSize = 10
diff --git a/admin/src/views/stock/components/AssetSel.vue b/admin/src/views/stock/components/AssetSel.vue
index afbbb23..d4bb919 100644
--- a/admin/src/views/stock/components/AssetSel.vue
+++ b/admin/src/views/stock/components/AssetSel.vue
@@ -1,35 +1,36 @@
 <template>
-  <GlobalWindow title="閫夋嫨鐗╂枡" :visible.sync="isShowModal" :confirm-working="isLoading" width="900px" @close="close"
+  <GlobalWindow title="閫夋嫨鐗╂枡" :visible.sync="isShowModal" :confirm-working="isLoading" width="1000px" @close="close"
     @confirm="confirm">
     <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
-      <el-form-item prop="areaType" label="鐗╂枡淇℃伅">
-        <el-input v-model="searchForm.aaa" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�/鍚嶇О" @keypress.enter.native="search"></el-input>
+      <el-form-item prop="code" label="鐗╂枡淇℃伅">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�/鍚嶇О" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <el-form-item prop="areaIds" label="鐗╂枡鍒嗙被">
         <el-cascader v-model="searchForm.areaIds" @change="changeSel" placeholder="璇烽�夋嫨鐗╂枡鍒嗙被" clearable
           :options="cateList" :props="{
             label: 'name',
             value: 'id',
-            children: 'childCategoryList'
+            children: 'childCategoryList',
+            checkStrictly: true
           }"></el-cascader>
       </el-form-item>
       <span>
-        <el-button type="primary" @click="getList">鎼滅储</el-button>
+        <el-button type="primary" @click="getList(1)">鎼滅储</el-button>
         <el-button @click="reset">閲嶇疆</el-button>
       </span>
     </el-form>
     <!--  -->
     <el-table @selection-change="handleSelectionChange" :data="list" stripe>
       <el-table-column type="selection"  width="55" />
-      <el-table-column prop="categoryName" label="鐗╂枡缂栫爜" min-width="100px"></el-table-column>
-      <el-table-column prop="creatorName" label="鐗╂枡鍚嶇О" min-width="80px"></el-table-column>
-      <el-table-column prop="createDate" label="鏉$爜" min-width="100px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鍝佺墝" min-width="80px"></el-table-column>
-      <el-table-column prop="dealUserName" label="瑙勬牸鍨嬪彿" min-width="80px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鍗曚綅" min-width="80px"></el-table-column>
-      <el-table-column prop="dealUserName" label="搴撳瓨" min-width="80px"></el-table-column>
+      <el-table-column prop="code" label="鐗╂枡缂栫爜" min-width="100px"></el-table-column>
+      <el-table-column prop="name" label="鐗╂枡鍚嶇О" min-width="80px"></el-table-column>
+      <el-table-column prop="qrcode" label="鏉$爜" min-width="100px"></el-table-column>
+      <el-table-column prop="brand" label="鍝佺墝" min-width="80px"></el-table-column>
+      <el-table-column prop="attr" label="瑙勬牸鍨嬪彿" min-width="80px"></el-table-column>
+      <el-table-column prop="unitName" label="鍗曚綅" min-width="80px"></el-table-column>
+      <el-table-column prop="maxStock" label="搴撳瓨" min-width="80px"></el-table-column>
     </el-table>
-    <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination">
+    <Pagination class="mt10" @size-change="handleSizeChange" @current-change="getList" :pagination="pagination">
     </Pagination>
   </GlobalWindow>
 </template>
@@ -38,6 +39,8 @@
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
 import Pagination from '@/components/common/Pagination'
+import { fetchList } from '@/api/ywMaterial'
+import { ywStockPage } from '@/api/store/index'
 import { fetchList as getCateList } from '@/api/business/category.js'
 export default {
   name: 'OperaCategoryWindow',
@@ -51,6 +54,8 @@
         page: 1,
         total: 0
       },
+      isOut: false,
+      warehouseId: false,
       list: [],
       selList: [],
       cateList: [],
@@ -64,7 +69,7 @@
     }
   },
   created() {
-    this.initData()
+    this.getCate()
   },
   methods: {
     confirm() {
@@ -75,24 +80,39 @@
       this.selList = val
     },
     getList(page) {
-      const { pagination, searchForm } = this
+      const { pagination, searchForm, isOut, warehouseId } = this
       this.listLoading = true
       if(page){pagination.page = page}
-      fetchList({
+      console.log('isOut', isOut);
+      
+      let fn = isOut ? ywStockPage : fetchList
+      fn({
         capacity: pagination.pageSize,
         page: pagination.page,
-        model: {...searchForm}
+        model: {...searchForm,status: 0, warehouseId}
       }).then((res) => {
         this.listLoading = false
         this.list = res.records
         this.pagination.total = res.total || 0
+        if(isOut){
+          this.list.forEach(item => {
+            item.brand = item.materialBrand
+            item.attr = item.materialAttr
+            item.name = item.materialName
+            item.id = item.materialId
+            item.code = item.materialCode
+            item.qrcode = item.materialQrcode
+            item.unitName = item.materialUnitName
+            item.maxStock = item.stock
+          })
+        }
       }, () => {
         this.listLoading = false
       })
     },
-    initData() {
+    getCate() {
       getCateList({
-        model: { type: 3 },
+        model: { type: 7 },
         capacity: 1000,
         page: 1,
       }).then(res => {
@@ -102,6 +122,10 @@
     changeSel(e) {
       if (e && e.length == 2) {
         this.$set(this.searchForm, 'cateId', e[1])
+        this.$set(this.searchForm, 'parentCateId', '')
+      }else if((e && e.length == 1)){
+        this.$set(this.searchForm, 'parentCateId', e[0])
+        this.$set(this.searchForm, 'cateId', '')
       } else {
         this.$set(this.searchForm, 'cateId', '')
       }
diff --git a/admin/src/views/stock/components/CateEdit.vue b/admin/src/views/stock/components/CateEdit.vue
index a066862..6ca3043 100644
--- a/admin/src/views/stock/components/CateEdit.vue
+++ b/admin/src/views/stock/components/CateEdit.vue
@@ -1,8 +1,13 @@
 <template>
-  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    width="600px"
+    @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" maxlength="30" placeholder="璇疯緭鍏ュ垎绫诲悕绉�" v-trim />
       </el-form-item>
       <el-form-item label="鎵�灞炲垎绫�" prop="parentId">
         <el-select :disabled="form.id" v-model="form.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
@@ -19,7 +24,7 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
-import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
+import { fetchCateList, getInfoById } from '@/api/business/category.js'
 export default {
   name: 'OperaCategoryWindow',
   extends: BaseOpera,
@@ -33,7 +38,7 @@
         remark: '',
         status: '',
         sortnum: '',
-        type: 5
+        type: 7
       },
       // 楠岃瘉瑙勫垯
       rules: {
@@ -55,14 +60,9 @@
   },
   methods: {
     getList() {
-      fetchCateList({ type: 5 }).then(res => {
+      fetchCateList({ type: 7 }).then(res => {
         this.dataList = res || []
-        
       })
-    },
-    close() {
-      this.visible = false
-      this.$emit('close')
     },
     getDetail(id) {
       getInfoById(id).then(res => {
diff --git a/admin/src/views/stock/components/InDetail.vue b/admin/src/views/stock/components/InDetail.vue
index ad73ba4..a32ff7d 100644
--- a/admin/src/views/stock/components/InDetail.vue
+++ b/admin/src/views/stock/components/InDetail.vue
@@ -1,43 +1,46 @@
 <template>
-  <GlobalWindow width="960px" title="鍑哄簱鍗曡鎯�" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+  <GlobalWindow width="960px" :showConfirm="false" title="鍏ュ簱鍗曡鎯�" :visible.sync="visible" :confirm-working="isWorking" @close="close"
     @confirm="confirm">
     <div class="main">
       <div class="title">
-        <span>宸ュ崟璇︽儏</span>
+        <span>鍏ュ簱鍗曠紪鍙凤細{{ info.code }}</span>
+      </div>
+      <div class="title">
+        <span>鍩虹淇℃伅</span>
       </div>
       <div class="main_content">
         <div class="list">
           <div class="item">
-            <div class="la">鍑哄簱浠撳簱</div>
-            <div class="val">{{ info.projectName }}</div>
+            <div class="la">鍏ュ簱浠撳簱</div>
+            <div class="val">{{ info.warehouseName }}</div>
           </div>
           <div class="item">
-            <div class="la">鍑哄簱鏃ユ湡</div>
-            <div class="val">{{ info.categoryName }}</div>
+            <div class="la">鍏ュ簱鏃ユ湡</div>
+            <div class="val">{{ info.doneDate }}</div>
           </div>
           <div class="item">
-            <div class="la">鍑哄簱绫诲瀷</div>
-            <div class="val">{{ info.creatorName }}{{ info.creatorCompany ? "-" + info.creatorCompany : '' }}</div>
+            <div class="la">鍏ュ簱绫诲瀷</div>
+            <div class="val" v-if="info.type || info.type == 0">{{ StoreTypeOps[info.type].name }}</div>
           </div>
           <div class="item">
             <div class="la">澶勭悊浜�</div>
-            <div class="val">{{ info.creatorPhone || info.creatorMobile }}</div>
+            <div class="val">{{ info.createUserName }}</div>
           </div>
-          <div class="item">
+          <div class="item" style="width: 66.6%;">
             <div class="la">澶囨敞</div>
-            <div class="val">{{ info.createDate }}</div>
+            <div class="val">{{ info.remark }}</div>
           </div>
         </div>
       </div>
       <div class="title">鐗╂枡淇℃伅</div>
-      <el-table :data="list" stripe>
-        <el-table-column align="center" type="index" width="55" />
-        <el-table-column prop="creatorName" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
-        <el-table-column prop="categoryName" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="100px"></el-table-column>
-        <el-table-column prop="createDate" label="鏉″舰鐮�" show-overflow-tooltip min-width="100px"></el-table-column>
-        <el-table-column prop="dealUserName" label="鍝佺墝" show-overflow-tooltip min-width="80px"></el-table-column>
-        <el-table-column prop="dealUserName" label="鍗曚綅" show-overflow-tooltip min-width="80px"></el-table-column>
-        <el-table-column prop="dealUserName" label="鍑哄簱鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column>
+      <el-table :data="info.recordList" stripe>
+        <el-table-column align="center" label="搴忓彿" type="index" width="55" />
+        <el-table-column prop="materialName" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
+        <el-table-column prop="materialCode" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="100px"></el-table-column>
+        <el-table-column prop="materialQrcode" label="鏉″舰鐮�" show-overflow-tooltip min-width="100px"></el-table-column>
+        <el-table-column prop="materialBrand" label="鍝佺墝" show-overflow-tooltip min-width="80px"></el-table-column>
+        <el-table-column prop="materialUnitName" label="鍗曚綅" show-overflow-tooltip min-width="80px"></el-table-column>
+        <el-table-column prop="stock" label="鍏ュ簱鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column>
       </el-table>
     </div>
   </GlobalWindow>
@@ -46,10 +49,8 @@
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
-import { detailById, dispatchOrder, dealOrder } from '@/api/workorder/ywWorkorder'
-import { getUserList } from '@/api/system/user'
-import { Message, Loading } from 'element-ui'
-import dayjs from 'dayjs'
+import { ywOutinboundDetail } from '@/api'
+import { StoreTypeOps } from './config'
 export default {
   components: {
     GlobalWindow
@@ -57,21 +58,18 @@
   extends: BaseOpera,
   data() {
     return {
-      id: '',
       visible: false,
-      info: {},
-      list: []
+      info: {recordList: []},
+      StoreTypeOps
 
 
     }
   },
   created() {
-    // this.getDetail()
   },
   methods: {
-    getDetail() {
-      const { id } = this
-      detailById(id).then(res => {
+    getDetail(id) {
+      ywOutinboundDetail(id).then(res => {
         this.info = res
       })
     },
diff --git a/admin/src/views/stock/components/InEdit.vue b/admin/src/views/stock/components/InEdit.vue
index 3bc1a30..71441e5 100644
--- a/admin/src/views/stock/components/InEdit.vue
+++ b/admin/src/views/stock/components/InEdit.vue
@@ -1,27 +1,27 @@
 <template>
-  <GlobalWindow title="鏂板缓鍑哄簱鍗�" :visible.sync="isShowModal" :confirm-working="isLoading" width="900px" @close="close"
+  <GlobalWindow title="鏂板缓鍏ュ簱鍗�" :visible.sync="isShowModal" :confirm-working="isLoading" width="1000px" @close="close"
     @confirm="confirm">
     <el-form :model="param" ref="form" :rules="rules">
       <div class="df_ac">
-        <el-form-item class="w3" label="鍑哄簱浠撳簱" prop="parentId">
-          <el-select :disabled="param.id" v-model="param.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
-            <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
+        <el-form-item class="w3" label="鍏ュ簱浠撳簱" prop="warehouseId">
+          <el-select :disabled="param.id" v-model="param.warehouseId" placeholder="璇烽�夋嫨">
+            <el-option v-for="op in storeList" :key="op.id" :label="op.name" :value="op.id"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item class="w3" label="鍑哄簱鏃ユ湡">
-          <el-date-picker type="date" v-model="param.getDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
-            placeholder="璇烽�夋嫨鍑哄簱鏃ユ湡"></el-date-picker>
+        <el-form-item class="w3" label="鍏ュ簱鏃ユ湡" prop="doneDate">
+          <el-date-picker type="date" v-model="param.doneDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+            placeholder="璇烽�夋嫨鍏ュ簱鏃ユ湡"></el-date-picker>
         </el-form-item>
-        <el-form-item class="w3" label="鍑哄簱绫诲瀷" prop="parentId">
-          <el-select :disabled="param.id" v-model="param.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
-            <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
+        <el-form-item class="w3" label="鍏ュ簱绫诲瀷" prop="type">
+          <el-select :disabled="param.id" v-model="param.type" placeholder="璇烽�夋嫨鍏ュ簱绫诲瀷">
+            <el-option v-for="op in StoreTypeOps" :key="op.id" :label="op.name" :value="op.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item class="w3" label="澶勭悊浜�" prop="name">
-          <el-input v-model="param.name" v-trim />
+          <el-input v-model="param.createUserName" :disabled="true" v-trim />
         </el-form-item>
-        <el-form-item class="w6" label="澶囨敞" prop="name">
-          <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+        <el-form-item class="w6" label="澶囨敞" prop="remark">
+          <el-input v-model="param.remark" placeholder="璇疯緭鍏�" v-trim />
         </el-form-item>
       </div>
     </el-form>
@@ -32,18 +32,19 @@
     <el-button type="primary" @click="handleOpenMaterial">閫夋嫨鐗╂枡</el-button>
     <el-table :data="list" stripe>
       <el-table-column align="center" label="搴忓彿" type="index" width="50" />
-      <el-table-column prop="creatorName" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
-      <el-table-column prop="categoryName" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="90px"></el-table-column>
-      <el-table-column prop="createDate" label="鏉″舰鐮�" show-overflow-tooltip min-width="70px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鍝佺墝" show-overflow-tooltip min-width="70px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鍗曚綅" show-overflow-tooltip min-width="70px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鍑哄簱鏁伴噺" min-width="90px">
-        <template v-slot="{row}">
-          <el-input oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 11)" v-model="row.aa" class="w100"></el-input>
+      <el-table-column prop="name" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
+      <el-table-column prop="code" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="90px"></el-table-column>
+      <el-table-column prop="qrcode" label="鏉″舰鐮�" show-overflow-tooltip min-width="70px"></el-table-column>
+      <el-table-column prop="brand" label="鍝佺墝" show-overflow-tooltip min-width="70px"></el-table-column>
+      <el-table-column prop="unitName" label="鍗曚綅" show-overflow-tooltip min-width="70px"></el-table-column>
+      <el-table-column prop="dealUserName" label="鍏ュ簱鏁伴噺" min-width="100px">
+        <template v-slot="{ row }">
+          <el-input oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" v-model="row.stock"
+            class="w100"></el-input>
         </template>
       </el-table-column>
-      <el-table-column prop="dealUserName" label="搴撳瓨鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鎿嶄綔" min-width="60px">
+      <!-- <el-table-column prop="maxStock" label="搴撳瓨鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column> -->
+      <el-table-column label="鎿嶄綔" min-width="60px">
         <template v-slot="scope">
           <span @click="handleDel(scope)" class="red pointer">鍒犻櫎</span>
         </template>
@@ -57,52 +58,94 @@
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import AssetSel from './AssetSel'
-import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
+import { fetchList as getStoreList } from '@/api/ywWarehouse'
+import { ywOutinboundCreate } from '@/api/store/index'
+import { StoreTypeOps, rules } from './config'
+import { Message } from 'element-ui'
+import dayjs from 'dayjs'
 export default {
   name: 'OperaCategoryWindow',
   components: { GlobalWindow, AssetSel },
   data() {
     return {
       // 琛ㄥ崟鏁版嵁
-      param: {},
+      param: {
+        createUserName: this.$store.state.userInfo.realname || this.$store.state.userInfo.username,
+        creator: this.$store.state.userInfo.id,
+        inOut: 0
+      },
       activeName: 'first',
       isShowModal: false,
       isShowSel: false,
       isLoading: false,
       // 楠岃瘉瑙勫垯
-      rules: {
-        name: [{ required: true, message: '璇疯緭鍏ヤ簩绾у垎绫诲悕绉�', trigger: 'blur' }],
-      },
-      list: [{}],
+      rules,
+      storeList: [],
+      list: [],
+      StoreTypeOps: StoreTypeOps.filter(i => i.type == 0),
 
       dataList: [],
     }
   },
   created() {
+    this.initData()
+    console.log(this.$store.state.userInfo)
 
   },
   methods: {
     confirm() {
-
-    },
-    getList() {
-      fetchCateList({ type: 5 }).then(res => {
-        this.dataList = res || []
-
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          const { param, list } = this
+          if(list.length == 0) return Message.warning('璇峰厛閫夋嫨鐗╂枡淇℃伅')
+          let count = 0 // 鍏ュ簱鏁伴噺蹇呭~
+          list.forEach(item => {
+            if(!item.stock) count ++
+          })
+          if(count > 0) return Message.warning('璇疯緭鍏ユ纭殑鍏ュ簱鏁伴噺')
+          this.isLoading = true
+          ywOutinboundCreate({
+            ...param,
+            recordList: list
+          }).then(res => {
+            this.isLoading = false
+            Message.success('鎻愪氦鎴愬姛')
+            this.$emit('success')
+            this.close()
+          }, () => {
+            this.isLoading = false
+          })
+        }
       })
     },
-    changeSel() {
-
+    initData() {
+      this.$set(this.param, 'doneDate', dayjs().format('YYYY-MM-DD'))
+      getStoreList({ capacity: 9999, page: 1, model: {status: 0} }).then(res => {
+        this.storeList = res.records || []
+      })
+    },
+    changeSel(val) {
+      const list = val
+      list.forEach(item => {
+        const index = this.list.findIndex(i => i.id == item.id)
+        if(index == -1){
+          item.materialId = item.id
+          item.multifile = null
+          item.createDate = null
+          this.list.push(item)
+        }
+      })
     },
     handleDel(val) {
       const index = val.$index
       this.list.splice(index, 1)
-      
+
     },
     handleOpenMaterial() {
       this.isShowSel = true
       this.$nextTick(() => {
         this.$refs.AssetSelRef.isShowModal = true
+        this.$refs.AssetSelRef.getList()
       })
     },
     close() {
diff --git a/admin/src/views/stock/components/OutDetail.vue b/admin/src/views/stock/components/OutDetail.vue
index ad73ba4..af7335a 100644
--- a/admin/src/views/stock/components/OutDetail.vue
+++ b/admin/src/views/stock/components/OutDetail.vue
@@ -1,43 +1,46 @@
 <template>
-  <GlobalWindow width="960px" title="鍑哄簱鍗曡鎯�" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+  <GlobalWindow width="960px" :showConfirm="false" title="鍑哄簱鍗曡鎯�" :visible.sync="visible" :confirm-working="isWorking" @close="close"
     @confirm="confirm">
     <div class="main">
       <div class="title">
-        <span>宸ュ崟璇︽儏</span>
+        <span>鍑哄簱鍗曠紪鍙凤細{{ info.code }}</span>
+      </div>
+      <div class="title">
+        <span>鍩虹淇℃伅</span>
       </div>
       <div class="main_content">
         <div class="list">
           <div class="item">
             <div class="la">鍑哄簱浠撳簱</div>
-            <div class="val">{{ info.projectName }}</div>
+            <div class="val">{{ info.warehouseName }}</div>
           </div>
           <div class="item">
             <div class="la">鍑哄簱鏃ユ湡</div>
-            <div class="val">{{ info.categoryName }}</div>
+            <div class="val">{{ info.doneDate }}</div>
           </div>
           <div class="item">
             <div class="la">鍑哄簱绫诲瀷</div>
-            <div class="val">{{ info.creatorName }}{{ info.creatorCompany ? "-" + info.creatorCompany : '' }}</div>
+            <div class="val" v-if="info.type || info.type == 0">{{ StoreTypeOps[info.type].name }}</div>
           </div>
           <div class="item">
             <div class="la">澶勭悊浜�</div>
-            <div class="val">{{ info.creatorPhone || info.creatorMobile }}</div>
+            <div class="val">{{ info.createUserName }}</div>
           </div>
-          <div class="item">
+          <div class="item" style="width: 66.6%;">
             <div class="la">澶囨敞</div>
-            <div class="val">{{ info.createDate }}</div>
+            <div class="val">{{ info.remark }}</div>
           </div>
         </div>
       </div>
       <div class="title">鐗╂枡淇℃伅</div>
-      <el-table :data="list" stripe>
-        <el-table-column align="center" type="index" width="55" />
-        <el-table-column prop="creatorName" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
-        <el-table-column prop="categoryName" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="100px"></el-table-column>
-        <el-table-column prop="createDate" label="鏉″舰鐮�" show-overflow-tooltip min-width="100px"></el-table-column>
-        <el-table-column prop="dealUserName" label="鍝佺墝" show-overflow-tooltip min-width="80px"></el-table-column>
-        <el-table-column prop="dealUserName" label="鍗曚綅" show-overflow-tooltip min-width="80px"></el-table-column>
-        <el-table-column prop="dealUserName" label="鍑哄簱鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column>
+      <el-table :data="info.recordList" stripe>
+        <el-table-column align="center" label="搴忓彿" type="index" width="55" />
+        <el-table-column prop="materialName" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
+        <el-table-column prop="materialCode" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="100px"></el-table-column>
+        <el-table-column prop="materialQrcode" label="鏉″舰鐮�" show-overflow-tooltip min-width="100px"></el-table-column>
+        <el-table-column prop="materialBrand" label="鍝佺墝" show-overflow-tooltip min-width="80px"></el-table-column>
+        <el-table-column prop="materialUnitName" label="鍗曚綅" show-overflow-tooltip min-width="80px"></el-table-column>
+        <el-table-column prop="stock" label="鍑哄簱鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column>
       </el-table>
     </div>
   </GlobalWindow>
@@ -46,10 +49,8 @@
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
-import { detailById, dispatchOrder, dealOrder } from '@/api/workorder/ywWorkorder'
-import { getUserList } from '@/api/system/user'
-import { Message, Loading } from 'element-ui'
-import dayjs from 'dayjs'
+import { ywOutinboundDetail } from '@/api'
+import { StoreTypeOps } from './config'
 export default {
   components: {
     GlobalWindow
@@ -57,21 +58,18 @@
   extends: BaseOpera,
   data() {
     return {
-      id: '',
       visible: false,
-      info: {},
-      list: []
+      info: {recordList: []},
+      StoreTypeOps
 
 
     }
   },
   created() {
-    // this.getDetail()
   },
   methods: {
-    getDetail() {
-      const { id } = this
-      detailById(id).then(res => {
+    getDetail(id) {
+      ywOutinboundDetail(id).then(res => {
         this.info = res
       })
     },
diff --git a/admin/src/views/stock/components/OutEdit.vue b/admin/src/views/stock/components/OutEdit.vue
index 3bc1a30..0bad33c 100644
--- a/admin/src/views/stock/components/OutEdit.vue
+++ b/admin/src/views/stock/components/OutEdit.vue
@@ -1,27 +1,27 @@
 <template>
-  <GlobalWindow title="鏂板缓鍑哄簱鍗�" :visible.sync="isShowModal" :confirm-working="isLoading" width="900px" @close="close"
+  <GlobalWindow title="鏂板缓鍑哄簱鍗�" :visible.sync="isShowModal" :confirm-working="isLoading" width="1000px" @close="close"
     @confirm="confirm">
     <el-form :model="param" ref="form" :rules="rules">
       <div class="df_ac">
-        <el-form-item class="w3" label="鍑哄簱浠撳簱" prop="parentId">
-          <el-select :disabled="param.id" v-model="param.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
-            <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
+        <el-form-item class="w3" label="鍑哄簱浠撳簱" prop="warehouseId">
+          <el-select :disabled="param.id" @change="changeStore" v-model="param.warehouseId" placeholder="璇烽�夋嫨">
+            <el-option v-for="op in storeList" :key="op.id" :label="op.name" :value="op.id"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item class="w3" label="鍑哄簱鏃ユ湡">
-          <el-date-picker type="date" v-model="param.getDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+        <el-form-item class="w3" label="鍑哄簱鏃ユ湡" prop="doneDate">
+          <el-date-picker type="date" v-model="param.doneDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
             placeholder="璇烽�夋嫨鍑哄簱鏃ユ湡"></el-date-picker>
         </el-form-item>
-        <el-form-item class="w3" label="鍑哄簱绫诲瀷" prop="parentId">
-          <el-select :disabled="param.id" v-model="param.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
-            <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
+        <el-form-item class="w3" label="鍑哄簱绫诲瀷" prop="type">
+          <el-select :disabled="param.id" v-model="param.type" placeholder="璇烽�夋嫨鍑哄簱绫诲瀷">
+            <el-option v-for="op in StoreTypeOps" :key="op.id" :label="op.name" :value="op.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item class="w3" label="澶勭悊浜�" prop="name">
-          <el-input v-model="param.name" v-trim />
+          <el-input v-model="param.createUserName" :disabled="true" v-trim />
         </el-form-item>
-        <el-form-item class="w6" label="澶囨敞" prop="name">
-          <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+        <el-form-item class="w6" label="澶囨敞" prop="remark">
+          <el-input v-model="param.remark" placeholder="璇疯緭鍏�" v-trim />
         </el-form-item>
       </div>
     </el-form>
@@ -32,18 +32,19 @@
     <el-button type="primary" @click="handleOpenMaterial">閫夋嫨鐗╂枡</el-button>
     <el-table :data="list" stripe>
       <el-table-column align="center" label="搴忓彿" type="index" width="50" />
-      <el-table-column prop="creatorName" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
-      <el-table-column prop="categoryName" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="90px"></el-table-column>
-      <el-table-column prop="createDate" label="鏉″舰鐮�" show-overflow-tooltip min-width="70px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鍝佺墝" show-overflow-tooltip min-width="70px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鍗曚綅" show-overflow-tooltip min-width="70px"></el-table-column>
+      <el-table-column prop="name" label="鐗╂枡鍚嶇О" show-overflow-tooltip min-width="80px"></el-table-column>
+      <el-table-column prop="code" label="鐗╂枡缂栫爜" show-overflow-tooltip min-width="90px"></el-table-column>
+      <el-table-column prop="qrcode" label="鏉″舰鐮�" show-overflow-tooltip min-width="70px"></el-table-column>
+      <el-table-column prop="brand" label="鍝佺墝" show-overflow-tooltip min-width="70px"></el-table-column>
+      <el-table-column prop="unitName" label="鍗曚綅" show-overflow-tooltip min-width="70px"></el-table-column>
       <el-table-column prop="dealUserName" label="鍑哄簱鏁伴噺" min-width="90px">
-        <template v-slot="{row}">
-          <el-input oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 11)" v-model="row.aa" class="w100"></el-input>
+        <template v-slot="{ row }">
+          <el-input oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" v-model="row.stock"
+            class="w100"></el-input>
         </template>
       </el-table-column>
-      <el-table-column prop="dealUserName" label="搴撳瓨鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column>
-      <el-table-column prop="dealUserName" label="鎿嶄綔" min-width="60px">
+      <el-table-column prop="maxStock" label="搴撳瓨鏁伴噺" show-overflow-tooltip min-width="80px"></el-table-column>
+      <el-table-column label="鎿嶄綔" min-width="60px">
         <template v-slot="scope">
           <span @click="handleDel(scope)" class="red pointer">鍒犻櫎</span>
         </template>
@@ -57,52 +58,99 @@
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import AssetSel from './AssetSel'
-import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
+import { fetchList as getStoreList } from '@/api/ywWarehouse'
+import { ywOutinboundCreate } from '@/api/store/index'
+import { StoreTypeOps, rules } from './config'
+import { Message } from 'element-ui'
+import dayjs from 'dayjs'
 export default {
   name: 'OperaCategoryWindow',
   components: { GlobalWindow, AssetSel },
   data() {
     return {
       // 琛ㄥ崟鏁版嵁
-      param: {},
+      param: {
+        createUserName: this.$store.state.userInfo.realname || this.$store.state.userInfo.username,
+        creator: this.$store.state.userInfo.id,
+        inOut: 1
+      },
       activeName: 'first',
       isShowModal: false,
       isShowSel: false,
       isLoading: false,
       // 楠岃瘉瑙勫垯
-      rules: {
-        name: [{ required: true, message: '璇疯緭鍏ヤ簩绾у垎绫诲悕绉�', trigger: 'blur' }],
-      },
-      list: [{}],
+      rules,
+      storeList: [],
+      list: [],
+      StoreTypeOps: StoreTypeOps.filter(i => i.type == 1),
 
       dataList: [],
     }
   },
   created() {
-
+    this.initData()
   },
   methods: {
     confirm() {
-
-    },
-    getList() {
-      fetchCateList({ type: 5 }).then(res => {
-        this.dataList = res || []
-
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          const { param, list } = this
+          if(list.length == 0) return Message.warning('璇峰厛閫夋嫨鐗╂枡淇℃伅')
+          let count = 0 // 鍑哄簱鏁伴噺蹇呭~
+          list.forEach(item => {
+            if(!item.stock) count ++
+          })
+          if(count > 0) return Message.warning('璇疯緭鍏ユ纭殑鍑哄簱鏁伴噺')
+          this.isLoading = true
+          ywOutinboundCreate({
+            ...param,
+            recordList: list
+          }).then(res => {
+            this.isLoading = false
+            Message.success('鎻愪氦鎴愬姛')
+            this.$emit('success')
+            this.close()
+          }, () => {
+            this.isLoading = false
+          })
+        }
       })
     },
-    changeSel() {
-
+    changeStore() {
+      this.list = []
+    },
+    initData() {
+      this.$set(this.param, 'doneDate', dayjs().format('YYYY-MM-DD'))
+      getStoreList({ capacity: 9999, page: 1, model: {status: 0} }).then(res => {
+        this.storeList = res.records || []
+      })
+    },
+    changeSel(val) {
+      const list = val
+      list.forEach(item => {
+        if(this.list.indexOf(item.id) === -1){
+          item.materialId = item.id
+          item.stock = null
+          item.createDate = null
+          this.list.push(item)
+        }
+      })
     },
     handleDel(val) {
       const index = val.$index
       this.list.splice(index, 1)
-      
+
     },
     handleOpenMaterial() {
+      if(!this.param.warehouseId) return Message.warning('璇峰厛閫夋嫨鍑哄簱浠撳簱')
       this.isShowSel = true
       this.$nextTick(() => {
         this.$refs.AssetSelRef.isShowModal = true
+        this.$refs.AssetSelRef.isOut = true
+        this.$refs.AssetSelRef.warehouseId = this.param.warehouseId
+        this.$refs.AssetSelRef.getList()
+        console.log('-----');
+        
       })
     },
     close() {
diff --git a/admin/src/views/stock/components/config.js b/admin/src/views/stock/components/config.js
new file mode 100644
index 0000000..f03110b
--- /dev/null
+++ b/admin/src/views/stock/components/config.js
@@ -0,0 +1,18 @@
+export const StoreTypeOps = [
+  { name: '閲囪喘鍏ュ簱', id: 0, type: 0 },
+  { name: '棰嗙敤閫�鍥�', id: 1, type: 0 },
+  { name: '搴撳瓨璋冩暣', id: 2, type: 0 },
+  { name: '鍏跺畠鍏ュ簱', id: 3, type: 0 },
+  // { name: '鐩樼泩鍏ュ簱', id: 4, type: 0 },
+  { name: '棰嗙敤鍑哄簱', id: 5, type: 1 },
+  { name: '浠撳簱鍑哄崟', id: 6, type: 1 },
+  { name: '璋冩暣鍑哄簱', id: 7, type: 1 },
+  { name: '閲囪喘鍑哄簱', id: 8, type: 1 },
+  { name: '鍏跺畠鍑哄簱', id: 9, type: 1 },
+  // { name: '鐩樺嚭鍑哄簱', id: 10, type: 1 },
+]
+export const rules = {
+  warehouseId: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+  doneDate: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+  type: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+}
\ No newline at end of file
diff --git a/admin/src/views/stock/components/inventoryDetails.vue b/admin/src/views/stock/components/inventoryDetails.vue
index b0c6d1c..790d7bf 100644
--- a/admin/src/views/stock/components/inventoryDetails.vue
+++ b/admin/src/views/stock/components/inventoryDetails.vue
@@ -10,62 +10,66 @@
             <div class="list">
                 <div class="item">
                     <div class="la">鐩樼偣鍗曞悕绉�</div>
-                    <div class="val">搴撳瓨鐩樼偣20241212</div>
+                    <div class="val">{{info.name}}</div>
                 </div>
                 <div class="item">
                     <div class="la">鐩樼偣鏃ユ湡</div>
-                    <div class="val">2024-11-17</div>
+                    <div class="val">{{info.planDate}}</div>
                 </div>
                 <div class="item">
                     <div class="la">鐩樼偣浠撳簱</div>
-                    <div class="val">浠撳簱1</div>
+                    <div class="val">{{info.warehouseName}}</div>
                 </div>
                 <div class="item">
                     <div class="la">鐩樼偣鍛�</div>
-                    <div class="val">寮犱笁</div>
+                    <div class="val">{{info.userName}}</div>
                 </div>
                 <div class="item">
                     <div class="la">鐩樼偣鐘舵��</div>
-                    <div class="val">宸插畬鎴�</div>
+                    <div class="val" v-if="info.status === 0">鏈紑濮�</div>
+                    <div class="val" v-if="info.status === 1">杩涜涓�</div>
+                    <div class="val" v-if="info.status === 2">宸插畬鎴�</div>
+                    <div class="val" v-if="info.status === 3">宸插彇娑�</div>
                 </div>
             </div>
             <div class="title">鐩樼偣缁撴灉</div>
             <div class="list">
                 <div class="list_search">
                     <div class="list_search_left">
-                        <el-input v-model="input" style="width: 200px; margin-right: 10px;" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
-                        <el-select v-model="input" style="width: 200px; margin-right: 10px;" placeholder="璇烽�夋嫨">
-                            <el-option
-                                v-for="item in options"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value">
-                            </el-option>
+                        <el-input v-model="form.code" style="width: 200px; margin-right: 10px;" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�/缂栫爜"></el-input>
+                        <el-select v-model="form.status" style="width: 150px; margin-right: 10px;" placeholder="鐩樼偣鐘舵��">
+                            <el-option label="宸茬洏" :value="1"></el-option>
+                            <el-option label="鏈洏" :value="0"></el-option>
                         </el-select>
-                        <el-button type="primary">鏌ヨ</el-button>
-                        <el-button>娓呯┖</el-button>
+                        <el-select v-model="form.type" style="width: 150px; margin-right: 10px;" placeholder="鐩樼偣缁撴灉">
+                            <el-option label="璐﹀疄鐩哥" :value="0"></el-option>
+                            <el-option label="鐩樹簭" :value="1"></el-option>
+                            <el-option label="鐩樼泩" :value="2"></el-option>
+                        </el-select>
+                        <el-button type="primary" @click="getList">鏌ヨ</el-button>
+                        <el-button @click="clear">娓呯┖</el-button>
                         <el-button>瀵煎嚭</el-button>
                     </div>
                     <div class="list_search_right">
-                        <span>宸茬洏:100</span>
-                        <span>鏈洏:20</span>
-                        <span>璐﹀疄鐩哥:88</span>
-                        <span>鐩樼泩:2</span>
-                        <span>鐩樹簭:20</span>
+                        <span>宸茬洏:{{info.finishAmount || 0}}</span>
+                        <span>鏈洏:{{info.unFinishAmount || 0}}</span>
+                        <span>璐﹀疄鐩哥:{{info.equalAmount || 0}}</span>
+                        <span>鐩樼泩:{{info.profitAmount || 0}}</span>
+                        <span>鐩樹簭:{{info.lossAmount || 0}}</span>
                     </div>
                 </div>
                 <div style="width: 100%; margin: 20px 0;">
-                    <el-table :data="roomList" stripe>
-                        <el-table-column prop="projectName" label="璧勪骇缂栫爜" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="璧勪骇鍚嶇О" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="鏉$爜" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="鍝佺墝" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="瑙勬牸鍨嬪彿" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="鍗曚綅" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="鎵�鍦ㄤ粨搴�" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="璐﹂潰鏁伴噺" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="鐩樼偣鏁伴噺" show-overflow-tooltip />
-                        <el-table-column prop="buildingName" label="澶囨敞" show-overflow-tooltip />
+                    <el-table :data="list" stripe>
+                        <el-table-column prop="materialCode" label="璧勪骇缂栫爜" show-overflow-tooltip />
+                        <el-table-column prop="materialName" label="璧勪骇鍚嶇О" show-overflow-tooltip />
+                        <el-table-column prop="materialQrcode" label="鏉$爜" show-overflow-tooltip />
+                        <el-table-column prop="materialBrand" label="鍝佺墝" show-overflow-tooltip />
+                        <el-table-column prop="materialAttr" label="瑙勬牸鍨嬪彿" show-overflow-tooltip />
+                        <el-table-column prop="materialUnitName" label="鍗曚綅" show-overflow-tooltip />
+                        <el-table-column prop="warehouseName" label="鎵�鍦ㄤ粨搴�" show-overflow-tooltip />
+                        <el-table-column prop="stock" label="璐﹂潰鏁伴噺" show-overflow-tooltip />
+                        <el-table-column prop="actStock" label="鐩樼偣鏁伴噺" show-overflow-tooltip />
+                        <el-table-column prop="remark" label="澶囨敞" show-overflow-tooltip />
                     </el-table>
                 </div>
                 <div class="list_pagination">
@@ -87,6 +91,7 @@
 <script>
   import GlobalWindow from '@/components/common/GlobalWindow'
   import BaseOpera from '@/components/base/BaseOpera'
+  import { ywStocktakingRecordPage, getById } from '@/api/ywStocktaking'
   export default {
     name: "inventoryDetails",
     components: {
@@ -95,11 +100,14 @@
     extends: BaseOpera,
     data() {
       return {
+        id: null,
         info: {},
-        input: '',
-        options: [],
-        roomList: [],
-
+        list: [],
+        form: {
+          code: '',
+          status: '',
+          type: ''
+        },
         pageSize: 10,
         total: 0,
         page: 1
@@ -108,13 +116,45 @@
     methods: {
       handleSizeChange(size) {
         this.pageSize = size
+        this.getList()
       },
       handleCurrentChange(page) {
         this.page = page
+        this.getList()
       },
-      open (title) {
+      open (title, id) {
         this.title = title
         this.visible = true
+        this.id = id
+        this.getDetails()
+        this.getList()
+      },
+      getDetails() {
+        getById(this.id)
+            .then(res => {
+              this.info = res
+            })
+      },
+      clear() {
+        this.form.name = ''
+        this.form.status = ''
+        this.form.type = ''
+        this.page = 1
+        this.getList()
+      },
+      getList() {
+        ywStocktakingRecordPage({
+          capacity: this.pageSize,
+          page: this.page,
+          model: {
+            stocktakingId: this.id,
+            code: this.form.code,
+            status: this.form.status,
+            type: this.form.type
+          }
+        }).then(res => {
+          this.list = res.records
+        })
       }
     }
   }
diff --git a/admin/src/views/stock/components/newInventory.vue b/admin/src/views/stock/components/newInventory.vue
index eb57f94..dd2be3e 100644
--- a/admin/src/views/stock/components/newInventory.vue
+++ b/admin/src/views/stock/components/newInventory.vue
@@ -6,29 +6,35 @@
         :confirm-working="isWorking"
         @confirm="confirm">
         <el-form :model="form" ref="form" :rules="rules">
-            <el-form-item label="鐩樼偣鍗曞悕绉�" prop="name">
-                <el-input v-model="form.name" placeholder="璇疯緭鍏ョ洏鐐瑰崟鍚嶇О" v-trim />
-            </el-form-item>
-            <el-form-item label="鐩樼偣鏃ユ湡" prop="name">
+            <el-form-item label="鐩樼偣鏃ユ湡" prop="planDate">
                 <el-date-picker
-                    v-model="form.name"
+                    v-model="form.planDate"
+                    @change="getName"
                     type="date"
+                    value-format="yyyy-MM-dd"
                     placeholder="閫夋嫨鏃ユ湡">
                 </el-date-picker>
             </el-form-item>
-            <el-form-item label="鐩樼偣浠撳簱" prop="name">
-                <el-select v-model="form.name" placeholder="璇烽�夋嫨">
-                    <el-option label="寮犱笁" :value="1"></el-option>
-                    <el-option label="鏉庡洓" :value="1"></el-option>
-                    <el-option label="鐜嬩簩" :value="1"></el-option>
+            <el-form-item label="鐩樼偣浠撳簱" prop="warehouseId">
+                <el-select v-model="form.warehouseId" @change="getName" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="(item, index) in warehouseList"
+                        :key="index"
+                        :label="item.name"
+                        :value="item.id" />
                 </el-select>
             </el-form-item>
-            <el-form-item label="鐩樼偣鍛�" prop="name">
-                <el-select v-model="form.name" placeholder="璇烽�夋嫨">
-                    <el-option label="寮犱笁" :value="1"></el-option>
-                    <el-option label="鏉庡洓" :value="1"></el-option>
-                    <el-option label="鐜嬩簩" :value="1"></el-option>
+            <el-form-item label="鐩樼偣鍛�" prop="userId">
+                <el-select v-model="form.userId" @change="getName" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="(item, index) in userList"
+                        :key="index"
+                        :label="item.realname"
+                        :value="item.id" />
                 </el-select>
+            </el-form-item>
+            <el-form-item label="鐩樼偣鍗曞悕绉�" prop="name">
+                <el-input v-model="form.name" placeholder="璇疯緭鍏�" v-trim />
             </el-form-item>
         </el-form>
     </GlobalWindow>
@@ -37,6 +43,8 @@
 <script>
   import BaseOpera from '@/components/base/BaseOpera'
   import GlobalWindow from '@/components/common/GlobalWindow'
+  import { list } from '@/api/ywWarehouse'
+  import { getUserList } from '@/api/system/user'
   export default {
     name: 'newInventory',
     extends: BaseOpera,
@@ -47,21 +55,45 @@
         form: {
           id: '',
           name: '',
+          planDate: '',
+          warehouseId: '',
+          userId: ''
         },
         // 楠岃瘉瑙勫垯
         rules: {
-          name: [{ required: true, message: '璇疯緭鍏ラ」鐩悕绉�', trigger: 'blur' }]
+          planDate: [{ required: true, message: '璇烽�夋嫨鐩樼偣鏃ユ湡', trigger: 'blur' }],
+          warehouseId: [{ required: true, message: '璇烽�夋嫨鐩樼偣浠撳簱', trigger: 'blur' }],
+          userId: [{ required: true, message: '璇烽�夋嫨鐩樼偣鍛�', trigger: 'blur' }],
+          name: [{ required: true, message: '璇疯緭鍏ョ洏鐐瑰崟鍚嶇О', trigger: 'blur' }]
         },
+        warehouseList: [],
+        userList: []
       }
     },
     created() {
       this.config({
-        api: '/project/ywProject',
-        'field.id': 'id'
+        api: '/ywStocktaking'
       })
+      this.getList()
     },
     methods: {
-    
+        getList() {
+          list({})
+            .then(res => {
+              this.warehouseList = res
+            })
+          getUserList({})
+            .then(res => {
+              this.userList = res
+            })
+        },
+      getName(e) {
+          if (this.form.warehouseId && this.form.userId && this.form.planDate) {
+            let userName = this.userList.filter(item => item.id === this.form.userId)[0].realname
+            let warehouseName = this.warehouseList.filter(item => item.id === this.form.warehouseId)[0].name
+            this.form.name = warehouseName + '-' + userName + '-' + this.form.planDate
+          }
+      }
     }
   }
 </script>
diff --git a/admin/src/views/stock/components/newMaterial.vue b/admin/src/views/stock/components/newMaterial.vue
index 519bf22..6c45610 100644
--- a/admin/src/views/stock/components/newMaterial.vue
+++ b/admin/src/views/stock/components/newMaterial.vue
@@ -9,67 +9,47 @@
             <div class="main_content">
                 <el-form :model="form" label-position="top" ref="form" :rules="rules">
                     <div class="list">
-                        <el-form-item label="鐗╂枡缂栫爜" prop="contractId">
-                            <el-input v-model="form.renterName" placeholder="涓嶈緭鍏ョ郴缁熶細鑷姩缂栫爜" v-trim />
+                        <el-form-item label="鐗╂枡缂栫爜" prop="code">
+                            <el-input v-model="form.code" placeholder="涓嶈緭鍏ョ郴缁熶細鑷姩缂栫爜" v-trim />
                         </el-form-item>
-                        <el-form-item label="鐗╂枡鍚嶇О" prop="renterName">
-                            <el-input v-model="form.renterName" placeholder="璇疯緭鍏�" v-trim />
+                        <el-form-item label="鐗╂枡鍚嶇О" prop="name">
+                            <el-input v-model="form.name" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="鐗╂枡鍒嗙被" prop="ywContractRoomList">
-                            <el-select v-model="form.ywContractRoomList" placeholder="璇烽�夋嫨">
-                                <el-option
-                                    v-for="(item, index) in houseList"
-                                    :key="index"
-                                    :value="item.id"
-                                    :label="item.projectName + item.buildingName + item.floorName + item.roomName" />
-                            </el-select>
+                        <el-form-item label="鐗╂枡鍒嗙被" prop="cateArr">
+                            <el-cascader
+                                v-model="form.cateArr"
+                                :options="cateList"
+                                @change="getCateVal"
+                                :props="{ label: 'name', value: 'id', children: 'childCategoryList' }"
+                                placeholder="璇烽�夋嫨" />
                         </el-form-item>
-                        <el-form-item label="鏉$爜" prop="costType">
-                            <el-input v-model="form.renterName" placeholder="璇疯緭鍏�" v-trim />
+                        <el-form-item label="鏉$爜" prop="qrcode">
+                            <el-input v-model="form.qrcode" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="鍝佺墝" prop="date">
-                            <el-input v-model="form.renterName" placeholder="璇疯緭鍏�" v-trim />
+                        <el-form-item label="鍝佺墝" prop="brand">
+                            <el-input v-model="form.brand" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="瑙勬牸鍨嬪彿" prop="totleFee">
-                            <el-input v-model="form.renterName" placeholder="璇疯緭鍏�" v-trim />
+                        <el-form-item label="瑙勬牸鍨嬪彿" prop="attr">
+                            <el-input v-model="form.attr" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="瀹夊叏搴撳瓨锛堜笅闄愶級" prop="planPayDate">
-                            <el-input v-model="form.renterName" placeholder="璇疯緭鍏�" v-trim />
+                        <el-form-item label="瀹夊叏搴撳瓨锛堜笅闄愶級" prop="minStock">
+                            <el-input v-model="form.minStock" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="瀹夊叏搴撳瓨锛堜笂闄愶級" prop="companyId">
-                            <el-input v-model="form.renterName" placeholder="璇疯緭鍏�" v-trim />
+                        <el-form-item label="瀹夊叏搴撳瓨锛堜笂闄愶級" prop="maxStock">
+                            <el-input v-model="form.maxStock" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="鍗曚綅" prop="companyId">
-                            <el-input v-model="form.renterName" placeholder="璇疯緭鍏�" v-trim />
+                        <el-form-item label="鍗曚綅" prop="unitName">
+                            <el-input v-model="form.unitName" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="鎵�灞為」鐩�" prop="companyId">
-                            <el-select v-model="form.ywContractRoomList" placeholder="璇烽�夋嫨">
-                                <el-option
-                                    v-for="(item, index) in houseList"
-                                    :key="index"
-                                    :value="item.id"
-                                    :label="item.projectName + item.buildingName + item.floorName + item.roomName" />
-                            </el-select>
-                        </el-form-item>
-                        <el-form-item label="鎵�灞炴埧婧�" prop="companyId">
-                            <el-select v-model="form.ywContractRoomList" placeholder="璇烽�夋嫨">
-                                <el-option
-                                    v-for="(item, index) in houseList"
-                                    :key="index"
-                                    :value="item.id"
-                                    :label="item.projectName + item.buildingName + item.floorName + item.roomName" />
-                            </el-select>
-                        </el-form-item>
-                        <el-form-item label="鐗╂枡鐓х墖" prop="companyId">
+                        <el-form-item label="鐗╂枡鐓х墖" prop="multifile">
                             <el-upload
-                                class="upload-demo"
-                                :show-file-list="false"
-                                :data="uploadData"
                                 :action="uploadImgUrl"
+                                :file-list="fileList"
+                                :data="uploadData"
+                                list-type="picture-card"
                                 :on-success="uploadAvatarSuccess"
-                                :before-upload="beforeUpload"
-                                :on-error="uploadError">
-                                <el-button icon="el-icon-plus" plain>涓婁紶</el-button>
+                                :on-remove="dele">
+                                <i class="el-icon-plus"></i>
                             </el-upload>
                         </el-form-item>
                         <el-form-item style="width: 100%;" label="澶囨敞" prop="remark">
@@ -85,6 +65,7 @@
 <script>
   import GlobalWindow from '@/components/common/GlobalWindow'
   import BaseOpera from '@/components/base/BaseOpera'
+  import { fetchList } from '@/api/business/category.js'
   export default {
     name: 'newMaterial',
     components: {
@@ -92,68 +73,103 @@
     },
     extends: BaseOpera,
     data () {
+      var validateCateArr = (rule, value, callback) => {
+        if (value.length === 0) {
+          callback(new Error('璇烽�夋嫨鐗╂枡鍒嗙被'));
+        } else {
+          callback();
+        }
+      };
       return {
         form: {
-          contractId: '',
-          renterName: '',
-          renterId: '',
-          costType: '',
-          type: '',
-          companyId: '',
+          id: null,
+          code: '',
+          name: '',
+          parentCateId: '',
+          cateId: '',
+          cateArr: [],
+          multifile: null,
           remark: '',
-          startDate: '',
-          endDate: '',
-          totleFee: '',
-          planPayDate: '',
-          multifileList: [],
-          ywContractRoomList: [],
-          date: [],
-          RoomName: ''
+          unitName: '',
+          maxStock: '',
+          minStock: '',
+          attr: '',
+          brand: '',
+          qrcode: ''
         },
-        rules: [],
-        loadingInstance: null,
+        rules: {
+          name: [
+            { required: true, message: '璇疯緭鍏ョ墿鏂欏悕绉�', trigger: 'blur' }
+          ],
+          cateArr: [
+            { required: true, validator: validateCateArr, trigger: 'blur' }
+          ],
+          qrcode: [
+            { required: true, message: '璇疯緭鍏ユ潯鐮�', trigger: 'blur' }
+          ]
+        },
+        cateList: [],
         uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
         fileList: [],
         uploadData: {
-          folder: 'YW_CONTRACT_BILL'
-        },
+          folder: 'YW_MATERIAL'
+        }
       }
+    },
+    created () {
+      this.config({
+        api: '/ywMaterial'
+      })
     },
     methods: {
       open (title, target) {
         this.title = title
+        this.fileList = []
         this.visible = true
-      },
-      dele (imgaddr) {
-        this.form.multifileList.forEach((item, index) => {
-          if (imgaddr === item.imgaddr) {
-            this.form.multifileList.splice(index, 1)
+        this.getCategry()
+        // 鏂板缓
+        if (target == null) {
+          this.$nextTick(() => {
+            this.$refs.form.resetFields()
+            this.form[this.configData['field.id']] = null
+          })
+          return
+        }
+        // 缂栬緫
+        this.$nextTick(() => {
+          for (const key in this.form) {
+            this.form[key] = target[key]
+          }
+          if (this.form.multifile) {
+            this.fileList = [
+              { url: this.form.multifile.fileurlFull, ...this.form.multifile }
+            ]
           }
         })
       },
-      beforeUpload (file) {
-        this.loadingInstance = Loading.service({
-          lock: true,
-          text: 'Loading',
-          spinner: 'el-icon-loading',
-          background: 'rgba(0, 0, 0, 0.7)'
+      getCateVal(e) {
+        this.form.parentCateId = e[0]
+        this.form.cateId = e[1]
+      },
+      getCategry() {
+        fetchList({
+          capacity: 1000,
+          model: {
+            type: 7
+          },
+          page: 1
+        }).then(res => {
+          this.cateList = res.records
         })
       },
-      uploadError () {
-        this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
-          if (this.loadingInstance) {
-            this.loadingInstance.close()
-          }
-        })
+      dele (e) {
+        this.fileList = []
+        this.form.multifile = null
       },
       uploadAvatarSuccess (file) {
-        this.$nextTick(() => {
-          if (this.loadingInstance) {
-            this.loadingInstance.close()
-          }
-        })
         const item = file.data[0]
-        this.form.multifileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() })
+        this.fileList.push({ ...item, fileurl: item.imgaddr, name: item.originname })
+        this.form.multifile = { ...item, fileurl: item.imgaddr, name: item.originname }
       }
     }
   }
diff --git a/admin/src/views/stock/components/newWarehouse.vue b/admin/src/views/stock/components/newWarehouse.vue
index 70386ad..e2f076b 100644
--- a/admin/src/views/stock/components/newWarehouse.vue
+++ b/admin/src/views/stock/components/newWarehouse.vue
@@ -9,30 +9,33 @@
             <el-form-item label="浠撳簱鍚嶇О" prop="name">
                 <el-input v-model="form.name" placeholder="璇疯緭鍏�" v-trim />
             </el-form-item>
-            <el-form-item label="鎵�鍦ㄤ綅缃�" prop="name">
-                <el-input v-model="form.name" placeholder="璇疯緭鍏�" v-trim />
+            <el-form-item label="鎵�鍦ㄤ綅缃�" prop="position">
+                <el-input v-model="form.position" placeholder="璇疯緭鍏�" v-trim />
             </el-form-item>
-            <el-form-item label="璐熻矗浜�" prop="name">
-                <el-select v-model="form.name" placeholder="璇烽�夋嫨">
-                    <el-option label="寮犱笁" :value="1"></el-option>
-                    <el-option label="鏉庡洓" :value="1"></el-option>
-                    <el-option label="鐜嬩簩" :value="1"></el-option>
+            <el-form-item label="璐熻矗浜�" prop="userId">
+                <el-select v-model="form.userId" filterable placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in userList"
+                        :key="item.id"
+                        :label="item.realname"
+                        :value="item.id">
+                    </el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="name">
-                <el-input v-model="form.name" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim />
+                <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="sortnum">
+                <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim />
             </el-form-item>
-            <el-form-item label="鐘舵��" prop="name">
+            <el-form-item label="鐘舵��" prop="status">
                 <el-switch
-                    v-model="form.name"
+                    v-model="form.status"
                     active-color="#13ce66"
                     inactive-color="#ff4949"
-                    active-value="100"
-                    inactive-value="0">
+                    :active-value="0"
+                    :inactive-value="1">
                 </el-switch>
             </el-form-item>
-            <el-form-item label="澶囨敞" prop="name">
-                <el-input v-model="form.name" type="textarea" :autosize="{ minRows: 2, maxRows: 4}" placeholder="璇疯緭鍏�" v-trim />
+            <el-form-item label="澶囨敞" prop="remark">
+                <el-input v-model="form.remark" type="textarea" :autosize="{ minRows: 2, maxRows: 4}" placeholder="璇疯緭鍏�" v-trim />
             </el-form-item>
         </el-form>
     </GlobalWindow>
@@ -41,6 +44,7 @@
 <script>
   import BaseOpera from '@/components/base/BaseOpera'
   import GlobalWindow from '@/components/common/GlobalWindow'
+  import { getUserList } from '@/api/system/user'
   export default {
     name: 'newWarehouse',
     extends: BaseOpera,
@@ -51,18 +55,32 @@
         form: {
           id: '',
           name: '',
+          position: '',
+          userId: '',
+          sortnum: '',
+          remark: '',
+          status: 0
         },
         // 楠岃瘉瑙勫垯
         rules: {
-          name: [{ required: true, message: '璇疯緭鍏ラ」鐩悕绉�', trigger: 'blur' }]
+          name: [{ required: true, message: '浠撳簱鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }]
         },
+        userList: []
       }
     },
     created() {
       this.config({
-        api: '/project/ywProject',
-        'field.id': 'id'
+        api: '/ywWarehouse'
       })
+      this.getUser()
+    },
+    methods: {
+      getUser() {
+        getUserList({})
+            .then(res => {
+              this.userList = res
+            })
+      }
     }
   }
 </script>
diff --git a/admin/src/views/stock/in.vue b/admin/src/views/stock/in.vue
index ee899e6..c35f304 100644
--- a/admin/src/views/stock/in.vue
+++ b/admin/src/views/stock/in.vue
@@ -2,20 +2,25 @@
   <div class="main_app">
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <div class="mt20">
-      <el-button type="primary" @click="handleEdit()" v-permissions="['business:ywpatrolline:create']">鏂板缓鍑哄簱鍗�</el-button>
-      <el-button @click="handleEx()" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
+      <el-button type="primary" @click="handleEdit()" v-permissions="['business:ywoutinboundrecord:create']">鏂板缓鍏ュ簱鍗�</el-button>
+      <el-button @click="handleEx()" v-permissions="['business:ywoutinboundrecord:exportExcel']">瀵煎嚭</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="platformName" label="鍑哄簱鍗曞彿" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="platformGroupName" label="鍑哄簱浠撳簱" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeFront" label="鍑哄簱绫诲瀷" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeBack" label="鍑哄簱鏃ユ湡" min-width="110" show-overflow-tooltip />
-      <el-table-column prop="param1" label="鍑哄簱鏁伴噺" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="param2" label="鎿嶄綔浜�" min-width="90" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="鎿嶄綔鏃堕棿" min-width="140" show-overflow-tooltip />
+      <el-table-column prop="code" label="鍏ュ簱鍗曞彿" min-width="120" show-overflow-tooltip />
+      <el-table-column prop="warehouseName" label="鍏ュ簱浠撳簱" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="typeName" label="鍏ュ簱绫诲瀷" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="doneDate" label="鍏ュ簱鏃ユ湡" min-width="110" show-overflow-tooltip />
+      <el-table-column label="鍏ュ簱鏁伴噺" min-width="140">
+        <template v-slot="{ row }">
+          <div v-for="item in row.recordList">{{ item.materialName }}[{{ item.materialCode }}]*{{ item.stock }}{{
+            item.materialUnitName }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="createUserName" label="鎿嶄綔浜�" min-width="90" show-overflow-tooltip />
+      <el-table-column prop="createDate" label="鎿嶄綔鏃堕棿" min-width="140" show-overflow-tooltip />
       <el-table-column prop="workTime" label="鎿嶄綔" min-width="80" show-overflow-tooltip>
         <template v-slot="{ row }">
-          <span @click="handleDetail(row)" class="primaryColor pointer">鏌ョ湅璇︽儏</span>
+          <span @click="handleDetail(row)" v-permissions="['business:ywoutinboundrecord:query']" class="primaryColor pointer">鏌ョ湅璇︽儏</span>
         </template>
       </el-table-column>
     </el-table>
@@ -36,7 +41,9 @@
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+import { ywOutinboundPage, ywOutinboundEx } from '@/api'
+import { fetchList as getStoreList } from '@/api/ywWarehouse'
+import { StoreTypeOps, rules } from './components/config'
 export default {
   components: {
     Pagination,
@@ -54,26 +61,34 @@
         page: 1,
         total: 0
       },
-      filters: {},
-      list: [{}],
+      filters: {
+        inOut: 0
+      },
+      StoreTypeOps,
+      list: [],
       total: 0,
       queryFormConfig: {
         formItems: [
           {
-            filed: 'carCodeFront',
+            filed: 'code',
             type: 'input',
-            label: '鍑哄簱鍗曞彿',
+            label: '鍏ュ簱鍗曞彿',
           },
           {
-            filed: 'platformGroupId',
+            filed: 'warehouseId',
             type: 'select',
             label: '鎵�鍦ㄤ粨搴�',
+            labelCode: 'name',
+            valueCode: 'id',
             options: []
           },
           {
-            filed: 'carCodeFront',
-            type: 'input',
-            label: '鍑哄簱绫诲瀷',
+            filed: 'type',
+            type: 'select',
+            label: '鍏ュ簱绫诲瀷',
+            labelCode: 'name',
+            valueCode: 'id',
+            options: StoreTypeOps.filter(i => i.type == 0)
           },
         ],
         online: true
@@ -81,8 +96,8 @@
     }
   },
   created() {
-    // this.getList()
-    // this.getGroupList()
+    this.getList()
+    this.initData()
   },
   methods: {
     handleSub() {
@@ -98,45 +113,56 @@
         this.$refs.InEditRef.isShowModal = true
       })
     },
-    handleDetail() {
+    handleDetail(row) {
       this.isShowDetail = true
       this.$nextTick(() => {
         this.$refs.InDetailRef.visible = true
+        this.$refs.InDetailRef.getDetail(row.id)
       })
     },
-    handleEx() { },
-    getGroupList() {
-      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
-        this.queryFormConfig.formItems[1].options = res.map(i => {
-          return {
-            value: i.id,
-            label: i.name
-          }
+    handleEx() {
+      this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵')
+        .then(() => {
+          this.loading = true
+          ywOutinboundEx({
+            page: this.pagination.page,
+            capacity: 1000000,
+            model: this.filters
+          })
+            .then(response => {
+              this.download(response)
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
         })
-        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '鍏ㄩ儴鏈堝彴缁�' })
+        .catch(() => { })
+    },
+    initData() {
+      getStoreList({ capacity: 9999, page: 1, model: {} }).then(res => {
+        this.queryFormConfig.formItems[1].options = res.records || []
       })
     },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      if(page){pagination.page = page}
-      platformLogPage({
+      if (page) { pagination.page = page }
+      ywOutinboundPage({
         model: {
           ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          inOut: 0
         },
-        sorts: [{ direction: 'DESC', property: 'param1' }],
+        // sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
         page: page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
         this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
+          item.typeName = this.StoreTypeOps[item.type].name
         })
         this.pagination.total = res.total || 0
       }, () => {
@@ -144,7 +170,7 @@
       })
     },
     clear() {
-      this.filters = {}
+      this.filters = {inOut: 0}
       this.pagination.pageSize = 10
       this.pagination.page = 1
       this.getList()
diff --git a/admin/src/views/stock/out.vue b/admin/src/views/stock/out.vue
index 07aca66..c94aedf 100644
--- a/admin/src/views/stock/out.vue
+++ b/admin/src/views/stock/out.vue
@@ -2,20 +2,24 @@
   <div class="main_app">
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <div class="mt20">
-      <el-button type="primary" @click="handleEdit()" v-permissions="['business:ywpatrolline:create']">鏂板缓鍑哄簱鍗�</el-button>
-      <el-button @click="handleEx()" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
+      <el-button type="primary" @click="handleEdit()" v-permissions="['business:ywoutinboundrecord:create']">鏂板缓鍑哄簱鍗�</el-button>
+      <el-button @click="handleEx()" v-permissions="['business:ywoutinboundrecord:exportExcel']">瀵煎嚭</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="platformName" label="鍑哄簱鍗曞彿" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="platformGroupName" label="鍑哄簱浠撳簱" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeFront" label="鍑哄簱绫诲瀷" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeBack" label="鍑哄簱鏃ユ湡" min-width="110" show-overflow-tooltip />
-      <el-table-column prop="param1" label="鍑哄簱鏁伴噺" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="param2" label="鎿嶄綔浜�" min-width="90" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="鎿嶄綔鏃堕棿" min-width="140" show-overflow-tooltip />
+      <el-table-column prop="code" label="鍑哄簱鍗曞彿" min-width="120" show-overflow-tooltip />
+      <el-table-column prop="warehouseName" label="鍑哄簱浠撳簱" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="typeName" label="鍑哄簱绫诲瀷" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="doneDate" label="鍑哄簱鏃ユ湡" min-width="110" show-overflow-tooltip />
+      <el-table-column label="鍑哄簱鏁伴噺" min-width="140">
+        <template v-slot="{ row }">
+          <div v-for="item in row.recordList">{{ item.materialName }}[{{ item.materialCode }}]*{{ item.stock }}{{ item.materialUnitName }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="createUserName" label="棰嗙敤浜�" min-width="90" show-overflow-tooltip />
+      <el-table-column prop="createDate" label="鎿嶄綔鏃堕棿" min-width="140" show-overflow-tooltip />
       <el-table-column prop="workTime" label="鎿嶄綔" min-width="80" show-overflow-tooltip>
         <template v-slot="{ row }">
-          <span @click="handleDetail(row)" class="primaryColor pointer">鏌ョ湅璇︽儏</span>
+          <span @click="handleDetail(row)" v-permissions="['business:ywoutinboundrecord:query']" class="primaryColor pointer">鏌ョ湅璇︽儏</span>
         </template>
       </el-table-column>
     </el-table>
@@ -24,19 +28,21 @@
     </div>
     <!--  -->
     <OutEdit v-if="isShowEdit" @close="isShowEdit = false" @success="getList" ref="OutEditRef" />
-    <OutDetail v-if="isShowDetail" ref="OutDetailRef" />
+    <OutDetail v-if="isShowDetail" ref="InDetailRef" />
   </div>
 </template>
 
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
-import OutEdit from './components/OutEdit'
-import OutDetail from './components/OutDetail'
+import OutEdit from './components/OutEdit.vue'
+import OutDetail from './components/OutDetail.vue'
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+import { ywOutinboundPage } from '@/api'
+import { fetchList as getStoreList } from '@/api/ywWarehouse'
+import { StoreTypeOps, rules } from './components/config'
 export default {
   components: {
     Pagination,
@@ -54,26 +60,34 @@
         page: 1,
         total: 0
       },
-      filters: {},
-      list: [{}],
+      filters: {
+        inOut: 1
+      },
+      StoreTypeOps,
+      list: [],
       total: 0,
       queryFormConfig: {
         formItems: [
           {
-            filed: 'carCodeFront',
+            filed: 'code',
             type: 'input',
             label: '鍑哄簱鍗曞彿',
           },
           {
-            filed: 'platformGroupId',
+            filed: 'warehouseId',
             type: 'select',
             label: '鎵�鍦ㄤ粨搴�',
+            labelCode: 'name',
+            valueCode: 'id',
             options: []
           },
           {
-            filed: 'carCodeFront',
-            type: 'input',
+            filed: 'type',
+            type: 'select',
             label: '鍑哄簱绫诲瀷',
+            labelCode: 'name',
+            valueCode: 'id',
+            options: StoreTypeOps.filter(i => i.type == 0)
           },
         ],
         online: true
@@ -81,8 +95,8 @@
     }
   },
   created() {
-    // this.getList()
-    // this.getGroupList()
+    this.getList()
+    this.initData()
   },
   methods: {
     handleSub() {
@@ -98,45 +112,55 @@
         this.$refs.OutEditRef.isShowModal = true
       })
     },
-    handleDetail() {
+    handleDetail(row) {
       this.isShowDetail = true
       this.$nextTick(() => {
-        this.$refs.OutDetailRef.visible = true
+        this.$refs.InDetailRef.visible = true
+        this.$refs.InDetailRef.getDetail(row.id)
       })
     },
-    handleEx() { },
-    getGroupList() {
-      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
-        this.queryFormConfig.formItems[1].options = res.map(i => {
-          return {
-            value: i.id,
-            label: i.name
-          }
+    handleEx() {
+      this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵')
+        .then(() => {
+          this.loading = true
+          ywOutinboundEx({
+            page: this.pagination.page,
+            capacity: 1000000,
+            model: this.filters
+          })
+            .then(response => {
+              this.download(response)
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
         })
-        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '鍏ㄩ儴鏈堝彴缁�' })
+        .catch(() => { })
+    },
+    initData() {
+      getStoreList({ capacity: 9999, page: 1, model: {} }).then(res => {
+        this.queryFormConfig.formItems[1].options = res.records || []
       })
     },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
       if(page){pagination.page = page}
-      platformLogPage({
+      ywOutinboundPage({
         model: {
-          ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          ...filters
         },
-        sorts: [{ direction: 'DESC', property: 'param1' }],
+        // sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
         page: page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
         this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
+          item.typeName = this.StoreTypeOps[item.type].name
         })
         this.pagination.total = res.total || 0
       }, () => {
@@ -144,7 +168,9 @@
       })
     },
     clear() {
-      this.filters = {}
+      this.filters = {
+        inOut: 1
+      }
       this.pagination.pageSize = 10
       this.pagination.page = 1
       this.getList()
diff --git a/admin/src/views/stock/query.vue b/admin/src/views/stock/query.vue
index 3dd9bdb..d5d750f 100644
--- a/admin/src/views/stock/query.vue
+++ b/admin/src/views/stock/query.vue
@@ -2,16 +2,16 @@
   <div class="main_app">
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <div class="mt20">
-      <el-button @click="handleEx()" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
+      <el-button @click="handleEx" v-permissions="['business:ywstock:exportExcel']">瀵煎嚭</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="platformName" label="璧勪骇缂栫爜" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="platformGroupName" label="璧勪骇鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeFront" label="鏉$爜" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeBack" label="鍝佺墝" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="param1" label="瑙勬牸鍨嬪彿" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="param2" label="鎵�鍦ㄤ粨搴�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="搴撳瓨" min-width="80" show-overflow-tooltip />
+      <el-table-column prop="materialCode" label="鐗╂枡缂栫爜" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="materialName" label="鐗╂枡鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="materialQrcode" label="鏉$爜" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="materialBrand" label="鍝佺墝" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="materialAttr" label="瑙勬牸鍨嬪彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="warehouseName" label="鎵�鍦ㄤ粨搴�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="stock" label="搴撳瓨" min-width="80" show-overflow-tooltip />
     </el-table>
     <div class="mt20">
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
@@ -25,7 +25,7 @@
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+import { ywStockPage,ywStockPageEx  } from '@/api/store/index'
 export default {
   components: {
     Pagination,
@@ -45,77 +45,68 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'platformGroupId',
+            filed: 'warehouseId',
             type: 'select',
             label: '鎵�鍦ㄤ粨搴�',
             options: []
           },
           {
-            filed: 'carCodeFront',
+            filed: 'materialCode',
             type: 'input',
-            label: '璧勪骇淇℃伅',
-            placeholder: '璇疯緭鍏ヨ祫浜у悕绉�/缂栫爜'
+            label: '鐗╂枡鍚嶇О/缂栫爜',
+            placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�/缂栫爜'
           },
           {
-            filed: 'carCodeFront',
+            filed: 'materialAttr',
             type: 'input',
             label: '鍨嬪彿',
           },
-        ],
-        online: true
+        ]
       }
     }
   },
   created() {
-    // this.getList()
-    // this.getGroupList()
+    this.getList()
   },
   methods: {
-    handleSub() {
-      this.$refs.ruleForm.validate((valid) => {
-        if (valid) {
-          alert('submit!')
-        }
-      })
-    },
-    handleEx() { },
-    getGroupList() {
-      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
-        this.queryFormConfig.formItems[1].options = res.map(i => {
-          return {
-            value: i.id,
-            label: i.name
-          }
-        })
-        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '鍏ㄩ儴鏈堝彴缁�' })
-      })
-    },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      platformLogPage({
+      ywStockPage({
         model: {
-          ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          ...filters
         },
-        sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
         page: page || pagination.page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
-        this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
-        })
         this.pagination.total = res.total || 0
       }, () => {
         this.loading = false
       })
     },
+    handleEx() {
+      this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵')
+        .then(() => {
+          this.loading = true
+          ywStockPageEx({
+            page: this.pagination.page,
+            capacity: 1000000,
+            model: this.filters
+          })
+            .then(response => {
+              this.download(response)
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
+        })
+        .catch(() => { })
+    },
     clear() {
       this.filters = {}
       this.pagination.pageSize = 10
diff --git a/admin/src/views/stock/record.vue b/admin/src/views/stock/record.vue
index f7f37f0..b2e1863 100644
--- a/admin/src/views/stock/record.vue
+++ b/admin/src/views/stock/record.vue
@@ -2,41 +2,70 @@
   <div class="main_app">
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <div class="mt20">
-      <el-button type="primary" @click="handleEx()" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
+      <el-button @click="handleEx()" v-permissions="['business:ywoutinboundrecord:exportExcel']">瀵煎嚭</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="platformName" label="鍗曟嵁鏃ユ湡" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="platformName" label="璧勪骇缂栫爜" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="platformGroupName" label="璧勪骇鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeFront" label="璧勪骇鍒嗙被" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="carCodeBack" label="鏁伴噺" min-width="80" show-overflow-tooltip />
-      <el-table-column prop="param1" label="绫诲瀷" min-width="80" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="浠撳簱" min-width="90" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="鍗曟嵁缂栧彿" min-width="120" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="鍒涘缓浜�" min-width="80" show-overflow-tooltip />
-      <el-table-column prop="workTime" label="鍒涘缓鏃堕棿" min-width="140" show-overflow-tooltip />
+      <el-table-column prop="doneDate" label="鍗曟嵁鏃ユ湡" min-width="90" show-overflow-tooltip />
+      <el-table-column prop="materialCode" label="鐗╂枡缂栫爜" min-width="90" show-overflow-tooltip />
+      <el-table-column prop="materialName" label="鐗╂枡鍚嶇О" min-width="90" show-overflow-tooltip />
+      <el-table-column prop="carCodeFront" label="鐗╂枡鍒嗙被" min-width="120" show-overflow-tooltip>
+        <template v-slot="{ row }">
+          <span>{{ row.categoryParentName }}/{{ row.categoryName }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="carCodeBack" label="鏁伴噺" min-width="80" show-overflow-tooltip>
+        <template v-slot="{ row }">
+          <span>{{ row.stock }}{{ row.materialUnitName }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="param1" label="绫诲瀷" min-width="70" show-overflow-tooltip>
+        <template v-slot="{ row }">
+          <span v-if="row.type || row.type == 0">{{ StoreTypeOps[row.type].name }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="warehouseName" label="浠撳簱" min-width="90" show-overflow-tooltip />
+      <el-table-column prop="code" label="鍗曟嵁缂栧彿" min-width="140">
+        <template v-slot="{ row }">
+          <span class="primaryColor pointer" @click='detailClick(row)'>{{ row.code }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="createUserName" label="鍒涘缓浜�" min-width="80" show-overflow-tooltip />
+      <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="140" show-overflow-tooltip />
     </el-table>
     <div class="mt20">
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
     </div>
+    <!--  -->
+    <OutDetail v-if="isShowOutDetail" ref="OutDetailRef" />
+    <InDetail v-if="isShowInDetail" ref="InDetailRef" />
   </div>
 </template>
 
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
+import InDetail from './components/InDetail'
+import OutDetail from './components/OutDetail.vue'
+
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
+
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+import { ywOutinboundRecord, ywOutinboundRecordEx } from '@/api'
+import { fetchList as getStoreList } from '@/api/ywWarehouse'
+import { StoreTypeOps } from './components/config'
 export default {
   components: {
     Pagination,
-    QueryForm
+    QueryForm,
+    InDetail,
+    OutDetail
   },
   data() {
     return {
       loading: false,
+      isShowInDetail: false,
+      isShowOutDetail: false,
       pagination: {
         pageSize: 10,
         page: 1,
@@ -45,29 +74,34 @@
       filters: {},
       list: [],
       total: 0,
+      StoreTypeOps,
       queryFormConfig: {
         formItems: [
           {
-            filed: 'carCodeFront',
+            filed: 'materialCode',
             type: 'input',
-            label: '璧勪骇缂栫爜',
+            label: '鐗╂枡缂栫爜',
           },
           {
-            filed: 'platformGroupId',
+            filed: 'warehouseId',
             type: 'select',
+            labelCode: 'name',
+            valueCode: 'id',
             label: '鎵�鍦ㄤ粨搴�',
             options: []
           },
           {
-            filed: 'carCodeFront',
+            filed: 'code',
             type: 'input',
             label: '鍗曟嵁缂栧彿',
           },
           {
-            filed: 'platformGroupId',
+            filed: 'type',
             type: 'select',
             label: '鍗曟嵁绫诲瀷',
-            options: []
+            labelCode: 'name',
+            valueCode: 'id',
+            options: StoreTypeOps
           },
           {
             filed: 'selDate',
@@ -76,7 +110,7 @@
           },
           {
             filed: 'selTime',
-            type: 'daterange',
+            type: 'datetimerange',
             label: '鍒涘缓鏃堕棿',
           },
         ],
@@ -85,8 +119,8 @@
     }
   },
   created() {
-    // this.getList()
-    // this.getGroupList()
+    this.getList()
+    this.initData()
   },
   methods: {
     handleSub() {
@@ -96,39 +130,77 @@
         }
       })
     },
-    handleEx() { },
-    getGroupList() {
-      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
-        this.queryFormConfig.formItems[1].options = res.map(i => {
-          return {
-            value: i.id,
-            label: i.name
-          }
+    detailClick(item) {
+      const index = item.code.indexOf('RK')
+      if(index > -1){
+        this.isShowInDetail = true
+        this.$nextTick(() => {
+          this.$refs.InDetailRef.visible = true
+          this.$refs.InDetailRef.getDetail(item.outInBoundId)
         })
-        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '鍏ㄩ儴鏈堝彴缁�' })
+      }else{
+        this.isShowOutDetail = true
+        this.$nextTick(() => {
+          this.$refs.OutDetailRef.visible = true
+          this.$refs.OutDetailRef.getDetail(item.outInBoundId)
+        })
+      }
+    },
+    handleEx() {
+      this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵')
+        .then(() => {
+          this.loading = true
+          ywOutinboundRecordEx({
+            page: this.pagination.page,
+            capacity: 1000000,
+            model: this.filters
+          })
+            .then(response => {
+              this.download(response)
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
+        })
+        .catch(() => { })
+    },
+    initData() {
+      getStoreList({ capacity: 9999, page: 1, model: {} }).then(res => {
+        this.queryFormConfig.formItems[1].options = res.records || []
       })
     },
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      platformLogPage({
+      if (filters.selDate && filters.selDate.length > 0) {
+        filters.doneDateStart = filters.selDate[0]
+        filters.doneDateEnd = filters.selDate[1]
+      } else {
+        filters.doneDateStart = null
+        filters.doneDateEnd = null
+      }
+      if (filters.selTime && filters.selTime.length > 0) {
+        filters.createDateStart = filters.selTime[0]
+        filters.createDateEnd = filters.selTime[1]
+      } else {
+        filters.createDateStart = null
+        filters.createDateEnd = null
+      }
+      if(page){
+        pagination.page = page
+      }
+      ywOutinboundRecord({
         model: {
-          ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          ...filters
         },
-        sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
-        page: page || pagination.page,
+        page: pagination.page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
-        this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
-        })
         this.pagination.total = res.total || 0
       }, () => {
         this.loading = false
diff --git a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
index c97fbf4..f3c7e3a 100644
--- a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
+++ b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -3,32 +3,48 @@
     @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
       <el-form-item label="浣嶇疆绫诲瀷" prop="areaType">
-        <el-select v-model="form.areaType">
-          <el-option label="瀹ゅ唴缁翠慨" value="0"></el-option>
-          <el-option label="鍏叡缁翠慨" value="1"></el-option>
+        <el-select v-model="form.areaType" @change="changeType">
+          <el-option label="瀹ゅ唴缁翠慨" :value="0"></el-option>
+          <el-option label="鍏叡缁翠慨" :value="1"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="閫夋嫨椤圭洰" prop="projectId">
-        <el-select v-model="form.projectId" clearable filterable @change="getBuild">
-          <el-option v-for="item in projectList" :label="item.name" :value="item.id" />
-        </el-select>
+  
+      <el-form-item label="鎶ヤ慨鍖哄煙" prop="rooms">
+        <el-cascader
+          v-model="form.rooms"
+          :disabled="![0,1].includes(form.areaType)"
+          ref="cascader"
+          @change="getHouseVal"
+          placeholder="璇烽�夋嫨鎶ヤ慨鍖哄煙"
+          :options="form.areaType === 0 ? houseList : houseList1"
+          :props="{
+              label: 'name',
+              value: 'id',
+              children: 'projectDataVOList'
+          }" />
       </el-form-item>
-      <el-form-item label="閫夋嫨妤煎畤" prop="buildingId">
-        <el-select v-model="form.buildingId" clearable filterable @change="changeBuild">
-          <el-option v-for="item in buildList" :label="item.name" :value="item.id" />
-        </el-select>
-      </el-form-item>
+      
+<!--      <el-form-item label="閫夋嫨椤圭洰" prop="projectId">-->
+<!--        <el-select v-model="form.projectId" clearable filterable @change="getBuild">-->
+<!--          <el-option v-for="item in projectList" :label="item.name" :value="item.id" />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="閫夋嫨妤煎畤" prop="buildingId">-->
+<!--        <el-select v-model="form.buildingId" clearable filterable @change="changeBuild">-->
+<!--          <el-option v-for="item in buildList" :label="item.name" :value="item.id" />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
 
-      <el-form-item v-if="form.areaType == 1" label="閫夋嫨妤煎眰" prop="floorId">
-        <el-select v-model="form.floorId">
-          <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" />
-        </el-select>
-      </el-form-item>
-      <el-form-item v-if="form.areaType == 0" label="閫夋嫨鎴块棿" prop="roomId">
-        <el-select v-model="form.roomId" clearable filterable>
-          <el-option v-for="item in roomList" :label="item.roomNum" :value="item.id" />
-        </el-select>
-      </el-form-item>
+<!--      <el-form-item v-if="form.areaType == 1" label="閫夋嫨妤煎眰" prop="floorId">-->
+<!--        <el-select v-model="form.floorId">-->
+<!--          <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
+<!--      <el-form-item v-if="form.areaType == 0" label="閫夋嫨鎴块棿" prop="roomId">-->
+<!--        <el-select v-model="form.roomId" clearable filterable>-->
+<!--          <el-option v-for="item in roomList" :label="item.roomNum" :value="item.id" />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
       <el-form-item label="宸ュ崟鍒嗙被" prop="cateId">
         <el-cascader v-model="form.areaIds" @change="changeSel" placeholder="璇烽�夋嫨鍒嗙被" clearable :options="cateList"
           :props="{
@@ -63,8 +79,6 @@
         <el-input type="textarea" :rows="4" v-model="form.content" placeholder="璇疯緭鍏�" :maxlength="300" v-trim />
       </el-form-item>
     </el-form>
-    <!--  -->
-
   </GlobalWindow>
 </template>
 
@@ -72,7 +86,7 @@
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
 import { Loading, Message } from 'element-ui'
-import { getProjectList } from '@/api/project/ywProject'
+import { getProjectList, tree } from '@/api/project/ywProject'
 import { getBuildList } from '@/api/project/ywBuilding'
 import { getRoomList } from '@/api/project/ywRoom'
 import { getFloorList } from '@/api/project/yeFloor'
@@ -87,6 +101,9 @@
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
+  
+        rooms: [],
+        
         editDate: '',
         floor: '',
         title: '',
@@ -102,7 +119,7 @@
         userId: '',
         submitDate: '',
         cateId: '',
-        areaType: '0',
+        areaType: 0,
         code: '',
         dealStatus: '',
         dispatchUserId: '',
@@ -113,6 +130,8 @@
         dealInfo: '',
         dealType: ''
       },
+      houseList: [],
+      houseList1: [],
       loadingInstance: null,
       // 楠岃瘉瑙勫垯
       rules,
@@ -140,7 +159,8 @@
       this.visible = true
       this.getProject()
       this.getCate()
-      // 鏂板缓 
+      this.getHouseTree()
+      // 鏂板缓
       if (target == null) {
         this.form = {
           id: null,
@@ -159,7 +179,7 @@
           userId: '',
           submitDate: '',
           cateId: '',
-          areaType: '0',
+          areaType: 0,
           code: '',
           dealStatus: '',
           dispatchUserId: '',
@@ -185,6 +205,65 @@
           this.form[key] = target[key]
         }
       })
+    },
+    changeType(e) {
+      this.form.rooms = []
+      this.form.projectId = ''
+      this.form.buildingId = ''
+      this.form.levelList = ''
+      this.form.roomId = ''
+    },
+    getHouseVal(e) {
+      if (this.form.areaType === 0) {
+        this.form.projectId = e[0]
+        this.form.buildingId = e[1]
+        this.form.floorId = e[2]
+        this.form.roomId = e[3]
+      } else {
+        this.form.projectId = e[0]
+        this.form.buildingId = e[1]
+        this.form.floorId = e[2]
+      }
+    },
+    getHouseTree() {
+      tree({}).then(res => {
+        let arr1 = JSON.parse(JSON.stringify(res))
+        let arr2 = JSON.parse(JSON.stringify(res))
+        this.addParamToArray(arr1)
+        this.addParamToArray1(arr2)
+        this.houseList = arr1
+        this.houseList1 = arr2
+      })
+    },
+    addParamToArray(arr) {
+      for (let i = 0; i < arr.length; i++) {
+        const currentItem = arr[i].projectDataVOList
+        if (currentItem && currentItem.length >= 0) {
+          currentItem.forEach(item => {
+            if (item.lv === 3) {
+              delete item.projectDataVOList
+            }
+          })
+        }
+        if (currentItem && currentItem.length > 0) {
+          this.addParamToArray(currentItem)
+        }
+      }
+    },
+    addParamToArray1(arr) {
+      for (let i = 0; i < arr.length; i++) {
+        const currentItem = arr[i].projectDataVOList
+        if (currentItem && currentItem.length >= 0) {
+          currentItem.forEach(item => {
+            if (item.lv === 2) {
+              delete item.projectDataVOList
+            }
+          })
+        }
+        if (currentItem && currentItem.length > 0) {
+          this.addParamToArray1(currentItem)
+        }
+      }
     },
     close() {
       this.visible = false
@@ -347,4 +426,4 @@
     }
   }
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/admin/src/views/workorder/components/detail.vue b/admin/src/views/workorder/components/detail.vue
index f2e7d5f..0743cfa 100644
--- a/admin/src/views/workorder/components/detail.vue
+++ b/admin/src/views/workorder/components/detail.vue
@@ -1,14 +1,17 @@
 <template>
-  <GlobalWindow width="960px" title="宸ュ崟璇︽儏" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+  <GlobalWindow width="100%" title="宸ュ崟璇︽儏" :visible.sync="visible" :confirm-working="isWorking" @close="close"
     @confirm="confirm">
     <div class="main">
       <div class="title">
-        <span>宸ュ崟璇︽儏</span>
-        <div>
-          <div class="status primaryColor" v-if="info.dealStatus == 0 || info.dealStatus == null">寰呮寚娲�</div>
-          <div class="status green" v-if="info.dealStatus == 1">宸叉寚娲�</div>
-          <div class="status gray" v-if="info.dealStatus == 2">宸插鐞�</div>
+        <div class="title_left">
+          <span>宸ュ崟璇︽儏</span>
+          <div>
+            <div class="status primaryColor" v-if="info.dealStatus == 0 || info.dealStatus == null">寰呮寚娲�</div>
+            <div class="status green" v-if="info.dealStatus == 1">宸叉寚娲�</div>
+            <div class="status gray" v-if="info.dealStatus == 2">宸插鐞�</div>
+          </div>
         </div>
+        <el-button v-if="info.origin === 1" @click="openWT">鏌ョ湅闂涓婃姤</el-button>
       </div>
       <div class="main_content">
         <div class="list">
@@ -23,6 +26,11 @@
           <div class="item">
             <div class="la">宸ュ崟鍒嗙被</div>
             <div class="val">{{ info.categoryName }}</div>
+          </div>
+          <div class="item">
+            <div class="la">鏉ユ簮</div>
+            <div class="val" v-if="info.origin === 0">鑷缓</div>
+            <div class="val" v-if="info.origin === 1">闂杞伐鍗�</div>
           </div>
           <div class="item">
             <div class="la">涓婃姤浜�</div>
@@ -164,19 +172,24 @@
         </template>
       </el-form>
     </div>
+    <!--  闂涓婃姤璇︽儏  -->
+    <problemReportingDetails ref="problemReportingDetails" />
   </GlobalWindow>
 </template>
 
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
+import problemReportingDetails from './problemReportingDetails'
 import { detailById, dispatchOrder, dealOrder } from '@/api/workorder/ywWorkorder'
+import { getByWorkorderId } from '@/api/ywProblem'
 import { getUserList } from '@/api/system/user'
 import { Message, Loading } from 'element-ui'
 import dayjs from 'dayjs'
 export default {
   components: {
-    GlobalWindow
+    GlobalWindow,
+    problemReportingDetails
   },
   extends: BaseOpera,
   data() {
@@ -209,6 +222,13 @@
     this.getStaff()
   },
   methods: {
+    openWT() {
+      getByWorkorderId(this.id)
+        .then(res => {
+          console.log(res)
+          this.$refs.problemReportingDetails.open('闂涓婃姤璇︽儏', res)
+        })
+    },
     confirm() {
       this.$refs['form'].validate((valid) => {
         if (valid) {
@@ -308,39 +328,41 @@
   padding-top: 20px;
 
   .title {
-    font-weight: 500;
-    font-size: 18px;
-    color: $primary-color;
+    
     margin-bottom: 10px;
     display: flex;
     align-items: center;
-
-    .status {
-      padding: 0 12px;
-      height: 24px;
-      line-height: 24px;
-      border-radius: 2px;
-      border: 1px solid #00BA92;
-      color: #00BA92;
-      font-weight: 400;
-      font-size: 12px;
-      margin-left: 10px;
-    }
-
-    .primaryColor {
-      border: 1px solid rgba(63, 126, 239, .2);
-      background-color: rgba(63, 126, 239, .2);
-    }
-
-    .green {
-      background-color: rgba(83, 183, 148, .2);
-      border: 1px solid rgba(83, 183, 148, .2);
-    }
-
-    .gray {
-      color: #333333;
-      background-color: rgba(128, 128, 128, .2);
-      border: 1px solid rgba(128, 128, 128, .2);
+    justify-content: space-between;
+    .title_left {
+      display: flex;
+      align-items: center;
+      font-weight: 500;
+      font-size: 18px;
+      color: $primary-color;
+      .status {
+        padding: 0 12px;
+        height: 24px;
+        line-height: 24px;
+        border-radius: 2px;
+        border: 1px solid #00BA92;
+        color: #00BA92;
+        font-weight: 400;
+        font-size: 12px;
+        margin-left: 10px;
+      }
+      .primaryColor {
+        border: 1px solid rgba(63, 126, 239, .2);
+        background-color: rgba(63, 126, 239, .2);
+      }
+      .green {
+        background-color: rgba(83, 183, 148, .2);
+        border: 1px solid rgba(83, 183, 148, .2);
+      }
+      .gray {
+        color: #333333;
+        background-color: rgba(128, 128, 128, .2);
+        border: 1px solid rgba(128, 128, 128, .2);
+      }
     }
   }
 
diff --git a/admin/src/views/workorder/components/handleProblem.vue b/admin/src/views/workorder/components/handleProblem.vue
index 47a1896..6560bc3 100644
--- a/admin/src/views/workorder/components/handleProblem.vue
+++ b/admin/src/views/workorder/components/handleProblem.vue
@@ -1,95 +1,122 @@
 <template>
     <GlobalWindow
-        title="闂涓婃姤"
-        :showConfirm="false"
+        :title="title"
         :visible.sync="visible"
-        width="100%">
+        width="100%"
+        @confirm="confirm">
         <div class="wt">
             <div class="wt_head">
                 <div class="wt_head_title">
-                    闂璇︽儏
-                    <el-tag style="margin-left: 10px;">杞伐鍗�</el-tag>
+                    <div class="title">闂璇︽儏</div>
+                    <el-tag style="margin-left: 10px;" v-if="info.dealStatus === 0">寰呭鐞�</el-tag>
+                    <el-tag style="margin-left: 10px;" v-if="info.dealStatus === 1">宸茶浆宸ュ崟</el-tag>
+                    <el-tag style="margin-left: 10px;" v-if="info.dealStatus === 2">宸插叧闂�</el-tag>
                 </div>
-                <el-button>鏌ョ湅宸ュ崟</el-button>
             </div>
             <div class="wt_content">
                 <div class="wt_content_row" style="width: 25%;">
-                    浣嶇疆锛�-
+                    浣嶇疆锛歿{info.position || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 25%;">
-                    涓婃姤浜猴細寮犱笁涓�
+                    涓婃姤浜猴細{{info.name || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 50%;">
-                    涓婃姤浜虹數璇濓細180553847234
+                    涓婃姤浜虹數璇濓細{{info.phone || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
-                    涓婃姤鏃堕棿锛�2024-11-21 12:00:23
+                    涓婃姤鏃堕棿锛歿{info.submitDate || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
-                    闂鎻忚堪锛氳繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩�
+                    闂鎻忚堪锛歿{info.content || '-'}}
                 </div>
-                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
+                <div class="wt_content_row" style="width: 100%; margin-top: 15px; margin-bottom: 20px;">
                     <div class="wt_content_row_label">闂鍥剧墖锛�</div>
-                    <div class="wt_content_row_list">
-                        <div class="wt_content_row_list_img">
-                            <img src="" alt="" />
+                    <div class="wt_content_row_list" v-if="info.fileList && info.fileList.length >= 0">
+                        <div class="wt_content_row_list_img" v-for="(item, index) in info.fileList" :key="index">
+                            <el-image
+                                style="width: 100px; height: 100px"
+                                :src="item.fileurlFull"
+                                :preview-src-list="info.fileList.map(item => item.fileurlFull)">
+                            </el-image>
                         </div>
                     </div>
                 </div>
             </div>
-            <el-form :model="form" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
-                <el-form-item label="澶勭悊鏂瑰紡" prop="resource">
-                    <el-radio-group v-model="form.resource">
-                        <el-radio :label="0">杞伐鍗�</el-radio>
-                        <el-radio :label="1">鍏抽棴闂</el-radio>
+            <el-form :model="form" :rules="rules" ref="form" label-width="100px" class="demo-ruleForm">
+                <el-form-item label="澶勭悊鏂瑰紡" prop="dealStatus">
+                    <el-radio-group v-model="form.dealStatus">
+                        <el-radio :label="1">杞伐鍗�</el-radio>
+                        <el-radio :label="2">鍏抽棴闂</el-radio>
                     </el-radio-group>
                 </el-form-item>
-                <div style="display: flex; align-items: center;">
-                    <el-form-item label="浣嶇疆绫诲瀷" prop="region">
-                        <el-select v-model="form.resource" placeholder="璇烽�夋嫨浣嶇疆绫诲瀷">
-                            <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
-                            <el-option label="鍖哄煙浜�" value="beijing"></el-option>
-                        </el-select>
+                <template v-if="form.dealStatus === 1">
+                    <div style="width: 100%; display: flex; align-items: center;">
+                        <el-form-item label="浣嶇疆绫诲瀷" prop="workOrderAreaType">
+                            <el-select v-model="form.workOrderAreaType" @change="changeType" placeholder="璇烽�夋嫨浣嶇疆绫诲瀷">
+                                <el-option label="瀹ゅ唴缁翠慨" :value="0"></el-option>
+                                <el-option label="鍏叡鍖哄煙" :value="1"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="鎶ヤ慨鍖哄煙" prop="rooms">
+                            <el-cascader
+                                v-model="form.rooms"
+                                :disabled="![0,1].includes(form.workOrderAreaType)"
+                                ref="cascader"
+                                @change="getHouseVal"
+                                placeholder="璇烽�夋嫨鎶ヤ慨鍖哄煙"
+                                :options="form.workOrderAreaType === 0 ? houseList : houseList1"
+                                :props="{
+                                    label: 'name',
+                                    value: 'id',
+                                    children: 'projectDataVOList'
+                                }" />
+                        </el-form-item>
+                    </div>
+                    <div style="width: 100%; display: flex; align-items: center;">
+                        <el-form-item label="宸ュ崟鍒嗙被" prop="workOrderCateId">
+                            <el-cascader v-model="form.workOrderCateId" @change="changeSel" placeholder="璇烽�夋嫨鍒嗙被" clearable :options="cateList"
+                            :props="{
+                            label: 'name',
+                            value: 'id',
+                            children: 'childCategoryList'
+                          }"></el-cascader>
+                        </el-form-item>
+                        <el-form-item label="涓婇棬鏃堕棿" prop="workOrderGetDate" v-if="form.workOrderAreaType === 0">
+                            <el-date-picker
+                                v-model="form.workOrderGetDate"
+                                type="datetime"
+                                value-format="yyyy-MM-dd HH:mm:ss"
+                                placeholder="閫夋嫨涓婇棬鏃堕棿">
+                            </el-date-picker>
+                        </el-form-item>
+                    </div>
+                    <el-form-item label="鎻忚堪" prop="dealInfo">
+                        <el-input
+                            type="textarea"
+                            :rows="5"
+                            placeholder="璇疯緭鍏ユ弿杩�"
+                            v-model="form.dealInfo">
+                        </el-input>
                     </el-form-item>
-                    <el-form-item label="鎶ヤ慨鍖哄煙" prop="resource">
-                        <el-select v-model="form.resource" placeholder="璇烽�夋嫨鎶ヤ慨鍖哄煙">
-                            <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
-                            <el-option label="鍖哄煙浜�" value="beijing"></el-option>
-                        </el-select>
+                    <el-form-item label="闂鍥剧墖" prop="resource">
+                        <el-upload
+                            :action="base"
+                            :file-list="form.workOrderFileList"
+                            accept=".png,.jpg,.jpeg,.PNG,.JPG"
+                            :on-success="getFile"
+                            :data="{ folder: 'YW_PROBLEM' }"
+                            list-type="picture-card">
+                            <i class="el-icon-plus"></i>
+                        </el-upload>
                     </el-form-item>
-                </div>
-                <div style="display: flex; align-items: center;">
-                    <el-form-item label="宸ュ崟鍒嗙被" prop="resource">
-                        <el-select v-model="form.resource" placeholder="璇烽�夋嫨宸ュ崟鍒嗙被">
-                            <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
-                            <el-option label="鍖哄煙浜�" value="beijing"></el-option>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item label="涓婇棬鏃堕棿" prop="resource">
-                        <el-date-picker v-model="form.resource" type="date" placeholder="閫夋嫨涓婇棬鏃堕棿"></el-date-picker>
-                    </el-form-item>
-                </div>
-                <el-form-item label="鎻忚堪" prop="resource">
+                </template>
+                <el-form-item label="鍏抽棴璇存槑" prop="dealInfo" v-if="form.dealStatus === 2">
                     <el-input
                         type="textarea"
                         :rows="5"
-                        placeholder="璇疯緭鍏ユ弿杩�"
-                        v-model="form.resource">
-                    </el-input>
-                </el-form-item>
-                <el-form-item label="闂鍥剧墖" prop="resource">
-                    <el-upload
-                        action="https://jsonplaceholder.typicode.com/posts/"
-                        list-type="picture-card">
-                        <i class="el-icon-plus"></i>
-                    </el-upload>
-                </el-form-item>
-                <el-form-item label="鍏抽棴闂" prop="resource">
-                    <el-input
-                        type="textarea"
-                        :rows="5"
+                        maxlength="300"
                         placeholder="璇疯緭鍏ュ叧闂棶棰�"
-                        v-model="form.resource">
+                        v-model="form.dealInfo">
                     </el-input>
                 </el-form-item>
             </el-form>
@@ -100,6 +127,9 @@
 <script>
   import BaseOpera from '@/components/base/BaseOpera'
   import GlobalWindow from '@/components/common/GlobalWindow'
+  import { fetchList as getCateList } from '@/api/business/category.js'
+  import { tree } from '@/api/project/ywProject'
+  import { editProblem } from '@/api/ywProblem'
   export default {
     name: "handleProblem",
     extends: BaseOpera,
@@ -107,61 +137,184 @@
     data() {
       return {
         info: {},
+        cateList: [],
+        base: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
         form: {
-          resource: 0
+          dealStatus: 1,
+          workOrderAreaType: '',
+          workOrderCateId: '',
+          workOrderGetDate: '',
+          dealInfo: '',
+          workOrderFileList: [],
+          rooms: [],
+          
+          workOrderProjectId: '',
+          workOrderBuildId: '',
+          workOrderFloorId: '',
+          workOrderRoomId: ''
         },
+        houseList: [],
+        houseList1: [],
         rules: {
-          resource: [
-            { required: true, message: '璇烽�夋嫨', trigger: 'change' }
+          dealStatus: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          workOrderAreaType: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          workOrderCateId: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          dealInfo: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ],
+          rooms: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
           ]
         }
       }
     },
     methods: {
-
+      open (title, target) {
+        this.title = title
+        this.info = target
+        this.getCate()
+        this.getHouseTree()
+        this.visible = true
+      },
+      getHouseVal(e) {
+        if (this.form.workOrderAreaType === 0) {
+          this.form.workOrderProjectId = e[0]
+          this.form.workOrderBuildId = e[1]
+          this.form.workOrderFloorId = e[2]
+          this.form.workOrderRoomId = e[3]
+        } else {
+          this.form.workOrderProjectId = e[0]
+          this.form.workOrderBuildId = e[1]
+          this.form.workOrderFloorId = e[2]
+        }
+      },
+      changeType(e) {
+        this.form.rooms = []
+        this.form.workOrderProjectId = ''
+        this.form.workOrderBuildId = ''
+        this.form.workOrderFloorId = ''
+        this.form.workOrderRoomId = ''
+      },
+      getHouseTree() {
+        tree({}).then(res => {
+          let arr1 = JSON.parse(JSON.stringify(res))
+          let arr2 = JSON.parse(JSON.stringify(res))
+          this.addParamToArray(arr1)
+          this.addParamToArray1(arr2)
+          this.houseList = arr1
+          this.houseList1 = arr2
+        })
+      },
+      addParamToArray(arr) {
+        for (let i = 0; i < arr.length; i++) {
+          const currentItem = arr[i].projectDataVOList
+          if (currentItem && currentItem.length >= 0) {
+            currentItem.forEach(item => {
+              if (item.lv === 3) {
+                delete item.projectDataVOList
+              }
+            })
+          }
+          if (currentItem && currentItem.length > 0) {
+            this.addParamToArray(currentItem)
+          }
+        }
+      },
+      addParamToArray1(arr) {
+        for (let i = 0; i < arr.length; i++) {
+          const currentItem = arr[i].projectDataVOList
+          if (currentItem && currentItem.length >= 0) {
+            currentItem.forEach(item => {
+              if (item.lv === 2) {
+                delete item.projectDataVOList
+              }
+            })
+          }
+          if (currentItem && currentItem.length > 0) {
+            this.addParamToArray1(currentItem)
+          }
+        }
+      },
+      getFile(e) {
+        console.log(e)
+        this.form.workOrderFileList.push({ ...e })
+      },
+      changeSel(e) {
+        if (e && e.length == 2) {
+          this.$set(this.form, 'workOrderCateId', e[1])
+        } else {
+          this.$set(this.form, 'workOrderCateId', '')
+        }
+      },
+      getCate() {
+        getCateList({
+          model: { type: 3 },
+          capacity: 1000,
+          page: 1,
+        }).then(res => {
+          this.cateList = res.records || []
+        })
+      },
+      confirm() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return
+          }
+          this.isWorking = true
+          editProblem({
+            ...this.form,
+            id: this.info.id
+          })
+            .then(() => {
+              this.visible = false
+              this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
+              this.$emit('success')
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+        })
+      }
     }
   }
 </script>
 
 <style lang="scss" scoped>
+    @import '@/assets/style/variables.scss';
     .wt {
         width: 100%;
         display: flex;
         flex-direction: column;
-        .wt_head {
-            width: 100%;
-            padding: 20px 0;
-            box-sizing: border-box;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            .wt_head_title {
-                display: flex;
-                align-items: center;
-                font-size: 16px;
-                color: black;
-                margin-right: 10px;
-            }
-        }
+    
         .wt_content {
             width: 100%;
             display: flex;
             align-items: center;
             flex-wrap: wrap;
+        
             .wt_content_row {
                 font-size: 14px;
                 color: rgb(51, 51, 51);
                 display: flex;
                 align-items: self-start;
+            
                 .wt_content_row_label {
                     flex-shrink: 0;
                     font-size: 14px;
                     color: rgb(51, 51, 51);
                 }
+            
                 .wt_content_row_list {
                     flex: 1;
                     display: flex;
                     align-items: center;
+                
                     .wt_content_row_list_img {
                         width: 106px;
                         height: 93px;
@@ -170,9 +323,11 @@
                         justify-content: center;
                         overflow-x: hidden;
                         margin-right: 15px;
+                    
                         &:last-child {
                             margin: 0 !important;
                         }
+                    
                         img {
                             width: 100%;
                         }
@@ -180,5 +335,30 @@
                 }
             }
         }
+    
+        .wt_head {
+            width: 100%;
+            padding: 20px 0;
+            box-sizing: border-box;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+        
+            .wt_head_title {
+                display: flex;
+                align-items: center;
+                font-size: 16px;
+                color: black;
+                margin-right: 10px;
+            
+                .title {
+                    font-weight: 500;
+                    font-size: 18px;
+                    color: $primary-color;
+                    display: flex;
+                    align-items: center;
+                }
+            }
+        }
     }
 </style>
diff --git a/admin/src/views/workorder/components/problemReportingDetails.vue b/admin/src/views/workorder/components/problemReportingDetails.vue
index 213c8d9..cbdcbbb 100644
--- a/admin/src/views/workorder/components/problemReportingDetails.vue
+++ b/admin/src/views/workorder/components/problemReportingDetails.vue
@@ -1,83 +1,128 @@
 <template>
     <GlobalWindow
-        title="闂涓婃姤璇︽儏"
+        :title="title"
         :showConfirm="false"
         :visible.sync="visible"
         width="100%">
         <div class="wt">
             <div class="wt_head">
                 <div class="wt_head_title">
-                    闂璇︽儏
-                    <el-tag style="margin-left: 10px;">杞伐鍗�</el-tag>
+                    <div class="title">闂璇︽儏</div>
+                    <el-tag style="margin-left: 10px;" v-if="form.dealStatus === 0">寰呭鐞�</el-tag>
+                    <el-tag style="margin-left: 10px;" v-if="form.dealStatus === 1">宸茶浆宸ュ崟</el-tag>
+                    <el-tag style="margin-left: 10px;" v-if="form.dealStatus === 2">宸插叧闂�</el-tag>
                 </div>
-                <el-button>鏌ョ湅宸ュ崟</el-button>
+                <el-button @click="handleDetail" v-if="form.dealStatus === 1">鏌ョ湅宸ュ崟</el-button>
             </div>
             <div class="wt_content">
                 <div class="wt_content_row" style="width: 25%;">
-                    浣嶇疆锛�-
+                    浣嶇疆锛歿{form.position || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 25%;">
-                    涓婃姤浜猴細寮犱笁涓�
+                    涓婃姤浜猴細{{form.name || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 50%;">
-                    涓婃姤浜虹數璇濓細180553847234
+                    涓婃姤浜虹數璇濓細{{form.phone || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
-                    涓婃姤鏃堕棿锛�2024-11-21 12:00:23
+                    涓婃姤鏃堕棿锛歿{form.submitDate || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
-                    闂鎻忚堪锛氳繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩拌繖鏄棶棰樻弿杩�
+                    闂鎻忚堪锛歿{form.content || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
                     <div class="wt_content_row_label">闂鍥剧墖锛�</div>
-                    <div class="wt_content_row_list">
-                        <div class="wt_content_row_list_img">
-                            <img src="" alt="" />
+                    <div class="wt_content_row_list" v-if="form.fileList && form.fileList.length >= 0">
+                        <div class="wt_content_row_list_img" v-for="(item, index) in form.fileList" :key="index">
+                            <el-image
+                                style="width: 80px; height: 80px"
+                                :src="item.fileurlFull"
+                                :preview-src-list="form.fileList.map(item => item.fileurlFull)">
+                            </el-image>
                         </div>
                     </div>
                 </div>
             </div>
             <div class="wt_head">
                 <div class="wt_head_title">
-                    澶勭悊缁撴灉
+                    <div class="title">闂璇︽儏</div>
                 </div>
             </div>
             <div class="wt_content">
                 <div class="wt_content_row" style="width: 100%;">
-                    澶勭悊浜猴細寮犱笁-琛屾斂閮�
+                    澶勭悊浜猴細{{form.dealUserName}}-{{form.dealUserCompanyName}}
                 </div>
                 <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
-                    澶勭悊鏃堕棿锛�2024-11-21 12:00:23
+                    澶勭悊鏃堕棿锛歿{form.dealDate || '-'}}
                 </div>
                 <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
-                    澶勭悊缁撴灉锛氳浆宸ュ崟
+                    澶勭悊缁撴灉锛歿{returnText(form.dealStatus)}}
                 </div>
-                <div class="wt_content_row" style="width: 100%; margin-top: 15px;">
-                    鍏抽棴璇存槑锛氳鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄庤鏄�
+                <div class="wt_content_row" style="width: 100%; margin-top: 15px;" v-if="form.dealStatus === 2">
+                    鍏抽棴璇存槑锛歿{form.dealInfo}}
                 </div>
             </div>
         </div>
+        <!--    宸ュ崟璇︽儏    -->
+        <Detail v-if="showDetail" ref="DetailRef" @close="showDetail = false" />
     </GlobalWindow>
 </template>
 
 <script>
   import BaseOpera from '@/components/base/BaseOpera'
   import GlobalWindow from '@/components/common/GlobalWindow'
+  import Detail from './detail'
+  import { getById } from '@/api/ywProblem'
   export default {
     name: "problemReportingDetails",
     extends: BaseOpera,
-    components: { GlobalWindow },
+    components: { GlobalWindow, Detail },
     data() {
       return {
-        info: {}
+        form: {},
+        showDetail: false,
       }
     },
     methods: {
-    
+      open (title, target) {
+        this.title = title
+        this.form = target
+        getById(target.id)
+            .then(res => {
+              this.form = res
+              this.visible = true
+            })
+      },
+      handleDetail() {
+        this.showDetail = true
+        this.$nextTick(() => {
+          this.$refs.DetailRef.visible = true
+          this.$refs.DetailRef.id = this.form.workorderId
+          this.$refs.DetailRef.getDetail()
+        })
+      },
+      returnText(status) {
+        if (status === 0) {
+          return '寰呭鐞�'
+        } else if (status === 1) {
+          return '宸茶浆宸ュ崟'
+        } else if (status === 2) {
+          return '宸插叧闂�'
+        } else {
+          return ''
+        }
+      }
     }
   }
 </script>
-
+<style lang="scss" scoped>
+    @import '@/assets/style/variables.scss';
+    .title {
+        font-weight: 500;
+        font-size: 18px;
+        color: $primary-color;
+    }
+</style>
 <style lang="scss" scoped>
     .wt {
         width: 100%;
diff --git a/admin/src/views/workorder/problemReporting.vue b/admin/src/views/workorder/problemReporting.vue
index 98a65ed..1de3fb4 100644
--- a/admin/src/views/workorder/problemReporting.vue
+++ b/admin/src/views/workorder/problemReporting.vue
@@ -2,14 +2,14 @@
     <TableLayout :permissions="['business:ywworkorder:query']">
         <!-- 鎼滅储琛ㄥ崟 -->
         <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-            <el-form-item label="鎻忚堪" prop="roomNum">
-                <el-input v-model="searchForm.roomNum" placeholder="璇疯緭鍏ユ弿杩�" @keypress.enter.native="search"></el-input>
+            <el-form-item label="鎻忚堪" prop="content">
+                <el-input v-model="searchForm.content" placeholder="璇疯緭鍏ユ弿杩�" @keypress.enter.native="search"></el-input>
             </el-form-item>
-            <el-form-item prop="areaType" label="澶勭悊鐘舵��">
-                <el-select v-model="searchForm.areaType">
-                    <el-option label="鏈鐞�" value="0"></el-option>
-                    <el-option label="鐢熸垚宸ュ崟" value="1"></el-option>
-                    <el-option label="鍏抽棴淇濅慨" value="1"></el-option>
+            <el-form-item prop="dealStatus" label="澶勭悊鐘舵��">
+                <el-select v-model="searchForm.dealStatus">
+                    <el-option label="鏈鐞�" :value="0"></el-option>
+                    <el-option label="宸茶浆宸ュ崟" :value="1"></el-option>
+                    <el-option label="宸插叧闂�" :value="2"></el-option>
                 </el-select>
             </el-form-item>
             <el-form-item label="涓婃姤鏃堕棿">
@@ -18,7 +18,7 @@
                     @change="changeSelDate"
                     format="yyyy-MM-dd"
                     value-format="yyyy-MM-dd"
-                    type="daterange"></el-date-picker>
+                    type="daterange" />
             </el-form-item>
             <section>
                 <el-button type="primary" @click="search">鎼滅储</el-button>
@@ -28,28 +28,32 @@
         <!-- 琛ㄦ牸鍜屽垎椤� -->
         <template v-slot:table-wrap>
             <el-table v-loading="isWorking.search" :data="tableData.list" stripe>
-                <el-table-column prop="areaType" label="鎻忚堪" min-width="70px"></el-table-column>
-                <el-table-column prop="areaType" label="浣嶇疆" min-width="100px"></el-table-column>
-                <el-table-column prop="categoryName" label="鐜板満鍥剧墖" min-width="100px"></el-table-column>
-                <el-table-column prop="creatorName" label="涓婃姤浜�" min-width="80px"></el-table-column>
-                <el-table-column prop="createDate" label="涓婃姤浜虹數璇�" min-width="100px"></el-table-column>
-                <el-table-column prop="dealUserName" label="涓婃姤鏃堕棿" min-width="80px"></el-table-column>
+                <el-table-column prop="remark" label="鎻忚堪" min-width="70px"></el-table-column>
+                <el-table-column prop="position" label="浣嶇疆" min-width="100px"></el-table-column>
+                <el-table-column label="鐜板満鍥剧墖" min-width="100px">
+                    <template slot-scope="{row}">
+                        {{row.fileList ? row.fileList.length : 0}}寮�
+                    </template>`
+                </el-table-column>
+                <el-table-column prop="name" label="涓婃姤浜�" min-width="80px"></el-table-column>
+                <el-table-column prop="phone" label="涓婃姤浜虹數璇�" min-width="100px"></el-table-column>
+                <el-table-column prop="submitDate" label="涓婃姤鏃堕棿" min-width="80px"></el-table-column>
                 <el-table-column label="澶勭悊鐘舵��" min-width="70px">
                     <template slot-scope="{row}">
-                        <span v-if="row.dealStatus == 0">寰呮寚娲�</span>
-                        <span v-if="row.dealStatus == 1">宸叉寚娲�</span>
-                        <span v-if="row.dealStatus == 2">宸插鐞�</span>
-                    </template>
+                        <span v-if="row.dealStatus === 0">寰呭鐞�</span>
+                        <span v-if="row.dealStatus === 1">宸茶浆宸ュ崟</span>
+                        <span v-if="row.dealStatus === 2">宸插叧闂�</span>
+                    </template>`
                 </el-table-column>
-                <el-table-column prop="creatorName" label="澶勭悊浜�" min-width="80px"></el-table-column>
+                <el-table-column prop="dealUserName" label="澶勭悊浜�" min-width="80px"></el-table-column>
                 <el-table-column
                     v-if="containPermissions(['business:ywworkorder:update'])"
                     label="鎿嶄綔"
                     width="130"
                     fixed="right">
                     <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.handleProblem.open()">澶勭悊</el-button>
-                        <el-button type="text" @click="$refs.problemReportingDetails.open()">鏌ョ湅璇︽儏</el-button>
+                        <el-button type="text" v-if="row.dealStatus === 0" @click="$refs.handleProblem.open('闂涓婃姤', row)">澶勭悊</el-button>
+                        <el-button type="text" @click="$refs.problemReportingDetails.open('闂涓婃姤璇︽儏', row)">鏌ョ湅璇︽儏</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -79,10 +83,10 @@
         showDetail: false,
         searchForm: {
           selDate: [],
-          areaIds: '',
-          projectId: '',
-          buildingId: '',
-          cateId: '',
+          dealDateStart: '',
+          dealDateEnd: '',
+          content: '',
+          dealStatus: ''
         },
         projectList: [],
         buildList: [],
@@ -91,15 +95,25 @@
     },
     created() {
       this.config({
-        module: '杩愮淮宸ュ崟淇℃伅琛�',
-        api: '/workorder/ywWorkorder',
+        module: '闂涓婃姤淇℃伅琛�',
+        api: '/ywProblem',
         'field.id': 'id',
         'field.main': 'id'
       })
       this.search()
     },
     methods: {
-    
+      // 鎼滅储妗嗛噸缃�
+      reset () {
+        this.$refs.searchForm.resetFields()
+        this.searchForm.dealDateStart = ''
+        this.searchForm.dealDateEnd = ''
+        this.search()
+      },
+      changeSelDate(e) {
+        this.searchForm.dealDateStart = e[0]
+        this.searchForm.dealDateEnd = e[1]
+      }
     }
   }
 </script>
diff --git a/admin/src/views/workorder/workorderList.vue b/admin/src/views/workorder/workorderList.vue
index f3ad3de..d22f32d 100644
--- a/admin/src/views/workorder/workorderList.vue
+++ b/admin/src/views/workorder/workorderList.vue
@@ -26,6 +26,12 @@
             children: 'childCategoryList'
           }"></el-cascader>
       </el-form-item>
+      <el-form-item label="鏉ユ簮" prop="origin">
+        <el-select v-model="searchForm.origin" clearable filterable>
+          <el-option label="鑷缓" :value="0" />
+          <el-option label="闂杞伐鍗�" :value="1" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="涓婃姤鏃堕棿">
         <el-date-picker v-model="searchForm.selDate" @change="changeSelDate" format="yyyy-MM-dd"
           value-format="yyyy-MM-dd" type="daterange"></el-date-picker>
@@ -58,6 +64,12 @@
           </template>
         </el-table-column>
         <el-table-column prop="categoryName" label="宸ュ崟鍒嗙被" min-width="100px"></el-table-column>
+        <el-table-column label="鏉ユ簮" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.origin == 0">鑷缓</span>
+            <span v-if="row.origin == 1">闂杞伐鍗�</span>
+          </template>
+        </el-table-column>
         <el-table-column prop="creatorName" label="涓婃姤浜�" min-width="80px"></el-table-column>
         <el-table-column prop="createDate" label="涓婃姤鏃堕棿" min-width="100px"></el-table-column>
         <el-table-column prop="dealUserName" label="澶勭悊浜�" min-width="80px"></el-table-column>
@@ -107,6 +119,7 @@
         projectId: '',
         buildingId: '',
         cateId: '',
+        origin: ''
       },
       projectList: [],
       buildList: [],
diff --git a/h5/api/staff.js b/h5/api/staff.js
index 491ab58..9552ed6 100644
--- a/h5/api/staff.js
+++ b/h5/api/staff.js
@@ -45,3 +45,10 @@
   })
 }
 
+export const myNoticesH5 = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywWorkDesk/myNoticesH5',
+    method: 'post',
+    data
+  })
+}
diff --git a/h5/api/yw.js b/h5/api/yw.js
index 5e211b0..837f486 100644
--- a/h5/api/yw.js
+++ b/h5/api/yw.js
@@ -28,6 +28,12 @@
     data
   })
 }
+export const ywProblemCreate = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywProblem/create',
+    data
+  })
+}
 // 椤圭洰鍒楄〃
 export const ywProjectPost = (data) => {
   return http({
@@ -134,4 +140,53 @@
     url: 'visitsAdmin/cloudService/business/ywPatrolTaskRecord/getPointRecordByCode',
     data
   })
+}
+// 寰俊鎵竴鎵�
+export const getRecordByUserPoint = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywPatrolTaskRecord/getRecordByUserPoint',
+    data
+  })
+}
+export const getFindByCode = (code) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywDevice/findByCode?deviceCode=' + code,
+		method: 'get',
+  })
+}
+export const getYwStocktaking = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywStocktaking/page',
+    data
+  })
+}
+export const ywStocktakingDetail = (id) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywStocktaking/' + id,
+		method: 'get'
+  })
+}
+export const ywStocktakingBegin = (id) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywStocktaking/beginById?id=' + id,
+		method: 'get'
+  })
+}
+export const ywStocktaFinishById = (id) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywStocktaking/finishById?id=' + id,
+		method: 'get'
+  })
+}
+export const getYwStocktakingRecord = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywStocktakingRecord/page',
+		data
+  })
+}
+export const takingDataOpen = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywStocktakingRecord/takingData',
+		data
+  })
 }
\ No newline at end of file
diff --git a/h5/manifest.json b/h5/manifest.json
index 4f22dff..0a6161d 100644
--- a/h5/manifest.json
+++ b/h5/manifest.json
@@ -86,7 +86,7 @@
     "quickapp" : {},
     /* 灏忕▼搴忕壒鏈夌浉鍏� */
     "mp-weixin" : {
-        "appid" : "wxcd2b89fd2ff065f8",
+        "appid" : "wx4d7c10bdec51942b",
         "setting" : {
             "urlCheck" : false,
             "es6" : true,
@@ -121,7 +121,7 @@
         },
         // "base" : "/h5/"
         "devServer" : {
-						"open": false,
+            "open" : false,
             "port" : 8090,
             "historyApiFallback" : true,
             "disableHostCheck" : true,
@@ -131,7 +131,7 @@
                     // "target" : "http://172.20.10.7:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
                     // "target" : "http://192.168.0.163:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
                     // "target" : "http://10.50.250.253:8088/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
-                    "target" : "https://zhcg.fnwtzx.com/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    "target" : "https://dmtest.ahapp.net/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
                     "changeOrigin" : true, // 鍏佽璺ㄥ煙 
                     "pathRewrite" : {
                         "^/gateway_interface" : ""
diff --git a/h5/pages.json b/h5/pages.json
index d255e6d..908bd3a 100644
--- a/h5/pages.json
+++ b/h5/pages.json
@@ -83,6 +83,41 @@
 			{
 				"navigationBarTitleText" : "閫夋嫨浜哄憳"
 			}
+		},
+		{
+			"path" : "pages/inventory/index",
+			"style" : 
+			{
+				"navigationBarTitleText" : "搴撳瓨鐩樼偣"
+			}
+		},
+		{
+			"path" : "pages/inventory/detail",
+			"style" : 
+			{
+				"navigationBarTitleText" : "鐩樼偣鍗�"
+			}
+		},
+		{
+			"path" : "pages/workOrder/problemEdit",
+			"style" : 
+			{
+				"navigationBarTitleText" : "闂涓婃姤"
+			}
+		},
+		{
+			"path" : "pages/workOrder/result",
+			"style" : 
+			{
+				"navigationBarTitleText" : "闂涓婃姤"
+			}
+		},
+		{
+			"path" : "pages/workOrder/wait",
+			"style" : 
+			{
+				"navigationBarTitleText" : "浠诲姟涓績"
+			}
 		}
 	],
 	"globalStyle": {
diff --git a/h5/pages/index.vue b/h5/pages/index.vue
index 81b4ef6..f64142b 100644
--- a/h5/pages/index.vue
+++ b/h5/pages/index.vue
@@ -17,7 +17,8 @@
 		<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 class="name">{{item.name}}</view>
+				<view v-if="item.name == '寰呭姙涓績' && taskNum" class="superscript">{{taskNum}}</view>
 			</view>
 		</view>
 		<view class="loginout" @click="loginOut">閫�鍑虹櫥闄�</view>
@@ -26,7 +27,8 @@
 
 <script>
 	import {
-		logoutPost
+		logoutPost,
+		myNoticesH5
 	} from '@/api'
 	export default {
 		data() {
@@ -49,6 +51,12 @@
 						url: '/pages/operation/device',
 						img: require('@/static/home/ic_fangkebaobe@2x.png'),
 						auth: 'weixin:menu:visitcar'
+					},
+					{
+						name: '搴撳瓨鐩樼偣',
+						url: '/pages/inventory/index',
+						img: require('@/static/home/ic_pandian@2x.png'),
+						auth: 'weixin:menu:visitcar'
 					},
 				],
 				list2: [{
@@ -62,12 +70,21 @@
 						url: '/pages/operation/record',
 						img: require('@/static/home/ic_wodehuiyi@2x.png'),
 						auth: 'weixin:menu:visitcar'
+					},
+					{
+						name: '寰呭姙涓績',
+						url: '/pages/workOrder/wait',
+						img: require('@/static/home/ic_daiban@2x.png'),
+						auth: 'weixin:menu:visitcar'
 					},
-				]
+				],
+				taskNum: 0
 			}
 		},
-		onLoad() {
-
+		onShow() {
+			myNoticesH5({ page: 1, capacity: 1,model: {status: 0}}).then(res => {
+				this.taskNum = res.data.total
+			})
 		},
 		methods: {
 			itemClick(item) {
@@ -132,8 +149,8 @@
 				display: flex;
 				flex-direction: column;
 				align-items: center;
-				width: 25%;
-
+				width: 25%;
+				position: relative;
 				image {
 					width: 88rpx;
 					height: 88rpx;
@@ -143,6 +160,20 @@
 				.name {
 					font-size: 26rpx;
 				}
+				.superscript{
+					height: 40rpx;
+					width: 40rpx;
+					position: absolute;
+					top: -16rpx;
+					right: 24rpx;
+					background-color: red;
+					color: #fff;
+					font-size: 24rpx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					border-radius: 50%;
+				}
 			}
 		}
 
diff --git a/h5/pages/inventory/detail.vue b/h5/pages/inventory/detail.vue
new file mode 100644
index 0000000..29a92e6
--- /dev/null
+++ b/h5/pages/inventory/detail.vue
@@ -0,0 +1,683 @@
+<template>
+	<view class="main_app">
+		<view class="main_head">
+			<view class="tabs">
+				<view class="tab" :class="{ active: activeTab == 0 }" @click="tabsClick(0)">
+					<text>鏈洏({{ info.unFinishAmount || 0 }})</text>
+					<text class="border"></text>
+				</view>
+				<view class="tab" :class="{ active: activeTab == 1 }" @click="tabsClick(1)">
+					<text>宸茬洏({{ info.finishAmount || 0 }})</text>
+					<text class="border"></text>
+				</view>
+			</view>
+			<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.materialCode" @confirm="handleQuery()" type="text" placeholder="鎼滅储鐗╂枡缂栫爜/鐗╂枡鍚嶇О"
+						placeholder-class="placeholder9" />
+				</view>
+			</view>
+			<!--  -->
+			<scroll-view scroll-y="true" class="scroll_Y" @scrolltolower="scrolltolower">
+				<view class="list">
+					<view class="item" v-for="item in list" @click="itemClick(item)">
+						<view class="head">
+							<view class="title">{{ item.materialName }}</view>
+							<view class="status red" v-if="item.type == 1">鐩樹簭</view>
+							<view class="status primaryColor" v-if="item.type == 2">鐩樼泩</view>
+						</view>
+						<view class="line">鐗╂枡缂栫爜锛歿{ item.materialCode }}</view>
+						<view class="line">鏉$爜锛歿{ item.materialQrcode }}</view>
+						<view class="line">瑙勬牸鍨嬪彿锛歿{ item.materialAttr }}</view>
+						<view class="line" v-if="item.status == 0">
+							<view class="">璐﹂潰鏁伴噺锛歿{ item.stock }}{{ item.materialUnitName }}</view>
+							<view @click.stop="openEheck(item)" class="btn">鎵ц鐩樼偣</view>
+						</view>
+						<view class="static" v-if="item.status == 1">
+							<view class="ite">
+								<view class="la">璐﹂潰鏁伴噺锛�</view>
+								<view class="val">{{ item.stock }}</view>
+							</view>
+							<view class="spi"></view>
+							<view class="ite">
+								<view class="la">瀹為檯鏁伴噺锛�</view>
+								<view class="val" :class="{
+									primaryColor: item.type == 2,
+									red: item.type == 1,
+								}">{{ item.actStock }}</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+			<view class="footer_btn">
+				<view @click="openQrcode" v-if="activeTab == 0 && info.status == 1" class="sweep">
+					<image src="@/static/side/ic_saoma@2x.png" mode=""></image>
+					<view class="">鎵爜鐩樼偣</view>
+				</view>
+				<view @click="showTip = true" v-if="activeTab == 1 && info.status == 1" class="sweep sub_result">
+					<view class="">鎻愪氦鐩樼偣缁撴灉</view>
+				</view>
+			</view>
+			<!--  -->
+			<u-popup :show="showModal" :round="10" @close="showModal = false" closeOnClickOverlay>
+				<view class="modal_wrap">
+					<view class="modal_title">鎵ц鐩樼偣</view>
+					<view class="title">{{ modalForm.materialName }}</view>
+					<view class="item">鐗╂枡缂栫爜锛歿{ modalForm.materialCode }}</view>
+					<view class="item">鏉$爜锛歿{ modalForm.materialQrcode }}</view>
+					<view class="item">鍝佺墝锛歿{ modalForm.materialBrand }}</view>
+					<view class="item">瑙勬牸鍨嬪彿锛歿{ modalForm.materialAttr }}</view>
+					<view class="item">鎵�鍦ㄤ粨搴擄細{{ modalForm.warehouseName }}</view>
+					<view class="content">
+						<view class="line">
+							<view class="la">璐﹂潰鏁伴噺锛�</view>
+							<view class="val">
+								<view class="wrap">{{ modalForm.stock }}</view>
+								<view class="unit">{{ modalForm.materialUnitName }}</view>
+							</view>
+						</view>
+						<view class="line">
+							<view class="la">鐩樼偣鏁伴噺锛�</view>
+							<view class="val">
+								<view class="wrap">
+									<template v-if="!modalForm.handleType">
+										<image v-if="!modalForm.actStock" src="@/static/side/btn_jian_grey@2x.png" mode=""></image>
+										<image v-else @click="changeAct(-1)" src="@/static/side/btn_jian@3x.png" mode=""></image>
+									</template>
+									<input :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" type="digit" v-model="modalForm.actStock"></input>
+									<image v-if="!modalForm.handleType" @click="changeAct(1)" src="@/static/side/btn_jia@3x.png" mode=""></image>
+								</view>
+								<view class="unit">{{ modalForm.materialUnitName }}</view>
+							</view>
+						</view>
+					</view>
+					<view class="remark">
+						<view class="la">澶囨敞锛�</view>
+						<textarea v-model="modalForm.remark" :disabled="Boolean(modalForm.handleType && modalForm.handleType == 'detail')" placeholder="璇峰~鍐欏娉�" :maxlength="-1" placeholder-class="placeholder9"
+							cols="30" rows="10"></textarea>
+					</view>
+					<view v-if="!modalForm.handleType" class="btns">
+						<view class="btn" @click="showModal = false">鍙栨秷</view>
+						<view class="btn sub" @click="onSubmit">鎻愪氦</view>
+					</view>
+				</view>
+			</u-popup>
+			<!--  -->
+			<u-popup :show="showTip" mode="center" :round="10" @close="showTip = false" closeOnClickOverlay>
+				<view class="modal_t">
+					<view class="h1">娓╅Θ鎻愮ず</view>
+					<view class="content">
+						<view v-if="info.unFinishAmount > 0">杩樻湁<text class="red">{{ info.unFinishAmount }}</text>椤圭墿鏂欐湭鐩樼偣</view>
+						<view>鎻愪氦鍚庡皢鏃犳硶淇敼</view>
+					</view>
+					<view class="btns">
+						<view class="btn" @click="showTip = false">鍙栨秷</view>
+						<view class="btn sub" @click="tipSub">纭鎻愪氦</view>
+					</view>
+				</view>
+			</u-popup>
+		</view>
+		<!--  -->
+		<view class="reader-box" @click="stopScan" v-if="isScaning">
+			<view class="reader" id="reader"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+import {
+	ywStocktakingDetail,
+	getYwStocktakingRecord,
+	takingDataOpen,
+	ywStocktaFinishById
+} from '@/api'
+import {
+	Html5Qrcode
+} from 'html5-qrcode'
+export default {
+	data() {
+		return {
+			param: {},
+			info: {},
+			id: '',
+			activeTab: 0,
+
+			list: [],
+			page: 0,
+			total: 0,
+
+			showModal: false,
+			showTip: false,
+			modalForm: {},
+
+			html5Qrcode: null,
+			isScaning: false,
+
+		}
+	},
+	onLoad(op) {
+		this.id = op.id
+		this.getDetail()
+		this.getList()
+	},
+	methods: {
+		itemClick(item) {
+			if(item.status == 1){
+				this.showItem(item)
+			}
+		},
+		showItem(item){
+			this.showModal = true
+			this.modalForm = {
+				...item,
+				handleType: this.info.status != 1 ? 'detail' : ''
+			}
+			console.log('modalForm', this.modalForm);
+		},
+		getDetail() {
+			const {
+				id
+			} = this
+			ywStocktakingDetail(id).then(res => {
+				this.info = res.data
+
+			})
+		},
+		handleQuery(str) {
+			this.list = []
+			this.page = 1
+			this.getList(str)
+		},
+		getList(str) {
+			const {
+				page,
+				activeTab,
+				id,
+				param
+			} = this
+			getYwStocktakingRecord({
+				capacity: 20,
+				page,
+				model: {
+					status: str || activeTab,
+					stocktakingId: id,
+					...param
+				}
+			}).then(res => {
+				this.list = [...this.list, ...res.data.records]
+				this.total = res.data.total
+				if (this.param.materialQrcode && this.list.length == 1) {
+					this.openEheck(this.list[0])
+					this.$set(this.param, 'materialQrcode', null)
+				}
+			})
+		},
+		scrolltolower() {
+			const {
+				total,
+				list
+			} = this
+			if (list.length < total) {
+				this.page = this.page + 1
+				this.getList()
+			} else {
+				this.showToast('鏆傛棤鏇村鏁版嵁')
+			}
+		},
+		openEheck(item) {
+			this.modalForm = {
+				...item
+			}
+			this.showModal = true
+		},
+		onSubmit() {
+			const {
+				modalForm
+			} = this
+			if (!modalForm.actStock) return this.showToast('璇疯緭鍏ユ纭殑鐩樼偣鏁伴噺')
+			takingDataOpen({
+				...modalForm
+			}).then(res => {
+				if (res.code == 200) {
+					this.showToast('鎻愪氦鎴愬姛')
+					this.handleQuery()
+					this.getDetail()
+					this.showModal = false
+				}
+			})
+		},
+		changeAct(val) {
+			const actStock = this.modalForm.actStock || 0
+			this.$set(this.modalForm, 'actStock', actStock + val)
+		},
+		tabsClick(val) {
+			this.activeTab = val
+			this.page = 0
+			this.list = []
+			this.getList()
+		},
+		tipSub() {
+			const { info } = this
+			ywStocktaFinishById(info.id).then(res => {
+				this.showTip = false
+				uni.navigateBack()
+			})
+
+		},
+		openQrcode() {
+			this.isScaning = true
+			Html5Qrcode.getCameras().then((devices) => {
+				if (devices && devices.length) {
+					this.html5Qrcode = new Html5Qrcode('reader')
+					this.html5Qrcode.start({
+						facingMode: 'environment'
+					}, {
+						focusMode: 'continuous', //璁剧疆杩炵画鑱氱劍妯″紡
+						fps: 5, //璁剧疆鎵爜璇嗗埆閫熷害
+						qrbox: 280 //璁剧疆浜岀淮鐮佹壂鎻忔澶у皬
+					},
+						(decodeText, decodeResult) => {
+							if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
+								this.stopScan()
+								this.$set(this.param, 'materialQrcode', decodeText)
+								this.handleQuery('null')
+							}
+						},
+						(err) => {
+							// console.log(err);  //閿欒淇℃伅
+						}
+					)
+				}
+			})
+		},
+
+		stopScan() {
+			console.log('鍋滄鎵爜')
+			this.isScaning = false
+			if (this.html5Qrcode) {
+				this.html5Qrcode.stop()
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+.main_app {
+	padding: 0 30rpx;
+	overflow: hidden;
+}
+
+.tabs {
+	display: flex;
+	width: 750rpx;
+	margin: 12rpx -30rpx 20rpx;
+	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: 72rpx;
+
+		.name {
+			display: flex;
+			align-items: center;
+		}
+
+		.border {
+			width: 54rpx;
+			height: 6rpx;
+			background-color: #fff;
+			border-radius: 3rpx;
+			margin-top: 12rpx;
+		}
+	}
+
+	.active {
+		font-weight: 600;
+		font-size: 32rpx;
+		color: #222222;
+
+		.border {
+			background-color: $primaryColor;
+		}
+
+	}
+
+}
+
+.head_wrap {
+	display: flex;
+	align-items: center;
+	margin-bottom: 36rpx;
+
+	.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;
+		}
+	}
+
+}
+
+.scroll_Y {
+	height: calc(100vh - 350rpx);
+}
+
+.list {
+
+	.item {
+		border-bottom: 1rpx solid #E5E5E5;
+		padding-bottom: 24rpx;
+		margin-bottom: 16rpx;
+
+		.title {
+			font-weight: 600;
+			font-size: 34rpx;
+			color: #222222;
+			margin-bottom: 10rpx;
+			flex: 1;
+		}
+		.head{
+			display: flex;
+			// align-items: center;
+			justify-content: space-between;
+			color: #666666;
+			.status{
+				width: 76rpx;
+				text-align: right;
+				padding-top: 3rpx;
+			}
+		}
+		.line {
+			height: 60rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			color: #666666;
+			
+			.btn {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				height: 60rpx;
+				padding: 0 20rpx;
+				background: #0068FF;
+				box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 104, 255, 0.3);
+				border-radius: 30rpx;
+				font-size: 26rpx;
+				color: #FFFFFF;
+			}
+		}
+
+		.static {
+			display: flex;
+			height: 84rpx;
+			background: #F7F7F7;
+			font-size: 30rpx;
+			margin-top: 12rpx;
+			padding: 16rpx 0;
+
+			.spi {
+				border: 1rpx solid #E5E5E5;
+			}
+
+			.ite {
+				flex: 1;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				.val {
+					font-weight: 500;
+				}
+			}
+		}
+	}
+}
+
+.footer_btn {
+	padding: 20rpx 40rpx 0;
+	border-top: 1px solid #e5e5e5;
+	width: 750rpx;
+	margin: 0 -30rpx;
+
+	.sweep {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 32rpx;
+		font-weight: 500;
+		width: 670rpx;
+		height: 88rpx;
+		background: #0068FF;
+		box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
+		border-radius: 44rpx;
+		color: #FFFFFF;
+	}
+
+	.sub_result {
+		background-color: #fff;
+		color: #FF0000;
+		border: 1rpx solid #FF0000;
+		box-shadow: none
+	}
+
+	image {
+		width: 32rpx;
+		height: 32rpx;
+		margin-right: 6rpx;
+	}
+}
+
+.modal_wrap {
+	padding: 36rpx 30rpx;
+
+	.modal_title {
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #222222;
+		margin-bottom: 40rpx;
+		text-align: center;
+	}
+
+	.title {
+		font-weight: 600;
+		font-size: 34rpx;
+		color: #222222;
+	}
+
+	.item {
+		font-size: 28rpx;
+		color: #666666;
+		height: 56rpx;
+		display: flex;
+		align-items: center;
+	}
+
+	.content {
+		border-top: 1rpx solid #E5E5E5;
+		margin-top: 16rpx;
+
+		.line {
+			height: 84rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			.la {
+				font-weight: 500;
+				font-size: 32rpx;
+				color: #222222;
+			}
+
+			.val {
+				display: flex;
+				justify-content: flex-end;
+				align-items: center;
+				flex: 1;
+
+				.wrap {
+					display: flex;
+					align-items: center;
+
+					input {
+						width: 120rpx;
+						height: 72rpx;
+						border-radius: 8rpx;
+						border: 2rpx solid #0068FF;
+						margin: 0 16rpx;
+						padding: 0 10rpx;
+						text-align: center;
+					}
+				}
+
+				.unit {
+					font-size: 30rpx;
+					color: #666666;
+					margin-left: 20rpx;
+				}
+			}
+
+			image {
+				width: 72rpx;
+				height: 72rpx;
+			}
+		}
+	}
+
+	.remark {
+		margin-top: 16rpx;
+
+		.la {
+			font-size: 30rpx;
+			color: #222222;
+			margin-bottom: 16rpx;
+		}
+
+		textarea {
+			width: 690rpx;
+			height: 240rpx;
+			background: #F7F7F7;
+			border-radius: 12rpx;
+			padding: 10rpx 20rpx;
+		}
+	}
+
+	.btns {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		margin-top: 80rpx;
+
+		.btn {
+			width: 336rpx;
+			height: 88rpx;
+			border-radius: 44rpx;
+			border: 2rpx solid $primaryColor;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-size: 32rpx;
+			color: $primaryColor;
+		}
+
+		.sub {
+			background-color: $primaryColor;
+			color: #fff;
+		}
+	}
+}
+
+
+.modal_t {
+	width: 520rpx;
+	text-align: center;
+	display: flex;
+	flex-direction: column;
+
+	.h1 {
+		height: 86rpx;
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #333333;
+		display: flex;
+		align-items: flex-end;
+		justify-content: center;
+	}
+
+	.content {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		padding: 30rpx 0;
+	}
+
+	.btns {
+		height: 102rpx;
+		display: flex;
+		align-items: center;
+		border-top: 1rpx solid #E5E5E5;
+
+		.btn {
+			height: 102rpx;
+			flex: 1;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			border-right: 1rpx solid #E5E5E5;
+			font-weight: 400;
+			font-size: 32rpx;
+			color: #999999;
+
+			&:nth-last-child(1) {
+				border-right: none;
+			}
+		}
+
+		.sub {
+			color: $primaryColor;
+		}
+	}
+}
+
+.reader-box {
+	position: fixed;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background-color: rgba(0, 0, 0, 0.5);
+}
+
+.reader {
+	width: 100%;
+	// width: 540rpx;
+	// height: 540rpx;
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+}
+</style>
\ No newline at end of file
diff --git a/h5/pages/inventory/index.vue b/h5/pages/inventory/index.vue
new file mode 100644
index 0000000..56dd855
--- /dev/null
+++ b/h5/pages/inventory/index.vue
@@ -0,0 +1,222 @@
+<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.name" @confirm="handleQuery" type="text" placeholder="鎼滅储鐩樼偣鍗曞悕绉�"
+					placeholder-class="placeholder9" />
+			</view>
+		</view>
+		<!--  -->
+		<scroll-view scroll-y="true" class="scroll_Y" @scrolltolower="scrolltolower">
+			<view class="list">
+				<view class="item" @click="itemClick(item)" v-for="item in list">
+					<image v-if="item.status == 0 || item.status == 1" class="img" src="@/static/side/ic_pandian@2x.png" mode="">
+					</image>
+					<image v-else class="img" src="@/static/side/ic_pandian_grey@2x.png" mode=""></image>
+					<view class="content">
+						<view class="head">
+							<view class="title">{{item.name}}</view>
+							<view class="status" v-if="item.status == 0">鏈紑濮�</view>
+							<view class="status green" v-if="item.status == 1">鐩樼偣涓�</view>
+							<view class="status gray" v-if="item.status == 2">宸插畬鎴�</view>
+							<view class="status gray" v-if="item.status == 3">宸插彇娑�</view>
+						</view>
+						<view class="line">鐩樼偣鏃ユ湡锛歿{item.planDate}}</view>
+						<view class="line">鐩樼偣浠撳簱锛歿{item.warehouseName}}</view>
+						<view class="line">
+							<view class="">鐩樼偣浜哄憳锛歿{item.userName}}</view>
+							<view class="btn" v-if="item.status == 0 && item.timeFlag" @click="startHandle(item)">寮�濮嬬洏鐐�</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		getYwStocktaking,
+		ywStocktakingBegin
+	} from '@/api'
+	import dayjs from 'dayjs';
+	export default {
+		data() {
+			return {
+				param: {},
+				list: [],
+				page: 0,
+				total: 0,
+			};
+		},
+		onShow() {
+			this.handleQuery()
+		},
+		methods: {
+			getList() {
+				const {
+					page,
+					param
+				} = this
+				getYwStocktaking({
+					capacity: 20,
+					page,
+					model: {
+						...param
+					}
+				}).then(res => {
+					this.list = [...this.list, ...res.data.records]
+					let date = dayjs().format('YYYY-MM-DD')
+					this.list.forEach(item => {
+						item.timeFlag = new Date(item.planDate).getTime() <= new Date(date+' 23:59:59').getTime()
+					})
+					this.total = res.data.total
+				})
+			},
+			itemClick(item) {
+				if (item.status != 0) {
+					uni.navigateTo({
+						url: '/pages/inventory/detail?id=' + item.id
+					})
+				}
+			},
+			startHandle(item) {
+				uni.showModal({
+					content: '鐩樼偣鏈熼棿涓嶅彲杩涜鍑哄叆搴撴搷浣�',
+					success: (res) => {
+						if (res.confirm) {
+							ywStocktakingBegin(item.id).then(() => {
+								uni.navigateTo({
+									url: '/pages/inventory/detail?id=' + item.id
+								})
+							})
+
+						}
+					}
+				})
+			},
+			handleQuery() {
+				this.list = []
+				this.page = 1
+				this.getList()
+			},
+			scrolltolower() {
+				const {
+					total,
+					list
+				} = this
+				if (list.length < total) {
+					this.page = this.page + 1
+					this.getList()
+				} else {
+					this.showToast('鏆傛棤鏇村鏁版嵁')
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.main_app {
+		padding: 0rpx 30rpx 0;
+		font-size: 28rpx;
+	}
+
+	.head_wrap {
+		display: flex;
+		align-items: center;
+		height: 110rpx;	
+		.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;
+			}
+		}
+
+	}
+	.scroll_Y{
+		height: calc(100vh - 126rpx);
+	}
+	.list {
+		.item {
+			display: flex;
+			border-bottom: 1rpx solid #E5E5E5;
+			padding-bottom: 28rpx;
+			margin-bottom: 20rpx;
+
+			.img {
+				width: 80rpx;
+				height: 80rpx;
+				background: rgba(0, 104, 255, 0.08);
+				border-radius: 12rpx;
+				margin-right: 24rpx;
+			}
+
+			.content {
+				flex: 1;
+
+				.head {
+					display: flex;
+					// align-items: center;
+					justify-content: space-between;
+					margin-bottom: 12rpx;
+
+					.title {
+						font-weight: 600;
+						font-size: 34rpx;
+						color: #222222;
+						flex: 1;
+					}
+
+					.status {
+						color: $primaryColor;
+						width: 96rpx;
+						padding-top: 3rpx;
+					}
+
+					.green {
+						color: #0ADE79;
+					}
+
+					.gray {
+						color: #AAAAAA;
+					}
+				}
+
+				.line {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					color: #666666;
+					height: 60rpx;
+
+					.btn {
+						width: 144rpx;
+						height: 60rpx;
+						background: $primaryColor;
+						box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 104, 255, 0.3);
+						border-radius: 30rpx;
+						color: #fff;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						font-size: 26rpx;
+					}
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/login.vue b/h5/pages/login.vue
index b742a89..dc65036 100644
--- a/h5/pages/login.vue
+++ b/h5/pages/login.vue
@@ -29,7 +29,9 @@
 		loginPost,
 		getUserInfo,
 		sendSMsPost,
-		ywWxAuthorize
+		ywWxAuthorize,
+		
+		getRecordByUserPoint
 	} from '@/api'
 	import {
 		mapState,
@@ -43,13 +45,27 @@
 				form: {
 					phone: '',
 					code: ''
-				},
+				},
+				ywinfo: {},
 				downTime: 0,
-				code: '111'
-				// code: ''
+				code: ''
 			}
 		},
-
+		onLoad(option) {
+			console.log('onLoad');
+			// https://zhcg.fnwtzx.com/#/pages/login?type=0&ywid=ywid
+			const ywinfo = uni.getStorageSync('ywinfo') || {}
+			if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
+				this.ywinfo = ywinfo
+				uni.setStorageSync('ywinfo', {})
+			}
+			if (option.ywid || option.ywid == 0) {
+				uni.setStorageSync('ywinfo', {
+					type: option.type,
+					ywid: option.ywid
+				})
+			}
+		},
 		onShow() {
 			// return
 			var that = this
@@ -66,25 +82,38 @@
 				ywWxAuthorize({
 					code: code || this.code
 				}).then(res => {
-					if (res.code === 200) {
+					if (res.code === 200) {
 						console.log('res', res);
 						that.$store.commit('setOpenId', res.data.openid)
-						if (res.data.token && res.data.token != '') {
+						if (res.data.token && res.data.token != '') {
 							that.$store.commit('setToken', res.data.token)
 							getUserInfo().then(ress => {
 								that.$store.commit('setUserInfo', ress.data)
 							})
-							setTimeout(() => {
-								uni.redirectTo({
-									url: "/pages/index"
+							const ywinfo = this.ywinfo
+							if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
+								getRecordByUserPoint({pointCode: ywinfo.ywid}).then(res => {
+									if(res.data && res.data.id){
+										uni.redirectTo({
+											url: "/pages/polling/point?id=" + res.data.id
+										})
+									}
 								})
-							}, 300)
+							} else {
+								setTimeout(() => {
+									uni.redirectTo({
+										url: "/pages/index"
+									})
+								}, 300)
+							}
 						}
 					}
 				})
 			} else {
-				let url = 'https://zhcg.fnwtzx.com/yunwei_h5'
-				const appID = 'wx95ac1efb67f0330d'
+				// let url = 'https://zhcg.fnwtzx.com/yunwei_h5'
+				// const appID = 'wx95ac1efb67f0330d'
+				let url = 'https://dmtest.ahapp.net/yunwei_h5'
+				const appID = 'wx4d7c10bdec51942b'
 				let uri = encodeURIComponent(url)
 				let authURL =
 					`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base#wechat_redirect`
@@ -92,12 +121,6 @@
 			}
 
 		},
-		// onBackPress(options) {
-		// 	uni.redirectTo({
-		// 		url: '/pages/login/login'
-		// 	})
-		// 	return true
-		// },
 		methods: {
 			...mapMutations(["setToken", "setUserInfo"]),
 			onLogin() {
@@ -122,10 +145,23 @@
 						this.setToken(res.data)
 						this.showToast('鐧诲綍鎴愬姛')
 						getUserInfo().then(ress => {
-							this.setUserInfo(ress.data)
-							uni.redirectTo({
-								url: "/pages/index"
-							})
+							this.setUserInfo(ress.data)
+							const ywinfo = this.ywinfo
+							if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
+							getRecordByUserPoint({pointCode: ywinfo.ywid}).then(res => {
+								getRecordByUserPoint({pointCode: ywinfo.ywid}).then(res => {
+									if(res.data && res.data.id){
+										uni.redirectTo({
+											url: "/pages/polling/point?id=" + res.data.id
+										})
+									}
+								})
+							})
+							} else {
+								uni.redirectTo({
+									url: "/pages/index"
+								})
+							}
 						})
 					}
 				})
diff --git a/h5/pages/operation/device.vue b/h5/pages/operation/device.vue
index 414be7b..25d7921 100644
--- a/h5/pages/operation/device.vue
+++ b/h5/pages/operation/device.vue
@@ -84,7 +84,7 @@
 		uploadUrl,
 		ywDevicePost,
 		ywDeviceCreate,
-		getPointRecordByCode
+		getFindByCode
 	} from '@/api'
 	import dayjs from 'dayjs';
 	import {
@@ -285,15 +285,14 @@
 								qrbox: 280 //璁剧疆浜岀淮鐮佹壂鎻忔澶у皬
 							},
 							(decodeText, decodeResult) => {
-								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
-									this.$set(this.param, 'deviceCode', decodeText)
+								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
 									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
-									getPointRecordByCode({
-										// taskId: this.id,
-										pointCode: decodeText
-									}).then(ress => {
+									getFindByCode(decodeText).then(ress => {
 										if (ress.data) {
 											console.log('ress', ress.data);
+											this.$set(this.param, 'deviceCode', ress.data.code)
+											this.$set(this.param, 'deviceId', ress.data.id)
+											this.$set(this.param, 'deviceName', ress.data.name)
 										} else {
 											this.showToast('鏈尮閰嶅埌宸℃鐐�,璇烽噸鏂版壂鎻�')
 										}
diff --git a/h5/pages/polling/detail.vue b/h5/pages/polling/detail.vue
index 45ad7fb..2f2620a 100644
--- a/h5/pages/polling/detail.vue
+++ b/h5/pages/polling/detail.vue
@@ -48,7 +48,7 @@
 							<view class="la">宸℃鏃堕棿锛�</view>
 							<view class="val">
 								<text>{{item.dealDate}}</text>
-								<text v-if="item.status == 1" class="detail">鏌ョ湅璇︽儏</text>
+								<text @click="detailClick(item)" v-if="item.status == 1" class="detail">鏌ョ湅璇︽儏</text>
 							</view>
 						</view>
 					</template>
@@ -60,6 +60,7 @@
 			<view class="sub_btn">鎵爜宸℃</view>
 		</view>
 		<!--  -->
+	
 		<view class="reader-box" @click="stopScan" v-if="isScaning">
 			<view class="reader" id="reader"></view>
 		</view>
@@ -101,7 +102,9 @@
 					},
 				],
 				html5Qrcode: null,
-				isScaning: false,
+				isScaning: false,
+				
+				
 			};
 		},
 		onLoad(option) {
@@ -126,10 +129,12 @@
 							},
 							(decodeText, decodeResult) => {
 								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
-									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
+									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
+									const index = decodeText.indexOf('ywid')
+									let pointCode = decodeText.slice(index + 5)
 									getPointRecordByCode({
 										taskId: this.id,
-										pointCode: decodeText
+										pointCode
 									}).then(ress => {
 										if (ress.data) {
 											uni.navigateTo({
@@ -155,12 +160,18 @@
 				if (this.html5Qrcode) {
 					this.html5Qrcode.stop();
 				}
-			},
+			},
+			
 			itemClick(item) {
 				if (!this.flag) return
 				uni.navigateTo({
 					url: '/pages/polling/point?id=' + item.id
 				})
+			},
+			detailClick(item) {
+				uni.navigateTo({
+					url: '/pages/polling/point?id=' + item.id
+				})
 			},
 			getDetail() {
 				const {
diff --git a/h5/pages/polling/point.vue b/h5/pages/polling/point.vue
index 1288d07..122737b 100644
--- a/h5/pages/polling/point.vue
+++ b/h5/pages/polling/point.vue
@@ -28,7 +28,12 @@
 			<view class="files">
 				<view class="adduser_list_item_ipt1_upload" v-for="(item, i) in info.multifileList" :key="i">
 					<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
-					<video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
+					<!-- <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video> -->
+					<view v-if="item.type == 1" @click="videoClick(item)" class="video_wrap">
+						<video :src="item.fileurlFull" initial-time="0.01" :show-center-play-btn="false" :controls="false"
+							class="video" :enable-progress-gesture="false" muted />
+						<image src="@/static/play.png" class="play" mode=""></image>
+					</view>
 				</view>
 			</view>
 			<view v-if="info.dealInfo" class="desc">{{ info.dealInfo }}</view>
@@ -96,7 +101,13 @@
 			@cancel="isShowHandleDate = false" mode="datetime"></u-datetime-picker>
 		<u-picker :show="isShowRes" keyName="name" @cancel="isShowRes = false" @confirm='confirmRes'
 			:columns="columns"></u-picker>
-
+			<!--  -->
+			<view v-if="videoPlay" class="video_app">
+				<video controls autoplay muted x5-video-player-type="h5" x5-video-player-fullscreen="true" id="myvideo"
+					:src="videoUrl" @fullscreenchange="screenChange"></video>
+				<view class="bg" @click="closeVideo"></view>
+			</view>
+			<!--  -->
 	</view>
 </template>
 
@@ -135,7 +146,11 @@
 							name: '璺宠繃'
 						},
 					]
-				],
+				],
+				
+				videoPlay: false,
+				videoContext: null,
+				videoUrl: ''
 			};
 		},
 		onLoad(option) {
@@ -204,6 +219,26 @@
 				this.$set(this.handleParam, 'dealStatus', e.value[0].id)
 				this.$set(this.handleParam, 'dealName', e.value[0].name)
 				this.isShowRes = false
+			},
+			videoClick(item) {
+				this.videoPlay = true;
+				this.videoContext = uni.createVideoContext("myvideo", this); // this杩欎釜鏄疄渚嬪璞� 蹇呬紶
+				this.videoUrl = item.fileurlFull;
+				this.videoContext.requestFullScreen();
+				this.$nextTick(() => {
+					this.videoContext.play();
+				})
+			},
+			screenChange(e) {
+				let fullScreen = e.detail.fullScreen // 鍊紅rue涓鸿繘鍏ュ叏灞忥紝false涓洪��鍑哄叏灞�
+				if (!fullScreen) {
+					//閫�鍑哄叏灞�
+					this.videoPlay = false // 闅愯棌鎾斁鐩掑瓙
+				}
+			},
+			closeVideo() {
+				this.videoPlay = false
+				this.videoContext = null
 			},
 			fileDel(str, i) {
 				this[str].splice(i, 1);
@@ -470,11 +505,51 @@
 		image {
 			width: 100%;
 			height: 100%;
+		}
+		video {
+			width: 100%;
+			height: 100%;
 		}
-
-		video {
-			width: 100%;
-			height: 100%;
+		.video_wrap {
+			position: relative;
+			border: 1px solid;
+			width: 156rpx;
+			height: 156rpx;
+			border-radius: 4rpx;
+		
+			.play {
+				width: 60rpx !important;
+				height: 60rpx !important;
+				position: absolute;
+				top: 50%;
+				left: 50%;
+				transform: translate(-50%, -50%);
+			}
 		}
+	}
+	
+	.video_app {
+		overflow: hidden;
+		position: fixed;
+		left: 0;
+		top: 0;
+		width: 100vw;
+		height: 100vh;
+		display: flex;
+		align-items: center;
+		z-index: 9990;
+	
+		.bg {
+			background-color: rgba(0, 0, 0, .6);
+			position: absolute;
+			width: 100%;
+			height: 100%;
+			z-index: -1;
+		}
+	
+		video {
+			width: 100%;
+			height: 42vh;
+		}
 	}
 </style>
\ No newline at end of file
diff --git a/h5/pages/polling/task.vue b/h5/pages/polling/task.vue
index 0e72898..e76a9cc 100644
--- a/h5/pages/polling/task.vue
+++ b/h5/pages/polling/task.vue
@@ -117,10 +117,12 @@
 							},
 							(decodeText, decodeResult) => {
 								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
+									const index = decodeText.indexOf('ywid')
+									let pointCode = decodeText.slice(index + 5)
 									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
 									getPointRecordByCode({
 										taskId: item.id,
-										pointCode: decodeText
+										pointCode
 									}).then(ress=> {
 										if(ress.data){
 											uni.navigateTo({
diff --git a/h5/pages/workOrder/detail.vue b/h5/pages/workOrder/detail.vue
index c112a22..1a4b1a1 100644
--- a/h5/pages/workOrder/detail.vue
+++ b/h5/pages/workOrder/detail.vue
@@ -14,7 +14,7 @@
 					<!-- <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video> -->
 					<view v-if="item.type == 1" @click="videoClick(item)" class="video_wrap">
 						<video :src="item.fileurlFull" initial-time="0.01" :show-center-play-btn="false" :controls="false"
-							class="video" :enable-progress-gesture="false" autoplay muted />
+							class="video" :enable-progress-gesture="false" muted />
 						<image src="@/static/play.png" class="play" mode=""></image>
 					</view>
 				</view>
diff --git a/h5/pages/workOrder/problemEdit.vue b/h5/pages/workOrder/problemEdit.vue
new file mode 100644
index 0000000..0cf8f09
--- /dev/null
+++ b/h5/pages/workOrder/problemEdit.vue
@@ -0,0 +1,313 @@
+<template>
+	<view class="main_app">
+		<view class="list">
+			<view class="item">
+				<view class="la">浣嶇疆</view>
+				<view class="line input_wrap">
+					<input type="text" v-model="param.position" :maxlength="50" placeholder="璇疯緭鍏ュ彂鐜伴棶棰樼殑璇︾粏浣嶇疆" placeholder-class="placeholder9" />
+				</view>
+			</view>
+			<view class="item">
+				<view class="la"><text class="red">*</text>鎻忚堪</view>
+				<view class="line">
+					<textarea :maxlength="300" v-model="param.content" 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 fileList" :key="i">
+						<u-icon class="close" size="20" name="close-circle-fill" color="red"
+							@click="fileDel('fileList', i)"></u-icon>
+						<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
+						<video v-if="item.type == 1" :show-center-play-btn="false" :src="item.fileurlFull" :controls="false"></video>
+					</view>
+				</view>
+			</view>
+			<view class="item">
+				<view class="la"><text class="red">*</text>涓婃姤浜�</view>
+				<view class="line input_wrap">
+					<input v-model="param.name" type="text" :maxlength="10" placeholder="璇疯緭鍏�" placeholder-class="placeholder9" />
+				</view>
+			</view>
+			<view class="item">
+				<view class="la"><text class="red">*</text>涓婃姤浜虹數璇�</view>
+				<view class="line input_wrap">
+					<input v-model="param.phone" type="tel" :maxlength="18" placeholder="璇疯緭鍏�" placeholder-class="placeholder9" />
+				</view>
+			</view>
+		</view>
+		<view class="sub_btn" @click="onSubmit">鎻愪氦</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,
+		ywProblemCreate,
+	} from '@/api'
+	import dayjs from 'dayjs';
+	export default {
+		data() {
+			return {
+				param: {},
+				showUpload: false,
+				fileList: [],
+
+			};
+		},
+		onLoad() {
+		},
+		methods: {
+			onSubmit() {
+				const {
+					param,
+					fileList
+				} = this
+				if (!param.content) return this.showToast('璇疯緭鍏ョ幇鍦烘儏鍐垫弿杩�')
+				if (!param.name) return this.showToast('璇疯緭鍏ヤ笂鎶ヤ汉濮撳悕')
+				if (!param.phone) return this.showToast('璇疯緭鍏ヤ笂鎶ヤ汉鐢佃瘽')
+				ywProblemCreate({
+					...param,
+					fileList
+				}).then(res => {
+					this.showToast('鎻愪氦鎴愬姛')
+					this.param = {}
+					uni.navigateTo({
+						url: '/pages/workOrder/result'
+					})
+				})
+			},
+			fileDel(str, i) {
+				this[str].splice(i, 1);
+			},
+			uploadImage() {
+				this.showUpload = false;
+				let token = uni.getStorageSync('token') || '';
+				uni.chooseImage({
+					count: 6,
+					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: 'YW_WORKORDER_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;
+										if(this.fileList.length < 9){
+											this.fileList.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: 'YW_WORKORDER_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;
+										if(this.fileList.length < 9){
+											this.fileList.push(i);
+										}
+									});
+								}
+							},
+							complete() {
+								uni.hideLoading();
+							}
+						});
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.list {
+
+		.item {
+			.la {
+				margin-top: 30rpx;
+			}
+
+			.line {
+
+				textarea {
+					box-sizing: border-box;
+					width: 690rpx;
+					height: 200rpx;
+					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;
+			}
+			.input_wrap{
+				width: 100%;
+				height: 90rpx;
+				display: flex;
+				align-items: center;
+				border-bottom: 1rpx solid #e5e5e5;
+				input{
+					width: 100%;
+				}
+			}
+
+			.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;
+					background-color: #fff;
+					border-radius: 50%;
+					overflow: hidden;
+				}
+
+				image {
+					width: 100%;
+					height: 100%;
+				}
+
+				video {
+					width: 100%;
+					height: 100%;
+				}
+			}
+
+		}
+	}
+
+	.sub_btn {
+		// position: fixed;
+		// bottom: 68rpx;
+		// left: 40rpx;
+		width: 670rpx;
+		height: 88rpx;
+		margin-top: 80rpx;
+		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;
+	}
+
+	.sel_upload_wrap {
+		width: 100%;
+		border-top: 1px solid #666666;
+		box-shadow: 0 1 1 #333333;
+
+		.btn {
+			height: 90rpx;
+			line-height: 90rpx;
+			text-align: center;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/workOrder/result.vue b/h5/pages/workOrder/result.vue
new file mode 100644
index 0000000..d0d3859
--- /dev/null
+++ b/h5/pages/workOrder/result.vue
@@ -0,0 +1,39 @@
+<template>
+	<view class="main_app">
+		<image class="logo" src="/static/ic_paysuccess@2x.png" mode=""></image>
+		<view class="title">鎻愪氦鎴愬姛</view>
+		<view class="">鎰熻阿鎮ㄧ殑涓婃姤锛屾垜浠皢灏藉揩鏍稿疄澶勭悊</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+.main_app{
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	padding-top: 200rpx;
+	font-size: 26rpx;
+	color: #999999;
+	.title{
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #333333;
+		margin-bottom: 26rpx;
+	}
+	.logo{
+		width: 180rpx;
+		height: 180rpx;
+		margin-bottom: 40rpx;
+	}
+}
+</style>
diff --git a/h5/pages/workOrder/wait.vue b/h5/pages/workOrder/wait.vue
new file mode 100644
index 0000000..d3fd3e1
--- /dev/null
+++ b/h5/pages/workOrder/wait.vue
@@ -0,0 +1,431 @@
+<template>
+	<view class="main_app">
+		<view class="tabs">
+			<view class="tab" :class="{active: queryStatus == 0}" @click="tabsClick(0)">
+				<text>寰呭姙</text>
+				<text class="border"></text>
+			</view>
+			<view class="tab" :class="{active: queryStatus == 1}" @click="tabsClick(1)">
+				<text>宸插姙</text>
+				<text class="border"></text>
+			</view>
+		</view>
+		<scroll-view scroll-y="true" class="scroll_Y" @scrolltolower="scrolltolower">
+			<view class="list">
+				<view class="item" @click="itemClick(item)" v-for="item in list">
+					<view class="img">
+						<image v-if="item.type == 0 && item.status == 0" src="@/static/side/ic_pandian@2x.png"></image>
+						<image v-if="item.type == 1 && item.status == 0" src="@/static/side/xunjianed.png"></image>
+						<image v-if="item.type == 2 && item.status == 0" src="@/static/side/workordered.png"></image>
+						<image v-if="item.type == 0 && item.status == 1" src="@/static/side/ic_pandian_grey@2x.png"></image>
+						<image v-if="item.type == 1 && item.status == 1" src="@/static/side/xunjian.png"></image>
+						<image v-if="item.type == 2 && item.status == 1" src="@/static/side/workorder.png"></image>
+					</view>
+					<view class="content">
+						<view class="title" v-if="item.obj">
+							<view>{{item.obj.key1}}</view>
+							<view v-if="item.status == 0 && item.type == 2" class="status">寰呭鐞�</view>
+							<view v-if="item.status == 0 && item.param3 == 0 && (item.type == 0 || item.type == 1)" class="status">鏈紑濮�
+							</view>
+							<view v-if="item.status == 0 && item.param3 == 1 && (item.type == 0 || item.type == 1)"
+								class="status green">杩涜涓�</view>
+							<view v-if="item.status == 1 && item.type == 2" class="status gray">宸插鐞�</view>
+							<view v-if="item.status == 1 && (item.type == 0 || item.type == 1)" class="status gray">宸插畬鎴�</view>
+						</view>
+						<template v-if="item.obj && item.type == 1">
+							<view class="text">浠诲姟鏃ユ湡锛歿{item.obj.key2}}</view>
+							<view class="text">鎵ц鏃堕棿锛歿{item.obj.key3}}</view>
+							<view class="text">
+								<view class="">宸℃璐熻矗浜猴細{{item.obj.key4}}</view>
+								<view class="btn" @click.stop="openSc(item)">
+									<image src="@/static/side/ic_saoma@2x.png" mode=""></image>
+									<view v-if="item.status == 0" class="">鎵爜宸℃</view>
+								</view>
+							</view>
+						</template>
+						<template v-if="item.obj && item.type == 0">
+							<view class="content">
+								<view class="text">鐩樼偣鏃ユ湡锛歿{item.obj.key2}}</view>
+								<view class="text">鐩樼偣浠撳簱锛歿{item.obj.key3}}</view>
+								<view class="text">
+									<view class="">鐩樼偣鍛橈細{{item.obj.key4}}</view>
+									<view v-if="item.status == 0 && item.param3 == 0" class="btn" @click.stop="startHandle(item)">寮�濮嬬洏鐐�
+									</view>
+									<view v-if="item.status == 0 && item.param3 == 1" class="btn" @click.stop="startHandle(item)">缁х画鐩樼偣
+									</view>
+								</view>
+							</view>
+						</template>
+						<template v-if="item.obj && item.type == 2">
+							<view class="content">
+								<view class="text">涓婃姤鏃堕棿锛歿{item.obj.key2}}</view>
+								<view class="text">浣嶇疆绫诲瀷锛歿{item.obj.key3}}</view>
+								<view class="text">宸ュ崟鍒嗙被锛歿{item.obj.key4}}</view>
+							</view>
+						</template>
+
+					</view>
+
+
+				</view>
+			</view>
+			<view class="empty" v-if="list.length == 0">
+				<image src="@/static/empty.png" mode=""></image>
+				<view class="">鏆傛棤鏁版嵁</view>
+			</view>
+		</scroll-view>
+		<!--  -->
+		<view class="reader-box" @click="stopScan" v-if="isScaning">
+			<view class="reader" id="reader"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		myNoticesH5,
+		ywStocktakingBegin,
+		getPointRecordByCode
+	} from '@/api'
+	import {
+		Html5Qrcode
+	} from 'html5-qrcode';
+	export default {
+		data() {
+			return {
+				list: [],
+				total: 0,
+				page: 1,
+				queryStatus: 0,
+
+				html5Qrcode: null,
+				isScaning: false,
+			};
+		},
+		onShow() {
+			this.page = 1
+			this.list = []
+			this.getList()
+		},
+		methods: {
+			tabsClick(val) {
+				this.list = []
+				this.page = 1
+				this.queryStatus = val
+				this.getList()
+			},
+			itemClick(item) {
+				if (item.objType == 0 && item.status == 1) {
+					uni.navigateTo({
+						url: `/pages/inventory/detail?id=${item.objId}`
+					})
+				} else if (item.objType == 1) {
+					// return
+					uni.navigateTo({
+						url: `/pages/polling/detail?id=${item.objId}`
+					})
+				} else if(item.objType == 2) {
+					uni.navigateTo({
+						url: `/pages/workOrder/detail?id=${item.objId}`
+					})
+				}
+			},
+			startHandle(item) {
+				if (item.param3 == 0) {
+					uni.showModal({
+						content: '鐩樼偣鏈熼棿涓嶅彲杩涜鍑哄叆搴撴搷浣�',
+						success: (res) => {
+							if (res.confirm) {
+								ywStocktakingBegin(item.objId).then(() => {
+									uni.navigateTo({
+										url: '/pages/inventory/detail?id=' + item.objId
+									})
+								})
+
+							}
+						}
+					})
+				}else{
+					uni.navigateTo({
+						url: '/pages/inventory/detail?id=' + item.objId
+					})
+				}
+			},
+			getList() {
+				const {
+					page,
+					total,
+					list,
+					queryStatus
+				} = this
+				myNoticesH5({
+					page,
+					capacity: 20,
+					model: {
+						status: queryStatus
+					}
+				}).then(res => {
+					this.list = [...this.list, ...res.data.records]
+					this.list.forEach(item => {
+						item.obj = JSON.parse(item.param2)
+					})
+					console.log(this.list);
+					this.total = res.data.total
+				})
+			},
+			scrolltolower() {
+				const {
+					total,
+					list
+				} = this
+				if (list.length < total) {
+					this.page = this.page + 1
+					this.getList()
+				} else {
+					this.showToast('鏆傛棤鏇村鏁版嵁')
+				}
+			},
+			openSc(item) {
+				this.isScaning = true;
+				Html5Qrcode.getCameras().then((devices) => {
+					if (devices && devices.length) {
+						this.html5Qrcode = new Html5Qrcode('reader');
+						this.html5Qrcode.start({
+								facingMode: 'environment'
+							}, {
+								focusMode: 'continuous', //璁剧疆杩炵画鑱氱劍妯″紡
+								fps: 5, //璁剧疆鎵爜璇嗗埆閫熷害
+								qrbox: 280 //璁剧疆浜岀淮鐮佹壂鎻忔澶у皬
+							},
+							(decodeText, decodeResult) => {
+								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
+									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
+									const index = decodeText.indexOf('ywid')
+									let pointCode = decodeText.slice(index + 5)
+									getPointRecordByCode({
+										taskId: item.objId,
+										pointCode
+									}).then(ress => {
+										if (ress.data) {
+											uni.navigateTo({
+												url: '/pages/polling/point?id=' + ress.data.id
+											})
+										} else {
+											this.showToast('鏈尮閰嶅埌宸℃鐐�,璇烽噸鏂版壂鎻�')
+										}
+									})
+								}
+							},
+							(err) => {
+								// console.log(err);  //閿欒淇℃伅
+							}
+						);
+					}
+				});
+			},
+
+			stopScan() {
+				console.log('鍋滄鎵爜')
+				this.isScaning = false;
+				if (this.html5Qrcode) {
+					this.html5Qrcode.stop();
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #f7f7f7;
+
+		.main_app {
+			padding: 0;
+			height: 100vh;
+			overflow: hidden;
+			background-color: #fff;
+		}
+
+		.tabs {
+			display: flex;
+			width: 750rpx;
+			margin: 12rpx 0rpx 0;
+			border-bottom: 1rpx solid #E5E5E5;
+			background-color: #fff;
+
+			.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: 16rpx;
+				}
+			}
+
+			.active {
+				font-weight: 600;
+				font-size: 32rpx;
+				color: #222222;
+
+				.border {
+					background-color: $primaryColor;
+				}
+
+			}
+
+		}
+
+		.scroll_Y {
+			height: calc(100vh - 120rpx);
+
+			.empty {
+				padding-top: 260rpx;
+
+				image {
+					width: 360rpx;
+					height: 360rpx;
+					margin-bottom: 10rpx;
+				}
+
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+				color: #999999;
+			}
+		}
+
+		.list {
+			// padding-top: 20rpx;
+
+			.item {
+				width: 100%;
+				background: #FFFFFF;
+				border-radius: 8rpx;
+				display: flex;
+				padding: 30rpx 24rpx;
+				border-bottom: 1rpx solid #e5e5e5;
+
+				.img {
+					position: relative;
+					margin-right: 20rpx;
+					flex-shrink: 0;
+					position: relative;
+
+					image {
+						width: 72rpx;
+						height: 72rpx;
+					}
+
+					.dian {
+						position: absolute;
+						background-color: red;
+						width: 18rpx;
+						height: 18rpx;
+						border-radius: 50%;
+						top: -8rpx;
+						right: -8rpx;
+					}
+				}
+
+				.content {
+					flex: 1;
+
+					.title {
+						font-weight: 500;
+						font-size: 32rpx;
+						color: #222222;
+						margin-bottom: 6rpx;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+						.status {
+							color: $primaryColor;
+							font-weight: 400;
+							font-size: 28rpx;
+						}
+
+						.green {
+							color: #0ADE79;
+						}
+
+						.gray {
+							color: #999999;
+						}
+					}
+
+					.text {
+						font-size: 26rpx;
+						color: #666666;
+						height: 60rpx;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+						.btn {
+							background-color: $primaryColor;
+							padding: 0 24rpx;
+							height: 60rpx;
+							border-radius: 30rpx;
+							display: flex;
+							align-items: center;
+							color: #fff;
+
+							image {
+								width: 28rpx;
+								height: 28rpx;
+								margin-right: 6rpx;
+							}
+						}
+					}
+
+					.time {
+						font-size: 26rpx;
+						color: #999999;
+					}
+				}
+			}
+		}
+	}
+
+	.reader-box {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+	}
+
+	.reader {
+		width: 100%;
+		// width: 540rpx;
+		// height: 540rpx;
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+	}
+</style>
\ No newline at end of file
diff --git a/h5/static/home/ic_daiban@2x.png b/h5/static/home/ic_daiban@2x.png
new file mode 100644
index 0000000..22d7e91
--- /dev/null
+++ b/h5/static/home/ic_daiban@2x.png
Binary files differ
diff --git a/h5/static/home/ic_pandian@2x.png b/h5/static/home/ic_pandian@2x.png
new file mode 100644
index 0000000..bdf227f
--- /dev/null
+++ b/h5/static/home/ic_pandian@2x.png
Binary files differ
diff --git a/h5/static/ic_paysuccess@2x.png b/h5/static/ic_paysuccess@2x.png
new file mode 100644
index 0000000..737e03d
--- /dev/null
+++ b/h5/static/ic_paysuccess@2x.png
Binary files differ
diff --git a/h5/static/side/btn_jia@3x.png b/h5/static/side/btn_jia@3x.png
new file mode 100644
index 0000000..986666c
--- /dev/null
+++ b/h5/static/side/btn_jia@3x.png
Binary files differ
diff --git a/h5/static/side/btn_jian@3x.png b/h5/static/side/btn_jian@3x.png
new file mode 100644
index 0000000..6949c9f
--- /dev/null
+++ b/h5/static/side/btn_jian@3x.png
Binary files differ
diff --git a/h5/static/side/btn_jian_grey@2x.png b/h5/static/side/btn_jian_grey@2x.png
new file mode 100644
index 0000000..274b96c
--- /dev/null
+++ b/h5/static/side/btn_jian_grey@2x.png
Binary files differ
diff --git a/h5/static/side/ic_pandian@2x.png b/h5/static/side/ic_pandian@2x.png
new file mode 100644
index 0000000..e8f8717
--- /dev/null
+++ b/h5/static/side/ic_pandian@2x.png
Binary files differ
diff --git a/h5/static/side/ic_pandian_grey@2x.png b/h5/static/side/ic_pandian_grey@2x.png
new file mode 100644
index 0000000..3917fb3
--- /dev/null
+++ b/h5/static/side/ic_pandian_grey@2x.png
Binary files differ
diff --git a/h5/static/side/xiaoxi_ic_tongzhi@2x.png b/h5/static/side/xiaoxi_ic_tongzhi@2x.png
new file mode 100644
index 0000000..b262ca0
--- /dev/null
+++ b/h5/static/side/xiaoxi_ic_tongzhi@2x.png
Binary files differ
diff --git a/h5/utils/config.js b/h5/utils/config.js
index 49ff135..df81430 100644
--- a/h5/utils/config.js
+++ b/h5/utils/config.js
@@ -1,6 +1,7 @@
- export const baseUrl = 'gateway_interface/'
+ // export const baseUrl = 'gateway_interface/'
 // export const baseUrl = 'http://192.168.0.173/gateway_interface/'
 // export const baseUrl = 'https://zhcg.fnwtzx.com/gateway_interface/'
+export const baseUrl = 'https://dmtest.ahapp.net/gateway_interface/'
 
 export const uploadAvatar = `${baseUrl}visitsAdmin/cloudService/web/public/uploadFtp.do`
 export const uploadUrl = `${baseUrl}visitsAdmin/cloudService/public/uploadBatch`

--
Gitblit v1.9.3