From a29e0df3c165dfe2ddd825bb340ed480a64865db Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期四, 02 四月 2026 15:02:30 +0800
Subject: [PATCH] 解决冲突

---
 server/system_timer/src/main/resources/bootstrap-dev.yml                                                         |    6 
 admin/src/components/business/OperaDianbiaoDataListWindow.vue                                                    |  177 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceDataMapper.java                        |   12 
 admin/src/api/Inspection/ywPatrolPoint.js                                                                        |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java              |  293 ++++
 admin/package-lock.json                                                                                          |    2 
 server/system_service/src/main/java/com/doumee/biz/system/impl/SystemRoleBizImpl.java                            |    5 
 server/system_service/src/main/java/com/doumee/dao/system/dto/ImportMaterialDTO.java                             |   60 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java       |  156 ++
 admin/src/api/business/deviceData.js                                                                             |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java       |    2 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java              |   13 
 server/system_gateway/src/main/resources/application-dev.yml                                                     |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTempConfigServiceImpl.java        |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java                    |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java |    1 
 admin/.env.development                                                                                           |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java                   |   12 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java                       |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java                            |    7 
 server/startsh/startup.bat                                                                                       |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java              |   56 
 server/system_timer/src/main/resources/bootstrap-test.yml                                                        |    6 
 admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue                                               |    9 
 admin/src/views/business/deviceKongtiao.vue                                                                      |  206 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelOutVO.java               |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java                   |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwMaterialServiceImpl.java          |   95 +
 admin/src/components/business/OperaDeviceDianbiaoWindow.vue                                                      |  147 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java              |   12 
 admin/src/views/contract/components/terminateLease.vue                                                           |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java                        |    4 
 server/system_gateway/src/main/resources/bootstrap.yml                                                           |    2 
 server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java                                   |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/excel/ExcelReplaceCommon.java                        |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java            |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java          |  153 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java           |   10 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml                                                |    6 
 server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java                                    |   11 
 server/emaysms/src/main/java/cn/emay/sdk/util/DateUtil.java                                                      |    5 
 temp/f1fe6230-8109-4137-b2fb-eb906d31fddf.png                                                                    |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java         |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java                            |   26 
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                         |   29 
 server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml                                                 |    6 
 server/visits/dmvisit_service/src/main/resources/application-dev.yml                                             |    6 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceDataCloudController.java                  |   43 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java               |   26 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java  |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/DeviceData.java                        |   95 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceDataService.java                   |   98 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceDataServiceImpl.java          |  161 ++
 server/emaysms/src/main/java/cn/emay/sdk/util/GZIPUtils.java                                                     |    4 
 server/system_gateway/src/main/resources/application-test.yml                                                    |    6 
 server/system_timer/src/main/resources/application-pro.yml                                                       |    3 
 server/emaysms/src/main/java/cn/emay/sdk/EmayTool.java                                                           |    6 
 admin/.env.production                                                                                            |    1 
 admin/src/views/Inspection/dot.vue                                                                               |   44 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java                      |    5 
 server/visits/admin_timer/src/main/resources/bootstrap-test.yml                                                  |    6 
 server/system_gateway/src/main/resources/bootstrap-dev.yml                                                       |    6 
 server/system_service/src/main/java/com/doumee/service/system/SystemRolePermissionService.java                   |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java        |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java                |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java                |   22 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java                      |   49 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwMaterial.java                        |   30 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java      |   28 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java                           |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java                     |    2 
 server/visits/admin_timer/src/main/resources/bootstrap-dev.yml                                                   |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/device/WaterElectricityUtil.java                     |  600 ++++++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java        |   27 
 server/system_service/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java          |    8 
 server/visits/dmvisit_service/src/main/resources/application-test.yml                                            |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java                      |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java                       |    2 
 server/system_timer/src/main/resources/bootstrap.yml                                                             |    2 
 admin/src/views/business/deviceDianbiao.vue                                                                      |  209 +++
 /dev/null                                                                                                        |  139 --
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java                       |   19 
 server/system_timer/src/main/resources/application-test.yml                                                      |    6 
 admin/src/views/roomStatus/index.vue                                                                             |    8 
 server/system_timer/src/main/resources/application-dev.yml                                                       |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java      |  161 +-
 server/system_gateway/src/main/resources/bootstrap-test.yml                                                      |    6 
 admin/src/components/base/BaseTable.vue                                                                          |    2 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java               |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceServiceImpl.java            |    2 
 90 files changed, 2,996 insertions(+), 522 deletions(-)

diff --git a/admin/.env.development b/admin/.env.development
index 04d1cb4..53d536a 100644
--- a/admin/.env.development
+++ b/admin/.env.development
@@ -3,11 +3,6 @@
 # 椤圭洰涓婁笅鏂囪矾寰�
 VUE_APP_CONTEXT_PATH = './'
 
-# VUE_APP_API_URL  = 'http://localhost:10010'
+VUE_APP_API_URL  = 'http://localhost:10010'
 
-VUE_APP_API_URL  = 'http://192.168.0.143:10010'
-
-# VUE_APP_API_URL  = 'https://dmtest.ahapp.net/fn_admin'
-
-# VUE_APP_API_URL  = 'http://10.50.250.253:8088/gateway_interface'
-
+#VUE_APP_API_URL  = 'https://zhcg.fnwtzx.com/gateway_interface'
diff --git a/admin/.env.production b/admin/.env.production
index 4e3f06d..19d9a2b 100644
--- a/admin/.env.production
+++ b/admin/.env.production
@@ -3,3 +3,4 @@
 
 # VUE_APP_API_URL  = 'https://dmtest.ahapp.net/gateway_interface'
 VUE_APP_API_URL = 'https://zhcg.fnwtzx.com/gateway_interface/doc.html'
+VUE_APP_API_URL  = 'https://zhcg.fnwtzx.com/gateway_interface'
diff --git a/admin/package-lock.json b/admin/package-lock.json
index 2a619e8..240cbab 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -6,7 +6,7 @@
   "dependencies": {
     "@amap/amap-jsapi-loader": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
+      "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
       "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw=="
     },
     "@babel/code-frame": {
diff --git a/admin/src/api/Inspection/ywPatrolPoint.js b/admin/src/api/Inspection/ywPatrolPoint.js
index 13709e9..00d3dea 100644
--- a/admin/src/api/Inspection/ywPatrolPoint.js
+++ b/admin/src/api/Inspection/ywPatrolPoint.js
@@ -12,6 +12,16 @@
     trim: true
   })
 }
+
+
+// 浜岀淮鐮佸垪琛�
+export function exportQrcodes (data) {
+    return request.post('/visitsAdmin/cloudService/business/ywPatrolPoint/exportQrcodes',data, {
+      trim: true,
+      download: true
+    })
+
+}
 // 瀵煎嚭Excel
 export function exportExcel (data) {
   return request.post('/visitsAdmin/cloudService/business/ywPatrolPoint/exportExcel', data, {
diff --git a/admin/src/api/business/deviceData.js b/admin/src/api/business/deviceData.js
new file mode 100644
index 0000000..c337434
--- /dev/null
+++ b/admin/src/api/business/deviceData.js
@@ -0,0 +1,8 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/deviceData/page', data, {
+    trim: true
+  })
+}
diff --git a/admin/src/components/base/BaseTable.vue b/admin/src/components/base/BaseTable.vue
index 7aea229..06c3ed3 100644
--- a/admin/src/components/base/BaseTable.vue
+++ b/admin/src/components/base/BaseTable.vue
@@ -182,7 +182,7 @@
             containChildrenRows.push(row[this.configData['field.main']])
           }
         }
-        if (containChildrenRows.length > 0) {
+        if (containChildrenRows.length > 0) {鎴�
           message = '鏈灏嗗垹闄よ鏁版嵁鍙婂叾瀛愭暟鎹紝纭鍒犻櫎鍚楋紵'
         }
       }
