From 3a1a4f95f3d07f669139ab1158d1e304be6d6a26 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期六, 23 十一月 2024 17:32:50 +0800
Subject: [PATCH] ll

---
 admin/src/views/contract/components/contractEdit.vue            |   71 +
 admin/src/views/finance/components/paymentsEdit.vue             |  204 +++++
 admin/src/api/project/ywRoom.js                                 |    6 
 admin/src/views/finance/payments.vue                            |   38 
 admin/src/views/client/category.vue                             |  107 +++
 admin/src/views/client/staffList.vue                            |   77 +-
 admin/src/views/finance/components/config.js                    |    3 
 admin/src/views/client/components/OperaYwCustomerWindow.vue     |  227 ++++-
 admin/src/components/common/CommonHeader.vue                    |    4 
 admin/src/views/finance/components/bullEdit.vue                 |  370 ++++++++++
 admin/src/views/finance/bull.vue                                |   23 
 admin/src/views/project/components/floorLevel.vue               |   63 +
 admin/src/views/login.vue                                       |    4 
 admin/src/views/client/components/OperaCategoryWindow.vue       |   63 +
 admin/src/views/client/clientList.vue                           |   20 
 admin/src/views/client/components/config.js                     |   10 
 /dev/null                                                       |  137 ---
 admin/src/views/index.vue                                       |   10 
 admin/src/api/client/staff.js                                   |   43 +
 admin/src/api/client/ywCustomer.js                              |    3 
 admin/src/views/workorder/components/config.js                  |    9 
 admin/src/views/project/components/OperaYwBuildingWindow.vue    |    2 
 admin/src/views/finance/components/bullDetail.vue               |  231 ++++++
 admin/src/views/project/buildingList.vue                        |    7 
 admin/src/views/client/components/staffEdit.vue                 |  177 +++++
 admin/src/views/workorder/components/OperaYwWorkorderWindow.vue |  149 +++
 26 files changed, 1,732 insertions(+), 326 deletions(-)

diff --git a/admin/src/api/client/staff.js b/admin/src/api/client/staff.js
new file mode 100644
index 0000000..80f0d53
--- /dev/null
+++ b/admin/src/api/client/staff.js
@@ -0,0 +1,43 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/member/ywFindPage', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/member/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/member/ywCreate', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/member/ywUpdateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/member/delete/${id}`)
+}
+
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/member/${id}`)
+}
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/member/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/client/ywCustomer.js b/admin/src/api/client/ywCustomer.js
index 324a53e..f1eaef9 100644
--- a/admin/src/api/client/ywCustomer.js
+++ b/admin/src/api/client/ywCustomer.js
@@ -30,6 +30,9 @@
   return request.get(`/visitsAdmin/cloudService/business/ywCustomer/delete/${id}`)
 }
 
