From 363208403f2076fef350a7feaf236e6153f982be Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期五, 10 一月 2025 09:19:28 +0800
Subject: [PATCH] Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/funingyunwei into 2.0.1

---
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java          |  207 ++-
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java               |   22 
 admin/src/views/stock/check.vue                                                                                 |  135 ++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwQuickModelCloudController.java               |   90 +
 admin/src/views/stock/in.vue                                                                                    |  138 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java                        |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomContractDataVO.java                |   36 
 admin/package-lock.json                                                                                         |  160 +-
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwQuickModelService.java                |   97 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java                       |    7 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java                |   16 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java             |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java                   |    4 
 admin/src/views/stock/components/CateEdit.vue                                                                   |   74 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java                        |   52 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WorkbenchesService.java                 |   22 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java                 |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java             |  201 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/MonthDataResponse.java                   |   27 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java         |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwQuickModelMapper.java                     |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java                       |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java                    |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java                      |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwQuickModel.java                     |   71 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java         |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java          |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwFloorStatusDataVO.java                 |   34 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java              |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java         |    5 
 admin/src/views/stock/out.vue                                                                                   |  138 ++
 admin/src/views/stock/assetList.vue                                                                             |  140 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java     |    1 
 admin/src/views/stock/record.vue                                                                                |  150 ++
 admin/src/views/stock/asset.vue                                                                                 |  133 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/YwWorkorderDataDTO.java                 |   25 
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                        |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java |    9 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java                       |   31 
 admin/src/views/stock/assetCate.vue                                                                             |  109 ++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java                     |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java                       |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java     |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceCateDataVO.java                  |   28 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java                         |   44 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java                   |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomStatusDataVO.java                  |   43 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java                   |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceParentCateDataVO.java            |   29 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java                      |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwContractBillDataVO.java                |   34 
 server/db/business.yw_quick_model.permissions.sql                                                               |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WorkbenchesServiceImpl.java        |  116 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwWorkorderDataVO.java                   |   30 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java     |   58 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceStatusDataVO.java                |   28 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwQuickModelServiceImpl.java       |  142 ++
 admin/src/views/stock/query.vue                                                                                 |  132 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java           |  165 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java        |   32 
 60 files changed, 2,992 insertions(+), 187 deletions(-)

diff --git a/admin/package-lock.json b/admin/package-lock.json
index 4adea74..6d328d1 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -2915,63 +2915,6 @@
           "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",
@@ -2979,28 +2922,6 @@
           "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"
           }
         }
       }
@@ -15821,6 +15742,87 @@
         }
       }
     },