diff --git a/admin/src/components/business/OperaDeviceDianbiaoWindow.vue b/admin/src/components/business/OperaDeviceDianbiaoWindow.vue
new file mode 100644
index 0000000..0a22a1a
--- /dev/null
+++ b/admin/src/components/business/OperaDeviceDianbiaoWindow.vue
@@ -0,0 +1,147 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        width="65%"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+          <p class="tip-header" >鍩烘湰淇℃伅</p>
+          <el-form-item label="璁惧鍚嶇О" prop="name">
+            <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+          </el-form-item>
+          <el-form-item label="璁惧鍦板潃鍩�" prop="no">
+            <el-input v-model="form.no" placeholder="璇疯緭鍏ヨ澶囨爣璇嗙" v-trim/>
+          </el-form-item>
+          <el-form-item label="璁惧鍙�" prop="doorNo">
+            <el-input v-model="form.doorNo" placeholder="璇疯緭鍏ュ簭鍒楀彿" v-trim/>
+          </el-form-item>
+          <el-form-item label="鍘傚晢" prop="manufature">
+            <el-input v-model="form.manufature" placeholder="璇疯緭鍏ュ巶鍟�" v-trim/>
+          </el-form-item>
+          <el-form-item label="瀹夎浣嶇疆" prop="regionPathName">
+            <el-input v-model="form.regionPathName" placeholder="璇疯緭鍏ヨ澶囦綅缃�" v-trim/>
+          </el-form-item>
+          <el-form-item label="杩炴帴IP" prop="ip">
+            <el-input v-model="form.ip" placeholder="璇疯緭鍏ヨ澶囪繛鎺P鍦板潃" v-trim/>
+          </el-form-item>
+          <el-form-item label="杩炴帴绔彛" prop="port">
+            <el-input v-model="form.port" placeholder="璇疯緭鍏ヨ繛鎺ョ鍙�" v-trim/>
+          </el-form-item>
+          <el-form-item label="鐢垫祦姣�" prop="channelNo">
+            <el-input v-model="form.channelNo" type="number" placeholder="璇疯緭鍏ョ數娴佹瘮" v-trim>
+              <template slot="append">/5A</template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="瀵嗙爜绛夌骇" prop="pwdLevel">
+            <el-input v-model="form.doorNameObj.pwdLevel" placeholder="璇疯緭鍏ュ瘑鐮佺瓑绾�" v-trim/>
+          </el-form-item>
+          <el-form-item label="瀵嗙爜" prop="pwd">
+            <el-input v-model="form.doorNameObj.pwd" placeholder="璇疯緭鍏ヨ繛鎺ュ瘑鐮�" v-trim/>
+          </el-form-item>
+          <el-form-item label="鎿嶄綔鑰呬唬鐮�" prop="userCode">
+            <el-input v-model="form.doorNameObj.userCode" placeholder="璇疯緭鍏ヨ澶囨搷浣滆�呬唬鐮�" v-trim/>
+          </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaDeviceDuanluqiWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        regionPathName: '',
+        doorNo: '',
+        no: '',
+        type: 6,
+        ip: '',
+        port: '',
+        level: '',
+        doorName: '',
+        doorId: '',
+        doorNameObj: {
+          pwdLevel: '',
+          pwd: '',
+          userCode: ''
+        },
+        channelInfo: '',
+        manufature: '',
+        channelNo: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ヨ澶囧悕绉�' }
+        ],
+        doorName: [
+          { required: true, message: '璇疯緭鍏ヨ澶囪繛鎺ュ瘑鐮�' }
+        ],
+        channelNo: [
+          { required: true, message: '璇疯緭鍏ュ紑鍏冲簭鍙�' }
+        ],
+        doorNo: [
+          { required: true, message: '璇疯緭鍏ヨ澶囧彿' }
+        ],
+        no: [
+          { required: true, message: '璇疯緭鍏ヨ澶囨爣璇嗙' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/device',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      this.form.doorName = ''
+      this.form.doorNameObj = {
+        userCode: '',
+        pwd: '',
+        pwdLevel: ''
+      }
+      // debugger
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        if(!this.form.doorNameObj){
+          this.form.doorNameObj = {
+            pwdLevel: '',
+            pwd: '',
+            userCode: ''
+          }
+        }
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(async () => {
+        if(!target.doorNameObj){
+          target.doorNameObj={
+            pwdLevel: '',
+            pwd: '',
+            userCode: ''}
+        }
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaDianbiaoDataListWindow.vue b/admin/src/components/business/OperaDianbiaoDataListWindow.vue
new file mode 100644
index 0000000..802bc8f
--- /dev/null
+++ b/admin/src/components/business/OperaDianbiaoDataListWindow.vue
@@ -0,0 +1,177 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="100%"
+      :visible.sync="visible"
+  >
+    <TableLayout >
+      <!-- 鎼滅储琛ㄥ崟 -->
+      <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+        <div  style="display: block;margin-bottom: 60px;padding: 20px; border: 1px solid #f2f2f2;">
+          <div style="display: block;font-size: 16px;font-weight: 600;margin-bottom: 20px;">璁惧淇℃伅</div>
+          <div style="display: flex;">
+            <div style="flex: 1"><span class="label">鍚嶇О锛�</span>{{model.name ||''}}</div>
+            <div style="flex: 1"><span  class="label">鍦板潃鍩燂細</span>{{model.no ||''}}</div>
+            <div style="flex: 1"><span  class="label">璁惧鍙凤細</span>{{model.doorNo ||'-'}}</div>
+          </div>
+          <div style="display: flex;margin-top: 20px;">
+            <div style="flex: 1"><span  class="label">IP锛�</span>{{ model.ip ||'' }}</div>
+            <div style="flex: 1"><span  class="label">绔彛锛�</span>{{ model.port ||''}}</div>
+            <div style="flex: 3">
+              <span class="label">鏈�杩戞帶鍒舵搷浣滐細</span>
+              <span class="orange" >{{model.remark||''}}</span>
+            </div>
+          </div>
+        </div>
+        <div class="platgroup_tabs">
+          <div class="tab" :class="{ active: activeGroup === item.id }" @click="groupClick(item)"
+               v-for="(item, i) in groupList" :key="i">
+            {{ item.name }}
+          </div>
+        </div>
+      </el-form>
+      <!-- 琛ㄦ牸鍜屽垎椤� -->
+      <template  v-slot:table-wrap>
+        <el-table
+            v-if="activeGroup===0"
+            v-loading="isWorking.search"
+            :data="tableData.list"
+            stripe>
+          <el-table-column prop="happenTime" label="璇诲彇鏃堕棿" min-width="150px"></el-table-column>
+          <el-table-column prop="val1" label="鐢佃兘锛圞WH锛�" min-width="120px"></el-table-column>
+          <el-table-column prop="val2" label="鐘舵��" min-width="120px">
+            <template slot-scope="{row}">
+              <span v-if=" row.val2 === '0000'" class="green">鍚堥椄</span>
+              <span  v-else-if=" row.val2 === '0050'" class="red">鍒嗛椄</span>
+              <span v-else>-</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="val3" label="鐢佃〃鏃堕棿" min-width="120px"></el-table-column>
+        </el-table>
+        <el-table
+            v-if="activeGroup===1"
+            v-loading="isWorking.search"
+            :data="tableData.list"
+            stripe>
+          <el-table-column prop="createDate" label="鎿嶄綔鏃堕棿" min-width="150px"></el-table-column>
+          <el-table-column prop="val4" label="鎿嶄綔浜�" min-width="100px" ></el-table-column>
+          <el-table-column prop="val3" label="鎿嶄綔鍐呭" min-width="100px">
+            <template slot-scope="{row}">
+                <span v-if=" row.val3 === '銆愬悎闂搞��'" class="green">{{row.val3||''}}</span>
+                <span  v-else-if=" row.val3 === '銆愬垎闂搞��'" class="red">{{row.val3||''}}</span>
+                <span v-else>{{row.val3||''}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="val2" label="鍐呭" min-width="300px" show-overflow-tooltip></el-table-column>
+        </el-table>
+        <pagination
+            @size-change="handleSizeChange"
+            @current-change="handlePageChange"
+            :pagination="tableData.pagination"
+        >
+        </pagination>
+      </template>
+    </TableLayout>
+    <template   v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaJkSketchCustomerWindow',
+  extends: BaseTable,
+  components: { GlobalWindow, TableLayout, Pagination },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      visible: false,
+      title: '',
+      activeGroup:0,
+      model:{doorNameObj:{}},
+      groupList: [{ id: 0, name: '鏁版嵁涓婃姤璁板綍', type: 0 }, { id: 1, name: '杩滅▼鎺у埗璁板綍', type: 1 }],
+      searchForm: {
+        deviceId:  null,
+        val1: '',
+        dataType:0
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璁惧鏁版嵁淇℃伅琛�',
+      api: '/business/deviceData',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    groupClick (item) {
+      this.activeGroup = item.id
+      this.searchForm.val1 = ''
+      this.searchForm.dataType = item.type
+      this.search()
+    },
+    open (title, row) {
+      this.title = title +' 銆�'+ (row.name)+'銆�'
+      this.searchForm.deviceId = row.id
+      if(!row.doorNameObj) {
+        row.doorNameObj = {}
+      }
+      this.model=row
+      this.visible = true
+      this.tableData = {
+        // 宸查�変腑鐨勬暟鎹�
+        selectedRows: [],
+        // 鎺掑簭鐨勫瓧娈�
+        sorts: [],
+        // 褰撳墠椤垫暟鎹�
+        list: [],
+        // 鍒嗛〉
+        pagination: {
+          pageIndex: 1,
+          pageSize: 10,
+          total: 0
+        }
+      }
+      this.groupClick(this.groupList[0])
+    }
+  }
+}
+</script>
+<style>
+.platgroup_tabs {
+  flex: 1;
+  display: flex;
+  border-bottom: 1px solid #dfe2e8;
+  margin-bottom:30px;
+
+  .tab {
+    color: #666666;
+    margin-right: 40px;
+    cursor: pointer;
+    padding-bottom: 18px;
+    border-bottom: 2px solid #fff;
+  }
+
+  .active {
+    font-weight: 500;
+    font-size: 15px;
+    color: #2080f7;
+    border-bottom: 2px solid $primary-color;
+  }
+}
+.label{
+/*  width: 80px;
+  text-align: right;*/
+  color: rgb(102, 102, 102);
+  display: inline-block;
+
+}
+</style>
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
index d17b360..2f22cd9 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
@@ -1,8 +1,8 @@
 <template>
   <GlobalWindow :title="title" :visible.sync="visible" width="620px" :confirm-working="isWorking" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="宸℃鐐圭紪鐮�" prop="code">
-        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ悕绉�" v-trim />
+      <el-form-item label="宸℃鐐圭紪鐮�"  required >
+        <el-input v-model="form.code" disabled readonly placeholder="绯荤粺鑷姩鐢熸垚" v-trim />
       </el-form-item>
       <el-form-item label="宸℃鐐瑰悕绉�" prop="name">
         <el-input v-model="form.name" placeholder="璇疯緭鍏ュ贰妫�鐐瑰悕绉�" v-trim />
@@ -67,7 +67,6 @@
       // 楠岃瘉瑙勫垯
       rules: {
         name: [{ required: true, message: '璇疯緭鍏�' }],
-        code: [{ required: true, message: '璇疯緭鍏�' }],
       },
       isUploading: false,
     }
@@ -87,7 +86,7 @@
         this.$nextTick(() => {
           this.form = {
             name: '',
-            code: '',
+            // code: '',
             content: '',
             imgurl: '',
             areaId: 0,
@@ -182,4 +181,4 @@
   margin-bottom: 20px;
   float: left;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/admin/src/views/Inspection/dot.vue b/admin/src/views/Inspection/dot.vue
index 943bb51..d23746f 100644
--- a/admin/src/views/Inspection/dot.vue
+++ b/admin/src/views/Inspection/dot.vue
@@ -20,9 +20,11 @@
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:ywpatrolpoint:create', 'business:ywpatrolpoint:delete']">
+      <ul class="toolbar" v-permissions="['business:ywpatrolpoint:create', 'business:ywpatrolpoint:qrcode', 'business:ywpatrolpoint:delete']">
         <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
             v-permissions="['business:ywpatrolpoint:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="exportQrcodes()" icon="el-icon-download"
+            v-permissions="['business:ywpatrolpoint:qrcode']">瀵煎嚭鍏ㄩ噺浜岀淮鐮�</el-button></li>
         <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
             v-permissions="['business:ywpatrolpoint:delete']">鍒犻櫎</el-button></li> -->
       </ul>
@@ -32,9 +34,11 @@
         <el-table-column prop="name" label="宸℃鐐瑰悕绉�" min-width="100px"></el-table-column>
         <el-table-column prop="deviceName" label="鍏宠仈璁惧" min-width="100px"></el-table-column>
         <el-table-column prop="areaName" label="宸℃鍖哄煙" min-width="100px"></el-table-column>
-        <el-table-column v-if="containPermissions(['business:ywpatrolpoint:update', 'business:ywpatrolpoint:delete'])"
-          label="鎿嶄綔" min-width="120" fixed="right">
+        <el-table-column v-if="containPermissions(['business:ywpatrolpoint:update','business:ywpatrolpoint:qrcode', 'business:ywpatrolpoint:delete'])"
+          label="鎿嶄綔" min-width="160" fixed="right">
           <template slot-scope="{row}">
+            <el-button type="text" @click="exportQrcodes(row.id)" icon="el-icon-download"
+              v-permissions="['business:ywpatrolpoint:qrcode']">涓嬭浇浜岀淮鐮�</el-button>
             <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
               v-permissions="['business:ywpatrolpoint:update']">缂栬緫</el-button>
             <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
@@ -56,11 +60,12 @@
 import Pagination from '@/components/common/Pagination'
 import OperaYwPatrolPointWindow from './components/OperaYwPatrolPointWindow'
 import { fetchList } from '@/api/business/category'
+import { exportQrcodes } from '@/api/Inspection/ywPatrolPoint'
 export default {
   name: 'YwPatrolPoint',
   extends: BaseTable,
   components: { TableLayout, Pagination, OperaYwPatrolPointWindow },
-  data() {
+  data () {
     return {
       // 鎼滅储
       searchForm: {
@@ -71,7 +76,7 @@
       areaList: []
     }
   },
-  created() {
+  created () {
     this.config({
       module: '杩愮淮宸℃鐐逛俊鎭〃',
       api: '/Inspection/ywPatrolPoint',
@@ -82,7 +87,24 @@
     this.getProject()
   },
   methods: {
-    reset() {
+
+    exportQrcodes (id) {
+      this.$dialog.actionConfirm( '鎮ㄧ‘璁よ繘琛岃鎿嶄綔鍚楋紵','涓嬭浇鎿嶄綔鎻愮ず')
+        .then(() => {
+          exportQrcodes({id:id})
+            .then(response => {
+              this.download(response)
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.isWorking.export = false
+            })
+        })
+        .catch(() => {})
+    },
+    reset () {
       this.searchForm = {
         name: '',
         areaId: '',
@@ -90,16 +112,16 @@
       }
       this.search()
     },
-    getProject() {
+    getProject () {
       fetchList({
         model: { type: 4 },
         capacity: 1000,
-        page: 1,
+        page: 1
       }).then(res => {
         this.areaList = res.records || []
       })
     },
-    editClick(row) {
+    editClick (row) {
       if (row && row.id) {
         this.$refs.operaYwPatrolPointWindow.open('缂栬緫宸℃鐐�', row)
       } else {
@@ -107,7 +129,7 @@
       }
       // this.$refs.operaYwPatrolPointWindow.initData()
     },
-    changeSel(e) {
+    changeSel (e) {
       if (e && e.length == 1) {
       } else if (e && e.length == 2) {
         this.$set(this.searchForm, 'areaId', e[1])
@@ -115,7 +137,7 @@
 
       }
       this.search()
-    },
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/deviceDianbiao.vue b/admin/src/views/business/deviceDianbiao.vue
new file mode 100644
index 0000000..85a37d0
--- /dev/null
+++ b/admin/src/views/business/deviceDianbiao.vue
@@ -0,0 +1,209 @@
+<template>
+    <TableLayout :permissions="['business:device:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm"  slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item title="鍚嶇О" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item title="鏍囪瘑绗�" prop="no">
+                <el-input v-model="searchForm.no" placeholder="璇疯緭鍏ヨ澶囧湴鍧�鍩�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item title="璁惧鍙�" prop="doorNo">
+                <el-input v-model="searchForm.doorNo" placeholder="璇疯緭鍏ヨ澶囧彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+          <ul class="toolbar" v-permissions="['business:device:create', 'business:device:delete']">
+            <li><el-button type="primary" @click="$refs.operaDeviceWindow.open('鏂板缓鐢佃〃')" icon="el-icon-plus" v-permissions="['business:device:create']">鏂板缓</el-button></li>
+            <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:device:delete']">鍒犻櫎</el-button></li>
+          </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe >
+              <el-table-column type="selection" width="55"></el-table-column>
+              <el-table-column prop="name" label="鍚嶇О" fixed min-width="150" align="center"></el-table-column>
+              <el-table-column prop="no" label="鐢佃〃鍦板潃鍩�" min-width="100" align="center" ></el-table-column>
+              <el-table-column prop="doorNo" label="璁惧鍙�"  min-width="120" align="center" show-overflow-tooltip></el-table-column>
+<!--
+              <el-table-column prop="channelNo" label="寮�鍏冲簭鍙�" align="center" min-width="100"></el-table-column>
+-->
+              <el-table-column prop="manufature" label="鍘傚晢" align="center" min-width="100" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="regionPathName" align="center"  min-width="100" label="鎵�鍦ㄤ綅缃�"></el-table-column>
+              <el-table-column prop="ip" label="IP"  min-width="150" align="center" show-overflow-tooltip ></el-table-column>
+              <el-table-column prop="port" label="绔彛" align="center"  ></el-table-column>
+              <el-table-column prop="isUsed" label="鏄惁浣跨敤">
+                <template slot-scope="{row}">
+                  <el-switch @change="changeUsed($event, row)" v-model="row.isUsed" active-color="#13ce66"
+                             inactive-color="#ff4949" :active-value="0" :inactive-value="1">
+                  </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column prop="doorNameObj.pwdLevel" label="瀵嗙爜绛夌骇" align="center" min-width="150"></el-table-column>
+              <el-table-column prop="doorNameObj.pwd" label="瀵嗙爜" align="center">
+                <template slot-scope="{row}">
+                  <span :class=" 'blue'">{{row.showPwd?row.doorNameObj.pwd:'******'}}</span>
+                  <el-button  style="margin-left: 10px" v-if="row.doorNameObj.pwd!=null"
+                              @click.native.p.prevent="showPassward(row)" type="text">
+                    <i class="el-icon-view" :class="row.showPwd?'red':'blue'" :title="row.showPwd?'闅愯棌':'鏄剧ず'"></i>
+                  </el-button>
+                </template>
+              </el-table-column>
+              <el-table-column prop="doorNameObj.userCode" label="鎿嶄綔鑰呬唬鐮�" align="center" min-width="150"></el-table-column>
+              <el-table-column prop="editDate" label="鏈�杩戞洿鏂版椂闂�" align="center" min-width="150"></el-table-column>
+              <el-table-column
+                  label="鎿嶄綔"
+                  align="center"
+                  min-width="280"
+                  fixed="right"
+              >
+                  <template slot-scope="{row}">
+                    <el-button type="text" @click="$refs.operaDeviceWindow.open('缂栬緫鐢佃〃', row)" icon="el-icon-edit" v-permissions="['business:device:update']">缂栬緫</el-button>
+                    <el-button type="text" @click="$refs.operaDeviceDataWindow.open('鏌ョ湅鐢佃〃鏁版嵁', row)" icon="el-icon-view" v-permissions="['business:device:update']">鏁版嵁</el-button>
+                    <el-button type="text" @click="send(row,1)" icon="el-icon-circle-check"  v-permissions="['business:device:update']">寮�闂�</el-button>
+                    <el-button type="text" class="red" @click="send(row,0)" icon="el-icon-circle-close"  v-permissions="['business:device:update']">鍏抽椄</el-button>
+                    <el-button type="text" class="red" @click="readData(row)" icon="el-icon-circle-close"  v-permissions="['business:device:update']">璇诲彇鏁版嵁</el-button>
+                    <el-button type="text" class="red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:device:delete']">鍒犻櫎</el-button>
+                  </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"  >
+            </pagination>
+        </template>
+      <el-dialog
+          :visible.sync="visibleSend"
+          style="z-index: 100000"
+          append-to-body
+          width="50%"
+          height="50%"
+          :title="'鎺у埗鐢佃〃-銆�'+ form.name+'銆�'"
+      >
+        <el-form :model="form" ref="form"  :rules="rules">
+          <el-form-item label="鎵ц鎿嶄綔锛�"  >
+            <b class="green" v-if="form.status ===1">寮�闂�</b>
+            <b class="red" v-else>鍏抽椄</b>
+          </el-form-item>
+          <el-form-item label="鏈夋晥鏃堕棿" prop="cmdDate">
+            <el-date-picker type="datetime" v-model="form.cmdDate" value-format="yyyy-MM-dd HH:mm:ss"
+                            placeholder="璇烽�夋嫨鏈夋晥鏃堕棿"   />
+          </el-form-item>
+        <!-- <p class="tip-warn" style="width: 100%;"><i class="el-icon-warning"></i></p> -->
+        </el-form>
+        <template  v-slot:footer  >
+          <el-button @click="sendAction(0)" type="primary" v-if="form.status === 1" :loading="isWorkSending">纭寮�闂�</el-button>
+          <el-button @click="sendAction(1)" type="danger" v-if="form.status !== 1" :loading="isWorkSending">纭鍏抽椄</el-button>
+          <el-button @click="sendClose()">杩斿洖</el-button>
+        </template>
+      </el-dialog>
+        <!-- 鏂板缓/淇敼 -->
+    <OperaDeviceDianbiaoWindow ref="operaDeviceWindow" @success="handlePageChange"/>
+    <OperaDeviceDataListWindow ref="operaDeviceDataWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaDeviceDataListWindow from '@/components/business/OperaDianbiaoDataListWindow'
+import OperaDeviceDianbiaoWindow from '@/components/business/OperaDeviceDianbiaoWindow'
+export default {
+  name: 'DeviceDuanluqi',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaDeviceDianbiaoWindow, OperaDeviceDataListWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        doorNo: '',
+        no: '',
+        name: '',
+        type: 6
+      },
+      isWorkSending: false,
+      form: {
+        id: '',
+        status: null,
+        name: null,
+        cmdDate: null
+      },
+      visibleSend: false,
+      options: [],
+      rules: {
+        cmdDate: [{ required: true, message: '璇烽�夋嫨鎿嶄綔鏈夋晥鏃堕棿' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璁惧淇℃伅琛�',
+      api: '/business/device',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    changeUsed (e, row) {
+      this.api.updateUsedById({
+        id: row.id,
+        isUsed: e
+      })
+    },
+    showPassward (row) {
+      if (!row.showPwd) {
+        this.$set(row, 'showPwd', true)
+      } else {
+        this.$set(row, 'showPwd', false)
+      }
+    },
+    sendAction (status) {
+      this.form.status = status
+      this.$dialog.actionConfirm('纭杩涜鐢佃〃銆�' + (this.form.status === 1 ? '寮�闂�' : '鍏抽椄') + '銆戞搷浣滃悧锛�', '鎿嶄綔纭鎻愰啋')
+        .then(() => {
+          console.log(this.form)
+          this.isWorkSending = true
+          this.api.dianbaoCmd(this.form)
+            .then(res => {
+              this.$tip.apiSuccess(res || '璇锋眰鎴愬姛')
+              this.handlePageChange()
+            })
+            .catch(e => {
+            })
+            .finally(() => {
+              this.isWorkSending = false
+            })
+        })
+        .catch(() => {})
+    },
+    readData (row) {
+      this.api.dianbiaoData({ id: row.id })
+        .then(res => {
+          this.$tip.apiSuccess(res || '璇锋眰鎴愬姛')
+          this.handlePageChange()
+        })
+        .catch(e => {
+        })
+        .finally(() => {
+          this.isWorkSending = false
+        })
+    },
+    send (row, type) {
+      this.visibleSend = true
+      this.form = { id: row.id, name: row.name, cmdDate: null, status: type}
+    },
+    sendClose () {
+      this.visibleSend = false
+      this.isWorkSending = false
+      this.form = { id: '', name: '', status: '', cmdDate: '' }
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/deviceKongtiao.vue b/admin/src/views/business/deviceKongtiao.vue
new file mode 100644
index 0000000..5a014a9
--- /dev/null
+++ b/admin/src/views/business/deviceKongtiao.vue
@@ -0,0 +1,206 @@
+<template>
+    <TableLayout :permissions="['business:device:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm"  slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item title="鍚嶇О" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item title="鏍囪瘑绗�" prop="no">
+                <el-input v-model="searchForm.no" placeholder="璇疯緭鍏ヨ澶囧湴鍧�鍩�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item title="璁惧鍙�" prop="doorNo">
+                <el-input v-model="searchForm.doorNo" placeholder="璇疯緭鍏ヨ澶囧彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+          <ul class="toolbar" v-permissions="['business:device:create', 'business:device:delete']">
+            <li><el-button type="primary" @click="$refs.operaDeviceWindow.open('鏂板缓绌鸿皟')" icon="el-icon-plus" v-permissions="['business:device:create']">鏂板缓</el-button></li>
+            <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:device:delete']">鍒犻櫎</el-button></li>
+          </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe >
+              <el-table-column type="selection" width="55"></el-table-column>
+              <el-table-column prop="name" label="鍚嶇О" fixed min-width="150" align="center"></el-table-column>
+              <el-table-column prop="no" label="绌鸿皟鍦板潃鍩�" min-width="100" align="center" ></el-table-column>
+              <el-table-column prop="doorNo" label="璁惧鍙�"  min-width="120" align="center" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="manufature" label="鍘傚晢" align="center" min-width="100" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="regionPathName" align="center"  min-width="100" label="鎵�鍦ㄤ綅缃�"></el-table-column>
+              <el-table-column prop="ip" label="IP"  min-width="150" align="center" show-overflow-tooltip ></el-table-column>
+              <el-table-column prop="port" label="绔彛" align="center"  ></el-table-column>
+              <el-table-column prop="isUsed" label="鏄惁浣跨敤">
+                <template slot-scope="{row}">
+                  <el-switch @change="changeUsed($event, row)" v-model="row.isUsed" active-color="#13ce66"
+                             inactive-color="#ff4949" :active-value="0" :inactive-value="1">
+                  </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column prop="doorNameObj.pwdLevel" label="瀵嗙爜绛夌骇" align="center" min-width="150"></el-table-column>
+              <el-table-column prop="doorNameObj.pwd" label="瀵嗙爜" align="center">
+                <template slot-scope="{row}">
+                  <span :class=" 'blue'">{{row.showPwd?row.doorNameObj.pwd:'******'}}</span>
+                  <el-button  style="margin-left: 10px" v-if="row.doorNameObj.pwd!=null"
+                              @click.native.p.prevent="showPassward(row)" type="text">
+                    <i class="el-icon-view" :class="row.showPwd?'red':'blue'" :title="row.showPwd?'闅愯棌':'鏄剧ず'"></i>
+                  </el-button>
+                </template>
+              </el-table-column>
+              <el-table-column prop="doorNameObj.userCode" label="鎿嶄綔鑰呬唬鐮�" align="center" min-width="150"></el-table-column>
+              <el-table-column prop="editDate" label="鏈�杩戞洿鏂版椂闂�" align="center" min-width="150"></el-table-column>
+              <el-table-column
+                  label="鎿嶄綔"
+                  align="center"
+                  min-width="280"
+                  fixed="right"
+              >
+                  <template slot-scope="{row}">
+                    <el-button type="text" @click="$refs.operaDeviceWindow.open('缂栬緫绌鸿皟', row)" icon="el-icon-edit" v-permissions="['business:device:update']">缂栬緫</el-button>
+                    <el-button type="text" @click="$refs.operaDeviceDataWindow.open('鏌ョ湅绌鸿皟鏁版嵁', row)" icon="el-icon-view" v-permissions="['business:device:update']">鏁版嵁</el-button>
+                    <el-button type="text" @click="send(row,1)" icon="el-icon-circle-check"  v-permissions="['business:device:update']">鎵撳紑</el-button>
+                    <el-button type="text" class="red" @click="send(row,0)" icon="el-icon-circle-close"  v-permissions="['business:device:update']">鍏抽棴</el-button>
+                    <el-button type="text" class="red" @click="readData(row)" icon="el-icon-circle-close"  v-permissions="['business:device:update']">璇诲彇鏁版嵁</el-button>
+                    <el-button type="text" class="red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:device:delete']">鍒犻櫎</el-button>
+                  </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"  >
+            </pagination>
+        </template>
+      <el-dialog
+          :visible.sync="visibleSend"
+          style="z-index: 100000"
+          append-to-body
+          width="50%"
+          height="50%"
+          :title="'鎺у埗绌鸿皟-銆�'+ form.name+'銆�'"
+      >
+        <el-form :model="form" ref="form"  :rules="rules">
+          <el-form-item label="鎵ц鎿嶄綔锛�"  >
+            <b class="green" v-if="form.status ===1">鎵撳紑</b>
+            <b class="red" v-else>鍏抽棴</b>
+          </el-form-item>
+          <el-form-item label="鏈夋晥鏃堕棿" prop="cmdDate">
+            <el-date-picker type="datetime" v-model="form.cmdDate" value-format="yyyy-MM-dd HH:mm:ss"
+                            placeholder="璇烽�夋嫨鏈夋晥鏃堕棿"   />
+          </el-form-item>
+        <!-- <p class="tip-warn" style="width: 100%;"><i class="el-icon-warning"></i></p> -->
+        </el-form>
+        <template  v-slot:footer  >
+          <el-button @click="sendAction(0)" type="primary" v-if="form.status === 1" :loading="isWorkSending">纭鎵撳紑</el-button>
+          <el-button @click="sendAction(1)" type="danger" v-if="form.status !== 1" :loading="isWorkSending">纭鍏抽棴</el-button>
+          <el-button @click="sendClose()">杩斿洖</el-button>
+        </template>
+      </el-dialog>
+        <!-- 鏂板缓/淇敼 -->
+    <OperaDeviceDianbiaoWindow ref="operaDeviceWindow" @success="handlePageChange"/>
+    <OperaDeviceDataListWindow ref="operaDeviceDataWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaDeviceDataListWindow from '@/components/business/OperaDianbiaoDataListWindow'
+import OperaDeviceDianbiaoWindow from '@/components/business/OperaDeviceDianbiaoWindow'
+export default {
+  name: 'DeviceDuanluqi',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaDeviceDianbiaoWindow, OperaDeviceDataListWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        doorNo: '',
+        no: '',
+        name: '',
+        type: 7
+      },
+      isWorkSending: false,
+      form: {
+        id: '',
+        status: null,
+        name: null,
+        cmdDate: null
+      },
+      visibleSend: false,
+      options: [],
+      rules: {
+        cmdDate: [{ required: true, message: '璇烽�夋嫨鎿嶄綔鏈夋晥鏃堕棿' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璁惧淇℃伅琛�',
+      api: '/business/device',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    changeUsed (e, row) {
+      this.api.updateUsedById({
+        id: row.id,
+        isUsed: e
+      })
+    },
+    showPassward (row) {
+      if (!row.showPwd) {
+        this.$set(row, 'showPwd', true)
+      } else {
+        this.$set(row, 'showPwd', false)
+      }
+    },
+    sendAction (status) {
+      this.form.status = status
+      this.$dialog.actionConfirm('纭杩涜绌鸿皟銆�' + (this.form.status === 1 ? '鎵撳紑' : '鍏抽棴') + '銆戞搷浣滃悧锛�', '鎿嶄綔纭鎻愰啋')
+        .then(() => {
+          console.log(this.form)
+          this.isWorkSending = true
+          this.api.dianbaoCmd(this.form)
+            .then(res => {
+              this.$tip.apiSuccess(res || '璇锋眰鎴愬姛')
+              this.handlePageChange()
+            })
+            .catch(e => {
+            })
+            .finally(() => {
+              this.isWorkSending = false
+            })
+        })
+        .catch(() => {})
+    },
+    readData (row) {
+      this.api.dianbiaoData({ id: row.id })
+        .then(res => {
+          this.$tip.apiSuccess(res || '璇锋眰鎴愬姛')
+          this.handlePageChange()
+        })
+        .catch(e => {
+        })
+        .finally(() => {
+          this.isWorkSending = false
+        })
+    },
+    send (row, type) {
+      this.visibleSend = true
+      this.form = { id: row.id, name: row.name, cmdDate: null, status: type}
+    },
+    sendClose () {
+      this.visibleSend = false
+      this.isWorkSending = false
+      this.form = { id: '', name: '', status: '', cmdDate: '' }
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/platformBroadcastLog.vue b/admin/src/views/business/platformBroadcastLog.vue
deleted file mode 100644
index 14c7504..0000000
--- a/admin/src/views/business/platformBroadcastLog.vue
+++ /dev/null
@@ -1,154 +0,0 @@
-<template>
-    <TableLayout :permissions="['business:platformbroadcastlog:query']">
-        <!-- 鎼滅储琛ㄥ崟 -->
-        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-            <el-form-item label="" prop="name">
-                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ユ爣棰�" @keypress.enter.native="search"></el-input>
-            </el-form-item>
-            <el-form-item label="" prop="content">
-                <el-input v-model="searchForm.content" placeholder="璇疯緭鍏ュ唴瀹�" @keypress.enter.native="search"></el-input>
-            </el-form-item>
-            <el-form-item label="" prop="personType">
-                <el-select v-model="searchForm.deviceType" placeholder="璇烽�夋嫨璁惧绫诲瀷">
-                    <el-option label="骞挎挱" value="0"></el-option>
-                    <el-option label="LED" value="1"></el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item label="" prop="eventType">
-                <el-select v-model="searchForm.hkStatus" placeholder="璇烽�夋嫨涓嬪彂鐘舵��">
-                    <el-option label="寰呬笅鍙�" value="0"></el-option>
-                    <el-option label="涓嬪彂涓�" value="1"></el-option>
-                    <el-option label="涓嬪彂鎴愬姛" value="2"></el-option>
-                    <el-option label="涓嬪彂澶辫触" value="3"></el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item label="璧锋鏃堕棿" prop="eventType">
-                <el-date-picker
-                    @change="seleTime"
-                    v-model="time"
-                    type="datetimerange"
-                    format="yyyy-MM-dd HH:mm:ss"
-                    value-format="yyyy-MM-dd HH:mm:ss"
-                    range-separator="鑷�"
-                    start-placeholder="寮�濮嬫椂闂�"
-                    end-placeholder="缁撴潫鏃堕棿">
-                </el-date-picker>
-            </el-form-item>
-            <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
-                <el-radio-button label="0">褰撳ぉ</el-radio-button>
-                <el-radio-button label="1">杩�7澶�</el-radio-button>
-                <el-radio-button label="2">杩�30澶�</el-radio-button>
-            </el-radio-group>
-            <section>
-                <el-button type="primary" @click="search">鎼滅储</el-button>
-                <el-button @click="reset">閲嶇疆</el-button>
-            </section>
-        </el-form>
-        <!-- 琛ㄦ牸鍜屽垎椤� -->
-        <template v-slot:table-wrap>
-            <ul class="toolbar" v-permissions="['business:platformbroadcastlog:exportExcel']">
-<!--
-                <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:platformbroadcastlog:exportExcel']" @click="exportExcel">瀵煎嚭</el-button></li>
--->
-            </ul>
-            <el-table
-                v-loading="isWorking.search"
-                :data="tableData.list"
-                stripe
-            >
-                <el-table-column prop="deviceType" label="璁惧绫诲瀷" min-width="100px">
-                    <template slot-scope="{row}">
-                        <span v-if="row.deviceType == 0">骞挎挱</span>
-                        <span v-if="row.deviceType == 1">LED</span>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="hkStatus" label="涓嬪彂鐘舵��" min-width="100px">
-                    <template slot-scope="{row}">
-                        <span v-if="row.hkStatus == 0" style="color: #0c6ce3">寰呬笅鍙�</span>
-                        <span v-if="row.hkStatus == 1" style="color: #0c6ce3">涓嬪彂涓�</span>
-                        <span v-if="row.hkStatus == 2" style="color: green">涓嬪彂鎴愬姛</span>
-                        <span v-if="row.hkStatus == 3" style="color: red">涓嬪彂澶辫触</span>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="name" label="鏍囬" min-width="100px"></el-table-column>
-                <el-table-column prop="info" label="鍐呭" min-width="100px"></el-table-column>
-                <el-table-column prop="ids" label="璁惧缂栫爜" min-width="100px"></el-table-column>
-                <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
-                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-            </el-table>
-            <pagination
-                @size-change="handleSizeChange"
-                @current-change="handlePageChange"
-                :pagination="tableData.pagination"
-            >
-            </pagination>
-        </template>
-    </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import { timeForMat } from '@/utils/util'
-export default {
-  name: 'DeviceEvent',
-  extends: BaseTable,
-  components: { TableLayout, Pagination },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        name: '',
-        info: '',
-        deviceType: '',
-        hkStatus: '',
-        startTime: '',
-        endTime: '',
-        radio: 0
-      },
-      time: []
-    }
-  },
-  created () {
-    this.config({
-      module: 'LED骞挎挱鎾斁璁板綍',
-      api: '/business/platformBroadcastLog',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.changeRadio('0')
-  },
-  methods: {
-    changeRadio (e) {
-      if (e === '0') {
-        this.searchForm.startTime = timeForMat(0)[0]
-        this.searchForm.endTime = timeForMat(0)[1]
-        this.time = timeForMat(0)
-      } else if (e === '1') {
-        this.searchForm.startTime = timeForMat(6)[0]
-        this.searchForm.endTime = timeForMat(6)[1]
-        this.time = timeForMat(6)
-      } else if (e === '2') {
-        this.searchForm.startTime = timeForMat(29)[0]
-        this.searchForm.endTime = timeForMat(29)[1]
-        this.time = timeForMat(29)
-      }
-      this.search()
-    },
-    seleTime (e) {
-      this.searchForm.startTime = e[0]
-      this.searchForm.endTime = e[1]
-      this.searchForm.radio = null
-      this.search()
-    },
-    reset () {
-      this.$refs.searchForm.resetFields()
-      this.time = []
-      this.searchForm.radio = '0'
-      this.changeRadio('0')
-      this.search()
-    }
-  }
-}
-</script>
diff --git a/admin/src/views/business/platformEvent.vue b/admin/src/views/business/platformEvent.vue
deleted file mode 100644
index 193fbf5..0000000
--- a/admin/src/views/business/platformEvent.vue
+++ /dev/null
@@ -1,160 +0,0 @@
-<template>
-    <TableLayout :permissions="['business:platformevent:query']">
-        <!-- 鎼滅储琛ㄥ崟 -->
-        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-          <el-form-item label="" prop="platformName">
-            <el-input v-model="searchForm.platformName" placeholder="璇疯緭鍏ユ湀鍙板悕绉�" @keypress.enter.native="search"></el-input>
-          </el-form-item>
-          <el-form-item label="" prop="channelName">
-            <el-input v-model="searchForm.channelName" placeholder="璇疯緭鍏ョ洃鎺х偣鍚嶇О" @keypress.enter.native="search"></el-input>
-          </el-form-item>
-          <el-form-item label="" prop="plateNo">
-            <el-input v-model="searchForm.plateNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" @keypress.enter.native="search"></el-input>
-          </el-form-item>
-          <el-form-item label="" prop="eventType">
-            <el-select v-model="searchForm.motionStatus" placeholder="璇烽�夋嫨杩涘嚭绫诲瀷">
-              <el-option label="绂诲紑" value="leave"></el-option>
-              <el-option label="杩涘叆" value="enter"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="璧锋鏃堕棿" prop="startDate">
-                <el-date-picker
-                    @change="seleTime"
-                    v-model="time"
-                    type="datetimerange"
-                    format="yyyy-MM-dd HH:mm:ss"
-                    value-format="yyyy-MM-dd HH:mm:ss"
-                    range-separator="鑷�"
-                    start-placeholder="寮�濮嬫椂闂�"
-                    end-placeholder="缁撴潫鏃堕棿">
-                </el-date-picker>
-            </el-form-item>
-            <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
-                <el-radio-button label="0">褰撳ぉ</el-radio-button>
-                <el-radio-button label="1">杩�7澶�</el-radio-button>
-                <el-radio-button label="2">杩�30澶�</el-radio-button>
-            </el-radio-group>
-            <section>
-                <el-button type="primary" @click="search">鎼滅储</el-button>
-                <el-button @click="reset">閲嶇疆</el-button>
-            </section>
-        </el-form>
-        <!-- 琛ㄦ牸鍜屽垎椤� -->
-        <template v-slot:table-wrap>
-            <el-table
-                v-loading="isWorking.search"
-                :data="tableData.list"
-                stripe
-            >
-                <el-table-column prop="platformName" label="鏈堝彴鍚嶇О" min-width="150px"></el-table-column>
-                <el-table-column prop="channelName" label="鐩戞帶鐐瑰悕绉�" min-width="150px"></el-table-column>
-                <el-table-column prop="plateNo" label="杞︾墝鍙�" min-width="100px"></el-table-column>
-                <el-table-column   label="杩涘嚭绫诲瀷" min-width="90px">
-                  <template slot-scope="{row}">
-                    <span v-if="row.motionStatus == 'enter'">杩涘叆</span>
-                    <span v-if="row.motionStatus == 'leave'">绂诲紑</span>
-                    <span v-if="row.motionStatus != 'leave' && row.motionStatus != 'enter'">{{ row.motionStatus }}</span>
-                  </template>
-                </el-table-column>
-                <el-table-column   label="鍓嶅悗鏍囪瘑" min-width="90px">
-                  <template slot-scope="{row}">
-                    <span v-if="row.stockStatus == 'rear'">杞﹀熬</span>
-                    <span v-if="row.stockStatus == 'front'">杞﹀ご</span>
-                    <span v-if="row.stockStatus != 'rear' && row.stockStatus != 'front'">{{ row.stockStatus }}</span>
-                  </template>
-                </el-table-column>
-                <el-table-column label="杞﹂棬鐘舵��" min-width="100px">
-                    <template slot-scope="{row}">
-                        <span v-if="row.vehicleDoorStatus == 'open'">寮�闂�</span>
-                        <span v-if="row.vehicleDoorStatus == 'close'">鍏抽棬</span>
-                        <span v-if="row.vehicleDoorStatus != 'open' && row.vehicleDoorStatus != 'close'">{{ row.vehicleDoorStatus }}</span>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="srcIndex" label="璁惧缂栫爜" min-width="180px"></el-table-column>
-                <el-table-column prop="ipAddress" label="IP鍦板潃" min-width="100px"></el-table-column>
-                <el-table-column prop="portNo" label="绔彛" min-width="80px"></el-table-column>
-                <el-table-column fixed="right" label="鎶撴媿鍥�" min-width="100px">
-                  <template slot-scope="{row}">
-                    <el-image v-if="row.backgroundImageDown" style="width: 60px; height: 60px" :src="row.backgroundImageDown"
-                              :preview-src-list="[row.backgroundImageDown]">
-                    </el-image>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="160px"></el-table-column>
-            </el-table>
-            <pagination
-                @size-change="handleSizeChange"
-                @current-change="handlePageChange"
-                :pagination="tableData.pagination"
-            >
-            </pagination>
-        </template>
-    </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import { timeForMat } from '@/utils/util'
-export default {
-  name: 'platformEvent',
-  extends: BaseTable,
-  components: { TableLayout, Pagination },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        plateNo: '',
-        motionStatus: '',
-        channelName: '',
-        platformName: '',
-        endDate: '',
-        startDate: '',
-        radio: '0'
-      },
-      time: []
-    }
-  },
-  created () {
-    this.config({
-      module: '鏈堝彴杞﹁締鐘舵�佷簨浠朵氦浜掕褰�',
-      api: '/business/platformEvent',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.changeRadio('0')
-  },
-  methods: {
-    changeRadio (e) {
-      if (e === '0') {
-        this.searchForm.startDate = timeForMat(0)[0]
-        this.searchForm.endDate = timeForMat(0)[1]
-        this.time = timeForMat(0)
-      } else if (e === '1') {
-        this.searchForm.startDate = timeForMat(6)[0]
-        this.searchForm.endDate = timeForMat(6)[1]
-        this.time = timeForMat(6)
-      } else if (e === '2') {
-        this.searchForm.startDate = timeForMat(29)[0]
-        this.searchForm.endDate = timeForMat(29)[1]
-        this.time = timeForMat(29)
-      }
-      this.search()
-    },
-    seleTime (e) {
-      this.searchForm.startDate = e[0]
-      this.searchForm.endDate = e[1]
-      this.searchForm.radio = null
-      this.search()
-    },
-    reset () {
-      this.$refs.searchForm.resetFields()
-      this.searchForm.startDate = ''
-      this.searchForm.endDate = ''
-      this.time = []
-      this.search()
-    }
-  }
-}
-</script>
diff --git a/admin/src/views/business/platformInterfaceLog.vue b/admin/src/views/business/platformInterfaceLog.vue
deleted file mode 100644
index 70b00ca..0000000
--- a/admin/src/views/business/platformInterfaceLog.vue
+++ /dev/null
@@ -1,145 +0,0 @@
-<template>
-    <TableLayout :permissions="['business:interfacelog:query']">
-        <!-- 鎼滅储琛ㄥ崟 -->
-        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-            <el-form-item label="鎺ュ彛鍚嶇О" prop="name">
-                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ユ帴鍙e悕绉�" @keypress.enter.native="search"></el-input>
-            </el-form-item>
-            <el-form-item label="绫诲瀷" prop="type">
-                <el-select v-model="searchForm.type" @change="search" placeholder="璇烽�夋嫨">
-                    <el-option label="璋冪敤" value="0"></el-option>
-                    <el-option label="鎺ㄩ�佹帴鍙�" value="1"></el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item label="璧锋鏃堕棿" prop="startDate">
-                <el-date-picker
-                    @change="seleTime"
-                    v-model="time"
-                    type="datetimerange"
-                    format="yyyy-MM-dd HH:mm:ss"
-                    value-format="yyyy-MM-dd HH:mm:ss"
-                    range-separator="鑷�"
-                    start-placeholder="寮�濮嬫椂闂�"
-                    end-placeholder="缁撴潫鏃堕棿">
-                </el-date-picker>
-            </el-form-item>
-            <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
-                <el-radio-button label="0">褰撳ぉ</el-radio-button>
-                <el-radio-button label="1">杩�7澶�</el-radio-button>
-                <el-radio-button label="2">杩�30澶�</el-radio-button>
-            </el-radio-group>
-            <section>
-                <el-button type="primary" @click="search">鎼滅储</el-button>
-                <el-button @click="reset">閲嶇疆</el-button>
-            </section>
-        </el-form>
-        <!-- 琛ㄦ牸鍜屽垎椤� -->
-        <template v-slot:table-wrap>
-            <el-table
-                v-loading="isWorking.search"
-                :data="tableData.list"
-                stripe
-            >
-                <el-table-column prop="name" label="鎺ュ彛鍚嶇О" min-width="180px"></el-table-column>
-                <el-table-column prop="url" label="鍦板潃淇℃伅" min-width="180px"></el-table-column>
-                <el-table-column label="绫诲瀷" min-width="100px">
-                    <template slot-scope="{row}">
-                        <span v-if="row.type == 0">璋冪敤</span>
-                        <span v-if="row.type == 1">鎺ㄩ�佹帴鏀�</span>
-                    </template>
-                </el-table-column>
-                <el-table-column label="骞冲彴" min-width="100px">
-                    <template slot-scope="{row}">
-                        <span v-if="row.plat == 0">娴峰悍瀹夐槻骞冲彴</span>
-                        <span v-if="row.plat == 1">ERP绯荤粺</span>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="request" label="璇锋眰鍙傛暟" min-width="100px">
-                    <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.operaInterfaceLogWindow.open('璇锋眰鍙傛暟', {content: row.request})">鏌ョ湅</el-button>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="repose" label="鍝嶅簲鍙傛暟" min-width="100px">
-                    <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.operaInterfaceLogWindow.open('鍝嶅簲鍙傛暟', {content: row.repose})">鏌ョ湅</el-button>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-            </el-table>
-            <pagination
-                @size-change="handleSizeChange"
-                @current-change="handlePageChange"
-                :pagination="tableData.pagination"
-            >
-            </pagination>
-        </template>
-        <!-- 鏂板缓/淇敼 -->
-        <OperaInterfaceLogWindow ref="operaInterfaceLogWindow" @success="handlePageChange"/>
-    </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import OperaInterfaceLogWindow from '@/components/business/OperaInterfaceLogWindow'
-import { timeForMat } from '@/utils/util'
-export default {
-  name: 'InterfaceLog',
-  extends: BaseTable,
-  components: { TableLayout, Pagination, OperaInterfaceLogWindow },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        name: '',
-        type: '',
-        endDate: '',
-        startDate: '',
-        radio: '0'
-      },
-      time: []
-    }
-  },
-  created () {
-    this.config({
-      module: '涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍',
-      api: '/business/platformInterfaceLog',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.changeRadio('0')
-  },
-  methods: {
-    changeRadio (e) {
-      if (e === '0') {
-        this.searchForm.startDate = timeForMat(0)[0]
-        this.searchForm.endDate = timeForMat(0)[1]
-        this.time = timeForMat(0)
-      } else if (e === '1') {
-        this.searchForm.startDate = timeForMat(6)[0]
-        this.searchForm.endDate = timeForMat(6)[1]
-        this.time = timeForMat(6)
-      } else if (e === '2') {
-        this.searchForm.startDate = timeForMat(29)[0]
-        this.searchForm.endDate = timeForMat(29)[1]
-        this.time = timeForMat(29)
-      }
-      this.search()
-    },
-    seleTime (e) {
-      this.searchForm.startDate = e[0]
-      this.searchForm.endDate = e[1]
-      this.searchForm.radio = null
-      this.search()
-    },
-    reset () {
-      this.$refs.searchForm.resetFields()
-      this.searchForm.startDate = ''
-      this.searchForm.endDate = ''
-      this.time = []
-      this.search()
-    }
-  }
-}
-</script>
diff --git a/admin/src/views/contract/components/terminateLease.vue b/admin/src/views/contract/components/terminateLease.vue
index 5520b8a..04ed6cf 100644
--- a/admin/src/views/contract/components/terminateLease.vue
+++ b/admin/src/views/contract/components/terminateLease.vue
@@ -249,14 +249,14 @@
             { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
           ]
         },
-        
+
         list: [],
         pickerOptions: {},
         agentList: [],
 
         receivable: '',
         meet: '',
-        
+
         loading: false
       }
     },
@@ -515,7 +515,7 @@
         .main_box {
             width: 100%;
             display: flex;
-            align-items: start;
+            align-items: flex-start;
             margin-bottom: 15px;
             justify-content: space-between;
             .main_box_form {
diff --git a/admin/src/views/roomStatus/index.vue b/admin/src/views/roomStatus/index.vue
index 0bdccb2..88f0ef1 100644
--- a/admin/src/views/roomStatus/index.vue
+++ b/admin/src/views/roomStatus/index.vue
@@ -288,7 +288,7 @@
                                             </div>
                                         </div>
                                         <div class="xm_house_list_right">
-                                            <template v-for="(child, i) in item.roomsList" :key="i">
+                                            <template v-for="(child, i) in item.roomsList" >
                                                 <div class="xm_house_list_right_row" v-for="(childThree, a) in child" :key="a" :style="{ width: childThree.width + 'px', backgroundColor: ifBackground(childThree.roomStatus) }">
                                                     <div class="ft">
                                                         <span>{{childThree.roomCode}}</span>
@@ -305,7 +305,6 @@
                                                     <div class="xm_house_list_right_row_day" v-if="childThree.roomStatus === 0">鏈嚭绉燂綔绌虹疆{{childThree.freeDayAmount}}澶�</div>
                                                 </div>
                                             </template>
-                                            
                                         </div>
                                     </div>
                                 </div>
@@ -498,7 +497,7 @@
                                         <el-table
                                             :data="tableData"
                                             border
-                                            v-lading="loading"
+                                            v-loading="loading"
                                             style="width: 100%">
                                             <el-table-column
                                                 prop="categoryName"
@@ -687,6 +686,7 @@
           label: '榛勯噾绯�'
         }],
         value: '',
+        ids:[],
         form: {
           name: '',
           status: '',
@@ -1246,7 +1246,7 @@
         .box_content {
             width: 100%;
             display: flex;
-            align-items: start;
+            align-items: flex-start;
             justify-content: space-between;
             .left {
                 width: 300px;
diff --git a/admin/src/views/statistics/platformRecord.vue b/admin/src/views/statistics/platformRecord.vue
deleted file mode 100644
index 5659e49..0000000
--- a/admin/src/views/statistics/platformRecord.vue
+++ /dev/null
@@ -1,139 +0,0 @@
-<template>
-  <div class="main_app">
-    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
-    <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="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="100" show-overflow-tooltip />
-      <el-table-column prop="name" label="杩愯緭鍗曞彿/鍚堝悓鍙�" min-width="100" show-overflow-tooltip>
-        <template v-slot="scope">
-          <span>{{ scope.row.billCode || scope.row.contractNum }}</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: 'platformName',
-            type: 'input',
-            label: '鏈堝彴鍚嶇О'
-          },
-          {
-            filed: 'platformGroupId',
-            type: 'select',
-            label: '鏈堝彴缁�',
-            placeholder: '鍏ㄩ儴鏈堝彴缁�',
-            options: []
-          },
-          {
-            filed: 'carCodeFront',
-            type: 'input',
-            label: '杞︾墝鍙�'
-          },
-          {
-            filed: 'selDate',
-            type: 'daterange',
-            label: '鏃ユ湡'
-          }
-        ],
-        online: true
-      }
-    }
-  },
-  created() {
-    this.getList()
-    this.getGroupList()
-  },
-  methods: {
-    handleSub() {
-      this.$refs.ruleForm.validate((valid) => {
-        if (valid) {
-          alert('submit!')
-        }
-      })
-    },
-    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
-      this.getList()
-    }
-  }
-}
-</script>
-
-<style></style>
diff --git a/admin/src/views/statistics/platformStatic.vue b/admin/src/views/statistics/platformStatic.vue
deleted file mode 100644
index 520748a..0000000
--- a/admin/src/views/statistics/platformStatic.vue
+++ /dev/null
@@ -1,139 +0,0 @@
-<template>
-  <div class="main_app">
-    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear">
-      <template #fastdate>
-        <el-radio-group v-model="filters.fastdate" size="small" @input="changeRadio">
-          <el-radio-button label="0">褰撳ぉ</el-radio-button>
-          <el-radio-button label="6">杩�7澶�</el-radio-button>
-          <el-radio-button label="29">杩�30澶�</el-radio-button>
-        </el-radio-group>
-      </template>
-    </QueryForm>
-    <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="name" label="鏈堝彴鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="groupName" label="鏈堝彴缁�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="stopCount" label="鍋滈潬娆℃暟(娆�)" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="workCountTime" label="宸ヤ綔鏃堕暱" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="useRata" label="鏈堝彴浣跨敤鐜�" min-width="100" show-overflow-tooltip />
-    </el-table>
-    <!-- <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" /> -->
-  </div>
-</template>
-
-<script>
-import Pagination from '@/components/common/Pagination'
-import QueryForm from '@/components/common/QueryForm'
-import dayjs from 'dayjs'
-import { platformWorkReportPage, getPlatformGroupList } from '@/api'
-export default {
-  components: {
-    Pagination,
-    QueryForm
-  },
-  data() {
-    return {
-      loading: false,
-      pagination: {
-        pageSize: 10,
-        page: 1,
-        total: 0
-      },
-      filters: {
-        fastdate: 0,
-        selDate: []
-      },
-      list: [],
-      total: 0,
-      queryFormConfig: {
-        formItems: [
-          {
-            filed: 'name',
-            type: 'input',
-            label: '鏈堝彴鍚嶇О'
-          },
-          {
-            filed: 'groupId',
-            type: 'select',
-            label: '鏈堝彴缁�',
-            placeholder: '鍏ㄩ儴鏈堝彴缁�',
-            options: []
-          },
-          {
-            type: 'slot',
-            filed: 'fastdate',
-            label: ''
-          },
-          {
-            filed: 'selDate',
-            type: 'daterange',
-            clearable: false,
-            label: '鏃ユ湡'
-          }
-        ],
-        online: true
-      }
-    }
-  },
-  created() {
-    this.changeRadio('0')
-    this.getGroupList()
-  },
-  methods: {
-    changeRadio(day) {
-      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')]
-      this.$set(this.filters, 'selDate', arr)
-      this.getList()
-    },
-    handleSub() {
-      this.$refs.ruleForm.validate((valid) => {
-        if (valid) {
-          alert('submit!')
-        }
-      })
-    },
-    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
-      platformWorkReportPage({
-        ...filters,
-        queryDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-        queryDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
-      }).then(res => {
-        this.loading = false
-        this.list = res || []
-        this.list.forEach(item => {
-          item.useRata = item.useRata + '%'
-          item.workCountTime = item.workCountTime + '鏃�'
-          // item.workTime = dayjs.duration(item.workTime, 'seconds').format('H鏃秏鍒唖绉�')
-        })
-      }, () => {
-        this.loading = false
-      })
-    },
-    clear() {
-      this.filters = {
-        fastdate: 0,
-        selDate: []
-      }
-      this.changeRadio('0')
-    },
-    handleSizeChange(capacity) {
-      this.pagination.pageSize = capacity
-      this.getList()
-    }
-  }
-}
-</script>
-
-<style></style>
diff --git a/server/emaysms/src/main/java/cn/emay/sdk/EmayTool.java b/server/emaysms/src/main/java/cn/emay/sdk/EmayTool.java
index 8d3b9ee..9000dd2 100644
--- a/server/emaysms/src/main/java/cn/emay/sdk/EmayTool.java
+++ b/server/emaysms/src/main/java/cn/emay/sdk/EmayTool.java
@@ -22,6 +22,8 @@
 import cn.emay.sdk.core.dto.sms.response.RetrieveReportResponse;
 import cn.emay.sdk.core.dto.sms.response.SmsResponse;
 import cn.emay.sdk.util.exception.SDKParamsException;
+import cn.emay.sdk.util.json.gson.JsonObject;
+import netscape.javascript.JSObject;
 
 public class EmayTool {
 	private static SmsSDKClient client ;
@@ -43,7 +45,7 @@
 	}
 	public static void main(String[] args) throws SDKParamsException, IOException {
 		new EmayTool("www.btom.cn",8080,"8SDK-EMY-6699-RIXTP","5EA482CE6A904271")
-				.sendSingleSms("15345690849","銆愯眴绫崇鎶�銆戣繖鏄垜浠殑绗竴鏉$煭淇″摝");
+				.sendSingleSms("15345690849","銆愰槣瀹侀槣閾佹姇璧勬湁闄愬叕鍙搞�戣繖鏄垜浠殑绗竴鏉$煭淇″摝");
 		// sendBatchOnlySms();
 		// sendBatchSms();
 		// sendPersonalitySms();
@@ -66,7 +68,7 @@
 		if (result.getCode().equals("SUCCESS")) {
 			System.out.println("璇锋眰鎴愬姛");
 			SmsResponse response = result.getResult();
-			System.out.println("sendSingleSms:" + response.toString());
+			System.out.println("sendSingleSms:" +  response.toString());
 			return  true;
 		} else {
 			System.out.println("璇锋眰澶辫触");
diff --git a/server/emaysms/src/main/java/cn/emay/sdk/util/DateUtil.java b/server/emaysms/src/main/java/cn/emay/sdk/util/DateUtil.java
index 675b4f2..72834e9 100644
--- a/server/emaysms/src/main/java/cn/emay/sdk/util/DateUtil.java
+++ b/server/emaysms/src/main/java/cn/emay/sdk/util/DateUtil.java
@@ -150,13 +150,8 @@
 	 *            姝f暟涔嬪悗鐨勬煇澶╋紝璐熸暟涔嬪墠鏌愬ぉ
 	 * @param type
 	 *            杩斿洖鏁版嵁绫诲瀷锛屽紑濮�00:00:00 缁撴潫 23:59:59鎴栧綋
-	 *
 	 *            ex :
-	 *
-	 *            getOtherDay(new Date(), -1, ""); 鍓嶄竴澶╁綋鍓嶆椂鍒嗙
-	 *
 	 *            getOtherDay(new Date(), -1, "start"); 鍓嶄竴澶╁紑濮嬫椂闂�00:00:00
-	 *
 	 *            getOtherDay(new Date(), -1, "end"); 鍓嶄竴澶╃粨鏉熸椂闂�23:59:59
 	 * @return
 	 */
diff --git a/server/emaysms/src/main/java/cn/emay/sdk/util/GZIPUtils.java b/server/emaysms/src/main/java/cn/emay/sdk/util/GZIPUtils.java
index a0d53e1..e2cf46b 100644
--- a/server/emaysms/src/main/java/cn/emay/sdk/util/GZIPUtils.java
+++ b/server/emaysms/src/main/java/cn/emay/sdk/util/GZIPUtils.java
@@ -56,8 +56,6 @@
 	/**
 	 * 鏁版嵁鍘嬬缉
 	 * 
-	 * @param is
-	 * @param os
 	 * @throws Exception
 	 */
 	public static byte[] compress(byte[] bytes) throws IOException {
@@ -82,8 +80,6 @@
 	
 	/**
 	 * 鏁版嵁瑙e帇
-	 * 
-	 * @param in
 	 * @return
 	 * @throws IOException
 	 */
diff --git a/server/startsh/startup.bat b/server/startsh/startup.bat
new file mode 100644
index 0000000..13fd5be
--- /dev/null
+++ b/server/startsh/startup.bat
@@ -0,0 +1,6 @@
+@echo off
+START "system_gateway" javaw -jar system_gateway.jar
+START "admin_interface" javaw -jar admin_interface.jar
+START "admin_timer" javaw -jar admin_timer.jar
+START "system_timer" javaw -jar system_timer.jar
+pause
\ No newline at end of file
diff --git a/server/system_gateway/src/main/resources/application-dev.yml b/server/system_gateway/src/main/resources/application-dev.yml
index f119388..dc9c91c 100644
--- a/server/system_gateway/src/main/resources/application-dev.yml
+++ b/server/system_gateway/src/main/resources/application-dev.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: doumee
-    password: rtjgfEr@&0c0m
+    url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: Doumee@168
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
 
diff --git a/server/system_gateway/src/main/resources/application-test.yml b/server/system_gateway/src/main/resources/application-test.yml
index cc9c87d..2e7c89c 100644
--- a/server/system_gateway/src/main/resources/application-test.yml
+++ b/server/system_gateway/src/main/resources/application-test.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: doumee
-    password: rtjgfEr@&0c0m
+    url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: Doumee@168
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
 
diff --git a/server/system_gateway/src/main/resources/bootstrap-dev.yml b/server/system_gateway/src/main/resources/bootstrap-dev.yml
index 2066005..a4c7cd6 100644
--- a/server/system_gateway/src/main/resources/bootstrap-dev.yml
+++ b/server/system_gateway/src/main/resources/bootstrap-dev.yml
@@ -1,13 +1,13 @@
 spring:
   cloud:
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
-        namespace: dev_renkang
+        namespace: funingyunwei_dev
         username: nacos
         password: nacos
     gateway:
diff --git a/server/system_gateway/src/main/resources/bootstrap-test.yml b/server/system_gateway/src/main/resources/bootstrap-test.yml
index 351bfe7..4ccd298 100644
--- a/server/system_gateway/src/main/resources/bootstrap-test.yml
+++ b/server/system_gateway/src/main/resources/bootstrap-test.yml
@@ -1,12 +1,12 @@
 spring:
   cloud:
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
-        namespace: funing_test
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        namespace: funingyunwei_test
 #        namespace: dev_renkang
         username: nacos
         password: nacos
diff --git a/server/system_gateway/src/main/resources/bootstrap.yml b/server/system_gateway/src/main/resources/bootstrap.yml
index 8ecd0a5..1375e72 100644
--- a/server/system_gateway/src/main/resources/bootstrap.yml
+++ b/server/system_gateway/src/main/resources/bootstrap.yml
@@ -4,8 +4,8 @@
   application:
     name: system_gateway
   # 瀹夊叏閰嶇疆
-  security:
     # 楠岀鍏挜鍦板潃
+  security:
     oauth2:
       authorizationserver:
         token-uri: https://
\ No newline at end of file
diff --git a/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemRoleBizImpl.java b/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemRoleBizImpl.java
index 33b987b..934227f 100644
--- a/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemRoleBizImpl.java
+++ b/server/system_service/src/main/java/com/doumee/biz/system/impl/SystemRoleBizImpl.java
@@ -22,6 +22,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
@@ -94,14 +95,16 @@
         SystemRolePermission deleteDto = new SystemRolePermission();
         deleteDto.setRoleId(dto.getRoleId());
         systemRolePermissionService.delete(deleteDto);
+        List<SystemRolePermission> newList = new ArrayList<>();
         // 鏂板鏂扮殑鏉冮檺
         for (Integer permissionId : dto.getPermissionIds()) {
             SystemRolePermission newRolePermission = new SystemRolePermission();
             newRolePermission.setRoleId(dto.getRoleId());
             newRolePermission.setPermissionId(permissionId);
             newRolePermission.setCreateUser(dto.getCreateUser());
-            systemRolePermissionService.create(newRolePermission);
+            newList.add(newRolePermission);
         }
+        systemRolePermissionService.createList(newList);
     }
 
     @Override
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 29ead0a..528e092 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
@@ -50,6 +50,8 @@
     public static final String HK_HOST ="HK_HOST" ;
     public static final String HK_APPKEY ="HK_APPKEY" ;
     public static final String LOGIN_OUT_URL ="LOGIN_OUT" ;
+
+    public static  boolean DEALING_DUANLUQI_CLOSE = false;
     public static final String HK_APPSECRET ="HK_APPSECRET" ;
     public static final String HK_HTTPS ="HK_HTTPS" ;
     public static final String HK_PUSH_URL = "HK_PUSH_URL";
@@ -108,7 +110,16 @@
     public static final String INTERVAL = "INTERVAL";
     public static final String USE_CAR_TAKE_CARE = "USE_CAR_TAKE_CARE";
 
-
+    //绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱鐐� 4骞挎挱璁惧 5鏂矾鍣ㄧ┖寮� 6鐢佃〃
+    public interface DEVICE_TYPE{
+        public static final  int door = 0;
+        public static final  int park = 1;
+        public static final  int led = 2;
+        public static final  int broadcaset = 3;
+        public static final  int broadcasetChannel = 4;
+        public static final  int duanluqi = 5;
+        public static final  int dianbiao = 6;
+    }
 
 
     // 鍔冲姟鏉ヨ閰嶇疆
@@ -159,6 +170,11 @@
     public static final String EVENT_FILES_PRIVATE_DOMAIN ="EVENT_FILES_PRIVATE_DOMAIN" ;
     public static final String EVENT_FILES_PUBLIC_DOMAIN ="EVENT_FILES_PUBLIC_DOMAIN" ;
     public static final String YW_CONTRACT_FILE = "YW_CONTRACT_FILE";
+    public static final String XUNJIAN ="XUNJIAN" ;
+    public static final String XJ_POINT_PREFIX ="XJ_POINT_PREFIX" ;
+    public static final String XJ_POINT_CODE_LENGTH ="XJ_POINT_CODE_LENGTH" ;
+    public static final String XJ_POINT_QRCODE_URL ="XJ_POINT_QRCODE_URL" ;
+    public static final String XJ_RERIRECT_URI ="XJ_RERIRECT_URI" ;
     public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
     public static  boolean DEALING_HK_SYNCDEVICE = false;
     public static  boolean DEALING_HK_SYNCPLATFORM = false;
@@ -250,6 +266,12 @@
 
         return sb.toString();
     }
+
+    public static String formartNumString(int length, long l) {
+
+        return  String.format("%0"+length+"d",l );
+    }
+
     public interface VisitIccmStatus{
         //璁垮鐘舵��(0:鏈鍒�,1:宸茬鍒�,2:宸茬閫�,3:婊炵暀,4:鏈闂�,5:鑷姩绛剧,6:鏈閫�)
         int waitSign = 0;
@@ -508,6 +530,7 @@
 
     public static final String WX_PLATFORM = "WX_PLATFORM";
     public static final String WX_PLATFORM_ACCESS_TOKEN = "WX_PLATFORM_ACCESS_TOKEN";
+    public static final String WX_AUTH_URL = "WX_AUTH_URL";
     public static final String WX_PLATFORM_APPID = "WX_PLATFORM_APPID";
     public static final String WX_PLATFORM_SECRET = "WX_PLATFORM_SECRET";
     public static final String WX_PLATFORM_AUDIT_VISIT = "WX_PLATFORM_AUDIT_VISIT";
@@ -809,8 +832,8 @@
     }
 
     public static void main(String[] args) {
-        System.out.println(Constants.checkCarNo("鐨朅10991"));
-        System.out.println(Constants.checkCarNo("鐨朅A10991"));
+        System.out.println(Constants.formartNumString(8,1023492384023480l));
+//        System.out.println(Constants.checkCarNo("鐨朅A10991"));
 //        System.out.println(Constants.getVehiclePlateNo("婀楤140D17").getDescription());
 //        System.out.println(Constants.getVehiclePlateNo("瀹緼P0637").getDescription());
 
diff --git a/server/system_service/src/main/java/com/doumee/dao/system/dto/ImportMaterialDTO.java b/server/system_service/src/main/java/com/doumee/dao/system/dto/ImportMaterialDTO.java
new file mode 100644
index 0000000..716e7b5
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/dao/system/dto/ImportMaterialDTO.java
@@ -0,0 +1,60 @@
+package com.doumee.dao.system.dto;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/05/04 18:21
+ */
+@Data
+@ApiModel("瀵煎叆鐗╂枡淇℃伅")
+public class ImportMaterialDTO {
+
+    @ApiModelProperty(value = "鐗╂枡缂栧彿")
+    @ExcelColumn(name="鐗╂枡缂栧彿",index = 0,width = 10)
+    private String code;
+
+    @ApiModelProperty(value = "鐗╂枡鍚嶇О")
+    @ExcelColumn(name="鐗╂枡鍚嶇О",index = 1,width = 10)
+    private String name;
+
+    @ApiModelProperty(value = "鐗╂枡鍒嗙被")
+    @ExcelColumn(name="鐗╂枡鍒嗙被",index = 2,width = 10)
+    private String categoryName;
+
+    @ApiModelProperty(value = "鐗╂枡瀛愬垎绫�")
+    @ExcelColumn(name="鐗╂枡瀛愬垎绫�",index = 3,width = 10)
+    private String categoryChildName;
+
+    @ApiModelProperty(value = "鏉$爜")
+    @ExcelColumn(name="鏉$爜",index = 4,width = 10)
+    private String qrcode;
+
+    @ApiModelProperty(value = "鍝佺墝")
+    @ExcelColumn(name="鍝佺墝",index = 5,width = 10)
+    private String brand;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    @ExcelColumn(name="瑙勬牸鍨嬪彿",index = 6,width = 10)
+    private String attr;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    @ExcelColumn(name="鍗曚綅",index = 7,width = 10)
+    private String unitName;
+
+    @ApiModelProperty(value = "瀹夊叏搴撳瓨锛堜笅闄愶級", example = "1")
+    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笅闄愶級",index = 8,width = 16)
+    private BigDecimal minStock;
+
+    @ApiModelProperty(value = "瀹夊叏搴撳瓨锛堜笂闄愶級", example = "1")
+    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笂闄愶級",index = 9,width = 16)
+    private BigDecimal maxStock;
+
+
+
+}
diff --git a/server/system_service/src/main/java/com/doumee/service/system/SystemRolePermissionService.java b/server/system_service/src/main/java/com/doumee/service/system/SystemRolePermissionService.java
index b3fcb94..3eea8fc 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/SystemRolePermissionService.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/SystemRolePermissionService.java
@@ -88,4 +88,6 @@
      * @date 2023/03/21 14:49
      */
     long count(SystemRolePermission systemRolePermission);
+
+    Integer createList(List<SystemRolePermission> newList);
 }
diff --git a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java
index da0131d..8f6bee6 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java
@@ -34,6 +34,14 @@
         systemRolePermissionMapper.insert(systemRolePermission);
         return systemRolePermission.getId();
     }
+    @Override
+    public Integer createList(List<SystemRolePermission> list) {
+        if(list ==null || list.size() == 0){
+            return null;
+        }
+        systemRolePermissionMapper.insert(list);
+        return list.size();
+    }
 
     @Override
     public void deleteById(Integer id) {
diff --git a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
index 3dd4077..3a31274 100644
--- a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
+++ b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
@@ -98,4 +98,11 @@
     @GetMapping("/timer/yw/ywPatrolSchemeTaskTimer")
     ApiResponse ywPatrolSchemeTaskTimer();
 
+    @ApiOperation("銆愰槣瀹佽繍缁淬�戝畾鏃舵洿鏂版埧婧愮璧佺姸鎬�")
+    @GetMapping("/timer/yw/ywRoomStatusTimer")
+    ApiResponse ywRoomStatusTimer();
+
+
+
+
 }
diff --git a/server/system_timer/src/main/resources/application-dev.yml b/server/system_timer/src/main/resources/application-dev.yml
index 5ad7897..938c527 100644
--- a/server/system_timer/src/main/resources/application-dev.yml
+++ b/server/system_timer/src/main/resources/application-dev.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: doumee
-    password: rtjgfEr@&0c0m
+    url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: Doumee@168
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
   redis:
diff --git a/server/system_timer/src/main/resources/application-pro.yml b/server/system_timer/src/main/resources/application-pro.yml
index ee05abc..9ef34e8 100644
--- a/server/system_timer/src/main/resources/application-pro.yml
+++ b/server/system_timer/src/main/resources/application-pro.yml
@@ -11,10 +11,7 @@
     time-zone: GMT+8
     date-format: yyyy-MM-dd HH:mm:ss
 
-
-
 debug_model: false
-
 captcha_check: true
 
 # Swagger閰嶇疆
diff --git a/server/system_timer/src/main/resources/application-test.yml b/server/system_timer/src/main/resources/application-test.yml
index 55107e2..9d47502 100644
--- a/server/system_timer/src/main/resources/application-test.yml
+++ b/server/system_timer/src/main/resources/application-test.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: doumee
-    password: rtjgfEr@&0c0m
+    url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: Doumee@168
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
   redis:
diff --git a/server/system_timer/src/main/resources/bootstrap-dev.yml b/server/system_timer/src/main/resources/bootstrap-dev.yml
index 53c54ce..21ef2c5 100644
--- a/server/system_timer/src/main/resources/bootstrap-dev.yml
+++ b/server/system_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       #      config:
@@ -22,7 +22,7 @@
       #        group: dev
       #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
-        namespace: dev_renkang
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        namespace: funingyunwei_dev
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/system_timer/src/main/resources/bootstrap-test.yml b/server/system_timer/src/main/resources/bootstrap-test.yml
index 13e1c1c..4e04742 100644
--- a/server/system_timer/src/main/resources/bootstrap-test.yml
+++ b/server/system_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
       #      config:
@@ -22,7 +22,7 @@
       #        group: dev
       #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
-        namespace: funing_test
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        namespace: funingyunwei_test
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/system_timer/src/main/resources/bootstrap.yml b/server/system_timer/src/main/resources/bootstrap.yml
index 05a83ce..107b53b 100644
--- a/server/system_timer/src/main/resources/bootstrap.yml
+++ b/server/system_timer/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: pro
+    active: dev
   application:
     name: systemTimer
     # 瀹夊叏閰嶇疆
diff --git a/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
index eda709f..4d0d49f 100644
--- a/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
+++ b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
@@ -83,6 +83,17 @@
     }
 
 
+
+    @ApiOperation("瀹氭椂鏇存柊鎴挎簮绉熻祦鐘舵��")
+    @GetMapping("/ywRoomStatusTimer")
+    public ApiResponse ywRoomStatusTimer() {
+        ywContractService.updRentContractStatus();
+        ywContractService.updRoomLeaseNowStatus();
+        return ApiResponse.success("瀹氭椂鏇存柊鎴挎簮绉熻祦鐘舵�佷换鍔℃墽琛屼腑");
+    }
+
+
+
     @ApiOperation("瀹氭椂鏇存柊redis鏁版嵁")
     @GetMapping("/ywUpdRedisDataTimer")
     public ApiResponse ywUpdRedisDataTimer() {
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
index 700974a..0c21840 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
-        namespace: dev_renkang
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        namespace: funingyunwei_dev
         username: nacos
         password: nacos
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-test.yml b/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
index dd58dce..d5944e2 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
-        namespace: funing_test
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        namespace: funingyunwei_test
         username: nacos
         password: nacos
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java
index 43cf1d2..8cf21fe 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java
@@ -19,6 +19,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+
 /**
  * @author 姹熻箘韫�
  * @date 2023/11/30 15:33
@@ -36,25 +37,55 @@
     @PostMapping("/create")
     @CloudRequiredPermission("business:device:create")
     public ApiResponse create(@RequestBody Device device,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        device.setLoginUserInfo(this.getLoginUser(token));
         return ApiResponse.success(deviceService.create(device));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:device:delete")
-    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
-        deviceService.deleteById(id);
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        deviceService.deleteById(id,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
     @ApiOperation("淇敼鏄惁闂ㄧ鍏ュ彛")
     @PostMapping("/updateEntranceById")
-    @CloudRequiredPermission("business:company:update")
+    @CloudRequiredPermission("business:device:update")
     public ApiResponse updateStatusById(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         Device d = new Device();
         d.setId(param.getId());
         d.setEditDate(new Date());
         d.setIsEntrance(Constants.formatIntegerNum(param.getIsEntrance()));
+        d.setLoginUserInfo(this.getLoginUser(token));
         deviceService.updateById(d);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("淇敼鏄惁绯荤粺浣跨敤")
+    @PostMapping("/updateUsedById")
+    @CloudRequiredPermission("business:device:update")
+    public ApiResponse updateUsedById(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        Device d = new Device();
+        d.setId(param.getId());
+        d.setEditDate(new Date());
+        d.setLoginUserInfo(this.getLoginUser(token));
+        d.setIsUsed(Constants.formatIntegerNum(param.getIsUsed()));
+        deviceService.updateUsedById(d);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鎵ц鐢佃〃寮�鍏抽椄鎿嶄綔")
+    @PostMapping("/dianbaoCmd")
+    @CloudRequiredPermission("business:device:update")
+    public ApiResponse dianbaoCmd(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        param.setLoginUserInfo(this.getLoginUser(token));
+        deviceService.dianbaoCmd(param);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("璇诲彇鐢佃〃鏁版嵁锛堢數鑳姐�佹椂闂村拰鐘舵�侊級")
+    @PostMapping("/dianbiaoData")
+    @CloudRequiredPermission("business:device:update")
+    public ApiResponse dianbiaoData(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        param.setLoginUserInfo(this.getLoginUser(token));
+        deviceService.dianbiaoData(param);
         return ApiResponse.success(null);
     }
 
@@ -67,7 +98,7 @@
         for (String id : idArray) {
             idList.add(Integer.valueOf(id));
         }
-        deviceService.deleteByIdInBatch(idList);
+        deviceService.deleteByIdInBatch(idList,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
 
@@ -75,6 +106,8 @@
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:device:update")
     public ApiResponse updateById(@RequestBody Device device,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+
+        device.setLoginUserInfo(this.getLoginUser(token));
         deviceService.updateById(device);
         return ApiResponse.success(null);
     }
@@ -82,9 +115,15 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:device:query")
-    public ApiResponse<PageData<Device>> findPage (@RequestBody PageWrap<Device> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+    public ApiResponse<PageData<Device>> findPage (@RequestBody PageWrap<Device> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         return ApiResponse.success(deviceService.findPage(pageWrap));
     }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:device:query")
+    public ApiResponse<List<Device>> findPage (@RequestBody   Device model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(deviceService.findList(model));
+    }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceDataCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceDataCloudController.java
new file mode 100644
index 0000000..bc050bd
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceDataCloudController.java
@@ -0,0 +1,43 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.DeviceData;
+import com.doumee.service.business.DeviceDataService;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Api(tags = "璁惧鏁版嵁淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/deviceData")
+public class DeviceDataCloudController extends BaseController {
+
+    @Autowired
+    private DeviceDataService deviceDataService;
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:device:query")
+    public ApiResponse<PageData<DeviceData>> findPage (@RequestBody PageWrap<DeviceData> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(deviceDataService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:device:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<DeviceData> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        ExcelExporter.build(DeviceData.class).export(deviceDataService.findPage(pageWrap).getRecords(), "璁惧淇℃伅琛�", response);
+    }
+}
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 1d6d9d6..4916c65 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
@@ -14,6 +14,7 @@
 import com.doumee.dao.business.vo.YwContractBillCallDataVO;
 import com.doumee.dao.business.vo.YwContractBillDataVO;
 import com.doumee.service.business.YwContractBillService;
+import com.doumee.service.business.YwContractService;
 import com.doumee.service.business.impl.SmsEmailServiceImpl;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -38,6 +39,9 @@
 
     @Autowired
     private SmsEmailServiceImpl smsEmailService;
+
+    @Autowired
+    private YwContractService ywContractService;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -129,6 +133,15 @@
         return ApiResponse.success("鐢熸垚鎴愬姛");
     }
 
+    @LoginNoRequired
+    @ApiOperation("鏇存柊鎴挎簮绉熻祦鐘舵��")
+    @GetMapping("/dealRoomStatus")
+    public ApiResponse dealRoomStatus() {
+        ywContractService.updRentContractStatus();
+        ywContractService.updRoomLeaseNowStatus();
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
     @ApiOperation("鑾峰彇寰呭鐞嗚处鍗�")
     @GetMapping("/getWaitDealList")
     @CloudRequiredPermission("business:ywcontractbill:query")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java
index 4470c79..1929afc 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwMaterialController.java
@@ -10,13 +10,15 @@
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.YwMaterial;
 import com.doumee.service.business.YwMaterialService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import io.swagger.annotations.*;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
 import javax.servlet.http.HttpServletResponse;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -91,7 +93,7 @@
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:ywmaterial:exportExcel")
     public void exportExcel (@RequestBody PageWrap<YwMaterial> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
-        ExcelExporter.build(YwMaterial.class).export(ywMaterialService.findPage(pageWrap).getRecords(), "杩愮淮璧勪骇淇℃伅琛�", response);
+        ExcelExporter.build(YwMaterial.class).export(ywMaterialService.findPage(pageWrap).getRecords(), "鐗╂枡淇℃伅琛�", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
@@ -100,4 +102,15 @@
     public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(ywMaterialService.getDetail(id));
     }
+
+
+    @ApiOperation("鐗╂枡淇℃伅瀵煎叆")
+    @PostMapping("/importMaterialBatch")
+    @CloudRequiredPermission("business:ywmaterial:query")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+    })
+    public ApiResponse importMaterialBatch(@ApiParam(value = "file") MultipartFile file,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(ywMaterialService.importMaterialBatch(file,getLoginUser(token)));
+    }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java
index af02236..94e9c2c 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolPointCloudController.java
@@ -12,6 +12,7 @@
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import com.doumee.config.annotation.CloudRequiredPermission;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -70,6 +71,14 @@
         return ApiResponse.success(null);
     }
 
+    @ApiOperation("鎵归噺瀵煎嚭浜岀淮鐮�")
+    @PostMapping("/exportQrcodes")
+    @CloudRequiredPermission("business:ywpatrolpoint:qrcode")
+    public void exportQrcodes(@RequestBody YwPatrolPoint ywPatrolPoint,HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ywPatrolPointService.exportQrcodes(ywPatrolPoint.getId(),response);
+    }
+
+
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:ywpatrolpoint:query")
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
index d9853fc..96054ed 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,9 +22,9 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
 #        namespace: dmvisit
-        namespace: dev_renkang
+        namespace: funingyunwei_dev
         username: nacos
         password: nacos
 # swagger閰嶇疆
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
index ab2c361..385cbc6 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@
         # 鏆傛椂鍏抽棴缂撳瓨
         enabled: false
     nacos:
-      server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
+      server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
       username: nacos
       password: nacos
 #      config:
@@ -22,7 +22,7 @@
 #        group: dev
 #        data-id: com.doumee.meeting.admin
       discovery:
-        server-addr: http://175.27.187.84:8848 #閰嶇疆Nacos鍦板潃
-        namespace: funing_test
+        server-addr: http://192.168.0.7:8848 #閰嶇疆Nacos鍦板潃
+        namespace: funingyunwei_test
         username: nacos
         password: nacos
\ No newline at end of file
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/device/WaterElectricityUtil.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/device/WaterElectricityUtil.java
new file mode 100644
index 0000000..682394d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/device/WaterElectricityUtil.java
@@ -0,0 +1,600 @@
+package com.doumee.core.device;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class WaterElectricityUtil {
+
+
+    private static double parseBcdToDouble(byte[] bcdBytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bcdBytes) {
+            sb.append(String.format("%02X", b));
+        }
+        try {
+            return Double.parseDouble(sb.toString());
+        } catch (NumberFormatException e) {
+            return 0.0;
+        }
+    }
+
+    private static byte[] reverseAddress(String address) {
+        byte[] result = new byte[6];
+        for (int i = 0; i < 6; i++) {
+            if (i * 2 + 1 < address.length()) {
+                String hex = address.substring(i * 2, Math.min((i + 1) * 2, address.length()));
+                result[i] = (byte) Integer.parseInt(hex, 16);
+            }
+        }
+        return result;
+    }
+
+    private static byte calculateChecksum(byte[] data, int offset, int length) {
+        int sum = 0;
+        for (int i = offset; i < offset + length; i++) {
+            sum += data[i] & 0xFF;
+        }
+        return (byte) (sum & 0xFF);
+    }
+
+    private static byte[] hexStringToByteArray(String hex) {
+        int len = hex.length();
+        byte[] data = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16));
+        }
+        return data;
+    }
+
+    public static byte calcCS(byte[] data) {
+        int sum = 0;
+        for (byte b : data) {
+            sum += b & 0xFF;
+        }
+        return (byte) (sum & 0xFF);
+    }
+
+
+    public static byte[] getRequestParam(int feCount, byte[] address, byte control, byte[] data) throws IOException {
+
+        ///FEFEFE    68  999999999999    68  01  02  65  F3C1  16
+//        byte b = (byte) 0xFE;
+//        byte[] msg = {(byte) 0xFE,0x68};
+        ByteArrayOutputStream frame = new ByteArrayOutputStream();
+        for (int i = 0; i < feCount; i++) {
+            frame.write(0xFE);
+        }
+        // 2. 甯ц捣濮嬬
+        frame.write(0x68);
+        // 3. 鍦板潃鍩�
+        frame.write(address);
+        // 4. 鍐嶆甯ц捣濮嬬
+        frame.write(0x68);
+        // 5. 鎺у埗鐮�
+        frame.write(control);
+        // 6. 鏁版嵁闀垮害
+        frame.write(data.length);
+        // 7. 鏁版嵁鍩�
+        frame.write(data);
+        // 8. 璁$畻 CS锛堜粠绗竴涓� 68 寮�濮嬶級
+        byte[] csData = frame.toByteArray();
+        int start = feCount; // 绗竴涓� 68 鐨勪綅缃�
+        byte cs = calcCS(Arrays.copyOfRange(csData, start, csData.length));
+        frame.write(cs);
+        // 9. 缁撴潫绗�
+        frame.write(0x16);
+        return frame.toByteArray();
+    }
+
+
+    private static byte[] readDeviceData(String ip, int port, byte[] data) {
+        Socket socket = null;
+        try {
+            socket = new Socket(ip, port);
+            socket.setSoTimeout(5000);
+            java.io.OutputStream out = socket.getOutputStream();
+            java.io.InputStream in = socket.getInputStream();
+            out.write(data);
+            out.flush();
+            // 璇诲彇鍝嶅簲
+            byte[] buffer = new byte[2048];
+            int bytesRead = in.read(buffer);
+            byte[] response = Arrays.copyOf(buffer, bytesRead);
+            // 瑙f瀽鍝嶅簲鏁版嵁
+            return response;
+        } catch (Exception e) {
+//            e.printStackTrace();
+            throw new RuntimeException("Failed to read from device", e);
+        } finally {
+            if (socket != null) {
+                try {
+                    socket.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    private static String bytesToHex(byte[] bytes) {
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : bytes) {
+            String hex = String.format("%02X", b & 0xFF);
+            hexString.append(hex);
+        }
+        return hexString.toString();
+    }
+
+    /**
+     * 灏�12浣嶅崄杩涘埗鍦板潃杞崲涓�6瀛楄妭BCD灏忕搴忓湴鍧�
+     *
+     * @param decimalAddress 12浣嶅崄杩涘埗鍦板潃瀛楃涓�
+     * @return 6瀛楄妭鐨凚CD鍦板潃锛堝皬绔簭锛�
+     */
+    private static byte[] convertToBCDAddress(String decimalAddress) {
+        // 1. 楠岃瘉杈撳叆
+        if (decimalAddress == null || decimalAddress.length() != 12) {
+            throw new IllegalArgumentException("鍦板潃蹇呴』鏄�12浣嶅崄杩涘埗鏁�");
+        }
+        if (!decimalAddress.matches("\\d{12}")) {
+            throw new IllegalArgumentException("鍦板潃蹇呴』鍏ㄩ儴鏄暟瀛�");
+        }
+        // 2. 鍑嗗缁撴灉鏁扮粍锛�6瀛楄妭锛�
+        byte[] result = new byte[6];
+        // 3. 浠庡彸鍚戝乏姣�2浣嶄竴缁勫鐞嗭紙灏忕搴忥級
+        for (int i = 0; i < 6; i++) {
+            // 璁$畻鍦ㄥ瓧绗︿覆涓殑浣嶇疆锛堜粠鍙冲悜宸︼級
+            int strIndex = 10 - (i * 2);  // 鍥犱负瑕佸彇涓や綅锛屾墍浠ユ槸10,8,6,4,2,0
+            String twoDigits = decimalAddress.substring(strIndex, strIndex + 2);
+            // 灏嗕袱浣嶅崄杩涘埗鏁拌浆鎹负BCD瀛楄妭
+            // 渚嬪锛�"25" -> 0x25
+            result[i] = (byte) Integer.parseInt(twoDigits, 16);
+        }
+        // 娉ㄦ剰锛氫笂闈㈢殑寰幆椤哄簭宸茬粡鏄皬绔簭锛宺esult[0]瀛樼殑鏄渶浣庝袱浣�
+        return result;
+    }
+
+
+    private static String subByte(String value, byte sub) {
+        byte b = (byte) Integer.parseInt(value, 16);
+        int result = (b & 0xFF) - (sub & 0xFF);
+        // 纭繚缁撴灉鍦�0-255鑼冨洿鍐咃紙澶勭悊璐熸暟锛�
+        if (result < 0) {
+            result += 256;
+        }
+        String hexResult = String.format("%02X", result & 0xFF);
+        return hexResult;
+
+    }
+    private static String addByte(String value, byte add) {
+        byte b = (byte) Integer.parseInt(value, 16);
+        int result = (b & 0xFF) + (add & 0xFF);
+        // 纭繚缁撴灉鍦�0-255鑼冨洿鍐咃紙澶勭悊璐熸暟锛�
+        if (result < 0) {
+            result += 256;
+        }
+        String hexResult = String.format("%02X", result & 0xFF);
+        return hexResult;
+
+    }
+
+
+    private static String[] parseSub33Reverse(String msg, int n) {
+        //33333333  3333
+        String[] nArr = new String[n];
+
+        byte _33 = 0x33;
+        for (int i = 0; i < n; i++) {
+            int index = i * 2;
+            String twoDigits = msg.substring(index, index + 2);
+            String hexResult = subByte(twoDigits, _33);
+            // 鍙嶅悜瀛樺偍锛歯Arr[n - i - 1] 瀹炵幇鍙嶈浆
+            nArr[n - i - 1] = hexResult;
+        }
+        return nArr;
+    }
+
+
+    public static Map<String, Object> water(String ip, int port, String address) throws IOException {
+        byte[] address_buf = convertToBCDAddress(address);
+        byte control = 0x01;
+        byte[] data = {0x43, (byte) 0xC3};
+        byte[] bufReq = getRequestParam(3, address_buf, control, data);
+        byte[] resp = readDeviceData(ip, port, bufReq);
+        String hex = bytesToHex(resp);
+
+        //FEFEFE6899254652010068810843C3333433333333E916
+//        System.out.println(hex);
+        String msg = hex.substring(30, 30 + 8 + 4);
+
+        String[] nArr = parseSub33Reverse(msg, 4);
+        Double total = strArrNum(nArr);
+        Map<String, Object> r = new HashMap<>();
+        r.put("total", total);
+
+        msg = hex.substring(40, 40 + 2);
+        byte sub = 0x33;
+        String hexResult = subByte(msg, sub);
+        String v = hexToBinary(hexResult);
+        /**
+         * Y0.B0銆�瀛樺偍鍣ㄧ姸鎬� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B1銆�闃�闂ㄧ姸鎬� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B2銆�淇″彿鐘舵�� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B3銆�鐢垫睜鐘舵�� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B4銆�淇濈暀锛�
+         * Y0.B5銆�淇濈暀锛�
+         * Y0.B6銆�姘磋〃閫氳鐘舵�侊紙 1:鏁呴殰,0:姝e父锛夛紱
+         * Y0.B7銆�闃�闂ㄥ紑鍏崇姸鎬� (1: 鍚�,0:寮�)锛�
+         * 娉ㄦ剰锛氱姸鎬佷綅鏃犳椂涓� 0锛堟甯革級
+         * 绾㈣壊锛氭棤璁板繂鐩磋琛ㄧ殑鐘舵��
+         */
+
+        r.put("status", v);
+        return r;
+    }
+
+
+    private static void electricityTotal(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException {
+        byte control = 0x11;
+        byte[] data = {0x33, 0x33, 0x33, 0x33};
+
+        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+        byte[] respBuf = readDeviceData(ip, port, bufReq);
+        String resp = bytesToHex(respBuf);
+        String msg = resp.substring(28 + 8, 28 + 8 + 8);
+        String[] nArr = parseSub33Reverse(msg, 4);
+        Double total = strArrNum(nArr);
+        map.put("total", total);
+    }
+
+    /**
+     * 鐢佃〃璺抽椄銆佸悎闂�
+     * @param ip
+     * @param port
+     * @param addressBuf
+     * @param type 锛�0璺抽椄 1鍚堥椄锛�
+     * @param date 鏈夋晥鎴鏃堕棿
+     * @throws IOException
+     */
+    private static boolean electricityControl(String ip, int port, byte[] addressBuf,int type,  String date)   {
+        /**
+         * N1涓烘帶鍒跺懡浠ょ被鍨嬶紝N1=1AH浠h〃璺抽椄4D锛孨1=1BH浠h〃鍚堥椄4F鍏佽N2淇濈暀
+         * 鏉冮檺瀵嗙爜鎿嶄綔浠g爜锛歅AP2P1P0C3C2C1C0(02/223203/111111H)
+         * 4F
+         * TCP/IP鐩存帴鍚堥椄鎸囦护[2026骞�03鏈�09鏃� 10:57:39]
+         * Tx ->FEFEFEFE68615121010000681C1035366555776655444F33568843433659E016
+         * TCP/IP鐩存帴鍚堥椄鎸囦护[2026骞�03鏈�09鏃� 10:57:40]
+         * Rx <-FEFEFEFE68615121010000689C004016
+         * 鐩存帴鍚堥椄鎵ц鎴愬姛锛� 9C
+         */
+        try {
+            byte control = 0x1C;
+            byte n1 =  0x4D;
+            if(type==1){
+                n1 =  0x4F;
+            }
+//        byte[] data0 = {0x02, 0x03, 0x32, 0x22,0x44,0x33,0x22,0x11};
+            byte[] data = {0x35, 0x36, 0x65, 0x55,0x77,0x66,0x55,0x44,n1,0x33,0,0,0,0,0,0};
+            byte[] data2 = getDateBytes(date);
+            for (int i = 0; i < data2.length; i++) {
+                data[10+i]=data2[i];
+            }
+            byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+            String reqt = bytesToHex(bufReq);
+            System.out.println(reqt);
+            byte[] respBuf = readDeviceData(ip, port, bufReq);
+            String resp = bytesToHex(respBuf);
+            System.out.println(resp);
+            //FEFEFEFE68379707010000689C004216
+             String msg = resp.substring(24, 26);
+             return msg.equals("9C");
+        }catch (Exception e){
+
+        }
+        return  false;
+    }
+
+    private static byte[] getDateBytes(String dateStr) {
+//        String dateStr = new SimpleDateFormat("yyyyMMddHHmmss").format(date);
+        dateStr = dateStr.substring(2);
+        // 1. 楠岃瘉杈撳叆
+        if (dateStr == null || dateStr.length() != 12) {
+            throw new IllegalArgumentException("鏃堕棿蹇呴』鏄�12浣嶅崄杩涘埗鏁�");
+        }
+        if (!dateStr.matches("\\d{12}")) {
+            throw new IllegalArgumentException("鏃堕棿蹇呴』鍏ㄩ儴鏄暟瀛�");
+        }
+        // 2. 鍑嗗缁撴灉鏁扮粍锛�6瀛楄妭锛�
+        byte[] result = new byte[6];
+        // 3. 浠庡彸鍚戝乏姣�2浣嶄竴缁勫鐞嗭紙灏忕搴忥級
+        byte add = 0x33;
+        for (int i = 0; i < 6; i++) {
+            // 璁$畻鍦ㄥ瓧绗︿覆涓殑浣嶇疆锛堜粠鍙冲悜宸︼級
+            int strIndex = 10 - (i * 2);  // 鍥犱负瑕佸彇涓や綅锛屾墍浠ユ槸10,8,6,4,2,0
+            String twoDigits = dateStr.substring(strIndex, strIndex + 2);
+            // 灏嗕袱浣嶅崄杩涘埗鏁拌浆鎹负BCD瀛楄妭
+            // 渚嬪锛�"25" -> 0x25
+            int t = Integer.parseInt(twoDigits, 16);
+            int t1 =   ( t& 0xFF) + (add & 0xFF);
+            System.out.println(t1+":");
+            result[i] =(byte) t1 ;
+        }
+        // 娉ㄦ剰锛氫笂闈㈢殑寰幆椤哄簭宸茬粡鏄皬绔簭锛宺esult[0]瀛樼殑鏄渶浣庝袱浣�
+        return result;
+    }
+
+
+    private static void electricityStatus(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException {
+        byte control = 0x11;
+        byte[] data = {0x36, 0x38, 0x33, 0x37};
+        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+        byte[] respBuf = readDeviceData(ip, port, bufReq);
+        String resp = bytesToHex(respBuf);
+        String msg = resp.substring(36, 36 + 4);
+        System.out.println(resp);
+        String[] nArr = parseSub33Reverse(msg, 2);
+        String status = hexToBinary1(nArr);
+//        String resp = "FEFEFEFE   68  615121010000    68  91  06  36383337    3333    7916";
+        map.put("status", status);
+    }
+
+    private static void electricityTime(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException {
+        byte control = 0x11;
+        byte[] data = {0x3F, 0x34, 0x33, 0x37};
+        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+        byte[] respBuf = readDeviceData(ip, port, bufReq);
+        String resp = bytesToHex(respBuf);
+        String msg = resp.substring(36, 36 + 14);
+//        System.out.println(msg);
+        String[] nArr = parseSub33Reverse(msg, 7);
+        String ts = hexToBinary1(nArr);
+        String time = "20"+ts.substring(0,6)+ts.substring(8);
+        Date date = getDateByStr(time);
+        System.out.println( formatData(date));
+//        String resp = "FEFEFEFE   68  615121010000    68  91  06  36383337    3333    7916";
+        map.put("time", date);
+//        map.put("currentTime", formatData(date));
+    }
+    public static Date getDateByStr(String date)  {
+        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+        if(date!=null ){
+            int i = date.indexOf("+");
+            if(i >0){
+                date = date.substring(0,i);
+            }
+        }
+        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
+        df.setTimeZone(tz);
+        Date dates = null;
+        try {
+            dates = df.parse(date);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dates;
+    }
+    public static String formatData(Date date)  {
+        DateFormat df = new SimpleDateFormat("yyyy骞碝M鏈坉d鏃H鏃秏m鍒唖s绉�");
+        try {
+            return  df.format(date);
+        } catch (Exception e) {
+        }
+        return null;
+    }
+
+    public static Map<String, Object> electricityData(String ip, int port, String address) throws IOException {
+        Map<String, Object> r = new HashMap<>();
+        byte[] addressBuf = convertToBCDAddress(address);
+        electricityTotal(ip, port, addressBuf, r);
+        electricityStatus(ip, port, addressBuf, r);
+        electricityTime(ip, port, addressBuf, r);
+        return r;
+    }
+    public static boolean electricityAct(String ip, int port, String address,int type,String dateStr) {
+        Map<String, Object> r = new HashMap<>();
+        byte[] addressBuf = convertToBCDAddress(address);
+       return electricityControl(ip,port,addressBuf,type,dateStr);
+    }
+    private static String hexToBinary(String hex) {
+        StringBuilder sb = new StringBuilder();
+        for (char c : hex.toCharArray()) {
+            int val = Integer.parseInt(String.valueOf(c), 16);
+            sb.append(String.format("%4s", Integer.toBinaryString(val)).replace(' ', '0'));
+        }
+        return sb.toString();
+    }
+
+    private static String hexToBinary(String[] hexArr) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < hexArr.length; i++) {
+            sb.append(hexToBinary(hexArr[i]));
+        }
+        return sb.toString();
+    }
+    private static String hexToBinary1(String[] hexArr) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < hexArr.length; i++) {
+            sb.append(hexArr[i]);
+        }
+        return sb.toString();
+    }
+
+    private static String addHex(String hex1, String hex2) {
+        int num1 = Integer.parseInt(hex1.replace("0x", ""), 16);
+        int num2 = Integer.parseInt(hex2.replace("0x", ""), 16);
+        int sum = num1 + num2;
+        return "0x" + Integer.toHexString(sum).toUpperCase();
+    }
+
+    private static void testWater() throws IOException {
+        //"00000152462599"; 000152462599
+        //FEFEFE    68  999999999999    68  01(C)  02(L)  65(DI0) F3(DI1)  C1(CS鏍¢獙鐮�)  16(缁撴潫绗�)
+        //FEFEFE6899254652010068010243C33016
+        //FEFEFE6899254652010068810843C3333333333333E816
+
+//        FEFEFE6899254652010068810843C3333333333333E816
+        String ip = "192.168.1.78";
+        int port = 1030;
+//        DeviceData d = readDeviceData(ip, port, "00000152462599");
+//        System.out.println(d);
+//        String address = "000152462599";
+        String address = "000152462599";
+        //00000152462599
+        byte[] address_buf = convertToBCDAddress(address);
+//        byte[] address_buf = hexStringToByteArray(address);
+//        System.out.println(buf);
+        /**
+         *
+         * FEFEFE   68  000152462599  68010243C33016
+         * FEFEFE   68  992546520100  68010243C33016
+         */
+        byte control = 0x01;
+        byte[] data = {0x43, (byte) 0xC3};
+        byte[] datas = getRequestParam(3, address_buf, control, data);
+        System.out.println(bytesToHex(datas));
+        System.out.println("FEFEFE6899254652010068010243C33016");
+//         datas = hexStringToByteArray("FEFEFE6899254652010068010243C33016");
+        byte[] resp = readDeviceData(ip, port, datas);
+        String r = bytesToHex(resp);
+        System.out.println(r);
+
+        /**
+         *
+         * FEFEFE   68  992546520100    68  01  02  43C3    30  16
+         * FEFEFE   68  992546520100    68  81  08  43C3    33333333    3333    E8  16
+         */
+//        String r = "FEFEFE6899254652010068810843C3333333333333E816";
+        String msg = r.substring(30, 30 + 8 + 4);
+        System.out.println(msg);
+        String[] nArr = parseSub33Reverse(msg, 4);
+        System.out.println(strArrNum(nArr));
+//        byte d10 = 0x10;
+//        byte add = 0x33;
+//        String hex = String.format("%02X", (d10 + add) & 0xFF);
+//        System.out.println(hex);
+
+//        r = addHex("0x10", "0x33");
+//        System.out.println(r);
+//
+//        r = addHex("0x90", "0x33");
+//        System.out.println(r);
+        msg = r.substring(40, 40 + 2);
+        System.out.println(msg);
+
+        byte sub = 0x33;
+        String hexResult = subByte(msg, sub);
+        String v = hexToBinary(hexResult);
+        System.out.println(v);
+    }
+
+
+    /**
+     * 鏈�鍚庝竴浣嶆槸灏忔暟鐐�
+     *
+     * @param nArr
+     * @return
+     */
+    private static Double strArrNum(String[] nArr) {
+        if (nArr == null || nArr.length == 0) {
+            return 0.0;
+        }
+        // 灏嗘墍鏈夐儴鍒嗘嫾鎺ヨ捣鏉�
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < nArr.length; i++) {
+            sb.append(nArr[i]);
+        }
+
+        // 鍦ㄩ�傚綋浣嶇疆鎻掑叆灏忔暟鐐�
+        String combined = sb.toString();
+        int totalLength = combined.length();
+        int decimalLength = nArr[nArr.length - 1].length();
+        // 鎻掑叆灏忔暟鐐�
+        String numberStr = combined.substring(0, totalLength - decimalLength) + "." + combined.substring(totalLength - decimalLength);
+        return Double.parseDouble(numberStr);
+    }
+
+
+    public static void electricityTest() throws IOException {
+        //000001215161
+//        FEFEFEFE  68  615121010000    68  11  04  33333333    8516
+//        FEFEFEFE6861512101000068910833333333A93333334B16
+//        FEFEFEFE6861512101000068910833333333AC3333334E16
+        String ip = "192.168.1.78";
+        int port = 1030;
+
+        String address = "000001215161";
+        byte[] addressBuf = convertToBCDAddress(address);
+
+//        byte control = 0x11;
+//        byte[] data = {0x33, 0x33, 0x33, 0x33};
+////
+//        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+////        String req = bytesToHex(bufReq);
+//////        String param = "FEFEFE68615121010000681104333333338516";
+////        System.out.println(req);
+//////        System.out.println(param);
+////        byte[] buf = hexStringToByteArray(param);
+//        byte[] respBuf = readDeviceData(ip, port, bufReq);
+//        String hex = bytesToHex(respBuf);
+////        System.out.println(hex);
+//        String resp = "FEFEFEFE6861512101000068910833333333AC3333334E16";
+////                     FEFEFEFE68615121010000   68  91  08 33333333 A9  333333    4B16
+//
+//        String msg = resp.substring(28, 28 + 8);
+//        System.out.println(msg);
+//
+//        String[] nArr = parseSub33Reverse(msg, 4);
+//        System.out.println(strArrNum(nArr));
+//        msg = resp.substring(28 + 8, 28 + 8 + 8);
+//        System.out.println(msg);
+//
+//        nArr = parseSub33Reverse(msg, 4);
+////        parseSub33Reverse
+//        System.out.println(strArrNum(nArr));
+
+
+//        String msgStatus = "FEFEFEFE 68 379707010000 68 11 04 36383337 9316";
+//        String msgStatus = "FEFEFEFE68379707010000681104363833379316";
+//        byte control = 0x11;
+//        byte[] data = {0x36, 0x38, 0x33, 0x37};
+//        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+//        String req = bytesToHex(bufReq);
+//        System.out.println(req);
+//        System.out.println(msgStatus);
+//        byte[] respBuf = readDeviceData(ip, port, bufReq);
+//        String resp = bytesToHex(respBuf);
+//        System.out.println(resp);
+//        FEFEFEFE  68  615121010000  68  91  06  36383337  3333  79  16
+//        FEFEFEFE  68  615121010000    68  91  06  36383337    3333    79  16
+        String resp = "FEFEFEFE686151210100006891063638333733337916";
+        String msg = resp.substring(36, 36 + 4);
+        System.out.println(msg);
+        String[] nArr = parseSub33Reverse(msg, 2);
+//        System.out.println(strArrNum(nArr));
+        String v = hexToBinary(nArr);
+        v="0000000000010000";
+        System.out.println(v);
+        System.out.println(v.charAt(11));
+
+
+    }
+
+
+    public static void main(String[] args) throws IOException {
+//        testWater();
+//        electricityTest();
+//        water("192.168.1.78",1030,"000152462599");
+//        Map<String, Object> map = electricityData("192.168.1.78", 1030, "000001215161");
+//        System.out.println(JSONObject.toJSONString(map));
+        electricityAct("192.168.1.78", 1030, "000001215161",0,"20260309162655");
+//        FEFEFE6899254652010068810 843C3333433333333   E9 16
+//        FEFEFE6899254652010068810 84  3C3333433333333E916
+
+//        Map<String, Object> map1 = water("192.168.1.78", 1030, "000152462599");
+//        System.out.println(JSONObject.toJSONString(map1));
+    }
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/excel/ExcelReplaceCommon.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/excel/ExcelReplaceCommon.java
index e0c27a1..9adc1f6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/excel/ExcelReplaceCommon.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/excel/ExcelReplaceCommon.java
@@ -94,7 +94,7 @@
             IContext context = report.createContext();
             for (YwTempConfig ywTempConfig:ywTempConfigList) {
                 if(StringUtils.isBlank(ywTempConfig.getUrl())){
-                    ywTempConfig.setUrl("-");
+                    ywTempConfig.setUrl(" - ");
                 }
                 context.put(ywTempConfig.getTitle().replace("${","").replace("}",""), ywTempConfig.getUrl());
             }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceDataMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceDataMapper.java
new file mode 100644
index 0000000..4818344
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceDataMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.DeviceData;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/12/25 10:04
+ */
+public interface DeviceDataMapper extends BaseMapper<DeviceData> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
index 1209387..70a6da0 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
@@ -1,5 +1,7 @@
 package com.doumee.dao.business.model;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import com.doumee.core.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
@@ -8,9 +10,9 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import java.util.Date;
+
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 璁惧淇℃伅琛�
@@ -71,8 +73,8 @@
     @ExcelColumn(name="鎺掑簭鐮�")
     private Integer sortnum;
 
-    @ApiModelProperty(value = "绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱", example = "1")
-    @ExcelColumn(name="绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱")
+    @ApiModelProperty(value = "绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱鐐� 4骞挎挱璁惧 5鏂矾鍣ㄧ┖寮� 6娴峰悍鐢佃〃 7j绌鸿", example = "1")
+    @ExcelColumn(name="绫诲瀷 0闂ㄧ 1杞﹀簱 2LED 3骞挎挱鐐� 4骞挎挱璁惧 5鏂矾鍣ㄧ┖寮� 6娴峰悍鐢佃〃 7绌鸿")
     private Integer type;
     @ApiModelProperty(value = "鏄惁鍥尯鍑哄叆鍙� 0涓嶆槸 1鏄�", example = "1")
     @ExcelColumn(name="鏄惁鍥尯鍑哄叆鍙� 0涓嶆槸 1鏄�")
@@ -154,12 +156,14 @@
     @ApiModelProperty(value = "闂ㄧ鐐瑰悕绉�")
     @ExcelColumn(name="闂ㄧ鐐瑰悕绉�")
     private String doorName;
-
-
-
-
-
-
-
+    @ApiModelProperty(value = "鎾姤鍐呭")
+    @TableField(exist = false)
+    private String sendInfo;
+    @ApiModelProperty(value = "杩滅▼鎿嶄綔鏃堕棿鍙傛暟")
+    @TableField(exist = false)
+    private Date cmdDate;
+    @ApiModelProperty(value = "閰嶇疆鍙傛暟")
+    @TableField(exist = false)
+    private JSONObject doorNameObj;
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/DeviceData.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/DeviceData.java
new file mode 100644
index 0000000..f9498d8
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/DeviceData.java
@@ -0,0 +1,95 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃
+ * @author 姹熻箘韫�
+ * @date 2025/12/25 10:04
+ */
+@Data
+@ApiModel("闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃")
+@TableName("`device_data`")
+public class DeviceData {
+
+    @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="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鏁版嵁json瀵硅薄", example = "1")
+    @ExcelColumn(name="鏁版嵁json瀵硅薄")
+    private String dataJson;
+
+    @ApiModelProperty(value = "璁惧缂栫爜锛堝叧鑱攄evice)")
+    @ExcelColumn(name="璁惧缂栫爜锛堝叧鑱攄evice)")
+    private String deviceId;
+
+    @ApiModelProperty(value = "鍙戠敓鏃堕棿")
+    @ExcelColumn(name="鍙戠敓鏃堕棿")
+    private String happenTime;
+
+    @ApiModelProperty(value = "灞炴�у��1")
+    @ExcelColumn(name="灞炴�у��1")
+    private String val1;
+
+    @ApiModelProperty(value = "灞炴�у��2")
+    @ExcelColumn(name="灞炴�у��2")
+    private String val2;
+
+    @ApiModelProperty(value = "灞炴�у��3")
+    @ExcelColumn(name="灞炴�у��3")
+    private String val3;
+
+    @ApiModelProperty(value = "灞炴�у��4")
+    @ExcelColumn(name="灞炴�у��4")
+    private String val4;
+
+    @ApiModelProperty(value = "灞炴�у��5")
+    @ExcelColumn(name="灞炴�у��5")
+    private String val5;
+
+    @ApiModelProperty(value = "灞炴�у��6")
+    @ExcelColumn(name="灞炴�у��6")
+    private String val6;
+    @ApiModelProperty(value = "灞炴�у��7")
+    @ExcelColumn(name="灞炴�у��7")
+    private String val7;
+
+    @ApiModelProperty(value = "鏁版嵁鏉ユ簮 0mqtt涓婃姤缁煎悎鐘舵�� 1杩滅▼鎺у埗 2TCP璇诲彇鏁版嵁 ", example = "1")
+    @ExcelColumn(name="鏁版嵁鏉ユ簮 0mqtt涓婃姤缁煎悎鐘舵�� 1杩滅▼鎺у埗 2TCP璇诲彇鏁版嵁")
+    private Integer dataType;
+
+}
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 de03a54..e476672 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
@@ -204,6 +204,10 @@
     @ExcelColumn(name="鐗╀笟璐规�婚噾棰�")
     private BigDecimal wyTotalFee;
 
+    @ApiModelProperty(value = "鍚堝悓鐘舵�侀泦鍚�")
+    @TableField(exist = false)
+    private List<Integer> statusList;
+
     @ApiModelProperty(value = "鎴块棿涓婚敭 鏌ヨ浣跨敤")
     @TableField(exist = false)
     private Integer roomId;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
index c59d394..dadcb8f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
@@ -157,11 +157,11 @@
     @TableField(exist = false)
     private Integer customerId;
 
-    @ApiModelProperty(value = "鏄惁鍙戦�侀偖浠讹細0=鍚︼紱1=鏄�", example = "1")
+    @ApiModelProperty(value = "鏄惁鍙戦�侀偖浠讹細0=鍚︼紱1=鍙戦�佹垚鍔燂紱2=鍙戦�佸け璐�", example = "1")
     @TableField(exist = false)
     private Integer isSendEmail;
 
-    @ApiModelProperty(value = "鏄惁鍙戦�佺煭淇★細0=鍚︼紱1=鏄�", example = "1")
+    @ApiModelProperty(value = "鏄惁鍙戦�佺煭淇★細0=鍚︼紱1=鍙戦�佹垚鍔燂紱2=鍙戦�佸け璐�", example = "1")
     @TableField(exist = false)
     private Integer isSendSms;
 
@@ -178,6 +178,7 @@
     @ExcelColumn(name="鍚堝悓缂栧彿",index = 2,width = 10)
     @TableField(exist = false)
     private String contractCode;
+
     @ApiModelProperty(value = "鍚堝悓鐘舵��", example = "1")
     @TableField(exist = false)
     private Integer contractStatus;
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 37e6303..258a1c5 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
@@ -26,89 +26,77 @@
 
     @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 = "澶囨敞")
-    @ExcelColumn(name="澶囨敞")
     private String remark;
 
     @ApiModelProperty(value = "鍚嶇О")
-    @ExcelColumn(name="鍚嶇О")
+    @ExcelColumn(name="鐗╂枡鍚嶇О",index = 1,width = 10)
     private String name;
 
     @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
-    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    @ExcelColumn(name="鐘舵��",index = 8,width = 8,valueMapping = "0=鍚敤;1=绂佺敤;")
     private Integer status;
 
     @ApiModelProperty(value = "缂栧彿")
-    @ExcelColumn(name="缂栧彿")
+    @ExcelColumn(name="鐗╂枡缂栧彿",index = 0,width = 10)
     private String code;
 
     @ApiModelProperty(value = "鎵�灞炰竴绾у垎绫荤紪鐮侊紙鍏宠仈category)", example = "1")
-    @ExcelColumn(name="鎵�灞炰竴绾у垎绫荤紪鐮侊紙鍏宠仈category)")
     private Integer parentCateId;
 
     @ApiModelProperty(value = "鎵�灞炰簩绾у垎绫荤紪鐮�(鍏宠仈category锛�", example = "1")
-    @ExcelColumn(name="鎵�灞炰簩绾у垎绫荤紪鐮�(鍏宠仈category锛�")
     private Integer cateId;
 
     @ApiModelProperty(value = "鏉$爜")
-    @ExcelColumn(name="鏉$爜")
+    @ExcelColumn(name="鏉$爜",index = 2,width = 10)
     private String qrcode;
 
     @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
-    @ExcelColumn(name="鎺掑簭鐮�")
     private Integer sortnum;
 
     @ApiModelProperty(value = "鍝佺墝")
-    @ExcelColumn(name="鍝佺墝")
+    @ExcelColumn(name="鍝佺墝",index = 3,width = 10)
     private String brand;
 
     @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
-    @ExcelColumn(name="瑙勬牸鍨嬪彿")
+    @ExcelColumn(name="瑙勬牸鍨嬪彿",index = 4,width = 10)
     private String attr;
 
     @ApiModelProperty(value = "瀹夊叏搴撳瓨锛堜笅闄愶級", example = "1")
-    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笅闄愶級")
+    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笅闄愶級",index = 6,width = 16)
     private BigDecimal minStock;
 
     @ApiModelProperty(value = "瀹夊叏搴撳瓨锛堜笂闄愶級", example = "1")
-    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笂闄愶級")
+    @ExcelColumn(name="瀹夊叏搴撳瓨锛堜笂闄愶級",index = 7,width = 16)
     private BigDecimal maxStock;
 
     @ApiModelProperty(value = "鍗曚綅")
-    @ExcelColumn(name="鍗曚綅")
+    @ExcelColumn(name="鍗曚綅",index = 5,width = 10)
     private String unitName;
 
     @ApiModelProperty(value = "鎵�灞炴埧婧愮紪鐮�(鍏宠仈yw_room)", example = "1")
-    @ExcelColumn(name="鎵�灞炴埧婧愮紪鐮�(鍏宠仈yw_room)")
     private Integer roomId;
 
     @ApiModelProperty(value = "鏄惁鑷姩缂栫爜锛�0=鍚︼紱1=鏄紱", example = "1")
-    @ExcelColumn(name="鏄惁鑷姩缂栫爜锛�0=鍚︼紱1=鏄紱")
     private Integer autoCode;
 
     @ApiModelProperty(value = "闄勪欢淇℃伅", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java
index 36e1608..4ce319c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinbound.java
@@ -92,6 +92,9 @@
     @ExcelColumn(name="鍗曟嵁缂栧彿")
     private String code;
 
+    @ApiModelProperty(value = "棰嗙敤浜�", example = "1")
+    private Integer outUserId;
+
     @ApiModelProperty(value = "鍑哄叆搴撴暟鎹槑缁�", example = "1")
     @TableField(exist = false)
     private List<YwOutinboundRecord> recordList;
@@ -108,4 +111,8 @@
     @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
     @TableField(exist = false)
     private String createUserName;
+
+    @ApiModelProperty(value = "棰嗙敤浜哄悕绉�", example = "1")
+    @TableField(exist = false)
+    private String outUserName;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java
index d8a3f12..ef8192b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwOutinboundRecord.java
@@ -24,53 +24,47 @@
 
     @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 HH:mm:ss")
+    @ExcelColumn(name="鍒涘缓鏃堕棿",width = 10,index = 11,dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
     private Integer editor;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @ExcelColumn(name="鏇存柊鏃堕棿")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
-    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
     private Integer isdeleted;
 
     @ApiModelProperty(value = "澶囨敞")
-    @ExcelColumn(name="澶囨敞")
     private String remark;
 
     @ApiModelProperty(value = "鍑哄叆搴撹褰曚富閿�", example = "1")
-    @ExcelColumn(name="鍑哄叆搴撹褰曚富閿�")
     private Integer outInBoundId;
 
     @ApiModelProperty(value = "鐗╄祫缂栫爜锛堝叧鑱攜w_material)", example = "1")
-    @ExcelColumn(name="鐗╄祫缂栫爜锛堝叧鑱攜w_material)")
     private Integer materialId;
 
     @ApiModelProperty(value = "鏁伴噺", example = "1")
-    @ExcelColumn(name="鏁伴噺")
+    @ExcelColumn(name="鏁伴噺",width = 10,index = 5)
     private BigDecimal stock;
 
     @ApiModelProperty(value = "璧勪骇缂栫爜")
     @TableField(exist = false)
+    @ExcelColumn(name="鐗╂枡缂栫爜",width = 10,index = 1)
     private String materialCode;
 
     @ApiModelProperty(value = "璧勪骇鍚嶇О")
     @TableField(exist = false)
+    @ExcelColumn(name="鐗╂枡鍚嶇О",width = 10,index = 2)
     private String materialName;
 
     @ApiModelProperty(value = "璧勪骇鏉″舰鐮�")
@@ -83,6 +77,7 @@
 
     @ApiModelProperty(value = "璧勪骇鍗曚綅")
     @TableField(exist = false)
+    @ExcelColumn(name="鍗曚綅",width = 10,index = 6)
     private String materialUnitName;
 
     @ApiModelProperty(value = "鎿嶄綔绫诲瀷锛�1=鍑哄簱锛�0=鍏ュ簱锛堝垎椤靛垪琛ㄦ煡璇娇鐢級", example = "1")
@@ -95,31 +90,38 @@
 
     @ApiModelProperty(value = "浠撳簱鍚嶇О")
     @TableField(exist = false)
+    @ExcelColumn(name="浠撳簱",width = 10,index = 8)
     private String warehouseName;
 
     @ApiModelProperty(value = "鍗曟嵁鏃ユ湡")
     @TableField(exist = false)
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @ExcelColumn(name="鍗曟嵁鏃ユ湡",width = 10,index = 0,dateFormat = "yyyy-MM-dd")
     private Date doneDate;
 
     @ApiModelProperty(value = "涓�绾у垎绫诲悕绉�")
     @TableField(exist = false)
+    @ExcelColumn(name="鐗╂枡鍒嗙被",width = 10,index = 3)
     private String categoryParentName;
 
     @ApiModelProperty(value = "浜岀骇鍒嗙被鍚嶇О")
     @TableField(exist = false)
+    @ExcelColumn(name="鐗╂枡瀛愬垎绫�",width = 10,index = 4)
     private String categoryName;
 
     @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
     @TableField(exist = false)
+    @ExcelColumn(name="鍒涘缓浜�",width = 10,index = 10)
     private String createUserName;
 
     @ApiModelProperty(value = "鍗曟嵁缂栧彿", example = "1")
     @TableField(exist = false)
+    @ExcelColumn(name="鍗曟嵁缂栧彿",width = 10,index = 9)
     private String code;
 
     @ApiModelProperty(value = "绫诲瀷 0閲囪喘鍏ュ簱 1棰嗙敤閫�鍥� 2璋冩暣鍏ュ簱 3鍏朵粬鍏ュ簱 4鐩樼泩鍏ュ簱 5棰嗙敤鍑哄簱 6浠撳簱鍑哄簱 7璋冩暣鍑哄簱 8閲囪喘鍑哄簱 9鍏朵粬鍑哄簱 10鐩樹簭鍑哄簱", example = "1")
     @TableField(exist = false)
+    @ExcelColumn(name="绫诲瀷",width = 10,index = 7,valueMapping = "0=閲囪喘鍏ュ簱;1=棰嗙敤閫�鍥�;2=璋冩暣鍏ュ簱;3=鍏朵粬鍏ュ簱;4=鐩樼泩鍏ュ簱;5=棰嗙敤鍑哄簱;6=浠撳簱鍑哄簱;7=璋冩暣鍑哄簱;8=閲囪喘鍑哄簱;9=鍏朵粬鍑哄簱;10=鐩樹簭鍑哄簱;")
     private Integer type;
 
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java
index 69f6075..2ea3bf2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTask.java
@@ -54,7 +54,7 @@
     private String remark;
 
     @ApiModelProperty(value = "鐘舵�� 0寰呭紑濮� 1杩涜涓� 2宸茶秴鏈� 3宸插畬鎴� 4宸插彇娑�", example = "1")
-    @ExcelColumn(name="鎵ц缁撴灉",index = 7,width = 6,valueMapping = "0=寰呭紑濮�;1=杩涜涓�;2=宸茶秴鏈�;3=宸插畬鎴�;")
+    @ExcelColumn(name="鎵ц缁撴灉",index = 7,width = 6,valueMapping = "0=寰呭紑濮�;1=杩涜涓�;2=宸茶秴鏈�;3=宸插畬鎴�;4=宸插彇娑�;")
     private Integer status;
 
     @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
@@ -103,6 +103,9 @@
     @TableField(exist = false)
     private String userName;
 
+    @ApiModelProperty(value = "鍙鐞嗕汉锛堝涓互,鍒嗗壊锛�")
+    @TableField(exist = false)
+    private String userIds;
 
     @ApiModelProperty(value = "浠诲姟鐘舵�侊細澶氫釜浠�,鍒嗗壊 0寰呭紑濮� 1杩涜涓� 2宸茶秴鏈� 3宸插畬鎴� 4宸插彇娑�")
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java
index caa8f4a..d0434c4 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java
@@ -106,6 +106,13 @@
     @ExcelColumn(name="鎵�灞炴ゼ瀹囩紪鐮侊紙鍏宠仈yw_building)")
     private Integer buildingId;
 
+    @ApiModelProperty(value = "褰撳墠绉熻祦鐘舵�侊細0=鏈璧侊紱1=宸茬璧�")
+    private Integer leaseNowStatus;
+
+    @ApiModelProperty(value = "閫�绉熷埌鏈熸棩鏈燂紝閫�绉熶娇鐢�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date leaseRentDate;
+
     @ApiModelProperty(value = "绉熻祦鐘舵�侊細0=寰呯璧侊紱1=宸茬璧� ;2=鏈紑鍚璧�", example = "1")
     @TableField(exist = false)
     private Integer leaseStatus;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java
index 16a6200..b402a67 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStock.java
@@ -57,7 +57,6 @@
     @ExcelColumn(name="鏁伴噺",index = 6,width = 10)
     private BigDecimal stock;
 
-
     @ApiModelProperty(value = "鐗╂枡缂栫爜")
     @ExcelColumn(name="鐗╂枡缂栫爜",index = 0,width = 10)
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java
index 3addc97..ea7869f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktaking.java
@@ -35,7 +35,7 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java
index 6672876..44c5b68 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwStocktakingRecord.java
@@ -25,97 +25,91 @@
 
     @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 = "澶囨敞")
-    @ExcelColumn(name="澶囨敞")
+    @ExcelColumn(name="澶囨敞",index = 9,width = 30)
     private String remark;
 
     @ApiModelProperty(value = "鐘舵�� 0鏈紑濮� 1宸茬洏鐐�", example = "1")
-    @ExcelColumn(name="鐘舵�� 0鏈紑濮� 1宸茬洏鐐�")
     private Integer status;
 
     @ApiModelProperty(value = "鐩樼偣鍛樼紪鐮�(鍏宠仈system_user)")
-    @ExcelColumn(name="鐩樼偣鍛樼紪鐮�(鍏宠仈system_user)")
     private String userId;
 
     @ApiModelProperty(value = "鐩樼偣鏃堕棿")
-    @ExcelColumn(name="鐩樼偣鏃堕棿")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDate;
 
     @ApiModelProperty(value = "缂栧彿")
-    @ExcelColumn(name="缂栧彿")
     private String code;
 
     @ApiModelProperty(value = "鐗╄祫缂栫爜锛堝叧鑱攜w_material)", example = "1")
-    @ExcelColumn(name="鐗╄祫缂栫爜锛堝叧鑱攜w_material)")
     private Integer materialId;
 
     @ApiModelProperty(value = "璐﹂潰鏁伴噺", example = "1")
-    @ExcelColumn(name="璐﹂潰鏁伴噺")
+    @ExcelColumn(name="璐﹂潰鏁伴噺",index = 7,width = 10)
     private BigDecimal stock;
 
     @ApiModelProperty(value = "瀹為檯鐩樼偣搴撳瓨閲�", example = "1")
-    @ExcelColumn(name="瀹為檯鐩樼偣搴撳瓨閲�")
+    @ExcelColumn(name="鐩樼偣鏁伴噺",index = 8,width = 10)
     private BigDecimal actStock;
 
     @ApiModelProperty(value = "鐩樼偣 0璐﹀疄鐩哥 1鐩樹簭 2鐩樼泩", example = "1")
-    @ExcelColumn(name="鐩樼偣 0璐﹀疄鐩哥 1鐩樹簭 2鐩樼泩")
     private Integer type;
 
     @ApiModelProperty(value = "鐩樼偣璁″垝缂栫爜(鍏宠仈yw_stocktaking)", example = "1")
-    @ExcelColumn(name="鐩樼偣璁″垝缂栫爜(鍏宠仈yw_stocktaking)")
     private Integer stocktakingId;
 
     @ApiModelProperty(value = "璧勪骇缂栫爜")
     @TableField(exist = false)
+    @ExcelColumn(name="鐗╂枡缂栫爜",index = 0,width = 10)
     private String materialCode;
 
     @ApiModelProperty(value = "璧勪骇鍚嶇О")
     @TableField(exist = false)
+    @ExcelColumn(name="鐗╂枡鍚嶇О",index = 1,width = 10)
     private String materialName;
 
     @ApiModelProperty(value = "璧勪骇鏉″舰鐮�")
     @TableField(exist = false)
+    @ExcelColumn(name="鏉$爜",index = 2,width = 10)
     private String materialQrcode;
 
     @ApiModelProperty(value = "璧勪骇鍝佺墝")
     @TableField(exist = false)
+    @ExcelColumn(name="鍝佺墝",index = 3,width = 10)
     private String materialBrand;
 
     @ApiModelProperty(value = "璧勪骇瑙勬牸鍨嬪彿")
     @TableField(exist = false)
+    @ExcelColumn(name="瑙勬牸鍨嬪彿",index = 4,width = 10)
     private String materialAttr;
 
     @ApiModelProperty(value = "璧勪骇鍗曚綅")
     @TableField(exist = false)
+    @ExcelColumn(name="鍗曚綅",index = 5,width = 10)
     private String materialUnitName;
 
     @ApiModelProperty(value = "浠撳簱鍚嶇О")
+    @ExcelColumn(name="浠撳簱",index = 6,width = 10)
     @TableField(exist = false)
     private String warehouseName;
 
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 6c80566..f2c95f8 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
@@ -98,7 +98,7 @@
     private String code;
 
     @ApiModelProperty(value = "澶勭悊鐘舵�� 0寰呭鐞� 1宸插垎娲� 2宸插鐞�", example = "1")
-    @ExcelColumn(name="宸ュ崟鐘舵��",index = 7,width = 10,valueMapping = "0=寰呭鐞�;1=宸插垎娲�;2=宸插鐞�;")
+    @ExcelColumn(name="宸ュ崟鐘舵��",index = 7,width = 10,valueMapping = "0=寰呮寚娲�;1=宸叉寚娲�;2=宸插鐞�;")
     private Integer dealStatus;
 
     @ApiModelProperty(value = "鍒嗘淳浜虹紪鐮�(鍏宠仈system_user)", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelOutVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelOutVO.java
index 23e6818..d2c86d6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelOutVO.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/YwOutinboundExcelOutVO.java
@@ -39,14 +39,17 @@
     @ExcelColumn(name="鍑哄簱鏁伴噺",index = 4,width = 16)
     private String outMaterialNum;
 
-    @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
+    @ApiModelProperty(value = "棰嗙敤浜�", example = "1")
     @ExcelColumn(name="棰嗙敤浜�",index = 5,width = 16)
-    private String createUserName;
+    private String outUserName;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @ExcelColumn(name="鎿嶄綔鏃堕棿",index = 6,width = 16,dateFormat = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
+    @ApiModelProperty(value = "棰嗙敤浜�", example = "1")
+    @ExcelColumn(name="鎿嶄綔浜哄悕绉�",index = 7,width = 16)
+    private String createUserName;
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceDataService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceDataService.java
new file mode 100644
index 0000000..34df45e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceDataService.java
@@ -0,0 +1,98 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.DeviceData;
+
+import java.util.List;
+
+/**
+ * 闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2025/12/25 10:04
+ */
+public interface DeviceDataService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param deviceData 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(DeviceData deviceData);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param deviceData 瀹炰綋瀵硅薄
+     */
+    void delete(DeviceData deviceData);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param deviceData 瀹炰綋瀵硅薄
+     */
+    void updateById(DeviceData deviceData);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param deviceDatas 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<DeviceData> deviceDatas);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return DeviceData
+     */
+    DeviceData findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param deviceData 瀹炰綋瀵硅薄
+     * @return DeviceData
+     */
+    DeviceData findOne(DeviceData deviceData);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param deviceData 瀹炰綋瀵硅薄
+     * @return List<DeviceData>
+     */
+    List<DeviceData> findList(DeviceData deviceData);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<DeviceData>
+     */
+    PageData<DeviceData> findPage(PageWrap<DeviceData> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param deviceData 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(DeviceData deviceData);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
index f752fd9..8c1ed4a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
@@ -1,11 +1,12 @@
 package com.doumee.service.business;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
 import com.doumee.core.haikang.model.param.request.TransparentChannelSingleRequest;
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Device;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
 import java.util.List;
 
 /**
@@ -15,9 +16,10 @@
  */
 public interface DeviceService {
 
+
     /**
      * 鍒涘缓
-     * 
+     *
      * @param device 瀹炰綋瀵硅薄
      * @return Integer
      */
@@ -28,7 +30,7 @@
      *
      * @param id 涓婚敭
      */
-    void deleteById(Integer id);
+    void deleteById(Integer id, LoginUserInfo userInfo);
 
     /**
      * 鍒犻櫎
@@ -42,7 +44,7 @@
      *
      * @param ids 涓婚敭闆�
      */
-    void deleteByIdInBatch(List<Integer> ids);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo userInfo);
 
     /**
      * 涓婚敭鏇存柊
@@ -106,4 +108,11 @@
     long count(Device device);
 
     void setLedContent(TransparentChannelSingleRequest body);
+
+    void setBroadcaseBobao(Device body);
+
+    void updateUsedById(Device d);
+
+    void dianbaoCmd(Device param);
+    void dianbiaoData(Device param);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
index 84f74eb..bca5059 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
@@ -102,5 +102,17 @@
 
     void dealTimeOut();
 
+    /**
+     * 鍒版湡鍚堝悓 鏈彂璧烽��绉熺殑杩涜鏁版嵁璋冩暣 鎶婂悎鍚屼笅鐨勬埧婧愰噴鏀� 瀹氭椂鏃堕棿闇�瑕佸湪姣忓ぉ鏅氫笂12鐐瑰墠
+     */
+    void updRoomLeaseNowStatus();
+
+
+    /**
+     * 閫�绉熶腑/宸查��绉熷悎鍚� 鎶婂埌浜嗛��绉熸棩鏈熸椂闂寸殑鏁版嵁 杩涜鎴挎簮閲婃斁 瀹氭椂鏃堕棿闇�瑕佸湪姣忓ぉ鏅氫笂12鐐瑰墠
+     */
+    void updRentContractStatus();
+
+
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java
index 6da3431..6e0c811 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwMaterialService.java
@@ -1,8 +1,11 @@
 package com.doumee.service.business;
 
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwMaterial;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.util.List;
 
 /**
@@ -98,4 +101,6 @@
     long count(YwMaterial ywMaterial);
 
     YwMaterial getDetail(Integer id);
+
+    Integer importMaterialBatch(MultipartFile file, LoginUserInfo loginUserInfo);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java
index 8be507c..261536e 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolPointService.java
@@ -4,6 +4,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.YwPatrolPoint;
+
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -48,6 +50,7 @@
      * @param ywPatrolPoint 瀹炰綋瀵硅薄
      */
     void updateById(YwPatrolPoint ywPatrolPoint);
+    void exportQrcodes(Integer id, HttpServletResponse ywPatrolPoint);
 
     /**
      * 鎵归噺涓婚敭鏇存柊
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceDataServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceDataServiceImpl.java
new file mode 100644
index 0000000..f1a4754
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceDataServiceImpl.java
@@ -0,0 +1,161 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.DeviceDataMapper;
+import com.doumee.dao.business.model.DeviceData;
+import com.doumee.service.business.DeviceDataService;
+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/12/25 10:04
+ */
+@Service
+public class DeviceDataServiceImpl implements DeviceDataService {
+
+    @Autowired
+    private DeviceDataMapper deviceDataMapper;
+
+    @Override
+    public Integer create(DeviceData deviceData) {
+        deviceDataMapper.insert(deviceData);
+        return deviceData.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        deviceDataMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(DeviceData deviceData) {
+        UpdateWrapper<DeviceData> deleteWrapper = new UpdateWrapper<>(deviceData);
+        deviceDataMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        deviceDataMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(DeviceData deviceData) {
+        deviceDataMapper.updateById(deviceData);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<DeviceData> deviceDatas) {
+        if (CollectionUtils.isEmpty(deviceDatas)) {
+            return;
+        }
+        for (DeviceData deviceData: deviceDatas) {
+            this.updateById(deviceData);
+        }
+    }
+
+    @Override
+    public DeviceData findById(Integer id) {
+        return deviceDataMapper.selectById(id);
+    }
+
+    @Override
+    public DeviceData findOne(DeviceData deviceData) {
+        QueryWrapper<DeviceData> wrapper = new QueryWrapper<>(deviceData);
+        return deviceDataMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<DeviceData> findList(DeviceData deviceData) {
+        QueryWrapper<DeviceData> wrapper = new QueryWrapper<>(deviceData);
+        return deviceDataMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<DeviceData> findPage(PageWrap<DeviceData> pageWrap) {
+        IPage<DeviceData> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<DeviceData> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(DeviceData::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(DeviceData::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(DeviceData::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(DeviceData::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(DeviceData::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(DeviceData::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(DeviceData::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(DeviceData::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(DeviceData::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getDataJson() != null) {
+            queryWrapper.lambda().eq(DeviceData::getDataJson, pageWrap.getModel().getDataJson());
+        }
+        if (pageWrap.getModel().getDeviceId() != null) {
+            queryWrapper.lambda().eq(DeviceData::getDeviceId, pageWrap.getModel().getDeviceId());
+        }
+        if (pageWrap.getModel().getHappenTime() != null) {
+            queryWrapper.lambda().eq(DeviceData::getHappenTime, pageWrap.getModel().getHappenTime());
+        }
+        if (pageWrap.getModel().getVal1() != null) {
+            queryWrapper.lambda().eq(DeviceData::getVal1, pageWrap.getModel().getVal1());
+        }
+        if (pageWrap.getModel().getVal2() != null) {
+            queryWrapper.lambda().eq(DeviceData::getVal2, pageWrap.getModel().getVal2());
+        }
+        if (pageWrap.getModel().getVal3() != null) {
+            queryWrapper.lambda().eq(DeviceData::getVal3, pageWrap.getModel().getVal3());
+        }
+        if (pageWrap.getModel().getVal4() != null) {
+            queryWrapper.lambda().eq(DeviceData::getVal4, pageWrap.getModel().getVal4());
+        }
+        if (pageWrap.getModel().getVal5() != null) {
+            queryWrapper.lambda().eq(DeviceData::getVal5, pageWrap.getModel().getVal5());
+        }
+        if (pageWrap.getModel().getVal6() != null) {
+            queryWrapper.lambda().eq(DeviceData::getVal6, pageWrap.getModel().getVal6());
+        }
+        if (pageWrap.getModel().getDataType() != null) {
+            queryWrapper.lambda().eq(DeviceData::getDataType, pageWrap.getModel().getDataType());
+        }
+        queryWrapper.lambda().orderByDesc(DeviceData::getHappenTime);
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(deviceDataMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(DeviceData deviceData) {
+        QueryWrapper<DeviceData> wrapper = new QueryWrapper<>(deviceData);
+        return deviceDataMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
index 57eeaa2..2845622 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -2,29 +2,36 @@
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.doumee.biz.system.SystemDictDataBiz;
-import com.doumee.core.constants.ResponseStatus;
-import com.doumee.core.exception.BusinessException;
-import com.doumee.core.haikang.model.HKConstants;
-import com.doumee.core.haikang.model.param.BaseResponse;
-import com.doumee.core.haikang.model.param.request.*;
-import com.doumee.core.model.PageData;
-import com.doumee.core.model.PageWrap;
-import com.doumee.core.utils.Constants;
-import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.DeviceMapper;
-import com.doumee.dao.business.PlatformBroadcastLogMapper;
-import com.doumee.dao.business.model.Device;
-import com.doumee.dao.business.model.PlatformBroadcastLog;
-import com.doumee.service.business.DeviceService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.device.WaterElectricityUtil;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.CustomBroadcastRequest;
+import com.doumee.core.haikang.model.param.request.TransparentChannelSingleRequest;
+import com.doumee.core.haikang.service.HKService;
+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.*;
+import com.doumee.dao.business.model.Device;
+import com.doumee.dao.business.model.DeviceData;
+import com.doumee.dao.business.model.PlatformBroadcastLog;
+import com.doumee.service.business.DeviceService;
 import com.doumee.service.business.impl.hksync.HkSyncPushServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 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.*;
@@ -35,25 +42,54 @@
  * @date 2023/11/30 15:33
  */
 @Service
+@Slf4j
 public class DeviceServiceImpl implements DeviceService {
 
     @Autowired
     private DeviceMapper deviceMapper;
     @Autowired
+    private DeviceDataMapper deviceDataMapper;
+    @Autowired
+    private PlatformMapper platformMapper;
+    @Autowired
+    private PlatformDeviceMapper platformDeviceMapper;
+    @Autowired
     private SystemDictDataBiz systemDictDataBiz;
     @Autowired
     private PlatformBroadcastLogMapper platformBroadcastLogMapper;
+    @Autowired
+    private InterfaceLogMapper interfaceLogMapper;
 
 
     @Override
-    public Integer create(Device device) {
-        deviceMapper.insert(device);
-        return device.getId();
+    public Integer create(Device model) {
+        model.setCreator(model.getLoginUserInfo().getId()+"");
+        model.setEdirot(model.getCreator());
+        model.setIsdeleted(Constants.ZERO);
+        model.setEditDate(new Date());
+        model.setCreateDate(model.getEditDate());
+        if(model.getDoorNameObj()!=null &&
+                (Constants.equalsInteger(model.getType(),Constants.DEVICE_TYPE.duanluqi)
+                        ||Constants.equalsInteger(model.getType(),Constants.DEVICE_TYPE.dianbiao))){
+            model.setDoorName(JSONObject.toJSONString(model.getDoorNameObj()));
+            if(StringUtils.isNotBlank(model.getLevel())){
+                if(getNumberByStr(model.getLevel()) <300){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鎺у埗鏃堕暱蹇呴』澶т簬绛変簬300绉�");
+                }
+            }
+        }
+        deviceMapper.insert(model);
+        return model.getId();
     }
 
     @Override
-    public void deleteById(Integer id) {
-        deviceMapper.deleteById(id);
+    public void deleteById(Integer id, LoginUserInfo userInfo) {
+        Device update = new Device();
+        update.setEdirot(userInfo.getId()+"");
+        update.setEditDate(new Date());
+        update.setIsdeleted(Constants.ONE);
+        update.setId(id);
+        deviceMapper.updateById(update);
     }
 
     @Override
@@ -63,16 +99,30 @@
     }
 
     @Override
-    public void deleteByIdInBatch(List<Integer> ids) {
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo userInfo) {
         if (CollectionUtils.isEmpty(ids)) {
             return;
         }
-        deviceMapper.deleteBatchIds(ids);
+        for(Integer id :ids){
+            deleteById(id,userInfo);
+        }
     }
 
     @Override
     public void updateById(Device device) {
+        device.setEdirot(device.getLoginUserInfo().getId()+"");
+        device.setEditDate(new Date());
+        if(device.getDoorNameObj()!=null &&
+                (Constants.equalsInteger(device.getType(),Constants.DEVICE_TYPE.duanluqi)
+                        ||Constants.equalsInteger(device.getType(),Constants.DEVICE_TYPE.dianbiao))){
+            device.setDoorName(JSONObject.toJSONString(device.getDoorNameObj()));
+        }
+        Device model = deviceMapper.selectById(device.getId());
+        if(model ==null){
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
         deviceMapper.updateById(device);
+
     }
 
     @Override
@@ -87,7 +137,16 @@
 
     @Override
     public Device findById(Integer id) {
-        return deviceMapper.selectById(id);
+        Device d = deviceMapper.selectById(id);
+        if(StringUtils.isNotBlank(d.getDoorName()) &&Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)){
+            try {
+                //鏂矾鍣ㄨ澶囧弬鏁�
+                d.setDoorNameObj(JSONObject.parseObject(d.getDoorName()));
+            }catch (Exception e){
+
+            }
+        }
+        return d;
     }
 
     @Override
@@ -98,6 +157,7 @@
 
     @Override
     public List<Device> findList(Device device) {
+        device.setIsdeleted(Constants.ZERO);
         QueryWrapper<Device> wrapper = new QueryWrapper<>(device);
         return deviceMapper.selectList(wrapper);
     }
@@ -107,12 +167,25 @@
         LambdaQueryWrapper<Device> wrapper = new LambdaQueryWrapper<>(param);
         wrapper.select(Device::getId, Device::getName, Device::getDoorName,Device::getRegionPathName, Device::getRegionName);
         wrapper.eq(null != param.getType(),Device::getType,param.getType())
-               .eq(null !=param.getIsdeleted(),Device::getIsdeleted,param.getIsdeleted())
-               .eq(Objects.isNull(param.getIsdeleted()),Device::getIsdeleted,Constants.ZERO)
-               .eq(null != param.getHkStatus(),Device::getHkStatus,param.getHkStatus());
-        return deviceMapper.selectList(wrapper);
+                .eq(null !=param.getIsdeleted(),Device::getIsdeleted,param.getIsdeleted())
+                .eq(Objects.isNull(param.getIsdeleted()),Device::getIsdeleted,Constants.ZERO)
+                .eq(null != param.getHkStatus(),Device::getHkStatus,param.getHkStatus());
+        List<Device> list = deviceMapper.selectList(wrapper);
+        if(list!=null){
+            for(Device d : list){
+                if(StringUtils.isNotBlank(d.getDoorName()) &&Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)){
+                    try {
+                        //鏂矾鍣ㄨ澶囧弬鏁�
+                        d.setDoorNameObj(JSONObject.parseObject(d.getDoorName()));
+                    }catch (Exception e){
+
+                    }
+                }
+            }
+        }
+        return list;
     }
-  
+
     @Override
     public PageData<Device> findPage(PageWrap<Device> pageWrap) {
         IPage<Device> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
@@ -147,6 +220,12 @@
         }
         if (pageWrap.getModel().getName() != null) {
             queryWrapper.lambda().like(Device::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getDoorNo() != null) {
+            queryWrapper.lambda().like(Device::getDoorNo, pageWrap.getModel().getDoorNo());
+        }
+        if (pageWrap.getModel().getNo() != null) {
+            queryWrapper.lambda().like(Device::getNo, pageWrap.getModel().getNo());
         }
         if (pageWrap.getModel().getDoorName() != null) {
             queryWrapper.lambda().like(Device::getDoorName, pageWrap.getModel().getDoorName());
@@ -219,7 +298,22 @@
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
         }
-        return PageData.from(deviceMapper.selectPage(page, queryWrapper));
+        IPage<Device> result = deviceMapper.selectPage(page, queryWrapper);
+        if(result!=null){
+            for(Device d : result.getRecords()){
+                if(StringUtils.isNotBlank(d.getDoorName())
+                        && (Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)||
+                        Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.dianbiao))){
+                    try {
+                        //鏂矾鍣ㄨ澶囧弬鏁�
+                        d.setDoorNameObj(JSONObject.parseObject(d.getDoorName()));
+                    }catch (Exception e){
+
+                    }
+                }
+            }
+        }
+        return PageData.from(result);
     }
 
     @Override
@@ -227,6 +321,123 @@
         QueryWrapper<Device> wrapper = new QueryWrapper<>(device);
         return deviceMapper.selectCount(wrapper);
     }
+
+    @Override
+    public void setBroadcaseBobao(Device model){
+        List<String> ids = new ArrayList<>();
+        ids.add(model.getHkId());
+        CustomBroadcastRequest request = new CustomBroadcastRequest();
+        request.setAudioPointIndexCode(ids);
+        request.setPlayDuration(15);//鍗曚綅绉�
+        request.setBroadCastMode("tts");
+        request.setPriority(1);
+        request.setState(1);//鎾斁/鍋滄鏍囪瘑 1-鎾斁锛�0-鍋滄
+        request.setPlayTtsContent(model.getSendInfo());
+        BaseResponse response =  HKService.customBroadcast(request);
+        if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"鍙戦�佸け璐ワ細"+ JSONObject.toJSONString(response));
+        }
+    }
+
+    @Override
+    public   void updateUsedById(Device param){
+        Device model = deviceMapper.selectById(param.getId());
+        if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.duanluqi)){
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        this.updateById(param);
+    }
+
+    @Override
+    public  void dianbaoCmd(Device param){
+        Device model = deviceMapper.selectById(param.getId());
+        if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.dianbiao)){
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if (param.getStatus() == null || param.getCmdDate() == null
+                ||param.getCmdDate().getTime() <= System.currentTimeMillis()) {
+            //濡傛灉鏄紑闂�
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+
+        boolean r ;
+        String date = DateUtil.formatDate(new Date(),"yyyyMMddHHmmss");
+        if(Constants.equalsInteger(param.getStatus(),Constants.ONE)) {
+            //濡傛灉鏄紑闂�
+            r = WaterElectricityUtil.electricityAct(param.getIp(),Integer.parseInt(param.getPort()),param.getNo(),0,date);
+        }else {
+            //濡傛灉鏄悎闂�
+            r = WaterElectricityUtil.electricityAct(param.getIp(),Integer.parseInt(param.getPort()),param.getNo(),1,date);
+        }
+        if(!r){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"杩滅▼鎺у埗鐢佃〃澶辫触锛岃绋嶅悗閲嶈瘯锛�");
+        }
+        String curremak = "銆�"+param.getLoginUserInfo().getRealname()
+                +"銆戜簬"+ DateUtil.getPlusTime2(new Date()) +"杩涜浜�"+(Constants.equalsInteger(param.getStatus(),Constants.ONE)?"銆愬悎闂搞��":"銆愬垎闂搞��")+"鎿嶄綔,寮�鍏炽��"+param.getChannelNo()+"銆戯紱";
+        deviceMapper.update(null,new UpdateWrapper<Device>().lambda()
+                .set(Device::getRemark,curremak)
+                .set(Device::getEditDate,new Date())
+                .set(Device::getEdirot,param.getLoginUserInfo().getId())
+                .eq(Device::getId,param.getId()));
+        DeviceData data = new DeviceData();
+        data.setCreateDate(new Date());
+        data.setEditDate(new Date());
+        data.setCreator(param.getLoginUserInfo().getId());
+        data.setEditor(param.getLoginUserInfo().getId());
+        data.setDeviceId(param.getId()+"");
+        data.setDataType(Constants.ONE);//
+        data.setVal1("杩滅▼鎺у埗");
+        data.setVal2(curremak);
+        data.setHappenTime(DateUtil.getPlusTime2(data.getCreateDate()));
+        data.setVal3((Constants.equalsInteger(param.getStatus(),Constants.ONE)?"銆愬悎闂搞��":"銆愬垎闂搞��"));
+        data.setVal4(param.getLoginUserInfo().getRealname());
+        data.setVal5(param.getChannelNo());
+        deviceDataMapper.insert(data);
+
+    }
+    @Override
+    @Transactional
+    public  void dianbiaoData(Device param){
+        Device model = deviceMapper.selectById(param.getId());
+        if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.dianbiao)){
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        try {
+            Map<String, Object>  readData=  WaterElectricityUtil.electricityData(model.getIp(),Integer.parseInt(model.getPort()),model.getNo());
+            if(readData!=null){
+                String curremak = "銆�"+param.getLoginUserInfo().getRealname()
+                        +"銆戜簬"+ DateUtil.getPlusTime2(new Date()) +"杩涜浜嗘暟鎹鍙栨搷浣�";
+                Date time =(Date) readData.get("time");
+                String total = (Double) readData.get("total")+"";
+                String status =  (String) readData.get("status");
+                model.setHkDate(new Date());//鏈�杩戝悓姝ユ椂闂�
+                model.setOnline(Constants.ONE);//鏍囪瘑璁惧鍦ㄧ嚎
+                model.setRemark(curremak);
+
+                DeviceData data = new DeviceData();
+                data.setCreateDate(new Date());
+                data.setEditDate(new Date());
+                data.setCreator(param.getLoginUserInfo().getId());
+                data.setEditor(param.getLoginUserInfo().getId());
+                data.setDeviceId(param.getId()+"");
+                data.setDataType(Constants.ZERO);//
+                data.setVal1(total);
+                data.setVal2(status);
+                data.setHappenTime(DateUtil.getPlusTime2(data.getCreateDate()));
+                data.setVal3(DateUtil.getPlusTime2(time));
+                data.setVal4(param.getLoginUserInfo().getRealname());
+                data.setVal5(param.getNo());//鍦板潃鍩�
+                deviceDataMapper.insert(data);
+                deviceMapper.updateById(model);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            log.error("鐢佃〃鏁版嵁璇诲彇澶辫触锛�"+e.getMessage());
+            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"璇诲彇鐢佃〃鏁版嵁澶辫触锛�");
+        }
+    }
+
 
     @Override
     public void setLedContent(TransparentChannelSingleRequest model) {
@@ -250,4 +461,28 @@
             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝灞忓箷鍐呭璁剧疆澶辫触"+(log!=null?log.getHkInfo():""));
         }
     }
+
+
+    private DeviceData getLastDataByVal1(String b, List<DeviceData> dataList,double limit) {
+        List<DeviceData> list = new ArrayList<>();
+        for(DeviceData d :dataList){
+            if(StringUtils.equals(d.getVal1(),b)){
+                if(limit <= getNumberByStr(d.getVal2())){
+                    //濡傛灉鏈夊疄鏃剁數娴佸�煎ぇ浜庣┖闂查槇鍊硷紝鍒欒〃绀哄伐浣滀腑锛屼笉鍋氬鐞�
+                    return null;
+                }
+                list.add(d);
+            }
+        }
+        return list.size()>0?list.get(0):null;
+    }
+
+    private double getNumberByStr(String level) {
+        try {
+            return Double.parseDouble(level);
+        }catch (Exception e){
+
+        }
+        return 0;
+    }
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 12976d2..135c516 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -2231,12 +2231,12 @@
                 throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "韬唤璇佸彿銆�"+member.getIdcardNo()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
             }
         }
-        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
-                .ne(Objects.nonNull(member.getId()),Member::getId,member.getId())
-                .eq(Member::getPhone,  member.getPhone())
-                .eq(Member::getIsdeleted,Constants.ZERO) ) >0){
-            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鎵嬫満鍙枫��"+member.getPhone()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
-        }
+//        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
+//                .ne(Objects.nonNull(member.getId()),Member::getId,member.getId())
+//                .eq(Member::getPhone,  member.getPhone())
+//                .eq(Member::getIsdeleted,Constants.ZERO) ) >0){
+//            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鎵嬫満鍙枫��"+member.getPhone()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
+//        }
     }
 
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
index b760dd1..a50a208 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
@@ -595,7 +595,7 @@
         SmsEmail smsEmail = new SmsEmail();
         smsEmail.setIsdeleted(Constants.ZERO);
         smsEmail.setCreateDate(new Date());
-        smsEmail.setStatus(result?Constants.ZERO:Constants.ONE);
+        smsEmail.setStatus(result?Constants.ONE:Constants.TWO);
         smsEmail.setType(Constants.ZERO);
         smsEmail.setRemark(result?"鐭俊鍙戦�佹垚鍔�":"鐭俊鍙戦�佸け璐�");
         smsEmail.setTitle("璐﹀崟鍌垂");
@@ -618,13 +618,13 @@
         if(result){
             result=   emailService.sendEmail(email,"璐﹀崟鍌垂",content,null);
         }
-        content = systemDictDataBiz.queryByCode(Constants.SMS,Constants.SMS_COMNAME).getCode() + content;
         SmsEmail smsEmail = new SmsEmail();
         smsEmail.setRemark(result?"閭欢鍙戦�佹垚鍔�":"閭欢鍙戦�佸け璐�");
         smsEmail.setIsdeleted(Constants.ZERO);
+        smsEmail.setTitle("璐﹀崟鍌垂");
         smsEmail.setCreateDate(new Date());
-        smsEmail.setStatus(result?Constants.ZERO:Constants.ONE);
-        smsEmail.setType(Constants.TWO);
+        smsEmail.setStatus(result?Constants.ONE:Constants.TWO);
+        smsEmail.setType(Constants.ONE);
         smsEmail.setObjId(billId);
         smsEmail.setObjType(Constants.TWO+"");
         smsEmail.setContent(content);
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 5d36fa2..e456e57 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
@@ -232,6 +232,17 @@
                 ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee())
         );
 
+        if(Constants.equalsInteger(ywContractBill.getStatus(),Constants.ZERO)
+                && (Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ZERO)
+                || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)
+                || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.THREE)
+                || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.FOUR))
+                && Utils.Date.getEnd(ywContractBill.getPlanPayDate()).getTime() < System.currentTimeMillis()){
+            ywContractBill.setIsOverdue(Constants.ONE);
+        }else{
+            ywContractBill.setIsOverdue(Constants.ZERO);
+        }
+
         //鎴挎簮鏁版嵁
         ywContractBill.setYwContractRoomList(
                 ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
@@ -239,8 +250,8 @@
                 .selectAs(YwProject::getName,YwRoom::getProjectName)
                 .selectAs(YwFloor::getName,YwRoom::getFloorName)
                 .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
-                .selectAs(YwRoom::getCode,YwContractRoom::getRoomName)
-                .selectAs(YwRoom::getArea,YwContractRoom::getArea)
+                .selectAs(YwRoom::getRoomNum,YwContractRoom::getRoomName)
+                .selectAs(YwRoom::getRentArea,YwContractRoom::getArea)
                 .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                 .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                 .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
@@ -345,7 +356,7 @@
                 || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)
                 || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.THREE)
                 || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.FOUR))
-            && ywContractBill.getPlanPayDate().getTime() < System.currentTimeMillis()){
+            && Utils.Date.getEnd(ywContractBill.getPlanPayDate()).getTime() < System.currentTimeMillis()){
                 ywContractBill.setIsOverdue(Constants.ONE);
             }else{
                 ywContractBill.setIsOverdue(Constants.ZERO);
@@ -392,6 +403,8 @@
         IPage<YwContractBill> iPage = ywContractBillMapper.selectJoinPage(page,YwContractBill.class,
                 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  ")
+                        .select(" ifnull((select s.status  from sms_email s where s.OBJ_ID = t.id and s.OBJ_TYPE = 2 order by s.CREATE_DATE desc  limit 1 ),0)  ",YwContractBill::getIsSendEmail)
+                        .select(" ifnull((select s.status  from sms_email s where s.OBJ_ID = t.id and s.OBJ_TYPE = 1 order by s.CREATE_DATE desc  limit 1 ),0)  ",YwContractBill::getIsSendSms)
                         .selectAs(YwContract::getCode,YwContractBill::getContractCode)
                         .selectAs(YwCustomer::getName,YwContractBill::getCustomerName)
                         .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
@@ -405,12 +418,12 @@
                                 YwContractBill::getBillType,model.getBillType())
                         .eq(Objects.nonNull(model)&&Objects.nonNull(model.getPayStatus()),
                                 YwContractBill::getPayStatus,model.getPayStatus())
-                        .in(Objects.nonNull(model)&&Objects.nonNull(model.getPayStatus()),
-                                YwContractBill::getPayStatus,Constants.ZERO,Constants.THREE,Constants.TWO,Constants.FOUR)
+                        .in(YwContractBill::getPayStatus,Constants.ZERO,Constants.TWO,Constants.THREE)
                         .eq(Objects.nonNull(model)&&Objects.nonNull(model.getType()),
                                 YwContractBill::getType,model.getType())
                         .le(Objects.nonNull(model)&&Objects.nonNull(model.getIsOverdue())&&Constants.equalsInteger(model.getIsOverdue(),Constants.ONE),
                                 YwContractBill::getPlanPayDate, DateUtil.getCurrDateTime())
+                        .lt(YwContractBill::getPlanPayDate, DateUtil.getDate(new Date(),"yyyy-MM-dd"))
                         .eq(Objects.nonNull(model)&&Objects.nonNull(model.getIsOverdue())&&Constants.equalsInteger(model.getIsOverdue(),Constants.ONE),
                                 YwContractBill::getStatus, Constants.ZERO)
                         .ge(Objects.nonNull(model)&&Objects.nonNull(model.getPlanPayDateStart()),YwContractBill::getPlanPayDate, Utils.Date.getStart(model.getPlanPayDateStart()))
@@ -455,7 +468,7 @@
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBillList)){
             //鑾峰彇鎵�鏈夋暟鎹�
             List<Integer> billIdList = ywContractBillList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)).map(i->i.getId()).collect(Collectors.toList());
-            List<Integer> contractIdList = ywContractBillList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).map(i->i.getContractId()).collect(Collectors.toList());
+            List<Integer> contractIdList = ywContractBillList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)||Constants.equalsInteger(i.getType(),Constants.TWO)).map(i->i.getContractId()).collect(Collectors.toList());
             List<YwContractRoom> ywContractRoomList  = new ArrayList<>();
             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(billIdList)){
                 ywContractRoomList.addAll( ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
@@ -463,7 +476,7 @@
                         .selectAs(YwProject::getName,YwRoom::getProjectName)
                         .selectAs(YwFloor::getName,YwRoom::getFloorName)
                         .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
-                        .selectAs(YwRoom::getCode,YwContractRoom::getRoomName)
+                        .selectAs(YwRoom::getRoomNum,YwContractRoom::getRoomName)
                         .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                         .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                         .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
@@ -479,7 +492,7 @@
                         .selectAs(YwProject::getName,YwRoom::getProjectName)
                         .selectAs(YwFloor::getName,YwRoom::getFloorName)
                         .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
-                        .selectAs(YwRoom::getCode,YwContractRoom::getRoomName)
+                        .selectAs(YwRoom::getRoomNum,YwContractRoom::getRoomName)
                         .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                         .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                         .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
@@ -690,7 +703,8 @@
                     .selectAs(YwContractDetail::getType,YwContractBill::getDetailType)
                     .selectAs(YwContract::getZlPayType,YwContractBill::getZlPayType)
                     .selectAs(YwContract::getWyPayType,YwContractBill::getWyPayType)
-                    .select(" ( select ifnull(sum(y.rent_area),0) from yw_room y left join yw_contract_room yr on y.id = yr.room_id where yr.contract_id = t.contract_id and y.IS_INVESTMENT = 0 and yr.type = 0 )  " , YwContractBill::getTotalArea)
+                    .select(" ( select ifnull(sum(y.rent_area),0) from yw_room y left join yw_contract_room yr on y.id = yr.room_id where yr.contract_id = t.contract_id and y.IS_INVESTMENT = 1 and yr.type = 0 )  " , YwContractBill::getTotalArea)
+                    .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  ")
                     .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
                     .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                     .leftJoin(YwContractDetail.class,YwContractDetail::getId,YwContractBill::getDetailId)
@@ -825,7 +839,7 @@
             }else if(y.getTitle().equals("${搴旀敹鏃ユ湡}")&&Objects.nonNull(ywContractBill.getPlanPayDate())){
                 y.setUrl(DateUtil.formatDate(ywContractBill.getPlanPayDate(),"yyyy-MM-dd"));
             }else if(y.getTitle().equals("${搴旀敹閲戦}")&&Objects.nonNull(ywContractBill.getReceivableFee())){
-                y.setUrl(ywContractBill.getReceivableFee().toString());
+                y.setUrl((ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee())).setScale(2).toString());
             }else if(y.getTitle().equals("${璐﹀崟澶囨敞}")){
                 if(StringUtils.isNotBlank(ywContractBill.getRemark())){
                     y.setUrl(ywContractBill.getRemark());
@@ -926,14 +940,19 @@
                     .selectAs(YwContractDetail::getType,YwContractBill::getDetailType)
                     .selectAs(YwContract::getZlPayType,YwContractBill::getZlPayType)
                     .selectAs(YwContract::getWyPayType,YwContractBill::getWyPayType)
-                    .select(" ( select ifnull(sum(r.rent_area),0) from yw_room y left join yw_contract_room yr on y.id = yr.room_id where yr.contract_id = t.contract_id and y.IS_INVESTMENT = 0 and yr.type = 0 )  " , YwContractBill::getTotalArea)
+                    .select(" ( select ifnull(sum(y.rent_area),0) from yw_room y left join yw_contract_room yr on y.id = yr.room_id where yr.contract_id = t.contract_id and y.IS_INVESTMENT = 1 and yr.type = 0 )  " , YwContractBill::getTotalArea)
                     .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
                     .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                     .leftJoin(YwContractDetail.class,YwContractDetail::getId,YwContractBill::getDetailId)
                     .eq(YwContractBill::getId,ywSmsEmailBillCallDTO.getBillId())
                     .last( "limit 1" )
             );
-            this.dealTempData(tempList,ywContractBill,loginUserInfo);
+
+            List<YwContractBill> ywContractBillList = new ArrayList<>();
+            ywContractBillList.add(ywContractBill);
+            this.dealRoomDetail(ywContractBillList);
+
+//            this.dealTempData(tempList,ywContractBill,loginUserInfo);
             Member member = memberMapper.selectById(ywSmsEmailBillCallDTO.getUserId());
             if(Objects.isNull(member)){
                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀛樺湪鏈煡璇㈠埌鐨勪汉鍛樹俊鎭�");
@@ -947,11 +966,10 @@
                 if(Constants.equalsInteger(ywSmsEmailBillCallDTO.getSendEmail(),Constants.ONE) && StringUtils.isNotBlank(member.getEmail())
                         && emailTempConfigOptional.isPresent()){
                     String content = this.dealTempSmsEmailData(emailTempConfigOptional.get().getTitle(),tempList,ywContractBill,loginUserInfo);
-                    smsEmailService.sendEmail(content,member.getEmail(),ywContractBill.getId());
+                    smsEmailService.sendEmail(member.getEmail(),content,ywContractBill.getId());
                 }
             }
         }
-         
     }
 
 
