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