+    "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",
diff --git a/admin/src/views/stock/asset.vue b/admin/src/views/stock/asset.vue
new file mode 100644
index 0000000..61d0ab4
--- /dev/null
+++ b/admin/src/views/stock/asset.vue
@@ -0,0 +1,133 @@
+<template>
+  <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>
+    </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="100" show-overflow-tooltip>
+        <template v-slot="{row}">
+          <span class="primaryColor pointer">鏌ョ湅璇︽儏</span>
+          <span class="red pointer">鍒犻櫎</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm
+  },
+  data() {
+    return {
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+        {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '浠撳簱鍚嶇О',
+          },
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '浠撳簱鐘舵��',
+            options: []
+          }
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  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({
+        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,
+        },
+        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
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>
diff --git a/admin/src/views/stock/assetCate.vue b/admin/src/views/stock/assetCate.vue
new file mode 100644
index 0000000..375678f
--- /dev/null
+++ b/admin/src/views/stock/assetCate.vue
@@ -0,0 +1,109 @@
+<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>
+      <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">
+          <template slot-scope="{row}">
+            <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
+              v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+              v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="tableData.pagination">
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <CateEdit v-if="isShowEdit" @close="isShowEdit = false" ref="CateEditRef" @success="getList" />
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import CateEdit from './components/CateEdit.vue'
+import { fetchList, deleteById } from '@/api/business/category.js'
+export default {
+  name: 'Category',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, CateEdit },
+  data() {
+    return {
+      // 鎼滅储
+      filters: {
+        parentId: ''
+      },
+      isShowEdit: false,
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0,
+      },
+      dataList: []
+    }
+  },
+  created() {
+    this.config({
+      module: '杞﹁締淇℃伅琛�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.getList()
+  },
+  methods: {
+    handleEdit(row) {
+      this.isShowEdit = true
+      let str = row && row.id ? '缂栬緫璧勪骇鍒嗙被' : '鏂板缓璧勪骇鍒嗙被'
+      this.$nextTick(() => {
+        this.$refs.CateEditRef.open(str)
+        this.$refs.CateEditRef.getList()
+        if (row && row.id) {
+          this.$refs.CateEditRef.getDetail(row.id)
+        }
+      })
+    },
+    deleteById(row) {
+      this.$confirm(`鎮ㄧ‘璁よ鍒犻櫎璇ュ垎绫诲悧`, '娓╅Θ鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteById(row.id).then(res => {
+          this.getList()
+        })
+      })
+
+    },
+    getList() {
+      const { pagination, filters } = this
+      this.loading = true
+      fetchList({
+        model: { ...filters, type: 5 },
+        capacity: pagination.pageSize,
+        page: pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.dataList = res.records || []
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/stock/assetList.vue b/admin/src/views/stock/assetList.vue
new file mode 100644
index 0000000..c5851ae
--- /dev/null
+++ b/admin/src/views/stock/assetList.vue
@@ -0,0 +1,140 @@
+<template>
+  <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>
+    </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="workTime" label="鎿嶄綔" min-width="100" show-overflow-tooltip>
+        <template v-slot="{ row }">
+          <span class="primaryColor pointer">缂栬緫</span>
+          <span class="red pointer">鍒犻櫎</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm
+  },
+  data() {
+    return {
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '璧勪骇淇℃伅',
+            placeholder: '璇疯緭鍏ヨ祫浜у悕绉�/缂栫爜'
+          },
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '瑙勬牸鍨嬪彿',
+          },
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '鎵�灞為」鐩�',
+            options: []
+          }
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  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({
+        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,
+        },
+        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
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style></style>
diff --git a/admin/src/views/stock/check.vue b/admin/src/views/stock/check.vue
new file mode 100644
index 0000000..86c05ec
--- /dev/null
+++ b/admin/src/views/stock/check.vue
@@ -0,0 +1,135 @@
+<template>
+  <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>
+    </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="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>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm
+  },
+  data() {
+    return {
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+        {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '鐩樼偣鍗�',
+          },
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '鐩樼偣鐘舵��',
+            options: []
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  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({
+        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,
+        },
+        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
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>
diff --git a/admin/src/views/stock/components/CateEdit.vue b/admin/src/views/stock/components/CateEdit.vue
new file mode 100644
index 0000000..a066862
--- /dev/null
+++ b/admin/src/views/stock/components/CateEdit.vue
@@ -0,0 +1,74 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒嗙被鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ垎绫诲悕绉�" v-trim />
+      </el-form-item>
+      <el-form-item label="鎵�灞炲垎绫�" prop="parentId">
+        <el-select :disabled="form.id" v-model="form.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
+          <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="sortnum">
+        <el-input v-model="form.sortnum" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" v-trim />
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
+export default {
+  name: 'OperaCategoryWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data() {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        parentId: null,
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: 5
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ヤ簩绾у垎绫诲悕绉�', trigger: 'blur' }
+        ],
+        status: [
+          { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+        ]
+      },
+      dataList: []
+    }
+  },
+  created() {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    getList() {
+      fetchCateList({ type: 5 }).then(res => {
+        this.dataList = res || []
+        
+      })
+    },
+    close() {
+      this.visible = false
+      this.$emit('close')
+    },
+    getDetail(id) {
+      getInfoById(id).then(res => {
+        this.form = res
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/stock/in.vue b/admin/src/views/stock/in.vue
index e69de29..e71d95d 100644
--- a/admin/src/views/stock/in.vue
+++ b/admin/src/views/stock/in.vue
@@ -0,0 +1,138 @@
+<template>
+  <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>
+    </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="workTime" label="鎿嶄綔" min-width="80" show-overflow-tooltip>
+        <template v-slot="{row}">
+          <span class="primaryColor pointer">鏌ョ湅璇︽儏</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm
+  },
+  data() {
+    return {
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+        {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '鍑哄簱鍗曞彿',
+          },
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '鎵�鍦ㄤ粨搴�',
+            options: []
+          },
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '鍑哄簱绫诲瀷',
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  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({
+        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,
+        },
+        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
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>
diff --git a/admin/src/views/stock/out.vue b/admin/src/views/stock/out.vue
index e69de29..e71d95d 100644
--- a/admin/src/views/stock/out.vue
+++ b/admin/src/views/stock/out.vue
@@ -0,0 +1,138 @@
+<template>
+  <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>
+    </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="workTime" label="鎿嶄綔" min-width="80" show-overflow-tooltip>
+        <template v-slot="{row}">
+          <span class="primaryColor pointer">鏌ョ湅璇︽儏</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm
+  },
+  data() {
+    return {
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+        {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '鍑哄簱鍗曞彿',
+          },
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '鎵�鍦ㄤ粨搴�',
+            options: []
+          },
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '鍑哄簱绫诲瀷',
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  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({
+        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,
+        },
+        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
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>
diff --git a/admin/src/views/stock/query.vue b/admin/src/views/stock/query.vue
index e69de29..7c318d2 100644
--- a/admin/src/views/stock/query.vue
+++ b/admin/src/views/stock/query.vue
@@ -0,0 +1,132 @@
+<template>
+  <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>
+    </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>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm
+  },
+  data() {
+    return {
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '鎵�鍦ㄤ粨搴�',
+            options: []
+          },
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '璧勪骇淇℃伅',
+            placeholder: '璇疯緭鍏ヨ祫浜у悕绉�/缂栫爜'
+          },
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '鍨嬪彿',
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  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({
+        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,
+        },
+        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
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style></style>
diff --git a/admin/src/views/stock/record.vue b/admin/src/views/stock/record.vue
index e69de29..7f1764b 100644
--- a/admin/src/views/stock/record.vue
+++ b/admin/src/views/stock/record.vue
@@ -0,0 +1,150 @@
+<template>
+  <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>
+    </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>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm
+  },
+  data() {
+    return {
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '璧勪骇缂栫爜',
+          },
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '鎵�鍦ㄤ粨搴�',
+            options: []
+          },
+          {
+            filed: 'carCodeFront',
+            type: 'input',
+            label: '鍗曟嵁缂栧彿',
+          },
+          {
+            filed: 'platformGroupId',
+            type: 'select',
+            label: '鍗曟嵁绫诲瀷',
+            options: []
+          },
+          {
+            filed: 'selDate',
+            type: 'daterange',
+            label: '鍗曟嵁鏃ユ湡',
+          },
+          {
+            filed: 'selTime',
+            type: 'daterange',
+            label: '鍒涘缓鏃堕棿',
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  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({
+        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,
+        },
+        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
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style></style>
diff --git a/server/db/business.yw_quick_model.permissions.sql b/server/db/business.yw_quick_model.permissions.sql
new file mode 100644
index 0000000..b38841c
--- /dev/null
+++ b/server/db/business.yw_quick_model.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywquickmodel:create', '鏂板缓宸ヤ綔鍙� - 蹇嵎妯″潡', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywquickmodel:delete', '鍒犻櫎宸ヤ綔鍙� - 蹇嵎妯″潡', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywquickmodel:update', '淇敼宸ヤ綔鍙� - 蹇嵎妯″潡', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywquickmodel:query', '鏌ヨ宸ヤ綔鍙� - 蹇嵎妯″潡', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ywquickmodel:exportExcel', '瀵煎嚭宸ヤ綔鍙� - 蹇嵎妯″潡(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index f5ac3a4..29e590d 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -53,6 +53,7 @@
     public static final String YW_PATROL ="YW_PATROL" ;
     public static final String YW_CONTRACT_BILL ="YW_CONTRACT_BILL" ;
     public static final String YW_MATERIAL ="YW_MATERIAL" ;
+    public static final String YW_PROBLEM ="YW_PROBLEM" ;
 
     public static final String RESERVATION_TOTAL_NUM ="RESERVATION_TOTAL_NUM" ;
     public static final String SIGN_IN_PLACE_LAT ="SIGN_IN_PLACE_LAT" ;
@@ -1388,6 +1389,7 @@
         FN_PATROL_TASK_RECORD_FILE(11, "宸℃浠诲姟鐐瑰鐞嗛檮浠� ", "宸℃浠诲姟鐐瑰鐞嗛檮浠� "),
         MATERIAL_FILE(12, "璧勪骇闄勪欢 ", "璧勪骇闄勪欢 "),
         PROBLEM_FILE(13, "闂闄勪欢 ", "闂闄勪欢 "),
+        FN_DEVICE_MAINTENANCE_FILE(14, "闃滃畞鏈嶅姟骞冲彴璁惧鏂囦欢 ", "闃滃畞鏈嶅姟骞冲彴璁惧鏂囦欢 "),
 
         ;
         // 鎴愬憳鍙橀噺
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java
index 0ee45de..ca58ec1 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java
@@ -10,6 +10,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.YwContractBill;
+import com.doumee.dao.business.vo.YwContractBillDataVO;
 import com.doumee.service.business.YwContractBillService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -112,5 +113,11 @@
         return ApiResponse.success("鐢熸垚鎴愬姛");
     }
 
+    @ApiOperation("鑾峰彇寰呭鐞嗚处鍗�")
+    @GetMapping("/getWaitDealList")
+    @CloudRequiredPermission("business:ywcontractbill:query")
+    public ApiResponse<YwContractBillDataVO> getWaitDealList(@RequestParam Integer contractId,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywContractBillService.getWaitDealList(contractId));
+    }
 
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java
index ff55707..6c3738c 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwDeviceCloudController.java
@@ -8,6 +8,8 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.YwDevice;
+import com.doumee.dao.business.vo.YwDeviceCateDataVO;
+import com.doumee.dao.business.vo.YwDeviceStatusDataVO;
 import com.doumee.service.business.YwDeviceService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -18,6 +20,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author 姹熻箘韫�
@@ -100,6 +103,17 @@
         return ApiResponse.success(ywDeviceService.findByCode(deviceCode));
     }
 
+    @ApiOperation("璁惧鏁伴噺鍒嗙被缁熻")
+    @PostMapping("/getDeviceCateData")
+    @CloudRequiredPermission("business:ywdevice:query")
+    public ApiResponse<Set<YwDeviceCateDataVO>> getDeviceCateData (@RequestBody YwDevice ywDevice,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceService.getDeviceCateData(ywDevice));
+    }
 
-
+    @ApiOperation("璁惧鐘舵�佺粺璁�")
+    @PostMapping("/getDeviceStatus")
+    @CloudRequiredPermission("business:ywdevice:query")
+    public ApiResponse<YwDeviceStatusDataVO> getDeviceStatus (@RequestBody YwDevice ywDevice,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywDeviceService.getDeviceStatus(ywDevice));
+    }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java
index 310349f..54e6b7d 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProblemController.java
@@ -10,7 +10,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.YwProblem;
+import com.doumee.dao.business.model.YwWorkorder;
 import com.doumee.service.business.YwProblemService;
+import com.doumee.service.business.impl.YwWorkorderServiceImpl;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.shiro.authz.annotation.RequiresPermissions;    
@@ -33,6 +35,8 @@
     @Autowired
     private YwProblemService ywProblemService;
 
+    @Autowired
+    private YwWorkorderServiceImpl ywWorkorderService;
     @LoginNoRequired
     @PreventRepeat
     @ApiOperation("闂鎻愭姤")
@@ -41,10 +45,23 @@
         return ApiResponse.success(ywProblemService.create(ywProblem));
     }
 
+
+
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/editProblem")
+    @CloudRequiredPermission("business:ywproblem:update")
+    public ApiResponse editProblem(@RequestBody YwProblem ywProblem,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywProblem.setLoginUserInfo(getLoginUser(token));
+        ywProblemService.editProblem(ywProblem,ywWorkorderService);
+        return ApiResponse.success(null);
+    }
+
+
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:ywproblem:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ywProblemService.deleteById(id);
         return ApiResponse.success(null);
     }
@@ -52,7 +69,7 @@
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
     @CloudRequiredPermission("business:ywproblem:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         String [] idArray = ids.split(",");
         List<Integer> idList = new ArrayList<>();
         for (String id : idArray) {
@@ -65,7 +82,7 @@
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:ywproblem:update")
-    public ApiResponse updateById(@RequestBody YwProblem ywProblem) {
+    public ApiResponse updateById(@RequestBody YwProblem ywProblem,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ywProblemService.updateById(ywProblem);
         return ApiResponse.success(null);
     }
@@ -73,21 +90,21 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:ywproblem:query")
-    public ApiResponse<PageData<YwProblem>> findPage (@RequestBody PageWrap<YwProblem> pageWrap) {
+    public ApiResponse<PageData<YwProblem>> findPage (@RequestBody PageWrap<YwProblem> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(ywProblemService.findPage(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:ywproblem:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<YwProblem> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<YwProblem> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(YwProblem.class).export(ywProblemService.findPage(pageWrap).getRecords(), "杩愮淮闂涓婃姤淇℃伅琛�", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:ywproblem:query")
-    public ApiResponse findById(@PathVariable Integer id) {
-        return ApiResponse.success(ywProblemService.findById(id));
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywProblemService.getDetail(id));
     }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwQuickModelCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwQuickModelCloudController.java
new file mode 100644
index 0000000..6f05fa8
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwQuickModelCloudController.java
@@ -0,0 +1,90 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.YwQuickModel;
+import com.doumee.service.business.YwQuickModelService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/09 17:47
+ */
+@Api(tags = "宸ヤ綔鍙� - 蹇嵎妯″潡")
+@RestController
+@RequestMapping("/business/ywQuickModel")
+public class YwQuickModelCloudController extends BaseController {
+
+    @Autowired
+    private YwQuickModelService ywQuickModelService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ywquickmodel:create")
+    public ApiResponse create(@RequestBody YwQuickModel ywQuickModel) {
+        return ApiResponse.success(ywQuickModelService.create(ywQuickModel));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ywquickmodel:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ywQuickModelService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ywquickmodel:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ywQuickModelService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ywquickmodel:update")
+    public ApiResponse updateById(@RequestBody YwQuickModel ywQuickModel) {
+        ywQuickModelService.updateById(ywQuickModel);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ywquickmodel:query")
+    public ApiResponse<PageData<YwQuickModel>> findPage (@RequestBody PageWrap<YwQuickModel> pageWrap) {
+        return ApiResponse.success(ywQuickModelService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:ywquickmodel:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<YwQuickModel> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(YwQuickModel.class).export(ywQuickModelService.findPage(pageWrap).getRecords(), "宸ヤ綔鍙� - 蹇嵎妯″潡", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ywquickmodel:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ywQuickModelService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java
index 0eac4e5..af30c32 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwRoomCloudController.java
@@ -9,6 +9,8 @@
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.YwContractRoom;
 import com.doumee.dao.business.model.YwRoom;
+import com.doumee.dao.business.vo.YwFloorStatusDataVO;
+import com.doumee.dao.business.vo.YwRoomContractDataVO;
 import com.doumee.service.business.YwRoomService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -99,4 +101,19 @@
     public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(ywRoomService.findById(id));
     }
+
+    @ApiOperation("鏌ヨ鎴块棿鎬佸娍鏁版嵁")
+    @PostMapping("/getRoomStatusList")
+    @CloudRequiredPermission("business:ywroom:query")
+    public ApiResponse<List<YwFloorStatusDataVO>> getRoomStatusList (@RequestBody  YwRoom model, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywRoomService.getRoomStatusList(model));
+    }
+
+    @ApiOperation("鏌ヨ鎴块棿绉熻祦淇℃伅")
+    @PostMapping("/getRoomContract")
+    @CloudRequiredPermission("business:ywroom:query")
+    public ApiResponse<YwRoomContractDataVO> getRoomContract (@RequestBody  YwRoom model, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(ywRoomService.getRoomContract(model));
+    }
+
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java
index 792cdb9..2c44494 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwWorkorderCloudController.java
@@ -7,7 +7,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.dto.YwWorkorderDataDTO;
 import com.doumee.dao.business.model.YwWorkorder;
+import com.doumee.dao.business.vo.YwWorkorderDataVO;
 import com.doumee.service.business.YwWorkorderService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -37,6 +39,7 @@
     @CloudRequiredPermission("business:ywworkorder:create")
     public ApiResponse create(@RequestBody YwWorkorder ywWorkorder,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ywWorkorder.setLoginUserInfo(this.getLoginUser(token));
+        ywWorkorder.setOrigin(Constants.ZERO);
         return ApiResponse.success(ywWorkorderService.create(ywWorkorder));
     }
 
@@ -86,6 +89,19 @@
         return ApiResponse.success(null);
     }
 
+
+    @ApiOperation("鑾峰彇宸ュ崟鏁伴噺淇℃伅")
+    @PostMapping("/getDataVO")
+    @CloudRequiredPermission("business:ywworkorder:update")
+    public ApiResponse<YwWorkorderDataVO> getDataVO(@RequestBody YwWorkorderDataDTO dto,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        YwWorkorderDataVO ywWorkorderDataVO = ywWorkorderService.getDataVO(dto);
+        return ApiResponse.success(ywWorkorderDataVO);
+    }
+
+
+
+
+
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:ywworkorder:query")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java
index 92b447a..c857dbb 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwProblemMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.YwProblem;
+import com.github.yulichang.base.MPJBaseMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/01/06 11:05
  */
-public interface YwProblemMapper extends BaseMapper<YwProblem> {
+public interface YwProblemMapper extends MPJBaseMapper<YwProblem> {
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwQuickModelMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwQuickModelMapper.java
new file mode 100644
index 0000000..b463189
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwQuickModelMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.YwQuickModel;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/01/09 17:47
+ */
+public interface YwQuickModelMapper extends MPJBaseMapper<YwQuickModel> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/YwWorkorderDataDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/YwWorkorderDataDTO.java
new file mode 100644
index 0000000..cb84c1f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/YwWorkorderDataDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/1/8 15:37
+ */
+@Data
+public class YwWorkorderDataDTO {
+
+
+    @ApiModelProperty(value = "鏌ヨ绫诲瀷锛�1=椤圭洰锛�2=妤煎眰锛�3=鎴块棿", example = "1")
+    private Integer queryType;
+
+    @ApiModelProperty(value = "涓氬姟涓婚敭", example = "1")
+    private Integer queryId;
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
index 5fca146..40a3fe7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
@@ -115,4 +115,11 @@
     @ApiModelProperty(value = "椤圭洰鍚嶇О")
     @TableField(exist = false)
     private String projectName;
+    @ApiModelProperty(value = "鎴块棿璁¤垂闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @TableField(exist = false)
+    private BigDecimal roomFeeArea;
+    @ApiModelProperty(value = "鎴块棿璁$闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    @TableField(exist = false)
+    private BigDecimal roomRentArea;
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
index 85292b5..4d5198f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
@@ -202,6 +202,9 @@
     @ExcelColumn(name="鐗╀笟璐规�婚噾棰�")
     private BigDecimal wyTotalFee;
 
+    @ApiModelProperty(value = "鎴块棿涓婚敭 鏌ヨ浣跨敤")
+    @TableField(exist = false)
+    private Integer roomId;
     @ApiModelProperty(value = "闄勪欢闆嗗悎")
     @TableField(exist = false)
     private List<Multifile> fileList;
@@ -244,6 +247,9 @@
     @ApiModelProperty(value = "閲嶆柊寮�濮嬫椂闂�")
     @TableField(exist = false)
     private Date queryStartTime;
+    @ApiModelProperty(value = "鍚堝悓鎬昏垂鐢�",notes = "鍚堝悓鍒濆鍖栨椂閲戦", example = "1")
+    @TableField(exist = false)
+    private BigDecimal totalFee;
 
     @ApiModelProperty(value = "鏌ヨ缁撴潫鏃堕棿")
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
index 99f3efe..ef14ea2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwDevice.java
@@ -12,6 +12,7 @@
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 杩愮淮璁惧淇℃伅琛�
@@ -94,9 +95,46 @@
     @ExcelColumn(name="鎵�鍦ㄤ綅缃�")
     private String addr;
 
+    @ApiModelProperty(value = "鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)", example = "1")
+    private Integer projectId;
+
+    @ApiModelProperty(value = "鎵�灞炴ゼ灞傜紪鐮侊紙鍏宠仈yw_floor)", example = "1")
+    private Integer floorId;
+
+    @ApiModelProperty(value = "鎵�灞炴ゼ瀹囩紪鐮侊紙鍏宠仈yw_building)", example = "1")
+    private Integer buildingId;
+
+    @ApiModelProperty(value = "鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)", example = "1")
+    private Integer roomId;
+
+
+    @ApiModelProperty(value = "渚涘簲鍟嗚仈绯讳汉")
+    private String supplierLinker;
+
+    @ApiModelProperty(value = "渚涘簲鍟嗚仈绯荤數璇�")
+    private String supplierPhone;
+
+    @ApiModelProperty(value = "缁翠繚浜哄憳涓婚敭锛堝叧鑱攕ystem_user锛�")
+    private Integer maintenanceUserId;
+
+    @ApiModelProperty(value = "缁翠繚鍒版湡鏃�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintenanceOverDate;
+
+    @ApiModelProperty(value = "缁翠繚璇存槑")
+    private String maintenanceContent;
+
     @ApiModelProperty(value = "鍒嗙被鍚嶇О")
     @TableField(exist = false)
     private String categoryName;
+
+    @ApiModelProperty(value = "鐖剁骇鍒嗙被鍚嶇О")
+    @TableField(exist = false)
+    private String categoryParentName;
+
+    @ApiModelProperty(value = "鎵�灞炵埗绾у垎绫荤紪鐮侊紙鍏宠仈category锛�", example = "1")
+    @TableField(exist = false)
+    private Integer cateParentId;
 
     @ApiModelProperty(value = "绠$悊鍛樺悕绉�")
     @TableField(exist = false)
@@ -110,6 +148,12 @@
     @TableField(exist = false)
     private String fileFullUrl;
 
+    @ApiModelProperty(value = "闄勪欢淇℃伅")
+    @TableField(exist = false)
+    private List<Multifile> multifileList;
+
+
+
 
 //    @ApiModelProperty(value = "闄勪欢淇℃伅")
 //    @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java
index 5f23ec8..37e6303 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java
@@ -119,5 +119,13 @@
     @TableField(exist = false)
     private Integer projectId;
 
+    @ApiModelProperty(value = "妤煎畤涓婚敭", example = "1")
+    @TableField(exist = false)
+    private Integer buildingId;
+
+    @ApiModelProperty(value = "妤煎眰涓婚敭", example = "1")
+    @TableField(exist = false)
+    private Integer floorId;
+
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java
index bc6ea4b..3b798da 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java
@@ -11,6 +11,7 @@
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 杩愮淮宸℃璁″垝淇℃伅琛�
@@ -133,4 +134,7 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date endDateSec;
 
+
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java
index d6ff2a8..ef8a041 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java
@@ -119,4 +119,26 @@
     @TableField(exist = false)
     private List<Multifile> multifileList;
 
+
+    @ApiModelProperty(value = "宸℃璁″垝鍚嶇О")
+    @TableField(exist = false)
+    private String schemeTitle;
+
+    @ApiModelProperty(value = "宸℃浠诲姟缂栧彿")
+    @TableField(exist = false)
+    private String taskCode;
+
+    @ApiModelProperty(value = "寮�濮嬫棩鏈�")
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃ユ湡")
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endDate;
+
+
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java
index d6ab8c4..8eae329 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwProblem.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
 import com.doumee.dao.system.model.Multifile;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -21,7 +22,7 @@
 @Data
 @ApiModel("杩愮淮闂涓婃姤淇℃伅琛�")
 @TableName("`yw_problem`")
-public class YwProblem {
+public class YwProblem extends LoginUserModel {
 
     @TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "涓婚敭", example = "1")
@@ -93,7 +94,7 @@
 
     @ApiModelProperty(value = "澶勭悊鏃堕棿")
     @ExcelColumn(name="澶勭悊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date dealDate;
 
     @ApiModelProperty(value = "澶勭悊澶囨敞")
@@ -111,4 +112,51 @@
     @ApiModelProperty(value = "闄勪欢淇℃伅")
     @TableField(exist = false)
     private List<Multifile> fileList;
+
+    @ApiModelProperty(value = "澶勭悊浜哄悕绉�")
+    @TableField(exist = false)
+    private String dealUserName;
+
+    @ApiModelProperty(value = "澶勭悊浜虹粍缁囧悕绉�")
+    @TableField(exist = false)
+    private String dealUserCompanyName;
+
+    @ApiModelProperty(value = "澶勭悊寮�濮嬫椂闂� 鏌ヨ浣跨敤")
+    @TableField(exist = false)
+    private Date dealDateStart;
+
+    @ApiModelProperty(value = "澶勭悊缁撴潫鏃堕棿 鏌ヨ浣跨敤")
+    @TableField(exist = false)
+    private Date dealDateEnd;
+
+
+    @ApiModelProperty(value = "淇濅慨鍖哄煙绫诲瀷 0瀹ゅ唴缁翠慨 1鍏叡鍖哄煙", example = "1")
+    @TableField(exist = false)
+    private Integer workOrderAreaType;
+
+    @ApiModelProperty(value = "鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)", example = "1")
+    @TableField(exist = false)
+    private Integer workOrderRoomId;
+
+    @ApiModelProperty(value = "鎵�灞炴ゼ灞傜紪鐮侊紙鍏宠仈yw_floor)", example = "1")
+    @TableField(exist = false)
+    private Integer workOrderFloorId;
+
+    @ApiModelProperty(value = "宸ュ崟鍒嗙被缂栫爜(鍏宠仈category锛�", example = "1")
+    @TableField(exist = false)
+    private Integer workOrderCateId;
+
+    @ApiModelProperty(value = "涓婇棬鏃堕棿")
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date workOrderGetDate;
+
+    @ApiModelProperty(value = "鎯呭喌璇存槑")
+    @TableField(exist = false)
+    private String workOrderContent;
+
+    @ApiModelProperty(value = "杞伐鍗曢檮浠朵俊鎭�")
+    @TableField(exist = false)
+    private List<Multifile> workOrderFileList;
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwQuickModel.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwQuickModel.java
new file mode 100644
index 0000000..b0d7880
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwQuickModel.java
@@ -0,0 +1,71 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 宸ヤ綔鍙� - 蹇嵎妯″潡
+ * @author 姹熻箘韫�
+ * @date 2025/01/09 17:47
+ */
+@Data
+@ApiModel("宸ヤ綔鍙� - 蹇嵎妯″潡")
+@TableName("`yw_quick_model`")
+public class YwQuickModel extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭", example = "1")
+    @ExcelColumn(name="鐢ㄦ埛涓婚敭")
+    private Integer userId;
+
+    @ApiModelProperty(value = "妯″潡鍚嶇О")
+    @ExcelColumn(name="妯″潡鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "妯″潡鍦板潃")
+    @ExcelColumn(name="妯″潡鍦板潃")
+    private String path;
+
+    @ApiModelProperty(value = "鍥炬爣鍦板潃")
+    @ExcelColumn(name="鍥炬爣鍦板潃")
+    private String icoPath;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sort;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java
index 8b9b37c..06c1422 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java
@@ -73,6 +73,7 @@
 
     @ApiModelProperty(value = "鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)", example = "1")
     private Integer roomId;
+
     @ApiModelProperty(value = "鎵�灞炴ゼ灞傜紪鐮侊紙鍏宠仈yw_floor)", example = "1")
     private Integer floorId;
 
@@ -123,6 +124,10 @@
     @ApiModelProperty(value = "澶勭悊鏂瑰紡 0鎸囨淳鍚庡鐞� 1鐩存帴鍥炲", example = "1")
     private Integer dealType;
 
+
+    @ApiModelProperty(value = "鏉ユ簮 0鑷缓 1闂杞伐鍗�", example = "1")
+    private Integer origin;
+
     @ApiModelProperty(value = "椤圭洰鍚嶇О")
     @TableField(exist = false)
     private String projectName;
@@ -138,6 +143,9 @@
     @ApiModelProperty(value = "鎴挎簮鍚嶇О")
     @TableField(exist = false)
     private String roomName;
+    @ApiModelProperty(value = "闂涓婚敭")
+    @TableField(exist = false)
+    private String problemId;
     @ApiModelProperty(value = "鎶ヤ慨鍖哄煙")
     @ExcelColumn(name="鎶ヤ慨鍖哄煙",index = 2,width = 10)
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/MonthDataResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/MonthDataResponse.java
new file mode 100644
index 0000000..5d1ae87
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/MonthDataResponse.java
@@ -0,0 +1,27 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.dao.system.model.Notices;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/5/6 10:20
+ */
+@Data
+public class MonthDataResponse {
+
+    @ApiModelProperty(value = "鏃ユ湡")
+    private String monthDate;
+
+    @ApiModelProperty(value = "鍛ㄥ嚑")
+    private String weekMsg;
+
+    @ApiModelProperty(value = "閫氱煡鍒楄〃")
+    private List<Notices> noticeList;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwContractBillDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwContractBillDataVO.java
new file mode 100644
index 0000000..732fd26
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwContractBillDataVO.java
@@ -0,0 +1,34 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.dao.business.model.YwContractBill;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/1/8 15:32
+ */
+@Data
+public class YwContractBillDataVO {
+
+    @ApiModelProperty(value = "鏀舵璐﹀崟鏁�", example = "1")
+    private Integer inAmount;
+
+    @ApiModelProperty(value = "鏀舵璐﹀崟閲戦", example = "1")
+    private BigDecimal inFee;
+
+    @ApiModelProperty(value = "浠樻璐﹀崟鏁�", example = "1")
+    private Integer payAmount;
+
+    @ApiModelProperty(value = "浠樻璐﹀崟閲戦", example = "1")
+    private BigDecimal payFee;
+
+    @ApiModelProperty(value = "璐﹀崟鍒楄〃", example = "1")
+    private List<YwContractBill> ywContractBillList;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceCateDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceCateDataVO.java
new file mode 100644
index 0000000..2c91df5
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceCateDataVO.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/12/2 10:02
+ */
+@Data
+public class YwDeviceCateDataVO {
+
+    @ApiModelProperty(value = "鍒嗙被涓婚敭", example = "1")
+    private Integer cateId;
+
+    @ApiModelProperty(value = "鍒嗙被鍚嶇О", example = "1")
+    private String cateName;
+
+    @ApiModelProperty(value = "鐖剁骇鍒嗙被涓婚敭", example = "1")
+    private Integer cateParentId;
+
+    @ApiModelProperty(value = "鏁伴噺", example = "1")
+    private Integer deviceAmount ;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceParentCateDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceParentCateDataVO.java
new file mode 100644
index 0000000..44c68a9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceParentCateDataVO.java
@@ -0,0 +1,29 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/12/2 10:02
+ */
+@Data
+public class YwDeviceParentCateDataVO {
+
+    @ApiModelProperty(value = "鍒嗙被涓婚敭", example = "1")
+    private Integer cateId;
+
+    @ApiModelProperty(value = "鍒嗙被鍚嶇О", example = "1")
+    private String cateName;
+
+    @ApiModelProperty(value = "鏁伴噺", example = "1")
+    private Integer deviceAmount ;
+
+    @ApiModelProperty(value = "瀛愬垎绫绘暟鎹�", example = "1")
+    private List<YwDeviceCateDataVO> ywDeviceCateDataVOList;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceStatusDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceStatusDataVO.java
new file mode 100644
index 0000000..9ab7763
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwDeviceStatusDataVO.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/1/8 15:32
+ */
+@Data
+public class YwDeviceStatusDataVO {
+
+
+    @ApiModelProperty(value = "姝e父鏁伴噺", example = "1")
+    private Integer workAmount;
+
+    @ApiModelProperty(value = "寮傚父鏁伴噺", example = "1")
+    private Integer exceptionAmount;
+
+    @ApiModelProperty(value = "鎶ュ簾鏁伴噺", example = "1")
+    private Integer errAmount;
+
+    @ApiModelProperty(value = "绱鎬绘暟", example = "1")
+    private Integer amount;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwFloorStatusDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwFloorStatusDataVO.java
new file mode 100644
index 0000000..1108049
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwFloorStatusDataVO.java
@@ -0,0 +1,34 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/1/8 15:32
+ */
+@Data
+public class YwFloorStatusDataVO {
+
+    @ApiModelProperty(value = "妤煎眰涓婚敭", example = "1")
+    private Integer floorId;
+
+    @ApiModelProperty(value = "妤煎眰闈㈢Н", example = "1")
+    private BigDecimal floorArea;
+
+    @ApiModelProperty(value = "妤煎眰鍚嶇О", example = "1")
+    private String floorName;
+
+    @ApiModelProperty(value = "妤煎眰鏁�", example = "1")
+    private Integer floor;
+
+    @ApiModelProperty(value = "鎴块棿鐘舵�佹暟鎹�", example = "1")
+    private List<YwRoomStatusDataVO> ywRoomStatusDataVOList;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomContractDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomContractDataVO.java
new file mode 100644
index 0000000..46bf123
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomContractDataVO.java
@@ -0,0 +1,36 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/1/8 15:32
+ */
+@Data
+public class YwRoomContractDataVO {
+
+    @ApiModelProperty(value = "鍦ㄧ鍚堝悓鏁�", example = "1")
+    private Integer leaseContractAmount;
+
+    @ApiModelProperty(value = "鍦ㄧ鍚堟埧婧愭暟", example = "1")
+    private Integer leaseRoomAmount;
+
+    @ApiModelProperty(value = "鍙嫑鍟嗛潰绉�", example = "1")
+    private BigDecimal investmentArea;
+
+    @ApiModelProperty(value = "鍙嫑鍟嗘埧婧愭暟", example = "1")
+    private Integer investmentRoomAmount;
+
+    @ApiModelProperty(value = "鍦ㄧ瀹炴椂鍧囦环", example = "1")
+    private BigDecimal leasePrice;
+
+    @ApiModelProperty(value = "鍦ㄧ闈㈢Н", example = "1")
+    private BigDecimal leaseArea;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomStatusDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomStatusDataVO.java
new file mode 100644
index 0000000..5936073
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwRoomStatusDataVO.java
@@ -0,0 +1,43 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/1/8 15:32
+ */
+@Data
+public class YwRoomStatusDataVO {
+
+    @ApiModelProperty(value = "妤煎眰涓婚敭", example = "1")
+    private Integer floorId;
+
+    @ApiModelProperty(value = "鎴块棿涓婚敭", example = "1")
+    private Integer roomId;
+
+    @ApiModelProperty(value = "鎴块棿缂栧彿", example = "1")
+    private String roomCode;
+
+    @ApiModelProperty(value = "璁$闈㈢Н锛堝钩鏂圭背锛�", example = "1")
+    private BigDecimal roomRentArea;
+
+    @ApiModelProperty(value = "绉熷鍚嶇О", example = "1")
+    private String customerName;
+
+    @ApiModelProperty(value = "鎴块棿鐘舵�侊細0=寰呯锛�1=宸茬锛�2=鍗冲皢鍒版湡", example = "1")
+    private Integer roomStatus;
+
+    @ApiModelProperty(value = "鍒版湡鏃ユ湡", example = "1")
+    private Date overData;
+
+    @ApiModelProperty(value = "绌洪棽澶╂暟", example = "1")
+    private Integer freeDayAmount;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwWorkorderDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwWorkorderDataVO.java
new file mode 100644
index 0000000..85ecf03
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwWorkorderDataVO.java
@@ -0,0 +1,30 @@
+package com.doumee.dao.business.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/1/8 15:32
+ */
+@Data
+public class YwWorkorderDataVO {
+
+
+    @ApiModelProperty(value = "寰呮寚娲炬暟閲�", example = "1")
+    private Integer waitAssignAmount;
+
+    @ApiModelProperty(value = "寰呭鐞嗘暟閲�", example = "1")
+    private Integer waitDealAmount;
+
+    @ApiModelProperty(value = "鏈湀鎬绘暟", example = "1")
+    private Integer monthAmount;
+
+    @ApiModelProperty(value = "绱鎬绘暟", example = "1")
+    private Integer amount;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WorkbenchesService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WorkbenchesService.java
new file mode 100644
index 0000000..a269203
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WorkbenchesService.java
@@ -0,0 +1,22 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.dao.business.model.YwQuickModel;
+import com.doumee.dao.business.vo.MonthDataResponse;
+
+import java.util.List;
+
+/**
+ * 瀹℃壒淇℃伅璁板綍琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/12/28 14:09
+ */
+public interface WorkbenchesService {
+
+
+    List<YwQuickModel> getYwQuickList(LoginUserInfo loginUserInfo);
+
+    void updMyYwQuickModel(List<Integer> idList, LoginUserInfo loginUserInfo);
+
+    List<MonthDataResponse> getMonthNotices(String yearMonth, LoginUserInfo loginUserInfo);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java
index 3ef54c3..b3ad156 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java
@@ -4,6 +4,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwContractBill;
+import com.doumee.dao.business.vo.YwContractBillDataVO;
+
 import java.util.List;
 
 /**
@@ -104,4 +106,7 @@
     void dealDayBillCode();
 
     List<YwContractBill> getCanBackBill(YwContractBill model);
+
+
+    YwContractBillDataVO getWaitDealList(Integer contractId);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java
index 0b9b7c9..b32779c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwDeviceService.java
@@ -4,9 +4,12 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwDevice;
+import com.doumee.dao.business.vo.YwDeviceCateDataVO;
 import com.doumee.dao.business.vo.YwDeviceDataVO;
+import com.doumee.dao.business.vo.YwDeviceStatusDataVO;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 杩愮淮璁惧淇℃伅琛⊿ervice瀹氫箟
@@ -105,5 +108,7 @@
 
     YwDevice findByCode(String deviceCode);
 
+    Set<YwDeviceCateDataVO> getDeviceCateData(YwDevice model);
 
+    YwDeviceStatusDataVO getDeviceStatus(YwDevice model);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java
index a0f41d4..8b209b6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProblemService.java
@@ -3,6 +3,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwProblem;
+import com.doumee.service.business.impl.YwWorkorderServiceImpl;
+
 import java.util.List;
 
 /**
@@ -63,6 +65,9 @@
      */
     YwProblem findById(Integer id);
 
+    YwProblem getDetail(Integer id);
+
+
     /**
      * 鏉′欢鏌ヨ鍗曟潯璁板綍
      *
@@ -94,4 +99,7 @@
      * @return long
      */
     long count(YwProblem ywProblem);
+
+
+    void editProblem(YwProblem ywProblem, YwWorkorderServiceImpl ywWorkorderService);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwQuickModelService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwQuickModelService.java
new file mode 100644
index 0000000..4e2fbe0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwQuickModelService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.YwQuickModel;
+import java.util.List;
+
+/**
+ * 宸ヤ綔鍙� - 蹇嵎妯″潡Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/01/09 17:47
+ */
+public interface YwQuickModelService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param ywQuickModel 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(YwQuickModel ywQuickModel);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ywQuickModel 瀹炰綋瀵硅薄
+     */
+    void delete(YwQuickModel ywQuickModel);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ywQuickModel 瀹炰綋瀵硅薄
+     */
+    void updateById(YwQuickModel ywQuickModel);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ywQuickModels 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<YwQuickModel> ywQuickModels);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return YwQuickModel
+     */
+    YwQuickModel findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ywQuickModel 瀹炰綋瀵硅薄
+     * @return YwQuickModel
+     */
+    YwQuickModel findOne(YwQuickModel ywQuickModel);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ywQuickModel 瀹炰綋瀵硅薄
+     * @return List<YwQuickModel>
+     */
+    List<YwQuickModel> findList(YwQuickModel ywQuickModel);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<YwQuickModel>
+     */
+    PageData<YwQuickModel> findPage(PageWrap<YwQuickModel> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ywQuickModel 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(YwQuickModel ywQuickModel);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java
index 73454a9..1f24ecb 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwRoomService.java
@@ -4,6 +4,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwRoom;
+import com.doumee.dao.business.vo.YwFloorStatusDataVO;
+import com.doumee.dao.business.vo.YwRoomContractDataVO;
+
 import java.util.List;
 
 /**
@@ -95,4 +98,9 @@
      * @return long
      */
     long count(YwRoom ywRoom);
+
+    List<YwFloorStatusDataVO>  getRoomStatusList(YwRoom model);
+
+
+    YwRoomContractDataVO getRoomContract(YwRoom model);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java
index 6064bde..ed3bda6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwWorkorderService.java
@@ -3,7 +3,10 @@
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.dto.YwWorkorderDataDTO;
 import com.doumee.dao.business.model.YwWorkorder;
+import com.doumee.dao.business.vo.YwWorkorderDataVO;
+
 import java.util.List;
 
 /**
@@ -98,4 +101,6 @@
 
     void dispatchOrder(YwWorkorder ywWorkorder);
     void dealOrder(YwWorkorder ywWorkorder);
+
+    YwWorkorderDataVO getDataVO(YwWorkorderDataDTO dto);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WorkbenchesServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WorkbenchesServiceImpl.java
new file mode 100644
index 0000000..be82191
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WorkbenchesServiceImpl.java
@@ -0,0 +1,116 @@
+package com.doumee.service.business.impl;
+
+import com.alibaba.druid.sql.visitor.functions.Concat;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.LoginUserModel;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.ApproveParamMapper;
+import com.doumee.dao.business.PlatformLogMapper;
+import com.doumee.dao.business.YwQuickModelMapper;
+import com.doumee.dao.business.model.YwQuickModel;
+import com.doumee.dao.business.vo.MonthDataResponse;
+import com.doumee.service.business.WorkbenchesService;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
+import io.jsonwebtoken.lang.Objects;
+import io.swagger.models.auth.In;
+import org.apache.tomcat.util.bcel.classfile.Constant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 瀹℃壒妯$増閰嶇疆淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/12/28 11:46
+ */
+@Service
+public class WorkbenchesServiceImpl implements WorkbenchesService {
+
+
+    @Autowired
+    private YwQuickModelMapper ywQuickModelMapper;
+
+
+
+    @Override
+    public List<YwQuickModel> getYwQuickList(LoginUserInfo loginUserInfo){
+        List<YwQuickModel> ywQuickModelList = ywQuickModelMapper.selectList(new QueryWrapper<YwQuickModel>().lambda()
+                .eq(YwQuickModel::getIsdeleted, Constants.ZERO)
+                .eq(YwQuickModel::getUserId,loginUserInfo.getId())
+                .orderByAsc(YwQuickModel::getSort)
+        );
+        if(CollectionUtils.isEmpty(ywQuickModelList)){
+            ywQuickModelList = ywQuickModelMapper.selectList(new QueryWrapper<YwQuickModel>().lambda()
+                    .eq(YwQuickModel::getIsdeleted, Constants.ZERO)
+                    .isNull(YwQuickModel::getUserId)
+                    .orderByAsc(YwQuickModel::getSort)
+            );
+        }
+        return ywQuickModelList;
+    }
+
+
+    @Override
+    public void updMyYwQuickModel(List<Integer> idList, LoginUserInfo loginUserInfo){
+        List<YwQuickModel> ywQuickModelList = ywQuickModelMapper.selectList(new QueryWrapper<YwQuickModel>().lambda()
+                .eq(YwQuickModel::getIsdeleted, Constants.ZERO)
+                .isNull(YwQuickModel::getUserId)
+                .orderByAsc(YwQuickModel::getSort)
+        );
+        if(CollectionUtils.isEmpty(ywQuickModelList) || Constants.equalsInteger(idList.size(),ywQuickModelList.size())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"蹇嵎妯″潡閰嶇疆寮傚父,璇疯仈绯荤鐞嗗憳");
+        }
+        ywQuickModelMapper.delete(new QueryWrapper<YwQuickModel>().lambda().eq(YwQuickModel::getUserId,loginUserInfo.getId()));
+        List<YwQuickModel> newList = new ArrayList<>();
+        for (int i = 0; i < idList.size(); i++) {
+            Integer id = idList.get(i);
+            List<YwQuickModel> ywQuickModels = ywQuickModelList.stream().filter(j->Constants.equalsInteger(j.getId(),id)).collect(Collectors.toList());
+            if(CollectionUtils.isEmpty(ywQuickModels)){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"蹇嵎妯″潡閰嶇疆寮傚父,璇疯仈绯荤鐞嗗憳");
+            }
+            YwQuickModel ywQuickModel = ywQuickModels.get(Constants.ZERO);
+            ywQuickModel.setId(null);
+            ywQuickModel.setCreator(loginUserInfo.getId());
+            ywQuickModel.setCreateDate(new Date());
+            ywQuickModel.setSort(i+1);
+            ywQuickModel.setUserId(loginUserInfo.getId());
+            newList.add(ywQuickModel);
+        }
+        ywQuickModelMapper.insert(newList);
+    }
+
+
+    @Override
+    public List<MonthDataResponse> getMonthNotices(String yearMonth, LoginUserInfo loginUserInfo){
+        List<String> dataList = DateUtil.getDayByMonth(yearMonth);
+        List<MonthDataResponse> monthDataResponseList = new ArrayList<>();
+        for (String str:dataList) {
+            MonthDataResponse  monthDataResponse = new MonthDataResponse();
+            monthDataResponse.setWeekMsg(DateUtil.getWeek(DateUtil.StringToDate(str,"yyyy-MM-dd")).getChineseName());
+            monthDataResponse.setMonthDate(str);
+
+            monthDataResponseList.add(monthDataResponse);
+        }
+        return monthDataResponseList;
+
+    }
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
index ac034cb..713148c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
@@ -111,11 +111,12 @@
 
     @Override
     public YwBuilding findById(Integer id) {
-
-
         MPJLambdaWrapper<YwBuilding> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.selectAll(YwBuilding.class )
                 .selectAs(YwProject::getName,YwBuilding::getProjectName)
+                .select(" (select ifnull(sum(y.FEE_AREA),0) from yw_room y where y.ISDELETED = 0 and y.status = 0 and y.IS_INVESTMENT = 1 and y.BUILDING_ID = t.id ) ",YwBuilding::getRoomFeeArea)
+                .select(" (select ifnull(sum(y.RENT_AREA),0) from yw_room y where y.ISDELETED = 0 and y.status = 0 and y.IS_INVESTMENT = 1 and y.BUILDING_ID = t.id ) ",YwBuilding::getRoomRentArea)
+                .select("",YwBuilding::getRoomFeeArea)
                 .leftJoin(YwProject.class,YwProject::getId,YwBuilding::getProjectId)
                 .eq(YwBuilding::getId,id)
                 .last(" limit 1 ")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
index 5bc2097..a320b59 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -10,6 +10,7 @@
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.*;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.business.vo.YwContractBillDataVO;
 import com.doumee.dao.system.MultifileMapper;
 import com.doumee.dao.system.model.Multifile;
 import com.doumee.dao.system.model.SystemUser;
@@ -20,6 +21,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -282,7 +284,6 @@
         YwContractBill model = pageWrap.getModel();
         IPage<YwContractBill> iPage = ywContractBillMapper.selectJoinPage(page,YwContractBill.class,
             queryWrapper.selectAll(YwContractBill.class)
-//                    .select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                     .select(" ( select ifnull( sum( CASE WHEN t.bill_type = 0 and yw.REVENUE_TYPE = 0 THEN yw.ACT_RECEIVABLE_FEE when  t.bill_type = 0 and yw.REVENUE_TYPE = 1 then -yw.ACT_RECEIVABLE_FEE  when t.bill_type = 1 and yw.REVENUE_TYPE = 0 then -yw.ACT_RECEIVABLE_FEE else  yw.ACT_RECEIVABLE_FEE END),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                     .selectAs(YwContract::getCode,YwContractBill::getContractCode)
                     .selectAs(YwCustomer::getName,YwContractBill::getCustomerName)
@@ -486,4 +487,59 @@
         return list;
     }
 
+
+    @Override
+    public YwContractBillDataVO getWaitDealList(Integer contractId){
+        YwContractBillDataVO ywContractBillDataVO = new YwContractBillDataVO();
+        ywContractBillDataVO.setInAmount(Constants.ZERO);
+        ywContractBillDataVO.setInFee(BigDecimal.ZERO);
+        ywContractBillDataVO.setPayAmount(Constants.ZERO);
+        ywContractBillDataVO.setPayFee(BigDecimal.ZERO);
+        MPJLambdaWrapper<YwContractBill> queryWrapper = new MPJLambdaWrapper<YwContractBill>();
+        queryWrapper.selectAll(YwContractBill.class)
+            .select(" ( select ifnull( sum( CASE WHEN t.bill_type = 0 and yw.REVENUE_TYPE = 0 THEN yw.ACT_RECEIVABLE_FEE when  t.bill_type = 0 and yw.REVENUE_TYPE = 1 then -yw.ACT_RECEIVABLE_FEE  when t.bill_type = 1 and yw.REVENUE_TYPE = 0 then -yw.ACT_RECEIVABLE_FEE else  yw.ACT_RECEIVABLE_FEE END),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
+            .selectAs(YwContract::getCode,YwContractBill::getContractCode)
+            .selectAs(YwCustomer::getName,YwContractBill::getCustomerName)
+            .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
+            .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
+            .eq(YwContractBill::getIsdeleted,Constants.ZERO)
+            .in(YwContractBill::getPayStatus,Constants.ZERO,Constants.TWO,Constants.THREE,Constants.FOUR)
+            .eq(YwContractBill::getContractId,contractId)
+            .orderByDesc(YwContractBill::getId);
+        List<YwContractBill> list = ywContractBillMapper.selectJoinList(YwContractBill.class,queryWrapper);
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            for (YwContractBill ywContractBill:list) {
+                //闇�鏀堕噾棰�
+                ywContractBill.setNeedReceivableFee(
+                        ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee())
+                );
+                //鏀舵璐﹀崟
+                if(Constants.equalsInteger(ywContractBill.getBillType(),Constants.ZERO)){
+                    //搴旀敹閲戦 灏忎簬 瀹炴敹閲戦 澶氭敹閲戦  搴旇鏄��娆�
+                     if(ywContractBill.getNeedReceivableFee().compareTo(BigDecimal.ZERO)<Constants.ZERO){
+                         ywContractBillDataVO.setPayAmount(ywContractBillDataVO.getPayAmount()+1);
+                         ywContractBillDataVO.setPayFee(ywContractBillDataVO.getPayFee().add(ywContractBill.getNeedReceivableFee().abs()));
+                     }else if(ywContractBill.getNeedReceivableFee().compareTo(BigDecimal.ZERO)>Constants.ZERO){
+                         ywContractBillDataVO.setInAmount(ywContractBillDataVO.getInAmount()+1);
+                         ywContractBillDataVO.setInFee(ywContractBillDataVO.getInFee().add(ywContractBill.getNeedReceivableFee().abs()));
+                     }
+                }else{
+                    //浠樻璐﹀崟
+                    //搴斾粯閲戦 灏忎簬 瀹炰粯閲戦 搴旇鏄粯娆炬
+                    if(ywContractBill.getNeedReceivableFee().compareTo(BigDecimal.ZERO)<Constants.ZERO){
+                        ywContractBillDataVO.setPayAmount(ywContractBillDataVO.getPayAmount()+1);
+                        ywContractBillDataVO.setPayFee(ywContractBillDataVO.getPayFee().add(ywContractBill.getNeedReceivableFee().abs()));
+                    }else{
+                        ywContractBillDataVO.setInAmount(ywContractBillDataVO.getInAmount()+1);
+                        ywContractBillDataVO.setInFee(ywContractBillDataVO.getInFee().add(ywContractBill.getNeedReceivableFee().abs()));
+                    }
+                }
+            }
+            ywContractBillDataVO.setYwContractBillList(list);
+        }
+
+        return ywContractBillDataVO;
+    }
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
index 9e3df6e..ad8f044 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -1525,10 +1525,6 @@
             queryWrapper.le(YwContract::getWyFreeEndDate, Utils.Date.getEnd(pageWrap.getModel().getWyFreeEndDate()));
         }
 
-
-
-
-
         if (pageWrap.getModel().getZlTotalFee() != null) {
             queryWrapper.eq(YwContract::getZlTotalFee, pageWrap.getModel().getZlTotalFee());
         }
@@ -1538,6 +1534,9 @@
         if (pageWrap.getModel().getCompanyName() != null) {
             queryWrapper.like(Company::getName, pageWrap.getModel().getCompanyName());
         }
+        if (pageWrap.getModel().getRoomId() != null) {
+            queryWrapper.apply(" t.id in ( select ycr.CONTRACT_ID from yw_contract_room ycr where ycr.type = 0 and  ycr.ROOM_ID = "+pageWrap.getModel().getRoomId()+" )  ");
+        }
         queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getQueryStartTime()), YwContract::getStartDate, pageWrap.getModel().getQueryStartTime())
                         .le(Objects.nonNull(pageWrap.getModel().getQueryEndTime()), YwContract::getEndDate, pageWrap.getModel().getQueryEndTime());
         queryWrapper.orderByDesc(YwContract::getCreateDate );
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
index 36f4e94..ea6e35d 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
@@ -178,6 +178,7 @@
                         .and(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getDeviceName()),i->i.like(YwDevice::getName,model.getDeviceName()).or().like(YwDevice::getCode,model.getDeviceName()))
                         .ge(Objects.nonNull(model.getStartDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()))
                         .le(Objects.nonNull(model.getEndDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()))
+                        .eq(Objects.nonNull(model.getDeviceId()),YwDeviceRecord::getDeviceId,model.getDeviceId())
                         .eq(YwDeviceRecord::getIsdeleted,Constants.ZERO)
                         .orderByDesc(YwDeviceRecord::getCreateDate)
         );
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
index e96dd30..5aa6aef 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java
@@ -15,7 +15,10 @@
 import com.doumee.dao.business.model.Company;
 import com.doumee.dao.business.model.YwDevice;
 import com.doumee.dao.business.model.YwDeviceRecord;
+import com.doumee.dao.business.vo.YwDeviceCateDataVO;
 import com.doumee.dao.business.vo.YwDeviceDataVO;
+import com.doumee.dao.business.vo.YwDeviceParentCateDataVO;
+import com.doumee.dao.business.vo.YwDeviceStatusDataVO;
 import com.doumee.dao.system.MultifileMapper;
 import com.doumee.dao.system.model.Multifile;
 import com.doumee.dao.system.model.SystemUser;
@@ -33,9 +36,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -66,6 +67,10 @@
             || StringUtils.isBlank(ywDevice.getName())
             || StringUtils.isBlank(ywDevice.getCode())
             || Objects.isNull(ywDevice.getStatus())
+            || Objects.isNull(ywDevice.getProjectId())
+            || Objects.isNull(ywDevice.getFloorId())
+            || Objects.isNull(ywDevice.getBuildingId())
+            || Objects.isNull(ywDevice.getRoomId())
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
@@ -87,6 +92,28 @@
             multifile.setObjId(ywDevice.getId());
             multifile.setFileurl(ywDevice.getFileUrl());
             multifileMapper.insert(multifile);
+        }
+
+        List<Multifile> fileList = new ArrayList<>();
+        if(ywDevice.getMultifileList()!=null && ywDevice.getMultifileList().size()>0){
+            for (int i = 0; i <  ywDevice.getMultifileList().size(); i++) {
+                Multifile multifile =  ywDevice.getMultifileList().get(i);
+                if(StringUtils.isBlank(multifile.getFileurl())){
+                    continue;
+                }
+                multifile.setCreateDate(ywDevice.getCreateDate());
+                multifile.setEditDate(ywDevice.getCreateDate());
+                multifile.setCreator(ywDevice.getEditor());
+                multifile.setIsdeleted(Constants.ZERO);
+                multifile.setObjId(ywDevice.getId());
+                multifile.setEditor(ywDevice.getCreator());
+                multifile.setObjType(Constants.MultiFile.FN_DEVICE_MAINTENANCE_FILE.getKey());
+                multifile.setSortnum(i+1);
+                fileList.add(multifile);
+            }
+        }
+        if(fileList.size()>0){
+            multifileMapper.insert(fileList);
         }
 
         return ywDevice.getId();
@@ -126,6 +153,10 @@
                 || StringUtils.isBlank(ywDevice.getName())
                 || StringUtils.isBlank(ywDevice.getCode())
                 || Objects.isNull(ywDevice.getStatus())
+                || Objects.isNull(ywDevice.getProjectId())
+                || Objects.isNull(ywDevice.getFloorId())
+                || Objects.isNull(ywDevice.getBuildingId())
+                || Objects.isNull(ywDevice.getRoomId())
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
@@ -140,7 +171,7 @@
         ywDeviceMapper.updateById(ywDevice);
         multifileMapper.delete(new QueryWrapper<Multifile>().lambda()
                 .eq(Multifile::getObjId,ywDevice.getId())
-                .eq(Multifile::getObjType,Constants.MultiFile.FN_DEVICE_FILE.getKey())
+                .in(Multifile::getObjType,Constants.MultiFile.FN_DEVICE_FILE.getKey(),Constants.MultiFile.FN_DEVICE_MAINTENANCE_FILE.getKey())
         );
         if(Objects.nonNull(ywDevice.getFileUrl())){
             Multifile multifile = new Multifile();
@@ -151,6 +182,28 @@
             multifile.setObjId(ywDevice.getId());
             multifile.setFileurl(ywDevice.getFileUrl());
             multifileMapper.insert(multifile);
+        }
+
+        List<Multifile> fileList = new ArrayList<>();
+        if(ywDevice.getMultifileList()!=null && ywDevice.getMultifileList().size()>0){
+            for (int i = 0; i <  ywDevice.getMultifileList().size(); i++) {
+                Multifile multifile =  ywDevice.getMultifileList().get(i);
+                if(StringUtils.isBlank(multifile.getFileurl())){
+                    continue;
+                }
+                multifile.setCreateDate(ywDevice.getCreateDate());
+                multifile.setEditDate(ywDevice.getCreateDate());
+                multifile.setCreator(ywDevice.getEditor());
+                multifile.setIsdeleted(Constants.ZERO);
+                multifile.setObjId(ywDevice.getId());
+                multifile.setEditor(ywDevice.getCreator());
+                multifile.setObjType(Constants.MultiFile.FN_DEVICE_MAINTENANCE_FILE.getKey());
+                multifile.setSortnum(i+1);
+                fileList.add(multifile);
+            }
+        }
+        if(fileList.size()>0){
+            multifileMapper.insert(fileList);
         }
 
 
@@ -181,6 +234,26 @@
                     +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_DEVICE).getCode();
             ywDevice.setFileFullUrl(path + multifile.getFileurl());
         }
+
+        //闄勪欢鏁版嵁
+        List<Multifile> multifileList = multifileMapper.selectJoinList(Multifile.class,new MPJLambdaWrapper<Multifile>()
+                .selectAll(Multifile.class)
+                .selectAs(SystemUser::getRealname,Multifile::getUserName)
+                .leftJoin(SystemUser.class,SystemUser::getId,Multifile::getCreator)
+                .eq(Multifile::getObjId,ywDevice.getId())
+                .eq(Multifile::getIsdeleted,Constants.ZERO)
+                .eq(Multifile::getObjType,Constants.MultiFile.FN_DEVICE_MAINTENANCE_FILE.getKey()));
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
+            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_PATROL).getCode();
+            for (Multifile m:multifileList) {
+                if(StringUtils.isNotBlank(m.getFileurl())){
+                    m.setFileurlFull(path + m.getFileurl());
+                }
+            }
+            ywDevice.setMultifileList(multifileList);
+        }
+
         return ywDevice;
     }
 
@@ -228,12 +301,18 @@
         Utils.MP.blankToNull(pageWrap.getModel());
         YwDevice model = pageWrap.getModel();
         queryWrapper.selectAll(YwDevice.class)
-                .selectAs(Category::getName,YwDevice::getCategoryName)
+                .select("c.name",YwDevice::getCategoryName)
+                .select("c1.name",YwDevice::getCategoryParentName)
                 .selectAs(SystemUser::getRealname,YwDevice::getRealName)
-                .leftJoin(Category.class,Category::getId,YwDevice::getCateId)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwDevice::getUserId)
+                .leftJoin("category c on t.CATE_ID = c.id")
+                .leftJoin("category c1 on c.PARENT_ID = c1.id")
                 .and(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getName()),i->i.like(YwDevice::getName,model.getName()).or().like(YwDevice::getCode,model.getName()))
                 .eq(Objects.nonNull(model.getStatus()),YwDevice::getStatus,model.getStatus())
+                .eq(Objects.nonNull(model.getRoomId()),YwDevice::getRoomId,model.getRoomId())
+                .eq(Objects.nonNull(model.getFloorId()),YwDevice::getFloorId,model.getFloorId())
+                .eq(Objects.nonNull(model.getProjectId()),YwDevice::getProjectId,model.getProjectId())
+                .eq(Objects.nonNull(model.getBuildingId()),YwDevice::getBuildingId,model.getBuildingId())
                 .eq(YwDevice::getIsdeleted,Constants.ZERO)
                 .orderByDesc(YwDevice::getCreateDate)
         ;
@@ -263,6 +342,80 @@
         return ywDeviceDataVO;
     }
 
+    @Override
+    public Set<YwDeviceCateDataVO> getDeviceCateData(YwDevice model){
+        MPJLambdaWrapper<YwDevice> queryWrapper = new MPJLambdaWrapper<YwDevice>();
+        queryWrapper.selectAll(YwDevice.class)
+                .select("c.name",YwDevice::getCategoryName)
+                .select("c1.name",YwDevice::getCategoryParentName)
+                .select("c1.id",YwDevice::getCateParentId)
+                .selectAs(SystemUser::getRealname,YwDevice::getRealName)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwDevice::getUserId)
+                .leftJoin("category c on t.CATE_ID = c.id")
+                .leftJoin("category c1 on c.PARENT_ID = c1.id")
+                .eq(Objects.nonNull(model.getRoomId()),YwDevice::getRoomId,model.getRoomId())
+                .eq(Objects.nonNull(model.getFloorId()),YwDevice::getFloorId,model.getFloorId())
+                .eq(Objects.nonNull(model.getProjectId()),YwDevice::getProjectId,model.getProjectId())
+                .eq(Objects.nonNull(model.getBuildingId()),YwDevice::getBuildingId,model.getBuildingId())
+                .eq(YwDevice::getIsdeleted,Constants.ZERO)
+                .isNotNull(YwDevice::getCateId)
+                .orderByDesc(YwDevice::getCreateDate)
+        ;
+        List<YwDevice> ywDeviceList = ywDeviceMapper.selectJoinList(YwDevice.class,queryWrapper);
+        Set<YwDeviceCateDataVO> ywDeviceCateDataVOSet = new HashSet<>();
+        Set<YwDeviceParentCateDataVO> ywDeviceParentCateDataVOSet = new HashSet<>();
+        for (YwDevice y: ywDeviceList) {
+            YwDeviceCateDataVO ywDeviceCateDataVO = new YwDeviceCateDataVO();
+            ywDeviceCateDataVO.setCateId(y.getCateId());
+            ywDeviceCateDataVO.setCateName(y.getCategoryName());
+            ywDeviceCateDataVO.setCateParentId(y.getCateParentId());
+            ywDeviceCateDataVOSet.add(ywDeviceCateDataVO);
+            YwDeviceParentCateDataVO ywDeviceParentCateDataVO = new YwDeviceParentCateDataVO();
+            ywDeviceParentCateDataVO.setCateId(y.getCateParentId());
+            ywDeviceParentCateDataVO.setCateName(y.getCategoryParentName());
+            ywDeviceParentCateDataVOSet.add(ywDeviceParentCateDataVO);
+        }
+
+        for (YwDeviceCateDataVO ywDeviceCateDataVO:ywDeviceCateDataVOSet) {
+            ywDeviceCateDataVO.setDeviceAmount(
+                    ywDeviceList.stream().filter(i->Objects.nonNull(i.getCateId()) && Constants.equalsInteger(i.getCateId(),ywDeviceCateDataVO.getCateId())).collect(Collectors.toList()).size()
+            );
+        }
+
+        for (YwDeviceParentCateDataVO ywDeviceParentCateDataVO:ywDeviceParentCateDataVOSet) {
+            ywDeviceParentCateDataVO.setDeviceAmount(
+                    ywDeviceList.stream().filter(i->Objects.nonNull(i.getCateParentId()) && Constants.equalsInteger(i.getCateParentId(),ywDeviceParentCateDataVO.getCateId())).collect(Collectors.toList()).size()
+            );
+            ywDeviceParentCateDataVO.setYwDeviceCateDataVOList(
+                    ywDeviceCateDataVOSet.stream().filter(i->Constants.equalsInteger(i.getCateParentId(),ywDeviceParentCateDataVO.getCateId())).collect(Collectors.toList())
+            );
+        }
+        return ywDeviceCateDataVOSet;
+    }
+
+
+    @Override
+    public YwDeviceStatusDataVO getDeviceStatus(YwDevice model){
+        YwDeviceStatusDataVO ywDeviceStatusDataVO = new YwDeviceStatusDataVO();
+        MPJLambdaWrapper<YwDevice> queryWrapper = new MPJLambdaWrapper<YwDevice>();
+        queryWrapper.selectAll(YwDevice.class)
+                .eq(Objects.nonNull(model.getRoomId()),YwDevice::getRoomId,model.getRoomId())
+                .eq(Objects.nonNull(model.getFloorId()),YwDevice::getFloorId,model.getFloorId())
+                .eq(Objects.nonNull(model.getProjectId()),YwDevice::getProjectId,model.getProjectId())
+                .eq(Objects.nonNull(model.getBuildingId()),YwDevice::getBuildingId,model.getBuildingId())
+                .eq(YwDevice::getIsdeleted,Constants.ZERO)
+        ;
+        List<YwDevice> ywDeviceList = ywDeviceMapper.selectJoinList(YwDevice.class,queryWrapper);
+        ywDeviceStatusDataVO.setAmount(ywDeviceList.size());
+        ywDeviceStatusDataVO.setWorkAmount(ywDeviceList.stream().filter(i->Objects.nonNull(i.getStatus())&&Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
+        ywDeviceStatusDataVO.setExceptionAmount(ywDeviceList.stream().filter(i->Objects.nonNull(i.getStatus())&&Constants.equalsInteger(i.getStatus(),Constants.ONE)).collect(Collectors.toList()).size());
+        ywDeviceStatusDataVO.setErrAmount(ywDeviceList.stream().filter(i->Objects.nonNull(i.getStatus())&&Constants.equalsInteger(i.getStatus(),Constants.THREE)).collect(Collectors.toList()).size());
+        return ywDeviceStatusDataVO;
+
+    }
+
+
+
 
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java
index 90dde7f..22b0839 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java
@@ -221,6 +221,8 @@
                 .like(StringUtils.isNotBlank(model.getAttr()),YwMaterial::getAttr,model.getAttr())
                 .eq(Objects.nonNull(model.getProjectId()),YwRoom::getProjectId,model.getProjectId())
                 .eq(Objects.nonNull(model.getRoomId()),YwMaterial::getRoomId,model.getRoomId())
+                .eq(Objects.nonNull(model.getFloorId()),YwRoom::getFloor,model.getFloorId())
+                .eq(Objects.nonNull(model.getBuildingId()),YwRoom::getBuildingId,model.getBuildingId())
                 .eq(YwMaterial::getIsdeleted,Constants.ZERO)
                 .orderByAsc(YwMaterial::getCode)
         ;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
index 375b2f6..96a4593 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
@@ -15,6 +15,7 @@
 import com.doumee.dao.business.YwPatrolTaskMapper;
 import com.doumee.dao.business.YwPatrolTaskRecordMapper;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.SystemUserMapper;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.YwPatrolSchemeService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -48,6 +49,8 @@
     private YwLinePointMapper ywLinePointMapper;
     @Autowired
     private YwPatrolTaskRecordMapper ywPatrolTaskRecordMapper;
+    @Autowired
+    private SystemUserMapper systemUserMapper;
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
@@ -315,8 +318,8 @@
         YwPatrolScheme model = pageWrap.getModel();
         queryWrapper.selectAll(YwPatrolScheme.class)
                 .select(" t2.realName as createUserName ")
-                .select(" t1.realName as userName ")
-                .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolScheme::getUserIds)
+//                .select(" t1.realName as userName ")
+//                .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolScheme::getUserIds)
                 .leftJoin(" system_user t2 on t.creator =  t2.id  ")
                 .eq(YwPatrolScheme::getIsdeleted,Constants.ZERO)
                 .like(StringUtils.isNotBlank(model.getTitle()),YwPatrolScheme::getTitle,model.getTitle())
@@ -333,10 +336,24 @@
         IPage<YwPatrolScheme> iPage = ywPatrolSchemeMapper.selectJoinPage(page,YwPatrolScheme.class,queryWrapper);
         for (YwPatrolScheme ywPatrolScheme:iPage.getRecords()) {
             this.getSchemeStatus(ywPatrolScheme);
+            //宸℃浜哄憳
+            this.getUserNames(ywPatrolScheme);
         }
         return PageData.from(iPage);
     }
 
+
+    public void getUserNames(YwPatrolScheme ywPatrolScheme){
+        if(Objects.nonNull(ywPatrolScheme)&&StringUtils.isNotBlank(ywPatrolScheme.getUserIds())){
+            List<SystemUser>  systemUserList = systemUserMapper.selectList(new QueryWrapper<SystemUser>().lambda()
+                    .apply(" find_in_set(id,'"+ywPatrolScheme.getUserIds()+"') ")
+            );
+            String userName = String.join(",",systemUserList.stream().map(i->i.getRealname()).collect(Collectors.toList()));
+            ywPatrolScheme.setUserName(userName);
+        }
+    }
+
+
     //鑾峰彇鐘舵��
     public void getSchemeStatus(YwPatrolScheme ywPatrolScheme){
         List<YwPatrolTask> ywPatrolTaskList = ywPatrolTaskMapper.selectList(new QueryWrapper<YwPatrolTask>().lambda()
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java
index d025f21..4253d90 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java
@@ -127,13 +127,22 @@
                 .selectAs(YwPatrolPoint::getName,YwPatrolTaskRecord::getPointName)
                 .selectAs(YwPatrolPoint::getContent,YwPatrolTaskRecord::getContent)
                 .selectAs(SystemUser::getRealname,YwPatrolTaskRecord::getRealname)
+
+                .selectAs(YwPatrolScheme::getTitle,YwPatrolTaskRecord::getSchemeTitle)
+                .selectAs(YwPatrolTask::getTitle,YwPatrolTaskRecord::getTaskCode)
+                .selectAs(YwPatrolTask::getStartDate,YwPatrolTaskRecord::getStartDate)
+                .selectAs(YwPatrolTask::getEndDate,YwPatrolTaskRecord::getEndDate)
+
                 .leftJoin(YwPatrolPoint.class,YwPatrolPoint::getId,YwPatrolTaskRecord::getPointId)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolTaskRecord::getDealUserId)
+                .leftJoin(YwPatrolTask.class,YwPatrolTask::getId,YwPatrolTaskRecord::getTaskId)
+                .leftJoin(YwPatrolScheme.class,YwPatrolScheme::getId,YwPatrolTask::getSchemeId)
                 .eq(YwPatrolScheme::getIsdeleted, Constants.ZERO)
                 .eq(Objects.nonNull(model) && Objects.nonNull(model.getTaskId()),YwPatrolTaskRecord::getTaskId, model.getTaskId())
                 .eq(Objects.nonNull(model) && Objects.nonNull(model.getDealUserId()),YwPatrolTaskRecord::getDealUserId, model.getDealUserId())
                 .like(StringUtils.isNotBlank(model.getPointName()),YwPatrolPoint::getName,model.getPointName())
                 .eq(Objects.nonNull(model) && Objects.nonNull(model.getStatus()) , YwPatrolTaskRecord::getStatus,model.getStatus())
+                .eq(Objects.nonNull(model) && Objects.nonNull(model.getDeviceId()) , YwPatrolPoint::getDeviceId,model.getDeviceId())
                 .orderByDesc(YwPatrolScheme::getCreateDate)
         ;
         IPage<YwPatrolTaskRecord> iPage = ywPatrolTaskRecordMapper.selectJoinPage(page,YwPatrolTaskRecord.class,queryWrapper); 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java
index 5ee8050..67906be 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProblemServiceImpl.java
@@ -1,29 +1,33 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.YwProblemMapper;
-import com.doumee.dao.business.model.YwProblem;
+import com.doumee.dao.business.YwRoomMapper;
+import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.MultifileMapper;
 import com.doumee.dao.system.model.Multifile;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.YwProblemService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 杩愮淮闂涓婃姤淇℃伅琛⊿ervice瀹炵幇
@@ -37,9 +41,16 @@
     private YwProblemMapper ywProblemMapper;
 
     @Autowired
+    private YwRoomMapper ywRoomMapper;
+
+    @Autowired
     private MultifileMapper multifileMapper;
 
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
     @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public Integer create(YwProblem ywProblem) {
         if(Objects.isNull(ywProblem)
             || Objects.isNull(ywProblem.getSubmitDate())
@@ -116,6 +127,110 @@
         return ywProblemMapper.selectById(id);
     }
 
+
+
+    @Override
+    public YwProblem getDetail(Integer id) {
+        MPJLambdaWrapper<YwProblem> queryWrapper = new MPJLambdaWrapper<YwProblem>();
+        queryWrapper.selectAll(YwProblem.class)
+                .selectAs(SystemUser::getRealname,YwProblem::getDealUserName)
+                .selectAs(Company::getName,YwProblem::getDealUserCompanyName)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwProblem::getDealUserId)
+                .leftJoin(Company.class,Company::getId,SystemUser::getCompanyId)
+                .eq(YwProblem::getId,id)
+        ;
+        YwProblem ywProblem = ywProblemMapper.selectJoinOne(YwProblem.class,queryWrapper);
+        if(Objects.isNull(ywProblem)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        List<Multifile> multifiles = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
+                .eq(Multifile::getObjId, ywProblem.getId() )
+                .in(Multifile::getObjType, Arrays.asList(new Integer[]{Constants.MultiFile.PROBLEM_FILE.getKey() }))
+                .eq(Multifile::getIsdeleted,Constants.ZERO));
+        if(multifiles!=null){
+            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_PROBLEM).getCode();
+            for(Multifile f : multifiles){
+                if(StringUtils.isBlank(f.getFileurl())){
+                    continue;
+                }
+                f.setFileurlFull(path+f.getFileurl());
+            }
+            ywProblem.setFileList(multifiles);
+        }
+        return ywProblem;
+    }
+
+
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void editProblem(YwProblem ywProblem,YwWorkorderServiceImpl ywWorkorderService){
+        if(Objects.isNull(ywProblem)
+            || Objects.isNull(ywProblem.getId())
+            || Objects.isNull(ywProblem.getDealStatus())
+            || !(Constants.equalsInteger(ywProblem.getDealStatus(),Constants.ONE)||Constants.equalsInteger(ywProblem.getDealStatus(),Constants.TWO))
+            || (Constants.equalsInteger(ywProblem.getDealStatus(),Constants.TWO)&&StringUtils.isBlank(ywProblem.getDealInfo()))
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = ywProblem.getLoginUserInfo();
+        //鍏抽棴闂
+        if(Constants.equalsInteger(ywProblem.getDealStatus(),Constants.TWO)){
+            ywProblemMapper.update(new UpdateWrapper<YwProblem>().lambda()
+                    .set(YwProblem::getDealDate, DateUtil.getCurrDateTime())
+                    .set(YwProblem::getDealInfo,ywProblem.getDealInfo())
+                    .set(YwProblem::getDealType,Constants.ONE)
+                    .set(YwProblem::getDealStatus,ywProblem.getDealStatus())
+                    .set(YwProblem::getDealUserId,loginUserInfo.getId())
+                    .set(YwProblem::getEditor,loginUserInfo.getId())
+                    .set(YwProblem::getEditDate, DateUtil.getCurrDateTime())
+                    .eq(YwProblem::getId,ywProblem.getId())
+            );
+        }else{
+            if(Objects.isNull(ywProblem.getWorkOrderAreaType())
+                    ||Objects.isNull(ywProblem.getWorkOrderCateId())
+                    ||StringUtils.isBlank(ywProblem.getWorkOrderContent())
+            ){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            YwWorkorder ywWorkorder = new YwWorkorder();
+            ywWorkorder.setAreaType(ywProblem.getWorkOrderAreaType());
+            ywWorkorder.setCateId(ywProblem.getWorkOrderCateId());
+            ywWorkorder.setContent(ywProblem.getWorkOrderContent());
+            ywWorkorder.setRoomId(ywProblem.getWorkOrderRoomId());
+            ywWorkorder.setFloorId(ywProblem.getWorkOrderFloorId());
+            ywWorkorder.setGetDate(ywProblem.getWorkOrderGetDate());
+            ywWorkorder.setOrigin(Constants.ONE);
+            ywWorkorder.setLoginUserInfo(loginUserInfo);
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywProblem.getWorkOrderFileList())){
+                ywWorkorder.setFileList(ywProblem.getWorkOrderFileList());
+            }
+            Integer workOrderId = ywWorkorderService.create(ywWorkorder);
+            ywProblemMapper.update(new UpdateWrapper<YwProblem>().lambda()
+                    .set(YwProblem::getDealDate, DateUtil.getCurrDateTime())
+                    .set(YwProblem::getDealInfo,ywProblem.getDealInfo())
+                    .set(YwProblem::getDealType,Constants.ZERO)
+                    .set(YwProblem::getDealStatus,ywProblem.getDealStatus())
+                    .set(YwProblem::getDealUserId,loginUserInfo.getId())
+                    .set(YwProblem::getEditor,loginUserInfo.getId())
+                    .set(YwProblem::getEditDate, DateUtil.getCurrDateTime())
+                    .set(YwProblem::getWorkorderId,workOrderId)
+                    .eq(YwProblem::getId,ywProblem.getId())
+            );
+
+        }
+
+    }
+
+
+
+
+
+
+
+
+
     @Override
     public YwProblem findOne(YwProblem ywProblem) {
         QueryWrapper<YwProblem> wrapper = new QueryWrapper<>(ywProblem);
@@ -131,77 +246,19 @@
     @Override
     public PageData<YwProblem> findPage(PageWrap<YwProblem> pageWrap) {
         IPage<YwProblem> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<YwProblem> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<YwProblem> queryWrapper = new MPJLambdaWrapper<YwProblem>();
         Utils.MP.blankToNull(pageWrap.getModel());
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(YwProblem::getId, pageWrap.getModel().getId());
-        }
-        if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(YwProblem::getCreator, pageWrap.getModel().getCreator());
-        }
-        if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(YwProblem::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(YwProblem::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
-        }
-        if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(YwProblem::getEditor, pageWrap.getModel().getEditor());
-        }
-        if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(YwProblem::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(YwProblem::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
-        }
-        if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(YwProblem::getIsdeleted, pageWrap.getModel().getIsdeleted());
-        }
-        if (pageWrap.getModel().getPosition() != null) {
-            queryWrapper.lambda().eq(YwProblem::getPosition, pageWrap.getModel().getPosition());
-        }
-        if (pageWrap.getModel().getRemark() != null) {
-            queryWrapper.lambda().eq(YwProblem::getRemark, pageWrap.getModel().getRemark());
-        }
-        if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(YwProblem::getStatus, pageWrap.getModel().getStatus());
-        }
-        if (pageWrap.getModel().getContent() != null) {
-            queryWrapper.lambda().eq(YwProblem::getContent, pageWrap.getModel().getContent());
-        }
-        if (pageWrap.getModel().getPhone() != null) {
-            queryWrapper.lambda().eq(YwProblem::getPhone, pageWrap.getModel().getPhone());
-        }
-        if (pageWrap.getModel().getSubmitDate() != null) {
-            queryWrapper.lambda().ge(YwProblem::getSubmitDate, Utils.Date.getStart(pageWrap.getModel().getSubmitDate()));
-            queryWrapper.lambda().le(YwProblem::getSubmitDate, Utils.Date.getEnd(pageWrap.getModel().getSubmitDate()));
-        }
-        if (pageWrap.getModel().getCode() != null) {
-            queryWrapper.lambda().eq(YwProblem::getCode, pageWrap.getModel().getCode());
-        }
-        if (pageWrap.getModel().getDealStatus() != null) {
-            queryWrapper.lambda().eq(YwProblem::getDealStatus, pageWrap.getModel().getDealStatus());
-        }
-        if (pageWrap.getModel().getDealUserId() != null) {
-            queryWrapper.lambda().eq(YwProblem::getDealUserId, pageWrap.getModel().getDealUserId());
-        }
-        if (pageWrap.getModel().getDealDate() != null) {
-            queryWrapper.lambda().ge(YwProblem::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
-            queryWrapper.lambda().le(YwProblem::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
-        }
-        if (pageWrap.getModel().getDealInfo() != null) {
-            queryWrapper.lambda().eq(YwProblem::getDealInfo, pageWrap.getModel().getDealInfo());
-        }
-        if (pageWrap.getModel().getDealType() != null) {
-            queryWrapper.lambda().eq(YwProblem::getDealType, pageWrap.getModel().getDealType());
-        }
-        if (pageWrap.getModel().getWorkorderId() != null) {
-            queryWrapper.lambda().eq(YwProblem::getWorkorderId, pageWrap.getModel().getWorkorderId());
-        }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
-        return PageData.from(ywProblemMapper.selectPage(page, queryWrapper));
+        YwProblem model = pageWrap.getModel();
+        queryWrapper.selectAll(YwProblem.class)
+                .selectAs(SystemUser::getRealname,YwProblem::getDealUserName)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwProblem::getDealUserId)
+                .like(StringUtils.isNotBlank(model.getContent()),YwProblem::getContent,model.getContent())
+                .ge(Objects.nonNull(model.getDealDateStart()),YwProblem::getDealDate, Utils.Date.getStart(model.getDealDateStart()))
+                .le(Objects.nonNull(model.getDealDateEnd()),YwProblem::getDealDate, Utils.Date.getEnd(model.getDealDateEnd()))
+                .eq(Objects.nonNull(model.getDealStatus()),YwProblem::getDealStatus,model.getDealStatus())
+        ;
+        IPage iPage = ywProblemMapper.selectJoinPage(page,YwProblem.class,queryWrapper);
+        return PageData.from(iPage);
     }
 
     @Override
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
index 2e0587a..81b1493 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
@@ -140,7 +140,21 @@
 
     @Override
     public YwProject findById(Integer id) {
-        return ywProjectMapper.selectById(id);
+        YwProject ywProject = ywProjectMapper.selectById(id);
+        if(Objects.isNull(ywProject)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(Objects.nonNull(ywProject.getAreaId())){
+            Areas a = areasService.findById(ywProject.getAreaId(),Constants.TWO);
+            if(a != null){
+                ywProject.setAreaName(a.getName());
+                ywProject.setCityId(a.getCityId());
+                ywProject.setCityName(a.getCityName());
+                ywProject.setProvinceId(a.getProvinceId());
+                ywProject.setProvinceName(a.getProvinceName());
+            }
+        }
+        return ywProject;
     }
 
     @Override
@@ -308,7 +322,6 @@
         ProjectTree treeBuild = new ProjectTree(projectDataVOList);
         projectDataVOList = treeBuild.buildTree();
         return  projectDataVOList;
-
     }
 
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwQuickModelServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwQuickModelServiceImpl.java
new file mode 100644
index 0000000..840fe32
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwQuickModelServiceImpl.java
@@ -0,0 +1,142 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.YwQuickModelMapper;
+import com.doumee.dao.business.model.YwQuickModel;
+import com.doumee.service.business.YwQuickModelService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 宸ヤ綔鍙� - 蹇嵎妯″潡Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2025/01/09 17:47
+ */
+@Service
+public class YwQuickModelServiceImpl implements YwQuickModelService {
+
+    @Autowired
+    private YwQuickModelMapper ywQuickModelMapper;
+
+    @Override
+    public Integer create(YwQuickModel ywQuickModel) {
+        ywQuickModelMapper.insert(ywQuickModel);
+        return ywQuickModel.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ywQuickModelMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(YwQuickModel ywQuickModel) {
+        UpdateWrapper<YwQuickModel> deleteWrapper = new UpdateWrapper<>(ywQuickModel);
+        ywQuickModelMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ywQuickModelMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(YwQuickModel ywQuickModel) {
+        ywQuickModelMapper.updateById(ywQuickModel);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<YwQuickModel> ywQuickModels) {
+        if (CollectionUtils.isEmpty(ywQuickModels)) {
+            return;
+        }
+        for (YwQuickModel ywQuickModel: ywQuickModels) {
+            this.updateById(ywQuickModel);
+        }
+    }
+
+    @Override
+    public YwQuickModel findById(Integer id) {
+        return ywQuickModelMapper.selectById(id);
+    }
+
+    @Override
+    public YwQuickModel findOne(YwQuickModel ywQuickModel) {
+        QueryWrapper<YwQuickModel> wrapper = new QueryWrapper<>(ywQuickModel);
+        return ywQuickModelMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<YwQuickModel> findList(YwQuickModel ywQuickModel) {
+        QueryWrapper<YwQuickModel> wrapper = new QueryWrapper<>(ywQuickModel);
+        return ywQuickModelMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<YwQuickModel> findPage(PageWrap<YwQuickModel> pageWrap) {
+        IPage<YwQuickModel> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<YwQuickModel> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(YwQuickModel::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(YwQuickModel::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(YwQuickModel::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(YwQuickModel::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getUserId() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getUserId, pageWrap.getModel().getUserId());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getPath() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getPath, pageWrap.getModel().getPath());
+        }
+        if (pageWrap.getModel().getIcoPath() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getIcoPath, pageWrap.getModel().getIcoPath());
+        }
+        if (pageWrap.getModel().getSort() != null) {
+            queryWrapper.lambda().eq(YwQuickModel::getSort, pageWrap.getModel().getSort());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ywQuickModelMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(YwQuickModel ywQuickModel) {
+        QueryWrapper<YwQuickModel> wrapper = new QueryWrapper<>(ywQuickModel);
+        return ywQuickModelMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
index 87d1ec9..af4bcbc 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
@@ -6,12 +6,13 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.YwBuildingMapper;
-import com.doumee.dao.business.YwContractRoomMapper;
-import com.doumee.dao.business.YwRoomMapper;
-import com.doumee.dao.business.YwWorkorderMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.business.vo.YwFloorStatusDataVO;
+import com.doumee.dao.business.vo.YwRoomContractDataVO;
+import com.doumee.dao.business.vo.YwRoomStatusDataVO;
 import com.doumee.service.business.YwRoomService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -23,8 +24,12 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 杩愮淮鎴挎簮淇℃伅琛⊿ervice瀹炵幇
@@ -41,7 +46,13 @@
     @Autowired
     private YwContractRoomMapper ywContractRoomMapper;
     @Autowired
+    private YwContractMapper ywContractMapper;
+
+    @Autowired
     private YwWorkorderMapper ywWorkorderMapper;
+    @Autowired
+    private YwFloorMapper ywFloorMapper;
+
 
     @Override
     public Integer create(YwRoom model) {
@@ -126,7 +137,19 @@
 
     @Override
     public YwRoom findById(Integer id) {
-        return ywRoomMapper.selectById(id);
+        MPJLambdaWrapper<YwRoom> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(YwRoom.class )
+                .selectAs(YwProject::getName,YwRoom::getProjectName)
+                .selectAs(YwFloor::getName,YwRoom::getFloorName)
+                .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
+                .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
+                .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
+                .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
+                .eq(YwRoom::getId,id)
+                .last(" limit 1 ")
+        ;
+        YwRoom ywRoom = ywRoomMapper.selectJoinOne(YwRoom.class,queryWrapper);
+        return ywRoom;
     }
 
     @Override
@@ -235,4 +258,172 @@
         QueryWrapper<YwRoom> wrapper = new QueryWrapper<>(ywRoom);
         return ywRoomMapper.selectCount(wrapper);
     }
+
+
+
+    @Override
+    public List<YwFloorStatusDataVO>  getRoomStatusList(YwRoom model){
+        if(Objects.isNull(model)
+        || (Objects.isNull(model.getBuildingId()) && Objects.isNull(model.getFloor()))){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        List<YwFloorStatusDataVO> ywFloorStatusDataVOList = new ArrayList<>();
+        List<YwFloor> ywFloorList = ywFloorMapper.selectList(new QueryWrapper<YwFloor>().lambda()
+                .eq(YwFloor::getIsdeleted,Constants.ZERO)
+                .eq(Objects.nonNull(model.getBuildingId()),YwFloor::getBuildingId,model.getBuildingId())
+                .eq(Objects.nonNull(model.getFloor()),YwFloor::getId,model.getFloor())
+                .orderByAsc(YwFloor::getFloor)
+        );
+        List<YwRoom> ywRoomList = ywRoomMapper.selectList(new QueryWrapper<YwRoom>().lambda()
+                .eq(YwRoom::getIsdeleted,Constants.ZERO)
+                .eq(YwRoom::getIsInvestment,Constants.ONE)
+                .eq(YwRoom::getStatus,Constants.ZERO)
+                .eq(Objects.nonNull(model.getBuildingId()),YwRoom::getBuildingId,model.getBuildingId())
+                .eq(Objects.nonNull(model.getFloor()),YwRoom::getFloor,model.getFloor())
+                .orderByAsc(YwRoom::getSortnum)
+        );
+        List<YwRoomStatusDataVO> roomStatusDataList = new ArrayList<>();
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywRoomList)){
+            for (YwRoom ywRoom:ywRoomList) {
+                YwRoomStatusDataVO roomStatusDataVO = new YwRoomStatusDataVO();
+                roomStatusDataVO.setFloorId(ywRoom.getFloor());
+                roomStatusDataVO.setRoomId(ywRoom.getId());
+                roomStatusDataVO.setRoomCode(ywRoom.getCode());
+                roomStatusDataVO.setRoomRentArea(ywRoom.getRentArea());
+
+                List<YwContract> roomContractList =   ywContractMapper.selectJoinList(YwContract.class,new MPJLambdaWrapper<YwContract>()
+                        .selectAll(YwContract.class)
+                        .selectAs(YwCustomer::getName,YwContract::getRenterName)
+                        .leftJoin(YwContractRoom.class,YwContractRoom::getContractId,YwContract::getId)
+                        .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
+                        .eq(YwContract::getIsdeleted,Constants.ZERO)
+                        .ge(YwContract::getStartDate, DateUtil.getCurrDateTime())
+                        .eq(YwContractRoom::getType,Constants.ZERO)
+                        .eq(YwContractRoom::getRoomId,ywRoom.getId())
+                        .ne(YwContract::getBillStatus,Constants.THREE)
+                        .orderByDesc(YwContract::getStartDate)
+                );
+                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(roomContractList)){
+                    roomStatusDataVO.setRoomStatus(Constants.ZERO);
+                    roomStatusDataVO.setFreeDayAmount(Constants.ZERO);
+                }else{
+                    YwContract ywContract = roomContractList.get(Constants.ZERO);
+                    //鍚堝悓鐘舵�� 0寰呮墽琛� 1鎵ц涓� 2宸插埌鏈� 3閫�绉熶腑 4宸查��绉�
+                    //寰呮墽琛�/鎵ц涓�/閫�绉熶腑 鍧囧睘浜庡凡鍑虹 鏍规嵁鍏蜂綋鍒版湡鏃堕棿鍒ゆ柇鏄惁澶勪簬鍗冲皢鍒版湡 90澶�
+                    if(Constants.equalsInteger(ywContract.getStatus(),Constants.ZERO)||Constants.equalsInteger(ywContract.getStatus(),Constants.ONE)||
+                            Constants.equalsInteger(ywContract.getStatus(),Constants.THREE)){
+                        roomStatusDataVO.setRoomStatus(Constants.ONE);
+                        roomStatusDataVO.setCustomerName(ywContract.getRenterName());
+                        if(Constants.equalsInteger(ywContract.getStatus(),Constants.THREE)){
+                            if(Objects.nonNull(ywContract.getBtDate()) && DateUtil.getBetweenDays(DateUtil.getFomartDate(ywContract.getBtDate(),"yyyy-MM-dd"),DateUtil.getFomartDate(new Date(),"yyyy-MM-dd"))<=90){
+                                roomStatusDataVO.setRoomStatus(Constants.TWO);
+                                roomStatusDataVO.setOverData(ywContract.getBtDate());
+                            }
+                        }else{
+                            if(Objects.nonNull(ywContract.getEndDate()) && DateUtil.getBetweenDays(DateUtil.getFomartDate(ywContract.getEndDate(),"yyyy-MM-dd"),DateUtil.getFomartDate(new Date(),"yyyy-MM-dd"))<=90){
+                                roomStatusDataVO.setRoomStatus(Constants.TWO);
+                                roomStatusDataVO.setOverData(ywContract.getEndDate());
+                            }
+                        }
+                    }
+                }
+                roomStatusDataList.add(roomStatusDataVO);
+            }
+        }
+        for (YwFloor ywFloor:ywFloorList) {
+            YwFloorStatusDataVO ywFloorStatusDataVO = new YwFloorStatusDataVO();
+            ywFloorStatusDataVO.setFloor(ywFloor.getFloor());
+            ywFloorStatusDataVO.setFloorId(ywFloor.getId());
+            ywFloorStatusDataVO.setFloorArea(ywFloor.getArea());
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(roomStatusDataList)){
+                List<YwRoomStatusDataVO> floorRoomList = roomStatusDataList.stream().filter(i->Objects.nonNull(i.getFloorId())&&Constants.equalsInteger(i.getFloorId(),ywFloor.getId())).collect(Collectors.toList());
+                ywFloorStatusDataVO.setYwRoomStatusDataVOList(floorRoomList);
+            }
+            ywFloorStatusDataVOList.add(ywFloorStatusDataVO);
+        }
+        return ywFloorStatusDataVOList;
+    }
+
+
+    @Override
+    public YwRoomContractDataVO getRoomContract(YwRoom model){
+        if(Objects.isNull(model)
+                || (Objects.isNull(model.getBuildingId()) && Objects.isNull(model.getProjectId()))){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        YwRoomContractDataVO ywRoomContractDataVO = new YwRoomContractDataVO();
+        ywRoomContractDataVO.setInvestmentRoomAmount(Constants.ZERO);
+        ywRoomContractDataVO.setInvestmentArea(BigDecimal.ZERO);
+        ywRoomContractDataVO.setLeaseContractAmount(Constants.ZERO);
+        ywRoomContractDataVO.setLeasePrice(BigDecimal.ZERO);
+        ywRoomContractDataVO.setLeaseArea(BigDecimal.ZERO);
+        ywRoomContractDataVO.setLeaseRoomAmount(Constants.ZERO);
+
+        List<YwRoom> ywRoomList = ywRoomMapper.selectList(new QueryWrapper<YwRoom>().lambda()
+                .eq(YwRoom::getIsdeleted,Constants.ZERO)
+                .eq(YwRoom::getStatus,Constants.ZERO)
+                .eq(YwRoom::getIsInvestment,Constants.ONE)
+                .eq(Objects.nonNull(model.getBuildingId()),YwRoom::getBuildingId,model.getBuildingId())
+                .eq(Objects.nonNull(model.getProjectId()),YwRoom::getProjectId,model.getProjectId())
+                .orderByAsc(YwRoom::getSortnum)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywRoomList)){
+            return ywRoomContractDataVO;
+        }
+        ywRoomContractDataVO.setInvestmentRoomAmount(ywRoomList.size());
+        ywRoomContractDataVO.setInvestmentArea(ywRoomList.stream().filter(i->Objects.nonNull(i.getRentArea())).map(i->i.getRentArea()).reduce(BigDecimal.ZERO,BigDecimal::add));
+
+        List<YwContract> roomContractList =   ywContractMapper.selectJoinList(YwContract.class,new MPJLambdaWrapper<YwContract>()
+                .selectAll(YwContract.class)
+                .select(" ( select  ifnull(sum(yr.RENT_AREA),0)  from yw_contract_room y left join yw_room yr on y.room_id = yr.id  where y.type = 0 and y.CONTRACT_ID = t.id ) " , YwContract::getTotalArea)
+                .select(" ( select  ifnull(sum(y.TOTLE_FEE),0)  from yw_contract_bill y   where y.CONTRACT_ID = t.id and y.type = 0  ) " , YwContract::getTotalFee)
+                .eq(YwContract::getIsdeleted,Constants.ZERO)
+                .in(YwContract::getStatus,Constants.ONE,Constants.TWO,Constants.THREE)
+                .ne(YwContract::getBillStatus,Constants.THREE)
+                .apply(Objects.nonNull(model.getBuildingId()),
+                        " t.id in ( select y.CONTRACT_ID from yw_contract_room y left join yw_room yr on y.room_id = yr.id  where y.type = 0 and  yr.BUILDING_ID = "+model.getBuildingId()+" ) ")
+                .apply(Objects.nonNull(model.getProjectId()),
+                        " t.id in ( select y.CONTRACT_ID from yw_contract_room y left join yw_room yr on y.room_id = yr.id  where y.type = 0 and  yr.PROJECT_ID = "+model.getProjectId()+" ) ")
+                .apply(Objects.nonNull(model.getProjectId())," ")
+                .orderByDesc(YwContract::getStartDate)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(roomContractList)){
+            return ywRoomContractDataVO;
+        }
+        //澶勭悊绉熻祦鍗曚环 鏍规嵁  鍚堝悓绉熻祦鎬婚 /  锛堢璧佹椂闀� * 绉熻祦闈㈢Н锛�
+        for (YwContract ywContract:roomContractList) {
+            long contractDayAmount = DateUtil.getBetweenDays(DateUtil.getFomartDate(ywContract.getEndDate(),"yyyy-MM-dd"),DateUtil.getFomartDate(ywContract.getStartDate(),"yyyy-MM-dd"));
+            if(Objects.nonNull(contractDayAmount) && Objects.nonNull(ywContract.getTotalArea()) && Objects.nonNull(ywContract.getTotalFee())){
+                ywRoomContractDataVO.setLeasePrice(
+                        ywRoomContractDataVO.getLeasePrice().add(
+                            ywContract.getTotalFee().divide((ywContract.getTotalArea().multiply(new BigDecimal(Long.toString(contractDayAmount)))),2,BigDecimal.ROUND_HALF_UP)
+                        )
+                );
+            }
+        }
+
+        ywRoomContractDataVO.setLeaseContractAmount(roomContractList.size());
+        List<Integer> contractId = roomContractList.stream().map(i->i.getId()).collect(Collectors.toList());
+        List<YwRoom> ywLeaseRoomList = ywRoomMapper.selectJoinList(YwRoom.class,new MPJLambdaWrapper<YwRoom>()
+                .selectAll(YwRoom.class)
+                .leftJoin(YwContractRoom.class,YwContractRoom::getRoomId,YwRoom::getId)
+                .eq(YwRoom::getIsdeleted,Constants.ZERO)
+                .eq(YwRoom::getIsInvestment,Constants.ONE)
+                .eq(YwRoom::getStatus,Constants.ZERO)
+                .eq(Objects.nonNull(model.getBuildingId()),YwRoom::getBuildingId,model.getBuildingId())
+                .eq(Objects.nonNull(model.getProjectId()),YwRoom::getProjectId,model.getProjectId())
+                .in(YwContractRoom::getContractId,contractId)
+                .orderByAsc(YwRoom::getSortnum)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywLeaseRoomList)){
+            ywRoomContractDataVO.setLeaseArea(
+                    ywLeaseRoomList.stream().filter(i->Objects.nonNull(i.getRentArea())).map(i->i.getRentArea()).reduce(BigDecimal.ZERO,BigDecimal::add)
+            );
+            ywRoomContractDataVO.setLeaseRoomAmount(ywLeaseRoomList.size());
+        }
+        return ywRoomContractDataVO;
+    }
+
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
index 42f163b..4346ef6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
@@ -8,9 +8,12 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.*;
+import com.doumee.dao.business.dto.YwWorkorderDataDTO;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.business.vo.YwWorkorderDataVO;
 import com.doumee.dao.system.MultifileMapper;
 import com.doumee.dao.system.SystemUserMapper;
 import com.doumee.dao.system.model.Multifile;
@@ -29,6 +32,7 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 杩愮淮宸ュ崟淇℃伅琛⊿ervice瀹炵幇
@@ -383,6 +387,7 @@
                 .selectAs(YwFloor::getName,YwWorkorder::getFloorName)
                 .selectAs(YwBuilding::getName,YwWorkorder::getBuildingName)
                 .selectAs(YwProject::getName,YwWorkorder::getProjectName)
+                .selectAs(YwProblem::getId,YwWorkorder::getProblemId)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getDealUserId)
                 .leftJoin(Category.class,Category::getId,YwWorkorder::getCateId)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getCreator)
@@ -390,6 +395,7 @@
                 .leftJoin(YwFloor.class,YwFloor::getId,YwWorkorder::getFloorId)
                 .leftJoin(YwBuilding.class,YwBuilding::getId,YwWorkorder::getBuildingId)
                 .leftJoin(YwProject.class,YwProject::getId,YwBuilding::getProjectId)
+                .leftJoin(YwProblem.class,YwProblem::getWorkorderId,YwWorkorder::getId)
                 .apply(StringUtils.isNotBlank(pageWrap.getModel().getQueryStatus())," find_in_set(t.DEAL_STATUS ,'"+pageWrap.getModel().getQueryStatus()+"') ");
         pageWrap.getModel().setIsdeleted(Constants.ZERO);
         Utils.MP.blankToNull(pageWrap.getModel());
@@ -406,6 +412,9 @@
         }
         if (pageWrap.getModel().getCreator() != null) {
             queryWrapper.eq(YwWorkorder::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getOrigin() != null) {
+            queryWrapper.eq(YwWorkorder::getOrigin, pageWrap.getModel().getOrigin());
         }
         if (pageWrap.getModel().getCreateDate() != null) {
             queryWrapper.ge(YwWorkorder::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
@@ -528,4 +537,27 @@
         QueryWrapper<YwWorkorder> wrapper = new QueryWrapper<>(ywWorkorder);
         return ywWorkorderMapper.selectCount(wrapper);
     }
+
+
+
+    @Override
+    public YwWorkorderDataVO getDataVO(YwWorkorderDataDTO dto){
+        YwWorkorderDataVO ywWorkorderDataVO = new YwWorkorderDataVO();
+
+        List<YwWorkorder> list = ywWorkorderMapper.selectList(new QueryWrapper<YwWorkorder>().lambda()
+                .eq(YwWorkorder::getIsdeleted,Constants.ZERO)
+                .eq(Constants.equalsInteger(dto.getQueryType(),Constants.ONE),YwWorkorder::getProjectId,dto.getQueryId())
+                .eq(Constants.equalsInteger(dto.getQueryType(),Constants.TWO),YwWorkorder::getFloorId,dto.getQueryId())
+                .eq(Constants.equalsInteger(dto.getQueryType(),Constants.THREE),YwWorkorder::getRoomId,dto.getQueryId()));
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            ywWorkorderDataVO.setAmount(list.size());
+            ywWorkorderDataVO.setMonthAmount(list.stream().filter(i-> DateUtil.formatDate(i.getSubmitDate(),"yyyy-MM").equals(DateUtil.formatDate(new Date(),"yyyy-MM"))).collect(Collectors.toList()).size());
+            ywWorkorderDataVO.setWaitDealAmount(list.stream().filter(i-> Constants.equalsInteger(i.getDealStatus(),Constants.ONE)).collect(Collectors.toList()).size());
+            ywWorkorderDataVO.setWaitAssignAmount(list.stream().filter(i-> Constants.equalsInteger(i.getDealStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
+        }
+        return ywWorkorderDataVO;
+    }
+
+
+
 }

--
Gitblit v1.9.3