@@ -963,82 +981,87 @@
         for (YwTempConfig y:ywTempConfigList) {
             if(y.getTitle().equals("${璐圭敤鍚嶇О}")&&Objects.nonNull(ywContractBill.getCostType())){
                 //璐圭敤绫诲瀷锛�0=绉熻祦璐癸紱1=鐗╀笟璐癸紱2=绉熻祦鎶奸噾锛�3=鐗╀笟鎶奸噾锛�4=姘寸數璐癸紱5=鏉傞」璐癸紱6=鍏朵粬; 7=淇濊瘉閲�
-                if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.ZERO)){ 
-                    tempStr.replace("${璐圭敤鍚嶇О}","绉熻祦璐�");
+                if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.ZERO)){
+                    tempStr = tempStr.replace("${璐圭敤鍚嶇О}","绉熻祦璐�");
                 }else if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.ONE)){
-                    tempStr.replace("${璐圭敤鍚嶇О}","鐗╀笟璐�");
+                    tempStr = tempStr.replace("${璐圭敤鍚嶇О}","鐗╀笟璐�");
                 }else if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.TWO)){
-                    tempStr.replace("${璐圭敤鍚嶇О}","绉熻祦鎶奸噾");
+                    tempStr = tempStr.replace("${璐圭敤鍚嶇О}","绉熻祦鎶奸噾");
                 }else if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.THREE)){
-                    tempStr.replace("${璐圭敤鍚嶇О}","鐗╀笟鎶奸噾");
+                  tempStr =   tempStr.replace("${璐圭敤鍚嶇О}","鐗╀笟鎶奸噾");
                 }else if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.FOUR)){
-                    tempStr.replace("${璐圭敤鍚嶇О}","姘寸數璐�");
+                  tempStr =   tempStr.replace("${璐圭敤鍚嶇О}","姘寸數璐�");
                 }else if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.FIVE)){
-                    tempStr.replace("${璐圭敤鍚嶇О}","鏉傞」璐�");
+                  tempStr =   tempStr.replace("${璐圭敤鍚嶇О}","鏉傞」璐�");
                 }else if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.SIX)){
-                    tempStr.replace("${璐圭敤鍚嶇О}","鍏朵粬");
+                  tempStr =   tempStr.replace("${璐圭敤鍚嶇О}","鍏朵粬");
                 }else if(Constants.equalsInteger(ywContractBill.getCostType(),Constants.SEVEN)){
-                    tempStr.replace("${璐圭敤鍚嶇О}","淇濊瘉閲�");
+                  tempStr =   tempStr.replace("${璐圭敤鍚嶇О}","淇濊瘉閲�");
                 }
