From 8ac30411bb33e406e0ed5a2b6e2edaf7ab59f11f Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期六, 23 十一月 2024 17:10:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 admin/src/views/contract/components/contractEdit.vue                |  376 +++++
 admin/src/views/workorder/workorderCate.vue                         |   14 
 admin/src/views/Inspection/components/areaCate.vue                  |   74 +
 admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue |   69 
 admin/src/views/Inspection/task.vue                                 |   88 
 admin/src/views/finance/payments.vue                                |  137 +
 admin/src/api/Inspection/ywPatrolPoint.js                           |    7 
 admin/src/assets/style/style.scss                                   |    3 
 admin/src/views/Inspection/dot.vue                                  |   67 
 admin/src/views/contract/components/contractDetail.vue              |  226 +++
 admin/src/views/client/staffList.vue                                |    6 
 admin/src/views/finance/account.vue                                 |  138 ++
 admin/src/views/operation/category.vue                              |  109 +
 admin/src/views/operation/components/maintain.vue                   |  222 +++
 admin/src/views/workorder/workorderList.vue                         |   96 
 admin/src/views/Inspection/components/taskDetail.vue                |   98 +
 admin/src/views/operation/components/deviceEdit.vue                 |  137 +
 admin/src/views/operation/device.vue                                |  138 ++
 admin/src/components/common/MemberSearch/index.js                   |    3 
 admin/src/views/finance/bull.vue                                    |  194 ++
 admin/src/components/common/MemberSearch/src/index.vue              |  155 ++
 admin/src/views/finance/components/accountEdit.vue                  |  104 +
 admin/src/views/workorder/components/OperaCategoryWindow.vue        |   21 
 admin/src/components/common/QueryForm/queryForm.vue                 |   16 
 admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue  |   97 +
 admin/src/views/operation/record.vue                                |  138 ++
 admin/src/views/contract/contractList.vue                           |  147 ++
 admin/src/views/Inspection/plan.vue                                 |   97 
 admin/src/views/finance/company.vue                                 |  132 +
 admin/src/views/operation/components/OperaCategoryWindow.vue        |   74 +
 admin/src/api/Inspection/device.js                                  |   40 
 admin/src/views/Inspection/area.vue                                 |  107 +
 admin/src/views/project/components/OperaYwBuildingWindow.vue        |    2 
 admin/src/views/contract/components/config.js                       |    3 
 admin/src/views/finance/components/companyEdit.vue                  |   93 +
 admin/src/views/project/buildingList.vue                            |   63 
 admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue   |  175 +
 admin/src/views/Inspection/path.vue                                 |   75 
 admin/src/views/finance/components/deviceEdit.vue                   |  137 +
 admin/src/views/workorder/components/OperaYwWorkorderWindow.vue     |  226 ++-
 40 files changed, 3,665 insertions(+), 439 deletions(-)

diff --git a/admin/src/api/Inspection/device.js b/admin/src/api/Inspection/device.js
new file mode 100644
index 0000000..5098bb4
--- /dev/null
+++ b/admin/src/api/Inspection/device.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDevice/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDevice/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDevice/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywDevice/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywDevice/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/ywDevice/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/Inspection/ywPatrolPoint.js b/admin/src/api/Inspection/ywPatrolPoint.js
index 933179d..92dfde0 100644
--- a/admin/src/api/Inspection/ywPatrolPoint.js
+++ b/admin/src/api/Inspection/ywPatrolPoint.js
@@ -6,7 +6,12 @@
     trim: true
   })
 }
