From 7470ad6bfa2f7d7be9c7d1e2d9c991094a3ad367 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期四, 28 十一月 2024 18:43:24 +0800
Subject: [PATCH] 提交

---
 admin/src/api/ywContractRevenue.js                        |   18 
 admin/src/views/contract/components/addPaymentBill.vue    |  297 ++++
 admin/src/views/contract/components/contractEdit.vue      |  714 +++++++--
 admin/src/views/finance/payments.vue                      |  106 +
 admin/src/api/customer.js                                 |   13 
 admin/package-lock.json                                   |   16 
 admin/src/views/contract/components/contractDetail.vue    |  330 ++++
 admin/src/views/finance/components/config.js              |   19 
 admin/src/views/finance/components/bullEdit.vue           |  331 ++--
 admin/src/views/finance/bull.vue                          |  130 +
 admin/src/api/house.js                                    |   18 
 admin/src/components/common/MemberSearch/src/index.vue    |  143 +-
 admin/src/views/finance/components/bullEditFu.vue         |  383 +++++
 admin/src/views/finance/components/selectHouse.vue        |  185 ++
 admin/src/api/bill.js                                     |    6 
 admin/src/api/project/ywProject.js                        |    6 
 admin/src/views/contract/components/terminateLease.vue    |  442 ++++++
 admin/src/views/finance/components/flowingWater.vue       |  260 +--
 admin/src/views/contract/components/addCollectionBill.vue |  315 ++++
 admin/src/views/contract/contractList.vue                 |  107 
 admin/.env.test                                           |    2 
 admin/src/api/company.js                                  |   13 
 admin/src/api/contract.js                                 |   38 
 admin/src/views/contract/components/config.js             |   20 
 admin/src/views/finance/components/bullDetail.vue         |  201 +-
 25 files changed, 3,224 insertions(+), 889 deletions(-)

diff --git a/admin/.env.test b/admin/.env.test
index 91990ae..c3d8b95 100644
--- a/admin/.env.test
+++ b/admin/.env.test
@@ -4,3 +4,5 @@
 # VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
 
 VUE_APP_API_URL  = 'http://192.168.0.162:10010/'
+
+# VUE_APP_API_URL  = 'http://192.168.0.136:10010/'
diff --git a/admin/package-lock.json b/admin/package-lock.json
index 70ff946..8cadb74 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -2917,7 +2917,7 @@
         },
         "ansi-styles": {
           "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "optional": true,
@@ -2927,7 +2927,7 @@
         },
         "chalk": {
           "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
           "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
           "dev": true,
           "optional": true,
@@ -2938,7 +2938,7 @@
         },
         "color-convert": {
           "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "optional": true,
@@ -2948,21 +2948,21 @@
         },
         "color-name": {
           "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true,
           "optional": true
         },
         "has-flag": {
           "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true,
           "optional": true
         },
         "loader-utils": {
           "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
           "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
           "dev": true,
           "optional": true,
@@ -2983,7 +2983,7 @@
         },
         "supports-color": {
           "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
           "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "optional": true,
@@ -2993,7 +2993,7 @@
         },
         "vue-loader-v16": {
           "version": "npm:vue-loader@16.8.3",
-          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
           "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
           "dev": true,
           "optional": true,
diff --git a/admin/src/api/bill.js b/admin/src/api/bill.js
index b5ca07f..e48cdfd 100644
--- a/admin/src/api/bill.js
+++ b/admin/src/api/bill.js
@@ -11,3 +11,9 @@
 export function create (data) {
   return request.post('/visitsAdmin/cloudService/business/ywContractBill/create', data)
 }
+
+// 杩愮淮鏀舵敮璐﹀彿淇℃伅琛� -- 鍒楄〃
+export function ywAccountList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywAccount/list', data)
+}
+
diff --git a/admin/src/api/company.js b/admin/src/api/company.js
new file mode 100644
index 0000000..832abb0
--- /dev/null
+++ b/admin/src/api/company.js
@@ -0,0 +1,13 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractBill/page', data, {
+    trim: true
+  })
+}
+
+// 鍒楄〃
+export function companyList (data) {
+  return request.post('/visitsAdmin/cloudService/business/company/list', data)
+}
diff --git a/admin/src/api/contract.js b/admin/src/api/contract.js
new file mode 100644
index 0000000..f8ff2ca
--- /dev/null
+++ b/admin/src/api/contract.js
@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContract/page', data, {
+    trim: true
+  })
+}
+
+// 鍒楄〃
+export function list (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContract/list', data)
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContract/create', data)
+}
+
+// 鏍规嵁鍙傛暟棰勭敓鎴愯处鍗曚俊鎭�
+export function getBillList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContract/getBillList', data)
+}
+
+// 鏍规嵁ID鏌ヨ
+export function getById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywContract/${id}`)
+}
+
+// 閫�绉�
+export function backRent (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContract/backRent', data)
+}
+
+// 鏍规嵁ID鏌ヨ
+export function getYwContractBillById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywContractBill/${id}`)
+}
diff --git a/admin/src/api/customer.js b/admin/src/api/customer.js
new file mode 100644
index 0000000..e57764c
--- /dev/null
+++ b/admin/src/api/customer.js
@@ -0,0 +1,13 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywCustomer/page', data, {
+    trim: true
+  })
+}
+
+// 鍒楄〃
+export function list (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywCustomer/list', data)
+}
diff --git a/admin/src/api/house.js b/admin/src/api/house.js
new file mode 100644
index 0000000..e08f321
--- /dev/null
+++ b/admin/src/api/house.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractBill/page', data, {
+    trim: true
+  })
+}
+
+// 鍒楄〃
+export function houseList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractRoom/list', data)
+}
+
+// 鍒楄〃
+export function getContractRoom (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractRoom/getContractRoom', data)
+}
diff --git a/admin/src/api/project/ywProject.js b/admin/src/api/project/ywProject.js
index bfb6927..4338e93 100644
--- a/admin/src/api/project/ywProject.js
+++ b/admin/src/api/project/ywProject.js
@@ -12,6 +12,12 @@
     trim: true
   })
 }