-            }else if(y.getTitle().equals("${璁¤垂鍛ㄦ湡}")&&Objects.nonNull(ywContractBill.getDetailType())){
-                if(Constants.equalsInteger(ywContractBill.getDetailType(),Constants.ZERO)){
-                    //绉熻祦鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�
-                    if(Objects.nonNull(ywContractBill.getZlPayType())){
-                        if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.ZERO)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�娆℃�т粯娆�");
-                        }else if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.ONE)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","姣忎笁涓湀涓�浠�");
-                        }else if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.TWO)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","鍏釜鏈堜竴浠�");
-                        }else if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.THREE)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�骞翠竴浠�");
+            }else if(y.getTitle().equals("${璁¤垂鍛ㄦ湡}")){
+                if(Objects.nonNull(ywContractBill.getDetailType())){
+                    if(Constants.equalsInteger(ywContractBill.getDetailType(),Constants.ZERO)){
+                        //绉熻祦鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�
+                        if(Objects.nonNull(ywContractBill.getZlPayType())){
+                            if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.ZERO)){
+                                tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�娆℃�т粯娆�");
+                            }else if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.ONE)){
+                                tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","姣忎笁涓湀涓�浠�");
+                            }else if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.TWO)){
+                                tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","鍏釜鏈堜竴浠�");
+                            }else if(Constants.equalsInteger(ywContractBill.getZlPayType(),Constants.THREE)){
+                                tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�骞翠竴浠�");
+                            }
+                        }
+                    }else{
+                        //鐗╀笟鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�
+                        if(Objects.nonNull(ywContractBill.getWyPayType())){
+                            if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.ZERO)){
+                                tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�娆℃�т粯娆�");
+                            }else if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.ONE)){
+                                tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","姣忎笁涓湀涓�浠�");
+                            }else if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.TWO)){
+                                tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","鍏釜鏈堜竴浠�");
+                            }else if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.THREE)){
+                                tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�骞翠竴浠�");
+                            }
                         }
                     }
                 }else{
-                    //鐗╀笟鏀粯鏂瑰紡 0=涓�娆℃�т粯娆撅紱1=姣忎笁涓湀涓�浠橈紱2=鍏釜鏈堜竴浠橈紱3=涓�骞翠竴浠�
-                    if(Objects.nonNull(ywContractBill.getWyPayType())){
-                        if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.ZERO)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�娆℃�т粯娆�");
-                        }else if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.ONE)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","姣忎笁涓湀涓�浠�");
-                        }else if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.TWO)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","鍏釜鏈堜竴浠�");
-                        }else if(Constants.equalsInteger(ywContractBill.getWyPayType(),Constants.THREE)){
-                            tempStr.replace("${璁¤垂鍛ㄦ湡}","涓�骞翠竴浠�");
-                        }
-                    }
+                    tempStr = tempStr.replace("${璁¤垂鍛ㄦ湡}","");
                 }