-
+// 鏌ヨ
+export function getFetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywPatrolPoint/list', data, {
+    trim: true
+  })
+}
 // 瀵煎嚭Excel
 export function exportExcel (data) {
   return request.post('/visitsAdmin/cloudService/business/ywPatrolPoint/exportExcel', data, {
diff --git a/admin/src/assets/style/style.scss b/admin/src/assets/style/style.scss
index 310a553..afecdf3 100644
--- a/admin/src/assets/style/style.scss
+++ b/admin/src/assets/style/style.scss
@@ -50,6 +50,9 @@
 .green{
   color: #75a236;
 }
+.gary{
+  color: #aaaaaa;
+}
 .cu{
   cursor: pointer;
 }
diff --git a/admin/src/components/common/MemberSearch/index.js b/admin/src/components/common/MemberSearch/index.js
new file mode 100644
index 0000000..9f1e88f
--- /dev/null
+++ b/admin/src/components/common/MemberSearch/index.js
@@ -0,0 +1,3 @@
+import Index from './src'
+
+export default Index
diff --git a/admin/src/components/common/MemberSearch/src/index.vue b/admin/src/components/common/MemberSearch/src/index.vue
new file mode 100644
index 0000000..f3db2c9
--- /dev/null
+++ b/admin/src/components/common/MemberSearch/src/index.vue
@@ -0,0 +1,155 @@
+<template>
+  <GlobalWindow title="閫夋嫨瀹㈡埛" width="1000px" @close="close" :visible.sync="isShowMemberList">
+    <div>
+      <div class="df_ac mb20">
+        <el-input v-model="modalSearchValue" placeholder="璇疯緭鍏ュ鎴峰悕绉�" class="w400" @keyup.enter.native="queryList">
+          <!-- <el-button slot="append" icon="el-icon-search" @click="queryList()" /> -->
+        </el-input>
+        <el-button class="ml10" type="primary" @click="queryList()">鏌ヨ</el-button>
+      </div>
+      <el-table ref="table" v-loading="listLoading" :data="list" element-loading-text="Loading" border fit
+        :header-row-class-name="'table-header'" class="doumee-element-table doumee-element-tableb"
+        @row-click="rowClick">
+
+        <el-table-column align="center" label="瀹㈡埛绫诲瀷" prop="cardName" show-overflow-tooltip min-width="80" />
+        <el-table-column align="center" label="瀹㈡埛鍚嶇О" show-overflow-tooltip prop="remainingMoney" min-width="80" />
+        <el-table-column align="center" label="鑱旂郴浜�" show-overflow-tooltip prop="remainingGiveMoney" min-width="80" />
+        <el-table-column label="鑱旂郴鐢佃瘽" prop="createTime" min-width="100" align="center" />
+        <el-table-column label="缁熶竴淇$敤浠g爜" prop="createTime" min-width="120" align="center" />
+        <el-table-column label="钀ヤ笟鏈熼檺" prop="createTime" min-width="100" align="center" />
+        <el-table-column label="榛樿鍙戠エ绫诲瀷" prop="createTime" min-width="100" align="center" />
+      </el-table>
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+  </GlobalWindow>
+</template>
+
+<script>
+import { memberList, memberDetailInfo } from '@/api'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import dayjs from 'dayjs'
+// import { debounce } from '@/utils/debounce'
+
+import Pagination from '@/components/common/Pagination'
+export default {
+  components: {
+    Pagination,
+    GlobalWindow
+  },
+  props: {
+    isShowChooseBtn: {
+      type: Boolean,
+      default: () => true
+    },
+    type: { // (10: 鍟嗗搧鎶樻墸  20: 璁㈠満鎶樻墸 30: 闂ㄧエ鎶樻墸 40: 濂楅鎶樻墸 50锛氭椿鍔ㄦ姌鎵� 60锛氳绋嬫姌鎵�)
+      type: String,
+      default: 'default'
+    }
+  },
+  data() {
+    return {
+      searchValue: '',
+      isShowMemberList: false,
+      modalSearchValue: '',
+      list: [],
+      totalCount: 0,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      listLoading: false,
+
+    }
+  },
+  created() {
+    // (10: 鍟嗗搧鎶樻墸  20: 璁㈠満鎶樻墸 30: 闂ㄧエ鎶樻墸 40: 濂楅鎶樻墸 50锛氭椿鍔ㄦ姌鎵� 60锛氳绋嬫姌鎵�)
+  },
+  methods: {
+    clearSearch() {
+      this.searchValue = ''
+      this.modalSearchValue = ''
+    },
+    handleMemberSelect(item) {
+      memberDetailInfo({ param: { memberId: item.id } }).then((res) => {
+        if (res.errorCode !== '000000') return
+        const obj = res.record || {}
+        obj.searchValue = this.searchValue
+        this.$emit('select', obj)
+      })
+    },
+    clear() {
+      this.searchValue = ''
+      setTimeout(() => {
+        this.$refs.searchValueRef.focus()
+      })
+      this.$emit('clear')
+    },
+    rowClick(item) {
+      memberDetailInfo({ param: { memberId: item.id } }).then((res) => {
+        if (res.errorCode !== '000000') return
+        const obj = res.record || {}
+        this.searchValue = obj.nickName
+        obj.searchValue = this.modalSearchValue
+        if (item.phone) {
+          this.searchValue += '-' + item.phone
+        }
+        if (item.number) {
+          this.searchValue += '锛�' + item.number + '锛�'
+        }
+        this.$emit('select', obj)
+      })
+      this.isShowMemberList = false
+    },
+    getList() {
+      const { pagination, modalSearchValue } = this
+      this.listLoading = true
+      memberList({ pagination, param: { keyword: modalSearchValue } }).then((res) => {
+        this.listLoading = false
+        if (res.errorCode !== '000000') return
+        this.list = res.recordList
+        this.pagination.total = res.total || 0
+        this.totalCount = res.totalCount
+      }, () => {
+        this.listLoading = false
+      })
+    },
+    openModal() {
+      this.modalSearchValue = ''
+      // this.queryList()
+      this.isShowMemberList = true
+    },
+    queryList() {
+      this.pagination.page = 1
+      this.getList()
+    },
+    currentChange(val) {
+      this.pagination.page = val
+      this.getList()
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+      this.getList()
+    },
+    close() {
+      this.isShowMemberList = false
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.member_search_wrap {
+  display: flex;
+
+  ::v-deep .el-input__validateIcon {
+    display: none !important;
+  }
+}
+</style>
diff --git a/admin/src/components/common/QueryForm/queryForm.vue b/admin/src/components/common/QueryForm/queryForm.vue
index c56d064..80e9fc1 100644
--- a/admin/src/components/common/QueryForm/queryForm.vue
+++ b/admin/src/components/common/QueryForm/queryForm.vue
@@ -2,13 +2,13 @@
   <div class="doumee-filter">
     <el-form inline label-suffix="锛�" @submit.native.prevent>
       <template v-for="(item, index) in queryFormConfig.formItems">
-        <el-form-item v-if="item.type === 'input' && (showZk || index < listLength)" :key="item.filed">
+        <el-form-item v-if="item.type === 'input' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
           <el-input v-model="searchForm[item.filed]"
             :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
             :placeholder="item.label" class="w200"
             @change="changeForm(item.filed)" @keyup.enter.native="handlekeyup(item.keyup || false)" />
         </el-form-item>
-        <el-form-item v-if="item.type === 'moneySelect' && (showZk || index < listLength)" :key="item.label">
+        <el-form-item v-if="item.type === 'moneySelect' && (showZk || index < listLength)" :label="item.label" :key="item.label">
           <el-input v-model="searchForm[item.filedStrt]"
             :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
             :placeholder="item.start" style="width: 150px" />
@@ -17,7 +17,7 @@
             :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
             :placeholder="item.end" style="width: 150px" />
         </el-form-item>
-        <el-form-item v-if="item.type === 'select' && (showZk || index < listLength)" :key="item.filed">
+        <el-form-item v-if="item.type === 'select' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
           <el-select v-model="searchForm[item.filed]" :filterable="item.filterable || true"
             :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
             :placeholder="item.label" class="w200"
@@ -26,25 +26,25 @@
               :label="item.labelCode ? opt[item.labelCode] : opt.label" />
           </el-select>
         </el-form-item>
-        <el-form-item v-if="item.type === 'date' && (showZk || index < listLength)" :key="item.filed">
+        <el-form-item v-if="item.type === 'date' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
           <el-date-picker v-model="searchForm[item.filed]" type="date" value-format="yyyy-MM-dd" class="w200"
             :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
             :placeholder="item.label" :picker-options="item.pickerOptions || {}"
             @change="changeForm(item.filed)" />
         </el-form-item>
-        <el-form-item v-if="item.type === 'daterange' && (showZk || index < listLength)" :key="item.filed">
+        <el-form-item v-if="item.type === 'daterange' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
           <el-date-picker v-model="searchForm[item.filed]" value-format="yyyy-MM-dd" type="daterange"
             range-separator="鑷�"
             :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
             :start-placeholder="item.start || ''" :end-placeholder="item.end || ''"
             :picker-options="item.pickerOptions || {}" class="w400" @change="changeForm(item.filed)" />
         </el-form-item>
-        <el-form-item v-if="item.type === 'timePicker' && (showZk || index < listLength)" :key="item.filed">
+        <el-form-item v-if="item.type === 'timePicker' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
           <el-time-picker v-model="searchForm[item.filed]" is-range range-separator="鑷�" format="HH:mm"
             value-format="HH:mm" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" placeholder="閫夋嫨鏃堕棿鑼冨洿" class="w400"
             @change="changeForm(item.filed)" />
         </el-form-item>
-        <el-form-item v-if="item.type === 'datetimerange' && (showZk || index < listLength)" :key="item.filed">
+        <el-form-item v-if="item.type === 'datetimerange' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
           <el-date-picker v-model="searchForm[item.filed]" format="yyyy-MM-dd HH:mm:ss"
             value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange" :default-time="['00:00:00', '23:59:59']"
             :picker-options="item.pickerOptions || pickerOptions" range-separator="鑷�"
@@ -52,7 +52,7 @@
             :start-placeholder="item.start || '寮�濮嬫椂闂�'" :end-placeholder="item.end || '缁撴潫鏃堕棿'" class="w400"
             @change="changeForm(item.filed)" />
         </el-form-item>
-        <el-form-item v-if="item.type === 'slot' && (showZk || index < listLength)" :key="item.filed">
+        <el-form-item v-if="item.type === 'slot' && (showZk || index < listLength)" :label="item.label" :key="item.filed">
           <slot :name="item.filed" />
         </el-form-item>
       </template>
diff --git a/admin/src/views/Inspection/area.vue b/admin/src/views/Inspection/area.vue
index e69de29..1068c9c 100644
--- a/admin/src/views/Inspection/area.vue
+++ b/admin/src/views/Inspection/area.vue
@@ -0,0 +1,107 @@
+<template>
+  <TableLayout>
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
+        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+            v-permissions="['business:category:create']">鏂板缓</el-button></li>
+      </ul>
+      <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
+        :data="dataList" stripe @selection-change="handleSelectionChange">
+        <el-table-column prop="name" label="宸ュ崟鍖哄煙" min-width="100px"></el-table-column>
+        <!-- <el-table-column prop="parentName" label="鎵�灞炲垎绫�" min-width="100px"></el-table-column> -->
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])" label="鎿嶄綔"
+          min-width="120" fixed="right">
+          <template slot-scope="{row}">
+            <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
+              v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+              v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="tableData.pagination">
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaCategoryWindow v-if="isShowEdit" @close="isShowEdit = false" ref="operaCategoryWindow" @success="getList" />
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaCategoryWindow from './components/areaCate.vue'
+import { fetchList, deleteById } from '@/api/business/category.js'
+export default {
+  name: 'Category',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaCategoryWindow },
+  data() {
+    return {
+      // 鎼滅储
+      filters: {
+        parentId: ''
+      },
+      isShowEdit: false,
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0,
+      },
+      dataList: []
+    }
+  },
+  created() {
+    this.config({
+      module: '杞﹁締淇℃伅琛�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.getList()
+  },
+  methods: {
+    handleEdit(row) {
+      this.isShowEdit = true
+      let str = row && row.id ? '缂栬緫鍖哄煙' : '鏂板缓鍖哄煙'
+      this.$nextTick(() => {
+        this.$refs.operaCategoryWindow.open(str)
+        this.$refs.operaCategoryWindow.getList()
+        if (row && row.id) {
+          this.$refs.operaCategoryWindow.getDetail(row.id)
+        }
+      })
+    },
+    deleteById(row) {
+      this.$confirm(`鎮ㄧ‘璁よ鍒犻櫎璇ュ尯鍩熷悧`, '娓╅Θ鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteById(row.id).then(res => {
+          this.getList()
+        })
+      })
+
+    },
+    getList() {
+      const { pagination, filters } = this
+      this.loading = true
+      fetchList({
+        model: { ...filters, type: 4 },
+        capacity: pagination.pageSize,
+        page: pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.dataList = res.records || []
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
index abbc222..d936c67 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
@@ -1,78 +1,157 @@
 <template>
-  <GlobalWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
-  >
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      <el-form-item label="绾胯矾鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ョ嚎璺悕绉�" v-trim />
       </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="remark">
-        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
-        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
-        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍥炬爣" prop="imgurl">
-        <el-input v-model="form.imgurl" placeholder="璇疯緭鍏ュ浘鏍�" v-trim/>
-      </el-form-item>
+      <div class="head">
+        <div class="title">宸℃鐐�</div>
+        <el-button type="primary" @click="openModal">娣诲姞宸℃鐐�</el-button>
+      </div>
+      <el-table v-loading="isWorking.search" :data="list" stripe>
+        <el-table-column prop="code" label="宸℃鐐圭紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="pointName" label="宸℃鐐瑰悕绉�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鎵爜鎵撳崱" min-width="100px">
+          <template v-slot="scope">
+            <el-switch v-model="scope.row.needScancode" @change="changeStatus" active-value="0"
+              inactive-value="1"></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="鎺掑簭鐮�" min-width="100px">
+          <template v-slot="scope">
+            <el-input v-model="scope.row.sortnum" class="w100"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="鎿嶄綔" min-width="100px">
+          <template v-slot="scope">
+            <span class="red cu" @click="handleDel(scope)">鍒犻櫎</span>
+          </template>
+        </el-table-column>
+      </el-table>
+
+
     </el-form>
+    <!--  -->
+    <el-dialog title="娣诲姞宸℃鐐�" :close-on-click-modal="false" append-to-body :visible.sync="isShowModal" width="500px">
+      <el-select class="w400" v-model="selPoint" clearable multiple filterable>
+        <el-option v-for="item in pointList" :value="item.id" :label="item.name"></el-option>
+      </el-select>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowModal = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="subModal">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
   </GlobalWindow>
 </template>
 
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import { getFetchList } from '@/api/Inspection/ywPatrolPoint'
+import { create } from '@/api/Inspection/ywPatrolLine'
+import { Message } from 'element-ui'
 export default {
   name: 'OperaYwPatrolLineWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
-  data () {
+  data() {
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
-        id: null,
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
         name: '',
-        remark: '',
-        status: '',
-        sortnum: '',
-        imgurl: ''
       },
+      selPoint: [],
+      pointList: [],
+      list: [],
+      isShowModal: false,
       // 楠岃瘉瑙勫垯
       rules: {
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        selPoint: [{ type: 'array', required: true, message: '璇疯緭鍏�' }],
       }
     }
   },
-  created () {
+  created() {
     this.config({
       api: '/Inspection/ywPatrolLine',
-      'field.id': 'id'
     })
+  },
+  methods: {
+    confirm() {
+      const { form, list } = this
+      if (list.length == 0) return Message.warning('璇峰厛閫夋嫨宸℃鐐�')
+      form.linePointList = list
+      create({ ...form }).then(res => {
+        if (res.code == 200) {
+          Message.success('淇濆瓨鎴愬姛')
+          this.close()
+        }
+      })
+    },
+    initData() {
+      getFetchList({}).then(res => {
+        this.pointList = res || []
+      })
+    },
+    handleDel(row) {
+      this.list.splice(row.$index, 1)
+
+    },
+    changeStatus(row) {
+
+    },
+    openModal() {
+      this.selPoint = this.list.map(i => i.id)
+      this.isShowModal = true
+    },
+    subModal() {
+      const { selPoint, pointList, list } = this
+      if (selPoint.length == 0) return Message.warning('璇峰厛閫夋嫨宸℃鐐�')
+      let arr = []
+      // 鍙栧嚭閫変腑鍒楄〃
+      pointList.forEach(item => {
+        selPoint.forEach(item2 => {
+          if (item.id === item2) {
+            arr.push(item)
+          }
+        })
+      })
+      // 鍚宭ist鍘婚噸
+      list.forEach(item => {
+        arr.forEach((item2, i) => {
+          if (item.id === item2.id) {
+            arr.splice(i, 1)
+          }
+        })
+      })
+      // 娣诲姞
+      arr.forEach(i => {
+        this.list.push({
+          needScancode: '1',
+          pointName: i.name,
+          pointId: i.id,
+          code: i.code,
+          id: i.id
+        })
+      })
+      this.isShowModal = false
+    },
+    close(){
+      this.visible = false
+      this.$emit('success')
+    }
   }
 }
 </script>
+<style lang="scss" scoped>
+.head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 20px;
+
+  div {
+    font-weight: 500;
+  }
+}
+</style>
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
index 4d0089b..8674bad 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
@@ -1,22 +1,36 @@
 <template>
-  <GlobalWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
-  >
+  <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="name">
-        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      <el-form-item label="宸℃鐐圭紪鐮�" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ悕绉�" v-trim />
       </el-form-item>
-      <el-form-item label="鍥炬爣" prop="imgurl">
-        <el-input v-model="form.imgurl" placeholder="璇疯緭鍏ュ浘鏍�" v-trim/>
+      <el-form-item label="宸℃鐐瑰悕绉�" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ贰妫�鐐瑰悕绉�" v-trim />
       </el-form-item>
-      <el-form-item label="鍖哄煙缂栫爜锛堝叧鑱攃ategory)" prop="areaId">
-        <el-input v-model="form.areaId" placeholder="璇疯緭鍏ュ尯鍩熺紪鐮侊紙鍏宠仈category)" v-trim/>
+      <el-form-item label="宸℃璁惧">
+        <el-select v-model="form.deviceId">
+          <el-option v-for="item in deviceList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鍦板潃" prop="addr">
-        <el-input v-model="form.addr" placeholder="璇疯緭鍏ュ湴鍧�" v-trim/>
+      <el-form-item label="鎵�灞炲尯鍩�" prop="areaId">
+        <el-cascader v-model="form.areaIds" @change="changeSel" placeholder="璇烽�夋嫨宸℃鍖哄煙" clearable :options="cateList"
+          :props="{
+            label: 'name',
+            value: 'id',
+            children: 'childCategoryList',
+            checkStrictly: true
+          }"></el-cascader>
+      </el-form-item>
+      <el-form-item label="缁忕含搴�">
+
+      </el-form-item>
+      <el-form-item label="宸℃鍐呭" prop="content">
+        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="璇疯緭鍏�" />
+      </el-form-item>
+      <el-form-item label="涓婁紶鍥剧墖" prop="imgurl">
+        <UploadAvatarImage :file="{ 'imgurlfull': form.imgurlfull, 'imgurl': form.imgurl }"
+          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
+          @uploadBegin="isUploading = true" />
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -25,38 +39,67 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
+import { fetchList } from '@/api/business/category'
 export default {
   name: 'OperaYwPatrolPointWindow',
   extends: BaseOpera,
-  components: { GlobalWindow },
-  data () {
+  components: { GlobalWindow, UploadAvatarImage },
+  data() {
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
-        id: null,
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
         name: '',
-        remark: '',
-        status: '',
-        sortnum: '',
+        code: '',
+        content: '',
         imgurl: '',
         areaId: '',
         addr: ''
       },
+      deviceList: [],
+      cateList: [],
       // 楠岃瘉瑙勫垯
       rules: {
-      }
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        code: [{ required: true, message: '璇疯緭鍏�' }],
+      },
+      isUploading: false,
     }
   },
-  created () {
+  created() {
     this.config({
       api: '/Inspection/ywPatrolPoint',
       'field.id': 'id'
     })
+  },
+  methods: {
+    initData() {
+      fetchList({
+        model: { type: 4 },
+        capacity: 1000,
+        page: 1,
+      }).then(res => {
+        this.cateList = res.records || []
+      })
+
+    },
+    changeSel(e) {
+      if (e && e.length == 1) {
+        this.$set(this.form, 'catePId', e[0])
+        this.$set(this.form, 'cateId', '')
+      } else if (e && e.length == 2) {
+        this.$set(this.form, 'catePId', e[0])
+        this.$set(this.form, 'cateId', e[1])
+      } else {
+        this.$set(this.form, 'catePId', '')
+        this.$set(this.form, 'cateId', '')
+      }
+      this.search()
+    },
+    uploadAvatarSuccess(file) {
+      this.form.imgurl = file.imgurl
+      this.form.imgurlfull = file.imgurlfull
+    },
   }
 }
 </script>
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
index 2f13c0e..0f933b6 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolSchemeWindow.vue
@@ -1,38 +1,37 @@
 <template>
-  <GlobalWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
-  >
+  <GlobalWindow width="520px" :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
-    
-      <el-form-item label="鏍囬" prop="title">
-        <el-input v-model="form.title" placeholder="璇疯緭鍏ユ爣棰�" v-trim/>
+      <el-form-item label="璁″垝鍚嶇О" prop="title">
+        <el-input v-model="form.title" placeholder="璇疯緭鍏ユ爣棰�" v-trim />
       </el-form-item>
-      
-    
-      <el-form-item label="宸℃璐熻矗浜虹紪鐮侀泦鍚堬紝澶氫釜浣跨敤鑻辨枃閫楀彿闅斿紑" prop="userIds">
-        <el-input v-model="form.userIds" placeholder="璇疯緭鍏ュ贰妫�璐熻矗浜虹紪鐮侀泦鍚堬紝澶氫釜浣跨敤鑻辨枃閫楀彿闅斿紑" v-trim/>
+      <el-form-item label="宸℃绾胯矾">
+        <el-select v-model="form.status" filterable clearable>
+          <el-option value="0" label="姣忓ぉ"></el-option>
+          <el-option value="1" label="姣忓懆"></el-option>
+          <el-option value="2" label="姣忔湀"></el-option>
+        </el-select>
       </el-form-item>
-  
-      <el-form-item label="寰幆鍛ㄦ湡  0姣忓ぉ 1姣忓懆 2姣忓ぉ" prop="circleType">
-        <el-input v-model="form.circleType" placeholder="璇疯緭鍏ュ惊鐜懆鏈�  0姣忓ぉ 1姣忓懆 2姣忓ぉ" v-trim/>
+      <el-form-item label="宸℃璐熻矗浜�">
+        <el-select v-model="form.userIds" filterable clearable>
+          <el-option value="0" label="姣忓ぉ"></el-option>
+          <el-option value="1" label="姣忓懆"></el-option>
+          <el-option value="2" label="姣忔湀"></el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="寰幆閲嶅瑙勫垯 1-31锛屽涓嫳鏂囬�楀彿闅斿紑" prop="circleDays">
-        <el-input v-model="form.circleDays" placeholder="璇疯緭鍏ュ惊鐜噸澶嶈鍒� 1-31锛屽涓嫳鏂囬�楀彿闅斿紑" v-trim/>
+      <el-form-item label="璁″垝寮�濮嬫棩鏈�-缁撴潫鏃ユ湡">
+        <el-date-picker v-model="form.selDate" is-range range-separator="-" value-format="yyyy-MM-dd" type="daterange"
+          start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" class="w400" />
       </el-form-item>
-      <el-form-item label="寮�濮嬫棩鏈�" prop="startDate">
-        <el-date-picker v-model="form.startDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ紑濮嬫棩鏈�"></el-date-picker>
+      <el-form-item label="璁″垝鎵ц鏃堕棿">
+        <el-time-picker v-model="form.selTime" is-range range-separator="-" format="HH:mm" value-format="HH:mm:ss"
+          start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" placeholder="閫夋嫨鏃堕棿鑼冨洿" class="w400" />
       </el-form-item>
-      <el-form-item label="缁撴潫鏃ユ湡" prop="endDate">
-        <el-date-picker v-model="form.endDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ョ粨鏉熸棩鏈�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="寮�濮嬫椂闂寸偣" prop="startTime">
-        <el-input v-model="form.startTime" placeholder="璇疯緭鍏ュ紑濮嬫椂闂寸偣" v-trim/>
-      </el-form-item>
-      <el-form-item label="缁撴潫鏃堕棿鐐�" prop="endTime">
-        <el-input v-model="form.endTime" placeholder="璇疯緭鍏ョ粨鏉熸椂闂寸偣" v-trim/>
+      <el-form-item label="寰幆鍛ㄦ湡">
+        <el-select v-model="form.circleType" filterable clearable>
+          <el-option value="0" label="姣忓ぉ"></el-option>
+          <el-option value="1" label="姣忓懆"></el-option>
+          <el-option value="2" label="姣忔湀"></el-option>
+        </el-select>
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -45,7 +44,7 @@
   name: 'OperaYwPatrolSchemeWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
-  data () {
+  data() {
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
@@ -70,18 +69,26 @@
         endDate: '',
         startTime: '',
         endTime: '',
-        processStatus: ''
+        processStatus: '',
+        selDate: [],
+        selTime: [],
       },
       // 楠岃瘉瑙勫垯
       rules: {
       }
     }
   },
-  created () {
+  created() {
     this.config({
       api: '/Inspection/ywPatrolScheme',
       'field.id': 'id'
     })
+  },
+  methods: {
+    initData() {
+
+    }
   }
+
 }
 </script>
diff --git a/admin/src/views/Inspection/components/areaCate.vue b/admin/src/views/Inspection/components/areaCate.vue
new file mode 100644
index 0000000..ebe0534
--- /dev/null
+++ b/admin/src/views/Inspection/components/areaCate.vue
@@ -0,0 +1,74 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍖哄煙鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ尯鍩熷悕绉�" v-trim />
+      </el-form-item>
+      <el-form-item label="鎵�灞炲尯鍩�" prop="parentId">
+        <el-select :disabled="form.id" v-model="form.parentId" placeholder="涓嶅~涓哄垯涓�绾у尯鍩�">
+          <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="sortnum">
+        <el-input v-model="form.sortnum" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" v-trim />
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
+export default {
+  name: 'OperaCategoryWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data() {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        parentId: null,
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: 4
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ュ尯鍩熷悕绉�', trigger: 'blur' }
+        ],
+        status: [
+          { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+        ]
+      },
+      dataList: []
+    }
+  },
+  created() {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    getList() {
+      fetchCateList({ type: 4 }).then(res => {
+        this.dataList = res || []
+        
+      })
+    },
+    close() {
+      this.visible = false
+      this.$emit('close')
+    },
+    getDetail(id) {
+      getInfoById(id).then(res => {
+        this.form = res
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/Inspection/components/taskDetail.vue b/admin/src/views/Inspection/components/taskDetail.vue
new file mode 100644
index 0000000..dfe59dc
--- /dev/null
+++ b/admin/src/views/Inspection/components/taskDetail.vue
@@ -0,0 +1,98 @@
+<template>
+  <GlobalWindow title="宸℃浠诲姟璇︽儏" :showConfirm="false" :visible.sync="isShowModal">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="" label="宸℃鐐瑰悕绉�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="鐘舵��" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="宸℃浜�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="宸℃鏃堕棿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="宸℃缁撴灉" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="宸℃璇存槑" min-width="100" show-overflow-tooltip>
+        <template v-slot="scope">
+          <span>{{ scope.row.billCode || scope.row.contractNum }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getDetail" :pagination="pagination" />
+    </div>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import QueryForm from '@/components/common/QueryForm'
+import Pagination from '@/components/common/Pagination'
+export default {
+  components: { GlobalWindow, QueryForm, Pagination },
+  data() {
+    return {
+      isShowModal: true,
+      id: '',
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '宸℃鐐瑰悕绉�'
+          },
+          {
+            filed: 'status',
+            type: 'select',
+            label: '鎵ц鐘舵��',
+            placeholder: '鍏ㄩ儴',
+            options: []
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  methods: {
+    getDetail(page) {
+      const { pagination, filters, id } = this
+      this.loading = true
+      platformLogPage({
+        model: {
+          ...filters,
+          id,
+        },
+        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.getDetail()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+      this.getDetail()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/admin/src/views/Inspection/dot.vue b/admin/src/views/Inspection/dot.vue
index 0db2bf6..790a839 100644
--- a/admin/src/views/Inspection/dot.vue
+++ b/admin/src/views/Inspection/dot.vue
@@ -1,22 +1,44 @@
 <template>
   <TableLayout :permissions="['business:ywpatrolpoint: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="宸℃鍖哄煙">
+        <el-cascader v-model="searchForm.areaIds" @change="changeSel" placeholder="璇烽�夋嫨宸℃鍖哄煙" clearable
+          :options="areaList" :props="{
+            label: 'name',
+            value: 'id',
+            children: 'childCategoryList',
+            checkStrictly: true
+          }"></el-cascader>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolline:exportExcel']"
+          @click="exportExcel">瀵煎嚭</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywpatrolpoint:create', 'business:ywpatrolpoint:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwPatrolPointWindow.open('鏂板缓宸℃鐐�')" icon="el-icon-plus"
+        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
             v-permissions="['business:ywpatrolpoint:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
             v-permissions="['business:ywpatrolpoint:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵�� 0鍚敤 1绂佺敤" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="宸℃鐐圭紪鐮�" min-width="100px"></el-table-column>
+        <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">
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaYwPatrolPointWindow.open('缂栬緫宸℃鐐�', row)" icon="el-icon-edit"
+            <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"
               v-permissions="['business:ywpatrolpoint:delete']">鍒犻櫎</el-button>
@@ -36,6 +58,7 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaYwPatrolPointWindow from './components/OperaYwPatrolPointWindow'
+import { fetchList } from '@/api/business/category'
 export default {
   name: 'YwPatrolPoint',
   extends: BaseTable,
@@ -57,7 +80,8 @@
         imgurl: '',
         areaId: '',
         addr: ''
-      }
+      },
+      areaList: []
     }
   },
   created() {
@@ -68,6 +92,39 @@
       'field.main': 'id'
     })
     this.search()
+    this.getProject()
+  },
+  methods: {
+    getProject() {
+      fetchList({
+        model: {type: 4},
+        capacity: 1000,
+        page: 1,
+      }).then(res => {
+        this.areaList = res.records || []
+      })
+    },
+    editClick(row) {
+      if (row && row.id) {
+        this.$refs.operaYwPatrolPointWindow.open('缂栬緫宸℃鐐�')
+      } else {
+        this.$refs.operaYwPatrolPointWindow.open('鏂板缓宸℃鐐�')
+      }
+      this.$refs.operaYwPatrolPointWindow.initData()
+    },
+    changeSel(e) {
+      if (e && e.length == 1) {
+        this.$set(this.searchForm, 'catePId', e[0])
+        this.$set(this.searchForm, 'cateId', '')
+      } else if (e && e.length == 2) {
+        this.$set(this.searchForm, 'catePId', e[0])
+        this.$set(this.searchForm, 'cateId', e[1])
+      } else {
+        this.$set(this.searchForm, 'catePId', '')
+        this.$set(this.searchForm, 'cateId', '')
+      }
+      this.search()
+    },
   }
 }
 </script>
diff --git a/admin/src/views/Inspection/path.vue b/admin/src/views/Inspection/path.vue
index a426856..4854c6b 100644
--- a/admin/src/views/Inspection/path.vue
+++ b/admin/src/views/Inspection/path.vue
@@ -2,54 +2,49 @@
   <TableLayout :permissions="['business:ywpatrolline: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="璁″垝鏃ユ湡">
-        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="宸℃绾胯矾" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ贰妫�绾胯矾鍚嶇О" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolline:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <!-- <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolline:exportExcel']"
+          @click="exportExcel">瀵煎嚭</el-button> -->
         <el-button @click="reset">閲嶇疆</el-button>
       </section>
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywpatrolline:create', 'business:ywpatrolline:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwPatrolLineWindow.open('鏂板缓宸℃绾胯矾')" icon="el-icon-plus" v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywpatrolline:delete']">鍒犻櫎</el-button></li>
+        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
+            v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
+            v-permissions="['business:ywpatrolline:delete']">鍒犻櫎</el-button></li>
       </ul>
-      <el-table
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column type="selection" width="55"></el-table-column>    
-        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵�� 0鍚敤 1绂佺敤" min-width="100px"></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:ywpatrolline:update', 'business:ywpatrolline:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
+      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="绾胯矾鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="lineAmount" label="宸℃鐐规暟閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template v-slot="scope">
+            <el-switch v-model="scope.row.status" @change="changeStatus" active-value="0" inactive-value="1">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="containPermissions(['business:ywpatrolline:update', 'business:ywpatrolline:delete'])"
+          label="鎿嶄綔" min-width="120" fixed="right">
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaYwPatrolLineWindow.open('缂栬緫宸℃绾胯矾', row)" icon="el-icon-edit" v-permissions="['business:ywpatrolline:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatrolline:delete']">鍒犻櫎</el-button>
+            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
+              v-permissions="['business:ywpatrolline:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+              v-permissions="['business:ywpatrolline:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaYwPatrolLineWindow ref="operaYwPatrolLineWindow" @success="handlePageChange"/>
+    <OperaYwPatrolLineWindow ref="operaYwPatrolLineWindow" @success="handlePageChange" />
   </TableLayout>
 </template>
 
@@ -62,7 +57,7 @@
   name: 'YwPatrolLine',
   extends: BaseTable,
   components: { TableLayout, Pagination, OperaYwPatrolLineWindow },
-  data () {
+  data() {
     return {
       // 鎼滅储
       searchForm: {
@@ -80,7 +75,7 @@
       }
     }
   },
-  created () {
+  created() {
     this.config({
       module: '杩愮淮宸℃璺嚎淇℃伅琛�',
       api: '/Inspection/ywPatrolLine',
@@ -88,6 +83,20 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    changeStatus() {
+
+    },
+    editClick(row) {
+      if (row && row.id) {
+        this.$refs.operaYwPatrolLineWindow.open('缂栬緫宸℃绾胯矾')
+      } else {
+        this.$refs.operaYwPatrolLineWindow.open('鏂板缓宸℃绾胯矾')
+      }
+      this.$refs.operaYwPatrolLineWindow.initData()
+      
+    },
   }
 }
 </script>
diff --git a/admin/src/views/Inspection/plan.vue b/admin/src/views/Inspection/plan.vue
index 1fa37c1..55fa79a 100644
--- a/admin/src/views/Inspection/plan.vue
+++ b/admin/src/views/Inspection/plan.vue
@@ -2,69 +2,73 @@
   <TableLayout :permissions="['business:ywpatrolscheme:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-    
+
       <el-form-item label="鏍囬" prop="title">
         <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ユ爣棰�" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <el-form-item label="寮�濮嬫棩鏈�" prop="startDate">
-        <el-date-picker v-model="searchForm.startDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ紑濮嬫棩鏈�" @change="search"/>
+        <el-date-picker v-model="searchForm.startDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ紑濮嬫棩鏈�"
+          @change="search" />
       </el-form-item>
       <el-form-item label="缁撴潫鏃ユ湡" prop="endDate">
-        <el-date-picker v-model="searchForm.endDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ョ粨鏉熸棩鏈�" @change="search"/>
+        <el-date-picker v-model="searchForm.endDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ョ粨鏉熸棩鏈�" @change="search" />
       </el-form-item>
-     
+
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolscheme:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywpatrolscheme:exportExcel']"
+          @click="exportExcel">瀵煎嚭</el-button>
         <el-button @click="reset">閲嶇疆</el-button>
       </section>
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywpatrolscheme:create', 'business:ywpatrolscheme:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwPatrolSchemeWindow.open('鏂板缓宸℃璁″垝')" icon="el-icon-plus" v-permissions="['business:ywpatrolscheme:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywpatrolscheme:delete']">鍒犻櫎</el-button></li>
+        <li><el-button type="primary" @click="$refs.operaYwPatrolSchemeWindow.open('鏂板缓宸℃璁″垝')" icon="el-icon-plus"
+            v-permissions="['business:ywpatrolscheme:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
+            v-permissions="['business:ywpatrolscheme:delete']">鍒犻櫎</el-button></li>
       </ul>
-      <el-table
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
+      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55"></el-table-column>
-       
-        <el-table-column prop="title" label="鏍囬" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵�� 0鍚敤 1绂佺敤" min-width="100px"></el-table-column>
-        <el-table-column prop="lineId" label="宸℃鐐圭紪鐮�(鍏宠仈yw_patrol_line)" min-width="100px"></el-table-column>
-       
-        <el-table-column prop="dealDate" label="澶勭悊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="dealInfo" label="澶勭悊澶囨敞" min-width="100px"></el-table-column>
-        <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" min-width="100px"></el-table-column>
-        <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" min-width="100px"></el-table-column>
-        <el-table-column prop="startTime" label="寮�濮嬫椂闂寸偣" min-width="100px"></el-table-column>
-        <el-table-column prop="endTime" label="缁撴潫鏃堕棿鐐�" min-width="100px"></el-table-column>
-        <el-table-column prop="processStatus" label="鎵ц杩涘害 0寰呭紑濮� 1杩涜涓� 2瓒呮湡 3宸插畬鎴�" min-width="100px"></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:ywpatrolscheme:update', 'business:ywpatrolscheme:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
+
+        <el-table-column prop="title" label="璁″垝鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="lineId" label="璁″垝缂栧彿" min-width="100px"></el-table-column>
+        <el-table-column prop="dealDate" label="璐熻矗浜哄憳" min-width="100px"></el-table-column>
+
+        <el-table-column prop="startDate" label="璁″垝鏃ユ湡" min-width="100px">
+          <template v-slot="scope">
+            <span>{{ scope.row.startDate }} - {{ scope.row.endDate }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="startDate" label="鎵ц鏃堕棿" min-width="100px">
+          <template v-slot="scope">
+            <span>{{ scope.row.startTime }} - {{ scope.row.endTime }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="" label="鍒涘缓浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="" label="鎵ц缁撴灉" min-width="100px"></el-table-column>
+        <el-table-column label="鐘舵��" min-width="100px">
+          <template v-slot="scope">
+            <el-switch v-model="scope.row.status" @change="changeStatus" active-value="0" inactive-value="1">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="containPermissions(['business:ywpatrolscheme:update', 'business:ywpatrolscheme:delete'])"
+          label="鎿嶄綔" min-width="120" fixed="right">
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaYwPatrolSchemeWindow.open('缂栬緫宸℃璁″垝', row)" icon="el-icon-edit" v-permissions="['business:ywpatrolscheme:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatrolscheme:delete']">鍒犻櫎</el-button>
+            <el-button type="text" @click="$refs.operaYwPatrolSchemeWindow.open('缂栬緫宸℃璁″垝', row)" icon="el-icon-edit"
+              v-permissions="['business:ywpatrolscheme:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+              v-permissions="['business:ywpatrolscheme:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaYwPatrolSchemeWindow ref="operaYwPatrolSchemeWindow" @success="handlePageChange"/>
+    <OperaYwPatrolSchemeWindow ref="operaYwPatrolSchemeWindow" @success="handlePageChange" />
   </TableLayout>
 </template>
 
@@ -77,7 +81,7 @@
   name: 'YwPatrolScheme',
   extends: BaseTable,
   components: { TableLayout, Pagination, OperaYwPatrolSchemeWindow },
-  data () {
+  data() {
     return {
       // 鎼滅储
       searchForm: {
@@ -106,7 +110,7 @@
       }
     }
   },
-  created () {
+  created() {
     this.config({
       module: '杩愮淮宸℃璁″垝淇℃伅琛�',
       api: '/Inspection/ywPatrolScheme',
@@ -114,6 +118,17 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    editClick(row) {
+      if (row && row.id) {
+        this.$refs.operaYwPatrolSchemeWindow.open('缂栬緫宸℃璁″垝')
+      } else {
+        this.$refs.operaYwPatrolSchemeWindow.open('鏂板缓宸℃璁″垝')
+      }
+      this.$refs.operaYwPatrolSchemeWindow.initData()
+      
+    },
   }
 }
 </script>
diff --git a/admin/src/views/Inspection/task.vue b/admin/src/views/Inspection/task.vue
index 9544842..99b3ea0 100644
--- a/admin/src/views/Inspection/task.vue
+++ b/admin/src/views/Inspection/task.vue
@@ -2,15 +2,17 @@
   <TableLayout :permissions="['business:ywpatroltask:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-   
-      <el-form-item label="鏍囬" prop="title">
-        <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ユ爣棰�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="璁″垝鍚嶇О" prop="title">
+        <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ヨ鍒掑悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="寮�濮嬫棩鏈�" prop="startDate">
-        <el-date-picker v-model="searchForm.startDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ紑濮嬫棩鏈�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="缁撴潫鏃ユ湡" prop="endDate">
-        <el-date-picker v-model="searchForm.endDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ョ粨鏉熸棩鏈�" @change="search"/>
+      <el-form-item >
+        <el-select v-model="searchForm.status" filterable clearable>
+          <el-option value="0" label="寰呭紑濮�"></el-option>
+          <el-option value="1" label="杩涜涓�"></el-option>
+          <el-option value="2" label="宸茶秴鏈�"></el-option>
+          <el-option value="3" label="宸插畬鎴�"></el-option>
+          <el-option value="4" label="宸插彇娑�"></el-option>
+        </el-select>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
@@ -20,10 +22,6 @@
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:ywpatroltask:create', 'business:ywpatroltask:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwPatrolTaskWindow.open('鏂板缓宸℃浠诲姟')" icon="el-icon-plus" v-permissions="['business:ywpatroltask:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">鍒犻櫎</el-button></li>
-      </ul>
       <el-table
         v-loading="isWorking.search"
         :data="tableData.list"
@@ -31,16 +29,25 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="title" label="鏍囬" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵�� 0寰呭紑濮� 1杩涜涓� 2宸茶秴鏈� 3宸插畬鎴� 4宸插彇娑�" min-width="100px"></el-table-column>
-        <el-table-column prop="schemeId" label="宸℃璁″垝缂栫爜(鍏宠仈yw_patrol_scheme)" min-width="100px"></el-table-column>
-        
-        <el-table-column prop="dealUserId" label="澶勭悊浜虹紪鐮�(鍏宠仈system_user)" min-width="100px"></el-table-column>
-        <el-table-column prop="dealDate" label="澶勭悊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="dealInfo" label="澶勭悊澶囨敞" min-width="100px"></el-table-column>
-        <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" min-width="100px"></el-table-column>
-        <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" min-width="100px"></el-table-column>
-        <el-table-column prop="dealStatus" label="宸℃缁撴灉  0姝e父 1寮傚父" min-width="100px"></el-table-column>
+        <el-table-column prop="planTitle" label="璁″垝鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="schemeId" label="璁″垝缂栧彿" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="浠诲姟缂栧彿" min-width="100px"></el-table-column>
+        <el-table-column prop="dealDate" label="浠诲姟鏃堕棿" min-width="100px">
+          <template v-slot="scope">
+            <span>{{ scope.row.startDate }} {{ scope.row.endDate }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="dealDate" label="瀹為檯瀹屾垚鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="userName" label="鎵ц浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="dealStatus" label="浠诲姟鐘舵��" min-width="100px">
+          <template v-slot="scope">
+            <span class="primaryColor" v-if="scope.row.status == 0">寰呭紑濮�</span>
+            <span class="green" v-if="scope.row.status == 1">杩涜涓�</span>
+            <span class="red" v-if="scope.row.status == 2">宸茶秴鏈�</span>
+            <span class="gray" v-if="scope.row.status == 3">宸插畬鎴�</span>
+            <span class="gray" v-if="scope.row.status == 4">宸插彇娑�</span>
+          </template>
+        </el-table-column>
         <el-table-column
           v-if="containPermissions(['business:ywpatroltask:update', 'business:ywpatroltask:delete'])"
           label="鎿嶄綔"
@@ -48,8 +55,7 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaYwPatrolTaskWindow.open('缂栬緫宸℃浠诲姟', row)" icon="el-icon-edit" v-permissions="['business:ywpatroltask:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">鍒犻櫎</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywpatroltask:delete']">鍙栨秷</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -60,7 +66,8 @@
       >
       </pagination>
     </template>
-
+    <!--  -->
+    <TaskDetail ref="TaskDetailRef" />
   </TableLayout>
 </template>
 
@@ -68,33 +75,17 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
+import TaskDetail from './components/taskDetail'
 export default {
   name: 'YwPatrolTask',
   extends: BaseTable,
-  components: { TableLayout, Pagination },
+  components: { TableLayout, Pagination, TaskDetail },
   data () {
     return {
       // 鎼滅储
       searchForm: {
-        id: '',
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        title: '',
-        remark: '',
-        status: '',
-        sortnum: '',
-        schemeId: '',
-        pointId: '',
-        dealUserId: '',
-        dealDate: '',
-        dealInfo: '',
-        circleType: '',
-        startDate: '',
-        endDate: '',
-        dealStatus: ''
+        title:'',
+        status: ''
       }
     }
   },
@@ -106,6 +97,13 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    handleDetail(row) {
+      this.$refs.TaskDetailRef.isShowModal = true
+      this.$refs.TaskDetailRef.id = row.id
+      this.$refs.TaskDetailRef.getDetail()
+    },
   }
 }
 </script>
diff --git a/admin/src/views/client/staffList.vue b/admin/src/views/client/staffList.vue
index 05d7c12..3012931 100644
--- a/admin/src/views/client/staffList.vue
+++ b/admin/src/views/client/staffList.vue
@@ -5,6 +5,9 @@
       <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 prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ヤ汉鍛樺鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
         <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywcustomer:exportExcel']"
@@ -21,10 +24,11 @@
             v-permissions="['business:ywcustomer:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55"></el-table-column>
         <el-table-column prop="name" label="瀹㈡埛鍚嶇О" min-width="100px"></el-table-column>
         <el-table-column prop="memberName" label="鑱旂郴浜�" min-width="100px"></el-table-column>
         <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" min-width="100px"></el-table-column>
+        <el-table-column prop="" label="韬唤" min-width="100px"></el-table-column>
+        <el-table-column prop="" label="鐘舵��" min-width="100px"></el-table-column>
         <el-table-column v-if="containPermissions(['business:ywcustomer:update', 'business:ywcustomer:delete'])"
           label="鎿嶄綔" min-width="120" fixed="right">
           <template slot-scope="{row}">
diff --git a/admin/src/views/contract/components/config.js b/admin/src/views/contract/components/config.js
new file mode 100644
index 0000000..7d3be5d
--- /dev/null
+++ b/admin/src/views/contract/components/config.js
@@ -0,0 +1,3 @@
+export const rules = {
+  name: [{ required: true, message: '璇疯緭鍏�' }]
+}
\ No newline at end of file
diff --git a/admin/src/views/contract/components/contractDetail.vue b/admin/src/views/contract/components/contractDetail.vue
new file mode 100644
index 0000000..f8504a5
--- /dev/null
+++ b/admin/src/views/contract/components/contractDetail.vue
@@ -0,0 +1,226 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+    @confirm="confirm">
+    <div class="home_title">
+      <div class="left">
+        <span class="mr10">鍗曚綅鍚嶇О锛歺xx</span>
+        <span class="status">status</span>
+      </div>
+      <el-button plain type="danger">閫�绉�</el-button>
+    </div>
+    <div class="remark">鍚堝悓鎽樿锛歺xxx</div>
+    <div class="tabs">
+      <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">鍚堝悓淇℃伅</div>
+      <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">鍏宠仈璐﹀崟</div>
+      <div class="tab" :class="{ active: activeTabs == 2 }" @click="tabsClick(2)">鎿嶄綔璁板綍</div>
+    </div>
+    <div class="main">
+      <div class="title">鍩虹淇℃伅</div>
+      <div class="list">
+        <div class="item">
+          <div class="la">鍚堝悓缂栧彿</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">缁忓姙浜�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">鍒涘缓浜�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">鍚堝悓绉熻祦鏁�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">鎵�灞炲叕鍙�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">绛捐鏃ユ湡</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">寮�濮嬫棩鏈�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">缁撴潫鏃ユ湡</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">鎵�灞為」鐩�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">缁撴灉鍙栨暣(鍥涜垗浜斿叆)</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+      </div>
+      <div class="title">鎴挎簮淇℃伅</div>
+      <div class="list">
+        <div class="item">
+          <div class="la">椤圭洰鍚嶇О</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">妤煎畤鍚嶇О</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">妤煎眰/鎴垮彿</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">闈㈢Н</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+      </div>
+      <div class="title">绉熷淇℃伅</div>
+      <div class="list">
+        <div class="item">
+          <div class="la">绉熷</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">缁忓姙浜�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+      </div>
+      <div class="title">绉熻祦鏉℃</div>
+      <div class="list">
+        <div class="item">
+          <div class="la">鎶奸噾閲戦</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">浠樻鏂瑰紡</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+        <div class="item">
+          <div class="la">鍏嶇鏈�</div>
+          <div class="val">{{ info.aaa }}</div>
+        </div>
+      </div>
+      <el-table :data="info.list" stripe>
+        <el-table-column prop="" label="寮�濮嬫棩鏈�" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="" label="缁撴潫鏃ユ湡" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="" label="鍚堝悓鍗曚环" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="" label="浠樻鎻愬墠澶╂暟" min-width="100" show-overflow-tooltip />
+      </el-table>
+    </div>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BaseOpera from '@/components/base/BaseOpera'
+export default {
+  components: {
+    GlobalWindow
+  },
+  extends: BaseOpera,
+  data() {
+    return {
+      id: '',
+      visible: false,
+      activeTabs: '',
+      info: {}
+    }
+  },
+  methods: {
+    tabsClick(val) {
+      this.activeTabs = val
+    },
+    getDetail() {
+
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '@/assets/style/variables.scss';
+.home_title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+
+  .left {
+    font-weight: 500;
+    font-size: 16px;
+    margin-right: 10px;
+    display: flex;
+    align-items: center;
+
+    .status {
+      padding: 0 6px;
+      height: 22px;
+      line-height: 22px;
+      border-radius: 2px;
+      border: 1px solid #00BA92;
+      color: #00BA92;
+      font-weight: 400;
+      font-size: 12px;
+      color: #00BA92;
+    }
+  }
+}
+
+.remark {
+  background: #E8EBF7;
+  border-radius: 2px;
+  padding: 10px 20px;
+  font-size: 16px;
+  margin: 20px 0
+}
+
+.tabs {
+  border-bottom: 1px solid #DFE2E8;
+  display: flex;
+  margin-bottom: 20px;
+  .tab {
+    height: 58px;
+    line-height: 58px;
+    font-size: 16px;
+    color: #666666;
+    margin-right: 30px;
+    cursor: pointer;
+  }
+
+  .active {
+    font-weight: 500;
+    color: $primary-color;
+    border-bottom: 2px solid $primary-color;
+  }
+}
+
+.main {
+  .title {
+    font-weight: 500;
+    font-size: 18px;
+    color: $primary-color;
+    margin-bottom: 15px;
+  }
+
+  .list {
+    display: flex;
+    flex-wrap: wrap;
+    background: #F7F7F7;
+    border-radius: 2px;
+    padding: 15px 20px;
+    margin-bottom: 20px;
+
+    .item {
+      width: 25%;
+      margin-bottom: 16px;
+
+      .la {
+        color: #7f7f7f;
+        margin-top: 2px;
+      }
+    }
+  }
+}
+</style>
diff --git a/admin/src/views/contract/components/contractEdit.vue b/admin/src/views/contract/components/contractEdit.vue
new file mode 100644
index 0000000..8e79bce
--- /dev/null
+++ b/admin/src/views/contract/components/contractEdit.vue
@@ -0,0 +1,376 @@
+<template>
+  <GlobalWindow width="1000px" :title="title" :visible.sync="showModal" :confirm-working="isWorking" @close="close" @confirm="confirm">
+    <div class="tabs">
+      <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">1銆佸熀鏈俊鎭�</div>
+      <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">2銆佽垂鐢ㄦ潯娆�</div>
+    </div>
+    <template v-if="activeTabs == 0">
+      <div class="main">
+        <div class="main_content">
+          <el-form :model="param" ref="paramRef" :rules="rules">
+            <div class="m_title">鍩虹淇℃伅</div>
+            <div class="list">
+              <el-form-item label="鍚堝悓绫诲瀷" prop="type">
+                <el-select v-model="param.type" placeholder="璇烽�夋嫨" clearable>
+                  <el-option v-for="item in types" :value="item.value" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍚堝悓缂栧彿" prop="code">
+                <el-input v-model="param.code" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�" v-trim />
+              </el-form-item>
+              <el-form-item label="缁忓姙浜�" prop="aaa">
+                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
+                  <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍚堝悓绛捐鏃ユ湡" prop="">
+                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+              </el-form-item>
+              <el-form-item label="鍚堝悓寮�濮嬫棩鏈�" prop="">
+                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+              </el-form-item>
+              <el-form-item label="鍚堝悓缁撴潫鏃ユ湡" prop="">
+                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+              </el-form-item>
+              <el-form-item label="褰掑睘椤圭洰" prop="">
+                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
+                  <el-option v-for="item in projectList" :value="item.id" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="缁撴灉鍙栨暣(鍥涜垗浜斿叆)" prop="">
+                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
+                  <el-option :value="0" label="鍚�"></el-option>
+                  <el-option :value="1" label="鏄�"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鎵�灞炲叕鍙�" prop="">
+                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
+                  <el-option v-for="item in comparyList" :value="item.id" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+            </div>
+            <div class="m_title">绉熷淇℃伅</div>
+            <div class="list">
+              <el-form-item label="绉熷" prop="">
+                <el-button @click="handleRent" type="primary">閫夋嫨绉熷</el-button>
+                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
+                  <el-option v-for="item in renterList" :value="item.id" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鑱旂郴浜�" prop="">
+                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
+                  <el-option v-for="item in contacts" :value="item.id" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+            </div>
+          </el-form>
+        </div>
+        <div class="main_house">
+          <div class="title">璇烽�夋嫨鎴挎簮</div>
+          <el-cascader style="width: 300px" v-model="value" @change="houseChange" :options="options"
+            :props="{ multiple: true }" collapse-tags clearable />
+        </div>
+      </div>
+      <div class="file_wrap">
+        <div class="head">
+          <div>鍚堝悓闄勪欢</div>
+          <el-button icon="el-icon-plus" plain>娣诲姞闄勪欢</el-button>
+        </div>
+        <el-table :data="param.list" stripe>
+          <el-table-column prop="" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip />
+          <el-table-column prop="" label="鎿嶄綔浜�" align="center" min-width="100" show-overflow-tooltip />
+          <el-table-column prop="" label="鎿嶄綔鏃堕棿" align="center" min-width="100" show-overflow-tooltip />
+          <el-table-column prop="" label="鎿嶄綔" align="center" min-width="100">
+            <template v-slot="scope">
+              <span class="cu red">鍒犻櫎</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </template>
+    <template v-if="activeTabs == 1">
+      <div class="tabs cost_tabs">
+        <div class="tab" :class="{ active: cactiveTabs == 0 }" @click="ctabsClick(0)">绉熻祦鏉℃</div>
+        <div class="tab" :class="{ active: cactiveTabs == 1 }" @click="ctabsClick(1)">鐗╀笟鏉℃</div>
+      </div>
+      <div class="main">
+        <div class="main_content">
+          <el-form :model="paramCost" ref="paramCostRef" :rules="rules">
+            <div class="m_title">绉熻祦淇℃伅</div>
+            <div class="list">
+              <el-form-item label="鎶奸噾閲戦(鍏�)" prop="type">
+                <el-input v-model="paramCost.code" placeholder="璇疯緭鍏�" v-trim />
+              </el-form-item>
+              <el-form-item label="浠樻鏂瑰紡" prop="code">
+                <el-select v-model="paramCost.type" placeholder="璇烽�夋嫨" clearable>
+                  <el-option v-for="item in payMethods" :value="item.value" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍏嶇鏈�" prop="aaa">
+                <el-date-picker type="daterange" v-model="paramCost.getDate" value-format="yyyy-MM-dd"
+                  placeholder="璇烽�夋嫨" />
+              </el-form-item>
+            </div>
+            <div class="m_title">绉熻祦鏉℃</div>
+            <div class="list">
+              <el-form-item label="璧峰鏃ユ湡" prop="">
+                <el-date-picker type="date" v-model="paramCost.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+              </el-form-item>
+              <el-form-item label="鍚堝悓鍗曚环" prop="">
+                <el-input placeholder="璇疯緭鍏ュ唴瀹�" v-model="paramCost.aaa">
+                  <el-select v-model="paramCost.ddd" slot="append" placeholder="璇烽�夋嫨" clearable>
+                    <el-option v-for="item in unitOps" :value="item.value" :label="item.name"></el-option>
+                  </el-select>
+                </el-input>
+              </el-form-item>
+              <el-form-item label="浠樻鎻愬墠澶╂暟" prop="">
+                <el-input v-model="paramCost.aaa" placeholder="璇疯緭鍏�" v-trim />
+              </el-form-item>
+            </div>
+          </el-form>
+        </div>
+      </div>
+      <el-button style="width: 100%;height: 48px;" type="primary" plain>鐢熸垚璐﹀崟鏄庣粏</el-button>
+      <el-table :data="paramCost.list" class="mt20" stripe>
+        <el-table-column prop="" label="璐圭敤绫诲瀷" align="center" width="160px" show-overflow-tooltip />
+        <el-table-column prop="" label="鎸囨暟"align="center" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="" label="鍖洪棿" align="center" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="" label="浠樻鏃�" align="center" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="" label="搴旀敹" align="center" min-width="100" show-overflow-tooltip />
+      </el-table>
+      <div class="total">
+        <span>鎬昏</span>
+        <div>璐圭敤搴旀敹鎬昏锛氾紝鎶奸噾搴旀敹鎬昏锛�</div>
+      </div>
+    </template>
+    <!--  -->
+    <MemberSearch ref="MemberSearchRef" />
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BaseOpera from '@/components/base/BaseOpera'
+import MemberSearch from '@/components/common/MemberSearch'
+import { rules } from './config'
+export default {
+  components: {
+    GlobalWindow,
+    MemberSearch
+  },
+  extends: BaseOpera,
+  data() {
+    return {
+      showModal: false,
+      title: '鍒涘缓鍚堝悓',
+      activeTabs: '0',
+      param: {},
+      rules,
+
+      types: [
+        { name: '鐗╀笟+绉熻祦鍚堝悓', value: 0 },
+        { name: '绉熻祦鍚堝悓', value: 1 },
+        { name: '鐗╀笟鍚堝悓', value: 2 },
+      ],
+      agentList: [], //缁忓姙浜�
+      projectList: [],
+      comparyList: [], // 鍏徃
+      renterList: [], // 绉熷
+      contacts: [], // 鑱旂郴浜�
+      value: [],
+      options: [
+        {
+          value: 1,
+          label: '涓滃崡',
+          children: [{
+            value: 2,
+            label: '涓婃捣',
+            children: [
+              { value: 3, label: '鏅檧' },
+              { value: 4, label: '榛勫煍' },
+              { value: 5, label: '寰愭眹' }
+            ]
+          }, {
+            value: 7,
+            label: '姹熻嫃',
+            children: [
+              { value: 8, label: '鍗椾含' },
+              { value: 9, label: '鑻忓窞' },
+              { value: 10, label: '鏃犻敗' }
+            ]
+          }, {
+            value: 12,
+            label: '娴欐睙',
+            children: [
+              { value: 13, label: '鏉窞' },
+              { value: 14, label: '瀹佹尝' },
+              { value: 15, label: '鍢夊叴' }
+            ]
+          }]
+        },
+        {
+          value: 17,
+          label: '瑗垮寳',
+          children: [{
+            value: 18,
+            label: '闄曡タ',
+            children: [
+              { value: 19, label: '瑗垮畨' },
+              { value: 20, label: '寤跺畨' }
+            ]
+          }, {
+            value: 21,
+            label: '鏂扮枂缁村惥灏旀棌鑷不鍖�',
+            children: [
+              { value: 22, label: '涔岄瞾鏈ㄩ綈' },
+              { value: 23, label: '鍏嬫媺鐜涗緷' }
+            ]
+          }]
+        }
+      ],
+      cactiveTabs: 0,
+      paramCost: {},
+      payMethods: [
+        { name: '涓�娆℃�т粯娆�', value: 0 },
+        { name: '3涓湀涓�浠�', value: 1 },
+        { name: '6涓湀涓�浠�', value: 2 },
+        { name: '1骞翠竴浠�', value: 2 },
+      ],
+      unitOps: [
+        { name: '鍏�/m虏路澶�', value: 0 },
+        { name: '鍏�/m虏路鏈�', value: 1 },
+        { name: '鍏�/澶�', value: 2 },
+        { name: '鍏�/鏈�', value: 3 },
+        { name: '鍏�/骞�', value: 4 },
+        { name: '鍏�/m虏路骞�', value: 5 },
+        { name: '鍏�/鍦�', value: 6 },
+      ],
+    }
+  },
+  methods: {
+    tabsClick(val) {
+      this.activeTabs = val
+    },
+    ctabsClick(val) {
+      this.cactiveTabs = val
+    },
+    getDetail() {
+
+    },
+    handleRent() {
+      this.$refs.MemberSearchRef.openModal()
+    },
+    houseChange(e) {
+      console.log(e)
+      console.log(this.value)
+
+    },
+    close() {
+      this.showModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '@/assets/style/variables.scss';
+
+.tabs {
+  border-bottom: 1px solid #DFE2E8;
+  display: flex;
+  margin-bottom: 20px;
+  display: flex;
+  justify-content: center;
+
+  .tab {
+    height: 58px;
+    line-height: 58px;
+    font-size: 16px;
+    color: #666666;
+    margin: 0 30px;
+    cursor: pointer;
+  }
+
+  .active {
+    font-weight: 500;
+    color: $primary-color;
+    border-bottom: 2px solid $primary-color;
+  }
+}
+
+.cost_tabs {
+  justify-content: flex-start;
+  border: none;
+
+  .tab {
+    height: 36px;
+    line-height: 36px;
+    font-size: 14px;
+  }
+}
+
+.main {
+  display: flex;
+  margin-bottom: 20px;
+
+  .main_content {
+    flex: 1;
+    margin-right: 20px;
+
+    .list {
+      display: flex;
+      flex-wrap: wrap;
+
+      .el-form-item {
+        width: 33.33%;
+        box-sizing: border-box;
+        padding: 0 12px;
+      }
+    }
+  }
+
+  .main_house {
+    width: 420px;
+    padding: 24px 12px;
+    border: 1px solid #c3c6cd;
+    border-radius: 2px;
+
+    .title {
+      font-size: 16px;
+      font-weight: 500;
+      margin-bottom: 30px;
+    }
+  }
+
+}
+.total{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  height: 32px;
+  background-color: #e7e9f5;
+  span{
+    width: 160px;
+    text-align: center;
+  }
+}
+.file_wrap {
+  padding: 20px 16px;
+  border: 1px solid #c3c6cd;
+  border-radius: 2px;
+
+  .head {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+}
+
+.m_title {
+  font-weight: 500;
+  font-size: 14px;
+  margin-bottom: 15px;
+  margin-top: 10px;
+}
+</style>
diff --git a/admin/src/views/contract/contractList.vue b/admin/src/views/contract/contractList.vue
index e69de29..1309081 100644
--- a/admin/src/views/contract/contractList.vue
+++ b/admin/src/views/contract/contractList.vue
@@ -0,0 +1,147 @@
+<template>
+  <div class="main_app">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear">
+      <template #btns>
+        <el-button>瀵煎嚭</el-button>
+      </template>
+    </QueryForm>
+    <div class="mt10">
+      <el-button @click="handleEdit()" icon="el-icon-plus" type="primary">鏂板缓</el-button>
+    </div>
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="寮�濮嬫棩鏈�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="缁撴潫鏃ユ湡" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="绉熻祦鍗曚环" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="绉熻祦闈㈢Н" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="绛捐鏃�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="鍚堝悓缂栧彿" min-width="100" show-overflow-tooltip />
+
+      <el-table-column prop="" label="鍚堝悓鐘舵��" min-width="100" show-overflow-tooltip>
+        <template v-slot="scope">
+          <span class="primaryColor">寰呮墽琛�</span>
+          <span class="green">姝e父鎵ц涓�</span>
+          <span class="gary">宸查��绉�</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="" label="鎿嶄綔" min-width="100" show-overflow-tooltip>
+        <template v-slot="scope">
+          <span class="primaryColor cu" @click="handleDetail(scope.row)">鏌ョ湅璇︽儏</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+    <ContractDetail ref="ContractDetailRef" />
+    <ContractEdit ref="ContractEditRef" v-if="showEdit" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import ContractDetail from './components/contractDetail'
+import ContractEdit from './components/contractEdit.vue'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+import { platformLogPage, getPlatformGroupList } from '@/api'
+export default {
+  components: {
+    Pagination,
+    QueryForm,
+    ContractEdit,
+    ContractDetail
+  },
+  data() {
+    return {
+      showEdit: false,
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '鍚堝悓鍚嶇О'
+          },
+          {
+            filed: 'selDate',
+            type: 'datetimerange',
+            placeholder: '搴斿紑濮嬫椂闂�'
+          }
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    // this.getList()
+    // this.getGroupList()
+  },
+  methods: {
+    handleEdit(row) {
+      this.showEdit = true
+      this.$nextTick(() => {
+        this.$refs.ContractEditRef.showModal = true
+      })
+      if(row && row.id){
+
+      }else{
+
+      }
+    },
+    handleDetail(row) {
+      this.$refs.ContractDetailRef.visible = true
+      this.$refs.ContractDetailRef.getDetail(row.id)
+    },
+   
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      platformLogPage({
+        model: {
+          ...filters,
+          queryStatus: '6,7,8',
+          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
+          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+        },
+        sorts: [{ direction: 'DESC', property: 'param1' }],
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
+          item.taskOrigin = 'WMS鑾峰彇'
+          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style>
+</>
diff --git a/admin/src/views/finance/account.vue b/admin/src/views/finance/account.vue
new file mode 100644
index 0000000..3cb9a42
--- /dev/null
+++ b/admin/src/views/finance/account.vue
@@ -0,0 +1,138 @@
+<template>
+  <div class="main_app">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <div class="mt20">
+      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+        v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
+    </div>
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="code" label="鏀舵敮鏉$洰" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="鏀舵鍏徃" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="璐︽埛绫诲瀷" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="modelNo" label="璐︽埛鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="realName" label="寮�鎴烽摱琛�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="realName" label="閾惰璐﹀彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="status" label="鐘舵��" min-width="100" show-overflow-tooltip>
+        <template v-slot="scope">
+          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+        <template slot-scope="{row}">
+          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
+            v-permissions="['business:category:update']">缂栬緫</el-button>
+          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+            v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import Edit from './components/accountEdit.vue'
+import { companyGetList, deleteById } from '@/api/business/company'
+export default {
+  components: {
+    Pagination,
+    QueryForm,
+    Edit
+  },
+  data() {
+    return {
+      loading: false,
+      showEdit: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '鏀舵敮鏉$洰'
+          },
+          {
+            filed: 'name',
+            type: 'select',
+            label: '鏀舵鍏徃'
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      companyGetList({
+        model: {
+          ...filters,
+          type: 2
+        },
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.stautsName = item.status == 0 ? '姝e父' : item.status == 1 ? '鎹熷潖' : '鎶ュ簾'
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    handleEdit(row) {
+      this.showEdit = true
+      this.$nextTick(() => {
+        this.$refs.EditRef.isShowModal = true
+        if (row && row.id) {
+          this.$refs.EditRef.getDetail(row.id)
+        }
+      })
+
+    },
+    handleDel(row) {
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      this.$dialog.deleteConfirm(message)
+        .then(() => {
+          this.isWorking.delete = true
+          deleteById(row.id)
+            .then(() => {
+              this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
+              this.getList()
+            })
+        })
+        .catch(() => { })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style></style>
diff --git a/admin/src/views/finance/bull.vue b/admin/src/views/finance/bull.vue
new file mode 100644
index 0000000..fef662a
--- /dev/null
+++ b/admin/src/views/finance/bull.vue
@@ -0,0 +1,194 @@
+<template>
+  <div class="main_app">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <div class="df_sb mt20">
+      <div class="tabs">
+        <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">鏀舵璐﹀崟</div>
+        <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">浠樻璐﹀崟</div>
+      </div>
+      <div class="btns">
+        <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+          v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
+        <el-button @click="handleEx" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="" label="杩愮淮浜�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="code" label="璁惧缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="璁惧鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="stautsName" label="璁惧鐘舵��" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="remark" label="杩愮淮澶囨敞" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+        <template slot-scope="{row}">
+          <el-button type="text" @click="handleDetail(row)" icon="el-icon-edit"
+            v-permissions="['business:category:update']">鏌ョ湅</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import Edit from './components/deviceEdit.vue'
+import { fetchList, deleteById } from '@/api/Inspection/device'
+export default {
+  components: {
+    Pagination,
+    QueryForm,
+    Edit
+  },
+  data() {
+    return {
+      loading: false,
+      showEdit: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      activeTabs: 0,
+      filters: {},
+      list: [],
+      total: 0,
+      statusMap: [
+        { value: 0, label: '寰呮敹娆�' },
+        { value: 1, label: '宸茬粨绠�' },
+        { value: 2, label: '閮ㄥ垎缁撴竻' },
+        { value: 3, label: '寰呴��娆�' },
+        { value: 4, label: '寰呬粯娆�' },
+      ],
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '瀹㈡埛鍚嶇О',
+          },
+          {
+            filed: 'status',
+            type: 'select',
+            label: '璐﹀崟鐘舵��',
+            options: [
+              { value: '0', label: '寮�鍚�' },
+              { value: '1', label: '鍏抽棴' },
+            ]
+          },
+          {
+            filed: 'status',
+            type: 'select',
+            label: '缁撴竻鐘舵��',
+            options: this.statusMap
+          },
+          {
+            filed: 'selDate',
+            type: 'daterange',
+            label: '搴旀敹/浠樻棩鏈�'
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      fetchList({
+        model: {
+          ...filters,
+        },
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.stautsName = item.status == 0 ? '姝e父' : item.status == 1 ? '鎹熷潖' : '鎶ュ簾'
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    handleEx() {
+
+    },
+    tabsClick(val) {
+      this.activeTabs = val
+    },
+    handleEdit(row) {
+      this.showEdit = true
+      this.$nextTick(() => {
+        this.$refs.EditRef.isShowModal = true
+        if (row && row.id) {
+          this.$refs.EditRef.getDetail(row.id)
+        }
+      })
+
+    },
+    handleDetail() {
+
+    },
+    handleDel(row) {
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      this.$dialog.deleteConfirm(message)
+        .then(() => {
+          this.isWorking.delete = true
+          deleteById(row.id)
+            .then(() => {
+              this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
+              this.getList()
+            })
+        })
+        .catch(() => { })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+      this.getList()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '@/assets/style/variables.scss';
+
+.tabs {
+  border-bottom: 1px solid #DFE2E8;
+  display: flex;
+  margin-bottom: 20px;
+  display: flex;
+  justify-content: center;
+
+  .tab {
+    height: 58px;
+    line-height: 58px;
+    font-size: 16px;
+    color: #666666;
+    margin: 0 30px;
+    cursor: pointer;
+  }
+
+  .active {
+    font-weight: 500;
+    color: $primary-color;
+    border-bottom: 2px solid $primary-color;
+  }
+}
+</style>
diff --git a/admin/src/views/finance/company.vue b/admin/src/views/finance/company.vue
new file mode 100644
index 0000000..6397411
--- /dev/null
+++ b/admin/src/views/finance/company.vue
@@ -0,0 +1,132 @@
+<template>
+  <div class="main_app">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <div class="mt20">
+      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+        v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
+    </div>
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="code" label="鍏徃鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="鍏徃绠�浠�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="绾崇◣璇嗗埆鍙�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="modelNo" label="鍏徃鍦板潃" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="realName" label="鏀舵敮璐︽埛鏁伴噺" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="status" label="鐘舵��" min-width="100" show-overflow-tooltip>
+        <template v-slot="scope">
+          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+        <template slot-scope="{row}">
+          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
+            v-permissions="['business:category:update']">缂栬緫</el-button>
+          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+            v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import Edit from './components/companyEdit.vue'
+import { companyGetList, deleteById } from '@/api/business/company'
+export default {
+  components: {
+    Pagination,
+    QueryForm,
+    Edit
+  },
+  data() {
+    return {
+      loading: false,
+      showEdit: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '鍏徃鍚嶇О'
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      companyGetList({
+        model: {
+          ...filters,
+          type: 2
+        },
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.stautsName = item.status == 0 ? '姝e父' : item.status == 1 ? '鎹熷潖' : '鎶ュ簾'
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    handleEdit(row) {
+      this.showEdit = true
+      this.$nextTick(() => {
+        this.$refs.EditRef.isShowModal = true
+        if (row && row.id) {
+          this.$refs.EditRef.getDetail(row.id)
+        }
+      })
+
+    },
+    handleDel(row) {
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      this.$dialog.deleteConfirm(message)
+        .then(() => {
+          this.isWorking.delete = true
+          deleteById(row.id)
+            .then(() => {
+              this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
+              this.getList()
+            })
+        })
+        .catch(() => { })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style></style>
diff --git a/admin/src/views/finance/components/accountEdit.vue b/admin/src/views/finance/components/accountEdit.vue
new file mode 100644
index 0000000..7a7fae4
--- /dev/null
+++ b/admin/src/views/finance/components/accountEdit.vue
@@ -0,0 +1,104 @@
+<template>
+  <GlobalWindow :title="param.id ? '缂栬緫鍏徃' : '鏂板缓鍏徃'" :confirmWorking="subLoading" :visible.sync="isShowModal"
+    width="600px" @close="close" @confirm="handleSub">
+    <el-form :model="param" ref="paramRef" :rules="rules">
+      <el-form-item label="鏀舵敮鏉$洰" prop="name">
+        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="鏀舵鍏徃" prop="name">
+        <el-select v-model="param.realName" filterable clearable>
+          <el-option value="0" label="xxx"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鏀舵绫诲瀷" prop="name">
+        <el-radio-group v-model="param.radio">
+          <el-radio :label="0">瀵瑰叕</el-radio>
+          <el-radio :label="1">涓汉</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="璐︽埛鍚嶇О" prop="desc">
+        <el-input v-model="param.desc" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="寮�鎴峰悕绉�">
+        <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="閾惰璐﹀彿">
+        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="code">
+        <el-switch v-model="param.status" active-value="0" inactive-value="1">
+        </el-switch>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
+import { create, updateById } from '@/api/business/company'
+import { Message } from 'element-ui'
+export default {
+  components: { GlobalWindow, UploadAvatarImage },
+  data() {
+    return {
+      isShowModal: false,
+      subLoading: false,
+      param: {
+        type: 2,
+        status: '0'
+      },
+      cateList: [],
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        desc: [{ required: true, message: '璇疯緭鍏�' }]
+      },
+
+    }
+  },
+  created() {
+  },
+  methods: {
+    handleSub() {
+      const { param, subLoading } = this
+      this.$refs['paramRef'].validate((valid) => {
+        if (valid) {
+          let fn = param.id ? updateById : create
+          this.subLoading = true
+          fn(param).then(res => {
+            this.subLoading = false
+            this.$emit('success')
+            Message.success('淇濆瓨鎴愬姛')
+            this.close()
+          }).catch(() => {
+            this.subLoading = false
+          })
+        }
+      })
+    },
+    changeSel(e) {
+      if (e && e.length == 1) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', '')
+      } else if (e && e.length == 2) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', e[1])
+      } else {
+        this.$set(this.param, 'catePId', '')
+        this.$set(this.param, 'cateId', '')
+      }
+      this.search()
+    },
+    uploadAvatarSuccess(file) {
+      this.$set(this.param, 'imgurl', file.imgurl)
+      this.$set(this.param, 'imgurlfull', file.imgurlfull)
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/admin/src/views/finance/components/companyEdit.vue b/admin/src/views/finance/components/companyEdit.vue
new file mode 100644
index 0000000..6c378a8
--- /dev/null
+++ b/admin/src/views/finance/components/companyEdit.vue
@@ -0,0 +1,93 @@
+<template>
+  <GlobalWindow :title="param.id ? '缂栬緫鍏徃' : '鏂板缓鍏徃'" :confirmWorking="subLoading" :visible.sync="isShowModal"
+    width="600px" @close="close" @confirm="handleSub">
+    <el-form :model="param" ref="paramRef" :rules="rules">
+      <el-form-item label="鍏徃鍚嶇О" prop="name">
+        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="鍏徃绠�浠�" prop="desc">
+        <el-input v-model="param.desc" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="绾崇◣璇嗗埆鍙�">
+        <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="鑱旂郴鍦板潃">
+        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="code">
+        <el-switch v-model="param.status" active-value="0" inactive-value="1">
+        </el-switch>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
+import { create, updateById } from '@/api/business/company'
+import { Message } from 'element-ui'
+export default {
+  components: { GlobalWindow, UploadAvatarImage },
+  data() {
+    return {
+      isShowModal: false,
+      subLoading: false,
+      param: {
+        type: 2,
+        status: '0'
+      },
+      cateList: [],
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        desc: [{ required: true, message: '璇疯緭鍏�' }]
+      },
+
+    }
+  },
+  created() {
+  },
+  methods: {
+    handleSub() {
+      const { param, subLoading } = this
+      this.$refs['paramRef'].validate((valid) => {
+        if (valid) {
+          let fn = param.id ? updateById : create
+          this.subLoading = true
+          fn(param).then(res => {
+            this.subLoading = false
+            this.$emit('success')
+            Message.success('淇濆瓨鎴愬姛')
+            this.close()
+          }).catch(() => {
+            this.subLoading = false
+          })
+        }
+      })
+    },
+    changeSel(e) {
+      if (e && e.length == 1) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', '')
+      } else if (e && e.length == 2) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', e[1])
+      } else {
+        this.$set(this.param, 'catePId', '')
+        this.$set(this.param, 'cateId', '')
+      }
+      this.search()
+    },
+    uploadAvatarSuccess(file) {
+      this.$set(this.param, 'imgurl', file.imgurl)
+      this.$set(this.param, 'imgurlfull', file.imgurlfull)
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/admin/src/views/finance/components/deviceEdit.vue b/admin/src/views/finance/components/deviceEdit.vue
new file mode 100644
index 0000000..185fbdc
--- /dev/null
+++ b/admin/src/views/finance/components/deviceEdit.vue
@@ -0,0 +1,137 @@
+<template>
+  <GlobalWindow :title="param.id ? '缂栬緫璁惧' : '鏂板缓璁惧'" :confirmWorking="subLoading" :visible.sync="isShowModal" width="600px" @close="close"
+    @confirm="handleSub">
+    <el-form :model="param" ref="paramRef" :rules="rules">
+      <el-form-item label="璁惧缂栫爜" prop="code">
+        <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="璁惧鍚嶇О" prop="name">
+        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="璁惧鍨嬪彿" prop="">
+        <el-input v-model="param.modelNo" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="璁惧鍒嗙被" prop="">
+        <el-cascader v-model="param.areaIds" @change="changeSel" placeholder="璇烽�夋嫨宸℃鍖哄煙" clearable :options="cateList"
+          :props="{
+            label: 'name',
+            value: 'id',
+            children: 'childCategoryList',
+            checkStrictly: true
+          }"></el-cascader>
+      </el-form-item>
+      <el-form-item label="璁惧绠$悊鍛�" prop="">
+        <el-select v-model="param.realName" filterable clearable>
+          <el-option value="0" label="xxx"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="">
+        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
+
+      </el-form-item>
+      <el-form-item label="渚涘簲鍟�" prop="">
+        <el-input v-model="param.company" placeholder="璇疯緭鍏�" v-trim />
+
+      </el-form-item>
+      <el-form-item label="杩愮淮鍐呭" prop="">
+        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" />
+      </el-form-item>
+      <el-form-item label="璁惧鐘舵��" prop="">
+        <el-select v-model="param.status" filterable clearable>
+          <el-option value="0" label="姝e父"></el-option>
+          <el-option value="1" label="鎹熷潖"></el-option>
+          <el-option value="2" label="鎶ュ簾"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鐓х墖" prop="">
+        <UploadAvatarImage :file="{ 'imgurlfull': param.imgurlfull, 'imgurl': param.imgurl }"
+          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
+          @uploadBegin="isUploading = true" />
+      </el-form-item>
+
+
+
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
+import { fetchList } from '@/api/business/category'
+import { create, updateById } from '@/api/Inspection/device'
+import { Message } from 'element-ui'
+export default {
+  components: { GlobalWindow, UploadAvatarImage },
+  data() {
+    return {
+      isShowModal: false,
+      subLoading: false,
+      param: {},
+      cateList: [],
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        code: [{ required: true, message: '璇疯緭鍏�' }]
+      },
+
+    }
+  },
+  created() {
+    this.initData()
+  },
+  methods: {
+    handleSub() {
+      const { param, subLoading } = this
+      this.$refs['paramRef'].validate((valid) => {
+        if (valid) {
+          let fn = param.id ? updateById : create
+          this.subLoading = true
+          fn(param).then(res => {
+            if (res.code == 200) {
+              this.subLoading = false
+              this.$emit('success')
+              Message.success('淇濆瓨鎴愬姛')
+              this.close()
+            }
+          }).catch(() => {
+            this.subLoading = false
+          })
+        }
+      })
+    },
+    initData() {
+      fetchList({
+        model: { type: 5 },
+        capacity: 1000,
+        page: 1,
+      }).then(res => {
+        this.cateList = res.records || []
+      })
+
+    },
+    changeSel(e) {
+      if (e && e.length == 1) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', '')
+      } else if (e && e.length == 2) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', e[1])
+      } else {
+        this.$set(this.param, 'catePId', '')
+        this.$set(this.param, 'cateId', '')
+      }
+      this.search()
+    },
+    uploadAvatarSuccess(file) {
+      this.$set(this.param, 'imgurl', file.imgurl)
+      this.$set(this.param, 'imgurlfull', file.imgurlfull)
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/admin/src/views/finance/payments.vue b/admin/src/views/finance/payments.vue
new file mode 100644
index 0000000..107c3a5
--- /dev/null
+++ b/admin/src/views/finance/payments.vue
@@ -0,0 +1,137 @@
+<template>
+  <div class="main_app">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <div class="mt20">
+      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+        v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
+    </div>
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="code" label="shou" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="鍏徃绠�浠�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="绾崇◣璇嗗埆鍙�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="modelNo" label="鍏徃鍦板潃" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="realName" label="鏀舵敮璐︽埛鏁伴噺" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="status" label="鐘舵��" min-width="100" show-overflow-tooltip>
+        <template v-slot="scope">
+          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1">
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+        <template slot-scope="{row}">
+          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
+            v-permissions="['business:category:update']">缂栬緫</el-button>
+          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+            v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import Edit from './components/companyEdit.vue'
+import { companyGetList, deleteById } from '@/api/business/company'
+export default {
+  components: {
+    Pagination,
+    QueryForm,
+    Edit
+  },
+  data() {
+    return {
+      loading: false,
+      showEdit: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '鏀舵敮鏉$洰'
+          },
+          {
+            filed: 'name',
+            type: 'select',
+            label: '鏀舵鍏徃'
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      companyGetList({
+        model: {
+          ...filters,
+          type: 2
+        },
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.stautsName = item.status == 0 ? '姝e父' : item.status == 1 ? '鎹熷潖' : '鎶ュ簾'
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    handleEdit(row) {
+      this.showEdit = true
+      this.$nextTick(() => {
+        this.$refs.EditRef.isShowModal = true
+        if (row && row.id) {
+          this.$refs.EditRef.getDetail(row.id)
+        }
+      })
+
+    },
+    handleDel(row) {
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      this.$dialog.deleteConfirm(message)
+        .then(() => {
+          this.isWorking.delete = true
+          deleteById(row.id)
+            .then(() => {
+              this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
+              this.getList()
+            })
+        })
+        .catch(() => { })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style></style>
diff --git a/admin/src/views/operation/category.vue b/admin/src/views/operation/category.vue
index e69de29..af61f66 100644
--- a/admin/src/views/operation/category.vue
+++ b/admin/src/views/operation/category.vue
@@ -0,0 +1,109 @@
+<template>
+  <TableLayout>
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
+        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+            v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li v-permissions="['business:category:exportExcel']"><el-button type="primary"
+            @click="exportExcel">瀵煎嚭</el-button></li>
+      </ul>
+      <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
+        :data="dataList" stripe @selection-change="handleSelectionChange">
+        <el-table-column prop="name" label="璁惧鍒嗙被" min-width="100px"></el-table-column>
+        <!-- <el-table-column prop="parentName" label="鎵�灞炲垎绫�" min-width="100px"></el-table-column> -->
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])" label="鎿嶄綔"
+          min-width="120" fixed="right">
+          <template slot-scope="{row}">
+            <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
+              v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+              v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="tableData.pagination">
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaCategoryWindow v-if="isShowEdit" @close="isShowEdit = false" ref="operaCategoryWindow" @success="getList" />
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaCategoryWindow from './components/OperaCategoryWindow'
+import { fetchList, deleteById } from '@/api/business/category.js'
+export default {
+  name: 'Category',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaCategoryWindow },
+  data() {
+    return {
+      // 鎼滅储
+      filters: {
+        parentId: ''
+      },
+      isShowEdit: false,
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0,
+      },
+      dataList: []
+    }
+  },
+  created() {
+    this.config({
+      module: '杞﹁締淇℃伅琛�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.getList()
+  },
+  methods: {
+    handleEdit(row) {
+      this.isShowEdit = true
+      let str = row && row.id ? '缂栬緫璁惧鍒嗙被' : '鏂板缓璁惧鍒嗙被'
+      this.$nextTick(() => {
+        this.$refs.operaCategoryWindow.open(str)
+        this.$refs.operaCategoryWindow.getList()
+        if (row && row.id) {
+          this.$refs.operaCategoryWindow.getDetail(row.id)
+        }
+      })
+    },
+    deleteById(row) {
+      this.$confirm(`鎮ㄧ‘璁よ鍒犻櫎璇ュ垎绫诲悧`, '娓╅Θ鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteById(row.id).then(res => {
+          this.getList()
+        })
+      })
+
+    },
+    getList() {
+      const { pagination, filters } = this
+      this.loading = true
+      fetchList({
+        model: { ...filters, type: 5 },
+        capacity: pagination.pageSize,
+        page: pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.dataList = res.records || []
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/operation/components/OperaCategoryWindow.vue b/admin/src/views/operation/components/OperaCategoryWindow.vue
new file mode 100644
index 0000000..a066862
--- /dev/null
+++ b/admin/src/views/operation/components/OperaCategoryWindow.vue
@@ -0,0 +1,74 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒嗙被鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ垎绫诲悕绉�" v-trim />
+      </el-form-item>
+      <el-form-item label="鎵�灞炲垎绫�" prop="parentId">
+        <el-select :disabled="form.id" v-model="form.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
+          <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="sortnum">
+        <el-input v-model="form.sortnum" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" v-trim />
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
+export default {
+  name: 'OperaCategoryWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data() {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        parentId: null,
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: 5
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ヤ簩绾у垎绫诲悕绉�', trigger: 'blur' }
+        ],
+        status: [
+          { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+        ]
+      },
+      dataList: []
+    }
+  },
+  created() {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    getList() {
+      fetchCateList({ type: 5 }).then(res => {
+        this.dataList = res || []
+        
+      })
+    },
+    close() {
+      this.visible = false
+      this.$emit('close')
+    },
+    getDetail(id) {
+      getInfoById(id).then(res => {
+        this.form = res
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/operation/components/deviceEdit.vue b/admin/src/views/operation/components/deviceEdit.vue
new file mode 100644
index 0000000..185fbdc
--- /dev/null
+++ b/admin/src/views/operation/components/deviceEdit.vue
@@ -0,0 +1,137 @@
+<template>
+  <GlobalWindow :title="param.id ? '缂栬緫璁惧' : '鏂板缓璁惧'" :confirmWorking="subLoading" :visible.sync="isShowModal" width="600px" @close="close"
+    @confirm="handleSub">
+    <el-form :model="param" ref="paramRef" :rules="rules">
+      <el-form-item label="璁惧缂栫爜" prop="code">
+        <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="璁惧鍚嶇О" prop="name">
+        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="璁惧鍨嬪彿" prop="">
+        <el-input v-model="param.modelNo" placeholder="璇疯緭鍏�" v-trim />
+      </el-form-item>
+      <el-form-item label="璁惧鍒嗙被" prop="">
+        <el-cascader v-model="param.areaIds" @change="changeSel" placeholder="璇烽�夋嫨宸℃鍖哄煙" clearable :options="cateList"
+          :props="{
+            label: 'name',
+            value: 'id',
+            children: 'childCategoryList',
+            checkStrictly: true
+          }"></el-cascader>
+      </el-form-item>
+      <el-form-item label="璁惧绠$悊鍛�" prop="">
+        <el-select v-model="param.realName" filterable clearable>
+          <el-option value="0" label="xxx"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="">
+        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
+
+      </el-form-item>
+      <el-form-item label="渚涘簲鍟�" prop="">
+        <el-input v-model="param.company" placeholder="璇疯緭鍏�" v-trim />
+
+      </el-form-item>
+      <el-form-item label="杩愮淮鍐呭" prop="">
+        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" />
+      </el-form-item>
+      <el-form-item label="璁惧鐘舵��" prop="">
+        <el-select v-model="param.status" filterable clearable>
+          <el-option value="0" label="姝e父"></el-option>
+          <el-option value="1" label="鎹熷潖"></el-option>
+          <el-option value="2" label="鎶ュ簾"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鐓х墖" prop="">
+        <UploadAvatarImage :file="{ 'imgurlfull': param.imgurlfull, 'imgurl': param.imgurl }"
+          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
+          @uploadBegin="isUploading = true" />
+      </el-form-item>
+
+
+
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
+import { fetchList } from '@/api/business/category'
+import { create, updateById } from '@/api/Inspection/device'
+import { Message } from 'element-ui'
+export default {
+  components: { GlobalWindow, UploadAvatarImage },
+  data() {
+    return {
+      isShowModal: false,
+      subLoading: false,
+      param: {},
+      cateList: [],
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        code: [{ required: true, message: '璇疯緭鍏�' }]
+      },
+
+    }
+  },
+  created() {
+    this.initData()
+  },
+  methods: {
+    handleSub() {
+      const { param, subLoading } = this
+      this.$refs['paramRef'].validate((valid) => {
+        if (valid) {
+          let fn = param.id ? updateById : create
+          this.subLoading = true
+          fn(param).then(res => {
+            if (res.code == 200) {
+              this.subLoading = false
+              this.$emit('success')
+              Message.success('淇濆瓨鎴愬姛')
+              this.close()
+            }
+          }).catch(() => {
+            this.subLoading = false
+          })
+        }
+      })
+    },
+    initData() {
+      fetchList({
+        model: { type: 5 },
+        capacity: 1000,
+        page: 1,
+      }).then(res => {
+        this.cateList = res.records || []
+      })
+
+    },
+    changeSel(e) {
+      if (e && e.length == 1) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', '')
+      } else if (e && e.length == 2) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', e[1])
+      } else {
+        this.$set(this.param, 'catePId', '')
+        this.$set(this.param, 'cateId', '')
+      }
+      this.search()
+    },
+    uploadAvatarSuccess(file) {
+      this.$set(this.param, 'imgurl', file.imgurl)
+      this.$set(this.param, 'imgurlfull', file.imgurlfull)
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/admin/src/views/operation/components/maintain.vue b/admin/src/views/operation/components/maintain.vue
new file mode 100644
index 0000000..5ec2b19
--- /dev/null
+++ b/admin/src/views/operation/components/maintain.vue
@@ -0,0 +1,222 @@
+<template>
+  <GlobalWindow :title="param.id ? '缂栬緫杩愮淮璁板綍' : '鏂板缓杩愮淮璁板綍'" :confirmWorking="subLoading" :visible.sync="isShowModal"
+    width="600px" @close="close" @confirm="handleSub">
+    <el-form :model="param" ref="paramRef" :rules="rules">
+      <el-form-item label="閫夋嫨璁惧" prop="code">
+        <el-select v-model="param.deviceId" filterable clearable>
+          <el-option v-for="item in deviceList" :value="item" :label="item"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="杩愮淮浜哄憳" prop="code">
+        <el-select v-model="param.realName" filterable clearable>
+          <el-option v-for="item in 10" :value="item" :label="item"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="璁惧鐘舵��" prop="">
+        <el-select v-model="param.status" filterable clearable>
+          <el-option value="0" label="姝e父"></el-option>
+          <el-option value="1" label="鎹熷潖"></el-option>
+          <el-option value="2" label="鎶ュ簾"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鐜板満鐓х墖" prop="">
+        <div class="file_list">
+          <el-upload class="avatar-uploader" :data="uploadData" :auto-upload="true" :action="uploadImgUrl"
+            :show-file-list="false" :on-success="uploadAvatarSuccess" :on-error="uploadError"
+            :before-upload="beforeUpload">
+            <div class="upload_wrap">
+              <i class="el-icon-plus avatar-uploader-icon"></i>
+              <div>鍥剧墖/瑙嗛</div>
+            </div>
+          </el-upload>
+          <div v-for="(item, i) in fileList" :key="i" class="item">
+            <i @click="handleDelImg(i)" class="el-icon-error close"></i>
+            <el-image :src="item.fileurlFull" :preview-src-list="[item.fileurlFull]" v-if="item.type == 0"
+              class="img"></el-image>
+            <video :src="item.fileurlFull" controls v-if="item.type == 1" class="img"></video>
+          </div>
+        </div>
+      </el-form-item>
+      <el-form-item label="杩愮淮澶囨敞" prop="">
+        <el-input type="textarea" :rows="4" v-model="param.remark" placeholder="璇疯緭鍏�" />
+      </el-form-item>
+      <el-form-item label="杩愮淮鏃堕棿" prop="">
+        <el-date-picker v-model="param.dealDate" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
+          type="datetime"></el-date-picker>
+      </el-form-item>
+
+
+
+
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadAvatarImage from '@/components/common/UploadAvatarImage'
+import { fetchList } from '@/api/Inspection/device'
+import { Message, Loading } from 'element-ui'
+export default {
+  components: { GlobalWindow, UploadAvatarImage },
+  data() {
+    return {
+      isShowModal: false,
+      subLoading: false,
+      param: {},
+      deviceList: [],
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        code: [{ required: true, message: '璇疯緭鍏�' }]
+      },
+
+      loadingInstance: null,
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
+      fileList: [],
+      uploadData: {
+        folder: 'HIDDEN_DANGER_FILE'
+      },
+
+    }
+  },
+  created() {
+    this.initData()
+  },
+  methods: {
+    handleSub() {
+      const { param, subLoading } = this
+      this.$refs['paramRef'].validate((valid) => {
+        if (valid) {
+          let fn = param.id ? updateById : create
+          this.subLoading = true
+          fn(param).then(res => {
+            if (res.code == 200) {
+              this.subLoading = false
+              this.$emit('success')
+              Message.success('淇濆瓨鎴愬姛')
+              this.close()
+            }
+          }).catch(() => {
+            this.subLoading = false
+          })
+        }
+      })
+    },
+    initData() {
+      fetchList({
+        model: {},
+        capacity: 1000,
+        page: 1,
+      }).then(res => {
+        this.deviceList = res || []
+      })
+
+    },
+    changeSel(e) {
+      if (e && e.length == 1) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', '')
+      } else if (e && e.length == 2) {
+        this.$set(this.param, 'catePId', e[0])
+        this.$set(this.param, 'cateId', e[1])
+      } else {
+        this.$set(this.param, 'catePId', '')
+        this.$set(this.param, 'cateId', '')
+      }
+      this.search()
+    },
+    beforeUpload(file) {
+      if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) {
+        this.$message.error('璇蜂笂浼犳纭殑瑙嗛/鍥剧墖鏍煎紡')
+        return false
+      }
+      this.loadingInstance = Loading.service({
+        lock: true,
+        text: 'Loading',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+    },
+    uploadError() {
+      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+        if (this.loadingInstance) {
+          this.loadingInstance.close()
+        }
+      })
+    },
+    uploadAvatarSuccess(file) {
+      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+        if (this.loadingInstance) {
+          this.loadingInstance.close()
+        }
+      })
+      console.log('file', file)
+      const item = file.data[0]
+      if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
+        this.fileList.push({
+          type: 1,
+          fileurl: item.imgaddr,
+          fileurlFull: item.url
+        })
+      } else {
+        this.fileList.push({
+          type: 0,
+          fileurl: item.imgaddr,
+          fileurlFull: item.url
+        })
+      }
+      console.log('file', this.fileList)
+      // this.$set(this.param, 'faceImg', file.imgurl)
+      // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
+    },
+    handleDelImg(i) {
+      this.fileList.splice(i, 1)
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.file_list {
+  display: flex;
+  flex-wrap: wrap;
+  .avatar-uploader{
+    width: 92px;
+    height: 92px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    border: 1px dashed #d9d9d9;
+  }
+  .item {
+    width: 92px;
+    max-height: 92px;
+    margin-left: 10px;
+    position: relative;
+    border: 1px dashed #d9d9d9;
+    border-radius: 4px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    .close {
+      font-size: 20px;
+      position: absolute;
+      right: -10px;
+      top: -10px;
+      z-index: 111;
+      color: red;
+      cursor: pointer;
+    }
+
+    .img {
+      width: 92px;
+      max-height: 92px;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/operation/device.vue b/admin/src/views/operation/device.vue
index e69de29..202eccd 100644
--- a/admin/src/views/operation/device.vue
+++ b/admin/src/views/operation/device.vue
@@ -0,0 +1,138 @@
+<template>
+  <div class="main_app">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <div class="mt20">
+      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+        v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
+    </div>
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="code" label="璁惧缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="璁惧鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="" label="璁惧鍒嗙被" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="modelNo" label="璁惧鍨嬪彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="realName" label="绠$悊鍛�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="company" label="璁惧渚涘簲鍟�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="status" label="璁惧鐘舵��" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+        <template slot-scope="{row}">
+          <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
+            v-permissions="['business:category:update']">缂栬緫</el-button>
+          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+            v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import Edit from './components/deviceEdit'
+import { fetchList, deleteById } from '@/api/Inspection/device'
+export default {
+  components: {
+    Pagination,
+    QueryForm,
+    Edit
+  },
+  data() {
+    return {
+      loading: false,
+      showEdit: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '璁惧鍚嶇О',
+            placeholder: '璇疯緭鍏ヨ澶囧悕绉�/缂栫爜'
+          },
+          {
+            filed: 'status',
+            type: 'select',
+            label: '璁惧鐘舵��',
+            options: [
+              { value: 0, label: '姝e父' },
+              { value: 1, label: '鎹熷潖' },
+              { value: 2, label: '鎶ュ簾' },
+            ]
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      fetchList({
+        model: {
+          ...filters,
+        },
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.stautsName = item.status == 0 ? '姝e父' : item.status == 1 ? '鎹熷潖' : '鎶ュ簾'
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    handleEdit(row) {
+      this.showEdit = true
+      this.$nextTick(() => {
+        this.$refs.EditRef.isShowModal = true
+        if (row && row.id) {
+          this.$refs.EditRef.getDetail(row.id)
+        }
+      })
+
+    },
+    handleDel(row) {
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      this.$dialog.deleteConfirm(message)
+        .then(() => {
+          this.isWorking.delete = true
+          deleteById(row.id)
+            .then(() => {
+              this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
+              this.getList()
+            })
+        })
+        .catch(() => { })
+    },
+    clear() {
+      this.filters = {}
+      this.pagination.pageSize = 10
+      this.pagination.page = 1
+      this.getList()
+    },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
+    }
+  }
+}
+</script>
+
+<style></style>
diff --git a/admin/src/views/operation/record.vue b/admin/src/views/operation/record.vue
index e69de29..53e95ad 100644
--- a/admin/src/views/operation/record.vue
+++ b/admin/src/views/operation/record.vue
@@ -0,0 +1,138 @@
+<template>
+  <div class="main_app">
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <div class="mt20">
+      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
+        v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
+      <el-button type="primary" @click="handleEx" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
+    </div>
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column prop="" label="杩愮淮浜�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="code" label="璁惧缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="璁惧鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="stautsName" label="璁惧鐘舵��" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="remark" label="杩愮淮澶囨敞" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+        <template slot-scope="{row}">
+          <el-button type="text" @click="handleDetail(row)" icon="el-icon-edit"
+            v-permissions="['business:category:update']">鏌ョ湅</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="mt20">
+      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    </div>
+    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
+import Edit from './components/maintain.vue'
+import { fetchList, deleteById } from '@/api/Inspection/device'
+export default {
+  components: {
+    Pagination,
+    QueryForm,
+    Edit
+  },
+  data() {
+    return {
+      loading: false,
+      showEdit: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0
+      },
+      filters: {},
+      list: [],
+      total: 0,
+      queryFormConfig: {
+        formItems: [
+          {
+            filed: 'name',
+            type: 'input',
+            label: '璁惧鍚嶇О',
+            placeholder: '璇疯緭鍏ヨ澶囧悕绉�/缂栫爜'
+          },
+          {
+            filed: 'selTime',
+            type: 'datetimerange',
+            label: '鍒涘缓鏃堕棿'
+          },
+        ],
+        online: true
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      fetchList({
+        model: {
+          ...filters,
+        },
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.stautsName = item.status == 0 ? '姝e父' : item.status == 1 ? '鎹熷潖' : '鎶ュ簾'
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    handleEx() {
+
+    },
+    handleEdit(row) {
+      this.showEdit = true
+      this.$nextTick(() => {
+        this.$refs.EditRef.isShowModal = true
+        if (row && row.id) {
+          this.$refs.EditRef.getDetail(row.id)
+        }
+      })
+
+    },
+    handleDetail() {
+
+    },
+    handleDel(row) {
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
+      this.$dialog.deleteConfirm(message)
+        .then(() => {
+          this.isWorking.delete = true
+          deleteById(row.id)
+            .then(() => {
+              this.$tip.apiSuccess('鍒犻櫎鎴愬姛')
+              this.getList()
+            })
+        })
+        .catch(() => { })
+    },
+    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/project/buildingList.vue b/admin/src/views/project/buildingList.vue
index d84c6b1..b3dd1ec 100644
--- a/admin/src/views/project/buildingList.vue
+++ b/admin/src/views/project/buildingList.vue
@@ -6,28 +6,26 @@
         <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ユゼ瀹囧悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <el-form-item label="鎵�灞為」鐩�" prop="projectId">
-       <el-select v-model="searchForm.projectId">
-        <el-option v-for="item in projectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
-       </el-select>
+        <el-select v-model="searchForm.projectId">
+          <el-option v-for="item in projectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywbuilding:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywbuilding:exportExcel']"
+          @click="exportExcel">瀵煎嚭</el-button>
         <el-button @click="reset">閲嶇疆</el-button>
       </section>
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywbuilding:create', 'business:ywbuilding:delete']">
-        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus" v-permissions="['business:ywbuilding:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywbuilding:delete']">鍒犻櫎</el-button></li>
+        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
+            v-permissions="['business:ywbuilding:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
+            v-permissions="['business:ywbuilding:delete']">鍒犻櫎</el-button></li>
       </ul>
-      <el-table
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
+      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55"></el-table-column>
         <el-table-column prop="name" label="妤煎畤鍚嶇О" min-width="100px">
           <template v-slot="scope">
@@ -39,30 +37,25 @@
         <el-table-column prop="area" label="寤虹瓚闈㈢Н(m虏)" min-width="80px"></el-table-column>
         <el-table-column prop="cqArea" label="绠$悊闈㈢Н(m虏)" min-width="80px"></el-table-column>
         <el-table-column prop="" label="鎴块棿鎬绘暟(闂�)" min-width="80px"></el-table-column>
-        <el-table-column prop="" label="鍙嫑鍟嗘埧婧愭暟閲�(闂�)" min-width="100px"></el-table-column>     
-        <el-table-column
-          v-if="containPermissions(['business:ywbuilding:update', 'business:ywbuilding:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
+        <el-table-column prop="" label="鍙嫑鍟嗘埧婧愭暟閲�(闂�)" min-width="100px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:ywbuilding:update', 'business:ywbuilding:delete'])"
+          label="鎿嶄綔" min-width="120" fixed="right">
           <template slot-scope="{row}">
-            <el-button type="text" @click="editClick(row)" icon="el-icon-edit" v-permissions="['business:ywbuilding:update']">缂栬緫</el-button>
-            <el-button type="text" @click="editFloor(row)" v-permissions="['business:ywbuilding:update']">妤煎眰绠$悊</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywbuilding:delete']">鍒犻櫎</el-button>
+            <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
+              v-permissions="['business:ywbuilding:update']">缂栬緫</el-button>
+            <el-button type="text" @click="editFloor(row)"
+              v-permissions="['business:ywbuilding:update']">妤煎眰绠$悊</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+              v-permissions="['business:ywbuilding:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaYwBuildingWindow ref="operaYwBuildingWindow" @success="handlePageChange"/>
-    <FloorLevel ref="FloorLevelRef" @success="handlePageChange"/>
+    <OperaYwBuildingWindow ref="operaYwBuildingWindow" @success="handlePageChange" />
+    <FloorLevel ref="FloorLevelRef" @success="handlePageChange" />
     <BuildingDetail ref="BuildingDetailRef" />
   </TableLayout>
 </template>
@@ -78,18 +71,18 @@
 export default {
   name: 'YwBuilding',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaYwBuildingWindow ,BuildingDetail, FloorLevel},
-  data () {
+  components: { TableLayout, Pagination, OperaYwBuildingWindow, BuildingDetail, FloorLevel },
+  data() {
     return {
       // 鎼滅储
-      searchForm: { 
+      searchForm: {
         name: '',
         projectId: ''
       },
       projectList: []
     }
   },
-  created () {
+  created() {
     this.config({
       module: '杩愮淮妤煎畤淇℃伅琛�',
       api: '/project/ywBuilding',
@@ -106,9 +99,9 @@
       })
     },
     editClick(row) {
-      if(row && row.id){
+      if (row && row.id) {
         this.$refs.operaYwBuildingWindow.open('缂栬緫妤煎畤')
-      }else{
+      } else {
         this.$refs.operaYwBuildingWindow.open('鏂板缓妤煎畤')
       }
       this.$refs.operaYwBuildingWindow.getProject()
diff --git a/admin/src/views/project/components/OperaYwBuildingWindow.vue b/admin/src/views/project/components/OperaYwBuildingWindow.vue
index 2b92f59..d095dc0 100644
--- a/admin/src/views/project/components/OperaYwBuildingWindow.vue
+++ b/admin/src/views/project/components/OperaYwBuildingWindow.vue
@@ -2,7 +2,7 @@
   <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
       <el-form-item label="鎵�灞為」鐩�" prop="projectId" clearable placeholder="璇烽�夋嫨椤圭洰">
-        <el-select v-model="form.projectId">
+        <el-select v-model="form.projectId" filterable clearable>
           <el-option v-for="item in projectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
         </el-select>
       </el-form-item>
diff --git a/admin/src/views/workorder/components/OperaCategoryWindow.vue b/admin/src/views/workorder/components/OperaCategoryWindow.vue
index b3588eb..6b9bb0f 100644
--- a/admin/src/views/workorder/components/OperaCategoryWindow.vue
+++ b/admin/src/views/workorder/components/OperaCategoryWindow.vue
@@ -1,22 +1,16 @@
 <template>
   <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒嗙被鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ垎绫诲悕绉�" v-trim />
+      </el-form-item>
       <el-form-item label="鎵�灞炲垎绫�" prop="parentId">
         <el-select :disabled="form.id" v-model="form.parentId" placeholder="涓嶅~涓哄垯涓�绾у垎绫�">
           <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="鍒嗙被鍚嶇О" prop="name">
-        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ垎绫诲悕绉�" v-trim />
-      </el-form-item>
-      <!-- <el-form-item label="鐘舵��" prop="status">
-        <el-select v-model="form.status" 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="remark">
-        <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim />
+      <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="sortnum">
+        <el-input v-model="form.sortnum" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" v-trim />
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -38,7 +32,8 @@
         name: '',
         remark: '',
         status: '',
-        type: 1
+        sortnum: '',
+        type: 3
       },
       // 楠岃瘉瑙勫垯
       rules: {
@@ -60,7 +55,7 @@
   },
   methods: {
     getList() {
-      fetchCateList({}).then(res => {
+      fetchCateList({ type: 3 }).then(res => {
         this.dataList = res || []
         
       })
diff --git a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
index 1bdcfef..f292342 100644
--- a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
+++ b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -1,107 +1,60 @@
 <template>
-  <GlobalWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
-  >
+  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      <el-form-item label="浣嶇疆绫诲瀷" prop="areaType">
+        <el-select v-model="form.areaType">
+          <el-option label="瀹ゅ唴缁翠慨" value="0"></el-option>
+          <el-option label="鍏叡缁翠慨" value="1"></el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      <el-form-item label="鎶ヤ慨鍖哄煙">
+
       </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鏍囬" prop="title">
-        <el-input v-model="form.title" placeholder="璇疯緭鍏ユ爣棰�" v-trim/>
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="remark">
-        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
-        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
-        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎯呭喌璇存槑" prop="content">
-        <el-input v-model="form.content" placeholder="璇疯緭鍏ユ儏鍐佃鏄�" v-trim/>
+      <el-form-item label="鍒嗙被" prop="cateId">
+        <el-select v-model="form.cateId">
+          <el-option label="" value=""></el-option>
+        </el-select>
       </el-form-item>
       <el-form-item label="涓婇棬鏃堕棿" prop="getDate">
-        <el-date-picker v-model="form.getDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ヤ笂闂ㄦ椂闂�"></el-date-picker>
+        <el-date-picker type="datetime" v-model="form.getDate" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm:ss"
+          placeholder="璇烽�夋嫨涓婇棬鏃堕棿"></el-date-picker>
       </el-form-item>
-      <el-form-item label="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)" prop="projectId">
-        <el-input v-model="form.projectId" placeholder="璇疯緭鍏ユ墍灞為」鐩紪鐮侊紙鍏宠仈yw_project)" v-trim/>
+      <el-form-item label="鐜板満鍥剧墖">
+        <div class="file_list">
+          <el-upload class="avatar-uploader" :data="uploadData" :auto-upload="true" :action="uploadImgUrl"
+            :show-file-list="false" :on-success="uploadAvatarSuccess" :on-error="uploadError"
+            :before-upload="beforeUpload">
+            <div class="upload_wrap">
+              <i class="el-icon-plus avatar-uploader-icon"></i>
+              <div>鍥剧墖/瑙嗛</div>
+            </div>
+          </el-upload>
+          <div v-for="(item, i) in fileList" :key="i" class="item">
+            <i @click="handleDelImg(i)" class="el-icon-error close"></i>
+            <el-image :src="item.fileurlFull" :preview-src-list="[item.fileurlFull]" v-if="item.type == 0"
+              class="img"></el-image>
+            <video :src="item.fileurlFull" controls v-if="item.type == 1" class="img"></video>
+          </div>
+        </div>
       </el-form-item>
-      <el-form-item label="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_building)" prop="buildingId">
-        <el-input v-model="form.buildingId" placeholder="璇疯緭鍏ユ墍灞為」鐩紪鐮侊紙鍏宠仈yw_building)" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)" prop="roomId">
-        <el-input v-model="form.roomId" placeholder="璇疯緭鍏ユ墍灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎻愭姤浜虹紪鐮�" prop="userId">
-        <el-input v-model="form.userId" placeholder="璇疯緭鍏ユ彁鎶ヤ汉缂栫爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
-        <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎻愭姤鏃堕棿" prop="submitDate">
-        <el-date-picker v-model="form.submitDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ彁鎶ユ椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="宸ュ崟鍒嗙被缂栫爜(鍏宠仈category锛�" prop="cateId">
-        <el-input v-model="form.cateId" placeholder="璇疯緭鍏ュ伐鍗曞垎绫荤紪鐮�(鍏宠仈category锛�" v-trim/>
-      </el-form-item>
-      <el-form-item label="淇濅慨鍖哄煙绫诲瀷 0瀹ゅ唴缁翠慨 1鍏叡鍖哄煙" prop="areaType">
-        <el-input v-model="form.areaType" placeholder="璇疯緭鍏ヤ繚淇尯鍩熺被鍨� 0瀹ゅ唴缁翠慨 1鍏叡鍖哄煙" v-trim/>
-      </el-form-item>
-      <el-form-item label="宸ュ崟缂栧彿" prop="code">
-        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ伐鍗曠紪鍙�" v-trim/>
-      </el-form-item>
-      <el-form-item label="澶勭悊鐘舵�� 0寰呭鐞� 1宸插垎娲� 2宸插鐞�" prop="dealStatus">
-        <el-input v-model="form.dealStatus" placeholder="璇疯緭鍏ュ鐞嗙姸鎬� 0寰呭鐞� 1宸插垎娲� 2宸插鐞�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍒嗘淳浜虹紪鐮�(鍏宠仈system_user)" prop="dispatchUserId">
-        <el-input v-model="form.dispatchUserId" placeholder="璇疯緭鍏ュ垎娲句汉缂栫爜(鍏宠仈system_user)" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍒嗘淳鏃堕棿" prop="dispatchDate">
-        <el-date-picker v-model="form.dispatchDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垎娲炬椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鍒嗘淳澶勭悊璇存槑" prop="dispatchInfo">
-        <el-input v-model="form.dispatchInfo" placeholder="璇疯緭鍏ュ垎娲惧鐞嗚鏄�" v-trim/>
-      </el-form-item>
-      <el-form-item label="澶勭悊浜虹紪鐮�(鍏宠仈system_user)" prop="dealUserId">
-        <el-input v-model="form.dealUserId" placeholder="璇疯緭鍏ュ鐞嗕汉缂栫爜(鍏宠仈system_user)" v-trim/>
-      </el-form-item>
-      <el-form-item label="澶勭悊鏃堕棿" prop="dealDate">
-        <el-date-picker v-model="form.dealDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ鐞嗘椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="澶勭悊澶囨敞" prop="dealInfo">
-        <el-input v-model="form.dealInfo" placeholder="璇疯緭鍏ュ鐞嗗娉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="澶勭悊鏂瑰紡 0鎸囨淳鍚庡鐞� 1鐩存帴鍥炲" prop="dealType">
-        <el-input v-model="form.dealType" placeholder="璇疯緭鍏ュ鐞嗘柟寮� 0鎸囨淳鍚庡鐞� 1鐩存帴鍥炲" v-trim/>
+      <el-form-item label="鎯呭喌璇存槑" prop="content">
+        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="璇疯緭鍏ユ儏鍐佃鏄�" v-trim />
       </el-form-item>
     </el-form>
+    <!--  -->
+
   </GlobalWindow>
 </template>
 
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import { Loading } from 'element-ui'
 export default {
   name: 'OperaYwWorkorderWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
-  data () {
+  data() {
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
@@ -124,7 +77,7 @@
         phone: '',
         submitDate: '',
         cateId: '',
-        areaType: '',
+        areaType: '0',
         code: '',
         dealStatus: '',
         dispatchUserId: '',
@@ -135,16 +88,115 @@
         dealInfo: '',
         dealType: ''
       },
+      loadingInstance: null,
       // 楠岃瘉瑙勫垯
       rules: {
-      }
+      },
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
+      fileList: [],
+      uploadData: {
+        folder: 'HIDDEN_DANGER_FILE'
+      },
     }
   },
-  created () {
+  created() {
     this.config({
       api: '/workorder/ywWorkorder',
       'field.id': 'id'
     })
+  },
+  methods: {
+    beforeUpload (file) {
+      if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg','image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) {
+        this.$message.error('璇蜂笂浼犳纭殑瑙嗛/鍥剧墖鏍煎紡')
+        return false
+      }
+      this.loadingInstance = Loading.service({
+        lock: true,
+        text: 'Loading',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+    },
+    uploadError() {
+      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+        if(this.loadingInstance){
+          this.loadingInstance.close()
+        }
+      })
+    },
+    uploadAvatarSuccess (file) {
+      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+        if(this.loadingInstance){
+          this.loadingInstance.close()
+        }
+      })
+      console.log('file', file)
+      const item = file.data[0]
+      if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
+        this.fileList.push({
+          type: 1,
+          fileurl: item.imgaddr,
+          fileurlFull: item.url
+        })
+      } else {
+        this.fileList.push({
+          type: 0,
+          fileurl: item.imgaddr,
+          fileurlFull: item.url
+        })
+      }
+      console.log('file', this.fileList)
+      // this.$set(this.param, 'faceImg', file.imgurl)
+      // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
+    },
+    handleDelImg (i) {
+      this.fileList.splice(i, 1)
+    },
+    close(){
+      this.isShowModal = false
+      this.$emit('close')
+    }
   }
 }
 </script>
+<style lang="scss" scoped>
+.file_list {
+  display: flex;
+  flex-wrap: wrap;
+  .avatar-uploader{
+    width: 92px;
+    height: 92px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    border: 1px dashed #d9d9d9;
+  }
+  .item {
+    width: 92px;
+    max-height: 92px;
+    margin-left: 10px;
+    position: relative;
+    border: 1px dashed #d9d9d9;
+    border-radius: 4px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    .close {
+      font-size: 20px;
+      position: absolute;
+      right: -10px;
+      top: -10px;
+      z-index: 111;
+      color: red;
+      cursor: pointer;
+    }
+
+    .img {
+      width: 92px;
+      max-height: 92px;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/workorder/workorderCate.vue b/admin/src/views/workorder/workorderCate.vue
index a86289e..394d168 100644
--- a/admin/src/views/workorder/workorderCate.vue
+++ b/admin/src/views/workorder/workorderCate.vue
@@ -9,15 +9,9 @@
       </ul>
       <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
         :data="dataList" stripe @selection-change="handleSelectionChange">
-        <el-table-column prop="name" label="鍒嗙被鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
-        <!-- <el-table-column prop="status" label="鐘舵��" min-width="100px">
-                  <template slot-scope="{row}">
-                      <span v-if="row.status === 0">鍚敤</span>
-                      <span v-if="row.status === 1">绂佺敤</span>
-                  </template>
-</el-table-column> -->
-        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="宸ュ崟鍒嗙被" min-width="100px"></el-table-column>
+        <!-- <el-table-column prop="parentName" label="鎵�灞炲垎绫�" min-width="100px"></el-table-column> -->
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
         <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])" label="鎿嶄綔"
           min-width="120" fixed="right">
           <template slot-scope="{row}">
@@ -99,7 +93,7 @@
       const { pagination, filters } = this
       this.loading = true
       fetchList({
-        model: { ...filters },
+        model: { ...filters, type: 3 },
         capacity: pagination.pageSize,
         page: pagination.page,
       }).then(res => {
diff --git a/admin/src/views/workorder/workorderList.vue b/admin/src/views/workorder/workorderList.vue
index 7af17bb..1173e81 100644
--- a/admin/src/views/workorder/workorderList.vue
+++ b/admin/src/views/workorder/workorderList.vue
@@ -2,74 +2,65 @@
   <TableLayout :permissions="['business:ywworkorder:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)" prop="projectId">
-        <el-input v-model="searchForm.projectId" placeholder="璇疯緭鍏ユ墍灞為」鐩紪鐮侊紙鍏宠仈yw_project)" @keypress.enter.native="search"></el-input>
+      <el-form-item prop="areaType">
+        <el-select v-model="searchForm.areaType">
+          <el-option label="瀹ゅ唴缁翠慨" value="0"></el-option>
+          <el-option label="鍏叡缁翠慨" value="1"></el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_building)" prop="buildingId">
-        <el-input v-model="searchForm.buildingId" placeholder="璇疯緭鍏ユ墍灞為」鐩紪鐮侊紙鍏宠仈yw_building)" @keypress.enter.native="search"></el-input>
+      <el-form-item label="璇烽�夋嫨鎶ヤ慨鍖哄煙" prop="buildingId">
+        <el-input v-model="searchForm.buildingId" placeholder="璇疯緭鍏ユ墍灞為」鐩紪鐮侊紙鍏宠仈yw_building)"
+          @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)" prop="roomId">
-        <el-input v-model="searchForm.roomId" placeholder="璇疯緭鍏ユ墍灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="宸ュ崟鍒嗙被缂栫爜(鍏宠仈category锛�" prop="cateId">
-        <el-input v-model="searchForm.cateId" placeholder="璇疯緭鍏ュ伐鍗曞垎绫荤紪鐮�(鍏宠仈category锛�" @keypress.enter.native="search"></el-input>
+      <el-form-item prop="cateId">
+        <el-input v-model="searchForm.cateId" placeholder="鎶ヤ慨鐗╁搧绫诲埆" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywworkorder:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywworkorder:exportExcel']"
+          @click="exportExcel">瀵煎嚭</el-button>
         <el-button @click="reset">閲嶇疆</el-button>
       </section>
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywworkorder:create', 'business:ywworkorder:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('鏂板缓宸ュ崟')" icon="el-icon-plus" v-permissions="['business:ywworkorder:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:ywworkorder:delete']">鍒犻櫎</el-button></li>
+        <li><el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('鏂板缓宸ュ崟')" icon="el-icon-plus"
+            v-permissions="['business:ywworkorder:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
+            v-permissions="['business:ywworkorder:delete']">鍒犻櫎</el-button></li>
       </ul>
-      <el-table
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column type="selection" width="55"></el-table-column>
-      
-        
-        
-        <el-table-column prop="projectId" label="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_project)" min-width="100px"></el-table-column>
-        <el-table-column prop="buildingId" label="鎵�灞為」鐩紪鐮侊紙鍏宠仈yw_building)" min-width="100px"></el-table-column>
-        <el-table-column prop="roomId" label="鎵�灞炴埧闂寸紪鐮侊紙鍏宠仈yw_room)" min-width="100px"></el-table-column>
-        <el-table-column prop="userId" label="鎻愭姤浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" min-width="100px"></el-table-column>
-        <el-table-column prop="submitDate" label="鎻愭姤鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="cateId" label="宸ュ崟鍒嗙被缂栫爜(鍏宠仈category锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="areaType" label="淇濅慨鍖哄煙绫诲瀷 0瀹ゅ唴缁翠慨 1鍏叡鍖哄煙" min-width="100px"></el-table-column>
-      
-        <el-table-column prop="dealStatus" label="澶勭悊鐘舵�� 0寰呭鐞� 1宸插垎娲� 2宸插鐞�" min-width="100px"></el-table-column>
-
-        <el-table-column prop="dealUserId" label="澶勭悊浜虹紪鐮�(鍏宠仈system_user)" min-width="100px"></el-table-column>
-        <el-table-column prop="dealType" label="澶勭悊鏂瑰紡 0鎸囨淳鍚庡鐞� 1鐩存帴鍥炲" min-width="100px"></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:ywworkorder:update', 'business:ywworkorder:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
+      <el-table v-loading="isWorking.search" :data="tableData.list" stripe>
+        <el-table-column prop="areaType" label="浣嶇疆绫诲瀷" min-width="80px">
+          <template v-slot="scope">
+            <span v-if="scope.row.areaType == 0">瀹ゅ唴瑁呬慨</span>
+            <span v-if="scope.row.areaType == 1">鍏叡鍖哄煙</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="" label="鎶ヤ慨鍖哄煙" min-width="100px"></el-table-column>
+        <el-table-column prop="cateName" label="鎶ヤ慨鐗╁搧绫诲瀷" min-width="100px"></el-table-column>
+        <el-table-column prop="userName" label="涓婃姤浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="submitDate" label="涓婃姤鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="dealUserName" label="澶勭悊浜�" min-width="100px"></el-table-column>
+        <el-table-column label="澶勭悊缁撴灉" min-width="100px">
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaYwWorkorderWindow.open('缂栬緫宸ュ崟', row)" icon="el-icon-edit" v-permissions="['business:ywworkorder:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:ywworkorder:delete']">鍒犻櫎</el-button>
+            <span v-if="row.dealStatus == 0">寰呮寚娲�</span>
+            <span v-if="row.dealStatus == 1">宸叉寚娲�</span>
+            <span v-if="row.dealStatus == 2">宸插鐞�</span>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="containPermissions(['business:ywworkorder:update'])"
+          label="鎿嶄綔" min-width="80" fixed="right">
+          <template slot-scope="{row}">
+            <span class="primaryColor cu">鏌ョ湅璇︽儏</span>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaYwWorkorderWindow ref="operaYwWorkorderWindow" @success="handlePageChange"/>
+    <OperaYwWorkorderWindow ref="operaYwWorkorderWindow" @success="handlePageChange" />
   </TableLayout>
 </template>
 
@@ -82,11 +73,11 @@
   name: 'YwWorkorder',
   extends: BaseTable,
   components: { TableLayout, Pagination, OperaYwWorkorderWindow },
-  data () {
+  data() {
     return {
       // 鎼滅储
       searchForm: {
-        id: '',
+        areaType: '',
         creator: '',
         createDate: '',
         editor: '',
@@ -105,7 +96,6 @@
         phone: '',
         submitDate: '',
         cateId: '',
-        areaType: '',
         code: '',
         dealStatus: '',
         dispatchUserId: '',
@@ -118,7 +108,7 @@
       }
     }
   },
-  created () {
+  created() {
     this.config({
       module: '杩愮淮宸ュ崟淇℃伅琛�',
       api: '/workorder/ywWorkorder',

--
Gitblit v1.9.3