+// 椤圭洰鏍�
+export function tree (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywProject/tree', data, {
+    trim: true
+  })
+}
 // 瀵煎嚭Excel
 export function exportExcel (data) {
   return request.post('/visitsAdmin/cloudService/business/ywProject/exportExcel', data, {
diff --git a/admin/src/api/ywContractRevenue.js b/admin/src/api/ywContractRevenue.js
new file mode 100644
index 0000000..92abf72
--- /dev/null
+++ b/admin/src/api/ywContractRevenue.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractRevenue/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/ywContractRevenue/create', data)
+}
+
+// 鍏抽棴娴佹按
+export function close (id) {
+  return request.get(`/visitsAdmin/cloudService/business/ywContractRevenue/close?id=${id}`)
+}
diff --git a/admin/src/components/common/MemberSearch/src/index.vue b/admin/src/components/common/MemberSearch/src/index.vue
index f3db2c9..899b602 100644
--- a/admin/src/components/common/MemberSearch/src/index.vue
+++ b/admin/src/components/common/MemberSearch/src/index.vue
@@ -1,23 +1,57 @@
 <template>
-  <GlobalWindow title="閫夋嫨瀹㈡埛" width="1000px" @close="close" :visible.sync="isShowMemberList">
+  <GlobalWindow title="閫夋嫨瀹㈡埛" width="80%" :withFooter="false" @close="close" :visible.sync="isShowMemberList">
     <div>
       <div class="df_ac mb20">
         <el-input v-model="modalSearchValue" placeholder="璇疯緭鍏ュ鎴峰悕绉�" class="w400" @keyup.enter.native="queryList">
-          <!-- <el-button slot="append" icon="el-icon-search" @click="queryList()" /> -->
         </el-input>
         <el-button class="ml10" type="primary" @click="queryList()">鏌ヨ</el-button>
+        <el-button class="ml10" @click="clear()">閲嶇疆</el-button>
       </div>
       <el-table ref="table" v-loading="listLoading" :data="list" element-loading-text="Loading" border fit
         :header-row-class-name="'table-header'" class="doumee-element-table doumee-element-tableb"
         @row-click="rowClick">
-
-        <el-table-column align="center" label="瀹㈡埛绫诲瀷" prop="cardName" show-overflow-tooltip min-width="80" />
-        <el-table-column align="center" label="瀹㈡埛鍚嶇О" show-overflow-tooltip prop="remainingMoney" min-width="80" />
-        <el-table-column align="center" label="鑱旂郴浜�" show-overflow-tooltip prop="remainingGiveMoney" min-width="80" />
-        <el-table-column label="鑱旂郴鐢佃瘽" prop="createTime" min-width="100" align="center" />
-        <el-table-column label="缁熶竴淇$敤浠g爜" prop="createTime" min-width="120" align="center" />
-        <el-table-column label="钀ヤ笟鏈熼檺" prop="createTime" min-width="100" align="center" />
-        <el-table-column label="榛樿鍙戠エ绫诲瀷" prop="createTime" min-width="100" align="center" />
+        <el-table-column align="center" label="瀹㈡埛绫诲瀷" show-overflow-tooltip min-width="80">
+          <template slot-scope="{row}">
+            <span v-if="row.type === 0">涓汉</span>
+            <span v-if="row.type === 1">浼佷笟</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="瀹㈡埛鍚嶇О" show-overflow-tooltip prop="name" min-width="80" />
+        <el-table-column align="center" label="鑱旂郴浜�" show-overflow-tooltip prop="memberName" min-width="80" />
+        <el-table-column label="鑱旂郴鐢佃瘽" prop="memberPhone" min-width="100" align="center" />
+        <el-table-column label="缁熶竴淇$敤浠g爜" prop="creditCard" min-width="120" align="center">
+          <template slot-scope="{row}">
+            <div v-if="row.type === 1">
+              <span v-if="row.fpType === 0">澧炲�肩◣鏅�氬彂绁�</span>
+              <span v-else-if="row.fpType === 1">澧炲�肩◣涓撶敤鍙戠エ</span>
+              <span v-else>-</span>
+            </div>
+            <div v-else>-</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="钀ヤ笟鏈熼檺" prop="validity" min-width="100" align="center">
+          <template slot-scope="{row}">
+            <div v-if="row.type === 1">
+              <span>{{row.validity || '-'}}</span>
+            </div>
+            <div v-else>-</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="榛樿鍙戠エ绫诲瀷" min-width="100" align="center">
+          <template slot-scope="{row}">
+            <div v-if="row.type === 1">
+              <span v-if="row.fpType === 0">澧炲�肩◣鏅�氬彂绁�</span>
+              <span v-else-if="row.fpType === 1">澧炲�肩◣涓撶敤鍙戠エ</span>
+              <span v-else>-</span>
+            </div>
+            <div v-else>-</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" min-width="100" align="center">
+          <template slot-scope="{row}">
+            <span class="primaryColor cu" @click="selectItem(row)">閫夋嫨</span>
+          </template>
+        </el-table-column>
       </el-table>
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
     </div>
@@ -25,11 +59,8 @@
 </template>
 
 <script>
-import { memberList, memberDetailInfo } from '@/api'
+import { fetchList } from '@/api/customer'
 import GlobalWindow from '@/components/common/GlobalWindow'
-import dayjs from 'dayjs'
-// import { debounce } from '@/utils/debounce'
-
 import Pagination from '@/components/common/Pagination'
 export default {
   components: {
@@ -40,104 +71,70 @@
     isShowChooseBtn: {
       type: Boolean,
       default: () => true
-    },
-    type: { // (10: 鍟嗗搧鎶樻墸  20: 璁㈠満鎶樻墸 30: 闂ㄧエ鎶樻墸 40: 濂楅鎶樻墸 50锛氭椿鍔ㄦ姌鎵� 60锛氳绋嬫姌鎵�)
-      type: String,
-      default: 'default'
     }
   },
-  data() {
+  data () {
     return {
-      searchValue: '',
       isShowMemberList: false,
       modalSearchValue: '',
       list: [],
-      totalCount: 0,
       pagination: {
         pageSize: 10,
         page: 1,
         total: 0
       },
-      listLoading: false,
-
+      listLoading: false
     }
   },
-  created() {
-    // (10: 鍟嗗搧鎶樻墸  20: 璁㈠満鎶樻墸 30: 闂ㄧエ鎶樻墸 40: 濂楅鎶樻墸 50锛氭椿鍔ㄦ姌鎵� 60锛氳绋嬫姌鎵�)
-  },
   methods: {
-    clearSearch() {
-      this.searchValue = ''
+    open () {
       this.modalSearchValue = ''
+      this.filters = {}
+      this.pagination.page = 1
+      this.pagination.pageSize = 10
+      this.isShowMemberList = true
+      this.getList()
     },
-    handleMemberSelect(item) {
-      memberDetailInfo({ param: { memberId: item.id } }).then((res) => {
-        if (res.errorCode !== '000000') return
-        const obj = res.record || {}
-        obj.searchValue = this.searchValue
-        this.$emit('select', obj)
-      })
-    },
-    clear() {
-      this.searchValue = ''
-      setTimeout(() => {
-        this.$refs.searchValueRef.focus()
-      })
-      this.$emit('clear')
-    },
-    rowClick(item) {
-      memberDetailInfo({ param: { memberId: item.id } }).then((res) => {
-        if (res.errorCode !== '000000') return
-        const obj = res.record || {}
-        this.searchValue = obj.nickName
-        obj.searchValue = this.modalSearchValue
-        if (item.phone) {
-          this.searchValue += '-' + item.phone
-        }
-        if (item.number) {
-          this.searchValue += '锛�' + item.number + '锛�'
-        }
-        this.$emit('select', obj)
-      })
-      this.isShowMemberList = false
-    },
-    getList() {
+    getList () {
       const { pagination, modalSearchValue } = this
       this.listLoading = true
-      memberList({ pagination, param: { keyword: modalSearchValue } }).then((res) => {
+      fetchList({
+        capacity: pagination.pageSize,
+        page: pagination.page,
+        model: {
+          name: modalSearchValue
+        }
+      }).then((res) => {
         this.listLoading = false
-        if (res.errorCode !== '000000') return
-        this.list = res.recordList
+        this.list = res.records
         this.pagination.total = res.total || 0
-        this.totalCount = res.totalCount
       }, () => {
         this.listLoading = false
       })
     },
-    openModal() {
-      this.modalSearchValue = ''
-      // this.queryList()
-      this.isShowMemberList = true
+    selectItem (row) {
+      this.$emit('select', row)
+      this.isShowMemberList = false
     },
-    queryList() {
+    queryList () {
       this.pagination.page = 1
       this.getList()
     },
-    currentChange(val) {
+    currentChange (val) {
       this.pagination.page = val
       this.getList()
     },
-    clear() {
+    clear () {
       this.filters = {}
       this.pagination.pageSize = 10
       this.pagination.page = 1
       this.getList()
     },
-    handleSizeChange(capacity) {
+    handleSizeChange (capacity) {
       this.pagination.pageSize = capacity
       this.getList()
     },
-    close() {
+    close () {
       this.isShowMemberList = false
     }
   }
diff --git a/admin/src/views/contract/components/addCollectionBill.vue b/admin/src/views/contract/components/addCollectionBill.vue
new file mode 100644
index 0000000..1d4a3f5
--- /dev/null
+++ b/admin/src/views/contract/components/addCollectionBill.vue
@@ -0,0 +1,315 @@
+<template>
+    <GlobalWindow
+        width="100%"
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @close="close"
+        @confirm="confirm">
+        <div class="main">
+            <div class="main_content">
+                <el-form :model="form" label-position="top" ref="form" :rules="rules">
+                    <div class="head">
+                        <div class="m_title">鍩虹淇℃伅</div>
+                        <div class="tabs">
+                            <div class="tab" :class="{ active: form.feeType === 0 }" @click="timeTabClick(0)">鍛ㄦ湡璐圭敤</div>
+                            <div class="tab" :class="{ active: form.feeType === 1 }" @click="timeTabClick(1)">涓�娆℃�ц垂鐢�</div>
+                        </div>
+                    </div>
+                    <div class="list">
+                        <el-form-item label="鍏宠仈鍚堝悓" prop="contractCode">
+                            <el-input v-model="form.contractCode" disabled placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="浠樻鏂�" prop="renterName">
+                            <el-input v-model="form.renterName" disabled placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="璐圭敤绫诲瀷" prop="costType">
+                            <el-select v-model="form.costType" placeholder="璇烽�夋嫨">
+                                <el-option :value="0" label="绉熻祦璐�"></el-option>
+                                <el-option :value="1" label="鐗╀笟璐�"></el-option>
+                                <el-option :value="4" label="姘寸數璐�"></el-option>
+                                <el-option :value="5" label="鏉傞」璐�"></el-option>
+                                <el-option :value="6" label="鍏朵粬"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="璁¤垂鍛ㄦ湡" prop="date" v-if="form.feeType !== 1">
+                            <el-date-picker
+                                type="daterange"
+                                range-separator="鑷�"
+                                v-model="form.date"
+                                @change="changeDate"
+                                start-placeholder="寮�濮嬫棩鏈�"
+                                end-placeholder="缁撴潫鏃ユ湡"
+                                value-format="yyyy-MM-dd"
+                                placeholder="璇烽�夋嫨" />
+                        </el-form-item>
+                        <el-form-item label="搴旀敹閲戦" prop="receivableFee">
+                            <el-input v-model="form.receivableFee" placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="搴旀敹鏃ユ湡" prop="planPayDate">
+                            <el-date-picker type="date" v-model="form.planPayDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+                        </el-form-item>
+                        <el-form-item label="鎵�灞炲叕鍙�" prop="companyId">
+                            <el-select v-model="form.companyId" placeholder="璇烽�夋嫨" clearable>
+                                <el-option
+                                    v-for="(item, index) in comparyList"
+                                    :key="index"
+                                    :value="item.id"
+                                    :label="item.name" />
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item style="width: 100%;" label="璐﹀崟澶囨敞" prop="remark">
+                            <el-input type="textarea" :rows="5" v-model="form.remark" placeholder="璇疯緭鍏�" />
+                        </el-form-item>
+                    </div>
+                </el-form>
+            </div>
+        </div>
+    </GlobalWindow>
+</template>
+
+<script>
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import BaseOpera from '@/components/base/BaseOpera'
+  import { companyList } from '@/api/company'
+  import { mapState } from 'vuex'
+  export default {
+    name: 'addCollectionBill',
+    components: {
+      GlobalWindow
+    },
+    computed: {
+      ...mapState(['userInfo'])
+    },
+    extends: BaseOpera,
+    data () {
+      const validateArr = (rule, value, callback) => {
+        if (value.length === 0 || !value) {
+          callback(new Error('璇烽�夋嫨'));
+        } else {
+          callback();
+        }
+      };
+      return {
+        form: {
+          contractCode: '',
+          contractId: '',
+          costType: '',
+          renterName: '',
+          renterId: '',
+          remark: '',
+          startDate: '',
+          endDate: '',
+          price: 0,
+          receivableFeeCopy: '',
+          receivableFee: '',
+          feeType: 0,
+          planPayDate: '',
+          billType: 0,
+          billTypeCopy: 0,
+          date: []
+        },
+        rules: {
+          contractCode: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ],
+          renterName: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ],
+          costType: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          date: [
+            { validator: validateArr, trigger: 'blur' }
+          ],
+          receivableFee: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ],
+          planPayDate: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          companyId: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ]
+        },
+        comparyList: []
+      }
+    },
+    methods: {
+      open (title, target) {
+        this.title = title
+        this.getCompany()
+        this.visible = true
+        // 鏂板缓
+        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]
+          }
+        })
+      },
+      getCompany () {
+        companyList({ type: 2 })
+          .then(res => {
+            this.comparyList = res
+          })
+      },
+      timeTabClick (val) {
+        this.form.feeType = val
+        if (val === 1) {
+          this.form.startDate = ''
+          this.form.endDate = ''
+          this.date = []
+        }
+      },
+      changeDate (e) {
+        if (!e || e.length === 0) {
+          this.form.startDate = ''
+          this.form.endDate = ''
+        } else {
+          this.form.startDate = e[0]
+          this.form.endDate = e[1]
+        }
+      },
+      confirm () {
+        this.$refs.form.validate((valid) => {
+          if (!valid) return
+          let obj = JSON.parse(JSON.stringify(this.form))
+          obj.receivableFeeCopy = Number(obj.receivableFee)
+          if (obj.feeType === 0) {
+            obj.startDate = obj.startDate + ' 00:00:00'
+            obj.endDate = obj.endDate + ' 00:00:00'
+          } else {
+            obj.startDate = ''
+            obj.endDate = ''
+          }
+          obj.price = Number(obj.receivableFee)
+          obj.rowType = 1
+          obj.actReceivableFee = 0
+          this.$emit('getVal', obj)
+          this.visible = false
+        })
+      },
+      close () {
+        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;
+                    align-items: center;
+                    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/contract/components/addPaymentBill.vue b/admin/src/views/contract/components/addPaymentBill.vue
new file mode 100644
index 0000000..bb673a1
--- /dev/null
+++ b/admin/src/views/contract/components/addPaymentBill.vue
@@ -0,0 +1,297 @@
+<template>
+    <GlobalWindow
+        width="100%"
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @close="close"
+        @confirm="confirm">
+        <div class="main">
+            <div class="main_content">
+                <el-form :model="form" label-position="top" ref="form" :rules="rules">
+                    <div class="head">
+                        <div class="m_title">鍩虹淇℃伅</div>
+                    </div>
+                    <div class="list">
+                        <el-form-item label="鍏宠仈鍚堝悓" prop="contractCode">
+                            <el-input v-model="form.contractCode" disabled placeholder="璇疯緭鍏�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="鏀舵鏂�" prop="customerName">
+                            <el-input v-model="form.renterName" disabled placeholder="璇疯緭鍏�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="璐圭敤绫诲瀷" prop="costType">
+                            <el-select v-model="form.costType" placeholder="璇烽�夋嫨">
+                                <el-option :value="0" label="绉熻祦璐�"></el-option>
+                                <el-option :value="1" label="鐗╀笟璐�"></el-option>
+                                <el-option :value="4" label="姘寸數璐�"></el-option>
+                                <el-option :value="5" label="鏉傞」璐�"></el-option>
+                                <el-option :value="6" label="鍏朵粬"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="璁¤垂鍛ㄦ湡" prop="date">
+                            <el-date-picker
+                                type="daterange"
+                                range-separator="鑷�"
+                                v-model="form.date"
+                                @change="changeDate"
+                                start-placeholder="寮�濮嬫棩鏈�"
+                                end-placeholder="缁撴潫鏃ユ湡"
+                                value-format="yyyy-MM-dd"
+                                placeholder="璇烽�夋嫨" />
+                        </el-form-item>
+                        <el-form-item label="搴斾粯閲戦" prop="receivableFee">
+                            <el-input v-model="form.receivableFee" placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="搴斾粯鏃ユ湡" prop="planPayDate">
+                            <el-date-picker type="date" v-model="form.planPayDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+                        </el-form-item>
+                        <el-form-item label="鎵�灞炲叕鍙�" prop="companyId">
+                            <el-select v-model="form.companyId" placeholder="璇烽�夋嫨" clearable>
+                                <el-option
+                                    v-for="(item, index) in comparyList"
+                                    :key="index"
+                                    :value="item.id"
+                                    :label="item.name" />
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item style="width: 100%;" label="璐﹀崟澶囨敞" prop="remark">
+                            <el-input type="textarea" :rows="5" v-model="form.remark" placeholder="璇疯緭鍏�" />
+                        </el-form-item>
+                    </div>
+                </el-form>
+            </div>
+        </div>
+    </GlobalWindow>
+</template>
+
+<script>
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import BaseOpera from '@/components/base/BaseOpera'
+  import { companyList } from '@/api/company'
+  import { mapState } from 'vuex'
+  export default {
+    name: 'addPaymentBill',
+    components: {
+      GlobalWindow
+    },
+    computed: {
+      ...mapState(['userInfo'])
+    },
+    extends: BaseOpera,
+    data () {
+      const validateArr = (rule, value, callback) => {
+        if (value.length === 0 || !value) {
+          callback(new Error('璇烽�夋嫨'));
+        } else {
+          callback();
+        }
+      };
+      return {
+        form: {
+          contractCode: '',
+          contractId: '',
+          costType: '',
+          renterName: '',
+          renterId: '',
+          remark: '',
+          startDate: '',
+          endDate: '',
+          price: 0,
+          receivableFeeCopy: '',
+          receivableFee: '',
+          planPayDate: '',
+          billType: 1,
+          billTypeCopy: 1,
+          date: []
+        },
+        rules: {
+          contractCode: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ],
+          renterName: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ],
+          costType: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          date: [
+            { validator: validateArr, trigger: 'blur' }
+          ],
+          receivableFee: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ],
+          planPayDate: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          companyId: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ]
+        },
+        comparyList: []
+      }
+    },
+    methods: {
+      open (title, target) {
+        this.title = title
+        this.getCompanyList()
+        this.visible = true
+        // 鏂板缓
+        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]
+          }
+        })
+      },
+      getCompanyList () {
+        companyList({ type: 2 })
+          .then(res => {
+            this.comparyList = res
+          })
+      },
+      changeDate (e) {
+        if (!e || e.length === 0) {
+          this.form.startDate = ''
+          this.form.endDate = ''
+        } else {
+          this.form.startDate = e[0]
+          this.form.endDate = e[1]
+        }
+      },
+      confirm () {
+        this.$refs.form.validate((valid) => {
+          if (!valid) return
+          let obj = JSON.parse(JSON.stringify(this.form))
+          obj.receivableFeeCopy = Number(obj.receivableFee)
+          obj.startDate = obj.startDate + ' 00:00:00'
+          obj.endDate = obj.endDate + ' 00:00:00'
+          obj.price = Number(obj.receivableFee)
+          obj.rowType = 1
+          obj.actReceivableFee = 0
+          this.$emit('getVal', obj)
+          this.visible = false
+        })
+      },
+      close () {
+        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;
+                    align-items: center;
+                    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/contract/components/config.js b/admin/src/views/contract/components/config.js
index 7d3be5d..cc65589 100644
--- a/admin/src/views/contract/components/config.js
+++ b/admin/src/views/contract/components/config.js
@@ -1,3 +1,19 @@
 export const rules = {
-  name: [{ required: true, message: '璇疯緭鍏�' }]
-}
\ No newline at end of file
+  type: [{ required: true, message: '璇烽�夋嫨' }],
+  code: [{ required: true, message: '璇疯緭鍏�' }],
+  userId: [{ required: true, message: '璇烽�夋嫨' }],
+  signDate: [{ required: true, message: '璇烽�夋嫨' }],
+  startDate: [{ required: true, message: '璇烽�夋嫨' }],
+  endDate: [{ required: true, message: '璇烽�夋嫨' }],
+  projectId: [{ required: true, message: '璇烽�夋嫨' }],
+  roundedUp: [{ required: true, message: '璇烽�夋嫨' }],
+  companyId: [{ required: true, message: '璇烽�夋嫨' }],
+  renterName: [{ required: true, message: '璇烽�夋嫨' }],
+  memberName: [{ required: true, message: '璇烽�夋嫨' }],
+  zlDeposit: [{ required: true, message: '璇疯緭鍏�' }],
+  zlPayType: [{ required: true, message: '璇烽�夋嫨' }],
+  zlDate: [{ required: true, message: '璇烽�夋嫨' }],
+  wyDeposit: [{ required: true, message: '璇疯緭鍏�' }],
+  wyPayType: [{ required: true, message: '璇烽�夋嫨' }],
+  wyDate: [{ required: true, message: '璇烽�夋嫨' }]
+}
diff --git a/admin/src/views/contract/components/contractDetail.vue b/admin/src/views/contract/components/contractDetail.vue
index f8504a5..d7beef3 100644
--- a/admin/src/views/contract/components/contractDetail.vue
+++ b/admin/src/views/contract/components/contractDetail.vue
@@ -1,140 +1,362 @@
 <template>
-  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @close="close"
     @confirm="confirm">
-    <div class="home_title">
+    <div class="home_title" v-if="info">
       <div class="left">
-        <span class="mr10">鍗曚綅鍚嶇О锛歺xx</span>
-        <span class="status">status</span>
+        <span class="mr10">鍗曚綅鍚嶇О锛歿{info.renterName}}</span>
+        <el-tag type="success" v-if="info.status === 0">寰呮墽琛�</el-tag>
+        <el-tag type="success" v-if="info.status === 1">鎵ц涓�</el-tag>
+        <el-tag type="success" v-if="info.status === 2">宸插埌鏈�</el-tag>
+        <el-tag type="success" v-if="info.status === 3">宸查��绉�</el-tag>
       </div>
-      <el-button plain type="danger">閫�绉�</el-button>
+      <el-button plain type="danger" v-if="[0, 1, 2].includes(info.status)" @click="refund">閫�绉�</el-button>
     </div>
-    <div class="remark">鍚堝悓鎽樿锛歺xxx</div>
+    <div class="remark" v-if="info">{{info.remark}}</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 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="main" v-if="activeTabs === 0 && info">
       <div class="title">鍩虹淇℃伅</div>
       <div class="list">
         <div class="item">
           <div class="la">鍚堝悓缂栧彿</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.code }}</div>
         </div>
         <div class="item">
           <div class="la">缁忓姙浜�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.userName }}</div>
         </div>
         <div class="item">
           <div class="la">鍒涘缓浜�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.creatorName }}</div>
         </div>
         <div class="item">
           <div class="la">鍚堝悓绉熻祦鏁�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.totalArea }}</div>
         </div>
         <div class="item">
           <div class="la">鎵�灞炲叕鍙�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.companyName }}</div>
         </div>
         <div class="item">
           <div class="la">绛捐鏃ユ湡</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.signDate }}</div>
         </div>
         <div class="item">
           <div class="la">寮�濮嬫棩鏈�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.startDate }}</div>
         </div>
         <div class="item">
           <div class="la">缁撴潫鏃ユ湡</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.endDate }}</div>
         </div>
         <div class="item">
           <div class="la">鎵�灞為」鐩�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.projectName }}</div>
         </div>
         <div class="item">
           <div class="la">缁撴灉鍙栨暣(鍥涜垗浜斿叆)</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.roundedUp === 1 ? '鏄�' : '鍚�' }}</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>
+        <el-table :data="info.roomList" stripe>
+          <el-table-column prop="projectName" label="椤圭洰鍚嶇О" show-overflow-tooltip />
+          <el-table-column prop="buildingName" label="妤煎畤鍚嶇О" show-overflow-tooltip />
+          <el-table-column prop="" label="妤煎眰/鎴垮彿" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              {{row.floorName}}/{{row.code}}
+            </template>
+          </el-table-column>
+          <el-table-column prop="area" label="闈㈢Н" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              {{row.area}}銕�
+            </template>
+          </el-table-column>
+        </el-table>
       </div>
       <div class="title">绉熷淇℃伅</div>
       <div class="list">
         <div class="item">
           <div class="la">绉熷</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.renterName }}</div>
         </div>
         <div class="item">
           <div class="la">缁忓姙浜�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.userName }}</div>
         </div>
       </div>
-      <div class="title">绉熻祦鏉℃</div>
-      <div class="list">
+      <div class="title" v-if="info.type === 2 || info.type === 0">绉熻祦鏉℃</div>
+      <div class="list" style="background: #F7F7F7; padding: 15px 20px;" v-if="info.type === 2 || info.type === 0">
         <div class="item">
           <div class="la">鎶奸噾閲戦</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.zlDeposit }}</div>
         </div>
         <div class="item">
           <div class="la">浠樻鏂瑰紡</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val" v-if="info.zlPayType === 0">涓�娆℃�т粯娆�</div>
+          <div class="val" v-if="info.zlPayType === 1">姣忎笁涓湀涓�浠�</div>
+          <div class="val" v-if="info.zlPayType === 2">鍏釜鏈堜竴浠�</div>
+          <div class="val" v-if="info.zlPayType === 3">涓�骞翠竴浠�</div>
         </div>
         <div class="item">
           <div class="la">鍏嶇鏈�</div>