+
             }else if(y.getTitle().equals("${鍗曚环}")&&Objects.nonNull(ywContractBill.getPrice())){
-                tempStr.replace("${鍗曚环}",ywContractBill.getPrice().toString());
+                tempStr = tempStr.replace("${鍗曚环}",ywContractBill.getPrice().setScale(2).toString());
             }else if(y.getTitle().equals("${鍗曚綅}")&&Objects.nonNull(ywContractBill.getCircleType())){
                 //浠樻鍛ㄦ湡绫诲瀷 0=鍏冩瘡骞崇背澶�;1=鍏冩瘡骞崇背鏈�;2=鍏冩瘡骞崇背骞�;3=鍏冩瘡澶�;4=鍏冩瘡鏈�;5=鍏冩瘡骞�;6=鍏冩瘡鍦�;
                 if(Constants.equalsInteger(ywContractBill.getCircleType(),Constants.ZERO)){
-                    tempStr.replace("${鍗曚綅}","鍏冩瘡骞崇背澶�");
+                  tempStr =   tempStr.replace("${鍗曚綅}","鍏冩瘡骞崇背澶�");
                 }else if(Constants.equalsInteger(ywContractBill.getCircleType(),Constants.ONE)){
-                    tempStr.replace("${鍗曚綅}","鍏冩瘡骞崇背鏈�");
+                  tempStr =   tempStr.replace("${鍗曚綅}","鍏冩瘡骞崇背鏈�");
                 }else if(Constants.equalsInteger(ywContractBill.getCircleType(),Constants.TWO)){
-                    tempStr.replace("${鍗曚綅}","鍏冩瘡骞崇背骞�");
+                  tempStr =   tempStr.replace("${鍗曚綅}","鍏冩瘡骞崇背骞�");
                 } else if(Constants.equalsInteger(ywContractBill.getCircleType(),Constants.THREE)){
-                    tempStr.replace("${鍗曚綅}","鍏冩瘡澶�");
+                  tempStr =   tempStr.replace("${鍗曚綅}","鍏冩瘡澶�");
                 } else if(Constants.equalsInteger(ywContractBill.getCircleType(),Constants.FOUR)){
-                    tempStr.replace("${鍗曚綅}","鍏冩瘡鏈�");
+                  tempStr =   tempStr.replace("${鍗曚綅}","鍏冩瘡鏈�");
                 } else if(Constants.equalsInteger(ywContractBill.getCircleType(),Constants.FIVE)){
-                    tempStr.replace("${鍗曚綅}","鍏冩瘡骞�");
+                  tempStr =   tempStr.replace("${鍗曚綅}","鍏冩瘡骞�");
                 } else if(Constants.equalsInteger(ywContractBill.getCircleType(),Constants.SIX)){
-                    tempStr.replace("${鍗曚綅}","鍏冩瘡鍦�");
+                  tempStr =   tempStr.replace("${鍗曚綅}","鍏冩瘡鍦�");
                 }
             }else if(y.getTitle().equals("${搴旀敹鏃ユ湡}")&&Objects.nonNull(ywContractBill.getPlanPayDate())){
-                tempStr.replace("${搴旀敹鏃ユ湡}",DateUtil.formatDate(ywContractBill.getPlanPayDate(),"yyyy-MM-dd"));
+                tempStr = tempStr.replace("${搴旀敹鏃ユ湡}",DateUtil.formatDate(ywContractBill.getPlanPayDate(),"yyyy-MM-dd"));
             }else if(y.getTitle().equals("${搴旀敹閲戦}")&&Objects.nonNull(ywContractBill.getReceivableFee())){
-                tempStr.replace("${搴旀敹閲戦}",ywContractBill.getReceivableFee().toString());
+                tempStr = tempStr.replace("${搴旀敹閲戦}",(ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee())).setScale(2).toString());
             }else if(y.getTitle().equals("${璐﹀崟澶囨敞}")){
                 if(StringUtils.isNotBlank(ywContractBill.getRemark())){
-                    tempStr.replace("${璐﹀崟澶囨敞}",ywContractBill.getRemark());
+                  tempStr =   tempStr.replace("${璐﹀崟澶囨敞}",ywContractBill.getRemark());
                 }else{
-                    tempStr.replace("${璐﹀崟澶囨敞}","");
+                  tempStr =   tempStr.replace("${璐﹀崟澶囨敞}","");
                 }
             }else if(y.getTitle().equals("${绉熷鍚嶇О}")&&StringUtils.isNotBlank(ywContractBill.getCustomerName())){
-                tempStr.replace("${绉熷鍚嶇О}",ywContractBill.getCustomerName());
+                tempStr = tempStr.replace("${绉熷鍚嶇О}",ywContractBill.getCustomerName());
             }else if(y.getTitle().equals("${鎴块棿淇℃伅}")){
                 if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBill.getYwContractRoomList())){
                     StringBuilder roomPathName = new StringBuilder();
@@ -1059,32 +1082,32 @@
                             roomPathName.append(";");
                         }
                     }