+export function detailById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywCustomer/${id}`)
+}
 // 鎵归噺鍒犻櫎
 export function deleteByIdInBatch (ids) {
   return request.get('/visitsAdmin/cloudService/business/ywCustomer/delete/batch', {
diff --git a/admin/src/api/project/ywRoom.js b/admin/src/api/project/ywRoom.js
index 8a7dd61..1c5ac5d 100644
--- a/admin/src/api/project/ywRoom.js
+++ b/admin/src/api/project/ywRoom.js
@@ -6,7 +6,11 @@
     trim: true
   })
 }
-
+export function getRoomList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywRoom/list', data, {
+    trim: true
+  })
+}
 // 瀵煎嚭Excel
 export function exportExcel (data) {
   return request.post('/visitsAdmin/cloudService/business/ywRoom/exportExcel', data, {
diff --git a/admin/src/components/common/CommonHeader.vue b/admin/src/components/common/CommonHeader.vue
index b4ee24b..d1eff86 100644
--- a/admin/src/components/common/CommonHeader.vue
+++ b/admin/src/components/common/CommonHeader.vue
@@ -3,7 +3,7 @@
     <div class="header">
       <div class="logo">
         <div class="title">{{ title }}</div>
-        <div class="list">
+        <!-- <div class="list">
           <div class="item active">
             <div>鏈嶅姟涓績</div>
             <div class="linellae"></div>
@@ -12,7 +12,7 @@
           <div class="item" @click="getHeaderNav('1')">娑堟帶涓績</div>
           <div class="item" @click="getHeaderNav('2')">鑳界涓績</div>
           <div class="item" @click="getHeaderNav('3')">椹鹃┒鑸�</div>
-        </div>
+        </div> -->
         <!-- <div class="title-en">Diagnosis of Intelligent Manufacturing Integrated Service Platfrom</div> -->
       </div>
       <div class="user">
diff --git a/admin/src/views/client/category.vue b/admin/src/views/client/category.vue
new file mode 100644
index 0000000..5999ff0
--- /dev/null
+++ b/admin/src/views/client/category.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>
+        <li v-permissions="['business:category:exportExcel']"><el-button type="primary"
+            @click="exportExcel">瀵煎嚭</el-button></li>
+      </ul>
+      <el-table 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="sortnum" label="鎺掑簭鐮�" min-width="80px"></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)
+        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: 6 },
+        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/client/clientList.vue b/admin/src/views/client/clientList.vue
index c54c0d1..d6c97b7 100644
--- a/admin/src/views/client/clientList.vue
+++ b/admin/src/views/client/clientList.vue
@@ -22,12 +22,26 @@
       </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="type" label="绫诲瀷 0涓汉 1浼佷笟" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="瀹㈡埛绫诲瀷" min-width="80px">
+          <template slot-scope="{row}">
+            <span>{{ row.type == '0' ? '涓汉' : '浼佷笟' }}</span>
+          </template>
+        </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="idcardNo" label="韬唤璇佸彿锛堝姞瀵嗭級" min-width="100px"></el-table-column>
+        <el-table-column prop="memberPhone" label="鑱旂郴鐢佃瘽" min-width="100px"></el-table-column>
+        <!-- <el-table-column prop="idcardNo" label="韬唤璇佸彿" min-width="100px"></el-table-column> -->
         <el-table-column prop="creditCard" label="缁熶竴淇$敤浠g爜" min-width="100px"></el-table-column>
+        <el-table-column prop="validity" label="钀ヤ笟鏈熼檺" min-width="100px">
+          <template slot-scope="{row}">
+            <span>{{ row.validity == '2099-12-31' ? '闀挎湡' : row.validity }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="榛樿鍙戠エ绫诲瀷" min-width="100px">
+          <template slot-scope="{row}">
+            <span>{{ row.fpType == '0' ? '澧炲�肩◣鏅�氬彂绁�' : row.fpType == '1' ? '澧炲�肩◣涓撶敤鍙戠エ' : '-' }}</span>
+          </template>
+        </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/client/components/OperaCategoryWindow.vue b/admin/src/views/client/components/OperaCategoryWindow.vue
new file mode 100644
index 0000000..a47dc6d
--- /dev/null
+++ b/admin/src/views/client/components/OperaCategoryWindow.vue
@@ -0,0 +1,63 @@
+<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="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: 6
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ヤ簩绾у垎绫诲悕绉�', trigger: 'blur' }
+        ],
+        status: [
+          { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+        ]
+      },
+      dataList: []
+    }
+  },
+  created() {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    close() {
+      this.visible = false
+      this.$emit('close')
+    },
+    getDetail(id) {
+      getInfoById(id).then(res => {
+        this.form = res
+      })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/client/components/OperaYwCustomerWindow.vue b/admin/src/views/client/components/OperaYwCustomerWindow.vue
index 9776dda..a7b8bf9 100644
--- a/admin/src/views/client/components/OperaYwCustomerWindow.vue
+++ b/admin/src/views/client/components/OperaYwCustomerWindow.vue
@@ -1,65 +1,80 @@
 <template>
-  <GlobalWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
-  >
+  <GlobalWindow :title="title" width="900px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="绫诲瀷 0涓汉 1浼佷笟" prop="type">
-        <el-input v-model="form.type" 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="phone">
-        <el-input v-model="form.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim/>
-      </el-form-item>
-      <el-form-item label="韬唤璇佸彿锛堝姞瀵嗭級" prop="idcardNo">
-        <el-input v-model="form.idcardNo" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙凤紙鍔犲瘑锛�" v-trim/>
-      </el-form-item>
-      <el-form-item label="璇佷欢鏄剧ず淇℃伅" prop="idcardDecode">
-        <el-input v-model="form.idcardDecode" placeholder="璇疯緭鍏ヨ瘉浠舵樉绀轰俊鎭�" 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姝e父 1绂佺敤" prop="status">
-        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 1绂佺敤" v-trim/>
-      </el-form-item>
-      <el-form-item label="韬唤 0鑰佹澘 1瓒呯骇绠$悊鍛�" prop="highCheckor">
-        <el-input v-model="form.highCheckor" placeholder="璇疯緭鍏ヨ韩浠� 0鑰佹澘 1瓒呯骇绠$悊鍛�" v-trim/>
-      </el-form-item>
-      <el-form-item label="璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収" prop="idcardType">
-        <el-input v-model="form.idcardType" placeholder="璇疯緭鍏ヨ瘉浠剁被鍨� 0韬唤璇� 1娓境璇佷欢 2鎶ょ収" v-trim/>
-      </el-form-item>
-      <el-form-item label="寮�鎴烽摱琛�" prop="accountBank">
-        <el-input v-model="form.accountBank" placeholder="璇疯緭鍏ュ紑鎴烽摱琛�" v-trim/>
-      </el-form-item>
-      <el-form-item label="璐﹀彿" prop="accountNo">
-        <el-input v-model="form.accountNo" placeholder="璇疯緭鍏ヨ处鍙�" v-trim/>
-      </el-form-item>
-      <el-form-item label="璐︽埛鐢佃瘽" prop="accountPhone">
-        <el-input v-model="form.accountPhone" placeholder="璇疯緭鍏ヨ处鎴风數璇�" v-trim/>
-      </el-form-item>
-      <el-form-item label="缁熶竴淇$敤浠g爜" prop="creditCard">
-        <el-input v-model="form.creditCard" placeholder="璇疯緭鍏ョ粺涓�淇$敤浠g爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="榛樿鍙戠エ绫诲瀷 0澧炲�肩◣鏅�氬彂绁� 1澧炲�肩◣涓撶敤鍙戠エ" prop="fpType">
-        <el-input v-model="form.fpType" placeholder="璇疯緭鍏ラ粯璁ゅ彂绁ㄧ被鍨� 0澧炲�肩◣鏅�氬彂绁� 1澧炲�肩◣涓撶敤鍙戠エ" v-trim/>
-      </el-form-item>
-      <el-form-item label="璐﹀彿娉ㄥ唽鍦板潃" prop="accountAddr">
-        <el-input v-model="form.accountAddr" placeholder="璇疯緭鍏ヨ处鍙锋敞鍐屽湴鍧�" v-trim/>
-      </el-form-item>
-      <el-form-item label="韬唤绫诲瀷0鑰佹澘瓒呯骇绠$悊鍛�;1=浜轰簨绠$悊鍛�;2=鍛樺伐" prop="identityType">
-        <el-input v-model="form.identityType" placeholder="璇疯緭鍏ヨ韩浠界被鍨�0鑰佹澘瓒呯骇绠$悊鍛�;1=浜轰簨绠$悊鍛�;2=鍛樺伐" v-trim/>
-      </el-form-item>
-      <el-form-item label="閭" prop="email">
-        <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鑱旂郴浜虹紪鐮侊紙鍏宠仈member锛�" prop="memberId">
-        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ヨ仈绯讳汉缂栫爜锛堝叧鑱攎ember锛�" v-trim/>
-      </el-form-item>
+      <div class="list">
+        <div class="title">鍩虹淇℃伅</div>
+        <el-form-item label="瀹㈡埛" prop="name">
+          <div class="df">
+            <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鎴�" v-trim />
+            <el-checkbox v-model="form.type" class="ml10" true-label="0" false-label="1">涓汉</el-checkbox>
+          </div>
+        </el-form-item>
+        <el-form-item label="琛屼笟鍒嗙被" prop="industryId">
+          <el-select v-model="form.industryId" clearable filterable>
+            <el-option v-for="item in cateList" :value="item.id" :label="item.name" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="瀹㈡埛缂栧彿" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏�" v-trim />
+        </el-form-item>
+        <div class="title">榛樿鑱旂郴浜�</div>
+        <el-form-item label="濮撳悕" prop="member.name">
+          <el-input v-model="form.member.name" placeholder="璇疯緭鍏�" v-trim />
+        </el-form-item>
+        <el-form-item label="鎵嬫満鍙�" prop="member.phone">
+          <el-input v-model="form.member.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim />
+        </el-form-item>
+        <el-form-item label="韬唤">
+          <el-select v-model="form.member.highCheckor" filterable>
+            <el-option :value="0" label="鑰佹澘/瓒呯骇绠$悊鍛�" />
+            <el-option :value="1" label="浜轰簨/绠$悊鍛�" />
+            <el-option :value="2" label="鍛樺伐/鏅�氬憳宸�" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇佷欢绫诲瀷">
+          <el-select v-model="form.member.idcardType" filterable>
+            <el-option :value="0" label="韬唤璇�" />
+            <el-option :value="1" label="娓境璇佷欢" />
+            <el-option :value="2" label="鎶ょ収" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇佷欢鍙风爜" prop="member.idcardNo">
+          <el-input v-model="form.member.idcardNo" placeholder="璇疯緭鍏�" v-trim />
+        </el-form-item>
+        <el-form-item label="閭" prop="email">
+          <el-input v-model="form.member.email" placeholder="璇疯緭鍏ラ偖绠�" v-trim />
+        </el-form-item>
+
+        <div class="title">璐︽埛淇℃伅</div>
+        <el-form-item label="寮�鎴烽摱琛�" prop="accountBank">
+          <el-input v-model="form.accountBank" placeholder="璇疯緭鍏ュ紑鎴烽摱琛�" v-trim />
+        </el-form-item>
+        <el-form-item label="璐﹀彿" prop="accountNo">
+          <el-input v-model="form.accountNo" placeholder="璇疯緭鍏ヨ处鍙�" v-trim />
+        </el-form-item>
+        <el-form-item label="鐢佃瘽" prop="accountPhone">
+          <el-input v-model="form.accountPhone" placeholder="璇疯緭鍏ヨ处鎴风數璇�" v-trim />
+        </el-form-item>
+        <el-form-item label="缁熶竴淇$敤浠g爜" prop="creditCard">
+          <el-input v-model="form.creditCard" placeholder="璇疯緭鍏ョ粺涓�淇$敤浠g爜" v-trim />
+        </el-form-item>
+        <el-form-item label="榛樿鍙戠エ绫诲瀷" prop="fpType">
+          <el-select v-model="form.fpType" clearable filterable>
+            <el-option :value="0" label="澧炲�肩◣鏅�氬彂绁�" />
+            <el-option :value="1" label="澧炲�肩◣涓撶敤鍙戠エ" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="娉ㄥ唽鍦板潃" prop="accountAddr">
+          <el-input v-model="form.accountAddr" placeholder="璇疯緭鍏ヨ处鍙锋敞鍐屽湴鍧�" v-trim />
+        </el-form-item>
+        <el-form-item label="钀ヤ笟鏈熼檺">
+          <div class="df">
+            <el-date-picker type="date" v-model="form.validity" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+            <el-checkbox v-model="form.selLangTime" @change="changeValid" class="ml10">闀挎湡</el-checkbox>
+          </div>
+        </el-form-item>
+
+      </div>
     </el-form>
   </GlobalWindow>
 </template>
@@ -67,15 +82,19 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import { fetchCateList } from '@/api/business/category'
+import { rules } from './config'
+import { detailById } from '@/api/client/ywCustomer'
 export default {
   name: 'OperaYwCustomerWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
-  data () {
+  data() {
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
+        validity: '',
         creator: '',
         createDate: '',
         editor: '',
@@ -83,38 +102,108 @@
         isdeleted: '',
         remark: '',
         industryId: '',
-        type: '',
+        type: '1',
         name: '',
         phone: '',
         idcardNo: '',
         idcardDecode: '',
         code: '',
         status: '',
-        highCheckor: '',
+        memberName: '',
+        
         lastLoginDate: '',
         loginNum: '',
         userId: '',
-        idcardType: '',
+        
         accountBank: '',
         accountNo: '',
         accountPhone: '',
         creditCard: '',
         fpType: '',
         accountAddr: '',
-        identityType: '',
+        // identityType: '0',
         email: '',
-        memberId: ''
+        memberId: '',
+        member: {
+          name: "",
+          phone: "",
+          highCheckor: 0,
+          idcardType: 0,
+          idcardNo: '',
+          email: '',
+        }
       },
+      cateList: [],
       // 楠岃瘉瑙勫垯
-      rules: {
-      }
+      rules
     }
   },
-  created () {
+  created() {
     this.config({
       api: '/client/ywCustomer',
       'field.id': 'id'
     })
+  },
+  methods: {
+    initData() {
+      fetchCateList({ type: 6 }).then(res => {
+        this.cateList = res
+      })
+    },
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      this.initData()
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        if(title == '缂栬緫瀹㈡埛'){
+          detailById(target.id).then(res => {
+            this.form = res
+          })
+        }
+      })
+    },
+    changeValid(e) {
+      this.$set(this.form, 'validity', e ? '2099-12-31' : '')
+    },
   }
 }
 </script>
+<style lang='scss' scoped>
+@import '@/assets/style/variables.scss';
+
+div {
+  box-sizing: border-box;
+}
+
+.title {
+  width: 100%;
+  font-weight: 500;
+  font-size: 15px;
+  margin-top: 16px;
+}
+
+.list {
+  /* padding-top: 14px; */
+  display: flex;
+  flex-wrap: wrap;
+
+  .el-form-item {
+    width: 33.33%;
+    margin-bottom: 12px;
+    padding: 0 12px;
+
+    .la {
+      color: #7f7f7f;
+      margin-top: 2px;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/client/components/config.js b/admin/src/views/client/components/config.js
new file mode 100644
index 0000000..3b5b937
--- /dev/null
+++ b/admin/src/views/client/components/config.js
@@ -0,0 +1,10 @@
+export const rules = {
+  name: [{ required: true, message: '璇疯緭鍏�' }],
+  'member.name': [{ required: true, message: '璇疯緭鍏�' }],
+  'member.phone': [{ required: true, message: '璇疯緭鍏�' }],
+}
+export const staffRules = {
+  name: [{ required: true, message: '璇疯緭鍏�' }],
+  'member.name': [{ required: true, message: '璇疯緭鍏�' }],
+  phone: [{ required: true, message: '璇疯緭鍏�' }],
+}
\ No newline at end of file
diff --git a/admin/src/views/client/components/staffEdit.vue b/admin/src/views/client/components/staffEdit.vue
new file mode 100644
index 0000000..f74bff5
--- /dev/null
+++ b/admin/src/views/client/components/staffEdit.vue
@@ -0,0 +1,177 @@
+<template>
+  <GlobalWindow :title="title" width="900px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+    <el-form :model="form" ref="form" :rules="rules">
+      <div class="list">
+        <el-form-item label="瀹㈡埛鍚嶇О" prop="customerId">
+          <el-select v-model="form.customerId" clearable filterable>
+            <el-option v-for="item in clientList" :value="item.id" :label="item.name" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="濮撳悕" prop="name">
+          <div class="df">
+            <el-input v-model="form.name" placeholder="璇疯緭鍏�" v-trim />
+          </div>
+        </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="韬唤">
+          <el-select v-model="form.highCheckor" filterable>
+            <el-option :value="0" label="鑰佹澘/瓒呯骇绠$悊鍛�" />
+            <el-option :value="1" label="浜轰簨/绠$悊鍛�" />
+            <el-option :value="2" label="鍛樺伐/鏅�氬憳宸�" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇佷欢绫诲瀷">
+          <el-select v-model="form.idcardType" filterable>
+            <el-option :value="0" label="韬唤璇�" />
+            <el-option :value="1" label="娓境璇佷欢" />
+            <el-option :value="2" label="鎶ょ収" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇佷欢鍙风爜" prop="member.idcardNo">
+          <el-input v-model="form.idcardNo" placeholder="璇疯緭鍏�" v-trim />
+        </el-form-item>
+        <el-form-item label="閭" prop="email">
+          <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" v-trim />
+        </el-form-item>
+        <el-form-item label="鎬у埆">
+          <el-select v-model="form.sex" filterable>
+            <el-option :value="1" label="鐢�" />
+            <el-option :value="2" label="濂�" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍑虹敓鏃ユ湡">
+          <el-date-picker type="date" v-model="form.birthday" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+        </el-form-item>
+
+      </div>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { fetchCateList } from '@/api/business/category'
+import { staffRules } from './config'
+import { detailById } from '@/api/client/ywCustomer'
+import { fetchList } from '@/api/client/ywCustomer'
+export default {
+  name: 'OperaYwCustomerWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data() {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        customerId: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        birthday: '',
+        industryId: '',
+        type: '1',
+        idcardDecode: '',
+        sex: '',
+        status: '',
+        memberName: '',
+
+        lastLoginDate: '',
+        loginNum: '',
+        userId: '',
+
+        accountBank: '',
+        accountNo: '',
+        accountPhone: '',
+        creditCard: '',
+        fpType: '',
+        accountAddr: '',
+        // identityType: '0',
+        name: "",
+        phone: "",
+        highCheckor: 0,
+        idcardType: 0,
+        idcardNo: '',
+        email: '',
+      },
+      clientList: [],
+      // 楠岃瘉瑙勫垯
+      rules: staffRules
+    }
+  },
+  created() {
+    this.config({
+      api: '/client/staff',
+      'field.id': 'id'
+    })
+  },
+
+  methods: {
+    initData() {
+      fetchList({
+        capacity: 9000,
+        model: {},
+        page: 1
+      }).then(res => {
+        this.clientList = res.records || []
+      })
+    },
+    open(title, target) {
+      this.title = title
+      this.visible = true
+      this.initData()
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    },
+    changeValid(e) {
+      this.$set(this.form, 'validity', e ? '2099-12-31' : '')
+    },
+  }
+}
+</script>
+<style lang='scss' scoped>
+@import '@/assets/style/variables.scss';
+
+div {
+  box-sizing: border-box;
+}
+
+.title {
+  width: 100%;
+  font-weight: 500;
+  font-size: 15px;
+  margin-top: 16px;
+}
+
+.list {
+  /* padding-top: 14px; */
+  display: flex;
+  flex-wrap: wrap;
+
+  .el-form-item {
+    width: 33.33%;
+    margin-bottom: 12px;
+    padding: 0 12px;
+
+    .la {
+      color: #7f7f7f;
+      margin-top: 2px;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/client/staffList.vue b/admin/src/views/client/staffList.vue
index 3012931..6117255 100644
--- a/admin/src/views/client/staffList.vue
+++ b/admin/src/views/client/staffList.vue
@@ -2,8 +2,10 @@
   <TableLayout :permissions="['business:ywcustomer: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 label="瀹㈡埛鍚嶇О" prop="customerId">
+        <el-select v-model="searchForm.customerId" clearable filterable>
+          <el-option v-for="item in clientList" :value="item.id" :label="item.name" />
+        </el-select>
       </el-form-item>
       <el-form-item prop="name">
         <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ヤ汉鍛樺鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
@@ -18,21 +20,31 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:ywcustomer:create', 'business:ywcustomer:delete']">
-        <li><el-button type="primary" @click="$refs.operaYwCustomerWindow.open('鏂板缓瀹㈡埛')" icon="el-icon-plus"
+        <li><el-button type="primary" @click="$refs.operaYwCustomerWindow.open('鏂板缓浜哄憳')" icon="el-icon-plus"
             v-permissions="['business:ywcustomer:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
             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 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="customerName" label="瀹㈡埛鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="name" 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 prop="" label="韬唤" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.highCheckor == 0">鑰佹澘/瓒呯骇绠$悊鍛�</span>
+            <span v-if="row.highCheckor == 1">浜轰簨/绠$悊鍛�</span>
+            <span v-if="row.highCheckor == 2">鍛樺伐/鏅�氬憳宸�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <span :class="{ red: row.status == 1 }">{{ row.status == '0' ? '姝e父' : '绂佺敤' }}</span>
+          </template>
+        </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}">
-            <el-button type="text" @click="$refs.operaYwCustomerWindow.open('缂栬緫瀹㈡埛', row)" icon="el-icon-edit"
+            <el-button type="text" @click="$refs.operaYwCustomerWindow.open('缂栬緫浜哄憳', row)" icon="el-icon-edit"
               v-permissions="['business:ywcustomer:update']">缂栬緫</el-button>
             <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
               v-permissions="['business:ywcustomer:delete']">鍒犻櫎</el-button>
@@ -51,7 +63,8 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
-import OperaYwCustomerWindow from './components/OperaYwCustomerWindow'
+import OperaYwCustomerWindow from './components/staffEdit.vue'
+import { fetchList } from '@/api/client/ywCustomer'
 export default {
   name: 'YwCustomer',
   extends: BaseTable,
@@ -60,46 +73,32 @@
     return {
       // 鎼滅储
       searchForm: {
-        id: '',
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        remark: '',
-        industryId: '',
-        type: '',
+        customerId: '',
         name: '',
-        phone: '',
-        idcardNo: '',
-        idcardDecode: '',
-        code: '',
-        status: '',
-        highCheckor: '',
-        lastLoginDate: '',
-        loginNum: '',
-        userId: '',
-        idcardType: '',
-        accountBank: '',
-        accountNo: '',
-        accountPhone: '',
-        creditCard: '',
-        fpType: '',
-        accountAddr: '',
-        identityType: '',
-        email: '',
-        memberId: ''
-      }
+      },
+      clientList: []
     }
   },
   created() {
     this.config({
       module: '杩愮淮瀹㈡埛淇℃伅琛�',
-      api: '/client/ywCustomer',
+      api: '/client/staff',
       'field.id': 'id',
       'field.main': 'id'
     })
     this.search()
+    this.initData()
+  },
+  methods: {
+    initData() {
+      fetchList({
+        capacity: 9000,
+        model: {},
+        page: 1
+      }).then(res => {
+        this.clientList = res.records || []
+      })
+    },
   }
 }
 </script>
diff --git a/admin/src/views/contract/components/contractEdit.vue b/admin/src/views/contract/components/contractEdit.vue
index 8e79bce..13e6378 100644
--- a/admin/src/views/contract/components/contractEdit.vue
+++ b/admin/src/views/contract/components/contractEdit.vue
@@ -1,5 +1,6 @@
 <template>
-  <GlobalWindow width="1000px" :title="title" :visible.sync="showModal" :confirm-working="isWorking" @close="close" @confirm="confirm">
+  <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>
@@ -74,7 +75,10 @@
       <div class="file_wrap">
         <div class="head">
           <div>鍚堝悓闄勪欢</div>
-          <el-button icon="el-icon-plus" plain>娣诲姞闄勪欢</el-button>
+          <el-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl"
+            :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError">
+            <el-button icon="el-icon-plus" plain>娣诲姞闄勪欢</el-button>
+          </el-upload>
         </div>
         <el-table :data="param.list" stripe>
           <el-table-column prop="" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip />
@@ -133,7 +137,7 @@
       <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-column prop="" label="搴旀敹" align="center" min-width="100" show-overflow-tooltip />
@@ -153,6 +157,7 @@
 import BaseOpera from '@/components/base/BaseOpera'
 import MemberSearch from '@/components/common/MemberSearch'
 import { rules } from './config'
+import { Message, Loading } from 'element-ui'
 export default {
   components: {
     GlobalWindow,
@@ -166,6 +171,13 @@
       activeTabs: '0',
       param: {},
       rules,
+
+      loadingInstance: null,
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
+      fileList: [],
+      uploadData: {
+        folder: 'HIDDEN_DANGER_FILE'
+      },
 
       types: [
         { name: '鐗╀笟+绉熻祦鍚堝悓', value: 0 },
@@ -265,6 +277,50 @@
       console.log(this.value)
 
     },
+    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)
+    },
     close() {
       this.showModal = false
       this.$emit('close')
@@ -331,7 +387,7 @@
   }
 
   .main_house {
-    width: 420px;
+    width: 320px;
     padding: 24px 12px;
     border: 1px solid #c3c6cd;
     border-radius: 2px;
@@ -344,17 +400,20 @@
   }
 
 }
-.total{
+
+.total {
   display: flex;
   justify-content: space-between;
   align-items: center;
   height: 32px;
   background-color: #e7e9f5;
-  span{
+
+  span {
     width: 160px;
     text-align: center;
   }
 }
+
 .file_wrap {
   padding: 20px 16px;
   border: 1px solid #c3c6cd;
diff --git a/admin/src/views/finance/bull.vue b/admin/src/views/finance/bull.vue
index fef662a..c0aea32 100644
--- a/admin/src/views/finance/bull.vue
+++ b/admin/src/views/finance/bull.vue
@@ -13,16 +13,18 @@
       </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 prop="" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="code" label="妤煎畤鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="name" label="鎴块棿鍙�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="stautsName" label="鍚堝悓缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="remark" label="缁撴竻鐘舵��" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="createTime" label="璐﹀崟閲戦" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="createTime" 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>
+            v-permissions="['business:category:update']">鏌ョ湅璇︽儏</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -30,19 +32,22 @@
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
     </div>
     <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
+    <Detail ref="DetailRef" @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 Edit from './components/bullEdit.vue'
+import Detail from './components/bullDetail.vue'
 import { fetchList, deleteById } from '@/api/Inspection/device'
 export default {
   components: {
     Pagination,
     QueryForm,
-    Edit
+    Edit,
+    Detail
   },
   data() {
     return {
diff --git a/admin/src/views/finance/components/bullDetail.vue b/admin/src/views/finance/components/bullDetail.vue
new file mode 100644
index 0000000..8eec8dd
--- /dev/null
+++ b/admin/src/views/finance/components/bullDetail.vue
@@ -0,0 +1,231 @@
+<template>
+  <GlobalWindow :title="'璐﹀崟璇︽儏'" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+    @confirm="confirm">
+    <div class="home_title">
+      <div class="left">
+        <span class="mr10">浠樻鏂癸細xxx</span>
+        <span class="status">status</span>
+      </div>
+      <el-button plain type="primary">鏂板缓鏀舵敮娴佹按</el-button>
+    </div>
+    <div class="remark">
+      <div class="item">
+        <div class="la">璐﹀崟鐘舵��</div>
+        <div class="val">宸茬粨娓�</div>
+      </div>
+    </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: true,
+      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/finance/components/bullEdit.vue b/admin/src/views/finance/components/bullEdit.vue
new file mode 100644
index 0000000..80a4067
--- /dev/null
+++ b/admin/src/views/finance/components/bullEdit.vue
@@ -0,0 +1,370 @@
+<template>
+  <GlobalWindow width="1100px" :title="title" :visible.sync="isShowModal" :confirm-working="isWorking" @close="close"
+    @confirm="confirm">
+    <template v-if="activeTabs == 0">
+      <div class="main">
+        <div class="main_content">
+          <el-form :model="param" label-position="top" ref="paramRef" :rules="rules">
+            <div class="head">
+              <div class="m_title">鍩虹淇℃伅</div>
+              <div class="tabs">
+                <div class="tab" :class="{ active: timeTab == 0 }" @click="timeTabClick('0')">鍛ㄦ湡璐圭敤</div>
+                <div class="tab" :class="{ active: timeTab == 1 }" @click="timeTabClick('1')">涓�娆℃�ц垂鐢�</div>
+              </div>
+            </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 comparyList" :value="item.id" :label="item.name"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item style="width: 100%;" label="璐﹀崟澶囨敞" prop="">
+                <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" />
+              </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-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl"
+            :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError">
+            <el-button icon="el-icon-plus" plain>娣诲姞闄勪欢</el-button>
+          </el-upload>
+        </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>
+    <!--  -->
+    <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'
+import { Message, Loading } from 'element-ui'
+export default {
+  components: {
+    GlobalWindow,
+    MemberSearch
+  },
+  extends: BaseOpera,
+  data() {
+    return {
+      isShowModal: false,
+      title: '',
+      activeTabs: '0',
+      param: {},
+      rules,
+      timeTab: '0',
+
+      loadingInstance: null,
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
+      fileList: [],
+      uploadData: {
+        folder: 'HIDDEN_DANGER_FILE'
+      },
+
+      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 },
+      ],
+    }
+  },
+  created() {
+    const { param } = this
+    this.title = param.id ? '缂栬緫鏀舵璐﹀崟' : '鍒涘缓鏀舵璐﹀崟'
+  },
+  methods: {
+    tabsClick(val) {
+      this.activeTabs = val
+    },
+    timeTabClick(val) {
+      this.timeTab = val
+    },
+    getDetail() {
+
+    },
+    handleRent() {
+      this.$refs.MemberSearchRef.openModal()
+    },
+    houseChange(e) {
+      console.log(e)
+      console.log(this.value)
+
+    },
+    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)
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '@/assets/style/variables.scss';
+
+
+.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;
+
+    .head {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+
+      .tabs {
+        display: flex;
+        margin-bottom: 20px;
+        display: flex;
+        justify-content: center;
+
+        .tab {
+          height: 14px;
+          line-height: 14px;
+          cursor: pointer;
+          border: 1px solid #ebebeb;
+          padding: 12px 24px;
+        }
+
+        .active {
+          font-weight: 500;
+          color: $primary-color;
+          border: 1px solid $primary-color;
+        }
+      }
+    }
+
+    .list {
+      display: flex;
+      flex-wrap: wrap;
+
+      .el-form-item {
+        width: 33.33%;
+        box-sizing: border-box;
+        padding: 0 12px;
+      }
+    }
+  }
+
+  .main_house {
+    width: 320px;
+    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/finance/components/config.js b/admin/src/views/finance/components/config.js
new file mode 100644
index 0000000..7d3be5d
--- /dev/null
+++ b/admin/src/views/finance/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/finance/components/deviceEdit.vue b/admin/src/views/finance/components/deviceEdit.vue
deleted file mode 100644
index 185fbdc..0000000
--- a/admin/src/views/finance/components/deviceEdit.vue
+++ /dev/null
@@ -1,137 +0,0 @@
-<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/components/paymentsEdit.vue b/admin/src/views/finance/components/paymentsEdit.vue
new file mode 100644
index 0000000..816f170
--- /dev/null
+++ b/admin/src/views/finance/components/paymentsEdit.vue
@@ -0,0 +1,204 @@
+<template>
+  <GlobalWindow :title="param.id ? '缂栬緫鍏徃' : '鏂板缓鍏徃'" :confirmWorking="subLoading" :visible.sync="isShowModal"
+    width="600px" @close="close" @confirm="handleSub">
+    <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-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="aaa">
+              <el-date-picker type="daterange" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+            </el-form-item>
+            <el-form-item label="璐﹀崟缂栧彿" prop="">
+              <el-input type="text" v-model="param.content" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+            <el-form-item label="搴旀敹閲戦" prop="">
+              <el-input type="text" v-model="param.content" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+            <el-form-item label="瀹炴敹閲戦" prop="">
+              <el-input type="text" v-model="param.content" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+            <el-form-item label="鎵�灞炲叕鍙�" prop="">
+              <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="">
+              <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-date-picker type="date" v-model="param.aaa" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+            </el-form-item>
+            <el-form-item label="澶囨敞" prop="">
+              <el-input type="textarea" :rows="4" class="w400" v-model="param.content" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+          </div>
+        </el-form>
+      </div>
+    </div>
+    <!--  -->
+    <div class="table_wrap">
+      <div class="head">
+        <div class="title">璐﹀崟闄勪欢</div>
+        <el-button type="primary">娣诲姞闄勪欢</el-button>
+      </div>
+      <el-table :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"></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>
+    </div>
+  </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: [],
+      list: [],
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏�' }],
+        desc: [{ required: true, message: '璇疯緭鍏�' }]
+      },
+      types: []
+
+    }
+  },
+  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)
+    },
+    handleDel(row) {
+      this.list.splice(row.$index, 1)
+
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.main {
+  display: flex;
+  margin-bottom: 20px;
+  padding-top: 20px;
+
+  .main_content {
+    flex: 1;
+    margin-right: 20px;
+
+    .m_title {
+      font-weight: 500;
+      margin-bottom: 12px;
+      margin-top: 10px;
+    }
+
+    .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;
+    }
+  }
+
+}
+
+.head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 20px;
+
+  div {
+    font-weight: 500;
+  }
+}
+.table_wrap{
+  border: 1px solid #e2e2e2;
+  border-radius: 2px;
+  padding: 12px;
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/finance/payments.vue b/admin/src/views/finance/payments.vue
index 107c3a5..3334854 100644
--- a/admin/src/views/finance/payments.vue
+++ b/admin/src/views/finance/payments.vue
@@ -4,14 +4,18 @@
     <div class="mt20">
       <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
         v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
+      <el-button @click="handleEdit()" 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>
+      <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 />
+      <el-table-column prop="" 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>
@@ -19,10 +23,10 @@
       </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="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>
+            v-permissions="['business:category:delete']">閫�娆�</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -36,7 +40,7 @@
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
-import Edit from './components/companyEdit.vue'
+import Edit from './components/paymentsEdit.vue'
 import { companyGetList, deleteById } from '@/api/business/company'
 export default {
   components: {
@@ -61,12 +65,22 @@
           {
             filed: 'name',
             type: 'input',
-            label: '鏀舵敮鏉$洰'
+            label: '瀹㈡埛鍚嶇О'
           },
           {
             filed: 'name',
             type: 'select',
-            label: '鏀舵鍏徃'
+            label: '鏀舵敮绫诲瀷'
+          },
+          {
+            filed: 'name',
+            type: 'select',
+            label: '鏀舵鏂瑰紡'
+          },
+          {
+            filed: 'name',
+            type: 'daterange',
+            label: '鍏ヨ处鏃ユ湡'
           },
         ],
         online: true
diff --git a/admin/src/views/index.vue b/admin/src/views/index.vue
index 6fa6e1d..2ae93cc 100644
--- a/admin/src/views/index.vue
+++ b/admin/src/views/index.vue
@@ -227,13 +227,13 @@
     }
   },
   created() {
-    this.updateDate()
-    setInterval(() => {
-      this.updateDate()
-    }, 1000 * 60 * 60)
+    // this.updateDate()
+    // setInterval(() => {
+    //   this.updateDate()
+    // }, 1000 * 60 * 60)
   },
   mounted() {
-    this.initData()
+    // this.initData()
   },
   methods: {
     SubSuccess(str) {
diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue
index 0569816..ff79acb 100644
--- a/admin/src/views/login.vue
+++ b/admin/src/views/login.vue
@@ -3,8 +3,8 @@
     <img src="@/assets/images/bg@2x.png" class="main_bg" alt="">
     <div class="login_wrap">
       <div class="login_img">
-        <div class="h2">闃滃畞鏂囦綋涓績</div>
-        <div class="h3">鏅烘収鐗╂祦鍥尯瀹夋秷涓�浣撳寲绯荤粺</div>
+        <!-- <div class="h2">闃滃畞鏂囦綋涓績</div> -->
+        <div class="h3">鏅烘収鍦洪杩愮淮绠$悊绯荤粺</div>
       </div>
       <div class="form_wrap">
         <div class="tabs">
diff --git a/admin/src/views/project/buildingList.vue b/admin/src/views/project/buildingList.vue
index b3dd1ec..ad86ed4 100644
--- a/admin/src/views/project/buildingList.vue
+++ b/admin/src/views/project/buildingList.vue
@@ -36,8 +36,8 @@
         <el-table-column prop="code" label="妤煎畤缂栫爜" min-width="80px"></el-table-column>
         <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 prop="roomNum" label="鎴块棿鎬绘暟(闂�)" min-width="80px"></el-table-column>
+        <el-table-column prop="roomeRentNum" 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}">
@@ -107,7 +107,8 @@
       this.$refs.operaYwBuildingWindow.getProject()
     },
     editFloor(row) {
-      this.$refs.FloorLevelRef.getList(row.id)
+      this.$refs.FloorLevelRef.id = row.id
+      this.$refs.FloorLevelRef.getList()
       this.$refs.FloorLevelRef.visible = true
     },
     handleDetail(row) {
diff --git a/admin/src/views/project/components/OperaYwBuildingWindow.vue b/admin/src/views/project/components/OperaYwBuildingWindow.vue
index d095dc0..746d3c6 100644
--- a/admin/src/views/project/components/OperaYwBuildingWindow.vue
+++ b/admin/src/views/project/components/OperaYwBuildingWindow.vue
@@ -1,5 +1,5 @@
 <template>
-  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+  <GlobalWindow width="900px" :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" filterable clearable>
diff --git a/admin/src/views/project/components/floorLevel.vue b/admin/src/views/project/components/floorLevel.vue
index 4e5d94c..edc027b 100644
--- a/admin/src/views/project/components/floorLevel.vue
+++ b/admin/src/views/project/components/floorLevel.vue
@@ -1,21 +1,20 @@
 <template>
-  <GlobalWindow title="妤煎眰绠$悊" :showConfirm="false" :visible.sync="visible" width="800px">
+  <GlobalWindow title="妤煎眰绠$悊" @close="close" :showConfirm="false" :visible.sync="visible" width="800px">
     <div class="head">
       <div class="title">妤煎眰鍒楄〃</div>
       <el-button type="primary" @click="editClick()">鏂板缓妤煎眰</el-button>
     </div>
     <el-table :data="list" stripe>
-      <el-table-column prop="id" label="妤煎眰缂栫爜" 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 label="鎿嶄綔" min-width="100px">
         <template slot-scope="{row}">
-          <el-button type="text" @click="$refs.operaYwBuildingWindow.open('缂栬緫妤煎畤', row)" icon="el-icon-edit"
+          <el-button type="text" @click="editClick(row)" icon="el-icon-edit"
             v-permissions="['business:ywbuilding:update']">缂栬緫</el-button>
-          <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+          <el-button type="text" @click="handleDel(row)" icon="el-icon-delete"
             v-permissions="['business:ywbuilding:delete']">鍒犻櫎</el-button>
         </template>
       </el-table-column>
-      <el-table-column prop="projectName" label="鎵�灞為」鐩�" min-width="100px"></el-table-column>
     </el-table>
     <div class="mt20">
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
@@ -33,7 +32,7 @@
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button @click="showModal = false">鍙� 娑�</el-button>
-        <el-button type="primary" @click="showModal = false">纭� 瀹�</el-button>
+        <el-button type="primary" :loading="subLoading" @click="onSubmit">纭� 瀹�</el-button>
       </span>
     </el-dialog>
   </GlobalWindow>
@@ -42,8 +41,9 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
-import { fetchList, detailById, deleteById, create } from '@/api/project/yeFloor'
+import { fetchList, detailById, deleteById, create, updateById } from '@/api/project/yeFloor'
 import Pagination from '@/components/common/Pagination'
+import { Message } from 'element-ui'
 export default {
   extends: BaseOpera,
   components: { GlobalWindow, Pagination },
@@ -54,6 +54,7 @@
       id: '',
       visible: false,
       showModal: false,
+      subLoading: false,
       list: [],
       pagination: {
         pageSize: 10,
@@ -65,29 +66,63 @@
       param: {},
       rules: {
         name: [{ required: true, message: '璇疯緭鍏ユゼ灞傚悕绉�' }],
-        area: [{ required: true, message: '璇疯緭鍏ユゼ灞傜紪鐮�' }],
+        code: [{ required: true, message: '璇疯緭鍏ユゼ灞傜紪鐮�' }],
       },
     }
   },
   created() {
   },
   methods: {
+    onSubmit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          const { param, id } = this
+          this.subLoading = true
+          let fn = param.id ? updateById : create
+          fn({ ...param, buildingId: id }).then(res => {
+            this.showModal = false
+            this.subLoading = false
+            Message.success('鎻愪氦鎴愬姛')
+            this.getList()
+          }, () => {
+            this.subLoading = false
+          })
+        }
+      })
+    },
     getList(buildingId) {
-      const { pagination } = this
+      const { pagination, id } = this
+      // this.buildingId =
       let capacity = pagination.pageSize
       let page = pagination.page
-      fetchList({ capacity, page, model: { buildingId } }).then(res => {
-        this.list = res
+      fetchList({ capacity, page, model: { buildingId: id } }).then(res => {
+        this.list = res.records
       })
     },
     editClick(row) {
-      if(row && row.id){
+      if (row && row.id) {
         this.title = '缂栬緫妤煎眰'
-      }else{
+        this.param = { ...row }
+      } else {
         this.title = '鏂板缓妤煎眰'
+        this.param = {}
       }
       this.showModal = true
-
+    },
+    handleDel(row) {
+      this.$confirm('纭畾鍒犻櫎璇ユゼ灞�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteById(row.id).then(res => {
+          Message.success('鍒犻櫎鎴愬姛')
+          this.getList()
+        })
+      })
+    },
+    close() {
+      this.$emit('success')
     },
     handleSizeChange(capacity) {
       this.pagination.pageSize = capacity
diff --git a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
index f292342..9eb7fcf 100644
--- a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
+++ b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -1,5 +1,5 @@
 <template>
-  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+  <GlobalWindow width="800px" :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
     <el-form :model="form" ref="form" :rules="rules">
       <el-form-item label="浣嶇疆绫诲瀷" prop="areaType">
         <el-select v-model="form.areaType">
@@ -7,17 +7,38 @@
           <el-option label="鍏叡缁翠慨" value="1"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="鎶ヤ慨鍖哄煙">
-
-      </el-form-item>
-      <el-form-item label="鍒嗙被" prop="cateId">
-        <el-select v-model="form.cateId">
-          <el-option label="" value=""></el-option>
+      <el-form-item label="閫夋嫨椤圭洰" prop="projectId">
+        <el-select v-model="form.projectId" clearable filterable @change="getBuild">
+          <el-option v-for="item in projectList" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="涓婇棬鏃堕棿" prop="getDate">
-        <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 label="閫夋嫨妤煎畤" prop="buildingId">
+        <el-select v-model="form.buildingId" clearable filterable @change="changeBuild">
+          <el-option v-for="item in buildList" :label="item.name" :value="item.id" />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="閫夋嫨妤煎眰" prop="floorId">
+        <el-select v-model="form.floorId">
+          <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" />
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="form.areaType == 0" label="閫夋嫨鎴块棿" prop="roomId">
+        <el-select v-model="form.roomId" clearable filterable>
+          <el-option v-for="item in roomList" :label="item.name" :value="item.id" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鍒嗙被" prop="cateId">
+        <el-cascader v-model="form.areaIds" @change="changeSel" placeholder="璇烽�夋嫨宸℃鍖哄煙" clearable :options="cateList"
+          :props="{
+            label: 'name',
+            value: 'id',
+            children: 'childCategoryList'
+          }"></el-cascader>
+      </el-form-item>
+      <el-form-item label="涓婇棬鏃堕棿" v-if="form.areaType == 0" prop="getDate">
+        <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="鐜板満鍥剧墖">
         <div class="file_list">
@@ -37,8 +58,8 @@
           </div>
         </div>
       </el-form-item>
-      <el-form-item label="鎯呭喌璇存槑" prop="content">
-        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="璇疯緭鍏ユ儏鍐佃鏄�" v-trim />
+      <el-form-item label="鎻忚堪" prop="content">
+        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="璇疯緭鍏�" :maxlength="300" v-trim />
       </el-form-item>
     </el-form>
     <!--  -->
@@ -49,7 +70,13 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
-import { Loading } from 'element-ui'
+import { Loading, Message } from 'element-ui'
+import { getProjectList } from '@/api/project/ywProject'
+import { getBuildList } from '@/api/project/ywBuilding'
+import { getRoomList } from '@/api/project/ywRoom'
+import { fetchList } from '@/api/project/yeFloor'
+import { fetchList as getCateList } from '@/api/business/category.js'
+import { rules } from './config'
 export default {
   name: 'OperaYwWorkorderWindow',
   extends: BaseOpera,
@@ -63,6 +90,7 @@
         createDate: '',
         editor: '',
         editDate: '',
+        floor: '',
         isdeleted: '',
         title: '',
         remark: '',
@@ -72,6 +100,7 @@
         getDate: '',
         projectId: '',
         buildingId: '',
+        floorId: '',
         roomId: '',
         userId: '',
         phone: '',
@@ -90,8 +119,12 @@
       },
       loadingInstance: null,
       // 楠岃瘉瑙勫垯
-      rules: {
-      },
+      rules,
+      projectList: [],
+      buildList: [],
+      levelList: [],
+      roomList: [],
+      cateList: [],
       uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
       fileList: [],
       uploadData: {
@@ -106,11 +139,79 @@
     })
   },
   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) {
+    open(title, target) {
+      this.title = title
+      this.visible = true
+      this.getProject()
+      this.getCate()
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    },
+    getProject() {
+      getProjectList({}).then(res => {
+        this.projectList = res
+      })
+    },
+    getBuild(projectId) {
+      this.$set(this.form, 'buildingId', '')
+      this.$set(this.form, 'floorId', '')
+      this.$set(this.form, 'roomId', '')
+      getBuildList({ projectId }).then(res => {
+        this.buildList = res
+      })
+    },
+    changeBuild(e) {
+      this.$set(this.form, 'floorId', '')
+      this.$set(this.form, 'roomId', '')
+      this.getLevel(e)
+      this.getRoom(e)
+    },
+    getLevel(buildingId) {
+      fetchList({ model: { buildingId }, capacity: 9999, page: 1 }).then(res => {
+        this.levelList = res.records
+      })
+    },
+    getRoom(buildingId) {
+      const { form } = this
+      getRoomList({ buildingId }).then(res => {
+        this.roomList = res
+      })
+    },
+    changeSel(e) {
+      if(e && e.length == 2){
+        this.$set(this.form, 'cateId', e[1])
+      }else{
+        this.$set(this.form, 'cateId', '')
+      }
+      
+    },
+    getCate() {
+      getCateList({
+        model: { type: 3 },
+        capacity: 1000,
+        page: 1,
+      }).then(res => {
+        this.cateList = res.records || []
+      })
+    },
+    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
       }
+      if (this.fileList.length > 8) return Message.warning('鐜板満鍥剧墖涓嶈兘瓒呰繃9寮�')
       this.loadingInstance = Loading.service({
         lock: true,
         text: 'Loading',
@@ -120,14 +221,14 @@
     },
     uploadError() {
       this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
-        if(this.loadingInstance){
+        if (this.loadingInstance) {
           this.loadingInstance.close()
         }
       })
     },
-    uploadAvatarSuccess (file) {
+    uploadAvatarSuccess(file) {
       this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
-        if(this.loadingInstance){
+        if (this.loadingInstance) {
           this.loadingInstance.close()
         }
       })
@@ -150,10 +251,10 @@
       // this.$set(this.param, 'faceImg', file.imgurl)
       // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
     },
-    handleDelImg (i) {
+    handleDelImg(i) {
       this.fileList.splice(i, 1)
     },
-    close(){
+    close() {
       this.isShowModal = false
       this.$emit('close')
     }
@@ -164,7 +265,8 @@
 .file_list {
   display: flex;
   flex-wrap: wrap;
-  .avatar-uploader{
+
+  .avatar-uploader {
     width: 92px;
     height: 92px;
     display: flex;
@@ -172,6 +274,7 @@
     align-items: center;
     border: 1px dashed #d9d9d9;
   }
+
   .item {
     width: 92px;
     max-height: 92px;
diff --git a/admin/src/views/workorder/components/config.js b/admin/src/views/workorder/components/config.js
new file mode 100644
index 0000000..5985048
--- /dev/null
+++ b/admin/src/views/workorder/components/config.js
@@ -0,0 +1,9 @@
+export const rules = {
+  content: [{ required: true, message: '璇疯緭鍏�' }],
+
+  areaType: [{ required: true, message: '璇烽�夋嫨' }],
+  projectId: [{ required: true, message: '璇烽�夋嫨' }],
+  buildingId: [{ required: true, message: '璇烽�夋嫨' }],
+  floorId: [{ required: true, message: '璇烽�夋嫨' }],
+  roomId: [{ required: true, message: '璇烽�夋嫨' }],
+}
\ No newline at end of file

--
Gitblit v1.9.3