-          <div class="val">{{ info.aaa }}</div>
+          <div class="val">{{ info.zlFreeStartDate }} ~ {{ info.zlFreeEndDate }}</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 :data="info.zlDetailList" stripe style="margin-bottom: 20px;" v-if="info.type === 2 || info.type === 0">
+        <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="price" label="鍚堝悓鍗曚环" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="advanceDays" label="浠樻鎻愬墠澶╂暟" min-width="100" show-overflow-tooltip />
+      </el-table>
+      <div class="title" v-if="info.type === 1 || info.type === 0">鐗╀笟璐规潯娆�</div>
+      <div class="list" style="background: #F7F7F7; padding: 15px 20px;" v-if="info.type === 1 || info.type === 0">
+        <div class="item">
+          <div class="la">鎶奸噾閲戦</div>
+          <div class="val">{{ info.wyDeposit }}</div>
+        </div>
+        <div class="item">
+          <div class="la">浠樻鏂瑰紡</div>
+          <div class="val" v-if="info.wyPayType === 0">涓�娆℃�т粯娆�</div>
+          <div class="val" v-if="info.wyPayType === 1">姣忎笁涓湀涓�浠�</div>
+          <div class="val" v-if="info.wyPayType === 2">鍏釜鏈堜竴浠�</div>
+          <div class="val" v-if="info.wyPayType === 3">涓�骞翠竴浠�</div>
+        </div>
+        <div class="item">
+          <div class="la">鍏嶇鏈�</div>
+          <div class="val">{{ info.wyFreeStartDate }} ~ {{ info.wyFreeEndDate }}</div>
+        </div>
+      </div>
+      <el-table :data="info.wyDetailList" stripe style="margin-bottom: 20px;" v-if="info.type === 1 || info.type === 0">
+        <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="price" label="鍚堝悓鍗曚环" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="advanceDays" label="浠樻鎻愬墠澶╂暟" min-width="100" show-overflow-tooltip />
+      </el-table>
+      <div class="title">鍚堝悓闄勪欢</div>
+      <div class="list">
+        <el-table :data="info.fileList" stripe>
+          <el-table-column prop="name" label="闄勪欢鍚嶇О" show-overflow-tooltip />
+          <el-table-column prop="userName" label="鎿嶄綔浜�" show-overflow-tooltip />
+          <el-table-column prop="createDate" label="鎿嶄綔鏃堕棿" show-overflow-tooltip />
+        </el-table>
+      </div>
+    </div>
+    <div class="main" v-if="activeTabs === 1 && info">
+      <el-radio-group v-model="type" @change="changeType" style="margin-bottom: 20px;">
+        <el-radio-button :label="0">鏀舵璐﹀崟</el-radio-button>
+        <el-radio-button :label="1">浠樻璐﹀崟</el-radio-button>
+      </el-radio-group>
+      <el-table
+        :data="tableData"
+        border
+        v-loading="loading"
+        style="width: 100%">
+        <el-table-column
+          label="璐圭敤绫诲瀷">
+          <template slot-scope="{row}">
+            <span v-if="row.costType === 0">绉熻祦璐�</span>
+            <span v-if="row.costType === 1">鐗╀笟璐�</span>
+            <span v-if="row.costType === 2">绉熻祦鎶奸噾</span>
+            <span v-if="row.costType === 3">鐗╀笟鎶奸噾</span>
+            <span v-if="row.costType === 4">姘寸數璐�</span>
+            <span v-if="row.costType === 5">鏉傞」璐�</span>
+            <span v-if="row.costType === 6">鍏朵粬</span>
+            <span v-if="row.costType === 7">淇濊瘉閲�</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="totleFee"
+          label="璐﹀崟閲戦">
+        </el-table-column>
+        <el-table-column
+          prop="receivableFee"
+          label="搴旀敹閲戦">
+        </el-table-column>
+        <el-table-column
+          prop="actReceivableFee"
+          label="瀹炴敹閲戦">
+        </el-table-column>
+        <el-table-column
+          prop="needReceivableFee"
+          label="闇�鏀堕噾棰�">
+        </el-table-column>
+        <el-table-column
+          label="璐﹀崟鏉ユ簮">
+          <template slot-scope="{row}">
+            <span v-if="row.type === 0">鍚堝悓璐﹀崟</span>
+            <span v-if="row.type === 1">鑷缓璐﹀崟</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="璁¤垂鍛ㄦ湡">
+          <template slot-scope="{row}">
+            {{ row.startDate }} ~ {{ row.endDate }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="planPayDate"
+          label="搴旀敹鏃ユ湡">
+        </el-table-column>
+        <el-table-column
+          label="鏄惁閫炬湡">
+          <template slot-scope="{row}">
+            <span v-if="row.isOverdue === 0">鍚�</span>
+            <span v-if="row.isOverdue === 1">鏄�</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          fixed="right"
+          label="鐘舵��">
+          <template slot-scope="{row}">
+            <span v-if="row.payStatus === 0">寰呮敹娆�</span>
+            <span v-if="row.payStatus === 1">宸茬粨娓�</span>
+            <span v-if="row.payStatus === 2">閮ㄥ垎缁撴竻</span>
+            <span v-if="row.payStatus === 3">寰呬粯娆�</span>
+            <span v-if="row.payStatus === 4">寰呴��娆�</span>
+            <span v-if="row.payStatus === 5">宸插叧闂�</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page="page"
+        :page-sizes="[10, 15, 20, 25]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+    <div class="main" v-if="activeTabs === 2 && info">
+      <div class="title">鎿嶄綔璁板綍</div>
+      <el-table
+        :data="info.logList"
+        border
+        style="width: 100%">
+        <el-table-column
+          prop="param1"
+          label="鎿嶄綔浜�">
+        </el-table-column>
+        <el-table-column
+          prop="createDate"
+          label="鎿嶄綔鏃堕棿">
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔">
+          <template slot-scope="{row}">
+            <span v-if="row.objType === 0">宸ュ崟鍒涘缓</span>
+            <span v-if="row.objType === 1">鎸囨淳</span>
+            <span v-if="row.objType === 2">澶勭悊</span>
+            <span v-if="row.objType === 3">鍚堝悓鍒涘缓</span>
+            <span v-if="row.objType === 4">鍚堝悓鍙樻洿</span>
+            <span v-if="row.objType === 5">鍚堝悓閫�绉�</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="content"
+          label="鎿嶄綔鍐呭">
+        </el-table-column>
       </el-table>
     </div>
+    <!--  閫�绉�  -->
+    <TerminateLease ref="terminateLease" @success="getData" />
   </GlobalWindow>
 </template>
 
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
+import TerminateLease from './terminateLease'
+import { getById } from '@/api/contract'
+import { fetchList } from '@/api/bill'
 export default {
   components: {
-    GlobalWindow
+    GlobalWindow,
+    TerminateLease
   },
   extends: BaseOpera,
   data() {
     return {
       id: '',
       visible: false,
-      activeTabs: '',
-      info: {}
+      activeTabs: 0,
+      type: 0,
+      info: null,
+      pageSize: 10,
+      page: 1,
+      total: 0,
+      tableData: [],
+      
+      loading: false
     }
   },
   methods: {
+    open (title, id) {
+      this.title = title
+      this.activeTabs = 0
+      this.type = 0
+      this.page = 1
+      this.pageSize = 10
+      this.tableData = []
+      this.id = id
+      this.getData()
+    },
+    getData () {
+      getById(this.id)
+        .then(res => {
+          this.info = res
+          this.getList()
+          this.visible = true
+        })
+    },
+    refund () {
+      this.$refs.terminateLease.open('鏂板缓閫�绉熷崗璁�', JSON.parse(JSON.stringify(this.info)))
+    },
+    getList () {
+      this.loading = true
+      fetchList({
+        capacity: this.pageSize,
+        page: this.page,
+        model: {
+          billType: this.type,
+          contractId: this.info.id
+        }
+      }).then(res => {
+        this.loading = false
+        this.tableData = res.records
+        this.total = res.total
+      })
+    },
+    changeType (e) {
+      console.log(e)
+      this.type = e
+      this.page = 1
+      this.pageSize = 10
+      this.tableData = []
+      this.getList()
+    },
     tabsClick(val) {
       this.activeTabs = val
     },
     getDetail() {
 
+    },
+    handleSizeChange (e) {
+      this.pageSize = e
+      this.getList()
+    },
+    handleCurrentChange (e) {
+      this.page = e
+      this.getList()
     }
   }
 }
@@ -207,9 +429,9 @@
   .list {
     display: flex;
     flex-wrap: wrap;
-    background: #F7F7F7;
+    /*background: #F7F7F7;*/
     border-radius: 2px;
-    padding: 15px 20px;
+    /*padding: 15px 20px;*/
     margin-bottom: 20px;
 
     .item {
@@ -218,7 +440,7 @@
 
       .la {
         color: #7f7f7f;
-        margin-top: 2px;
+        margin-bottom: 10px;
       }
     }
   }
diff --git a/admin/src/views/contract/components/contractEdit.vue b/admin/src/views/contract/components/contractEdit.vue
index 13e6378..d98469e 100644
--- a/admin/src/views/contract/components/contractEdit.vue
+++ b/admin/src/views/contract/components/contractEdit.vue
@@ -1,75 +1,79 @@
 <template>
-  <GlobalWindow width="1000px" :title="title" :visible.sync="showModal" :confirm-working="isWorking" @close="close"
+  <GlobalWindow width="100%" :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
     @confirm="confirm">
     <div class="tabs">
-      <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">1銆佸熀鏈俊鎭�</div>
-      <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">2銆佽垂鐢ㄦ潯娆�</div>
+      <div class="tab" :class="{ active: activeTabs === 0 }" @click="tabsClick(0)">1銆佸熀鏈俊鎭�</div>
+      <div class="tab" :class="{ active: activeTabs === 1 }" @click="tabsClick(1)">2銆佽垂鐢ㄦ潯娆�</div>
     </div>
-    <template v-if="activeTabs == 0">
+    <div v-show="activeTabs === 0">
       <div class="main">
         <div class="main_content">
-          <el-form :model="param" ref="paramRef" :rules="rules">
+          <el-form :model="form" ref="form" :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 v-model="form.type" placeholder="璇烽�夋嫨" @change="changeType">
+                  <el-option v-for="(item, index) in types" :key="index" :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-input v-model="form.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-form-item label="缁忓姙浜�" prop="userId">
+                <el-select v-model="form.userId" filterable placeholder="璇烽�夋嫨">
+                  <el-option v-for="(item, index) in agentList" :key="index" :value="item.id" :label="item.realname"></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 label="鍚堝悓绛捐鏃ユ湡" prop="signDate">
+                <el-date-picker type="date" v-model="form.signDate" 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 label="鍚堝悓寮�濮嬫棩鏈�" prop="startDate">
+                <el-date-picker type="date" v-model="form.startDate" 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 label="鍚堝悓缁撴潫鏃ユ湡" prop="endDate">
+                <el-date-picker type="date" v-model="form.endDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
               </el-form-item>
-              <el-form-item label="褰掑睘椤圭洰" prop="">
-                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
-                  <el-option v-for="item in projectList" :value="item.id" :label="item.name"></el-option>
+              <el-form-item label="褰掑睘椤圭洰" prop="projectId">
+                <el-select v-model="form.projectId" placeholder="璇烽�夋嫨">
+                  <el-option v-for="(item, index) in projectList" :key="index" :value="item.id" :label="item.name"></el-option>
                 </el-select>
               </el-form-item>
-              <el-form-item label="缁撴灉鍙栨暣(鍥涜垗浜斿叆)" prop="">
-                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
+              <el-form-item label="缁撴灉鍙栨暣(鍥涜垗浜斿叆)" prop="roundedUp">
+                <el-select v-model="form.roundedUp" placeholder="璇烽�夋嫨">
                   <el-option :value="0" label="鍚�"></el-option>
                   <el-option :value="1" label="鏄�"></el-option>
                 </el-select>
               </el-form-item>
-              <el-form-item label="鎵�灞炲叕鍙�" prop="">
-                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
-                  <el-option v-for="item in comparyList" :value="item.id" :label="item.name"></el-option>
+              <el-form-item label="鎵�灞炲叕鍙�" prop="companyId">
+                <el-select v-model="form.companyId" placeholder="璇烽�夋嫨">
+                  <el-option v-for="(item, index) in comparyList" :key="index" :value="item.id" :label="item.name"></el-option>
                 </el-select>
               </el-form-item>
             </div>
             <div class="m_title">绉熷淇℃伅</div>
             <div class="list">
-              <el-form-item label="绉熷" prop="">
-                <el-button @click="handleRent" type="primary">閫夋嫨绉熷</el-button>
-                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
-                  <el-option v-for="item in renterList" :value="item.id" :label="item.name"></el-option>
-                </el-select>
+              <el-form-item label="绉熷" prop="renterName">
+                <div @click="handleRent">
+                  <el-input v-model="form.renterName" readonly placeholder="璇风偣鍑婚�夋嫨绉熷" />
+                </div>
               </el-form-item>
-              <el-form-item label="鑱旂郴浜�" prop="">
-                <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable>
-                  <el-option v-for="item in contacts" :value="item.id" :label="item.name"></el-option>
-                </el-select>
+              <el-form-item label="鑱旂郴浜�" prop="memberName">
+                <el-input v-model="form.memberName" readonly 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 />
+          <el-tree
+            :data="houseList"
+            show-checkbox
+            node-key="idd"
+            @check="checkHouseRoom"
+            :default-expanded-keys="ids"
+            :default-checked-keys="ids"
+            :props="{ children: 'projectDataVOList', label: 'name' }">
+          </el-tree>
         </div>
       </div>
       <div class="file_wrap">
@@ -80,75 +84,184 @@
             <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>
+        <el-table :data="form.fileList" stripe>
+          <el-table-column prop="originname" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip />
+          <el-table-column prop="userName" label="鎿嶄綔浜�" align="center" min-width="100" show-overflow-tooltip />
+          <el-table-column prop="createTime" label="鎿嶄綔鏃堕棿" align="center" min-width="100" show-overflow-tooltip />
+          <el-table-column label="鎿嶄綔" align="center" min-width="100">
+            <template slot-scope="{ row }">
+              <span class="cu red" @click="dele(row.imgaddr)">鍒犻櫎</span>
             </template>
           </el-table-column>
         </el-table>
       </div>
-    </template>
-    <template v-if="activeTabs == 1">
+    </div>
+    <div v-show="activeTabs === 1">
       <div class="tabs cost_tabs">
-        <div class="tab" :class="{ active: cactiveTabs == 0 }" @click="ctabsClick(0)">绉熻祦鏉℃</div>
-        <div class="tab" :class="{ active: cactiveTabs == 1 }" @click="ctabsClick(1)">鐗╀笟鏉℃</div>
+        <div class="tab" :class="{ active: cactiveTabs === 0 }" @click="ctabsClick(0)" v-if="[0,2].includes(form.type)">绉熻祦鏉℃</div>
+        <div class="tab" :class="{ active: cactiveTabs === 1 }" @click="ctabsClick(1)" v-if="[0,1].includes(form.type)">鐗╀笟鏉℃</div>
       </div>
-      <div class="main">
-        <div class="main_content">
-          <el-form :model="paramCost" ref="paramCostRef" :rules="rules">
-            <div class="m_title">绉熻祦淇℃伅</div>
-            <div class="list">
-              <el-form-item label="鎶奸噾閲戦(鍏�)" prop="type">
-                <el-input v-model="paramCost.code" placeholder="璇疯緭鍏�" v-trim />
-              </el-form-item>
-              <el-form-item label="浠樻鏂瑰紡" prop="code">
-                <el-select v-model="paramCost.type" placeholder="璇烽�夋嫨" clearable>
-                  <el-option v-for="item in payMethods" :value="item.value" :label="item.name"></el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="鍏嶇鏈�" prop="aaa">
-                <el-date-picker type="daterange" v-model="paramCost.getDate" value-format="yyyy-MM-dd"
-                  placeholder="璇烽�夋嫨" />
-              </el-form-item>
-            </div>
-            <div class="m_title">绉熻祦鏉℃</div>
-            <div class="list">
-              <el-form-item label="璧峰鏃ユ湡" prop="">
-                <el-date-picker type="date" v-model="paramCost.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
-              </el-form-item>
-              <el-form-item label="鍚堝悓鍗曚环" prop="">
-                <el-input placeholder="璇疯緭鍏ュ唴瀹�" v-model="paramCost.aaa">
-                  <el-select v-model="paramCost.ddd" slot="append" placeholder="璇烽�夋嫨" clearable>
-                    <el-option v-for="item in unitOps" :value="item.value" :label="item.name"></el-option>
+      <!--   绉熻祦鏉℃   -->
+      <div v-show="cactiveTabs === 0">
+        <div class="main">
+          <div class="main_content">
+            <el-form :model="form" ref="paramCostRef" :rules="rules">
+              <div class="m_title">绉熻祦淇℃伅</div>
+              <div class="list">
+                <el-form-item label="鎶奸噾閲戦(鍏�)" prop="zlDeposit">
+                  <el-input v-model="form.zlDeposit" placeholder="璇疯緭鍏�" v-trim />
+                </el-form-item>
+                <el-form-item label="浠樻鏂瑰紡" prop="zlPayType">
+                  <el-select v-model="form.zlPayType" placeholder="璇烽�夋嫨">
+                    <el-option v-for="(item, index) in payMethods" :key="index" :value="item.value" :label="item.name"></el-option>
                   </el-select>
-                </el-input>
-              </el-form-item>
-              <el-form-item label="浠樻鎻愬墠澶╂暟" prop="">
-                <el-input v-model="paramCost.aaa" placeholder="璇疯緭鍏�" v-trim />
-              </el-form-item>
-            </div>
-          </el-form>
+                </el-form-item>
+                <el-form-item label="鍏嶇鏈�" prop="zlDate">
+                  <el-date-picker type="daterange" v-model="form.zlDate" @change="getZLDate" value-format="yyyy-MM-dd"
+                    placeholder="璇烽�夋嫨" />
+                </el-form-item>
+              </div>
+              <div class="m_title">
+                <span>绉熻祦鏉℃</span>
+                <el-button type="text" size="medium" @click="addZl">澧炲姞</el-button>
+              </div>
+              <div class="list">
+                <template v-for="(item, index) in form.zlDetailList" :key="index">
+                  <el-form-item label="璧峰鏃ユ湡" prop="time">
+                    <el-date-picker type="daterange" v-model="item.time" @change="getDate1($event, index)" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+                  </el-form-item>
+                  <el-form-item label="鍚堝悓鍗曚环" prop="price">
+                    <el-input placeholder="璇疯緭鍏�" v-model="item.price">
+                      <el-select v-model="item.circleType" slot="append" placeholder="璇烽�夋嫨">
+                        <el-option v-for="(item, index) in unitOps" :key="index" :value="item.value" :label="item.name"></el-option>
+                      </el-select>
+                    </el-input>
+                  </el-form-item>
+                  <el-form-item label="浠樻鎻愬墠澶╂暟" prop="advanceDays">
+                    <div style="display: flex; align-items: center; justify-content: space-between;">
+                      <el-input v-model="item.advanceDays" placeholder="璇疯緭鍏�" v-trim />
+                      <el-link :underline="false" type="danger" @click="deleZl(index)" style="margin-left: 20px; flex-shrink: 0;">鍒犻櫎</el-link>
+                    </div>
+                  </el-form-item>
+                </template>
+              </div>
+            </el-form>
+          </div>
+        </div>
+        <el-button style="width: 100%;height: 48px;" type="primary" plain @click="generateZL">鐢熸垚璐﹀崟鏄庣粏</el-button>
+        <el-table :data="zlList" class="mt20" stripe>
+          <el-table-column label="璐圭敤绫诲瀷" align="center" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              <span v-if="row.costType === 0">绉熻祦璐�</span>
+              <span v-if="row.costType === 1">鐗╀笟璐�</span>
+              <span v-if="row.costType === 2">绉熻祦鎶奸噾</span>
+              <span v-if="row.costType === 3">鐗╀笟鎶奸噾</span>
+              <span v-if="row.costType === 4">姘寸數璐�</span>
+              <span v-if="row.costType === 5">鏉傞」璐�</span>
+              <span v-if="row.costType === 6">鍏朵粬</span>
+              <span v-if="row.costType === 7">淇濊瘉閲�</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏈熸暟" align="center" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              <el-tag type="success">{{row.sortnum}}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍖洪棿" align="center" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              {{row.startDate}} ~ {{row.endDate}}
+            </template>
+          </el-table-column>
+          <el-table-column prop="planPayDate" label="浠樻鏃�" align="center" show-overflow-tooltip />
+          <el-table-column prop="receivableFee" label="搴旀敹" align="center" show-overflow-tooltip />
+        </el-table>
+        <div class="total">
+          <span>鎬昏</span>
+          <div>璐圭敤搴旀敹鎬昏锛歿{zlPrice}}锛屾娂閲戝簲鏀舵�昏锛歿{form.zlDeposit}}</div>
         </div>
       </div>