-                    tempStr.replace("${鎴块棿淇℃伅}",roomPathName.toString());
+                    tempStr = tempStr.replace("${鎴块棿淇℃伅}",roomPathName.toString());
                 }
             }else if(y.getTitle().equals("${绉熻祦闈㈢Н}")&&Objects.nonNull(ywContractBill.getTotalArea())){
                 tempStr.replace("${绉熻祦闈㈢Н}",ywContractBill.getTotalArea().toString());
             }else if(y.getTitle().equals("${鎵�灞炲叕鍙歌处鎴峰悕绉皚")){
                 if(Objects.nonNull(ywAccount)&&StringUtils.isNotBlank(ywAccount.getName())){
-                    tempStr.replace("${鎵�灞炲叕鍙歌处鎴峰悕绉皚",ywAccount.getName());
+                  tempStr =   tempStr.replace("${鎵�灞炲叕鍙歌处鎴峰悕绉皚",ywAccount.getName());
                 }else{
-                    tempStr.replace("${鎵�灞炲叕鍙歌处鎴峰悕绉皚","-");
+                  tempStr =   tempStr.replace("${鎵�灞炲叕鍙歌处鎴峰悕绉皚","-");
                 }
             }else if(y.getTitle().equals("${鎵�灞炲叕鍙搁摱琛岃处鍙穧")){ 
                 if(Objects.nonNull(ywAccount)&&StringUtils.isNotBlank(ywAccount.getName())){
-                    tempStr.replace("${鎵�灞炲叕鍙搁摱琛岃处鍙穧",ywAccount.getName());
+                  tempStr =   tempStr.replace("${鎵�灞炲叕鍙搁摱琛岃处鍙穧",ywAccount.getName());
                 }else{
-                    tempStr.replace("${鎵�灞炲叕鍙搁摱琛岃处鍙穧","-");
+                  tempStr =   tempStr.replace("${鎵�灞炲叕鍙搁摱琛岃处鍙穧","-");
                 }
             }else if(y.getTitle().equals("${鎵�灞炲叕鍙稿紑鎴烽摱琛寎")){
                 if(Objects.nonNull(ywAccount)&&StringUtils.isNotBlank(ywAccount.getBankNo())){
-                    tempStr.replace("${鎵�灞炲叕鍙稿紑鎴烽摱琛寎",ywAccount.getBankNo());
+                  tempStr =   tempStr.replace("${鎵�灞炲叕鍙稿紑鎴烽摱琛寎",ywAccount.getBankNo());
                 }else{
-                    tempStr.replace("${鎵�灞炲叕鍙稿紑鎴烽摱琛寎","-");
+                  tempStr =   tempStr.replace("${鎵�灞炲叕鍙稿紑鎴烽摱琛寎","-");
                 }
             }else if(y.getTitle().equals("${閫氱煡鍗曠敓鎴愭棩鏈焳")){
-                tempStr.replace("${閫氱煡鍗曠敓鎴愭棩鏈焳",DateUtil.formatDate(new Date(),"yyyy-MM-dd"));
+                tempStr = tempStr.replace("${閫氱煡鍗曠敓鎴愭棩鏈焳",DateUtil.formatDate(new Date(),"yyyy-MM-dd"));
             }else if(y.getTitle().equals("${鍒惰〃浜哄悕绉皚")){
-                tempStr.replace("${鍒惰〃浜哄悕绉皚",loginUserInfo.getRealname());
+                tempStr = tempStr.replace("${鍒惰〃浜哄悕绉皚",loginUserInfo.getRealname());
             } 
         }
         return tempStr;
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 49ecb0b..383ca4c 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
@@ -84,7 +84,7 @@
         model.setEditor(model.getCreator());
         if(model.getStartDate().getTime() > System.currentTimeMillis()){
             model.setStatus(Constants.ZERO);
-        }else if(model.getStartDate().getTime() <= System.currentTimeMillis() && model.getEndDate().getTime() > System.currentTimeMillis()){
+        }else if(model.getStartDate().getTime() <= System.currentTimeMillis() && Utils.Date.getEnd(model.getEndDate()).getTime() > System.currentTimeMillis()){
             model.setStatus(Constants.ONE);
         }else{
             model.setStatus(Constants.TWO);
@@ -112,6 +112,12 @@
             t.setEditor(model.getCreator());
             t.setType(Constants.ZERO);
             list.add(t);
+        }
+        if(Constants.equalsInteger(model.getStatus(),Constants.ONE)){
+            //鏇存柊鎴挎簮鏁版嵁涓虹璧佷腑
+            roomMapper.update(new UpdateWrapper<YwRoom>().lambda().set(YwRoom::getLeaseNowStatus,Constants.ONE)
+                    .in(YwRoom::getId,model.getRoomList().stream().map(i->i.getId()).collect(Collectors.toList()))
+            );
         }
         ywContractRoomMapper.insert(list);
     }
@@ -341,6 +347,13 @@
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
     public  Integer backRent(YwContract param){
         isParamValidBackRent(param);
+        YwContract model = ywContractMapper.selectById(param.getId());
+        if(Objects.isNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!(model.getStartDate().getTime()<=param.getBtDate().getTime()&&model.getEndDate().getTime()>=param.getBtDate().getTime())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閫�绉熸棩鏈熼敊璇紝璇锋鏌ラ��绉熸棩鏈熼渶鍦ㄥ悎鍚屾棩鏈熷唴锛�");
+        }
         param.setEditDate(new Date());
         param.setEditor(param.getLoginUserInfo().getId());
         //澶勭悊
@@ -364,30 +377,47 @@
         update.setBtRemark(getbackRentRemarkByParam(param));
         ywContractMapper.updateById(update);
         dealLogBiz(param,Constants.YwLogType.CONTRACT_BACK, param.getLoginUserInfo().getRealname(),getbackRentLogByParam(param));
+        //濡傛灉閫�绉熸棩鏈熷皬浜庡綋鍓嶆棩鏈� 鍒欑洿鎺ラ噴鏀炬埧婧愪俊鎭� 鏈璧�
+        if(Utils.Date.getEnd(param.getBtDate()).getTime()<System.currentTimeMillis()){
+            List<YwContractRoom> contractRoomList = ywContractRoomMapper.selectList(new QueryWrapper<YwContractRoom>().lambda()
+                    .eq(YwContractRoom::getContractId, param.getId()));
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(contractRoomList)){
+                //鏇存柊鎴挎簮鏁版嵁涓烘湭绉熻祦
+                roomMapper.update(new UpdateWrapper<YwRoom>().lambda().set(YwRoom::getLeaseNowStatus,Constants.ZERO)
+                        .in(YwRoom::getId,contractRoomList.stream().map(i->i.getRoomId()).collect(Collectors.toList()))
+                );
+            }
+        }
         return param.getId();
     }
 
 
     @Override
     public  void dealTimeOut(){
-        //瀹氭椂澶勭悊鍚堝悓鎵ц涓�
-        ywContractMapper.update(new UpdateWrapper<YwContract>()
-                .lambda()
-                .set(YwContract::getStatus,Constants.ONE)
-                .set(YwContract::getEditDate,DateUtil.getCurrDateTime())
+
+        List<YwContract> listA = ywContractMapper.selectList(new QueryWrapper<YwContract>().lambda()
                 .eq(YwContract::getIsdeleted,Constants.ZERO)
                 .in(YwContract::getStatus,Constants.ZERO)
                 .apply(" START_DATE < NOW()  AND END_DATE > NOW() ")
         );
-        //瀹氭椂澶勭悊鍚堝悓宸茶繃鏈�
-        ywContractMapper.update(new UpdateWrapper<YwContract>()
-                        .lambda()
-                .set(YwContract::getStatus,Constants.TWO)
-                .set(YwContract::getEditDate,DateUtil.getCurrDateTime())
-                .eq(YwContract::getIsdeleted,Constants.ZERO)
-                .in(YwContract::getStatus,Constants.ONE,Constants.ZERO)
-                .apply(" END_DATE < CURRENT_DATE ")
-        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(listA)){
+            //瀹氭椂澶勭悊鍚堝悓鎵ц涓�
+            ywContractMapper.update(new UpdateWrapper<YwContract>()
+                    .lambda()
+                    .set(YwContract::getStatus,Constants.ONE)
+                    .set(YwContract::getEditDate,DateUtil.getCurrDateTime())
+                    .in(YwContract::getId,listA.stream().map(i->i.getId()).collect(Collectors.toList()))
+            );
+
+            List<YwContractRoom> contractRoomList = ywContractRoomMapper.selectList(new QueryWrapper<YwContractRoom>().lambda().in(YwContractRoom::getContractId,
+                    listA.stream().map(i->i.getId()).collect(Collectors.toList())));
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(contractRoomList)){
+                //鏇存柊鎴挎簮鏁版嵁涓虹璧佷腑
+                roomMapper.update(new UpdateWrapper<YwRoom>().lambda().set(YwRoom::getLeaseNowStatus,Constants.ONE)
+                        .in(YwRoom::getId,contractRoomList.stream().map(i->i.getRoomId()).collect(Collectors.toList()))
+                );
+            }
+        }
 
     }
 
@@ -420,7 +450,7 @@
                         ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                     if(bill.getStartDate().getTime()<=param.getBtDate().getTime()){
                         canBills.add(bill);
-                        canBillCount = canBillCount ++;
+                        canBillCount = canBillCount + 1 ;
                     }else{
                         //濡傛灉杩樻病寮�濮嬶紝璐﹀崟鐩存帴鍏抽棴
                         closeBills.add(bill);
@@ -432,11 +462,11 @@
                         noBills.add(bill);
                     }else{
                         canBills.add(bill);
-                        canBillCount = canBillCount ++;
+                        canBillCount = canBillCount + 1 ;
                     }
                 }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.TWO) ){
                      canBills.add(bill);
-                    canBillCount = canBillCount ++;
+                    canBillCount = canBillCount + 1 ;
                 }
             }
         }
@@ -464,12 +494,17 @@
                     if(fee.compareTo(new BigDecimal(0))== 0){
                         //濡傛灉璐圭敤姝eソ锛屽垯淇敼璐﹀崟淇℃伅涓哄凡缁撴竻
                         b.setPayStatus(Constants.ONE);
-                        canBillCount = canBillCount --;
-                    }else if(fee.compareTo(new BigDecimal(0))> 0){
+                        canBillCount = canBillCount - 1 ;
+                    }else if(fee.compareTo(new BigDecimal(0))< 0){
                         //濡傛灉闇�瑕佽繘琛岄��娆撅紝鏇存柊璐﹀崟淇℃伅涓哄緟閫�娆�
                         b.setPayStatus(Constants.FOUR);
-                    }else if(fee.compareTo(new BigDecimal(0)) < 0){
-                        //濡傛灉璐﹀崟杩樻湁娆惧緟鏀讹紝鍒欎繚鎸佺姸鎬佷笉鍙�
+                    }else if(fee.compareTo(new BigDecimal(0)) > 0){
+                        //濡傛灉璐﹀崟杩樻湁娆惧緟鏀讹紝鍒欐洿鏂拌处鍗曚负寰呮敹娆�
+                        if(b.getPayStatus()==Constants.ZERO){
+                            b.setPayStatus(Constants.ZERO);
+                        }else if(b.getPayStatus()!=Constants.TWO){
+                            b.setPayStatus(Constants.TWO);
+                        }
                     }
                     b.setReceivableFee(editBill.getReceivableFee());
                 }
@@ -654,8 +689,8 @@
             //2025-1-23 13:56:53 鍔犲叆 鍓嶇鍏ュ弬璋冩暣鍚庣殑璐﹀崟淇℃伅
             List<YwContractBill> ywContractBillList = new ArrayList<>();
             //鏌ヨ绉熻祦鏉℃
-            if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                    || Constants.equalsInteger(model.getType(),Constants.TWO)&& com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(details1)){
+            if((Constants.equalsInteger(model.getType(),Constants.ZERO )
+                    || Constants.equalsInteger(model.getType(),Constants.TWO))&& com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(details1)){
                 YwContractDetail ywContractDetail = details1.get(Constants.ZERO);
                 YwContractBill zlBill = new YwContractBill();
                 BeanUtils.copyProperties(model.getZlBillDTO(),zlBill);
@@ -691,8 +726,8 @@
                 }
             }
             //鏌ヨ鐗╀笟璐﹀崟
-            if(Constants.equalsInteger(model.getType(),Constants.ZERO )
-                    || Constants.equalsInteger(model.getType(),Constants.TWO)&& com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(details2)){
+            if((Constants.equalsInteger(model.getType(),Constants.ZERO )
+                    || Constants.equalsInteger(model.getType(),Constants.ONE))&& com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(details2)){
                 YwContractDetail ywContractDetail = details2.get(Constants.ZERO);
                 YwContractBill wyBill = new YwContractBill();
                 BeanUtils.copyProperties(model.getWyBillDTO(),wyBill);
@@ -1396,7 +1431,7 @@
                 .selectAs(YwCustomer::getName, YwContract::getRenterName)
                 .selectAs(YwProject::getName, YwContract::getProjectName)
                 .select("t3.realname", YwContract::getCreatorName)
-                .select("(select sum(r.area) from yw_contract_room cr left join yw_room r on r.id = cr.room_id where r.isdeleted=0 and cr.contract_id =t.id)", YwContract::getTotalArea)
+                .select("(select sum(r.RENT_AREA) from yw_contract_room cr left join yw_room r on r.id = cr.room_id where r.isdeleted=0 and cr.contract_id =t.id)", YwContract::getTotalArea)
                 .leftJoin(Company.class, Company::getId, YwContract::getCompanyId)
                 .leftJoin(SystemUser.class, SystemUser::getId, YwContract::getUserId)
                 .leftJoin(SystemUser.class, SystemUser::getId, YwContract::getCreator)
@@ -1457,14 +1492,12 @@
         //鏌ヨ璐﹀崟闆嗗悎
         model.setBillList(ywContractBillMapper.selectJoinList(YwContractBill.class,new MPJLambdaWrapper<YwContractBill>()
                 .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  ")
                 .eq(  YwContractBill::getContractId,model.getId())
                 .eq(YwContractBill::getIsdeleted,Constants.ZERO)
                 .orderByAsc(YwContractBill::getSortnum,YwContractBill::getCreateDate)));
         for (YwContractBill ywContractBill:model.getBillList()) {
             ywContractBill.setNeedReceivableFee(ywContractBill.getReceivableFee());
-//            ywContractBill.setNeedReceivableFee(ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee()));
         }
         model.setCanBackRentBills(new ArrayList<>());
         long nowStart = Utils.Date.getStart(date).getTime();
@@ -1574,6 +1607,9 @@
         if (pageWrap.getModel().getCreateDate() != null) {
             queryWrapper.ge(YwContract::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
             queryWrapper.le(YwContract::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getStatusList() != null) {
+            queryWrapper.in(YwContract::getStatus, pageWrap.getModel().getStatusList());
         }
         if (pageWrap.getModel().getEditor() != null) {
             queryWrapper.eq(YwContract::getEditor, pageWrap.getModel().getEditor());
@@ -1712,4 +1748,63 @@
         QueryWrapper<YwContract> wrapper = new QueryWrapper<>(ywContract);
         return ywContractMapper.selectCount(wrapper);
     }
+
+
+    /**
+     * 鍒版湡鍚堝悓 鏈彂璧烽��绉熺殑杩涜鏁版嵁璋冩暣 鎶婂悎鍚屼笅鐨勬埧婧愰噴鏀� 瀹氭椂鏃堕棿闇�瑕佸湪姣忓ぉ鏅氫笂12鐐瑰墠
+     */
+    @Override
+    public void updRoomLeaseNowStatus(){
+
+        //瀹氭椂澶勭悊鍚堝悓宸茶繃鏈�
+        List<YwContract> ywContractList = ywContractMapper.selectList(new QueryWrapper<YwContract>().lambda()
+                .eq(YwContract::getIsdeleted,Constants.ZERO)
+                .in(YwContract::getStatus,Constants.ONE,Constants.ZERO)
+                .apply(" DATE(END_DATE) = CURRENT_DATE ")
+        );
+
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractList)){
+            ywContractMapper.update(new UpdateWrapper<YwContract>()
+                    .lambda()
+                    .set(YwContract::getStatus,Constants.TWO)
+                    .set(YwContract::getEditDate,DateUtil.getCurrDateTime())
+                    .in(YwContract::getId,ywContractList.stream().map(i->i.getId()).collect(Collectors.toList()))
+            );
+
+
+            List<YwContractRoom> contractRoomList = ywContractRoomMapper.selectList(new QueryWrapper<YwContractRoom>().lambda().in(YwContractRoom::getContractId,
+                    ywContractList.stream().map(i->i.getId()).collect(Collectors.toList())));
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(contractRoomList)){
+                //鏇存柊鎴挎簮鏁版嵁涓虹璧佷腑
+                roomMapper.update(new UpdateWrapper<YwRoom>().lambda().set(YwRoom::getLeaseNowStatus,Constants.ZERO)
+                        .in(YwRoom::getId,contractRoomList.stream().map(i->i.getRoomId()).collect(Collectors.toList()))
+                );
+            }
+        }
+    }
+
+
+    /**
+     * 閫�绉熶腑/宸查��绉熷悎鍚� 鎶婂埌浜嗛��绉熸棩鏈熸椂闂寸殑鏁版嵁 杩涜鎴挎簮閲婃斁 瀹氭椂鏃堕棿闇�瑕佸湪姣忓ぉ鏅氫笂12鐐瑰墠
+     */
+    @Override
+    public void updRentContractStatus(){
+        List<YwContract> ywContractList = ywContractMapper.selectList(new QueryWrapper<YwContract>().lambda()
+                .eq(YwContract::getIsdeleted,Constants.ZERO)
+                .in(YwContract::getStatus,Constants.THREE,Constants.FOUR)
+                .eq(YwContract::getBtDate,DateUtil.getCurrDate())
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractList)){
+            List<YwContractRoom> contractRoomList = ywContractRoomMapper.selectList(new QueryWrapper<YwContractRoom>().lambda().in(YwContractRoom::getContractId,
+                    ywContractList.stream().map(i->i.getId()).collect(Collectors.toList())));
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(contractRoomList)){
+                //鏇存柊鎴挎簮鏁版嵁涓哄緟绉熻祦
+                roomMapper.update(new UpdateWrapper<YwRoom>().lambda().set(YwRoom::getLeaseNowStatus,Constants.ZERO)
+                        .in(YwRoom::getId,contractRoomList.stream().map(i->i.getRoomId()).collect(Collectors.toList()))
+                );
+            }
+        }
+    }
+
+
 }
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 dda5508..69ddf41 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
@@ -430,7 +430,7 @@
         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());
+        ywDeviceStatusDataVO.setErrAmount(ywDeviceList.stream().filter(i->Objects.nonNull(i.getStatus())&&Constants.equalsInteger(i.getStatus(),Constants.TWO)).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 a434cd2..ea498da 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
@@ -1,6 +1,8 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A;
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.annotation.excel.ExcelImporter;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.LoginUserInfo;
@@ -9,11 +11,14 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.CategoryMapper;
 import com.doumee.dao.business.YwMaterialMapper;
 import com.doumee.dao.business.YwOutinboundMapper;
 import com.doumee.dao.business.YwOutinboundRecordMapper;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.MultifileMapper;
+import com.doumee.dao.system.dto.ImportMaterialDTO;
+import com.doumee.dao.system.dto.ImportSystemUserDTO;
 import com.doumee.dao.system.model.Multifile;
 import com.doumee.service.business.YwMaterialService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -22,16 +27,19 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import javafx.scene.paint.Material;
 import org.apache.commons.lang.StringUtils;
-import org.checkerframework.checker.units.qual.A;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 杩愮淮璧勪骇淇℃伅琛⊿ervice瀹炵幇
@@ -51,6 +59,9 @@
     private YwOutinboundRecordMapper ywOutinboundRecordMapper;
 
     @Autowired
+    private CategoryMapper categoryMapper;
+
+    @Autowired
     private SystemDictDataBiz systemDictDataBiz;
 
     @Override
@@ -67,8 +78,17 @@
         ywMaterial.setId(null);
         if(StringUtils.isBlank(ywMaterial.getCode())){
             //鑷姩鐢熸垚 TODO 瀛樺湪闂
-            Long countCode = ywMaterialMapper.selectCount(new QueryWrapper<YwMaterial>().lambda().eq(YwMaterial::getAutoCode, Constants.ONE));
-            String nextCode = StringUtils.leftPad(Long.toString(countCode + 1),4,"0");
+            YwMaterial lastAutoMaterial = ywMaterialMapper.selectOne(new QueryWrapper<YwMaterial>().lambda().eq(YwMaterial::getAutoCode,Constants.ONE).last("limit 1 "));
+            Long countCode = 0L;
+            String nextCode = StringUtils.leftPad(Long.toString(countCode + 1 ),4,"0");
+            if(Objects.nonNull(lastAutoMaterial)){
+                Long maxCode = Long.valueOf(lastAutoMaterial.getCode().replace("P",""));
+                nextCode = StringUtils.leftPad(Long.toString(maxCode + 1),4,"0");
+                while (ywMaterialMapper.selectCount(new QueryWrapper<YwMaterial>().lambda().eq(YwMaterial::getCode, "P"+nextCode))>Constants.ZERO){
+                    countCode = countCode + 1 ;
+                    nextCode = StringUtils.leftPad(Long.toString(countCode),4,"0");
+                }
+            }
             ywMaterial.setCode("P"+nextCode);
             ywMaterial.setAutoCode(Constants.ONE);
         }else{
@@ -247,4 +267,67 @@
         QueryWrapper<YwMaterial> wrapper = new QueryWrapper<>(ywMaterial);
         return ywMaterialMapper.selectCount(wrapper);
     }
+
+
+    @Override
+    public Integer importMaterialBatch(MultipartFile file,LoginUserInfo loginUserInfo) {
+        try {
+            ExcelImporter ie = new ExcelImporter(file, 0, 0);
+            List<ImportMaterialDTO> dataList = ie.getDataList(ImportMaterialDTO.class, null);
+            if (CollectionUtils.isEmpty(dataList)) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
+            }
+
+            List<Category> allCategory = categoryMapper.selectList(new QueryWrapper<Category>().lambda()
+                    .eq(Category::getIsdeleted,Constants.ZERO).eq(Category::getIsdeleted,Constants.ZERO)
+                    .eq(Category::getType,Constants.SEVEN)
+            );
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(allCategory)){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝鏃犲垎绫诲熀纭�鏁版嵁锛�");
+            }
+            List<Category> categoryList = allCategory.stream().filter(i->Objects.isNull(i.getParentId())).collect(Collectors.toList());
+            for (Category category: categoryList) {
+                category.setChildCategoryList(
+                        allCategory.stream().filter(i->Objects.nonNull(i.getParentId())&&Constants.equalsInteger(i.getParentId(),category.getId())).collect(Collectors.toList())
+                );
+            }
+            List<YwMaterial> ywMaterialList = new ArrayList<>();
+            for (int i = 0; i < dataList.size(); i++) {
+                ImportMaterialDTO importMaterialDTO = dataList.get(i);
+                if(Objects.isNull(importMaterialDTO)
+                    || StringUtils.isBlank(importMaterialDTO.getName())
+                    || StringUtils.isBlank(importMaterialDTO.getCategoryName())
+                    || StringUtils.isBlank(importMaterialDTO.getCategoryChildName())
+                    || StringUtils.isBlank(importMaterialDTO.getQrcode())
+                ){
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�"+(i+1)+"琛屽繀濉」缂哄け锛�");
+                }
+                YwMaterial ywMaterial = new YwMaterial();
+                BeanUtils.copyProperties(importMaterialDTO,ywMaterial);
+                Optional<Category> categoryOptional = categoryList.stream().filter(j->j.getName().equals(importMaterialDTO.getCategoryName())).findAny();
+                if(categoryOptional.isPresent()){
+                    Category category = categoryOptional.get();
+                    ywMaterial.setParentCateId(category.getId());
+                    Optional<Category> childCategoryOptional = category.getChildCategoryList().stream().filter(j->j.getName().equals(importMaterialDTO.getCategoryChildName())).findAny();
+                    if(childCategoryOptional.isPresent()){
+                        ywMaterial.setCateId(childCategoryOptional.get().getId());
+                    }else{
+                        throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�"+(i+1)+"琛岀墿鏂欏瓙鍒嗙被鏈煡璇㈠埌锛�");
+                    }
+                }else{
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�"+(i+1)+"琛岀墿鏂欏垎绫绘湭鏌ヨ鍒帮紒");
+                }
+                ywMaterialList.add(ywMaterial);
+            }
+
+            for (YwMaterial ywMaterial:ywMaterialList) {
+                ywMaterial.setLoginUserInfo(loginUserInfo);
+                this.create(ywMaterial);
+            }
+        } catch (Exception e) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),e.getMessage());
+
+        }
+        return null;
+    }
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java
index 203c692..42437cd 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwOutinboundServiceImpl.java
@@ -95,7 +95,7 @@
     public List<YwOutinboundRecord> verifyData(YwOutinbound ywOutinbound){
         if(Objects.isNull(ywOutinbound)
                 || Objects.isNull(ywOutinbound.getType())
-//                || (Objects.nonNull(ywOutinbound.getType()) && (!(ywOutinbound.getType() == Constants.ZERO || ywOutinbound.getType() == Constants.ONE)))
+                || ((ywOutinbound.getType() >= 5 && ywOutinbound.getType() <= 9 ) && Objects.isNull(ywOutinbound.getOutUserId()) )
                 || Objects.isNull(ywOutinbound.getWarehouseId())
                 || Objects.isNull(ywOutinbound.getDoneDate())
                 || com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywOutinbound.getRecordList())
@@ -158,9 +158,9 @@
                 //鍑哄簱
                 if(Objects.isNull(ywStock) || ywStock.getStock().compareTo(ywOutinboundRecord.getStock()) < Constants.ZERO){
                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), ywMaterial.getName() + "搴撳瓨涓嶈冻锛岃鍒锋柊閲嶈瘯");