-      <el-button style="width: 100%;height: 48px;" type="primary" plain>鐢熸垚璐﹀崟鏄庣粏</el-button>
-      <el-table :data="paramCost.list" class="mt20" stripe>
-        <el-table-column prop="" label="璐圭敤绫诲瀷" align="center" width="160px" show-overflow-tooltip />
-        <el-table-column prop="" label="鎸囨暟" align="center" min-width="100" show-overflow-tooltip />
-        <el-table-column prop="" label="鍖洪棿" align="center" min-width="100" show-overflow-tooltip />
-        <el-table-column prop="" label="浠樻鏃�" align="center" min-width="100" show-overflow-tooltip />
-        <el-table-column prop="" label="搴旀敹" align="center" min-width="100" show-overflow-tooltip />
-      </el-table>
-      <div class="total">
-        <span>鎬昏</span>
-        <div>璐圭敤搴旀敹鎬昏锛氾紝鎶奸噾搴旀敹鎬昏锛�</div>
+      <!--   鐗╀笟鏉℃   -->
+      <div v-show="cactiveTabs === 1">
+        <div class="main">
+          <div class="main_content">
+            <el-form :model="form" ref="paramCostRef1" :rules="rules">
+              <div class="m_title">鐗╀笟淇℃伅</div>
+              <div class="list">
+                <el-form-item label="鐗╀笟鎶奸噾" prop="wyDeposit">
+                  <el-input v-model="form.wyDeposit" placeholder="璇疯緭鍏�" v-trim />
+                </el-form-item>
+                <el-form-item label="浠樻鏂瑰紡" prop="wyPayType">
+                  <el-select v-model="form.wyPayType" placeholder="璇烽�夋嫨">
+                    <el-option v-for="(item, index) in payMethods" :key="index" :value="item.value" :label="item.name"></el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item label="鍏嶇鏈�" prop="wyDate">
+                  <el-date-picker type="daterange" v-model="form.wyDate" @change="getWYDate" value-format="yyyy-MM-dd"
+                    placeholder="璇烽�夋嫨" />
+                </el-form-item>
+              </div>
+              <div class="m_title">
+                <span>鐗╀笟鏉℃</span>
+                <el-button type="text" size="medium" @click="addWy">澧炲姞</el-button>
+              </div>
+              <div class="list">
+                <template v-for="(item, index) in form.wyDetailList" :key="index">
+                  <el-form-item label="璧峰鏃ユ湡" prop="time">
+                    <el-date-picker type="daterange" v-model="item.time" @change="getDate2($event, index)" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+                  </el-form-item>
+                  <el-form-item label="鍚堝悓鍗曚环" prop="price">
+                    <el-input placeholder="璇疯緭鍏�" v-model="item.price">
+                      <el-select v-model="item.circleType" slot="append" placeholder="璇烽�夋嫨">
+                        <el-option v-for="(item, index) in unitOps" :key="index" :value="item.value" :label="item.name"></el-option>
+                      </el-select>
+                    </el-input>
+                  </el-form-item>
+                  <el-form-item label="浠樻鎻愬墠澶╂暟" prop="advanceDays">
+                    <div style="display: flex; align-items: center; justify-content: space-between;">
+                      <el-input v-model="item.advanceDays" placeholder="璇疯緭鍏�" v-trim />
+                      <el-link :underline="false" type="danger" @click="deleWy(index)" style="margin-left: 20px; flex-shrink: 0;">鍒犻櫎</el-link>
+                    </div>
+                  </el-form-item>
+                </template>
+              </div>
+            </el-form>
+          </div>
+        </div>
+        <el-button style="width: 100%;height: 48px;" type="primary" plain @click="generateWY">鐢熸垚璐﹀崟鏄庣粏</el-button>
+        <el-table :data="wyList" class="mt20" stripe>
+          <el-table-column label="璐圭敤绫诲瀷" align="center" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              <span v-if="row.costType === 0">绉熻祦璐�</span>
+              <span v-if="row.costType === 1">鐗╀笟璐�</span>
+              <span v-if="row.costType === 2">绉熻祦鎶奸噾</span>
+              <span v-if="row.costType === 3">鐗╀笟鎶奸噾</span>
+              <span v-if="row.costType === 4">姘寸數璐�</span>
+              <span v-if="row.costType === 5">鏉傞」璐�</span>
+              <span v-if="row.costType === 6">鍏朵粬</span>
+              <span v-if="row.costType === 7">淇濊瘉閲�</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏈熸暟" align="center" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              <el-tag type="success">{{row.sortnum}}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍖洪棿" align="center" show-overflow-tooltip>
+            <template slot-scope="{row}">
+              {{row.startDate}} ~ {{row.endDate}}
+            </template>
+          </el-table-column>
+          <el-table-column prop="planPayDate" label="浠樻鏃�" align="center" show-overflow-tooltip />
+          <el-table-column prop="receivableFee" label="搴旀敹" align="center" show-overflow-tooltip />
+        </el-table>
+        <div class="total">
+          <span>鎬昏</span>
+          <div>璐圭敤搴旀敹鎬昏锛歿{wyPrice}}锛屾娂閲戝簲鏀舵�昏锛歿{form.wyDeposit}}</div>
+        </div>
       </div>
-    </template>
-    <!--  -->
-    <MemberSearch ref="MemberSearchRef" />
+    </div>
+    <!-- 閫夋嫨绉熷 -->
+    <MemberSearch ref="MemberSearchRef" @select="getTenant" />
   </GlobalWindow>
 </template>
 
@@ -157,91 +270,97 @@
 import BaseOpera from '@/components/base/BaseOpera'
 import MemberSearch from '@/components/common/MemberSearch'
 import { rules } from './config'
+import { create, getBillList } from '@/api/contract'
+import { getUserList } from '@/api/system/user'
+import { getProjectList, tree } from '@/api/project/ywProject'
+import { companyList } from '@/api/company'
 import { Message, Loading } from 'element-ui'
+import { mapState } from 'vuex'
 export default {
   components: {
     GlobalWindow,
     MemberSearch
   },
   extends: BaseOpera,
-  data() {
+  computed: {
+    ...mapState(['userInfo'])
+  },
+  data () {
     return {
-      showModal: false,
       title: '鍒涘缓鍚堝悓',
-      activeTabs: '0',
-      param: {},
+      activeTabs: 0,
+      form: {
+        type: '',
+        code: '',
+        userId: '',
+        signDate: '',
+        startDate: '',
+        endDate: '',
+        projectId: '',
+        roundedUp: '',
+        companyId: '',
+        renterId: '',
+        renterName: '',
+        memberId: '',
+        memberName: '',
+        fileList: [],
+  
+        zlDeposit: '',
+        zlPayType: '',
+        zlFreeStartDate: '',
+        zlFreeEndDate: '',
+        zlDate: [],
+        zlDetailList: [
+          {
+            startDate: '',
+            endDate: '',
+            time: [],
+            price: '',
+            advanceDays: ''
+          }
+        ],
+  
+        wyDeposit: '',
+        wyPayType: '',
+        wyFreeStartDate: '',
+        wyFreeEndDate: '',
+        wyDate: [],
+        wyDetailList: [
+          {
+            startDate: '',
+            endDate: '',
+            time: [],
+            price: '',
+            advanceDays: ''
+          }
+        ],
+  
+        roomIds: []
+      },
+      
+      ids: [],
+  
+      zlList: [],
+      wyList: [],
+      
       rules,
 
       loadingInstance: null,
       uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
-      fileList: [],
       uploadData: {
-        folder: 'HIDDEN_DANGER_FILE'
+        folder: 'YW_CONTRACT_FILE'
       },
 
       types: [
         { name: '鐗╀笟+绉熻祦鍚堝悓', value: 0 },
-        { name: '绉熻祦鍚堝悓', value: 1 },
-        { name: '鐗╀笟鍚堝悓', value: 2 },
+        { name: '绉熻祦鍚堝悓', value: 2 },
+        { name: '鐗╀笟鍚堝悓', value: 1 }
       ],
-      agentList: [], //缁忓姙浜�
+      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: '鍏嬫媺鐜涗緷' }
-            ]
-          }]
-        }
-      ],
+      houseList: [],
       cactiveTabs: 0,
-      paramCost: {},
       payMethods: [
         { name: '涓�娆℃�т粯娆�', value: 0 },
         { name: '3涓湀涓�浠�', value: 1 },
@@ -251,37 +370,233 @@
       unitOps: [
         { name: '鍏�/m虏路澶�', value: 0 },
         { name: '鍏�/m虏路鏈�', value: 1 },
-        { name: '鍏�/澶�', value: 2 },
-        { name: '鍏�/鏈�', value: 3 },
-        { name: '鍏�/骞�', value: 4 },
-        { name: '鍏�/m虏路骞�', value: 5 },
+        { name: '鍏�/澶�', value: 3 },
+        { name: '鍏�/鏈�', value: 4 },
+        { name: '鍏�/骞�', value: 5 },
+        { name: '鍏�/m虏路骞�', value: 2 },
         { name: '鍏�/鍦�', value: 6 },
       ],
+      
+      houseLvThree: []
     }
   },
   methods: {
-    tabsClick(val) {
+    open (title, target) {
+      this.title = title
+      this.ids = []
+      this.getUser()
+      this.getProject()
+      this.getCompany()
+      this.getHouseTree()
+      this.visible = true
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          if (['roomIds', 'fileList', 'wyDate', 'zlDate'].includes(key)) {
+            this.form[key] = []
+          } else {
+            this.form[key] = target[key]
+          }
+        }
+      })
+    },
+    changeType (e) {
+      if (e === 0 || e === 2) {
+        this.cactiveTabs = 0
+      } else if (e === 0 || e === 1) {
+        this.cactiveTabs = 1
+      }
+    },
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        if (this.form.type === 0) {
+          this.$refs.paramCostRef.validate((valid1) => {
+            if (!valid1) {
+              return
+            }
+            this.$refs.paramCostRef1.validate((valid2) => {
+              if (!valid2) {
+                return
+              }
+              this.submit()
+            })
+          })
+        } else if (this.form.type === 2) {
+          this.$refs.paramCostRef.validate((valid1) => {
+            if (!valid1) {
+              return
+            }
+            this.submit()
+          })
+        } else if (this.form.type === 1) {
+          this.$refs.paramCostRef1.validate((valid2) => {
+            if (!valid2) {
+              return
+            }
+            this.submit()
+          })
+        }
+      })
+    },
+    submit () {
+      // 璋冪敤鏂板缓鎺ュ彛
+      this.isWorking = true
+      create({ ...this.form })
+        .then(res => {
+          this.visible = false
+          this.$tip.apiSuccess('鍒涘缓鎴愬姛')
+          this.$emit('success')
+        })
+        .finally(() => {
+          this.isWorking = false
+        })
+    },
+    getDate1 (e, index) {
+      this.form.zlDetailList[index].startDate = e[0]
+      this.form.zlDetailList[index].endDate = e[1]
+    },
+    getDate2 (e, index) {
+      this.form.wyDetailList[index].startDate = e[0]
+      this.form.wyDetailList[index].endDate = e[1]
+    },
+    checkHouseRoom (a, b) {
+      this.ids = b.checkedKeys
+      let arr = b.checkedKeys.map(item => {
+        if (item.split('-')[0] == 3) {
+          return Number(item.split('-')[1])
+        }
+      })
+      this.form.roomIds = arr.filter(item => item !== undefined);
+    },
+    getHouseTree () {
+      tree({})
+        .then(res => {
+          res.forEach(item => {
+            item.disabled = true
+          })
+          this.addParamToArray(res)
+          this.houseList = res
+        })
+    },
+    addParamToArray(arr) {
+      for (let i = 0; i < arr.length; i++) {
+        const currentItem = arr[i].projectDataVOList;
+        arr[i].idd = arr[i].lv + '-' + arr[i].id
+        if (currentItem.length > 0) {
+          this.addParamToArray(currentItem);
+        }
+      }
+    },
+    generateZL () {
+      getBillList({ ...this.form })
+        .then(res => {
+          let zlPrice = 0
+          let arr = []
+          res.forEach(item => {
+            if (item.costType === 0) {
+              zlPrice += item.receivableFee
+              arr.push(item)
+            }
+          })
+          this.zlPrice = zlPrice
+          this.zlList = arr
+        })
+    },
+    generateWY () {
+      getBillList({ ...this.form })
+        .then(res => {
+          let zlPrice = 0
+          let arr = []
+          res.forEach(item => {
+            if (item.costType === 1) {
+              zlPrice += item.receivableFee
+              arr.push(item)
+            }
+          })
+          this.wyPrice = zlPrice
+          this.wyList = arr
+        })
+    },
+    addZl () {
+      this.form.zlDetailList.push({
+        startDate: '',
+        endDate: '',
+        time: [],
+        price: '',
+        advanceDays: ''
+      })
+    },
+    addWy () {
+      this.form.wyDetailList.push({
+        startDate: '',
+        endDate: '',
+        time: [],
+        price: '',
+        advanceDays: ''
+      })
+    },
+    deleZl(index) {
+      if (this.form.zlDetailList.length === 1) return Message.warning('鑷冲皯淇濈暀涓�鏉★紒')
+      this.form.zlDetailList.splice(index, 1)
+    },
+    deleWy(index) {
+      if (this.form.wyDetailList.length === 1) return Message.warning('鑷冲皯淇濈暀涓�鏉★紒')
+      this.form.wyDetailList.splice(index, 1)
+    },
+    getZLDate (e) {
+      this.form.zlFreeStartDate = e[0]
+      this.form.zlFreeEndDate = e[1]
+    },
+    getWYDate (e) {
+      this.form.wyFreeStartDate = e[0]
+      this.form.wyFreeEndDate = e[1]
+    },
+    getTenant (row) {
+      this.form.renterId = row.id
+      this.form.renterName = row.name
+      this.form.memberId = row.memberId
+      this.form.memberName = row.memberName
+    },
+    dele (imgaddr) {
+      this.form.fileList.forEach((item, index) => {
+        if (imgaddr === item.imgaddr) {
+          this.form.fileList.splice(index, 1)
+        }
+      })
+    },
+    getUser () {
+      getUserList({})
+        .then(res => {
+          this.agentList = res
+        })
+    },
+    getProject () {
+      getProjectList({})
+        .then(res => {
+          this.projectList = res
+        })
+    },
+    getCompany () {
+      companyList({ type: 2 })
+        .then(res => {
+          this.comparyList = res
+        })
+    },
+    tabsClick (val) {
       this.activeTabs = val
     },