-                }else if(ywStock.getStock().compareTo(ywOutinboundRecord.getStock()) == Constants.ZERO){
+                }/*else if(ywStock.getStock().compareTo(ywOutinboundRecord.getStock()) == Constants.ZERO){
                     ywStockMapper.deleteById(ywStock.getId());
-                }else{
+                }*/else{
                     ywStockMapper.update(new UpdateWrapper<YwStock>().lambda()
                             .setSql(" stock = ( stock - "+ywOutinboundRecord.getStock()+") ")
                             .set(YwStock::getEditDate, DateUtil.getCurrDateTime())
@@ -252,22 +252,29 @@
         }
         List<Integer> typeList  = Constants.ywOutInType.getAllTypeKey(model.getInOut());
         queryWrapper.selectAll(YwOutinbound.class)
-                .selectAs(SystemUser::getRealname,YwOutinbound::getCreateUserName)
+                .select(" s1.realname  ",YwOutinbound::getCreateUserName)
+                .select(" s2.realname  ",YwOutinbound::getOutUserName)
                 .selectAs(YwWarehouse::getName,YwOutinbound::getWarehouseName)
-                .leftJoin(SystemUser.class,SystemUser::getId,YwOutinbound::getCreator)
                 .leftJoin(YwWarehouse.class,YwWarehouse::getId,YwOutinbound::getWarehouseId)
+                .leftJoin("system_user s1 on t.creator = s1.id")
+                .leftJoin("system_user s2 on t.out_user_id = s2.id")
                 .like(StringUtils.isNotBlank(model.getCode()),YwOutinbound::getCode,model.getCode())
                 .eq(Objects.nonNull(model.getType()),YwOutinbound::getType,model.getType())
                 .eq(Objects.nonNull(model.getWarehouseId()),YwOutinbound::getWarehouseId,model.getWarehouseId())
                 .in(Objects.nonNull(model.getInOut()),YwOutinbound::getType,typeList)
         ;
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(pageWrap.getSorts())){
+            for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+                if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                    queryWrapper.orderByDesc(sortData.getProperty());
+                } else {
+                    queryWrapper.orderByAsc(sortData.getProperty());
+                }
             }
+        }else{
+            queryWrapper.orderByDesc(YwOutinbound::getCode);
         }
+
         IPage iPage = ywOutinboundMapper.selectJoinPage(page,YwOutinbound.class,queryWrapper);
         if(Objects.nonNull(iPage.getRecords())){
             iPage.setRecords(this.getDetailData(iPage.getRecords()));
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
index 548644c..12799da 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolPointServiceImpl.java
@@ -22,14 +22,32 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.google.zxing.qrcode.encoder.ByteMatrix;
+import com.google.zxing.qrcode.encoder.Encoder;
+import com.google.zxing.qrcode.encoder.QRCode;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.util.*;
 
 /**
  * 杩愮淮宸℃鐐逛俊鎭〃Service瀹炵幇
@@ -49,15 +67,21 @@
     @Override
     public Integer create(YwPatrolPoint ywPatrolPoint) {
         if(Objects.isNull(ywPatrolPoint)
-                || Objects.isNull(ywPatrolPoint.getCode())
+//                || Objects.isNull(ywPatrolPoint.getCode())
                 || Objects.isNull(ywPatrolPoint.getName())
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
-        if(ywPatrolPointMapper.selectCount(new QueryWrapper<YwPatrolPoint>().lambda().eq(YwPatrolPoint::getIsdeleted,Constants.ZERO)
-                .eq(YwPatrolPoint::getCode,ywPatrolPoint.getCode()))>Constants.ZERO){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"宸℃鐐圭紪鐮侀噸澶�!");
+
+        String pre =  systemDictDataBiz.queryByCode(Constants.XUNJIAN,Constants.XJ_POINT_PREFIX).getCode();
+        int length = 8;
+        try {
+            length =  Integer.parseInt(systemDictDataBiz.queryByCode(Constants.XUNJIAN,Constants.XJ_POINT_CODE_LENGTH).getCode());
+        }catch (Exception e){
         }
+        long num = ywPatrolPointMapper.selectCount(new QueryWrapper<YwPatrolPoint>());
+
+        ywPatrolPoint.setCode(pre+Constants.formartNumString (length,(num+1)));
         LoginUserInfo loginUserInfo = ywPatrolPoint.getLoginUserInfo();
         ywPatrolPoint.setCreateDate(new Date());
         ywPatrolPoint.setCreator(loginUserInfo.getId());
@@ -82,10 +106,11 @@
 
     @Override
     public void deleteById(Integer id, LoginUserInfo user) {
-        ywPatrolPointMapper.update(new UpdateWrapper<YwPatrolPoint>().lambda().set(YwPatrolPoint::getIsdeleted,Constants.ONE)
+        ywPatrolPointMapper.update(new UpdateWrapper<YwPatrolPoint>().lambda()
+                .set(YwPatrolPoint::getIsdeleted,Constants.ONE)
                 .set(YwPatrolPoint::getEditDate, DateUtil.getCurrDateTime())
                 .set(YwPatrolPoint::getEditor,user.getId())
-                .eq(YwPatrolPoint::getId,user.getId())
+                .eq(YwPatrolPoint::getId,id)
         );
     }
 
@@ -94,7 +119,120 @@
         UpdateWrapper<YwPatrolPoint> deleteWrapper = new UpdateWrapper<>(ywPatrolPoint);
         ywPatrolPointMapper.delete(deleteWrapper);
     }
+    @Override
+    public void exportQrcodes(Integer id, HttpServletResponse response){
+        try {
+            List<File>  fileList = new ArrayList<>();
+            List<YwPatrolPoint> bikesList = ywPatrolPointMapper.selectList(new QueryWrapper<YwPatrolPoint>().lambda()
+                    .eq(YwPatrolPoint::getIsdeleted,Constants.ZERO)
+                    .eq(id!=null,YwPatrolPoint::getId,id)
+            );
+            if(bikesList== null || bikesList.size() == 0){
+                throw  new BusinessException(ResponseStatus.DATA_EMPTY);
+            }
+            // 鍒涘缓涓存椂鏂囦欢鐨勫墠缂�鍜屽悗缂�
+            String path =  systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_AUTH_URL).getCode();
+            String uri =  systemDictDataBiz.queryByCode(Constants.XUNJIAN,Constants.XJ_RERIRECT_URI).getCode();
+            String appId = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_APPID).getCode() ;
+            // 鍒涘缓涓存椂鏂囦欢
+            for(YwPatrolPoint l : bikesList){
+                if(StringUtils.isNotBlank(l.getCode())){
+                    String redirectUri = uri.replace("${ywid}",l.getCode());
+                    String url = path.replace("${url}",URLEncoder.encode(redirectUri)).replace("${appid}",appId);
+                    File file =  generateQRCodeImage(url,100,100,l.getCode()+".png");
+                    if(file!=null && file.isFile()){
+                        fileList.add(file);
+                    }
+                }
+            }
+            if(fileList == null || fileList.size() == 0){
+                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝涓嬭浇鍐呭涓虹┖锛屾搷浣滃け璐ワ紒");
+            }
+            String fileName =  "宸℃鐐逛簩缁寸爜瀵煎嚭_"+System.currentTimeMillis()+".zip" ;
+            String encodeFileName =URLEncoder.encode(fileName, Charset.forName("UTF-8").toString())+".zip";
+            response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
+            response.setContentType("application/octet-stream");
+            response.setHeader("eva-opera-type", "download");
+            response.setHeader("eva-download-filename", encodeFileName);
+            packFilesToZip(fileList,response.getOutputStream());
+        } catch (IOException e) {
+            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
+        }
+    }
+    public static File generateQRCodeImage(String text, int width, int height, String fileName)  {
+        try {
+            // 鍒涘缓浜岀淮鐮佹暟鎹煩闃�
+            Map<EncodeHintType, Object> hints = new HashMap<>();
+            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 璁剧疆瀛楃缂栫爜涓篣TF-8
+            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 璁剧疆绾犻敊绛夌骇涓篐
+            hints.put(EncodeHintType.MARGIN, 0); // 璁剧疆鐧借竟涓�0
+            BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE , width, height, hints);
+            // 淇濆瓨浜岀淮鐮佸浘鐗囧埌鏂囦欢绯荤粺
+            File f = new File("temp/");
+            if(!f.exists()){
+                f.mkdirs();
+            }
+//            bitMatrix =  renderResult(bitMatrix,width,height);
+            Path path = FileSystems.getDefault().getPath("temp/"+fileName);
+            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path); // 淇濆瓨涓篜NG鏍煎紡鐨勫浘鐗�
+            return path.toFile();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
 
+        return  null;
+    }
+
+    public static void main(String[] args) {
+        File f =generateQRCodeImage("dj灏戞椂璇佃瘲涔﹀皯鏃惰璇椾功鏄拻鏄拻鏄拻",100,100,UUID.randomUUID().toString()+".png");
+        System.out.println(f.getAbsolutePath());
+    }
+
+    private static BitMatrix renderResult(BitMatrix input, int width, int height) {
+        if (input == null) {
+           return null;
+        }
+        int inputWidth = input.getWidth();
+        int inputHeight = input.getHeight();
+        // 渚濇嵁鐢ㄦ埛鐨勮緭鍏ュ楂橈紝璁$畻鏈�鍚庣殑杈撳嚭瀹介珮
+        int outputWidth = Math.max(width, inputWidth);
+        int outputHeight = Math.max(height, inputHeight);
+
+        //璁$畻缂╂斁姣斾緥
+        int multiple = Math.min(outputWidth / inputWidth, outputHeight / inputHeight);
+
+        BitMatrix output = new BitMatrix(outputWidth, outputHeight);
+        int inputY = 0;
+        // 宓屽寰幆锛屽皢ByteMatrix鐨勫唴瀹硅绠梡adding鍚庤浆鎹㈡垚BitMatrix
+        for (int outputY = 0; inputY < inputHeight; outputY += multiple) {
+            int inputX = 0;
+            for (int outputX = 0; inputX < inputWidth; outputX += multiple) {
+                if (input.get(inputX, inputY)) {
+                    output.setRegion(outputX, outputY, multiple, multiple);
+                }
+                inputX++;
+            }
+            inputY++;
+        }
+
+        return output;
+    }
+    public static void packFilesToZip(List<File> files,    ServletOutputStream os) throws IOException {
+        try (ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(os)) {
+            for (File file : files) {
+                ZipArchiveEntry entry = new ZipArchiveEntry(file.getName());
+                zipOutputStream.putArchiveEntry(entry);
+                try (FileInputStream fileInputStream = new FileInputStream(file)) {
+                    byte[] buffer = new byte[1024];
+                    int length;
+                    while ((length = fileInputStream.read(buffer)) > 0) {
+                        zipOutputStream.write(buffer, 0, length);
+                    }
+                }
+                zipOutputStream.closeArchiveEntry();
+            }
+        }
+    }
     @Override
     public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
         if (CollectionUtils.isEmpty(ids)) {
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 c8c5326..cb32343 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
@@ -123,7 +123,7 @@
         );
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywPatrolSchemeList)){
             for (YwPatrolScheme ywPatrolScheme:ywPatrolSchemeList) {
-                this.createTask(new Date(),ywPatrolScheme);
+                this.createTask(DateUtil.getXDayAfterDate(new Date(),2),ywPatrolScheme);
             }
         }
     }
@@ -301,6 +301,7 @@
         ywPatrolScheme.setEditDate(new Date());
         ywPatrolScheme.setEditor(loginUserInfo.getId());
         ywPatrolSchemeMapper.updateById(ywPatrolScheme);
+        this.createThreeDaysData(ywPatrolScheme);
     }
 
     @Override
@@ -356,15 +357,9 @@
         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)
                 .leftJoin(" system_user t2 on t.creator =  t2.id  ")
                 .eq(YwPatrolScheme::getIsdeleted,Constants.ZERO)
                 .like(StringUtils.isNotBlank(model.getTitle()),YwPatrolScheme::getTitle,model.getTitle())
-                //鏌ヨ鏈夋椂娈典氦闆嗙殑鏁版嵁
-              /*  .apply(Objects.nonNull(model.getStartDate())&&Objects.nonNull(model.getEndDate()),
-                        " t.START_DATE <= '"+pageWrap.getModel().getEndDate()+"' or t.END_DATE >= '"+pageWrap.getModel().getStartDate()+"' "
-                )*/
                 .ge( model.getStartDate()!=null,YwPatrolScheme::getStartDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()))
                 .le(Objects.nonNull(model.getEndDate()),YwPatrolScheme::getStartDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()))
                 .ge(Objects.nonNull(model.getStartDateSec()),YwPatrolScheme::getEndDate, Utils.Date.getStart(pageWrap.getModel().getStartDateSec()))
@@ -405,21 +400,24 @@
             ywPatrolScheme.setTimeOutTaskNum(Constants.ZERO);
             return;
         }
+
+        //杩囨护鏁版嵁鏄笉鏄叏閮ㄦ湭寮�濮�
+        if(Constants.equalsInteger(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ZERO))
+                .collect(Collectors.toList()).size(),ywPatrolTaskList.size())){
+            ywPatrolScheme.setSchemeStatus(Constants.ZERO);
+            ywPatrolScheme.setTimeOutTaskNum(ywPatrolTaskList.stream().filter(i->i.getEndDate().getTime()>System.currentTimeMillis())
+                    .collect(Collectors.toList()).size());
+            return;
+        }
+
         //杩囨护鏁版嵁鏄惁瀛樺湪杩涜涓殑
-        if(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)).collect(Collectors.toList()).size()>Constants.ZERO){
+        if(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)||Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size()>Constants.ZERO){
             ywPatrolScheme.setSchemeStatus(Constants.ONE);
             ywPatrolScheme.setTimeOutTaskNum(ywPatrolTaskList.stream().filter(i->i.getEndDate().getTime()>System.currentTimeMillis())
                     .collect(Collectors.toList()).size());
             return;
         }
 
-        //杩囨护鏁版嵁鏄笉鏄叏閮ㄦ湭寮�濮�
-        if(Constants.equalsInteger(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size(),ywPatrolTaskList.size())){
-            ywPatrolScheme.setSchemeStatus(Constants.ZERO);
-            ywPatrolScheme.setTimeOutTaskNum(ywPatrolTaskList.stream().filter(i->i.getEndDate().getTime()>System.currentTimeMillis())
-                    .collect(Collectors.toList()).size());
-            return;
-        }
         //杩囨护鏁版嵁鏄笉鏄叏閮ㄥ凡瀹屾垚
         if(Constants.equalsInteger(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.THREE)).collect(Collectors.toList()).size()
                 ,ywPatrolTaskList.size())){
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 b1fbb04..963f7b8 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
@@ -28,9 +28,11 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 杩愮淮宸℃浠诲姟 - 宸℃鐐逛俊鎭〃Service瀹炵幇
@@ -134,7 +136,7 @@
                 .selectAs(SystemUser::getRealname,YwPatrolTaskRecord::getRealname)
 
                 .selectAs(YwPatrolScheme::getTitle,YwPatrolTaskRecord::getSchemeTitle)
-                .selectAs(YwPatrolTask::getTitle,YwPatrolTaskRecord::getTaskCode)
+                .selectAs(YwPatrolTask::getCode,YwPatrolTaskRecord::getTaskCode)
                 .selectAs(YwPatrolTask::getStartDate,YwPatrolTaskRecord::getStartDate)
                 .selectAs(YwPatrolTask::getEndDate,YwPatrolTaskRecord::getEndDate)
 
@@ -213,7 +215,8 @@
         if(Objects.isNull(ywPatrolScheme)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌宸℃璁″垝淇℃伅");
         }
-        if(!ywPatrolScheme.getUserIds().equals(loginUserInfo.getId().toString())){
+        List<String>  userIdList = Arrays.asList(ywPatrolScheme.getUserIds().split(","));
+        if(userIdList.stream().filter(i->Constants.equalsInteger(Integer.valueOf(i),loginUserInfo.getId())).collect(Collectors.toList()).size()<=0){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"闈炴偍鐨勫贰妫�浠诲姟鏃犳硶杩涜澶勭悊");
         }
         YwPatrolTask ywPatrolTask = ywPatrolTaskMapper.selectById(model.getTaskId());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
index 104c528..31722e2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
@@ -85,6 +85,7 @@
                 .selectAll(YwPatrolTask.class)
                 .selectAs(YwPatrolScheme::getCode,YwPatrolTask::getPlanCode)
                 .selectAs(YwPatrolScheme::getTitle,YwPatrolTask::getPlanTitle)
+                .selectAs(YwPatrolScheme::getUserIds,YwPatrolTask::getUserIds)
                 .selectAs(SystemUser::getRealname,YwPatrolTask::getUserName)
                 .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and ytr.ISDELETED = 0  ) ",YwPatrolTask::getPatrolNum)
                 .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and ytr.STATUS = 1 and ytr.ISDELETED = 0) ",YwPatrolTask::getFinishNum)
@@ -139,6 +140,7 @@
         queryWrapper.selectAll(YwPatrolTask.class)
                 .selectAs(YwPatrolScheme::getCode,YwPatrolTask::getPlanCode)
                 .selectAs(YwPatrolScheme::getTitle,YwPatrolTask::getPlanTitle)
+                .selectAs(YwPatrolScheme::getUserIds,YwPatrolTask::getUserIds)
                 .selectAs(SystemUser::getRealname,YwPatrolTask::getUserName)
                 .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and ytr.ISDELETED = 0  ) ",YwPatrolTask::getPatrolNum)
                 .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and ytr.STATUS = 1 and ytr.ISDELETED = 0) ",YwPatrolTask::getFinishNum)
@@ -146,7 +148,7 @@
                 .leftJoin(YwPatrolScheme.class,YwPatrolScheme::getId,YwPatrolTask::getSchemeId)
                 .eq(YwPatrolTask::getIsdeleted, Constants.ZERO)
                 .eq(Objects.nonNull(model.getStatus()) && !Constants.equalsInteger(model.getStatus(),Constants.TWO),YwPatrolTask::getStatus, model.getStatus())
-                .eq(Objects.nonNull(model.getDealUserId()),YwPatrolScheme::getUserIds, model.getDealUserId())
+                .apply(Objects.nonNull(model.getDealUserId())," find_in_set("+model.getDealUserId()+",t2.USER_IDS) ")
                 .apply(Objects.nonNull(model.getStatus()) && Constants.equalsInteger(model.getStatus(),Constants.TWO)," t.status = 1 and t.END_DATE > now() ")
                 .apply(StringUtils.isNotBlank(model.getQueryStatus())," find_in_set(t.status ,'"+model.getQueryStatus()+"') ")
                 .like(StringUtils.isNotBlank(model.getPlanTitle()),YwPatrolScheme::getTitle,model.getPlanTitle())
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 36cda9c..ee5fbf6 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
@@ -296,13 +296,7 @@
 
         List<YwRoom>  ywRoomList = ywRoomMapper.selectJoinList(YwRoom.class,new MPJLambdaWrapper<YwRoom>()
                 .selectAll(YwRoom.class)
-//                        .select("  ( SELECT count(1) FROM  yw_contract y1 " +
-//                                " left join yw_contract_room y2 on y1.id = y2.contract_id " +
-//                                " where 1 = 1 and y2.type = 0  and y1.`STATUS` in( 0,1,2) " +
-//                                " and y1.START_DATE <  now() and y1.END_DATE >  now() and y2.ROOM_ID = yw_room.id ) as investmentStatus ")
-                .select(" ifnull( ( select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
-                        "from yw_contract y1 left join yw_contract_room y2 on y1.id = y2.CONTRACT_ID and y2.TYPE = 0  " +
-                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1  ) ,0) ",YwRoom::getLeaseStatus)
+                .select(" ifnull( (  case when t.IS_INVESTMENT = 0 then 2 else t.LEASE_NOW_STATUS end  ) ,0) ",YwRoom::getLeaseStatus)
                 .eq(YwRoom::getIsdeleted,Constants.ZERO)
                 .eq(YwRoom::getStatus,Constants.ZERO)
                 .eq(YwRoom::getIsInvestment,Constants.ONE)
@@ -313,7 +307,7 @@
                         "  ) ")
                 .apply(Objects.nonNull(dataDTO)&&Objects.nonNull(dataDTO.getStartDate())&&Objects.nonNull(dataDTO.getEndDate())," id not in  (" +
                         " SELECT y2.room_id FROM  yw_contract y1 left join yw_contract_room y2 on y1.id = y2.contract_id where 1 = 1 and y1.`STATUS` = 3 " +
-                        " and y1.START_DATE < '"+dataDTO.getEndDate()+" 00:00:00' and y1.BT_DATE > '"+ dataDTO.getStartDate() +"  00:00:00' " +
+                        " and y1.START_DATE < '"+dataDTO.getEndDate()+" 00:00:00' and y1.BT_DATE >= '"+ dataDTO.getStartDate() +"  00:00:00' " +
                         "  ) ")
                 .orderByAsc(YwRoom::getRoomNum)
         );
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 1b7a0a9..65e696b 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
@@ -67,6 +67,7 @@
         model.setStatus(Constants.ZERO);
         model.setEditDate(model.getCreateDate());
         model.setEditor(model.getCreator());
+        model.setLeaseNowStatus(Constants.ZERO);
         ywRoomMapper.insert(model);
         return model.getId();
     }
@@ -138,9 +139,10 @@
         queryWrapper.selectAll(YwRoom.class )
                 .selectAs(YwProject::getName,YwRoom::getProjectName)
                 .selectAs(YwFloor::getName,YwRoom::getFloorName)
-                .select(" ifnull( ( select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
-                        "from yw_contract y1 left join yw_contract_room y2 on y1.id = y2.CONTRACT_ID and y2.TYPE = 0  " +
-                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1  ) ,0) ",YwRoom::getLeaseStatus)
+//                .select(" ifnull( ( select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
+//                        "from yw_contract y1 left join yw_contract_room y2 on y1.id = y2.CONTRACT_ID and y2.TYPE = 0  " +
+//                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1  ) ,0) ",YwRoom::getLeaseStatus)
+                .select(" ifnull( (  case when t.IS_INVESTMENT = 0 then 2 else t.LEASE_NOW_STATUS end  ) ,0) ",YwRoom::getLeaseStatus)
                 .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                 .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                 .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
@@ -173,9 +175,10 @@
                 .selectAs(YwProject::getName,YwRoom::getProjectName)
                 .selectAs(YwFloor::getName,YwRoom::getFloorName)
                 .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
-                .select(" ifnull( ( select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
-                        "from yw_contract y1 left join yw_contract_room y2 on y1.id = y2.CONTRACT_ID and y2.TYPE = 0  " +
-                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1  ) ,0) ",YwRoom::getLeaseStatus)
+//                .select(" ifnull( ( select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
+//                        "from yw_contract y1 left join yw_contract_room y2 on y1.id = y2.CONTRACT_ID and y2.TYPE = 0  " +
+//                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1  ) ,0) ",YwRoom::getLeaseStatus)
+                .select(" ifnull( (  case when t.IS_INVESTMENT = 0 then 2 else t.LEASE_NOW_STATUS end  ) ,0) ",YwRoom::getLeaseStatus)
                 .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                 .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                 .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor);
@@ -245,11 +248,11 @@
         }
         queryWrapper.orderByAsc(YwRoom::getRoomNum);
         IPage<YwRoom> iPage = ywRoomMapper.selectJoinPage(page,YwRoom.class, queryWrapper);
-        for (YwRoom ywRoom:iPage.getRecords()) {
-            if(Constants.equalsInteger(ywRoom.getIsInvestment(),Constants.ZERO)){
-                ywRoom.setLeaseStatus(Constants.TWO);
-            }
-        }
+//        for (YwRoom ywRoom:iPage.getRecords()) {
+//            if(Constants.equalsInteger(ywRoom.getIsInvestment(),Constants.ZERO)){
+//                ywRoom.setLeaseStatus(Constants.TWO);
+//            }
+//        }
         return PageData.from(iPage);
     }
 
@@ -302,10 +305,34 @@
                         .eq(YwContractRoom::getType,Constants.ZERO)
                         .eq(YwContractRoom::getRoomId,ywRoom.getId())
                         .orderByDesc(YwContract::getStartDate)
+                        .orderByDesc(YwContract::getId)
                 );
                 if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(roomContractList)){
                     roomStatusDataVO.setRoomStatus(Constants.ZERO);
-                    roomStatusDataVO.setFreeDayAmount(Constants.ZERO);
+                    //鏌ヨ鏄惁鏈夊凡閫�绉熷悎鍚�
+                    List<YwContract> roomRentContractList =   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)
+                            .eq(YwContract::getStatus,Constants.FOUR)
+                            .eq(YwContractRoom::getType,Constants.ZERO)
+                            .eq(YwContractRoom::getRoomId,ywRoom.getId())
+                            .orderByDesc(YwContract::getStartDate)
+                            .orderByDesc(YwContract::getId)
+                    );
+                    if(CollectionUtils.isEmpty(roomRentContractList)){
+                        roomStatusDataVO.setFreeDayAmount(Constants.ZERO);
+                    }else{
+                        YwContract ywContract = roomRentContractList.get(Constants.ZERO);
+                        //鏌ヨ閫�绉熸棩鏈熷拰褰撳墠鏃ユ湡鐩稿樊澶╂暟
+                        Integer btDays = DateUtil.daysBetweenDates(new Date(),ywContract.getBtDate());
+                        if(btDays>=Constants.ZERO){
+                            roomStatusDataVO.setFreeDayAmount(btDays);
+                        }
+                    }
+
                 }else{
                     YwContract ywContract = roomContractList.get(Constants.ZERO);
                     //鍚堝悓鐘舵�� 0寰呮墽琛� 1鎵ц涓� 2宸插埌鏈� 3閫�绉熶腑 4宸查��绉�
@@ -397,7 +424,7 @@
                 .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 and y.COST_TYPE=0 and y.BILL_TYPE = 0  ) " , YwContract::getTotalFee)
                 .eq(YwContract::getIsdeleted,Constants.ZERO)
-                .in(YwContract::getStatus,Constants.ONE,Constants.TWO,Constants.THREE)
+                .in(YwContract::getStatus,Constants.ZERO,Constants.ONE,Constants.TWO,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()),
@@ -434,7 +461,8 @@
                 .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)
+                .last(" group by t.id  " +
+                        "ORDER BY t.sortnum ASC  ")
         );
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywLeaseRoomList)){
             ywRoomContractDataVO.setLeaseArea(
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java
index b04ef29..a1531fe 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingRecordServiceImpl.java
@@ -195,6 +195,7 @@
                 .set(YwStocktakingRecord::getActStock,ywStocktakingRecord.getActStock())
                 .set(YwStocktakingRecord::getUserId,loginUserInfo.getId())
                 .set(YwStocktakingRecord::getPlanDate, DateUtil.getCurrDateTime())
+                .set(StringUtils.isNotBlank(ywStocktakingRecord.getRemark()),YwStocktakingRecord::getRemark, ywStocktakingRecord.getRemark())
                 .eq(YwStocktakingRecord::getId,ywStocktakingRecord.getId())
         );
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java
index 76ba25d..3ca923e 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwStocktakingServiceImpl.java
@@ -442,7 +442,7 @@
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(recordList)){
             //鍚堣鐩樼偣鏁版嵁
             ywStocktaking.setFinishAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)).collect(Collectors.toList()).size());
-            ywStocktaking.setUnFinishAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
+            ywStocktaking.setUnFinishAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.TWO)).collect(Collectors.toList()).size());
             ywStocktaking.setEqualAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()).size());
             ywStocktaking.setLossAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.ONE)).collect(Collectors.toList()).size());
             ywStocktaking.setProfitAmount(recordList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)&&Constants.equalsInteger(i.getType(),Constants.TWO)).collect(Collectors.toList()).size());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTempConfigServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTempConfigServiceImpl.java
index 6568f12..c68200e 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTempConfigServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwTempConfigServiceImpl.java
@@ -232,8 +232,6 @@
                 .set(YwTempConfig::getUrl,leasesTemp.getUrl())
                 .eq(YwTempConfig::getId,leasesTemp.getId())
         );
-
-
         YwTempConfig otherTemp = ywCallTempDataDTO.getOtherTemp();
         if(Objects.isNull(otherTemp.getId())
                 || Objects.isNull(otherTemp.getTitle())
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java
index cf15928..8e969d7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWarehouseServiceImpl.java
@@ -132,7 +132,7 @@
         if(ywStockMapper.selectCount(new QueryWrapper<YwStock>().lambda().eq(YwStock::getIsdeleted,Constants.ZERO)
                 .gt(YwStock::getStock,Constants.ZERO)
                 .eq(YwStock::getWarehouseId,ywWarehouse.getId()))>Constants.ZERO){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠浠撳簱鍐呮湁搴撳瓨鐨勭墿鏂欙紝涓嶅彲鍒犻櫎");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠浠撳簱鍐呮湁搴撳瓨鐨勭墿鏂欙紝涓嶅彲绂佺敤");
         };
         ywWarehouseMapper.update(new UpdateWrapper<YwWarehouse>().lambda().eq(YwWarehouse::getId,ywWarehouse.getId()).set(YwWarehouse::getStatus,ywWarehouse.getStatus()));
     }
diff --git a/server/visits/dmvisit_service/src/main/resources/application-dev.yml b/server/visits/dmvisit_service/src/main/resources/application-dev.yml
index b3984c7..57baaf0 100644
--- a/server/visits/dmvisit_service/src/main/resources/application-dev.yml
+++ b/server/visits/dmvisit_service/src/main/resources/application-dev.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: doumee
-    password: rtjgfEr@&0c0m
+    url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: Doumee@168
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
   redis:
diff --git a/server/visits/dmvisit_service/src/main/resources/application-test.yml b/server/visits/dmvisit_service/src/main/resources/application-test.yml
index a8d00a5..c85d9ec 100644
--- a/server/visits/dmvisit_service/src/main/resources/application-test.yml
+++ b/server/visits/dmvisit_service/src/main/resources/application-test.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: doumee
-    password: rtjgfEr@&0c0m
+    url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: Doumee@168
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
   redis:
@@ -28,7 +28,7 @@
 debug_model: true
 
 ########################鍘嬬缉鍖呮枃浠朵綅缃�  ########################
-zip_file_path: d://
+zip_file_path: /usr/local/static_resources/fn/
 ########################鍚屾鏁版嵁妯″紡  ########################
 data-sync:
   org-user-data-origin: 0 #缁勭粐鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
diff --git a/temp/f1fe6230-8109-4137-b2fb-eb906d31fddf.png b/temp/f1fe6230-8109-4137-b2fb-eb906d31fddf.png
new file mode 100644
index 0000000..158872d
--- /dev/null
+++ b/temp/f1fe6230-8109-4137-b2fb-eb906d31fddf.png
Binary files differ

--
Gitblit v1.9.3