-    ctabsClick(val) {
+    ctabsClick (val) {
       this.cactiveTabs = val
     },
-    getDetail() {
-
+    handleRent () {
+      this.$refs.MemberSearchRef.open()
     },
-    handleRent() {
-      this.$refs.MemberSearchRef.openModal()
-    },
-    houseChange(e) {
+    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
-      // }
+    beforeUpload (file) {
       this.loadingInstance = Loading.service({
         lock: true,
         text: 'Loading',
@@ -289,40 +604,33 @@
         background: 'rgba(0, 0, 0, 0.7)'
       })
     },
-    uploadError() {
+    uploadError () {
       this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
         if (this.loadingInstance) {
           this.loadingInstance.close()
         }
       })
     },
-    uploadAvatarSuccess(file) {
-      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+    getDay () {
+      const now = new Date()
+      const year = now.getFullYear()
+      const month = now.getMonth() + 1 // 鍔�1浣垮叾浠�1寮�濮�
+      const day = now.getDate()
+      const hours = now.getHours()
+      const minutes = now.getMinutes()
+      const seconds = now.getSeconds()
+      return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
+    },
+    uploadAvatarSuccess (file) {
+      this.$nextTick(() => {
         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)
+      this.form.fileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() })
     },
-    close() {
-      this.showModal = false
+    close () {
       this.$emit('close')
     }
   }
@@ -431,5 +739,13 @@
   font-size: 14px;
   margin-bottom: 15px;
   margin-top: 10px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  span {
+    font-weight: 500;
+    font-size: 14px;
+    margin-bottom: 15px;
+  }
 }
 </style>
diff --git a/admin/src/views/contract/components/terminateLease.vue b/admin/src/views/contract/components/terminateLease.vue
new file mode 100644
index 0000000..ed32531
--- /dev/null
+++ b/admin/src/views/contract/components/terminateLease.vue
@@ -0,0 +1,442 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        width="100%"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @close="close"
+        @confirm="confirm">
+        <div class="main">
+            <div class="main_head">
+                <span>绉熷锛歿{ info.renterName }}</span>
+                <span>鍚堝悓缂栧彿锛歿{ info.code }}</span>
+            </div>
+            <div class="title">閫�绉熶俊鎭�</div>
+            <div class="main_box">
+                <div class="main_box_form">
+                    <el-form :inline="true" label-position="top" :model="form" ref="form" :rules="rules" class="demo-form-inline">
+                        <el-form-item label="閫�绉熺被鍨�" prop="btType" style="width: 33%;">
+                            <el-select v-model="form.btType" placeholder="璇烽�夋嫨">
+                                <el-option label="鍒版湡閫�绉�" :value="0"></el-option>
+                                <el-option label="鎹㈡埧閫�绉�" :value="1"></el-option>
+                                <el-option label="杩濈害閫�绉�" :value="2"></el-option>
+                                <el-option label="鍗忓晢閫�绉�" :value="3"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="閫�绉熸棩鏈�" prop="btDate" style="width: 33%;">
+                            <el-date-picker
+                                v-model="form.btDate"
+                                type="date"
+                                value-format="yyyy-MM-dd"
+                                placeholder="璇烽�夋嫨">
+                            </el-date-picker>
+                        </el-form-item>
+                        <el-form-item label="缁忓姙浜�" prop="btUserId" style="width: 30%;">
+                            <el-select v-model="form.btUserId" placeholder="璇烽�夋嫨">
+                                <el-option v-for="(item, index) in agentList" :key="index" :value="item.id" :label="item.realname"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="鍗忚绛捐鏃ユ湡" prop="btSignDate" style="width: 33%;">
+                            <el-date-picker
+                                v-model="form.btSignDate"
+                                type="date"
+                                value-format="yyyy-MM-dd"
+                                placeholder="璇烽�夋嫨">
+                            </el-date-picker>
+                        </el-form-item>
+                        <el-form-item label="閫�绉熷師鍥�" prop="btInfo" style="width: 60%;">
+                            <el-input v-model="form.btInfo" placeholder="璇疯緭鍏�"></el-input>
+                        </el-form-item>
+                    </el-form>
+                </div>
+                <div class="main_box_list">
+                    <div class="main_box_list_title">宸查�夋埧婧�</div>
+                    <el-table :data="info.roomList" stripe>
+                        <el-table-column prop="projectName" label="椤圭洰鍚嶇О" show-overflow-tooltip />
+                        <el-table-column label="鎴挎簮鍚嶇О" show-overflow-tooltip>
+                            <template slot-scope="{row}">
+                                {{row.buildingName}}/{{row.code}}
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="绉熻祦闈㈢Н(銕�)" show-overflow-tooltip>
+                            <template slot-scope="{row}">
+                                {{row.area}}銕�
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div>
+            <div class="title">
+                <span>閫�绉熶俊鎭�</span>
+                <div style="display: flex; align-items: center;">
+                    <el-button type="primary" @click="$refs.addCollectionBill.open('鍒涘缓鏀舵璐﹀崟', { contractCode: info.code, contractId: info.id, renterName: info.renterName, renterId: info.renterId, billType: 0, billTypeCopy: 0, feeType: 0 })">娣诲姞鏀舵</el-button>
+                    <el-button type="primary" @click="$refs.AddPaymentBill.open('鍒涘缓浠樻璐﹀崟', { contractCode: info.code, contractId: info.id, renterName: info.renterName, renterId: info.renterId, billType: 1, billTypeCopy: 1 })">娣诲姞浠樻</el-button>
+                </div>
+            </div>
+            <el-table
+                :data="info.terminateList"
+                border
+                style="width: 100%; margin-bottom: 15px;">
+                <el-table-column
+                    prop="code"
+                    label="璐﹀崟缂栧彿">
+                </el-table-column>
+                <el-table-column
+                    label="璐圭敤绫诲瀷">
+                    <template slot-scope="{row}">
+                        <span v-if="row.costType === 0">绉熻祦璐�</span>
+                        <span v-if="row.costType === 1">鐗╀笟璐�</span>
+                        <span v-if="row.costType === 4">姘寸數璐�</span>
+                        <span v-if="row.costType === 5">鏉傞」璐�</span>
+                        <span v-if="row.costType === 6">鍏朵粬</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="璁¤垂鍛ㄦ湡">
+                    <template slot-scope="{row}">
+                        {{row.startDate}} ~ {{row.endDate}}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="搴旀敹浠橀噾棰�/鍘熷搴旀敹浠�">
+                    <template v-slot="{row}">
+                        <div style="display: flex; align-items: center;">
+                            <el-input v-model="row.receivableFee" @input="changeReceivableFee($event, row)" placeholder="璇疯緭鍏ュ唴瀹�" style="width: 90px;"></el-input>
+                            <span style="margin: 0 10px;">/</span>
+                            {{row.receivableFeeCopy}}
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    prop="actReceivableFee"
+                    label="瀹炴敹/浠橀噾棰�">
+                </el-table-column>
+                <el-table-column
+                    label="闇�鏀�/浠橀噾棰�">
+                    <template slot-scope="{row}">
+                        <div style="display: flex; align-items: center;">
+                            <el-tag type="success" v-if="row.billType === 0">鏀�</el-tag>
+                            <el-tag type="warning" v-if="row.billType === 1">浠�</el-tag>
+                            <span style="margin-left: 10px;">{{row.price}}</span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="搴旀敹/浠樻棩鏈�">
+                    <template slot-scope="{row}">
+                        <el-date-picker v-model="row.planPayDate" value-format="yyyy-MM-dd" type="date" placeholder="閫夋嫨鏃ユ湡"></el-date-picker>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <div class="title">鎶奸噾</div>
+            <el-table
+                :data="info.depositList"
+                border
+                style="width: 100%; margin-bottom: 15px;">
+                <el-table-column
+                    prop="code"
+                    label="璐﹀崟缂栧彿">
+                </el-table-column>
+                <el-table-column
+                    label="璐圭敤绫诲瀷">
+                    <template slot-scope="{row}">
+                        <span v-if="row.costType === 2">绉熻祦鎶奸噾</span>
+                        <span v-if="row.costType === 3">鐗╀笟鎶奸噾</span>
+                        <span v-if="row.costType === 7">淇濊瘉閲�</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="璁¤垂鍛ㄦ湡">
+                    <template slot-scope="{row}">
+                        {{row.startDate}} ~ {{row.endDate}}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    prop="receivableFee"
+                    label="搴旀敹閲戦">
+                </el-table-column>
+                <el-table-column
+                    prop="actReceivableFee"
+                    label="瀹炴敹/浠橀噾棰�">
+                </el-table-column>
+                <el-table-column
+                    label="搴旈��閲戦">
+                    <template slot-scope="{row}">
+                        <div style="display: flex; align-items: center;">
+                            <el-tag type="success" v-if="row.billType === 0">鏀�</el-tag>
+                            <el-tag type="warning" v-if="row.billType === 1">浠�</el-tag>
+                            <span style="margin-left: 10px;">{{row.price}}</span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="搴旈��鏃ユ湡">
+                    <template slot-scope="{row}">
+                        <el-date-picker v-model="row.planPayDate" value-format="yyyy-MM-dd" type="date" placeholder="閫夋嫨鏃ユ湡"></el-date-picker>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <div class="footer">
+                鍚堣搴旀敹锛�<span>{{receivable}}</span>鍏冿紝 鍚堣搴斾粯锛�<span>{{meet}}</span>鍏�
+            </div>
+        </div>
+        <!--    鍒涘缓鏀舵璐﹀崟    -->
+        <AddCollectionBill ref="addCollectionBill" @getVal="getObjS" />
+        <!--    鍒涘缓浠樻璐﹀崟    -->
+        <AddPaymentBill ref="AddPaymentBill" @getVal="getObjS" />
+    </GlobalWindow>
+</template>
+
+<script>
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import BaseOpera from '@/components/base/BaseOpera'
+  import AddCollectionBill from './addCollectionBill'
+  import AddPaymentBill from './addPaymentBill'
+  import { getUserList } from '@/api/system/user'
+  import { backRent } from '@/api/contract'
+  export default {
+    name: "terminateLease",
+    components: {
+      GlobalWindow,
+      AddCollectionBill,
+      AddPaymentBill
+    },
+    extends: BaseOpera,
+    data() {
+      return {
+        info: {},
+        form: {
+          id: null,
+          btType: '',
+          btDate: '',
+          btUserId: '',
+          btSignDate: '',
+          btInfo: ''
+        },
+        rules: {
+          btType: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          btDate: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          btUserId: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          signDate: [
+            { required: true, message: '璇烽�夋嫨', trigger: 'blur' }
+          ],
+          btInfo: [
+            { required: true, message: '璇疯緭鍏�', trigger: 'blur' }
+          ]
+        },
+        
+        list: [],
+
+        agentList: [],
+
+        receivable: '',
+        meet: ''
+      }
+    },
+    watch: {
+      info: {
+        deep: true,
+        immediate: true,
+        handler(news, olds) {
+          const arr = [...this.info.terminateList, ...this.info.depositList]
+          let total1 = 0
+          let total2 = 0
+          arr.forEach(item => {
+            if (item.billType === 0) {
+              total1 += Number(item.price)
+            } else if (item.billType === 1) {
+              total2 += Number(item.price)
+            }
+          })
+          this.receivable = total1
+          this.meet = total2
+        }
+      }
+    },
+    methods: {
+      open (title, info) {
+        this.title = title
+        this.info = info
+        this.form.id = info.id
+        this.info.billList.forEach(item => {
+          this.$set(item, 'receivableFeeCopy', item.receivableFee)
+          if ([2,3,7].includes(item.costType)) {
+            this.$set(item, 'price', item.actReceivableFee)
+          } else {
+            this.$set(item, 'price', item.receivableFee)
+          }
+        })
+        this.info.terminateList = this.info.canBackRentBills.filter(item => {
+          if ([0,1,4,5,6].includes(item.costType)) {
+            item.billTypeCopy = item.billType
+            return item
+          }
+        })
+        this.info.depositList = this.info.canBackRentBills.filter(item => {
+          if ([2,3,7].includes(item.costType)) {
+            item.billTypeCopy = item.billType
+            return item
+          }
+        })
+        this.getUser()
+        this.visible = true
+      },
+      getObjS (obj) {
+        this.info.terminateList.push(obj)
+        this.info.terminateList.forEach(item => {
+          item.receivableFee = Number(item.receivableFee) + 1
+          item.receivableFee = Number(item.receivableFee) - 1
+        })
+      },
+      confirm () {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return
+          }
+          this.isWorking = true
+          let canBackRentBills = []
+          let addBillList = []
+          this.info.terminateList.forEach(item => {
+            if (item.rowType && item.rowType === 1) {
+              addBillList.push(item)
+            } else {
+              canBackRentBills.push(item)
+            }
+          })
+          backRent({
+            ...this.form,
+            canBackRentBills: [...canBackRentBills, ...this.info.depositList],
+            addBillList
+          })
+            .then(res => {
+              this.visible = false
+              this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
+              this.$emit('success')
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+        })
+      },
+      getUser () {
+        getUserList({})
+          .then(res => {
+            this.agentList = res
+          })
+      },
+      changeReceivableFee (num, row) {
+        if (Number(num) > row.receivableFeeCopy) {
+          row.receivableFee = ''
+          row.price = 0
+          this.$message.warning('涓嶈兘澶т簬鍘熷搴旀敹浠橀噾棰�')
+        } else {
+          row.price = Number(num) - row.actReceivableFee
+          // 鏀�
+          if (row.billTypeCopy === 0) {
+            if (row.price > 0) {
+              row.billType = 0
+            } else if (row.price < 0) {
+              row.billType = 1
+            } else {
+              row.billType = 0
+            }
+          } else {
+            if (row.price > 0) {
+              row.billType = 1
+            } else if (row.price < 0) {
+              row.billType = 0
+            } else {
+              row.billType = 1
+            }
+          }
+          // if (row.price > 0) {
+          //   row.billType = 0
+          // } else if (row.price < 0) {
+          //   row.billType = 1
+          // }
+          row.price = String(row.price)
+          if (row.price.indexOf('-') > 0) {
+            row.price = row.price.substring(0, row.price.length)
+          }
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+    @import '@/assets/style/variables.scss';
+    .main {
+        width: 100%;
+        .footer {
+            width: 100%;
+            display: flex;
+            align-items: center;
+            font-size: 14px;
+            color: black;
+            span {
+                font-size: 14px;
+                color: $primary-color;
+            }
+        }
+        .main_head {
+            width: 100%;
+            padding: 10px 5px;
+            box-sizing: border-box;
+            display: flex;
+            flex-direction: column;
+            border-bottom: 1px solid #ececec;
+            margin-bottom: 15px;
+            span {
+                color: black;
+                font-size: 16px;
+                font-weight: 500;
+                margin-bottom: 8px;
+                &:last-child {
+                    margin: 0 !important;
+                }
+            }
+        }
+        .title {
+            font-weight: 500;
+            font-size: 16px;
+            color: $primary-color;
+            margin-bottom: 15px;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            span {
+                font-weight: 500;
+                font-size: 16px;
+                color: $primary-color;
+            }
+        }
+        .main_box {
+            width: 100%;
+            display: flex;
+            align-items: start;
+            margin-bottom: 15px;
+            justify-content: space-between;
+            .main_box_form {
+                flex: 1;
+                margin-right: 20px;
+            }
+            .main_box_list {
+                width: 500px;
+                flex-shrink: 0;
+                .main_box_list_title {
+                    font-size: 16px;
+                    font-weight: 500;
+                    color: $primary-color;
+                    margin-bottom: 15px;
+                }
+            }
+        }
+    }
+</style>
diff --git a/admin/src/views/contract/contractList.vue b/admin/src/views/contract/contractList.vue
index 1309081..ca11e0c 100644
--- a/admin/src/views/contract/contractList.vue
+++ b/admin/src/views/contract/contractList.vue
@@ -6,27 +6,28 @@
       </template>
     </QueryForm>
     <div class="mt10">
-      <el-button @click="handleEdit()" icon="el-icon-plus" type="primary">鏂板缓</el-button>
+      <el-button @click="$refs.ContractEditRef.open('鍒涘缓鍚堝悓')" icon="el-icon-plus" type="primary">鏂板缓</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="寮�濮嬫棩鏈�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="缁撴潫鏃ユ湡" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="绉熻祦鍗曚环" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="绉熻祦闈㈢Н" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="绛捐鏃�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" label="鍚堝悓缂栧彿" min-width="100" show-overflow-tooltip />
-
-      <el-table-column prop="" label="鍚堝悓鐘舵��" min-width="100" show-overflow-tooltip>
-        <template v-slot="scope">
-          <span class="primaryColor">寰呮墽琛�</span>
-          <span class="green">姝e父鎵ц涓�</span>
-          <span class="gary">宸查��绉�</span>
+      <el-table-column prop="renterName" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" min-width="100" show-overflow-tooltip />
+<!--      <el-table-column label="绉熻祦鍗曚环" min-width="100" show-overflow-tooltip></el-table-column>-->
+      <el-table-column prop="totalArea" label="绉熻祦闈㈢Н" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="signDate" label="绛捐鏃�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="code" label="鍚堝悓缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鍚堝悓鐘舵��" min-width="90" fixed="right" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <span class="primaryColor" v-if="row.status === 0">寰呮墽琛�</span>
+          <span class="green" v-if="row.status === 1">姝e父鎵ц涓�</span>
+          <span class="gary" v-if="row.status === 2">宸插埌鏈�</span>
+          <span class="gary" v-if="row.status === 3">閫�绉熺粨绠椾腑</span>
+          <span class="gary" v-if="row.status === 4">宸查��绉�</span>
         </template>
       </el-table-column>
-      <el-table-column prop="" label="鎿嶄綔" min-width="100" show-overflow-tooltip>
+      <el-table-column label="鎿嶄綔" min-width="90" fixed="right" show-overflow-tooltip>
         <template v-slot="scope">
-          <span class="primaryColor cu" @click="handleDetail(scope.row)">鏌ョ湅璇︽儏</span>
+          <span class="primaryColor cu" @click="handleDetail(scope.row.id)">鏌ョ湅璇︽儏</span>
         </template>
       </el-table-column>
     </el-table>
@@ -34,7 +35,7 @@
       <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
     </div>
     <ContractDetail ref="ContractDetailRef" />
-    <ContractEdit ref="ContractEditRef" v-if="showEdit" />
+    <ContractEdit ref="ContractEditRef" @success="getList(1)" />
   </div>
 </template>
 
@@ -43,10 +44,11 @@
 import QueryForm from '@/components/common/QueryForm'
 import ContractDetail from './components/contractDetail'
 import ContractEdit from './components/contractEdit.vue'
+import { fetchList } from '@/api/contract'
 import dayjs from 'dayjs'
 import duration from 'dayjs/plugin/duration'
 dayjs.extend(duration)
-import { platformLogPage, getPlatformGroupList } from '@/api'
+
 export default {
   components: {
     Pagination,
@@ -54,9 +56,8 @@
     ContractEdit,
     ContractDetail
   },
-  data() {
+  data () {
     return {
-      showEdit: false,
       loading: false,
       pagination: {
         pageSize: 10,
@@ -69,74 +70,70 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'name',
+            filed: 'renterName',
             type: 'input',
-            label: '鍚堝悓鍚嶇О'
+            label: '瀹㈡埛鍚嶇О'
+          },
+          {
+            filed: 'code',
+            type: 'input',
+            label: '鍚堝悓缂栧彿'
+          },
+          {
+            filed: 'status',
+            type: 'select',
+            label: '鍚堝悓鐘舵��',
+            options: [
+              { value: 0, label: '寰呮墽琛�' },
+              { value: 1, label: '姝e父鎵ц涓�' },
+              { value: 2, label: '宸插埌鏈�' },
+              { value: 3, label: '閫�绉熺粨绠椾腑' },
+              { value: 4, label: '宸查��绉�' },
+            ]
           },
           {
             filed: 'selDate',
             type: 'datetimerange',
-            placeholder: '搴斿紑濮嬫椂闂�'
+            label: '鍚堝悓鏃ユ湡',
+            placeholder: '鍚堝悓鏃ユ湡'
           }
         ],
         online: true
       }
     }
   },
-  created() {
-    // this.getList()
-    // this.getGroupList()
+  created () {
+    this.getList()
   },
   methods: {
-    handleEdit(row) {
-      this.showEdit = true
-      this.$nextTick(() => {
-        this.$refs.ContractEditRef.showModal = true
-      })
-      if(row && row.id){
-
-      }else{
-
-      }
+    handleDetail (id) {
+      this.$refs.ContractDetailRef.open('鍚堝悓璇︽儏', id)
     },
-    handleDetail(row) {
-      this.$refs.ContractDetailRef.visible = true
-      this.$refs.ContractDetailRef.getDetail(row.id)
-    },
-   
-    getList(page) {
+    getList (page) {
       const { pagination, filters } = this
       this.loading = true
-      platformLogPage({
+      fetchList({
         model: {
-          ...filters,
-          queryStatus: '6,7,8',
-          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
-          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+          ...filters
         },
         sorts: [{ direction: 'DESC', property: 'param1' }],
         capacity: pagination.pageSize,
-        page: page || pagination.page,
+        page: page || pagination.page
       }).then(res => {
         this.loading = false
         this.list = res.records || []
-        this.list.forEach(item => {
-          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
-          item.taskOrigin = 'WMS鑾峰彇'
-          item.workTime = dayjs.duration(item.param3, 'seconds').format('H鏃秏鍒唖绉�')
-        })
         this.pagination.total = res.total || 0
       }, () => {
         this.loading = false
       })
     },
-    clear() {
+    clear () {
       this.filters = {}
       this.pagination.pageSize = 10
       this.pagination.page = 1
       this.getList()
     },
-    handleSizeChange(capacity) {
+    handleSizeChange (capacity) {
       this.pagination.pageSize = capacity
     }
   }
diff --git a/admin/src/views/finance/bull.vue b/admin/src/views/finance/bull.vue
index 99cc8ed..936cc3c 100644
--- a/admin/src/views/finance/bull.vue
+++ b/admin/src/views/finance/bull.vue
@@ -3,29 +3,57 @@
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <div class="df_sb mt20">
       <div class="tabs">
-        <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">鏀舵璐﹀崟</div>
-        <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">浠樻璐﹀崟</div>
+        <div class="tab" :class="{ active: billType === 0 }" @click="tabsClick(0)">鏀舵璐﹀崟</div>
+        <div class="tab" :class="{ active: billType === 1 }" @click="tabsClick(1)">浠樻璐﹀崟</div>
       </div>
       <div class="btns">
-        <el-button type="primary" @click="$refs.EditRef.open('鍒涘缓鏀舵璐﹀崟')" icon="el-icon-plus"
+        <el-button type="primary" @click="addOpen" icon="el-icon-plus"
           v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
         <el-button @click="handleDetail" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
       </div>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="code" label="妤煎畤鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="name" label="鎴块棿鍙�" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="stautsName" label="鍚堝悓缂栧彿" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="remark" label="缁撴竻鐘舵��" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="createTime" label="璐﹀崟閲戦" min-width="100" show-overflow-tooltip />
-      <el-table-column 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 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 prop="createTime" label="搴旀敹鏃ユ湡" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鎴块棿" min-width="170" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <div style="display: flex; flex-direction: column;" v-if="row.roomPathName">
+            <span v-for="(item, index) in row.roomPathName.split(';')" :key="index">{{item}}</span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="contractCode" label="鍚堝悓缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column label="缁撴竻鐘舵��" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <span v-if="row.payStatus === 0">寰呮敹娆�</span>
+          <span v-if="row.payStatus === 1">宸茬粨娓�</span>
+          <span v-if="row.payStatus === 2">閮ㄥ垎缁撴竻</span>
+          <span v-if="row.payStatus === 3">寰呬粯娆�</span>
+          <span v-if="row.payStatus === 4">寰呴��娆�</span>
+          <span v-if="row.payStatus === 5">宸插叧闂�</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="totleFee" label="璐﹀崟閲戦" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="receivableFee" label="搴旀敹閲戦" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="actReceivableFee" label="瀹炴敹閲戦" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="needReceivableFee" label="闇�鏀堕噾棰�" min-width="100" show-overflow-tooltip />
+      <el-table-column label="璐圭敤绫诲瀷" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <span v-if="row.feeType === 0">鍛ㄦ湡璐圭敤</span>
+          <span v-if="row.feeType === 1">涓�娆℃�ц垂鐢�</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鏄惁閫炬湡" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <span v-if="row.isOverdue === 0">鍚�</span>
+          <span v-if="row.isOverdue === 1">鏄�</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="璁¤垂鍛ㄦ湡" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          {{ row.startDate }} ~ {{ row.endDate }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="planPayDate" label="搴旀敹鏃ユ湡" min-width="100" show-overflow-tooltip />
       <el-table-column prop="createTime" label="璐﹀崟鏉ユ簮" min-width="100" show-overflow-tooltip />
       <el-table-column prop="statusName" label="鍚堝悓鐘舵��" min-width="100" fixed="right" show-overflow-tooltip />
       <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
@@ -39,6 +67,7 @@
     </div>
     <Edit ref="EditRef" @success="getList" />
     <Detail ref="DetailRef" @success="getList" />
+    <BullEditFu ref="BullEditFu" @success="getList" />
   </div>
 </template>
 
@@ -46,6 +75,7 @@
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
 import Edit from './components/bullEdit.vue'
+import BullEditFu from './components/bullEditFu.vue'
 import Detail from './components/bullDetail.vue'
 import { fetchList } from '@/api/bill'
 export default {
@@ -53,9 +83,10 @@
     Pagination,
     QueryForm,
     Edit,
-    Detail
+    Detail,
+    BullEditFu
   },
-  data() {
+  data () {
     return {
       loading: false,
       pagination: {
@@ -63,64 +94,71 @@
         page: 1,
         total: 0
       },
-      activeTabs: 0,
-      filters: {},
+      billType: 0,
+      filters: {
+        status: 0
+      },
       list: [],
       total: 0,
-      statusMap: [
-        { value: 0, label: '寰呮敹娆�' },
-        { value: 1, label: '宸茬粨绠�' },
-        { value: 2, label: '閮ㄥ垎缁撴竻' },
-        { value: 3, label: '寰呴��娆�' },
-        { value: 4, label: '寰呬粯娆�' },
-      ],
       queryFormConfig: {
         formItems: [
           {
-            filed: 'name',
+            filed: 'customerName',
             type: 'input',
-            label: '瀹㈡埛鍚嶇О',
+            label: '瀹㈡埛鍚嶇О'
           },
           {
             filed: 'status',
             type: 'select',
             label: '璐﹀崟鐘舵��',
             options: [
-              { value: '0', label: '寮�鍚�' },
-              { value: '1', label: '鍏抽棴' },
+              { value: 0, label: '寮�鍚�' },
+              { value: 1, label: '鍏抽棴' }
             ]
           },
           {
-            filed: 'status',
+            filed: 'payStatus',
             type: 'select',
             label: '缁撴竻鐘舵��',
-            options: this.statusMap
+            options: [
+              { value: 0, label: '寰呮敹娆�' },
+              { value: 1, label: '宸茬粨绠�' },
+              { value: 2, label: '閮ㄥ垎缁撴竻' },
+              { value: 3, label: '寰呴��娆�' },
+              { value: 4, label: '寰呬粯娆�' }
+            ]
           },
           {
             filed: 'selDate',
             type: 'daterange',
             label: '搴旀敹/浠樻棩鏈�'
-          },
-        ],
-        online: true
+          }
+        ]
       }
     }
   },
-  created() {
+  created () {
     this.getList()
   },
   methods: {
+    addOpen () {
+      if (this.billType === 0) {
+        this.$refs.EditRef.open('鍒涘缓鏀舵璐﹀崟')
+      } else {
+        this.$refs.BullEditFu.open('鍒涘缓浠樻璐﹀崟')
+      }
+    },
     getList (page) {
       const { pagination, filters } = this
       this.loading = true
       fetchList({
         model: {
-          ...filters
+          ...filters,
+          billType: this.billType
         },
         capacity: pagination.pageSize,
         page: page || pagination.page
       }).then(res => {
-        console.log(res)
         this.loading = false
         this.list = res.records || []
         this.list.forEach(item => {
@@ -131,19 +169,20 @@
         this.loading = false
       })
     },
-    tabsClick(val) {
-      this.activeTabs = val
+    tabsClick (val) {
+      this.billType = val
+      this.getList()
     },
-    handleDetail(row) {
-      this.$refs.DetailRef.open()
+    handleDetail (row) {
+      this.$refs.DetailRef.open('璐﹀崟璇︽儏', row.id)
     },
-    clear() {
+    clear () {
       this.filters = {}
       this.pagination.pageSize = 10
       this.pagination.page = 1
       this.getList()
     },
-    handleSizeChange(capacity) {
+    handleSizeChange (capacity) {
       this.pagination.pageSize = capacity
       this.getList()
     }
@@ -157,7 +196,6 @@
 .tabs {
   display: flex;
   margin-bottom: 20px;
-  display: flex;
   justify-content: center;
 
   .tab {
diff --git a/admin/src/views/finance/components/bullDetail.vue b/admin/src/views/finance/components/bullDetail.vue
index 2f99054..f330ec0 100644
--- a/admin/src/views/finance/components/bullDetail.vue
+++ b/admin/src/views/finance/components/bullDetail.vue
@@ -3,39 +3,59 @@
     @confirm="confirm">
     <div class="home_title">
       <div class="left">
-        <span class="mr10">浠樻鏂癸細xxx</span>
-        <el-tag type="success">status</el-tag>
+        <span class="mr10">浠樻鏂癸細{{info.customerName}}</span>
+        <el-tag type="success" v-if="info.status === 0">寮�鍚�</el-tag>
+        <el-tag type="success" v-if="info.status === 1">鍏抽棴</el-tag>
       </div>
-      <el-button plain type="primary" @click="$refs.flowingWater.open('鍒涘缓鏀舵敮娴佹按')">鏂板缓鏀舵敮娴佹按</el-button>
+      <el-button plain type="primary" @click="$refs.flowingWater.open(info.billType === 0 ? '鍒涘缓鏀舵璐﹀崟' : '鍒涘缓浠樻璐﹀崟', {
+        billType: info.billType,
+        billId: info.id,
+        costType: info.costType,
+        costTypeName: returnText(info.costType),
+        contractCode: info.contractCode,
+        contractId: info.contractId,
+        startDate: info.startDate,
+        endDate: info.endDate,
+        multifileList: [],
+        date: `${info.startDate} ~ ${info.endDate}`,
+        companyId: info.companyId,
+        companyName: info.companyName,
+        actReceivableFee: info.actReceivableFee
+      })">鏂板缓鏀舵敮娴佹按</el-button>
     </div>
     <div class="line"></div>
     <div class="main">
       <div class="list" style="background: rgba(0,0,0,0); padding: 0; margin-bottom: 0;">
         <div class="item" style="flex: 1;">
           <div class="la">缁撴竻鐘舵��</div>
-          <div class="val" style="margin-top: 10px;">宸茬粨娓�</div>
+          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 0">寰呮敹娆�</div>
+          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 1">宸茬粨娓�</div>
+          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 2">閮ㄥ垎缁撴竻</div>
+          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 3">寰呬粯娆�</div>
+          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 4">寰呴��娆�</div>
+          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 5">宸插叧闂�</div>
         </div>
         <div class="item" style="flex: 1;">
           <div class="la">搴旀敹閲戦锛堝厓锛�</div>
-          <div class="val" style="margin-top: 10px;">1,000.00</div>
+          <div class="val" style="margin-top: 10px;">{{info.receivableFee}}</div>
         </div>
         <div class="item" style="flex: 1;">
           <div class="la">瀹炴敹閲戦锛堝厓锛�</div>
-          <div class="val" style="margin-top: 10px;">1,000.00</div>
+          <div class="val" style="margin-top: 10px;">{{info.actReceivableFee}}</div>
         </div>
         <div class="item" style="flex: 1;">
           <div class="la">闇�浠橀噾棰濓紙鍏冿級</div>
-          <div class="val" style="margin-top: 10px;">1,000.00</div>
+          <div class="val" style="margin-top: 10px;">{{info.needReceivableFee}}</div>
         </div>
         <div class="item" style="flex: 1;">
           <div class="la">搴旀敹鏃ユ湡</div>
-          <div class="val" style="margin-top: 10px;">2024-11-16</div>
+          <div class="val" style="margin-top: 10px;">{{info.planPayDate}}</div>
         </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 == 1 }" @click="tabsClick(1)">璐﹀崟鏄庣粏</div>-->
       <div class="tab" :class="{ active: activeTabs == 2 }" @click="tabsClick(2)">鏀舵敮娴佹按</div>
     </div>
     <div class="main">
@@ -43,31 +63,32 @@
       <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
         <div class="item">
           <div class="la">璐﹀崟绫诲瀷</div>
-          <div class="val">绉熼噾</div>
+          <div class="val" v-if="info.billType === 0">鏀舵</div>
+          <div class="val" v-if="info.billType === 1">浠樻</div>
         </div>
         <div class="item">
           <div class="la">璁¤垂鍛ㄦ湡</div>
-          <div class="val">2024-11-17 ~ 2025-11-17</div>
+          <div class="val">{{info.startDate}} ~ {{info.endDate}}</div>
         </div>
         <div class="item">
           <div class="la">璐﹀崟閲戦(鍏�)</div>
-          <div class="val">10000.00</div>
+          <div class="val">{{info.totleFee}}</div>
         </div>
         <div class="item">
           <div class="la">璐﹀崟缂栧彿</div>
-          <div class="val">ZD20241117-0002</div>
+          <div class="val">{{info.code}}</div>
         </div>
         <div class="item">
           <div class="la">鍚堝悓缂栧彿</div>
-          <div class="val">202411-0017</div>
+          <div class="val">{{info.contractCode}}</div>
         </div>
         <div class="item">
           <div class="la">鍒涘缓鏃堕棿</div>
-          <div class="val">2024-11-16 15:17:01</div>
+          <div class="val">{{info.createDate}}</div>
         </div>
         <div class="item">
           <div class="la">浠樻鏂�</div>
-          <div class="val">XX鍏徃</div>
+          <div class="val">{{info.customerName}}</div>
         </div>
         <div class="item">
           <div class="la">缁忓姙浜�</div>
@@ -75,11 +96,11 @@
         </div>
         <div class="item">
           <div class="la">鎵�灞炲叕鍙�</div>
-          <div class="val">XXX鏈夐檺鍏徃</div>
+          <div class="val">{{info.companyName}}</div>
         </div>
         <div class="item">
           <div class="la">璐﹀崟澶囨敞</div>
-          <div class="val">杩欐槸澶囨敞鍐呭</div>
+          <div class="val">{{info.remark}}</div>
         </div>
         <div class="item"></div>
         <div class="item"></div>
@@ -87,95 +108,108 @@
       <div class="title">鎴挎簮淇℃伅</div>
       <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
         <el-table
-          :data="tableData"
+          :data="info.ywContractRoomList"
           border
           style="width: 100%">
           <el-table-column
-            prop="date"
+            prop="projectName"
             label="椤圭洰鍚嶇О">
           </el-table-column>
           <el-table-column
-            prop="name"
+            prop="floorName"
             label="妤煎畤鍚嶇О">
           </el-table-column>
           <el-table-column
-            prop="address"
             label="妤煎眰/鎴垮彿">
+            <template slot-scope="{row}">
+              {{row.buildingName}}/{{row.roomName}}
+            </template>
           </el-table-column>
           <el-table-column
-            prop="address"
+            prop="area"
             label="闈㈢Н">
           </el-table-column>
         </el-table>
       </div>
-      <div class="title">璐﹀崟鏄庣粏</div>
-      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
-        <el-table
-          :data="tableData"
-          border
-          style="width: 100%">
-          <el-table-column
-            prop="date"
-            label="璐圭敤绫诲瀷">
-          </el-table-column>
-          <el-table-column
-            prop="name"
-            label="搴旀敹/浠橀噾棰�">
-          </el-table-column>
-          <el-table-column
-            prop="address"
-            label="瀹炴敹閲戦">
-          </el-table-column>
-          <el-table-column
-            prop="address"
-            label="闇�鏀堕噾棰�">
-          </el-table-column>
-          <el-table-column
-            prop="address"
-            label="璁¤垂鍛ㄦ湡">
-          </el-table-column>
-          <el-table-column
-            prop="address"
-            label="搴旀敹/浠樻棩鏈�">
-          </el-table-column>
-          <el-table-column
-            prop="address"
-            label="澶囨敞">
-          </el-table-column>
-        </el-table>
-      </div>
+<!--      <div class="title">璐﹀崟鏄庣粏</div>-->
+<!--      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">-->
+<!--        <el-table-->
+<!--          :data="tableData"-->
+<!--          border-->
+<!--          style="width: 100%">-->
+<!--          <el-table-column-->
+<!--            prop="date"-->
+<!--            label="璐圭敤绫诲瀷">-->
+<!--          </el-table-column>-->
+<!--          <el-table-column-->
+<!--            prop="name"-->
+<!--            label="搴旀敹/浠橀噾棰�">-->
+<!--          </el-table-column>-->
+<!--          <el-table-column-->
+<!--            prop="address"-->
+<!--            label="瀹炴敹閲戦">-->
+<!--          </el-table-column>-->
+<!--          <el-table-column-->
+<!--            prop="address"-->
+<!--            label="闇�鏀堕噾棰�">-->
+<!--          </el-table-column>-->
+<!--          <el-table-column-->
+<!--            prop="address"-->
+<!--            label="璁¤垂鍛ㄦ湡">-->
+<!--          </el-table-column>-->
+<!--          <el-table-column-->
+<!--            prop="address"-->
+<!--            label="搴旀敹/浠樻棩鏈�">-->
+<!--          </el-table-column>-->
+<!--          <el-table-column-->
+<!--            prop="address"-->
+<!--            label="澶囨敞">-->
+<!--          </el-table-column>-->
+<!--        </el-table>-->
+<!--      </div>-->
       <div class="title">鏀舵敮娴佹按</div>
       <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
         <el-table
-          :data="tableData"
+          :data="info.ywContractRevenueList"
           border
           style="width: 100%">
           <el-table-column
-            prop="date"
             label="娴佹按绫诲瀷">
+            <template slot-scope="{row}">
+              <span v-if="row.revenueType === 0">鏀跺叆</span>
+              <span v-if="row.revenueType === 1">鏀嚭</span>
+            </template>
           </el-table-column>
           <el-table-column
-            prop="name"
+            prop="customerName"
             label="瀵规柟鍗曚綅鍚嶇О">
           </el-table-column>
           <el-table-column
-            prop="address"
             label="璐圭敤绫诲瀷">
+            <template slot-scope="{row}">
+              <span v-if="row.payType === 0">鐜伴噾</span>
+              <span v-if="row.payType === 1">缃戦摱杞处</span>
+              <span v-if="row.payType === 2">POS鏈�</span>
+              <span v-if="row.payType === 3">鏀粯瀹�</span>
+              <span v-if="row.payType === 4">寰俊</span>
+              <span v-if="row.payType === 5">杞处鏀エ</span>
+              <span v-if="row.payType === 6">鍏朵粬</span>
+            </template>
           </el-table-column>
           <el-table-column
-            prop="address"
+            prop="payDateEnd"
             label="鍏ヨ处鏃ユ湡">
           </el-table-column>
           <el-table-column
-            prop="address"
+            prop="actReceivableFee"
             label="鍙戠敓棰�">
           </el-table-column>
           <el-table-column
-            prop="address"
+            prop="createDate"
             label="鍒涘缓鏃堕棿">
           </el-table-column>
           <el-table-column
-            prop="address"
+            prop="remark"
             label="澶囨敞">
           </el-table-column>
         </el-table>
@@ -190,6 +224,7 @@
 import GlobalWindow from '@/components/common/GlobalWindow'
 import BaseOpera from '@/components/base/BaseOpera'
 import FlowingWater from './flowingWater'
+import { getYwContractBillById } from '@/api/contract'
 export default {
   components: {
     GlobalWindow,
@@ -206,11 +241,39 @@
     }
   },
   methods: {
+    open (title, id) {
+      this.title = title
+      this.id = id
+      this.getDetails()
+    },
+    getDetails () {
+      getYwContractBillById(this.id)
+        .then(res => {
+          this.info = res
+          this.visible = true
+        })
+    },
     tabsClick(val) {
       this.activeTabs = val
     },
-    getDetail() {
-
+    returnText (e) {
+      if (e === 0) {
+        return '绉熻祦璐�'
+      } else if (e === 1) {
+        return '鐗╀笟璐�'
+      } else if (e === 2) {
+        return '绉熻祦鎶奸噾'
+      } else if (e === 3) {
+        return '鐗╀笟鎶奸噾'
+      } else if (e === 4) {
+        return '姘寸數璐�'
+      } else if (e === 5) {
+        return '鏉傞」璐�'
+      } else if (e === 6) {
+        return '鍏朵粬'
+      } else if (e === 7) {
+        return '淇濊瘉閲�'
+      }
     }
   }
 }
diff --git a/admin/src/views/finance/components/bullEdit.vue b/admin/src/views/finance/components/bullEdit.vue
index 5e69da3..0d77432 100644
--- a/admin/src/views/finance/components/bullEdit.vue
+++ b/admin/src/views/finance/components/bullEdit.vue
@@ -3,7 +3,7 @@
     @confirm="confirm">
     <div class="main">
       <div class="main_content">
-        <el-form :model="param" label-position="top" ref="form" :rules="rules">
+        <el-form :model="form" label-position="top" ref="form" :rules="rules">
           <div class="head">
             <div class="m_title">鍩虹淇℃伅</div>
             <div class="tabs">
@@ -13,18 +13,20 @@
           </div>
           <div class="list">
             <el-form-item label="鍏宠仈鍚堝悓" prop="contractId">
-              <el-select v-model="form.contractId" placeholder="璇烽�夋嫨" clearable>
-                <el-option v-for="(item, index) in contract" :key="index" :value="item.value" :label="item.name"></el-option>
+              <el-select v-model="form.contractId" @change="changeContract" placeholder="璇烽�夋嫨">
+                <el-option v-for="(item, index) in contract" :key="index" :value="item.id" :label="item.code"></el-option>
               </el-select>
             </el-form-item>
-            <el-form-item label="浠樻鏂�" prop="customerName">
-              <el-select v-model="form.customerName" filterable placeholder="璇烽�夋嫨">
+            <el-form-item label="浠樻鏂�" prop="renterName">
+                <el-input v-model="form.renterName" disabled placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+            </el-form-item>
+            <el-form-item label="鎴挎簮" prop="ywContractRoomList">
+              <el-select v-model="form.ywContractRoomList" multiple placeholder="璇烽�夋嫨">
                 <el-option
-                  v-for="(item, index) in payerList"
+                  v-for="(item, index) in houseList"
                   :key="index"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
+                  :value="item.id"
+                  :label="item.projectName + item.buildingName + item.floorName + item.roomName" />
               </el-select>
             </el-form-item>
             <el-form-item label="璐圭敤绫诲瀷" prop="costType">
@@ -38,25 +40,25 @@
                 <el-option :value="6" label="鍏朵粬"></el-option>
               </el-select>
             </el-form-item>
-            <el-form-item label="璁¤垂鍛ㄦ湡" prop="startDate" v-if="form.feeType !== 1">
+            <el-form-item label="璁¤垂鍛ㄦ湡" prop="date" v-if="form.feeType !== 1">
               <el-date-picker
                 type="daterange"
                 range-separator="鑷�"
-                v-model="date"
+                v-model="form.date"
                 @change="changeDate"
                 start-placeholder="寮�濮嬫棩鏈�"
                 end-placeholder="缁撴潫鏃ユ湡"
                 value-format="yyyy-MM-dd"
                 placeholder="璇烽�夋嫨" />
             </el-form-item>
-            <el-form-item label="搴旀敹閲戦" prop="receivableFee">
-              <el-input v-model="form.receivableFee" placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+            <el-form-item label="搴旀敹閲戦" prop="totleFee">
+              <el-input v-model="form.totleFee" placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
             </el-form-item>
             <el-form-item label="搴旀敹鏃ユ湡" prop="planPayDate">
               <el-date-picker type="date" v-model="form.planPayDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
             </el-form-item>
             <el-form-item label="鎵�灞炲叕鍙�" prop="companyId">
-              <el-select v-model="form.companyId" placeholder="璇烽�夋嫨" clearable>
+              <el-select v-model="form.companyId" placeholder="璇烽�夋嫨">
                 <el-option
                   v-for="(item, index) in comparyList"
                   :key="index"
@@ -65,21 +67,10 @@
               </el-select>
             </el-form-item>
             <el-form-item style="width: 100%;" label="璐﹀崟澶囨敞" prop="remark">
-              <el-input type="textarea" :rows="5" v-model="param.remark" placeholder="璇疯緭鍏�" />
+              <el-input type="textarea" :rows="5" v-model="form.remark" placeholder="璇疯緭鍏�" />
             </el-form-item>
           </div>
         </el-form>
-      </div>
-      <div class="main_house">
-        <div class="title">璇烽�夋嫨鎴挎簮</div>
-        <el-tree
-          :data="houseList"
-          show-checkbox
-          node-key="id"
-          :default-expanded-keys="[2, 3]"
-          :default-checked-keys="[5]"
-          :props="defaultProps">
-        </el-tree>
       </div>
     </div>
     <div class="file_wrap">
@@ -90,187 +81,159 @@
           <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>
+      <el-table :data="form.multifileList" stripe>
+        <el-table-column prop="originname" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="userName" label="鎿嶄綔浜�" align="center" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="createTime" label="鎿嶄綔鏃堕棿" align="center" min-width="100" show-overflow-tooltip />
+        <el-table-column label="鎿嶄綔" align="center" min-width="100">
+          <template slot-scope="{row}">
+            <span class="cu red" @click="dele(row.imgaddr)">鍒犻櫎</span>
           </template>
         </el-table-column>
       </el-table>
     </div>
-    <!--  -->
-    <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 { create } from '@/api/bill'
+import { list as listAll } from '@/api/contract'
+import { companyList } from '@/api/company'
 import { Message, Loading } from 'element-ui'
+import { getContractRoom } from '@/api/house'
+import { mapState } from 'vuex'
 export default {
   components: {
-    GlobalWindow,
-    MemberSearch
+    GlobalWindow
+  },
+  computed: {
+    ...mapState(['userInfo'])
   },
   extends: BaseOpera,
-  data() {
+  data () {
     return {
       form: {
         contractId: '',
-        customerName: '',
+        renterName: '',
+        renterId: '',
         costType: '',
         type: '',
         companyId: '',
         remark: '',
         startDate: '',
         endDate: '',
-        receivableFee: '',
+        totleFee: '',
         feeType: 0,
-        planPayDate: ''
+        planPayDate: '',
+        multifileList: [],
+        ywContractRoomList: [],
+        date: [],
+        RoomName: ''
       },
-      date: [],
-      
-      param: {},
       rules,
-      timeTab: '0',
-
       loadingInstance: null,
       uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
       fileList: [],
       uploadData: {
-        folder: 'HIDDEN_DANGER_FILE'
+        folder: 'YW_CONTRACT_BILL'
       },
       contract: [],
       payerList: [],
-      
-      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 },
-      ],
-      houseList: [{
-        id: 1,
-        label: '涓�绾� 1',
-        children: [{
-          id: 4,
-          label: '浜岀骇 1-1',
-          children: [{
-            id: 9,
-            label: '涓夌骇 1-1-1'
-          }, {
-            id: 10,
-            label: '涓夌骇 1-1-2'
-          }]
-        }]
-      }, {
-        id: 2,
-        label: '涓�绾� 2',
-        children: [{
-          id: 5,
-          label: '浜岀骇 2-1'
-        }, {
-          id: 6,
-          label: '浜岀骇 2-2'
-        }]
-      }, {
-        id: 3,
-        label: '涓�绾� 3',
-        children: [{
-          id: 7,
-          label: '浜岀骇 3-1'
-        }, {
-          id: 8,
-          label: '浜岀骇 3-2'
-        }]
-      }],
-      defaultProps: {
-        children: 'children',
-        label: 'label'
-      }
+      comparyList: [],
+      houseList: []
     }
   },
   methods: {
-    timeTabClick(val) {
+    open (title, target) {
+      this.title = title
+      this.form.multifileList = []
+      this.getListAll()
+      this.getCompanyList()
+      this.visible = true
+      // 鏂板缓
+      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]
+        }
+      })
+    },
+    changeContract (e) {
+      this.form.renterName = this.contract.filter(item => {
+        if (item.id === e) {
+          return item
+        }
+      })[0].renterName
+      this.getHouseDate()
+    },
+    getHouseDate () {
+      getContractRoom({ contractId: this.form.contractId, type: 0 })
+        .then(res => {
+          this.houseList = res
+        })
+    },
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) return
+        this.isWorking = true
+        let obj = JSON.parse(JSON.stringify(this.form))
+        obj.ywContractRoomList = obj.ywContractRoomList.map(id => {
+          return { roomId: id }
+        })
+        obj.billType = 0
+        create(obj)
+          .then(() => {
+            this.visible = false
+            this.$tip.apiSuccess('鏂板缓鎴愬姛')
+            this.$emit('success')
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      })
+    },
+    dele (imgaddr) {
+      this.form.multifileList.forEach((item, index) => {
+        if (imgaddr === item.imgaddr) {
+          this.form.multifileList.splice(index, 1)
+        }
+      })
+    },
+    openHouse () {
+      this.$refs.selectHouse.open('閫夋嫨鎴挎簮', { contractId: this.form.contractId, type: 0 })
+    },
+    getCompanyList () {
+      companyList({})
+        .then(res => {
+          this.comparyList = res
+        })
+    },
+    getListAll () {
+      listAll({})
+        .then(res => {
+          console.log(res)
+          this.contract = res
+        })
+    },
+    timeTabClick (val) {
       this.form.feeType = val
       if (val === 1) {
         this.form.startDate = ''
         this.form.endDate = ''
+        this.form.date = []
       }
     },
-    changeDate(e) {
+    changeDate (e) {
       if (!e || e.length === 0) {
         this.form.startDate = ''
         this.form.endDate = ''
@@ -279,10 +242,7 @@
         this.form.endDate = e[1]
       }
     },
-    handleRent() {
-      this.$refs.MemberSearchRef.openModal()
-    },
-    beforeUpload(file) {
+    beforeUpload (file) {
       this.loadingInstance = Loading.service({
         lock: true,
         text: 'Loading',
@@ -290,40 +250,33 @@
         background: 'rgba(0, 0, 0, 0.7)'
       })
     },
-    uploadError() {
+    uploadError () {
       this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
         if (this.loadingInstance) {
           this.loadingInstance.close()
         }
       })
     },
-    uploadAvatarSuccess(file) {
-      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+    getDay () {
+      const now = new Date();
+      const year = now.getFullYear();
+      const month = now.getMonth() + 1; // 鍔�1浣垮叾浠�1寮�濮�
+      const day = now.getDate();
+      const hours = now.getHours();
+      const minutes = now.getMinutes();
+      const seconds = now.getSeconds();
+      return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
+    },
+    uploadAvatarSuccess (file) {
+      this.$nextTick(() => {
         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)
+      this.form.multifileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() })
     },
-    close() {
-      this.isShowModal = false
+    close () {
       this.$emit('close')
     }
   }
@@ -361,7 +314,7 @@
       .tabs {
         display: flex;
         margin-bottom: 20px;
-        display: flex;
+        align-items: center;
         justify-content: center;
 
         .tab {
diff --git a/admin/src/views/finance/components/bullEditFu.vue b/admin/src/views/finance/components/bullEditFu.vue
new file mode 100644
index 0000000..82f2833
--- /dev/null
+++ b/admin/src/views/finance/components/bullEditFu.vue
@@ -0,0 +1,383 @@
+<template>
+    <GlobalWindow width="100%" :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
+                  @confirm="confirm">
+        <div class="main">
+            <div class="main_content">
+                <el-form :model="form" label-position="top" ref="form" :rules="rules">
+                    <div class="head">
+                        <div class="m_title">鍩虹淇℃伅</div>
+                    </div>
+                    <div class="list">
+                        <el-form-item label="鍏宠仈鍚堝悓" prop="contractId">
+                            <el-select v-model="form.contractId" @change="changeContract" placeholder="璇烽�夋嫨">
+                                <el-option v-for="(item, index) in contract" :key="index" :value="item.id" :label="item.code"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="浠樻鏂�" prop="renterName">
+                            <el-input v-model="form.renterName" disabled placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="鎴挎簮" prop="ywContractRoomList">
+                            <el-select v-model="form.ywContractRoomList" multiple placeholder="璇烽�夋嫨">
+                                <el-option
+                                    v-for="(item, index) in houseList"
+                                    :key="index"
+                                    :value="item.id"
+                                    :label="item.projectName + item.buildingName + item.floorName + item.roomName" />
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="璐圭敤绫诲瀷" prop="costType">
+                            <el-select v-model="form.costType" placeholder="璇烽�夋嫨">
+                                <el-option :value="0" label="绉熻祦璐�"></el-option>
+                                <el-option :value="1" label="鐗╀笟璐�"></el-option>
+                                <el-option :value="2" label="绉熻祦鎶奸噾"></el-option>
+                                <el-option :value="3" label="鐗╀笟璇侀噾"></el-option>
+                                <el-option :value="4" label="姘寸數璐�"></el-option>
+                                <el-option :value="5" label="鏉傞」璐�"></el-option>
+                                <el-option :value="6" label="鍏朵粬"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item label="璁¤垂鍛ㄦ湡" prop="date">
+                            <el-date-picker
+                                type="daterange"
+                                range-separator="鑷�"
+                                v-model="form.date"
+                                @change="changeDate"
+                                start-placeholder="寮�濮嬫棩鏈�"
+                                end-placeholder="缁撴潫鏃ユ湡"
+                                value-format="yyyy-MM-dd"
+                                placeholder="璇烽�夋嫨" />
+                        </el-form-item>
+                        <el-form-item label="搴斾粯閲戦" prop="totleFee">
+                            <el-input v-model="form.totleFee" placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim />
+                        </el-form-item>
+                        <el-form-item label="搴斾粯鏃ユ湡" prop="planPayDate">
+                            <el-date-picker type="date" v-model="form.planPayDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
+                        </el-form-item>
+                        <el-form-item label="鎵�灞炲叕鍙�" prop="companyId">
+                            <el-select v-model="form.companyId" placeholder="璇烽�夋嫨">
+                                <el-option
+                                    v-for="(item, index) in comparyList"
+                                    :key="index"
+                                    :value="item.id"
+                                    :label="item.name" />
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item style="width: 100%;" label="璐﹀崟澶囨敞" prop="remark">
+                            <el-input type="textarea" :rows="5" v-model="form.remark" placeholder="璇疯緭鍏�" />
+                        </el-form-item>
+                    </div>
+                </el-form>
+            </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="form.multifileList" stripe>
+                <el-table-column prop="originname" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip />
+                <el-table-column prop="userName" label="鎿嶄綔浜�" align="center" min-width="100" show-overflow-tooltip />
+                <el-table-column prop="createTime" label="鎿嶄綔鏃堕棿" align="center" min-width="100" show-overflow-tooltip />
+                <el-table-column label="鎿嶄綔" align="center" min-width="100">
+                    <template slot-scope="{row}">
+                        <span class="cu red" @click="dele(row.imgaddr)">鍒犻櫎</span>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+    </GlobalWindow>
+</template>
+
+<script>
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import BaseOpera from '@/components/base/BaseOpera'
+  import { rules } from './config'
+  import { create } from '@/api/bill'
+  import { list as listAll } from '@/api/contract'
+  import { companyList } from '@/api/company'
+  import { Message, Loading } from 'element-ui'
+  import { getContractRoom } from '@/api/house'
+  import { mapState } from 'vuex'
+  export default {
+    name: 'bullEditFu',
+    components: {
+      GlobalWindow
+    },
+    computed: {
+      ...mapState(['userInfo'])
+    },
+    extends: BaseOpera,
+    data () {
+      return {
+        form: {
+          contractId: '',
+          renterName: '',
+          renterId: '',
+          costType: '',
+          type: '',
+          companyId: '',
+          remark: '',
+          startDate: '',
+          endDate: '',
+          totleFee: '',
+          planPayDate: '',
+          multifileList: [],
+          ywContractRoomList: [],
+          date: [],
+          RoomName: ''
+        },
+        rules,
+        loadingInstance: null,
+        uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
+        fileList: [],
+        uploadData: {
+          folder: 'YW_CONTRACT_BILL'
+        },
+        contract: [],
+        payerList: [],
+        comparyList: [],
+        houseList: []
+      }
+    },
+    methods: {
+      open (title, target) {
+        this.title = title
+        this.form.multifileList = []
+        this.getListAll()
+        this.getCompanyList()
+        this.visible = true
+        // 鏂板缓
+        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]
+          }
+        })
+      },
+      changeContract (e) {
+        this.form.renterName = this.contract.filter(item => {
+          if (item.id === e) {
+            return item
+          }
+        })[0].renterName
+        this.getHouseDate()
+      },
+      getHouseDate () {
+        getContractRoom({ contractId: this.form.contractId, type: 0 })
+          .then(res => {
+            this.houseList = res
+          })
+      },
+      confirm () {
+        this.$refs.form.validate((valid) => {
+          if (!valid) return
+          this.isWorking = true
+          let obj = JSON.parse(JSON.stringify(this.form))
+          obj.ywContractRoomList = obj.ywContractRoomList.map(id => {
+            return { roomId: id }
+          })
+          obj.feeType = 0
+          obj.billType = 1
+          create(obj)
+            .then(() => {
+              this.visible = false
+              this.$tip.apiSuccess('鏂板缓鎴愬姛')
+              this.$emit('success')
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+        })
+      },
+      dele (imgaddr) {
+        this.form.multifileList.forEach((item, index) => {
+          if (imgaddr === item.imgaddr) {
+            this.form.multifileList.splice(index, 1)
+          }
+        })
+      },
+      openHouse () {
+        this.$refs.selectHouse.open('閫夋嫨鎴挎簮', { contractId: this.form.contractId, type: 0 })
+      },
+      getCompanyList () {
+        companyList({})
+          .then(res => {
+            this.comparyList = res
+          })
+      },
+      getListAll () {
+        listAll({})
+          .then(res => {
+            console.log(res)
+            this.contract = res
+          })
+      },
+      changeDate (e) {
+        if (!e || e.length === 0) {
+          this.form.startDate = ''
+          this.form.endDate = ''
+        } else {
+          this.form.startDate = e[0]
+          this.form.endDate = e[1]
+        }
+      },
+      beforeUpload (file) {
+        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()
+          }
+        })
+      },
+      getDay () {
+        const now = new Date();
+        const year = now.getFullYear();
+        const month = now.getMonth() + 1; // 鍔�1浣垮叾浠�1寮�濮�
+        const day = now.getDate();
+        const hours = now.getHours();
+        const minutes = now.getMinutes();
+        const seconds = now.getSeconds();
+        return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
+      },
+      uploadAvatarSuccess (file) {
+        this.$nextTick(() => {
+          if (this.loadingInstance) {
+            this.loadingInstance.close()
+          }
+        })
+        const item = file.data[0]
+        this.form.multifileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() })
+      },
+      close () {
+        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;
+                    align-items: center;
+                    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
index 7d3be5d..c054216 100644
--- a/admin/src/views/finance/components/config.js
+++ b/admin/src/views/finance/components/config.js
@@ -1,3 +1,18 @@
+const validateArr = (rule, value, callback) => {
+  if (!value && value.length === 0) {
+    callback(new Error('璇烽�夋嫨'));
+  } else {
+    callback();
+  }
+};
 export const rules = {
-  name: [{ required: true, message: '璇疯緭鍏�' }]
-}
\ No newline at end of file
+  contractId: [{ required: true, message: '涓嶈兘涓虹┖' }],
+  customerName: [{ required: true, message: '涓嶈兘涓虹┖' }],
+  ywContractRoomList: [{ required: true, validator: validateArr, trigger: 'blur' }],
+  date: [{ required: true, validator: validateArr, trigger: 'blur' }],
+  costType: [{ required: true, message: '涓嶈兘涓虹┖' }],
+  startDate: [{ required: true, message: '涓嶈兘涓虹┖' }],
+  totleFee: [{ required: true, message: '涓嶈兘涓虹┖' }],
+  planPayDate: [{ required: true, message: '涓嶈兘涓虹┖' }],
+  companyId: [{ required: true, message: '涓嶈兘涓虹┖' }]
+}
diff --git a/admin/src/views/finance/components/flowingWater.vue b/admin/src/views/finance/components/flowingWater.vue
index 590e012..a2490c2 100644
--- a/admin/src/views/finance/components/flowingWater.vue
+++ b/admin/src/views/finance/components/flowingWater.vue
@@ -1,37 +1,33 @@
 <template>
-    <GlobalWindow width="100%" :title="title" :visible.sync="isShowModal" :confirm-working="isWorking" @close="close"
+    <GlobalWindow width="100%" :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
       @confirm="confirm">
         <div class="main">
             <div class="main_content">
-                <el-form :model="param" label-position="top" ref="paramRef" :rules="rules">
+                <el-form :model="form" label-position="top" ref="paramRef" :rules="rules">
                     <div class="head">
                         <div class="m_title">娴佹按淇℃伅</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 label="鍏宠仈鍚堝悓" required>
+                            <el-input v-model="form.contractCode" disabled placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="璐圭敤绫诲瀷" prop="code">
-                            <el-input v-model="param.code" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�" v-trim />
+                        <el-form-item label="璐圭敤绫诲瀷" required>
+                            <el-input v-model="form.costTypeName" disabled placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="璐瑰崟鍛ㄦ湡" prop="aaa">
-                            <el-select v-model="param.code" placeholder="璇烽�夋嫨" clearable>
-                                <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
-                            </el-select>
+                        <el-form-item label="璁¤垂鍛ㄦ湡" required>
+                            <el-input v-model="form.date" disabled placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="搴旀敹閲戦" prop="">
-                            <el-input v-model="param.code" placeholder="璇疯緭鍏ュ疄鏀堕噾棰�" v-trim />
+                        <el-form-item label="搴旀敹閲戦" prop="receivableFee">
+                            <el-input v-model="form.receivableFee" placeholder="璇疯緭鍏�" v-trim />
                         </el-form-item>
-                        <el-form-item label="瀹炴敹閲戦" prop="">
-                            <el-input v-model="param.code" placeholder="璇疯緭鍏ュ疄鏀堕噾棰�" v-trim />
+                        <el-form-item label="瀹炴敹閲戦" prop="actReceivableFee">
+                            <el-input v-model="form.actReceivableFee" placeholder="璇疯緭鍏�" v-trim />
                         </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 label="鍏ヨ处鏃ユ湡" prop="actPayDate">
+                            <el-date-picker type="date" v-model="form.actPayDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
                         </el-form-item>
-                        <el-form-item label="鏀舵鏂瑰紡" prop="">
-                            <el-select v-model="param.content" placeholder="璇烽�夋嫨">
+                        <el-form-item label="鏀舵鏂瑰紡" prop="payType">
+                            <el-select v-model="form.payType" placeholder="璇烽�夋嫨">
                                 <el-option label="鐜伴噾" :value="1"></el-option>
                                 <el-option label="缃戦摱杞处" :value="2"></el-option>
                                 <el-option label="POS鏈�" :value="3"></el-option>
@@ -41,18 +37,16 @@
                                 <el-option label="鍏跺畠鏂瑰紡" :value="7"></el-option>
                             </el-select>
                         </el-form-item>
-                        <el-form-item label="鎵�灞炲叕鍙�" prop="">
-                            <el-select v-model="param.code" placeholder="璇烽�夋嫨" clearable>
-                                <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
+                        <el-form-item label="鎵�灞炲叕鍙�" prop="companyName">
+                            <el-input disabled v-model="form.companyName" placeholder="璇疯緭鍏�" />
+                        </el-form-item>
+                        <el-form-item label="鏀舵敮璐︽埛" prop="accountId">
+                            <el-select v-model="form.accountId" placeholder="璇烽�夋嫨" clearable>
+                                <el-option v-for="item in agentList" :value="item.id" :label="item.title"></el-option>
                             </el-select>
                         </el-form-item>
-                        <el-form-item label="鏀舵敮璐︽埛" prop="">
-                            <el-select v-model="param.code" 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="" style="width: 100%;">
-                            <el-input type="textarea" :rows="6" v-model="param.content" placeholder="璇疯緭鍏�" />
+                        <el-form-item label="澶囨敞" prop="remark" style="width: 100%;">
+                            <el-input type="textarea" :rows="6" v-model="form.remark" placeholder="璇疯緭鍏�" />
                         </el-form-item>
                     </div>
                 </el-form>
@@ -62,17 +56,17 @@
             <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">
+                   :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>
+            <el-table :data="form.multifileList" stripe>
+                <el-table-column prop="name" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip />
+                <el-table-column prop="userName" label="鎿嶄綔浜�" align="center" min-width="100" show-overflow-tooltip />
+                <el-table-column prop="createTime" label="鎿嶄綔鏃堕棿" align="center" min-width="100" show-overflow-tooltip />
+                <el-table-column label="鎿嶄綔" align="center" min-width="100">
+                    <template slot-scope="{ row }">
+                        <span class="cu red" @click="dele(row.imgaddr)">鍒犻櫎</span>
                     </template>
                 </el-table-column>
             </el-table>
@@ -84,122 +78,56 @@
   import GlobalWindow from '@/components/common/GlobalWindow'
   import BaseOpera from '@/components/base/BaseOpera'
   import { rules } from './config'
+  import { ywAccountList } from '@/api/bill'
+  import { create } from '@/api/ywContractRevenue'
   import { Message, Loading } from 'element-ui'
+  import { mapState } from 'vuex'
   export default {
     name: "flowingWater",
     components: {
       GlobalWindow
     },
+    computed: {
+      ...mapState(['userInfo'])
+    },
     extends: BaseOpera,
     data() {
       return {
-        isShowModal: false,
-        title: '',
-        activeTabs: '0',
-        param: {},
+        form: {
+          billId: '',
+          billType: '',
+          costType: '',
+          contractCode: '',
+          contractId: '',
+          startDate: '',
+          endDate: '',
+          date: '',
+          companyId: '',
+          actReceivableFee: '',
+          actPayDate: '',
+          payType: '',
+          companyName: '',
+          remark: '',
+          accountId: '',
+          multifileList: [],
+          costTypeName: ''
+        },
         rules,
-        timeTab: '0',
 
         loadingInstance: null,
         uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
-        fileList: [],
         uploadData: {
-          folder: 'HIDDEN_DANGER_FILE'
+          folder: 'YW_CONTRACT_BILL'
         },
-
-        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 },
-        ],
+        agentList: []
       }
     },
-    created() {
-      const { param } = this
-      this.title = param.id ? '缂栬緫鏀舵璐﹀崟' : '鍒涘缓鏀舵璐﹀崟'
-    },
     methods: {
-      tabsClick(val) {
-        this.activeTabs = val
-      },
-      timeTabClick(val) {
-        this.timeTab = val
-      },
-      getDetail() {
-
+      confirm () {
+        create(this.form)
+          .then(res => {
+            console.log(res)
+          })
       },
       handleRent() {
         this.$refs.MemberSearchRef.openModal()
@@ -207,13 +135,24 @@
       houseChange(e) {
         console.log(e)
         console.log(this.value)
-
+      },
+      getDates (companyId) {
+        ywAccountList({
+          companyId,
+          isdeleted: 0,
+          status: 0
+        }).then(res => {
+          this.agentList = res
+        })
+      },
+      dele (imgaddr) {
+        this.form.multifileList.forEach((item, index) => {
+          if (imgaddr === item.imgaddr) {
+            this.form.multifileList.splice(index, 1)
+          }
+        })
       },
       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',
@@ -228,38 +167,39 @@
           }
         })
       },
+      getDay () {
+        const now = new Date()
+        const year = now.getFullYear()
+        const month = now.getMonth() + 1 // 鍔�1浣垮叾浠�1寮�濮�
+        const day = now.getDate()
+        const hours = now.getHours()
+        const minutes = now.getMinutes()
+        const seconds = now.getSeconds()
+        return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
+      },
       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)
+        console.log(item)
+        this.form.multifileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() })
       },
       close() {
-        this.isShowModal = false
         this.$emit('close')
       },
       open(title, target) {
         this.title = title
-        this.isShowModal = true
+        this.visible = true
+        this.$nextTick(() => {
+          for (const key in this.form) {
+            this.form[key] = target[key]
+          }
+        })
+        console.log(this.form)
+        this.getDates(target.companyId)
       }
     }
   }
diff --git a/admin/src/views/finance/components/selectHouse.vue b/admin/src/views/finance/components/selectHouse.vue
new file mode 100644
index 0000000..7d44e38
--- /dev/null
+++ b/admin/src/views/finance/components/selectHouse.vue
@@ -0,0 +1,185 @@
+<template>
+    <GlobalWindow
+        width="100%"
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @close="close"
+        @confirm="confirm">
+        <el-table
+            :data="houseList"
+            border
+            @selection-change="handleSelectionChange"
+            style="width: 100%">
+            <el-table-column
+                type="selection"
+                width="55">
+            </el-table-column>
+            <el-table-column
+                prop="projectName"
+                label="椤圭洰鍚嶇О">
+            </el-table-column>
+            <el-table-column
+                prop="buildingName"
+                label="妤煎畤鍚嶇О">
+            </el-table-column>
+            <el-table-column
+                prop="floorName"
+                label="妤煎眰鍚嶇О">
+            </el-table-column>
+            <el-table-column
+                prop="roomName"
+                label="鎴块棿鍚嶇О">
+            </el-table-column>
+        </el-table>
+    </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BaseOpera from '@/components/base/BaseOpera'
+import { getContractRoom } from '@/api/house'
+export default {
+  name: 'selectHouse',
+  components: {
+    GlobalWindow
+  },
+  extends: BaseOpera,
+  data () {
+    return {
+      houseList: [],
+      form: {},
+      seleData: []
+    }
+  },
+  methods: {
+    open (title, target) {
+      this.title = title
+      this.form = target
+      this.getAll()
+    },
+    getAll () {
+      getContractRoom({ ...this.form })
+        .then(res => {
+          console.log(res)
+          this.houseList = res
+          this.visible = true
+        })
+    },
+    handleSelectionChange (e) {
+      console.log(e)
+      this.seleData = e
+    }
+  }
+}
+</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;
+                    align-items: center;
+                    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/payments.vue b/admin/src/views/finance/payments.vue
index 3334854..e88731a 100644
--- a/admin/src/views/finance/payments.vue
+++ b/admin/src/views/finance/payments.vue
@@ -2,31 +2,50 @@
   <div class="main_app">
     <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
     <div class="mt20">
-      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
-        v-permissions="['business:ywpatrolline:create']">鏂板缓</el-button>
       <el-button @click="handleEdit()" v-permissions="['business:ywpatrolline:create']">瀵煎嚭</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column prop="" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="" 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>
+      <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="contractCode" label="鍚堝悓缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鎴垮彿" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <div style="display: flex; flex-direction: column;" v-if="row.roomPathName">
+            <span v-for="(item, index) in row.roomPathName.split(';')" :key="index">{{item}}</span>
+          </div>
         </template>
       </el-table-column>
-      <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+      <el-table-column prop="billCode" label="璐﹀崟缂栧彿" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鏀舵敮绫诲瀷" min-width="100" show-overflow-tooltip>
         <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>
+          <span v-if="row.revenueType === 0">鏀跺叆</span>
+          <span v-if="row.revenueType === 1">鏀嚭</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="actReceivableFee" label="鍙戠敓閲戦" min-width="100" show-overflow-tooltip />
+      <el-table-column label="鏀舵鏂瑰紡" min-width="100" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <span v-if="row.payType === 0">鐜伴噾</span>
+          <span v-if="row.payType === 1">缃戦摱杞处</span>
+          <span v-if="row.payType === 2">POS鏈�</span>
+          <span v-if="row.payType === 3">鏀粯瀹�</span>
+          <span v-if="row.payType === 4">寰俊</span>
+          <span v-if="row.payType === 5">杞处鏀エ</span>
+          <span v-if="row.payType === 6">鍏朵粬</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="payDateEnd" label="鍏ヨ处鏃ユ湡" show-overflow-tooltip />
+      <el-table-column prop="createDate" label="鍒涘缓鏃ユ湡" show-overflow-tooltip />
+      <el-table-column prop="realname" label="鍒涘缓浜�" show-overflow-tooltip />
+      <el-table-column label="鐘舵��" min-width="100" fixed="right" show-overflow-tooltip>
+        <template slot-scope="{row}">
+          <el-tag type="success" v-if="row.status === 0">寮�鍚�</el-tag>
+          <el-tag type="info" v-if="row.status === 1">鍏抽棴</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" min-width="190" fixed="right">
+        <template slot-scope="{row}">
+          <el-button type="text">鏌ョ湅璇︽儏</el-button>
+          <el-button type="text" @click="closeDW(row.id)">鍏抽棴娴佹按</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -41,7 +60,7 @@
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
 import Edit from './components/paymentsEdit.vue'
-import { companyGetList, deleteById } from '@/api/business/company'
+import { fetchList, close } from '@/api/ywContractRevenue'
 export default {
   components: {
     Pagination,
@@ -63,22 +82,35 @@
       queryFormConfig: {
         formItems: [
           {
-            filed: 'name',
+            filed: 'customerName',
             type: 'input',
             label: '瀹㈡埛鍚嶇О'
           },
           {
-            filed: 'name',
+            filed: 'revenueType',
             type: 'select',
-            label: '鏀舵敮绫诲瀷'
+            label: '鏀舵敮绫诲瀷',
+            options: [
+              { value: 0, label: '鏀跺叆' },
+              { value: 1, label: '鏀嚭' }
+            ]
           },
           {
-            filed: 'name',
+            filed: 'payType',
             type: 'select',
-            label: '鏀舵鏂瑰紡'
+            label: '鏀舵鏂瑰紡',
+            options: [
+              { value: 0, label: '鐜伴噾' },
+              { value: 1, label: '缃戦摱杞处' },
+              { value: 2, label: 'POS鏈�' },
+              { value: 3, label: '鏀粯瀹�' },
+              { value: 4, label: '寰俊' },
+              { value: 5, label: '杞处鏀エ' },
+              { value: 6, label: '鍏朵粬' }
+            ]
           },
           {
-            filed: 'name',
+            filed: 'payDate',
             type: 'daterange',
             label: '鍏ヨ处鏃ユ湡'
           },
@@ -94,24 +126,34 @@
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
-      companyGetList({
+      fetchList({
         model: {
-          ...filters,
-          type: 2
+          ...filters
         },
         capacity: pagination.pageSize,
         page: page || pagination.page,
       }).then(res => {
         this.loading = false
         this.list = res.records || []
-        this.list.forEach(item => {
-          item.stautsName = item.status == 0 ? '姝e父' : item.status == 1 ? '鎹熷潖' : '鎶ュ簾'
-        })
         this.pagination.total = res.total || 0
       }, () => {
         this.loading = false
       })
     },
+    closeDW (id) {
+      this.$confirm('纭鍏抽棴姝ゆ祦姘村悧?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        close(id)
+          .then(res => {
+            this.getList()
+          })
+      }).catch(() => {
+      
+      });
+    },
     handleEdit(row) {
       this.showEdit = true
       this.$nextTick(() => {

--
Gitblit v1.9.3