Commit fc9bd1db403ef1a693f8f03b3d2a7954d50bddd4
1 parent
1d33ddab
开发完成合同详情
Showing
49 changed files
with
3061 additions
and
23 deletions
src/api/contract/contractDetailApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 查询合同详情 | ||
| 4 | +export function queryContract(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/contract/queryContract', | ||
| 8 | + method: 'get', | ||
| 9 | + params | ||
| 10 | + }).then(response => { | ||
| 11 | + const res = response.data | ||
| 12 | + if (res.code === 0) { | ||
| 13 | + resolve(res) | ||
| 14 | + } else { | ||
| 15 | + reject(new Error(res.msg || '查询合同详情失败')) | ||
| 16 | + } | ||
| 17 | + }).catch(error => { | ||
| 18 | + reject(error) | ||
| 19 | + }) | ||
| 20 | + }) | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +// 获取合同房屋列表 | ||
| 24 | +export function getContractRooms(params) { | ||
| 25 | + return new Promise((resolve, reject) => { | ||
| 26 | + request({ | ||
| 27 | + url: '/contract/getContractRooms', | ||
| 28 | + method: 'get', | ||
| 29 | + params | ||
| 30 | + }).then(response => { | ||
| 31 | + const res = response.data | ||
| 32 | + if (res.code === 0) { | ||
| 33 | + resolve(res) | ||
| 34 | + } else { | ||
| 35 | + reject(new Error(res.msg || '获取合同房屋列表失败')) | ||
| 36 | + } | ||
| 37 | + }).catch(error => { | ||
| 38 | + reject(error) | ||
| 39 | + }) | ||
| 40 | + }) | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +// 获取合同附件列表 | ||
| 44 | +export function getContractFiles(params) { | ||
| 45 | + return new Promise((resolve, reject) => { | ||
| 46 | + request({ | ||
| 47 | + url: '/contract/getContractFiles', | ||
| 48 | + method: 'get', | ||
| 49 | + params | ||
| 50 | + }).then(response => { | ||
| 51 | + const res = response.data | ||
| 52 | + if (res.code === 0) { | ||
| 53 | + resolve(res) | ||
| 54 | + } else { | ||
| 55 | + reject(new Error(res.msg || '获取合同附件列表失败')) | ||
| 56 | + } | ||
| 57 | + }).catch(error => { | ||
| 58 | + reject(error) | ||
| 59 | + }) | ||
| 60 | + }) | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +// 获取合同费用列表 | ||
| 64 | +export function getContractFees(params) { | ||
| 65 | + return new Promise((resolve, reject) => { | ||
| 66 | + request({ | ||
| 67 | + url: '/contract/getContractFees', | ||
| 68 | + method: 'get', | ||
| 69 | + params | ||
| 70 | + }).then(response => { | ||
| 71 | + const res = response.data | ||
| 72 | + if (res.code === 0) { | ||
| 73 | + resolve(res) | ||
| 74 | + } else { | ||
| 75 | + reject(new Error(res.msg || '获取合同费用列表失败')) | ||
| 76 | + } | ||
| 77 | + }).catch(error => { | ||
| 78 | + reject(error) | ||
| 79 | + }) | ||
| 80 | + }) | ||
| 81 | +} | ||
| 82 | + | ||
| 83 | +// 获取合同历史缴费记录 | ||
| 84 | +export function getContractHisFees(params) { | ||
| 85 | + return new Promise((resolve, reject) => { | ||
| 86 | + request({ | ||
| 87 | + url: '/contract/getContractHisFees', | ||
| 88 | + method: 'get', | ||
| 89 | + params | ||
| 90 | + }).then(response => { | ||
| 91 | + const res = response.data | ||
| 92 | + if (res.code === 0) { | ||
| 93 | + resolve(res) | ||
| 94 | + } else { | ||
| 95 | + reject(new Error(res.msg || '获取合同历史缴费记录失败')) | ||
| 96 | + } | ||
| 97 | + }).catch(error => { | ||
| 98 | + reject(error) | ||
| 99 | + }) | ||
| 100 | + }) | ||
| 101 | +} | ||
| 0 | \ No newline at end of file | 102 | \ No newline at end of file |
src/api/contract/contractDetailChangeApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 查询合同变更计划 | ||
| 4 | +export function queryContractChangePlan(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/contract/queryContractChangePlan', | ||
| 8 | + method: 'get', | ||
| 9 | + params | ||
| 10 | + }).then(response => { | ||
| 11 | + const res = response.data | ||
| 12 | + if (res.code === 0) { | ||
| 13 | + resolve(res) | ||
| 14 | + } else { | ||
| 15 | + reject(new Error(res.msg || '查询合同变更计划失败')) | ||
| 16 | + } | ||
| 17 | + }).catch(error => { | ||
| 18 | + reject(error) | ||
| 19 | + }) | ||
| 20 | + }) | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
src/api/contract/contractDetailFeeApi.js
0 → 100644
src/api/contract/contractDetailFileApi.js
0 → 100644
src/api/contract/contractDetailFlowApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 查询工作流审核信息 | ||
| 4 | +export function listWorkflowAuditInfo(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: 'workflow.listWorkflowAuditInfo', | ||
| 8 | + method: 'get', | ||
| 9 | + params | ||
| 10 | + }).then(response => { | ||
| 11 | + const res = response.data | ||
| 12 | + if (res.code === 0) { | ||
| 13 | + resolve(res) | ||
| 14 | + } else { | ||
| 15 | + reject(new Error(res.msg || '查询工作流审核信息失败')) | ||
| 16 | + } | ||
| 17 | + }).catch(error => { | ||
| 18 | + reject(error) | ||
| 19 | + }) | ||
| 20 | + }) | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
src/api/contract/contractDetailHisFeeApi.js
0 → 100644
src/api/contract/contractDetailHisRoomFeeApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 查询费用明细 | ||
| 4 | +export function queryFeeDetail(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/fee.queryFeeDetail', | ||
| 8 | + method: 'get', | ||
| 9 | + params | ||
| 10 | + }).then(response => { | ||
| 11 | + const res = response.data | ||
| 12 | + if (res.code === 0) { | ||
| 13 | + resolve(res) | ||
| 14 | + } else { | ||
| 15 | + reject(new Error(res.msg || '查询费用明细失败')) | ||
| 16 | + } | ||
| 17 | + }).catch(error => { | ||
| 18 | + reject(error) | ||
| 19 | + }) | ||
| 20 | + }) | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
src/api/contract/contractDetailOwnerApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryOwners(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/owner.queryOwners', | ||
| 7 | + method: 'get', | ||
| 8 | + params | ||
| 9 | + }).then(response => { | ||
| 10 | + const res = response.data | ||
| 11 | + if (res.code === 0) { | ||
| 12 | + resolve(res) | ||
| 13 | + } else { | ||
| 14 | + reject(new Error(res.msg || '获取业主列表失败')) | ||
| 15 | + } | ||
| 16 | + }).catch(error => { | ||
| 17 | + reject(error) | ||
| 18 | + }) | ||
| 19 | + }) | ||
| 20 | +} | ||
| 0 | \ No newline at end of file | 21 | \ No newline at end of file |
src/api/contract/contractDetailReceiptApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryFeeReceipt(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/feeReceipt/queryFeeReceipt', | ||
| 7 | + method: 'get', | ||
| 8 | + params | ||
| 9 | + }).then(response => { | ||
| 10 | + const res = response.data | ||
| 11 | + if (res.code === 0) { | ||
| 12 | + resolve(res) | ||
| 13 | + } else { | ||
| 14 | + reject(new Error(res.msg || '获取收据列表失败')) | ||
| 15 | + } | ||
| 16 | + }).catch(error => { | ||
| 17 | + reject(error) | ||
| 18 | + }) | ||
| 19 | + }) | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +export function listFeePrintPage(params) { | ||
| 23 | + return new Promise((resolve, reject) => { | ||
| 24 | + request({ | ||
| 25 | + url: '/feePrintPage.listFeePrintPage', | ||
| 26 | + method: 'get', | ||
| 27 | + params | ||
| 28 | + }).then(response => { | ||
| 29 | + const res = response.data | ||
| 30 | + if (res.code === 0) { | ||
| 31 | + resolve(res) | ||
| 32 | + } else { | ||
| 33 | + reject(new Error(res.msg || '获取打印页面列表失败')) | ||
| 34 | + } | ||
| 35 | + }).catch(error => { | ||
| 36 | + reject(error) | ||
| 37 | + }) | ||
| 38 | + }) | ||
| 39 | +} | ||
| 0 | \ No newline at end of file | 40 | \ No newline at end of file |
src/api/contract/contractDetailRoomApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +export function queryContractRoom(params) { | ||
| 4 | + return new Promise((resolve, reject) => { | ||
| 5 | + request({ | ||
| 6 | + url: '/contract/queryContractRoom', | ||
| 7 | + method: 'get', | ||
| 8 | + params | ||
| 9 | + }).then(response => { | ||
| 10 | + const res = response.data | ||
| 11 | + if (res.code === 0) { | ||
| 12 | + resolve(res) | ||
| 13 | + } else { | ||
| 14 | + reject(new Error(res.msg || '查询合同信息失败')) | ||
| 15 | + } | ||
| 16 | + }).catch(error => { | ||
| 17 | + reject(error) | ||
| 18 | + }) | ||
| 19 | + }) | ||
| 20 | +} | ||
| 0 | \ No newline at end of file | 21 | \ No newline at end of file |
src/api/contract/contractDetailSubApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 查询合同信息 | ||
| 4 | +export function queryContract(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/contract/queryContract', | ||
| 8 | + method: 'get', | ||
| 9 | + params | ||
| 10 | + }).then(response => { | ||
| 11 | + const res = response.data | ||
| 12 | + if (res.code === 0) { | ||
| 13 | + resolve(res) | ||
| 14 | + } else { | ||
| 15 | + reject(new Error(res.msg || '查询合同信息失败')) | ||
| 16 | + } | ||
| 17 | + }).catch(error => { | ||
| 18 | + reject(error) | ||
| 19 | + }) | ||
| 20 | + }) | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
src/components/contract/contractDetailChange.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="margin-top"> | ||
| 3 | + <div class="flex justify-end"> | ||
| 4 | + <div :span="2" class="padding-right-xs padding-left-xl"></div> | ||
| 5 | + <div :span="2" class="padding-right-xs padding-right-xl"></div> | ||
| 6 | + <div :span="8" class="text-right"></div> | ||
| 7 | + </div> | ||
| 8 | + <div class="margin-top"> | ||
| 9 | + <el-table :data="contractDetailChangeInfo.contracts" style="width: 100%" border stripe> | ||
| 10 | + <el-table-column prop="contractName" :label="$t('contractDetailChange.contractName')" align="center" /> | ||
| 11 | + <el-table-column prop="contractCode" :label="$t('contractDetailChange.contractCode')" align="center" /> | ||
| 12 | + <el-table-column prop="contractTypeName" :label="$t('contractDetailChange.contractType')" align="center" /> | ||
| 13 | + <el-table-column prop="partyA" :label="$t('contractDetailChange.partyA')" align="center" /> | ||
| 14 | + <el-table-column prop="partyB" :label="$t('contractDetailChange.partyB')" align="center" /> | ||
| 15 | + <el-table-column prop="planTypeName" :label="$t('contractDetailChange.changeType')" align="center" /> | ||
| 16 | + <el-table-column prop="changePersonName" :label="$t('contractDetailChange.changePerson')" align="center" /> | ||
| 17 | + <el-table-column prop="createTime" :label="$t('contractDetailChange.applyTime')" align="center" /> | ||
| 18 | + <el-table-column prop="remark" :label="$t('contractDetailChange.description')" align="center" /> | ||
| 19 | + <el-table-column prop="stateName" :label="$t('contractDetailChange.status')" align="center" /> | ||
| 20 | + <el-table-column :label="$t('contractDetailChange.operation')" align="center"> | ||
| 21 | + <template #default="{ row }"> | ||
| 22 | + <el-button type="text" size="small" @click="_toContractDetails(row)"> | ||
| 23 | + {{ $t('contractDetailChange.detail') }} | ||
| 24 | + </el-button> | ||
| 25 | + </template> | ||
| 26 | + </el-table-column> | ||
| 27 | + </el-table> | ||
| 28 | + <el-row> | ||
| 29 | + <el-col :span="4"></el-col> | ||
| 30 | + <el-col :span="8"> | ||
| 31 | + <el-pagination class="pagination" layout="total, sizes, prev, pager, next, jumper" :total="total" | ||
| 32 | + :page-size="pageSize" @current-change="handleCurrentChange" @size-change="handleSizeChange" /> | ||
| 33 | + </el-col> | ||
| 34 | + </el-row> | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | +</template> | ||
| 38 | + | ||
| 39 | +<script> | ||
| 40 | +import { queryContractChangePlan } from '@/api/contract/contractDetailChangeApi' | ||
| 41 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 42 | + | ||
| 43 | +export default { | ||
| 44 | + name: 'ContractDetailChange', | ||
| 45 | + data() { | ||
| 46 | + return { | ||
| 47 | + contractDetailChangeInfo: { | ||
| 48 | + contracts: [], | ||
| 49 | + contractId: '', | ||
| 50 | + roomNum: '', | ||
| 51 | + totalArea: '0', | ||
| 52 | + logStartTime: '', | ||
| 53 | + logEndTime: '', | ||
| 54 | + contractCode: '', | ||
| 55 | + staffNameLike: '' | ||
| 56 | + }, | ||
| 57 | + pageSize: 10, | ||
| 58 | + currentPage: 1, | ||
| 59 | + total: 0, | ||
| 60 | + communityId: '' | ||
| 61 | + } | ||
| 62 | + }, | ||
| 63 | + created() { | ||
| 64 | + this.communityId = getCommunityId() | ||
| 65 | + }, | ||
| 66 | + methods: { | ||
| 67 | + open(data) { | ||
| 68 | + this.contractDetailChangeInfo.contractId = data.contractId | ||
| 69 | + this.contractDetailChangeInfo.logStartTime = data.logStartTime | ||
| 70 | + this.contractDetailChangeInfo.logEndTime = data.logEndTime | ||
| 71 | + this.contractDetailChangeInfo.contractCode = data.contractCode | ||
| 72 | + this._loadContractDetailChangeData() | ||
| 73 | + }, | ||
| 74 | + handleCurrentChange(val) { | ||
| 75 | + this.currentPage = val | ||
| 76 | + this._loadContractDetailChangeData() | ||
| 77 | + }, | ||
| 78 | + handleSizeChange(val) { | ||
| 79 | + this.pageSize = val | ||
| 80 | + this._loadContractDetailChangeData() | ||
| 81 | + }, | ||
| 82 | + _loadContractDetailChangeData() { | ||
| 83 | + const params = { | ||
| 84 | + contractId: this.contractDetailChangeInfo.contractId, | ||
| 85 | + logStartTime: this.contractDetailChangeInfo.logStartTime, | ||
| 86 | + logEndTime: this.contractDetailChangeInfo.logEndTime, | ||
| 87 | + contractCode: this.contractDetailChangeInfo.contractCode, | ||
| 88 | + staffNameLike: this.contractDetailChangeInfo.staffNameLike, | ||
| 89 | + page: this.currentPage, | ||
| 90 | + row: this.pageSize | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + queryContractChangePlan(params).then(response => { | ||
| 94 | + this.contractDetailChangeInfo.contracts = response.data | ||
| 95 | + this.total = response.records | ||
| 96 | + }).catch(error => { | ||
| 97 | + console.error('请求失败:', error) | ||
| 98 | + }) | ||
| 99 | + }, | ||
| 100 | + _qureyContractDetailChange() { | ||
| 101 | + this.currentPage = 1 | ||
| 102 | + this._loadContractDetailChangeData() | ||
| 103 | + }, | ||
| 104 | + _toContractDetails(contract) { | ||
| 105 | + this.$router.push(`/pages/admin/contractChangeDetails?planId=${contract.planId}`) | ||
| 106 | + }, | ||
| 107 | + switch(data) { | ||
| 108 | + this.contractDetailChangeInfo.contractId = data.contractId | ||
| 109 | + this.contractDetailChangeInfo.logStartTime = data.logStartTime | ||
| 110 | + this.contractDetailChangeInfo.logEndTime = data.logEndTime | ||
| 111 | + this.contractDetailChangeInfo.contractCode = data.contractCode | ||
| 112 | + this._loadContractDetailChangeData() | ||
| 113 | + }, | ||
| 114 | + notify() { | ||
| 115 | + this._loadContractDetailChangeData() | ||
| 116 | + } | ||
| 117 | + } | ||
| 118 | +} | ||
| 119 | +</script> | ||
| 120 | + | ||
| 121 | +<style scoped> | ||
| 122 | +.margin-top { | ||
| 123 | + margin-top: 20px; | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +.margin-top-lg { | ||
| 127 | + margin-top: 30px; | ||
| 128 | +} | ||
| 129 | + | ||
| 130 | +.padding-right-xs { | ||
| 131 | + padding-right: 10px; | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +.padding-left-xl { | ||
| 135 | + padding-left: 40px; | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +.padding-right-xl { | ||
| 139 | + padding-right: 40px; | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +.text-right { | ||
| 143 | + text-align: right; | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | +.pagination { | ||
| 147 | + margin-top: 20px; | ||
| 148 | +} | ||
| 149 | +</style> | ||
| 0 | \ No newline at end of file | 150 | \ No newline at end of file |
src/components/contract/contractDetailChangeDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-change ref="contractDetailChange"></contract-detail-change> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailChange from '@/components/contract/contractDetailChange' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailChange | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailChange.switch({ | ||
| 18 | + contractId: '12345', | ||
| 19 | + logStartTime: '2023-01-01', | ||
| 20 | + logEndTime: '2023-12-31', | ||
| 21 | + contractCode: 'CONTRACT001' | ||
| 22 | + }) | ||
| 23 | + } | ||
| 24 | + } | ||
| 25 | +} | ||
| 26 | +</script> | ||
| 0 | \ No newline at end of file | 27 | \ No newline at end of file |
src/components/contract/contractDetailFee.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="margin-top"> | ||
| 3 | + <div class="flex justify-end"> | ||
| 4 | + <div :span="2" class="padding-right-xs padding-left-xl"></div> | ||
| 5 | + <div :span="2" class="padding-right-xs padding-right-xl"></div> | ||
| 6 | + <div :span="8" class="text-right"> | ||
| 7 | + <el-button type="primary" size="small" style="margin-left:10px" @click="_openTempImportContractFeeModal"> | ||
| 8 | + {{ $t('contractDetailFee.temporaryFee') }} | ||
| 9 | + </el-button> | ||
| 10 | + <el-button type="primary" size="small" style="margin-left:10px" @click="_openContractCreateFeeAddModal"> | ||
| 11 | + {{ $t('contractDetailFee.createFee') }} | ||
| 12 | + </el-button> | ||
| 13 | + <el-button type="primary" size="small" style="margin-left:10px" @click="_toContractOwePayFee"> | ||
| 14 | + {{ $t('contractDetailFee.payArrears') }} | ||
| 15 | + </el-button> | ||
| 16 | + </div> | ||
| 17 | + </div> | ||
| 18 | + <div class="margin-top"> | ||
| 19 | + <el-table :data="contractDetailFeeInfo.fees" style="width: 100%" border stripe> | ||
| 20 | + <el-table-column prop="feeName" :label="$t('contractDetailFee.feeItem')" align="center"></el-table-column> | ||
| 21 | + <el-table-column prop="feeFlagName" :label="$t('contractDetailFee.feeFlag')" align="center"></el-table-column> | ||
| 22 | + <el-table-column prop="feeTypeCdName" :label="$t('contractDetailFee.feeType')" align="center"></el-table-column> | ||
| 23 | + <el-table-column prop="amountOwed" :label="$t('contractDetailFee.receivableAmount')" | ||
| 24 | + align="center"></el-table-column> | ||
| 25 | + <el-table-column prop="startTime" :label="$t('contractDetailFee.accountingTime')" | ||
| 26 | + align="center"></el-table-column> | ||
| 27 | + <el-table-column :label="$t('contractDetailFee.receivablePeriod')" align="center"> | ||
| 28 | + <template slot-scope="scope"> | ||
| 29 | + {{ _getContractEndTime(scope.row) }}~<br /> | ||
| 30 | + {{ _getContractDeadlineTime(scope.row) }} | ||
| 31 | + </template> | ||
| 32 | + </el-table-column> | ||
| 33 | + <el-table-column :label="$t('contractDetailFee.description')" align="center" width="150"> | ||
| 34 | + <template slot-scope="scope"> | ||
| 35 | + <div v-if="scope.row.computingFormula == '5005' || scope.row.computingFormula == '9009'"> | ||
| 36 | + <div><span>{{ $t('contractDetailFee.previousReading') }}:</span>{{ scope.row.preDegrees }}</div> | ||
| 37 | + <div><span>{{ $t('contractDetailFee.currentReading') }}:</span>{{ scope.row.curDegrees }}</div> | ||
| 38 | + <div><span>{{ $t('contractDetailFee.unitPrice') }}:</span>{{ scope.row.mwPrice || scope.row.squarePrice }} | ||
| 39 | + </div> | ||
| 40 | + <div><span>{{ $t('contractDetailFee.surcharge') }}:</span>{{ scope.row.additionalAmount }}</div> | ||
| 41 | + </div> | ||
| 42 | + <div v-else-if="scope.row.computingFormula == '6006'"> | ||
| 43 | + <div><span>{{ $t('contractDetailFee.usage') }}:</span>{{ | ||
| 44 | + _getContractAttrValue(scope.row.feeAttrs, '390006') }}</div> | ||
| 45 | + <div><span>{{ $t('contractDetailFee.unitPrice') }}:</span>{{ scope.row.squarePrice }}</div> | ||
| 46 | + <div><span>{{ $t('contractDetailFee.surcharge') }}:</span>{{ scope.row.additionalAmount }}</div> | ||
| 47 | + </div> | ||
| 48 | + <div v-else-if="scope.row.feeTypeCd == '888800010017'"> | ||
| 49 | + <div><span>{{ $t('contractDetailFee.algorithm') }}:</span>{{ | ||
| 50 | + _getContractAttrValue(scope.row.feeAttrs, '390005') }}</div> | ||
| 51 | + <div><span>{{ $t('contractDetailFee.usage') }}:</span>{{ | ||
| 52 | + _getContractAttrValue(scope.row.feeAttrs, '390003') }}</div> | ||
| 53 | + </div> | ||
| 54 | + <div v-else-if="scope.row.computingFormula == '4004'"> | ||
| 55 | + <div>{{ $t('contractDetailFee.feeBasedOnActual') }}</div> | ||
| 56 | + </div> | ||
| 57 | + <div v-else> | ||
| 58 | + <div><span>{{ $t('contractDetailFee.unitPrice') }}:</span>{{ scope.row.squarePrice }}</div> | ||
| 59 | + <div v-if="scope.row.feeFlag == '1003006'"><span>{{ $t('contractDetailFee.surcharge') }}:</span>{{ | ||
| 60 | + scope.row.additionalAmount }}</div> | ||
| 61 | + <div v-else><span>{{ $t('contractDetailFee.fixedFee') }}:</span>{{ scope.row.additionalAmount }}</div> | ||
| 62 | + </div> | ||
| 63 | + </template> | ||
| 64 | + </el-table-column> | ||
| 65 | + <el-table-column prop="stateName" :label="$t('contractDetailFee.status')" align="center"></el-table-column> | ||
| 66 | + <el-table-column :label="$t('contractDetailFee.operation')" align="center"> | ||
| 67 | + <template slot-scope="scope"> | ||
| 68 | + <el-button type="text" v-if="scope.row.state != '2009001' && hasPrivilege('502020082314267912')" | ||
| 69 | + @click="_payContractFee(scope.row)"> | ||
| 70 | + {{ $t('contractDetailFee.payment') }} | ||
| 71 | + </el-button> | ||
| 72 | + <el-button type="text" @click="_payContractFeeHis(scope.row)"> | ||
| 73 | + {{ $t('contractDetailFee.paymentHistory') }} | ||
| 74 | + </el-button> | ||
| 75 | + <el-button type="text" v-if="hasPrivilege('502020090604200029')" @click="_deleteContractFee(scope.row)"> | ||
| 76 | + {{ $t('contractDetailFee.cancel') }} | ||
| 77 | + </el-button> | ||
| 78 | + <el-button type="text" v-if="scope.row.state != '2009001' && hasPrivilege('502021070488970005')" | ||
| 79 | + @click="_finishContractFee(scope.row)"> | ||
| 80 | + {{ $t('contractDetailFee.end') }} | ||
| 81 | + </el-button> | ||
| 82 | + <el-button type="text" v-if="scope.row.state != '2009001' && hasPrivilege('502020090427190001')" | ||
| 83 | + @click="_editContractFee(scope.row)"> | ||
| 84 | + {{ $t('contractDetailFee.change') }} | ||
| 85 | + </el-button> | ||
| 86 | + </template> | ||
| 87 | + </el-table-column> | ||
| 88 | + </el-table> | ||
| 89 | + <el-row class="margin-top"> | ||
| 90 | + <el-col :span="4"> | ||
| 91 | + <div>{{ $t('contractDetailFee.note1') }}</div> | ||
| 92 | + <div>{{ $t('contractDetailFee.note2') }}</div> | ||
| 93 | + </el-col> | ||
| 94 | + <el-col :span="2"> | ||
| 95 | + <span>{{ $t('contractDetailFee.arrearsSubtotal') }}:</span> | ||
| 96 | + {{ contractDetailFeeInfo.totalAmount }} | ||
| 97 | + </el-col> | ||
| 98 | + <el-col :span="6" class="text-right"> | ||
| 99 | + <el-pagination @current-change="handlePageChange" :current-page="pagination.currentPage" | ||
| 100 | + :page-size="pagination.pageSize" layout="total, prev, pager, next" | ||
| 101 | + :total="pagination.total"></el-pagination> | ||
| 102 | + </el-col> | ||
| 103 | + </el-row> | ||
| 104 | + </div> | ||
| 105 | + <temp-import-room-fee ref="tempImportRoomFee"></temp-import-room-fee> | ||
| 106 | + </div> | ||
| 107 | +</template> | ||
| 108 | + | ||
| 109 | +<script> | ||
| 110 | +import { listFee } from '@/api/contract/contractDetailFeeApi' | ||
| 111 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 112 | +import TempImportRoomFee from '@/components/fee/tempImportRoomFee' | ||
| 113 | + | ||
| 114 | +export default { | ||
| 115 | + name: 'ContractDetailFee', | ||
| 116 | + components: { | ||
| 117 | + TempImportRoomFee | ||
| 118 | + }, | ||
| 119 | + data() { | ||
| 120 | + return { | ||
| 121 | + contractDetailFeeInfo: { | ||
| 122 | + rooms: [], | ||
| 123 | + contractId: '', | ||
| 124 | + roomNum: '', | ||
| 125 | + allOweFeeAmount: '0', | ||
| 126 | + totalAmount: 0, | ||
| 127 | + }, | ||
| 128 | + pagination: { | ||
| 129 | + currentPage: 1, | ||
| 130 | + pageSize: 10, | ||
| 131 | + total: 0 | ||
| 132 | + } | ||
| 133 | + } | ||
| 134 | + }, | ||
| 135 | + methods: { | ||
| 136 | + open(data) { | ||
| 137 | + this.contractDetailFeeInfo.contractId = data.contractId | ||
| 138 | + this._loadContractDetailFeeData(1, this.pagination.pageSize) | ||
| 139 | + }, | ||
| 140 | + _loadContractDetailFeeData(page, row) { | ||
| 141 | + const params = { | ||
| 142 | + page: page || 1, | ||
| 143 | + row: row || 10, | ||
| 144 | + communityId: this.communityId, | ||
| 145 | + payerObjId: this.contractDetailFeeInfo.contractId, | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + listFee(params).then(response => { | ||
| 149 | + this.contractDetailFeeInfo.total = response.total | ||
| 150 | + this.contractDetailFeeInfo.records = response.records | ||
| 151 | + this.contractDetailFeeInfo.fees = response.fees | ||
| 152 | + this.pagination.total = response.records | ||
| 153 | + | ||
| 154 | + let totalAmount = 0.0 | ||
| 155 | + response.fees.forEach(item => { | ||
| 156 | + totalAmount += parseFloat(item.amountOwed) | ||
| 157 | + }) | ||
| 158 | + this.contractDetailFeeInfo.totalAmount = totalAmount.toFixed(2) | ||
| 159 | + }).catch(error => { | ||
| 160 | + console.error('请求失败:', error) | ||
| 161 | + }) | ||
| 162 | + }, | ||
| 163 | + _openTempImportContractFeeModal() { | ||
| 164 | + this.$refs.tempImportRoomFee.open({ | ||
| 165 | + roomId: this.contractDetailFeeInfo.contractId, | ||
| 166 | + objType: '7777', | ||
| 167 | + roomName: this.contractDetailFeeInfo.contractName, | ||
| 168 | + ownerName: this.contractDetailFeeInfo.ownerName | ||
| 169 | + }) | ||
| 170 | + }, | ||
| 171 | + _payContractFee(fee) { | ||
| 172 | + this.$router.push(`/property/payFeeOrder?feeId=${fee.feeId}`) | ||
| 173 | + }, | ||
| 174 | + _editContractFee(fee) { | ||
| 175 | + this.$emit('edit-fee', fee) | ||
| 176 | + }, | ||
| 177 | + _payContractFeeHis(fee) { | ||
| 178 | + fee.builtUpArea = this.contractDetailFeeInfo.builtUpArea | ||
| 179 | + this.$router.push(`/property/propertyFee?${this.objToGetParam(fee)}`) | ||
| 180 | + }, | ||
| 181 | + _deleteContractFee(fee) { | ||
| 182 | + this.$emit('delete-fee', { | ||
| 183 | + communityId: this.communityId, | ||
| 184 | + feeId: fee.feeId | ||
| 185 | + }) | ||
| 186 | + }, | ||
| 187 | + _finishContractFee(fee) { | ||
| 188 | + this.$emit('finish-fee', { | ||
| 189 | + communityId: this.communityId, | ||
| 190 | + feeId: fee.feeId | ||
| 191 | + }) | ||
| 192 | + }, | ||
| 193 | + _toContractOwePayFee() { | ||
| 194 | + this.$router.push(`/property/owePayFeeOrder?payObjId=${this.contractDetailFeeInfo.contractId}&payObjType=7777&contractName=${this.contractDetailFeeInfo.contractName}`) | ||
| 195 | + }, | ||
| 196 | + _openContractCreateFeeAddModal() { | ||
| 197 | + this.$emit('create-fee-add', { | ||
| 198 | + isMore: false, | ||
| 199 | + contract: this.contractDetailFeeInfo | ||
| 200 | + }) | ||
| 201 | + }, | ||
| 202 | + _getContractAttrValue(attrs, specCd) { | ||
| 203 | + let value = "" | ||
| 204 | + attrs.forEach(item => { | ||
| 205 | + if (item.specCd == specCd) { | ||
| 206 | + value = item.value | ||
| 207 | + return | ||
| 208 | + } | ||
| 209 | + }) | ||
| 210 | + return value | ||
| 211 | + }, | ||
| 212 | + _getContractDeadlineTime(fee) { | ||
| 213 | + if (fee.amountOwed == 0 && fee.endTime == fee.deadlineTime) { | ||
| 214 | + return "-" | ||
| 215 | + } | ||
| 216 | + if (fee.state == '2009001') { | ||
| 217 | + return "-" | ||
| 218 | + } | ||
| 219 | + return this.$options.filters.dateFormat(fee.endTime) | ||
| 220 | + }, | ||
| 221 | + _getContractEndTime(fee) { | ||
| 222 | + if (fee.state == '2009001') { | ||
| 223 | + return "-" | ||
| 224 | + } | ||
| 225 | + return this.$options.filters.dateFormat(fee.endTime) | ||
| 226 | + }, | ||
| 227 | + handlePageChange(currentPage) { | ||
| 228 | + this.pagination.currentPage = currentPage | ||
| 229 | + this._loadContractDetailFeeData(currentPage, this.pagination.pageSize) | ||
| 230 | + }, | ||
| 231 | + objToGetParam(obj) { | ||
| 232 | + return Object.keys(obj).map(key => `${key}=${obj[key]}`).join('&') | ||
| 233 | + } | ||
| 234 | + }, | ||
| 235 | + created() { | ||
| 236 | + this.communityId = getCommunityId() | ||
| 237 | + } | ||
| 238 | +} | ||
| 239 | +</script> | ||
| 240 | + | ||
| 241 | +<style scoped> | ||
| 242 | +.margin-top { | ||
| 243 | + margin-top: 20px; | ||
| 244 | +} | ||
| 245 | + | ||
| 246 | +.margin-top-lg { | ||
| 247 | + margin-top: 30px; | ||
| 248 | +} | ||
| 249 | + | ||
| 250 | +.padding-right-xs { | ||
| 251 | + padding-right: 5px; | ||
| 252 | +} | ||
| 253 | + | ||
| 254 | +.padding-left-xl { | ||
| 255 | + padding-left: 20px; | ||
| 256 | +} | ||
| 257 | + | ||
| 258 | +.text-right { | ||
| 259 | + text-align: right; | ||
| 260 | +} | ||
| 261 | +</style> | ||
| 0 | \ No newline at end of file | 262 | \ No newline at end of file |
src/components/contract/contractDetailFeeDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-fee ref="contractDetailFee"></contract-detail-fee> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailFee from '@/components/contract/contractDetailFee' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailFee | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailFee._loadContractDetailFeeData({ | ||
| 18 | + contractId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailFile.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="margin-top"> | ||
| 3 | + <el-row class="margin-top-lg"></el-row> | ||
| 4 | + <div class="margin-top"> | ||
| 5 | + <el-row> | ||
| 6 | + <el-col :span="10"> | ||
| 7 | + <el-form-item :label="$t('contractDetailFile.relatedFiles')"> | ||
| 8 | + <div v-for="(file,index) in contractDetailFileInfo.files" :key="index" style="margin-left: 50px;"> | ||
| 9 | + <el-link type="primary" @click="_viewFile(file)"> | ||
| 10 | + {{ file.fileRealName }} | ||
| 11 | + </el-link> | ||
| 12 | + </div> | ||
| 13 | + </el-form-item> | ||
| 14 | + </el-col> | ||
| 15 | + </el-row> | ||
| 16 | + </div> | ||
| 17 | + </div> | ||
| 18 | +</template> | ||
| 19 | + | ||
| 20 | +<script> | ||
| 21 | +import { queryContractFile } from '@/api/contract/contractDetailFileApi' | ||
| 22 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 23 | + | ||
| 24 | +export default { | ||
| 25 | + name: 'ContractDetailFile', | ||
| 26 | + data() { | ||
| 27 | + return { | ||
| 28 | + contractDetailFileInfo: { | ||
| 29 | + files: [], | ||
| 30 | + contractId: '', | ||
| 31 | + roomNum: '', | ||
| 32 | + allOweFeeAmount: '0' | ||
| 33 | + } | ||
| 34 | + } | ||
| 35 | + }, | ||
| 36 | + methods: { | ||
| 37 | + open(data) { | ||
| 38 | + this.contractDetailFileInfo.contractId = data.contractId | ||
| 39 | + this._loadContractDetailFileData(1, this.pagination.pageSize) | ||
| 40 | + }, | ||
| 41 | + _loadContractDetailFileData(page, row) { | ||
| 42 | + const params = { | ||
| 43 | + contractId: this.contractDetailFileInfo.contractId, | ||
| 44 | + page: page || 1, | ||
| 45 | + row: row || 100 | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + queryContractFile(params).then(response => { | ||
| 49 | + this.contractDetailFileInfo.files = response.data | ||
| 50 | + }).catch(error => { | ||
| 51 | + console.error('请求失败:', error) | ||
| 52 | + }) | ||
| 53 | + }, | ||
| 54 | + _viewFile(file) { | ||
| 55 | + window.open(file.fileSaveName) | ||
| 56 | + } | ||
| 57 | + }, | ||
| 58 | + created() { | ||
| 59 | + this.communityId = getCommunityId() | ||
| 60 | + } | ||
| 61 | +} | ||
| 62 | +</script> | ||
| 63 | + | ||
| 64 | +<style scoped> | ||
| 65 | +.margin-top { | ||
| 66 | + margin-top: 20px; | ||
| 67 | +} | ||
| 68 | +.margin-top-lg { | ||
| 69 | + margin-top: 30px; | ||
| 70 | +} | ||
| 71 | +</style> | ||
| 0 | \ No newline at end of file | 72 | \ No newline at end of file |
src/components/contract/contractDetailFileDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-file ref="contractDetailFile"></contract-detail-file> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailFile from '@/components/contract/contractDetailFile' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailFile | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailFile._loadContractDetailFileData({ | ||
| 18 | + contractId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailFlow.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="margin-top"> | ||
| 3 | + <el-row :gutter="20" class="margin-top-lg"> | ||
| 4 | + <el-col :span="2" class="padding-right-xs padding-left-xl"></el-col> | ||
| 5 | + <el-col :span="2" class="padding-right-xs padding-right-xl"></el-col> | ||
| 6 | + <el-col :span="8" class="text-right"></el-col> | ||
| 7 | + </el-row> | ||
| 8 | + <div class="margin-top"> | ||
| 9 | + <el-table :data="contractDetailFlowInfo.auditUsers" style="width: 100%" border stripe> | ||
| 10 | + <el-table-column :label="$t('contractDetailFlow.serialNumber')" align="center"> | ||
| 11 | + <template #default="{ $index }"> | ||
| 12 | + {{ $index + 1 }} | ||
| 13 | + </template> | ||
| 14 | + </el-table-column> | ||
| 15 | + <el-table-column :label="$t('contractDetailFlow.processor')" align="center"> | ||
| 16 | + <template #default="{ row }"> | ||
| 17 | + {{ row.userName || row.auditName }} | ||
| 18 | + </template> | ||
| 19 | + </el-table-column> | ||
| 20 | + <el-table-column prop="stateName" :label="$t('contractDetailFlow.status')" align="center" /> | ||
| 21 | + <el-table-column prop="auditTime" :label="$t('contractDetailFlow.processTime')" align="center" /> | ||
| 22 | + <el-table-column prop="duration" :label="$t('contractDetailFlow.timeConsuming')" align="center" /> | ||
| 23 | + <el-table-column prop="message" :label="$t('contractDetailFlow.opinion')" align="center" /> | ||
| 24 | + </el-table> | ||
| 25 | + </div> | ||
| 26 | + </div> | ||
| 27 | +</template> | ||
| 28 | + | ||
| 29 | +<script> | ||
| 30 | +import { listWorkflowAuditInfo } from '@/api/contract/contractDetailFlowApi' | ||
| 31 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 32 | + | ||
| 33 | +export default { | ||
| 34 | + name: 'ContractDetailFlow', | ||
| 35 | + data() { | ||
| 36 | + return { | ||
| 37 | + contractDetailFlowInfo: { | ||
| 38 | + auditUsers: [], | ||
| 39 | + contractId: '', | ||
| 40 | + roomNum: '', | ||
| 41 | + totalArea: '0' | ||
| 42 | + }, | ||
| 43 | + communityId: '' | ||
| 44 | + } | ||
| 45 | + }, | ||
| 46 | + created() { | ||
| 47 | + this.communityId = getCommunityId() | ||
| 48 | + }, | ||
| 49 | + methods: { | ||
| 50 | + open(data) { | ||
| 51 | + this.contractDetailFlowInfo.contractId = data.contractId | ||
| 52 | + this._loadContractDetailFlowInfoData() | ||
| 53 | + }, | ||
| 54 | + _loadContractDetailFlowInfoData() { | ||
| 55 | + const params = { | ||
| 56 | + businessKey: this.contractDetailFlowInfo.contractId, | ||
| 57 | + communityId: this.communityId | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + listWorkflowAuditInfo(params).then(response => { | ||
| 61 | + this.contractDetailFlowInfo.auditUsers = response.data | ||
| 62 | + }).catch(error => { | ||
| 63 | + console.error('请求失败:', error) | ||
| 64 | + }) | ||
| 65 | + }, | ||
| 66 | + switch(data) { | ||
| 67 | + this.contractDetailFlowInfo.contractId = data.contractId | ||
| 68 | + this._loadContractDetailFlowInfoData() | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | +} | ||
| 72 | +</script> | ||
| 73 | + | ||
| 74 | +<style scoped> | ||
| 75 | +.margin-top { | ||
| 76 | + margin-top: 20px; | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +.margin-top-lg { | ||
| 80 | + margin-top: 30px; | ||
| 81 | +} | ||
| 82 | + | ||
| 83 | +.padding-right-xs { | ||
| 84 | + padding-right: 10px; | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +.padding-left-xl { | ||
| 88 | + padding-left: 40px; | ||
| 89 | +} | ||
| 90 | + | ||
| 91 | +.padding-right-xl { | ||
| 92 | + padding-right: 40px; | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +.text-right { | ||
| 96 | + text-align: right; | ||
| 97 | +} | ||
| 98 | +</style> | ||
| 0 | \ No newline at end of file | 99 | \ No newline at end of file |
src/components/contract/contractDetailFlowDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-flow ref="contractDetailFlow"></contract-detail-flow> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailFlow from '@/components/contract/contractDetailFlow' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailFlow | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailFlow.switch({ | ||
| 18 | + contractId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailHisFee.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="margin-top"> | ||
| 3 | + <el-table :data="contractDetailHisFeeInfo.feeDetails" style="width: 100%" border stripe> | ||
| 4 | + <el-table-column prop="feeName" :label="$t('contractDetailHisFee.feeItem')" align="center"></el-table-column> | ||
| 5 | + <el-table-column prop="payerObjName" :label="$t('contractDetailHisFee.payer')" align="center"></el-table-column> | ||
| 6 | + <el-table-column prop="cycles" :label="$t('contractDetailHisFee.cycle')" align="center"></el-table-column> | ||
| 7 | + <el-table-column :label="$t('contractDetailHisFee.receivableAmount')" align="center"> | ||
| 8 | + <template slot-scope="scope"> | ||
| 9 | + {{ scope.row.receivableAmount }}/{{ scope.row.receivedAmount }}<br> | ||
| 10 | + <div v-if="scope.row.acctAmount > 0"> | ||
| 11 | + {{ $t('contractDetailHisFee.accountDeduction') }}: {{ scope.row.acctAmount }}<br> | ||
| 12 | + </div> | ||
| 13 | + <div v-for="(item, index) in scope.row.payFeeDetailDiscountDtoList" :key="index"> | ||
| 14 | + {{ item.discountName }}: {{ Math.abs(item.discountPrice) }}<br> | ||
| 15 | + </div> | ||
| 16 | + </template> | ||
| 17 | + </el-table-column> | ||
| 18 | + <el-table-column prop="primeRateName" :label="$t('contractDetailHisFee.paymentMethod')" | ||
| 19 | + align="center"></el-table-column> | ||
| 20 | + <el-table-column :label="$t('contractDetailHisFee.paymentPeriod')" align="center"> | ||
| 21 | + <template slot-scope="scope"> | ||
| 22 | + {{ $options.filters.dateFormat(scope.row.startTime) }}~<br /> | ||
| 23 | + {{ $options.filters.dateFormat(scope.row.endTime) }} | ||
| 24 | + </template> | ||
| 25 | + </el-table-column> | ||
| 26 | + <el-table-column prop="createTime" :label="$t('contractDetailHisFee.paymentTime')" | ||
| 27 | + align="center"></el-table-column> | ||
| 28 | + <el-table-column prop="cashierName" :label="$t('contractDetailHisFee.cashier')" align="center"> | ||
| 29 | + <template slot-scope="scope"> | ||
| 30 | + {{ scope.row.cashierName || '-' }} | ||
| 31 | + </template> | ||
| 32 | + </el-table-column> | ||
| 33 | + <el-table-column prop="stateName" :label="$t('contractDetailHisFee.status')" align="center"></el-table-column> | ||
| 34 | + <el-table-column prop="remark" :label="$t('contractDetailHisFee.remark')" align="center"></el-table-column> | ||
| 35 | + <el-table-column :label="$t('contractDetailHisFee.operation')" align="center"> | ||
| 36 | + <template slot-scope="scope"> | ||
| 37 | + <el-button v-if="scope.row.state == '1400' || scope.row.state == '1200' || scope.row.state == ''" size="mini" | ||
| 38 | + @click="_toRefundFee(scope.row)"> | ||
| 39 | + {{ $t('contractDetailHisFee.detail') }} | ||
| 40 | + </el-button> | ||
| 41 | + </template> | ||
| 42 | + </el-table-column> | ||
| 43 | + </el-table> | ||
| 44 | + <el-pagination @current-change="handlePageChange" :current-page="pagination.currentPage" | ||
| 45 | + :page-size="pagination.pageSize" layout="total, prev, pager, next" :total="pagination.total" | ||
| 46 | + class="margin-top"></el-pagination> | ||
| 47 | + </div> | ||
| 48 | +</template> | ||
| 49 | + | ||
| 50 | +<script> | ||
| 51 | +import { queryFeeDetail } from '@/api/contract/contractDetailHisFeeApi' | ||
| 52 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 53 | + | ||
| 54 | +export default { | ||
| 55 | + name: 'ContractDetailHisFee', | ||
| 56 | + data() { | ||
| 57 | + return { | ||
| 58 | + contractDetailHisFeeInfo: { | ||
| 59 | + total: 0, | ||
| 60 | + records: 1, | ||
| 61 | + feeDetails: [], | ||
| 62 | + contractId: '' | ||
| 63 | + }, | ||
| 64 | + pagination: { | ||
| 65 | + currentPage: 1, | ||
| 66 | + pageSize: 10, | ||
| 67 | + total: 0 | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + }, | ||
| 71 | + methods: { | ||
| 72 | + open(data) { | ||
| 73 | + this.contractDetailHisFeeInfo.contractId = data.contractId | ||
| 74 | + this._listContractDetailHisFeeDetails(1, this.pagination.pageSize) | ||
| 75 | + }, | ||
| 76 | + _listContractDetailHisFeeDetails(page, row) { | ||
| 77 | + const params = { | ||
| 78 | + page: page || 1, | ||
| 79 | + row: row || 10, | ||
| 80 | + communityId: this.communityId, | ||
| 81 | + payerObjId: this.contractDetailHisFeeInfo.contractId, | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + queryFeeDetail(params).then(response => { | ||
| 85 | + this.contractDetailHisFeeInfo.total = response.total | ||
| 86 | + this.contractDetailHisFeeInfo.records = response.records | ||
| 87 | + this.contractDetailHisFeeInfo.feeDetails = response.feeDetails | ||
| 88 | + this.pagination.total = response.total | ||
| 89 | + }).catch(error => { | ||
| 90 | + console.error('请求失败:', error) | ||
| 91 | + }) | ||
| 92 | + }, | ||
| 93 | + clearContractDetailHisFeeInfo() { | ||
| 94 | + this.contractDetailHisFeeInfo = { | ||
| 95 | + total: 0, | ||
| 96 | + records: 1, | ||
| 97 | + feeDetails: [], | ||
| 98 | + contractId: '' | ||
| 99 | + } | ||
| 100 | + }, | ||
| 101 | + _toRefundFee(detail) { | ||
| 102 | + this.$router.push(`/property/propertyFee?feeId=${detail.feeId}`) | ||
| 103 | + }, | ||
| 104 | + handlePageChange(currentPage) { | ||
| 105 | + this.pagination.currentPage = currentPage | ||
| 106 | + this._listContractDetailHisFeeDetails(currentPage, this.pagination.pageSize) | ||
| 107 | + } | ||
| 108 | + }, | ||
| 109 | + created() { | ||
| 110 | + this.communityId = getCommunityId() | ||
| 111 | + } | ||
| 112 | +} | ||
| 113 | +</script> | ||
| 114 | + | ||
| 115 | +<style scoped> | ||
| 116 | +.margin-top { | ||
| 117 | + margin-top: 20px; | ||
| 118 | +} | ||
| 119 | +</style> | ||
| 0 | \ No newline at end of file | 120 | \ No newline at end of file |
src/components/contract/contractDetailHisFeeDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-his-fee ref="contractDetailHisFee"></contract-detail-his-fee> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailHisFee from '@/components/contract/contractDetailHisFee' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailHisFee | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailHisFee._listContractDetailHisFeeDetails({ | ||
| 18 | + contractId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailHisRoomFee.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="margin-top"> | ||
| 4 | + <el-table :data="contractDetailHisRoomFeeInfo.feeDetails" style="width: 100%; margin-top: 10px" border stripe> | ||
| 5 | + <el-table-column prop="feeName" :label="$t('contractDetailHisRoomFee.feeItem')" align="center" /> | ||
| 6 | + <el-table-column prop="payerObjName" :label="$t('contractDetailHisRoomFee.payerObject')" align="center" /> | ||
| 7 | + <el-table-column prop="cycles" :label="$t('contractDetailHisRoomFee.cycle')" align="center" /> | ||
| 8 | + <el-table-column :label="$t('contractDetailHisRoomFee.receivableAmount')" align="center"> | ||
| 9 | + <template #default="{ row }"> | ||
| 10 | + {{ row.receivableAmount }}/{{ row.receivedAmount }}<br> | ||
| 11 | + <div v-if="row.acctAmount > 0"> | ||
| 12 | + {{ $t('contractDetailHisRoomFee.accountDeduction') }}: {{ row.acctAmount }}<br> | ||
| 13 | + </div> | ||
| 14 | + <div v-for="(item, index) in row.payFeeDetailDiscountDtoList" :key="index"> | ||
| 15 | + {{ item.discountName }}: {{ Math.abs(item.discountPrice) }}<br> | ||
| 16 | + </div> | ||
| 17 | + </template> | ||
| 18 | + </el-table-column> | ||
| 19 | + <el-table-column prop="primeRateName" :label="$t('contractDetailHisRoomFee.paymentMethod')" align="center" /> | ||
| 20 | + <el-table-column :label="$t('contractDetailHisRoomFee.paymentPeriod')" align="center"> | ||
| 21 | + <template #default="{ row }"> | ||
| 22 | + {{ dateFormat(row.startTime) }}~<br> | ||
| 23 | + {{ dateFormat(row.endTime) }} | ||
| 24 | + </template> | ||
| 25 | + </el-table-column> | ||
| 26 | + <el-table-column prop="createTime" :label="$t('contractDetailHisRoomFee.paymentTime')" align="center" /> | ||
| 27 | + <el-table-column prop="cashierName" :label="$t('contractDetailHisRoomFee.cashier')" align="center"> | ||
| 28 | + <template #default="{ row }"> | ||
| 29 | + {{ row.cashierName || '-' }} | ||
| 30 | + </template> | ||
| 31 | + </el-table-column> | ||
| 32 | + <el-table-column prop="stateName" :label="$t('contractDetailHisRoomFee.status')" align="center" /> | ||
| 33 | + <el-table-column prop="remark" :label="$t('contractDetailHisRoomFee.remark')" align="center" /> | ||
| 34 | + <el-table-column :label="$t('contractDetailHisRoomFee.operation')" align="center"> | ||
| 35 | + <template #default="{ row }"> | ||
| 36 | + <el-button v-if="row.state == '1400' || row.state == '1200' || row.state == ''" type="text" size="small" | ||
| 37 | + @click="_toRefundFee(row)"> | ||
| 38 | + {{ $t('contractDetailHisRoomFee.detail') }} | ||
| 39 | + </el-button> | ||
| 40 | + </template> | ||
| 41 | + </el-table-column> | ||
| 42 | + </el-table> | ||
| 43 | + <el-pagination class="pagination" layout="total, sizes, prev, pager, next, jumper" | ||
| 44 | + :total="contractDetailHisRoomFeeInfo.total" :page-size="pageSize" @current-change="handleCurrentChange" | ||
| 45 | + @size-change="handleSizeChange" /> | ||
| 46 | + </div> | ||
| 47 | + </div> | ||
| 48 | +</template> | ||
| 49 | + | ||
| 50 | +<script> | ||
| 51 | +import { queryFeeDetail } from '@/api/contract/contractDetailHisRoomFeeApi' | ||
| 52 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 53 | + | ||
| 54 | +export default { | ||
| 55 | + name: 'ContractDetailHisRoomFee', | ||
| 56 | + data() { | ||
| 57 | + return { | ||
| 58 | + contractDetailHisRoomFeeInfo: { | ||
| 59 | + total: 0, | ||
| 60 | + records: 1, | ||
| 61 | + feeDetails: [], | ||
| 62 | + ownerId: '' | ||
| 63 | + }, | ||
| 64 | + pageSize: 10, | ||
| 65 | + currentPage: 1, | ||
| 66 | + communityId: '' | ||
| 67 | + } | ||
| 68 | + }, | ||
| 69 | + created() { | ||
| 70 | + this.communityId = getCommunityId() | ||
| 71 | + }, | ||
| 72 | + methods: { | ||
| 73 | + open(data) { | ||
| 74 | + this.contractDetailHisRoomFeeInfo.ownerId = data.ownerId | ||
| 75 | + this._listContractDetailHisRoomFeeDetails() | ||
| 76 | + }, | ||
| 77 | + dateFormat(date) { | ||
| 78 | + return this.$moment(date).format('YYYY-MM-DD') | ||
| 79 | + }, | ||
| 80 | + handleCurrentChange(val) { | ||
| 81 | + this.currentPage = val | ||
| 82 | + this._listContractDetailHisRoomFeeDetails() | ||
| 83 | + }, | ||
| 84 | + handleSizeChange(val) { | ||
| 85 | + this.pageSize = val | ||
| 86 | + this._listContractDetailHisRoomFeeDetails() | ||
| 87 | + }, | ||
| 88 | + _listContractDetailHisRoomFeeDetails() { | ||
| 89 | + const params = { | ||
| 90 | + page: this.currentPage, | ||
| 91 | + row: this.pageSize, | ||
| 92 | + communityId: this.communityId, | ||
| 93 | + ownerId: this.contractDetailHisRoomFeeInfo.ownerId, | ||
| 94 | + payerObjType: '3333' | ||
| 95 | + } | ||
| 96 | + | ||
| 97 | + queryFeeDetail(params).then(response => { | ||
| 98 | + this.contractDetailHisRoomFeeInfo.total = response.total | ||
| 99 | + this.contractDetailHisRoomFeeInfo.records = response.records | ||
| 100 | + this.contractDetailHisRoomFeeInfo.feeDetails = response.feeDetails | ||
| 101 | + }).catch(error => { | ||
| 102 | + console.error('请求失败:', error) | ||
| 103 | + }) | ||
| 104 | + }, | ||
| 105 | + clearContractDetailHisRoomFeeInfo() { | ||
| 106 | + this.contractDetailHisRoomFeeInfo = { | ||
| 107 | + total: 0, | ||
| 108 | + records: 1, | ||
| 109 | + feeDetails: [], | ||
| 110 | + ownerId: '' | ||
| 111 | + } | ||
| 112 | + }, | ||
| 113 | + _toRefundFee(detail) { | ||
| 114 | + this.$router.push(`/pages/property/propertyFee?feeId=${detail.feeId}`) | ||
| 115 | + }, | ||
| 116 | + switch(param) { | ||
| 117 | + this.clearContractDetailHisRoomFeeInfo() | ||
| 118 | + if (param.ownerId === '') { | ||
| 119 | + return | ||
| 120 | + } | ||
| 121 | + Object.assign(this.contractDetailHisRoomFeeInfo, param) | ||
| 122 | + this._listContractDetailHisRoomFeeDetails() | ||
| 123 | + }, | ||
| 124 | + notify() { | ||
| 125 | + this._listContractDetailHisRoomFeeDetails() | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | +} | ||
| 129 | +</script> | ||
| 130 | + | ||
| 131 | +<style scoped> | ||
| 132 | +.margin-top { | ||
| 133 | + margin-top: 20px; | ||
| 134 | +} | ||
| 135 | + | ||
| 136 | +.pagination { | ||
| 137 | + margin-top: 20px; | ||
| 138 | + text-align: right; | ||
| 139 | +} | ||
| 140 | +</style> | ||
| 0 | \ No newline at end of file | 141 | \ No newline at end of file |
src/components/contract/contractDetailHisRoomFeeDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-his-room-fee ref="contractDetailHisRoomFee"></contract-detail-his-room-fee> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailHisRoomFee from '@/components/contract/contractDetailHisRoomFee' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailHisRoomFee | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailHisRoomFee.switch({ | ||
| 18 | + ownerId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailOwner.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <el-row> | ||
| 4 | + <el-col :span="24" class="text-right"></el-col> | ||
| 5 | + </el-row> | ||
| 6 | + | ||
| 7 | + <div class="margin-top"> | ||
| 8 | + <el-table :data="contractDetailOwnerInfo.owners" border style="width: 100%" | ||
| 9 | + :default-sort="{ prop: 'name', order: 'ascending' }"> | ||
| 10 | + <el-table-column prop="url" :label="$t('contractDetailOwner.ownerFace')" width="100" align="center"> | ||
| 11 | + <template slot-scope="scope"> | ||
| 12 | + <el-image style="width: 60px; height: 60px;" class="border-radius" | ||
| 13 | + :src="scope.row.url || '/img/noPhoto.jpg'" :preview-src-list="[scope.row.url]" v-if="scope.row.url"> | ||
| 14 | + </el-image> | ||
| 15 | + <img v-else style="width: 60px; height: 60px;" class="border-radius" src="/img/noPhoto.jpg" /> | ||
| 16 | + </template> | ||
| 17 | + </el-table-column> | ||
| 18 | + <el-table-column prop="name" :label="$t('contractDetailOwner.name')" align="center"> | ||
| 19 | + <template slot-scope="scope"> | ||
| 20 | + {{ scope.row.name }}({{ scope.row.link }}) | ||
| 21 | + </template> | ||
| 22 | + </el-table-column> | ||
| 23 | + <el-table-column prop="sex" :label="$t('contractDetailOwner.sex')" width="80" align="center"> | ||
| 24 | + <template slot-scope="scope"> | ||
| 25 | + {{ scope.row.sex == 0 ? $t('common.male') : $t('common.female') }} | ||
| 26 | + </template> | ||
| 27 | + </el-table-column> | ||
| 28 | + <el-table-column prop="idCard" :label="$t('contractDetailOwner.idCard')" width="180" align="center"> | ||
| 29 | + <template slot-scope="scope"> | ||
| 30 | + {{ scope.row.idCard || '-' }} | ||
| 31 | + </template> | ||
| 32 | + </el-table-column> | ||
| 33 | + <el-table-column prop="address" :label="$t('contractDetailOwner.address')" width="200" align="center"> | ||
| 34 | + <template slot-scope="scope"> | ||
| 35 | + {{ scope.row.address || '-' }} | ||
| 36 | + </template> | ||
| 37 | + </el-table-column> | ||
| 38 | + <el-table-column prop="roomCount" :label="$t('contractDetailOwner.roomCount')" width="100" align="center"> | ||
| 39 | + <template slot-scope="scope"> | ||
| 40 | + <el-link type="primary" @click="_viewOwnerRooms(scope.row)"> | ||
| 41 | + {{ scope.row.roomCount || 0 }} | ||
| 42 | + </el-link> | ||
| 43 | + </template> | ||
| 44 | + </el-table-column> | ||
| 45 | + <el-table-column prop="memberCount" :label="$t('contractDetailOwner.memberCount')" width="100" align="center"> | ||
| 46 | + <template slot-scope="scope"> | ||
| 47 | + <el-link type="primary" @click="_viewOwnerMembers(scope.row)"> | ||
| 48 | + {{ scope.row.memberCount || 0 }} | ||
| 49 | + </el-link> | ||
| 50 | + </template> | ||
| 51 | + </el-table-column> | ||
| 52 | + <el-table-column prop="carCount" :label="$t('contractDetailOwner.carCount')" width="100" align="center"> | ||
| 53 | + <template slot-scope="scope"> | ||
| 54 | + <el-link type="primary" @click="_viewOwnerCars(scope.row)"> | ||
| 55 | + {{ scope.row.carCount || 0 }} | ||
| 56 | + </el-link> | ||
| 57 | + </template> | ||
| 58 | + </el-table-column> | ||
| 59 | + <el-table-column prop="complaintCount" :label="$t('contractDetailOwner.complaintCount')" width="100" | ||
| 60 | + align="center"> | ||
| 61 | + <template slot-scope="scope"> | ||
| 62 | + <el-link type="primary" @click="_viewComplaints(scope.row)"> | ||
| 63 | + {{ scope.row.complaintCount || 0 }} | ||
| 64 | + </el-link> | ||
| 65 | + </template> | ||
| 66 | + </el-table-column> | ||
| 67 | + <el-table-column prop="repairCount" :label="$t('contractDetailOwner.repairCount')" width="100" align="center"> | ||
| 68 | + <template slot-scope="scope"> | ||
| 69 | + <el-link type="primary" @click="_viewRepairs(scope.row)"> | ||
| 70 | + {{ scope.row.repairCount || 0 }} | ||
| 71 | + </el-link> | ||
| 72 | + </template> | ||
| 73 | + </el-table-column> | ||
| 74 | + <el-table-column prop="oweFee" :label="$t('contractDetailOwner.oweFee')" width="120" align="center"> | ||
| 75 | + <template slot-scope="scope"> | ||
| 76 | + <el-link type="primary" @click="_viewOweFees(scope.row)"> | ||
| 77 | + {{ scope.row.oweFee || '0.00' }} | ||
| 78 | + </el-link> | ||
| 79 | + </template> | ||
| 80 | + </el-table-column> | ||
| 81 | + <el-table-column prop="contractCount" :label="$t('contractDetailOwner.contractCount')" width="120" | ||
| 82 | + align="center"> | ||
| 83 | + <template slot-scope="scope"> | ||
| 84 | + <el-link type="primary" @click="_viewRoomContracts(scope.row)"> | ||
| 85 | + {{ scope.row.contractCount || 0 }} | ||
| 86 | + </el-link> | ||
| 87 | + </template> | ||
| 88 | + </el-table-column> | ||
| 89 | + </el-table> | ||
| 90 | + | ||
| 91 | + <el-row class="margin-top"> | ||
| 92 | + <el-col :span="24" class="text-right"> | ||
| 93 | + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" | ||
| 94 | + :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="pageSize" | ||
| 95 | + layout="total, sizes, prev, pager, next, jumper" :total="total"> | ||
| 96 | + </el-pagination> | ||
| 97 | + </el-col> | ||
| 98 | + </el-row> | ||
| 99 | + </div> | ||
| 100 | + | ||
| 101 | + <owner-rooms ref="ownerRooms"></owner-rooms> | ||
| 102 | + <owner-members ref="ownerMembers"></owner-members> | ||
| 103 | + <owner-cars ref="ownerCars"></owner-cars> | ||
| 104 | + <owner-complaints ref="ownerComplaints"></owner-complaints> | ||
| 105 | + <owner-repairs ref="ownerRepairs"></owner-repairs> | ||
| 106 | + <owner-owe-fees ref="ownerOweFees"></owner-owe-fees> | ||
| 107 | + <room-contracts ref="roomContracts"></room-contracts> | ||
| 108 | + <view-image ref="viewImage"></view-image> | ||
| 109 | + </div> | ||
| 110 | +</template> | ||
| 111 | + | ||
| 112 | +<script> | ||
| 113 | +import OwnerRooms from '@/components/owner/ownerRooms' | ||
| 114 | +import OwnerMembers from '@/components/owner/ownerMembers' | ||
| 115 | +import OwnerCars from '@/components/owner/ownerCars' | ||
| 116 | +import OwnerComplaints from '@/components/owner/ownerComplaints' | ||
| 117 | +import OwnerRepairs from '@/components/owner/ownerRepairs' | ||
| 118 | +import OwnerOweFees from '@/components/owner/ownerOweFees' | ||
| 119 | +import RoomContracts from '@/components/room/roomContracts' | ||
| 120 | +import ViewImage from '@/components/system/viewImage' | ||
| 121 | +import { queryOwners } from '@/api/contract/contractDetailOwnerApi' | ||
| 122 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 123 | + | ||
| 124 | +export default { | ||
| 125 | + name: 'ContractDetailOwner', | ||
| 126 | + components: { | ||
| 127 | + OwnerRooms, | ||
| 128 | + OwnerMembers, | ||
| 129 | + OwnerCars, | ||
| 130 | + OwnerComplaints, | ||
| 131 | + OwnerRepairs, | ||
| 132 | + OwnerOweFees, | ||
| 133 | + RoomContracts, | ||
| 134 | + ViewImage | ||
| 135 | + }, | ||
| 136 | + data() { | ||
| 137 | + return { | ||
| 138 | + contractDetailOwnerInfo: { | ||
| 139 | + owners: [], | ||
| 140 | + ownerId: '' | ||
| 141 | + }, | ||
| 142 | + currentPage: 1, | ||
| 143 | + pageSize: 10, | ||
| 144 | + total: 0, | ||
| 145 | + communityId: '' | ||
| 146 | + } | ||
| 147 | + }, | ||
| 148 | + created() { | ||
| 149 | + this.communityId = getCommunityId() | ||
| 150 | + }, | ||
| 151 | + methods: { | ||
| 152 | + open(params) { | ||
| 153 | + this.contractDetailOwnerInfo.ownerId = params.ownerId | ||
| 154 | + this._loadContractDetailOwnerData(this.currentPage, this.pageSize) | ||
| 155 | + }, | ||
| 156 | + _loadContractDetailOwnerData(page, row) { | ||
| 157 | + const param = { | ||
| 158 | + ownerId: this.contractDetailOwnerInfo.ownerId, | ||
| 159 | + communityId: this.communityId, | ||
| 160 | + ownerTypeCd: '1001', | ||
| 161 | + page: page, | ||
| 162 | + row: row | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + queryOwners(param) | ||
| 166 | + .then(response => { | ||
| 167 | + this.contractDetailOwnerInfo.owners = response.data | ||
| 168 | + this.total = response.records | ||
| 169 | + this.currentPage = page | ||
| 170 | + }) | ||
| 171 | + .catch(error => { | ||
| 172 | + console.error('请求失败:', error) | ||
| 173 | + }) | ||
| 174 | + }, | ||
| 175 | + handleSizeChange(val) { | ||
| 176 | + this.pageSize = val | ||
| 177 | + this._loadContractDetailOwnerData(this.currentPage, this.pageSize) | ||
| 178 | + }, | ||
| 179 | + handleCurrentChange(val) { | ||
| 180 | + this.currentPage = val | ||
| 181 | + this._loadContractDetailOwnerData(this.currentPage, this.pageSize) | ||
| 182 | + }, | ||
| 183 | + _viewOwnerRooms(owner) { | ||
| 184 | + this.$refs.ownerRooms.open(owner) | ||
| 185 | + }, | ||
| 186 | + _viewOwnerMembers(owner) { | ||
| 187 | + this.$refs.ownerMembers.open(owner) | ||
| 188 | + }, | ||
| 189 | + _viewOwnerCars(owner) { | ||
| 190 | + this.$refs.ownerCars.open(owner) | ||
| 191 | + }, | ||
| 192 | + _viewComplaints(owner) { | ||
| 193 | + this.$refs.ownerComplaints.open(owner) | ||
| 194 | + }, | ||
| 195 | + _viewRepairs(owner) { | ||
| 196 | + this.$refs.ownerRepairs.open(owner) | ||
| 197 | + }, | ||
| 198 | + _viewOweFees(owner) { | ||
| 199 | + this.$refs.ownerOweFees.open(owner) | ||
| 200 | + }, | ||
| 201 | + _viewRoomContracts(owner) { | ||
| 202 | + this.$refs.roomContracts.open(owner) | ||
| 203 | + } | ||
| 204 | + } | ||
| 205 | +} | ||
| 206 | +</script> | ||
| 207 | + | ||
| 208 | +<style scoped> | ||
| 209 | +.margin-top { | ||
| 210 | + margin-top: 20px; | ||
| 211 | +} | ||
| 212 | + | ||
| 213 | +.border-radius { | ||
| 214 | + border-radius: 4px; | ||
| 215 | +} | ||
| 216 | +</style> | ||
| 0 | \ No newline at end of file | 217 | \ No newline at end of file |
src/components/contract/contractDetailOwnerDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-owner ref="contractDetailOwner"></contract-detail-owner> | ||
| 4 | + <el-button @click="switchOwner">Switch Owner</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailOwner from '@/components/contract/contractDetailOwner' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailOwner | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchOwner() { | ||
| 17 | + this.$refs.contractDetailOwner.switch({ | ||
| 18 | + ownerId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailReceipt.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <div class="flex justify-end"> | ||
| 4 | + <div :span="12" class="padding-right-xs padding-left-xl"></div> | ||
| 5 | + <div :span="12" class="text-right padding-right-lg"> | ||
| 6 | + <el-button type="primary" size="small" style="margin-left:10px" @click="_printFeeReceipt()"> | ||
| 7 | + {{ $t('contractDetailReceipt.print') }} | ||
| 8 | + </el-button> | ||
| 9 | + <el-button type="primary" size="small" style="margin-left:10px" @click="_printFeeSmallReceipt()"> | ||
| 10 | + {{ $t('contractDetailReceipt.printSmall') }} | ||
| 11 | + </el-button> | ||
| 12 | + <el-button type="primary" size="small" style="margin-left:10px" @click="_printApplyFeeReceipt()"> | ||
| 13 | + {{ $t('contractDetailReceipt.printApply') }} | ||
| 14 | + </el-button> | ||
| 15 | + </div> | ||
| 16 | + </div> | ||
| 17 | + | ||
| 18 | + <div class="margin-top"> | ||
| 19 | + <el-table :data="contractDetailReceiptInfo.feeReceipts" border style="width: 100%"> | ||
| 20 | + <el-table-column width="50" align="center"> | ||
| 21 | + <template slot-scope="scope"> | ||
| 22 | + <el-checkbox v-model="contractDetailReceiptInfo.selectReceipts" :label="scope.row.receiptId"></el-checkbox> | ||
| 23 | + </template> | ||
| 24 | + </el-table-column> | ||
| 25 | + <el-table-column prop="objName" :label="$t('contractDetailReceipt.feeType')" align="center"></el-table-column> | ||
| 26 | + <el-table-column prop="payObjName" :label="$t('contractDetailReceipt.owner')" align="center"></el-table-column> | ||
| 27 | + <el-table-column prop="feeName" :label="$t('contractDetailReceipt.feeItem')" align="center"></el-table-column> | ||
| 28 | + <el-table-column :label="$t('contractDetailReceipt.feePeriod')" align="center" width="200"> | ||
| 29 | + <template slot-scope="scope"> | ||
| 30 | + {{ $dayjs(scope.row.startTime).format('YYYY-MM-DD') }}~<br /> | ||
| 31 | + {{ $dayjs(scope.row.endTime).format('YYYY-MM-DD') }} | ||
| 32 | + </template> | ||
| 33 | + </el-table-column> | ||
| 34 | + <el-table-column prop="amount" :label="$t('contractDetailReceipt.totalAmount')" align="center"> | ||
| 35 | + <template slot-scope="scope"> | ||
| 36 | + {{ scope.row.amount }}{{ $t('common.yuan') }} | ||
| 37 | + </template> | ||
| 38 | + </el-table-column> | ||
| 39 | + <el-table-column prop="createTime" :label="$t('contractDetailReceipt.payTime')" align="center" | ||
| 40 | + width="160"></el-table-column> | ||
| 41 | + <el-table-column prop="receiptId" :label="$t('contractDetailReceipt.receiptId')" align="center" | ||
| 42 | + width="120"></el-table-column> | ||
| 43 | + </el-table> | ||
| 44 | + | ||
| 45 | + <el-row class="margin-top"> | ||
| 46 | + <el-col :span="24" class="text-right"> | ||
| 47 | + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" | ||
| 48 | + :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="pageSize" | ||
| 49 | + layout="total, sizes, prev, pager, next, jumper" :total="total"> | ||
| 50 | + </el-pagination> | ||
| 51 | + </el-col> | ||
| 52 | + </el-row> | ||
| 53 | + </div> | ||
| 54 | + </div> | ||
| 55 | +</template> | ||
| 56 | + | ||
| 57 | +<script> | ||
| 58 | +import { queryFeeReceipt, listFeePrintPage } from '@/api/contract/contractDetailReceiptApi' | ||
| 59 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 60 | + | ||
| 61 | +export default { | ||
| 62 | + name: 'ContractDetailReceipt', | ||
| 63 | + data() { | ||
| 64 | + return { | ||
| 65 | + contractDetailReceiptInfo: { | ||
| 66 | + feeReceipts: [], | ||
| 67 | + payObjId: '', | ||
| 68 | + selectReceipts: [], | ||
| 69 | + printUrl: '/print.html#/pages/property/printPayFee' | ||
| 70 | + }, | ||
| 71 | + currentPage: 1, | ||
| 72 | + pageSize: 10, | ||
| 73 | + total: 0, | ||
| 74 | + communityId: '' | ||
| 75 | + } | ||
| 76 | + }, | ||
| 77 | + created() { | ||
| 78 | + this.communityId = getCommunityId() | ||
| 79 | + this._listFeePrintPages() | ||
| 80 | + }, | ||
| 81 | + watch: { | ||
| 82 | + 'contractDetailReceiptInfo.selectReceipts': { | ||
| 83 | + handler(newVal) { | ||
| 84 | + if (newVal.length === this.contractDetailReceiptInfo.feeReceipts.length) { | ||
| 85 | + this.contractDetailReceiptInfo.quan = true | ||
| 86 | + } else { | ||
| 87 | + this.contractDetailReceiptInfo.quan = false | ||
| 88 | + } | ||
| 89 | + }, | ||
| 90 | + deep: true | ||
| 91 | + } | ||
| 92 | + }, | ||
| 93 | + methods: { | ||
| 94 | + open(data) { | ||
| 95 | + this.contractDetailReceiptInfo.payObjId = data.ownerId | ||
| 96 | + this._listContractDetailReceipt(this.currentPage, this.pageSize) | ||
| 97 | + }, | ||
| 98 | + switch(params) { | ||
| 99 | + if (!params.ownerId) return | ||
| 100 | + this.contractDetailReceiptInfo.payObjId = params.ownerId | ||
| 101 | + this._listContractDetailReceipt(this.currentPage, this.pageSize) | ||
| 102 | + }, | ||
| 103 | + _listContractDetailReceipt(page, rows) { | ||
| 104 | + this.contractDetailReceiptInfo.selectReceipts = [] | ||
| 105 | + const param = { | ||
| 106 | + page: page, | ||
| 107 | + row: rows, | ||
| 108 | + payObjId: this.contractDetailReceiptInfo.payObjId, | ||
| 109 | + communityId: this.communityId | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + queryFeeReceipt(param) | ||
| 113 | + .then(response => { | ||
| 114 | + this.contractDetailReceiptInfo.feeReceipts = response.data | ||
| 115 | + this.total = response.records | ||
| 116 | + this.currentPage = page | ||
| 117 | + }) | ||
| 118 | + .catch(error => { | ||
| 119 | + console.error('请求失败:', error) | ||
| 120 | + }) | ||
| 121 | + }, | ||
| 122 | + handleSizeChange(val) { | ||
| 123 | + this.pageSize = val | ||
| 124 | + this._listContractDetailReceipt(this.currentPage, this.pageSize) | ||
| 125 | + }, | ||
| 126 | + handleCurrentChange(val) { | ||
| 127 | + this.currentPage = val | ||
| 128 | + this._listContractDetailReceipt(this.currentPage, this.pageSize) | ||
| 129 | + }, | ||
| 130 | + _printFeeReceipt() { | ||
| 131 | + if (this.contractDetailReceiptInfo.selectReceipts.length < 1) { | ||
| 132 | + this.$message.warning(this.$t('contractDetailReceipt.selectPrintReceipt')) | ||
| 133 | + return | ||
| 134 | + } | ||
| 135 | + const receiptIds = this.contractDetailReceiptInfo.selectReceipts.join(',') | ||
| 136 | + window.open(`${this.contractDetailReceiptInfo.printUrl}?receiptIds=${receiptIds}&apply=N`) | ||
| 137 | + }, | ||
| 138 | + _printApplyFeeReceipt() { | ||
| 139 | + if (this.contractDetailReceiptInfo.selectReceipts.length < 1) { | ||
| 140 | + this.$message.warning(this.$t('contractDetailReceipt.selectPrint')) | ||
| 141 | + return | ||
| 142 | + } | ||
| 143 | + const receiptIds = this.contractDetailReceiptInfo.selectReceipts.join(',') | ||
| 144 | + window.open(`/print.html#/pages/property/printPayFee?receiptIds=${receiptIds}&apply=Y`) | ||
| 145 | + }, | ||
| 146 | + _printFeeSmallReceipt() { | ||
| 147 | + if (this.contractDetailReceiptInfo.selectReceipts.length < 1) { | ||
| 148 | + this.$message.warning(this.$t('contractDetailReceipt.selectPrintReceipt')) | ||
| 149 | + return | ||
| 150 | + } | ||
| 151 | + const receiptIds = this.contractDetailReceiptInfo.selectReceipts.join(',') | ||
| 152 | + window.open(`/smallPrint.html#/pages/property/printSmallPayFee?receiptIds=${receiptIds}`) | ||
| 153 | + }, | ||
| 154 | + _listFeePrintPages() { | ||
| 155 | + const param = { | ||
| 156 | + page: 1, | ||
| 157 | + row: 1, | ||
| 158 | + state: 'T', | ||
| 159 | + communityId: this.communityId | ||
| 160 | + } | ||
| 161 | + | ||
| 162 | + listFeePrintPage(param) | ||
| 163 | + .then(response => { | ||
| 164 | + const feePrintPages = response.data | ||
| 165 | + if (feePrintPages && feePrintPages.length > 0) { | ||
| 166 | + this.contractDetailReceiptInfo.printUrl = feePrintPages[0].url | ||
| 167 | + } | ||
| 168 | + }) | ||
| 169 | + .catch(error => { | ||
| 170 | + console.error('请求失败:', error) | ||
| 171 | + }) | ||
| 172 | + } | ||
| 173 | + } | ||
| 174 | +} | ||
| 175 | +</script> | ||
| 176 | + | ||
| 177 | +<style scoped> | ||
| 178 | +.margin-top { | ||
| 179 | + margin-top: 20px; | ||
| 180 | +} | ||
| 181 | + | ||
| 182 | +.margin-top-lg { | ||
| 183 | + margin-top: 30px; | ||
| 184 | +} | ||
| 185 | + | ||
| 186 | +.padding-right-xs { | ||
| 187 | + padding-right: 5px; | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +.padding-left-xl { | ||
| 191 | + padding-left: 30px; | ||
| 192 | +} | ||
| 193 | + | ||
| 194 | +.padding-right-lg { | ||
| 195 | + padding-right: 30px; | ||
| 196 | +} | ||
| 197 | +</style> | ||
| 0 | \ No newline at end of file | 198 | \ No newline at end of file |
src/components/contract/contractDetailReceiptDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-receipt ref="contractDetailReceipt"></contract-detail-receipt> | ||
| 4 | + <el-button @click="switchOwner">Switch Owner</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailReceipt from '@/components/contract/contractDetailReceipt' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailReceipt | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchOwner() { | ||
| 17 | + this.$refs.contractDetailReceipt.switch({ | ||
| 18 | + ownerId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailRoom.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="margin-top"> | ||
| 3 | + <div class="flex justify-end"> | ||
| 4 | + <div :span="2" class="padding-right-xs padding-left-xl"></div> | ||
| 5 | + <div :span="2" class="padding-right-xs padding-right-xl"></div> | ||
| 6 | + <div :span="8" class="text-right"> | ||
| 7 | + <el-button type="primary" size="small" style="margin-left:10px" v-if="hasPrivilege('502023021978930012')" | ||
| 8 | + @click="_openAddContractRoom"> | ||
| 9 | + <i class="el-icon-plus"></i> | ||
| 10 | + {{ $t('contractDetailRoom.addPropertyChange') }} | ||
| 11 | + </el-button> | ||
| 12 | + </div> | ||
| 13 | + </div> | ||
| 14 | + <div class="margin-top"> | ||
| 15 | + <el-table :data="contractDetailRoomInfo.rooms" style="width: 100%" border stripe> | ||
| 16 | + <el-table-column prop="roomName" :label="$t('contractDetailRoom.room')" align="center"></el-table-column> | ||
| 17 | + <el-table-column prop="layer" :label="$t('contractDetailRoom.floor')" align="center"></el-table-column> | ||
| 18 | + <el-table-column prop="roomSubTypeName" :label="$t('contractDetailRoom.type')" align="center"></el-table-column> | ||
| 19 | + <el-table-column :label="$t('contractDetailRoom.area')" align="center"> | ||
| 20 | + <template slot-scope="scope"> | ||
| 21 | + {{ scope.row.builtUpArea }}/{{ scope.row.roomArea }} | ||
| 22 | + </template> | ||
| 23 | + </el-table-column> | ||
| 24 | + <el-table-column prop="roomRent" :label="$t('contractDetailRoom.rent')" align="center"></el-table-column> | ||
| 25 | + <el-table-column prop="stateName" :label="$t('contractDetailRoom.roomStatus')" align="center"></el-table-column> | ||
| 26 | + <el-table-column :label="$t('contractDetailRoom.operation')" align="center"> | ||
| 27 | + <template slot-scope="scope"> | ||
| 28 | + <el-button v-if="scope.row.state != '2002'" size="mini" @click="_toSimplifyAcceptance(scope.row)"> | ||
| 29 | + {{ $t('contractDetailRoom.businessAcceptance') }} | ||
| 30 | + </el-button> | ||
| 31 | + </template> | ||
| 32 | + </el-table-column> | ||
| 33 | + </el-table> | ||
| 34 | + <el-row class="margin-top"> | ||
| 35 | + <el-col :span="4"> | ||
| 36 | + <span>{{ $t('contractDetailRoom.contractArea') }}:</span> | ||
| 37 | + {{ contractDetailRoomInfo.totalArea }} | ||
| 38 | + </el-col> | ||
| 39 | + <el-col :span="8" class="text-right"> | ||
| 40 | + <el-pagination @current-change="handlePageChange" :current-page="pagination.currentPage" | ||
| 41 | + :page-size="pagination.pageSize" layout="total, prev, pager, next" | ||
| 42 | + :total="pagination.total"></el-pagination> | ||
| 43 | + </el-col> | ||
| 44 | + </el-row> | ||
| 45 | + </div> | ||
| 46 | + </div> | ||
| 47 | +</template> | ||
| 48 | + | ||
| 49 | +<script> | ||
| 50 | +import { queryContractRoom } from '@/api/contract/contractDetailRoomApi' | ||
| 51 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 52 | + | ||
| 53 | +export default { | ||
| 54 | + name: 'ContractDetailRoom', | ||
| 55 | + data() { | ||
| 56 | + return { | ||
| 57 | + contractDetailRoomInfo: { | ||
| 58 | + rooms: [], | ||
| 59 | + contractId: '', | ||
| 60 | + roomNum: '', | ||
| 61 | + totalArea: '0' | ||
| 62 | + }, | ||
| 63 | + pagination: { | ||
| 64 | + currentPage: 1, | ||
| 65 | + pageSize: 10, | ||
| 66 | + total: 0 | ||
| 67 | + } | ||
| 68 | + } | ||
| 69 | + }, | ||
| 70 | + methods: { | ||
| 71 | + open(data) { | ||
| 72 | + this.contractDetailRoomInfo.contractId = data.contractId | ||
| 73 | + this._loadContractDetailRoomData(1, this.pagination.pageSize) | ||
| 74 | + }, | ||
| 75 | + _loadContractDetailRoomData(page, row) { | ||
| 76 | + const params = { | ||
| 77 | + contractId: this.contractDetailRoomInfo.contractId, | ||
| 78 | + page: page || 1, | ||
| 79 | + row: row || 10 | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + queryContractRoom(params).then(response => { | ||
| 83 | + this.contractDetailRoomInfo.rooms = response.data | ||
| 84 | + this._sumRoomArea() | ||
| 85 | + this.pagination.total = response.total || 0 | ||
| 86 | + }).catch(error => { | ||
| 87 | + console.error('请求失败:', error) | ||
| 88 | + }) | ||
| 89 | + }, | ||
| 90 | + _sumRoomArea() { | ||
| 91 | + const rooms = this.contractDetailRoomInfo.rooms | ||
| 92 | + if (!rooms || rooms.length < 1) { | ||
| 93 | + this.contractDetailRoomInfo.totalArea = '0' | ||
| 94 | + return '0' | ||
| 95 | + } | ||
| 96 | + let totalArea = 0 | ||
| 97 | + rooms.forEach(room => { | ||
| 98 | + totalArea += parseFloat(room.builtUpArea) | ||
| 99 | + }) | ||
| 100 | + this.contractDetailRoomInfo.totalArea = totalArea.toFixed(2) | ||
| 101 | + return totalArea.toFixed(2) | ||
| 102 | + }, | ||
| 103 | + _toSimplifyAcceptance(room) { | ||
| 104 | + const date = new Date() | ||
| 105 | + this.$store.dispatch('app/saveData', { | ||
| 106 | + key: 'JAVA110_IS_BACK', | ||
| 107 | + value: date.getTime() | ||
| 108 | + }) | ||
| 109 | + this.$store.dispatch('app/saveData', { | ||
| 110 | + key: 'simplifyAcceptanceSearch', | ||
| 111 | + value: { | ||
| 112 | + searchType: '1', | ||
| 113 | + searchValue: `${room.floorNum}-${room.unitNum}-${room.roomNum}`, | ||
| 114 | + searchPlaceholder: this.$t('contractDetailRoom.searchPlaceholder') | ||
| 115 | + } | ||
| 116 | + }) | ||
| 117 | + this.$router.push('/property/simplifyAcceptance?tab=businessAcceptance') | ||
| 118 | + }, | ||
| 119 | + _openAddContractRoom() { | ||
| 120 | + this.$router.push('/admin/contractChangeDetail?param=contractChangeAssets') | ||
| 121 | + }, | ||
| 122 | + handlePageChange(currentPage) { | ||
| 123 | + this.pagination.currentPage = currentPage | ||
| 124 | + this._loadContractDetailRoomData(currentPage, this.pagination.pageSize) | ||
| 125 | + }, | ||
| 126 | + }, | ||
| 127 | + created() { | ||
| 128 | + this.communityId = getCommunityId() | ||
| 129 | + } | ||
| 130 | +} | ||
| 131 | +</script> | ||
| 132 | + | ||
| 133 | +<style scoped> | ||
| 134 | +.margin-top { | ||
| 135 | + margin-top: 20px; | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +.margin-top-lg { | ||
| 139 | + margin-top: 30px; | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +.padding-right-xs { | ||
| 143 | + padding-right: 5px; | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | +.padding-left-xl { | ||
| 147 | + padding-left: 20px; | ||
| 148 | +} | ||
| 149 | + | ||
| 150 | +.text-right { | ||
| 151 | + text-align: right; | ||
| 152 | +} | ||
| 153 | +</style> | ||
| 0 | \ No newline at end of file | 154 | \ No newline at end of file |
src/components/contract/contractDetailRoomDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-room ref="contractDetailRoom"></contract-detail-room> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailRoom from '@/components/contract/contractDetailRoom' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailRoom | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailRoom._loadContractDetailRoomData({ | ||
| 18 | + contractId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/contract/contractDetailSub.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="margin-top"> | ||
| 3 | + <el-row :gutter="20" class="margin-top-lg"> | ||
| 4 | + <el-col :span="2" class="padding-right-xs padding-left-xl"></el-col> | ||
| 5 | + <el-col :span="2" class="padding-right-xs padding-right-xl"></el-col> | ||
| 6 | + <el-col :span="8" class="text-right"></el-col> | ||
| 7 | + </el-row> | ||
| 8 | + <div class="margin-top"> | ||
| 9 | + <el-table :data="contractDetailSubInfo.contracts" style="width: 100%" border stripe> | ||
| 10 | + <el-table-column prop="contractName" :label="$t('contractDetailSub.contractName')" align="center" /> | ||
| 11 | + <el-table-column prop="contractCode" :label="$t('contractDetailSub.contractCode')" align="center" /> | ||
| 12 | + <el-table-column :label="$t('contractDetailSub.parentContractCode')" align="center"> | ||
| 13 | + <template #default="{ row }"> | ||
| 14 | + {{ row.parentContractCode || '-' }} | ||
| 15 | + </template> | ||
| 16 | + </el-table-column> | ||
| 17 | + <el-table-column prop="contractTypeName" :label="$t('contractDetailSub.contractType')" align="center" /> | ||
| 18 | + <el-table-column :label="$t('contractDetailSub.operator')" align="center"> | ||
| 19 | + <template #default="{ row }"> | ||
| 20 | + {{ row.operator }}({{ row.operatorLink }}) | ||
| 21 | + </template> | ||
| 22 | + </el-table-column> | ||
| 23 | + <el-table-column prop="amount" :label="$t('contractDetailSub.contractAmount')" align="center" /> | ||
| 24 | + <el-table-column :label="$t('contractDetailSub.contractPartyB')" align="center"> | ||
| 25 | + <template #default="{ row }"> | ||
| 26 | + {{ row.partyB }}({{ row.bLink }}) | ||
| 27 | + </template> | ||
| 28 | + </el-table-column> | ||
| 29 | + <el-table-column :label="$t('contractDetailSub.validityPeriod')" align="center"> | ||
| 30 | + <template #default="{ row }"> | ||
| 31 | + {{ row.startTime }}<br> | ||
| 32 | + ~{{ row.endTime }} | ||
| 33 | + </template> | ||
| 34 | + </el-table-column> | ||
| 35 | + <el-table-column prop="createTime" :label="$t('contractDetailSub.draftTime')" align="center" /> | ||
| 36 | + <el-table-column prop="stateName" :label="$t('contractDetailSub.status')" align="center" /> | ||
| 37 | + <el-table-column :label="$t('contractDetailSub.operation')" align="center"> | ||
| 38 | + <template #default="{ row }"> | ||
| 39 | + <el-button type="text" size="small" @click="_viewContract(row)"> | ||
| 40 | + {{ $t('contractDetailSub.view') }} | ||
| 41 | + </el-button> | ||
| 42 | + </template> | ||
| 43 | + </el-table-column> | ||
| 44 | + </el-table> | ||
| 45 | + <el-pagination class="pagination" layout="total, sizes, prev, pager, next, jumper" :total="total" | ||
| 46 | + :page-size="pageSize" @current-change="handleCurrentChange" @size-change="handleSizeChange" /> | ||
| 47 | + </div> | ||
| 48 | + </div> | ||
| 49 | +</template> | ||
| 50 | + | ||
| 51 | +<script> | ||
| 52 | +import { queryContract } from '@/api/contract/contractDetailSubApi' | ||
| 53 | +import { getCommunityId } from '@/api/community/communityApi' | ||
| 54 | + | ||
| 55 | +export default { | ||
| 56 | + name: 'ContractDetailSub', | ||
| 57 | + data() { | ||
| 58 | + return { | ||
| 59 | + contractDetailSubInfo: { | ||
| 60 | + contracts: [], | ||
| 61 | + contractId: '', | ||
| 62 | + roomNum: '', | ||
| 63 | + totalArea: '0', | ||
| 64 | + total: 0, | ||
| 65 | + records: 0 | ||
| 66 | + }, | ||
| 67 | + pageSize: 10, | ||
| 68 | + currentPage: 1, | ||
| 69 | + total: 0, | ||
| 70 | + communityId: '' | ||
| 71 | + } | ||
| 72 | + }, | ||
| 73 | + created() { | ||
| 74 | + this.communityId = getCommunityId() | ||
| 75 | + }, | ||
| 76 | + methods: { | ||
| 77 | + open(data) { | ||
| 78 | + this.contractDetailSubInfo.contractId = data.contractId | ||
| 79 | + this._loadContractDetailSubInfoData() | ||
| 80 | + }, | ||
| 81 | + handleCurrentChange(val) { | ||
| 82 | + this.currentPage = val | ||
| 83 | + this._loadContractDetailSubInfoData() | ||
| 84 | + }, | ||
| 85 | + handleSizeChange(val) { | ||
| 86 | + this.pageSize = val | ||
| 87 | + this._loadContractDetailSubInfoData() | ||
| 88 | + }, | ||
| 89 | + _loadContractDetailSubInfoData() { | ||
| 90 | + const params = { | ||
| 91 | + contractParentId: this.contractDetailSubInfo.contractId, | ||
| 92 | + communityId: this.communityId, | ||
| 93 | + page: this.currentPage, | ||
| 94 | + row: this.pageSize | ||
| 95 | + } | ||
| 96 | + | ||
| 97 | + queryContract(params).then(response => { | ||
| 98 | + this.contractDetailSubInfo.contracts = response.data | ||
| 99 | + this.contractDetailSubInfo.total = response.total | ||
| 100 | + this.contractDetailSubInfo.records = response.records | ||
| 101 | + this.total = response.records | ||
| 102 | + }).catch(error => { | ||
| 103 | + console.error('请求失败:', error) | ||
| 104 | + }) | ||
| 105 | + }, | ||
| 106 | + _viewContract(contract) { | ||
| 107 | + this.$router.push(`/pages/contract/contractDetail?contractId=${contract.contractId}`) | ||
| 108 | + }, | ||
| 109 | + switch(data) { | ||
| 110 | + this.contractDetailSubInfo.contractId = data.contractId | ||
| 111 | + this._loadContractDetailSubInfoData() | ||
| 112 | + } | ||
| 113 | + } | ||
| 114 | +} | ||
| 115 | +</script> | ||
| 116 | + | ||
| 117 | +<style scoped> | ||
| 118 | +.margin-top { | ||
| 119 | + margin-top: 20px; | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +.margin-top-lg { | ||
| 123 | + margin-top: 30px; | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +.padding-right-xs { | ||
| 127 | + padding-right: 10px; | ||
| 128 | +} | ||
| 129 | + | ||
| 130 | +.padding-left-xl { | ||
| 131 | + padding-left: 40px; | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +.padding-right-xl { | ||
| 135 | + padding-right: 40px; | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +.text-right { | ||
| 139 | + text-align: right; | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +.pagination { | ||
| 143 | + margin-top: 20px; | ||
| 144 | + text-align: right; | ||
| 145 | +} | ||
| 146 | +</style> | ||
| 0 | \ No newline at end of file | 147 | \ No newline at end of file |
src/components/contract/contractDetailSubDemo.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <contract-detail-sub ref="contractDetailSub"></contract-detail-sub> | ||
| 4 | + <el-button @click="switchContract">Switch Contract</el-button> | ||
| 5 | + </div> | ||
| 6 | +</template> | ||
| 7 | + | ||
| 8 | +<script> | ||
| 9 | +import ContractDetailSub from '@/components/contract/contractDetailSub' | ||
| 10 | + | ||
| 11 | +export default { | ||
| 12 | + components: { | ||
| 13 | + ContractDetailSub | ||
| 14 | + }, | ||
| 15 | + methods: { | ||
| 16 | + switchContract() { | ||
| 17 | + this.$refs.contractDetailSub.switch({ | ||
| 18 | + contractId: '12345' | ||
| 19 | + }) | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 23 | +</script> | ||
| 0 | \ No newline at end of file | 24 | \ No newline at end of file |
src/components/owner/ownerDetailRoom.vue
| @@ -158,8 +158,9 @@ export default { | @@ -158,8 +158,9 @@ export default { | ||
| 158 | this.ownerDetailRoomInfo.allOweFeeAmount = totalOweFeeAmount.toFixed(2) | 158 | this.ownerDetailRoomInfo.allOweFeeAmount = totalOweFeeAmount.toFixed(2) |
| 159 | }, | 159 | }, |
| 160 | _openAddOwnerRoom() { | 160 | _openAddOwnerRoom() { |
| 161 | + console.log(this.ownerDetailRoomInfo.ownerId) | ||
| 161 | this.$router.push({ | 162 | this.$router.push({ |
| 162 | - path: '/property/addOwnerRoomBinding', | 163 | + path: '/views/owner/ownerBindRoom', |
| 163 | query: { ownerId: this.ownerDetailRoomInfo.ownerId } | 164 | query: { ownerId: this.ownerDetailRoomInfo.ownerId } |
| 164 | }) | 165 | }) |
| 165 | }, | 166 | }, |
src/components/owner/ownerDetailRoomFee.vue
| 1 | <template> | 1 | <template> |
| 2 | <div class="margin-top"> | 2 | <div class="margin-top"> |
| 3 | - <el-row class="margin-top-lg"> | ||
| 4 | - <el-col :span="12" class="padding-right-xs padding-left-xl"> | 3 | + <div class="flex justify-end"> |
| 4 | + <div class="padding-right-xs padding-left-xl"> | ||
| 5 | <span class="margin-right" v-for="(item, index) in ownerDetailRoomFeeInfo.payObjs" :key="index"> | 5 | <span class="margin-right" v-for="(item, index) in ownerDetailRoomFeeInfo.payObjs" :key="index"> |
| 6 | <el-checkbox class="checkRoomItem" v-model="ownerDetailRoomFeeInfo.payerObjIds" :label="item.roomId" | 6 | <el-checkbox class="checkRoomItem" v-model="ownerDetailRoomFeeInfo.payerObjIds" :label="item.roomId" |
| 7 | @change="_chanagePayerObjId()"> | 7 | @change="_chanagePayerObjId()"> |
| 8 | {{ item.floorNum }}-{{ item.unitNum }}-{{ item.roomNum }} | 8 | {{ item.floorNum }}-{{ item.unitNum }}-{{ item.roomNum }} |
| 9 | </el-checkbox> | 9 | </el-checkbox> |
| 10 | </span> | 10 | </span> |
| 11 | - </el-col> | ||
| 12 | - <el-col :span="3" class="padding-lr-xs"> | 11 | + </div> |
| 12 | + <div class="padding-lr-xs"> | ||
| 13 | <el-select v-model="ownerDetailRoomFeeInfo.state" @change="_changeContractConfigId()" size="small" | 13 | <el-select v-model="ownerDetailRoomFeeInfo.state" @change="_changeContractConfigId()" size="small" |
| 14 | :placeholder="$t('ownerDetailRoomFee.selectStatus')"> | 14 | :placeholder="$t('ownerDetailRoomFee.selectStatus')"> |
| 15 | <el-option :label="$t('ownerDetailRoomFee.valid')" value="2008001"></el-option> | 15 | <el-option :label="$t('ownerDetailRoomFee.valid')" value="2008001"></el-option> |
| 16 | <el-option :label="$t('ownerDetailRoomFee.feeEnd')" value="2009001"></el-option> | 16 | <el-option :label="$t('ownerDetailRoomFee.feeEnd')" value="2009001"></el-option> |
| 17 | </el-select> | 17 | </el-select> |
| 18 | - </el-col> | ||
| 19 | - <el-col :span="9" class="text-right"> | 18 | + </div> |
| 19 | + <div :span="9" class="text-right"> | ||
| 20 | <el-button type="primary" size="small" style="margin-left:10px" v-if="hasPrivilege('502020082314267912')" | 20 | <el-button type="primary" size="small" style="margin-left:10px" v-if="hasPrivilege('502020082314267912')" |
| 21 | @click="_openBatchPayRoomFeeModal()"> | 21 | @click="_openBatchPayRoomFeeModal()"> |
| 22 | {{ $t('ownerDetailRoomFee.batchPay') }} | 22 | {{ $t('ownerDetailRoomFee.batchPay') }} |
| @@ -40,8 +40,8 @@ | @@ -40,8 +40,8 @@ | ||
| 40 | <el-button type="default" size="small" style="margin-left:10px" @click="_printOwnOrder()"> | 40 | <el-button type="default" size="small" style="margin-left:10px" @click="_printOwnOrder()"> |
| 41 | {{ $t('ownerDetailRoomFee.reminder') }} | 41 | {{ $t('ownerDetailRoomFee.reminder') }} |
| 42 | </el-button> | 42 | </el-button> |
| 43 | - </el-col> | ||
| 44 | - </el-row> | 43 | + </div> |
| 44 | + </div> | ||
| 45 | <div class="margin-top"> | 45 | <div class="margin-top"> |
| 46 | <el-table :data="ownerDetailRoomFeeInfo.fees" style="width: 100%"> | 46 | <el-table :data="ownerDetailRoomFeeInfo.fees" style="width: 100%"> |
| 47 | <el-table-column prop="payerObjName" :label="$t('ownerDetailRoomFee.room')" align="center"></el-table-column> | 47 | <el-table-column prop="payerObjName" :label="$t('ownerDetailRoomFee.room')" align="center"></el-table-column> |
| @@ -135,25 +135,25 @@ | @@ -135,25 +135,25 @@ | ||
| 135 | </el-row> | 135 | </el-row> |
| 136 | </div> | 136 | </div> |
| 137 | 137 | ||
| 138 | - <rooms-import-temp-fee ref="roomsImportTempFee"></rooms-import-temp-fee> | ||
| 139 | - <rooms-create-fee ref="roomsCreateFee"></rooms-create-fee> | ||
| 140 | - <rooms-proxy-fee ref="roomsProxyFee"></rooms-proxy-fee> | 138 | + <!-- <rooms-import-temp-fee ref="roomsImportTempFee"></rooms-import-temp-fee> --> |
| 139 | + <!-- <rooms-create-fee ref="roomsCreateFee"></rooms-create-fee> --> | ||
| 140 | + <!-- <rooms-proxy-fee ref="roomsProxyFee"></rooms-proxy-fee> --> | ||
| 141 | </div> | 141 | </div> |
| 142 | </template> | 142 | </template> |
| 143 | 143 | ||
| 144 | <script> | 144 | <script> |
| 145 | -import RoomsImportTempFee from '@/components/fee/roomsImportTempFee' | ||
| 146 | -import RoomsCreateFee from '@/components/fee/roomsCreateFee' | ||
| 147 | -import RoomsProxyFee from '@/components/fee/roomsProxyFee' | 145 | +// import RoomsImportTempFee from '@/components/fee/roomsImportTempFee' |
| 146 | +// import RoomsCreateFee from '@/components/fee/roomsCreateFee' | ||
| 147 | +// import RoomsProxyFee from '@/components/fee/roomsProxyFee' | ||
| 148 | import { listFee, listRoomsByOwner } from '@/api/owner/ownerDetailRoomFeeApi' | 148 | import { listFee, listRoomsByOwner } from '@/api/owner/ownerDetailRoomFeeApi' |
| 149 | import { getCommunityId } from '@/api/community/communityApi' | 149 | import { getCommunityId } from '@/api/community/communityApi' |
| 150 | 150 | ||
| 151 | export default { | 151 | export default { |
| 152 | name: 'OwnerDetailRoomFee', | 152 | name: 'OwnerDetailRoomFee', |
| 153 | components: { | 153 | components: { |
| 154 | - RoomsImportTempFee, | ||
| 155 | - RoomsCreateFee, | ||
| 156 | - RoomsProxyFee | 154 | + // RoomsImportTempFee, |
| 155 | + // RoomsCreateFee, | ||
| 156 | + // RoomsProxyFee | ||
| 157 | }, | 157 | }, |
| 158 | data() { | 158 | data() { |
| 159 | return { | 159 | return { |
| @@ -318,4 +318,4 @@ export default { | @@ -318,4 +318,4 @@ export default { | ||
| 318 | }) | 318 | }) |
| 319 | } | 319 | } |
| 320 | } | 320 | } |
| 321 | -</script> | ||
| 322 | \ No newline at end of file | 321 | \ No newline at end of file |
| 322 | +</script> |
src/i18n/contractI18n.js
| @@ -8,6 +8,7 @@ import { messages as contractManageMessages } from '../views/contract/contractMa | @@ -8,6 +8,7 @@ import { messages as contractManageMessages } from '../views/contract/contractMa | ||
| 8 | import { messages as contractChangeManageMessages } from '../views/contract/contractChangeManageLang' | 8 | import { messages as contractChangeManageMessages } from '../views/contract/contractChangeManageLang' |
| 9 | import { messages as contractChangeDetailMessages } from '../views/contract/contractChangeDetailLang' | 9 | import { messages as contractChangeDetailMessages } from '../views/contract/contractChangeDetailLang' |
| 10 | import { messages as expirationContractManageMessages } from '../views/contract/expirationContractManageLang' | 10 | import { messages as expirationContractManageMessages } from '../views/contract/expirationContractManageLang' |
| 11 | +import { messages as contractDetailMessages } from '../views/contract/contractDetailLang.js' | ||
| 11 | 12 | ||
| 12 | export const messages ={ | 13 | export const messages ={ |
| 13 | en:{ | 14 | en:{ |
| @@ -21,6 +22,7 @@ export const messages ={ | @@ -21,6 +22,7 @@ export const messages ={ | ||
| 21 | ...contractChangeManageMessages.en, | 22 | ...contractChangeManageMessages.en, |
| 22 | ...contractChangeDetailMessages.en, | 23 | ...contractChangeDetailMessages.en, |
| 23 | ...expirationContractManageMessages.en, | 24 | ...expirationContractManageMessages.en, |
| 25 | + ...contractDetailMessages.en, | ||
| 24 | }, | 26 | }, |
| 25 | zh:{ | 27 | zh:{ |
| 26 | ...contractTypeManageMessages.zh, | 28 | ...contractTypeManageMessages.zh, |
| @@ -33,5 +35,6 @@ export const messages ={ | @@ -33,5 +35,6 @@ export const messages ={ | ||
| 33 | ...contractChangeManageMessages.zh, | 35 | ...contractChangeManageMessages.zh, |
| 34 | ...contractChangeDetailMessages.zh, | 36 | ...contractChangeDetailMessages.zh, |
| 35 | ...expirationContractManageMessages.zh, | 37 | ...expirationContractManageMessages.zh, |
| 36 | - } | 38 | + ...contractDetailMessages.zh, |
| 39 | +} | ||
| 37 | } | 40 | } |
| 38 | \ No newline at end of file | 41 | \ No newline at end of file |
src/router/contractRouter.js
| @@ -44,4 +44,9 @@ export default [ | @@ -44,4 +44,9 @@ export default [ | ||
| 44 | name: '/pages/admin/expirationContractManage', | 44 | name: '/pages/admin/expirationContractManage', |
| 45 | component: () => import('@/views/contract/expirationContractManageList.vue') | 45 | component: () => import('@/views/contract/expirationContractManageList.vue') |
| 46 | }, | 46 | }, |
| 47 | + { | ||
| 48 | + path: '/views/contract/contractDetail', | ||
| 49 | + name: '/views/contract/contractDetail', | ||
| 50 | + component: () => import('@/views/contract/contractDetail.vue') | ||
| 51 | + }, | ||
| 47 | ] | 52 | ] |
| 48 | \ No newline at end of file | 53 | \ No newline at end of file |
src/views/contract/contractDetail.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="white-bg padding-lg padding-top border-radius"> | ||
| 3 | + <div class="flex justify-between"> | ||
| 4 | + <div class="text-title">{{ $t('contractDetail.title') }}</div> | ||
| 5 | + <div> | ||
| 6 | + <el-button type="primary" size="small" style="margin-left:10px" @click="$router.go(-1)"> | ||
| 7 | + <i class="el-icon-close"></i>{{ $t('common.back') }} | ||
| 8 | + </el-button> | ||
| 9 | + <el-button type="primary" size="small" @click="_printContract"> | ||
| 10 | + <i class="el-icon-printer"></i>{{ $t('common.print') }} | ||
| 11 | + </el-button> | ||
| 12 | + </div> | ||
| 13 | + </div> | ||
| 14 | + | ||
| 15 | + <!-- 合同信息 --> | ||
| 16 | + <div class="margin-top"> | ||
| 17 | + <el-form class="text-left"> | ||
| 18 | + <el-row :gutter="20"> | ||
| 19 | + <el-col :span="6"> | ||
| 20 | + <el-form-item :label="$t('contractDetail.contractName') + ':'"> | ||
| 21 | + <span>{{ contractDetailInfo.contractName }}</span> | ||
| 22 | + </el-form-item> | ||
| 23 | + </el-col> | ||
| 24 | + <el-col :span="6"> | ||
| 25 | + <el-form-item :label="$t('contractDetail.contractCode') + ':'"> | ||
| 26 | + <span>{{ contractDetailInfo.contractCode }}</span> | ||
| 27 | + </el-form-item> | ||
| 28 | + </el-col> | ||
| 29 | + <el-col :span="6"> | ||
| 30 | + <el-form-item :label="$t('contractDetail.contractType') + ':'"> | ||
| 31 | + <span>{{ contractDetailInfo.contractTypeName }}</span> | ||
| 32 | + </el-form-item> | ||
| 33 | + </el-col> | ||
| 34 | + <el-col :span="6"> | ||
| 35 | + <el-form-item :label="$t('contractDetail.partyA') + ':'"> | ||
| 36 | + <span>{{ contractDetailInfo.partyA }}</span> | ||
| 37 | + </el-form-item> | ||
| 38 | + </el-col> | ||
| 39 | + </el-row> | ||
| 40 | + | ||
| 41 | + <el-row :gutter="20"> | ||
| 42 | + <el-col :span="6"> | ||
| 43 | + <el-form-item :label="$t('contractDetail.aContacts') + ':'"> | ||
| 44 | + <span>{{ contractDetailInfo.aContacts }}</span> | ||
| 45 | + </el-form-item> | ||
| 46 | + </el-col> | ||
| 47 | + <el-col :span="6"> | ||
| 48 | + <el-form-item :label="$t('contractDetail.aLink') + ':'"> | ||
| 49 | + <span>{{ contractDetailInfo.aLink }}</span> | ||
| 50 | + </el-form-item> | ||
| 51 | + </el-col> | ||
| 52 | + <el-col :span="6"> | ||
| 53 | + <el-form-item :label="$t('contractDetail.partyB') + ':'"> | ||
| 54 | + <span>{{ contractDetailInfo.partyB }}</span> | ||
| 55 | + </el-form-item> | ||
| 56 | + </el-col> | ||
| 57 | + <el-col :span="6"> | ||
| 58 | + <el-form-item :label="$t('contractDetail.bContacts') + ':'"> | ||
| 59 | + <span>{{ contractDetailInfo.bContacts }}</span> | ||
| 60 | + </el-form-item> | ||
| 61 | + </el-col> | ||
| 62 | + </el-row> | ||
| 63 | + | ||
| 64 | + <el-row :gutter="20"> | ||
| 65 | + <el-col :span="6"> | ||
| 66 | + <el-form-item :label="$t('contractDetail.bLink') + ':'"> | ||
| 67 | + <span>{{ contractDetailInfo.bLink }}</span> | ||
| 68 | + </el-form-item> | ||
| 69 | + </el-col> | ||
| 70 | + <el-col :span="6"> | ||
| 71 | + <el-form-item :label="$t('contractDetail.operator') + ':'"> | ||
| 72 | + <span>{{ contractDetailInfo.operator }}</span> | ||
| 73 | + </el-form-item> | ||
| 74 | + </el-col> | ||
| 75 | + <el-col :span="6"> | ||
| 76 | + <el-form-item :label="$t('contractDetail.operatorLink') + ':'"> | ||
| 77 | + <span>{{ contractDetailInfo.operatorLink }}</span> | ||
| 78 | + </el-form-item> | ||
| 79 | + </el-col> | ||
| 80 | + <el-col :span="6"> | ||
| 81 | + <el-form-item :label="$t('contractDetail.amount') + ':'"> | ||
| 82 | + <span>{{ contractDetailInfo.amount }}</span> | ||
| 83 | + </el-form-item> | ||
| 84 | + </el-col> | ||
| 85 | + </el-row> | ||
| 86 | + | ||
| 87 | + <el-row :gutter="20"> | ||
| 88 | + <el-col :span="6"> | ||
| 89 | + <el-form-item :label="$t('contractDetail.startTime') + ':'"> | ||
| 90 | + <span>{{ contractDetailInfo.startTime }}</span> | ||
| 91 | + </el-form-item> | ||
| 92 | + </el-col> | ||
| 93 | + <el-col :span="6"> | ||
| 94 | + <el-form-item :label="$t('contractDetail.endTime') + ':'"> | ||
| 95 | + <span>{{ contractDetailInfo.endTime }}</span> | ||
| 96 | + </el-form-item> | ||
| 97 | + </el-col> | ||
| 98 | + <el-col :span="6"> | ||
| 99 | + <el-form-item :label="$t('contractDetail.signingTime') + ':'"> | ||
| 100 | + <span>{{ contractDetailInfo.signingTime }}</span> | ||
| 101 | + </el-form-item> | ||
| 102 | + </el-col> | ||
| 103 | + <el-col :span="6"> | ||
| 104 | + <el-form-item :label="$t('contractDetail.status') + ':'"> | ||
| 105 | + <span>{{ contractDetailInfo.stateName }}</span> | ||
| 106 | + </el-form-item> | ||
| 107 | + </el-col> | ||
| 108 | + </el-row> | ||
| 109 | + | ||
| 110 | + <el-row :gutter="20" v-if="contractDetailInfo.contractParentId"> | ||
| 111 | + <el-col :span="6"> | ||
| 112 | + <el-form-item :label="$t('contractDetail.parentContract') + ':'"> | ||
| 113 | + <span>{{ contractDetailInfo.contractParentName }}({{ contractDetailInfo.contractParentCode }})</span> | ||
| 114 | + </el-form-item> | ||
| 115 | + </el-col> | ||
| 116 | + </el-row> | ||
| 117 | + </el-form> | ||
| 118 | + </div> | ||
| 119 | + | ||
| 120 | + <divider /> | ||
| 121 | + <div class="margin-top-sm"> | ||
| 122 | + <el-tabs v-model="contractDetailInfo._currentTab" @tab-click="changeTab(contractDetailInfo._currentTab)"> | ||
| 123 | + <el-tab-pane :label="$t('contractDetail.room')" name="contractDetailRoom"></el-tab-pane> | ||
| 124 | + <el-tab-pane :label="$t('contractDetail.file')" name="contractDetailFile"></el-tab-pane> | ||
| 125 | + <el-tab-pane :label="$t('contractDetail.fee')" name="contractDetailFee"></el-tab-pane> | ||
| 126 | + <el-tab-pane :label="$t('contractDetail.hisFee')" name="contractDetailHisFee"></el-tab-pane> | ||
| 127 | + <el-tab-pane :label="$t('contractDetail.roomFee')" name="ownerDetailRoomFee"></el-tab-pane> | ||
| 128 | + <el-tab-pane :label="$t('contractDetail.hisRoomFee')" name="contractDetailHisRoomFee"></el-tab-pane> | ||
| 129 | + <el-tab-pane :label="$t('contractDetail.ownerInfo')" name="contractDetailOwner"></el-tab-pane> | ||
| 130 | + <el-tab-pane :label="$t('contractDetail.changeLog')" name="contractDetailChange"></el-tab-pane> | ||
| 131 | + <el-tab-pane :label="$t('contractDetail.draftApproval')" name="contractDetailFlow"></el-tab-pane> | ||
| 132 | + <el-tab-pane :label="$t('contractDetail.subContract')" name="contractDetailSub"></el-tab-pane> | ||
| 133 | + <el-tab-pane :label="$t('contractDetail.receipt')" name="contractDetailReceipt"></el-tab-pane> | ||
| 134 | + </el-tabs> | ||
| 135 | + </div> | ||
| 136 | + | ||
| 137 | + <component :is="contractDetailInfo._currentTab" :ref="contractDetailInfo._currentTab" | ||
| 138 | + :contractId="contractDetailInfo.contractId" :contractName="contractDetailInfo.contractName" | ||
| 139 | + :ownerId="contractDetailInfo.objId"></component> | ||
| 140 | + </div> | ||
| 141 | +</template> | ||
| 142 | + | ||
| 143 | +<script> | ||
| 144 | +import ContractDetailRoom from '@/components/contract/contractDetailRoom' | ||
| 145 | +import ContractDetailFile from '@/components/contract/contractDetailFile' | ||
| 146 | +import ContractDetailFee from '@/components/contract/contractDetailFee' | ||
| 147 | +import ContractDetailHisFee from '@/components/contract/contractDetailHisFee' | ||
| 148 | +import OwnerDetailRoomFee from '@/components/owner/ownerDetailRoomFee' | ||
| 149 | +import ContractDetailHisRoomFee from '@/components/contract/contractDetailHisRoomFee' | ||
| 150 | +import ContractDetailChange from '@/components/contract/contractDetailChange' | ||
| 151 | +import ContractDetailFlow from '@/components/contract/contractDetailFlow' | ||
| 152 | +import ContractDetailSub from '@/components/contract/contractDetailSub' | ||
| 153 | +import ContractDetailOwner from '@/components/contract/contractDetailOwner' | ||
| 154 | +import ContractDetailReceipt from '@/components/contract/contractDetailReceipt' | ||
| 155 | +import { queryContract } from '@/api/contract/contractDetailApi' | ||
| 156 | +import Divider from '@/components/system/divider' | ||
| 157 | + | ||
| 158 | +export default { | ||
| 159 | + name: 'ContractDetail', | ||
| 160 | + components: { | ||
| 161 | + ContractDetailRoom, | ||
| 162 | + ContractDetailFile, | ||
| 163 | + ContractDetailFee, | ||
| 164 | + ContractDetailHisFee, | ||
| 165 | + OwnerDetailRoomFee, | ||
| 166 | + ContractDetailHisRoomFee, | ||
| 167 | + ContractDetailChange, | ||
| 168 | + ContractDetailFlow, | ||
| 169 | + ContractDetailSub, | ||
| 170 | + ContractDetailOwner, | ||
| 171 | + ContractDetailReceipt, | ||
| 172 | + Divider | ||
| 173 | + }, | ||
| 174 | + data() { | ||
| 175 | + return { | ||
| 176 | + contractDetailInfo: { | ||
| 177 | + contractId: '', | ||
| 178 | + contractName: '', | ||
| 179 | + contractCode: '', | ||
| 180 | + contractType: '', | ||
| 181 | + contractTypeName: '', | ||
| 182 | + partyA: '', | ||
| 183 | + partyB: '', | ||
| 184 | + aContacts: '', | ||
| 185 | + bContacts: '', | ||
| 186 | + aLink: '', | ||
| 187 | + bLink: '', | ||
| 188 | + operator: '', | ||
| 189 | + operatorLink: '', | ||
| 190 | + amount: '', | ||
| 191 | + startTime: '', | ||
| 192 | + endTime: '', | ||
| 193 | + signingTime: '', | ||
| 194 | + param: '', | ||
| 195 | + planType: '', | ||
| 196 | + stateName: '', | ||
| 197 | + contractParentId: '', | ||
| 198 | + contractParentName: '', | ||
| 199 | + contractParentCode: '', | ||
| 200 | + objId: '', | ||
| 201 | + files: [], | ||
| 202 | + _currentTab: 'contractDetailRoom' | ||
| 203 | + } | ||
| 204 | + } | ||
| 205 | + }, | ||
| 206 | + created() { | ||
| 207 | + this.contractDetailInfo.contractId = this.$route.query.contractId | ||
| 208 | + if (!this.contractDetailInfo.contractId) { | ||
| 209 | + return | ||
| 210 | + } | ||
| 211 | + const currentTab = this.$route.query.currentTab | ||
| 212 | + if (currentTab) { | ||
| 213 | + this.contractDetailInfo._currentTab = currentTab | ||
| 214 | + } | ||
| 215 | + this._loadContractInfo() | ||
| 216 | + }, | ||
| 217 | + methods: { | ||
| 218 | + async _loadContractInfo() { | ||
| 219 | + try { | ||
| 220 | + const res = await queryContract({ | ||
| 221 | + page: 1, | ||
| 222 | + row: 1, | ||
| 223 | + contractId: this.contractDetailInfo.contractId | ||
| 224 | + }) | ||
| 225 | + const contract = res.data[0] | ||
| 226 | + Object.assign(this.contractDetailInfo, contract) | ||
| 227 | + this.changeTab(this.contractDetailInfo._currentTab) | ||
| 228 | + } catch (error) { | ||
| 229 | + console.error('Failed to load contract info:', error) | ||
| 230 | + } | ||
| 231 | + }, | ||
| 232 | + changeTab(tab) { | ||
| 233 | + this.contractDetailInfo._currentTab = tab | ||
| 234 | + setTimeout(() => { | ||
| 235 | + this.$refs[tab].open({ | ||
| 236 | + contractId: this.contractDetailInfo.contractId, | ||
| 237 | + contractName: this.contractDetailInfo.contractName, | ||
| 238 | + ownerId: this.contractDetailInfo.objId | ||
| 239 | + }) | ||
| 240 | + }, 500) | ||
| 241 | + }, | ||
| 242 | + _printContract() { | ||
| 243 | + const contract = this.contractDetailInfo | ||
| 244 | + window.open(`/print.html#/pages/admin/printContract?contractTypeId=${contract.contractType}&contractId=${contract.contractId}`) | ||
| 245 | + } | ||
| 246 | + } | ||
| 247 | +} | ||
| 248 | +</script> | ||
| 249 | + | ||
| 250 | +<style scoped> | ||
| 251 | +.white-bg { | ||
| 252 | + background-color: #fff; | ||
| 253 | +} | ||
| 254 | + | ||
| 255 | +.padding-lg { | ||
| 256 | + padding: 20px; | ||
| 257 | +} | ||
| 258 | + | ||
| 259 | +.padding-top { | ||
| 260 | + padding-top: 20px; | ||
| 261 | +} | ||
| 262 | + | ||
| 263 | +.border-radius { | ||
| 264 | + border-radius: 4px; | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | +.flex { | ||
| 268 | + display: flex; | ||
| 269 | +} | ||
| 270 | + | ||
| 271 | +.justify-between { | ||
| 272 | + justify-content: space-between; | ||
| 273 | +} | ||
| 274 | + | ||
| 275 | +.text-title { | ||
| 276 | + font-size: 18px; | ||
| 277 | + font-weight: bold; | ||
| 278 | +} | ||
| 279 | + | ||
| 280 | +.margin-top { | ||
| 281 | + margin-top: 20px; | ||
| 282 | +} | ||
| 283 | + | ||
| 284 | +.margin-top-sm { | ||
| 285 | + margin-top: 10px; | ||
| 286 | +} | ||
| 287 | + | ||
| 288 | +.vc-line-primary { | ||
| 289 | + border-top: 1px solid #409EFF; | ||
| 290 | +} | ||
| 291 | +</style> | ||
| 0 | \ No newline at end of file | 292 | \ No newline at end of file |
src/views/contract/contractDetailChangeLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailChange: { | ||
| 4 | + contractName: 'Contract Name', | ||
| 5 | + contractCode: 'Contract Code', | ||
| 6 | + contractType: 'Contract Type', | ||
| 7 | + partyA: 'Party A', | ||
| 8 | + partyB: 'Party B', | ||
| 9 | + changeType: 'Change Type', | ||
| 10 | + changePerson: 'Change Person', | ||
| 11 | + applyTime: 'Apply Time', | ||
| 12 | + description: 'Description', | ||
| 13 | + status: 'Status', | ||
| 14 | + operation: 'Operation', | ||
| 15 | + detail: 'Detail' | ||
| 16 | + } | ||
| 17 | + }, | ||
| 18 | + zh: { | ||
| 19 | + contractDetailChange: { | ||
| 20 | + contractName: '合同名称', | ||
| 21 | + contractCode: '合同编号', | ||
| 22 | + contractType: '合同类型', | ||
| 23 | + partyA: '甲方', | ||
| 24 | + partyB: '乙方', | ||
| 25 | + changeType: '变更类型', | ||
| 26 | + changePerson: '变更人', | ||
| 27 | + applyTime: '申请时间', | ||
| 28 | + description: '说明', | ||
| 29 | + status: '状态', | ||
| 30 | + operation: '操作', | ||
| 31 | + detail: '明细' | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | +} | ||
| 0 | \ No newline at end of file | 35 | \ No newline at end of file |
src/views/contract/contractDetailFeeLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailFee: { | ||
| 4 | + feeItem: 'Fee Item', | ||
| 5 | + feeFlag: 'Fee Flag', | ||
| 6 | + feeType: 'Fee Type', | ||
| 7 | + receivableAmount: 'Receivable Amount', | ||
| 8 | + accountingTime: 'Accounting Time', | ||
| 9 | + receivablePeriod: 'Receivable Period', | ||
| 10 | + description: 'Description', | ||
| 11 | + status: 'Status', | ||
| 12 | + operation: 'Operation', | ||
| 13 | + temporaryFee: 'Temporary Fee', | ||
| 14 | + createFee: 'Create Fee', | ||
| 15 | + payArrears: 'Pay Arrears', | ||
| 16 | + payment: 'Payment', | ||
| 17 | + paymentHistory: 'Payment History', | ||
| 18 | + cancel: 'Cancel', | ||
| 19 | + end: 'End', | ||
| 20 | + change: 'Change', | ||
| 21 | + previousReading: 'Previous Reading', | ||
| 22 | + currentReading: 'Current Reading', | ||
| 23 | + unitPrice: 'Unit Price', | ||
| 24 | + surcharge: 'Surcharge', | ||
| 25 | + usage: 'Usage', | ||
| 26 | + algorithm: 'Algorithm', | ||
| 27 | + fixedFee: 'Fixed Fee', | ||
| 28 | + feeBasedOnActual: 'Fee based on actual situation', | ||
| 29 | + note1: 'Note: "-" means not yet receivable or fee has ended', | ||
| 30 | + note2: 'Receivable amount -1 usually means formula error', | ||
| 31 | + arrearsSubtotal: 'Arrears Subtotal' | ||
| 32 | + } | ||
| 33 | + }, | ||
| 34 | + zh: { | ||
| 35 | + contractDetailFee: { | ||
| 36 | + feeItem: '费用项目', | ||
| 37 | + feeFlag: '费用标识', | ||
| 38 | + feeType: '费用类型', | ||
| 39 | + receivableAmount: '应收金额', | ||
| 40 | + accountingTime: '建账时间', | ||
| 41 | + receivablePeriod: '应收时间段', | ||
| 42 | + description: '说明', | ||
| 43 | + status: '状态', | ||
| 44 | + operation: '操作', | ||
| 45 | + temporaryFee: '临时收费', | ||
| 46 | + createFee: '创建费用', | ||
| 47 | + payArrears: '欠费缴费', | ||
| 48 | + payment: '缴费', | ||
| 49 | + paymentHistory: '缴费历史', | ||
| 50 | + cancel: '取消', | ||
| 51 | + end: '结束', | ||
| 52 | + change: '变更', | ||
| 53 | + previousReading: '上期度数', | ||
| 54 | + currentReading: '本期度数', | ||
| 55 | + unitPrice: '单价', | ||
| 56 | + surcharge: '附加费', | ||
| 57 | + usage: '用量', | ||
| 58 | + algorithm: '算法', | ||
| 59 | + fixedFee: '固定费', | ||
| 60 | + feeBasedOnActual: '费用根据实际情况而定', | ||
| 61 | + note1: '注意:应收结束时间 "-" 表示未到应收时间或收费已结束', | ||
| 62 | + note2: '应收金额为-1一般为费用项公式设置出错请检查', | ||
| 63 | + arrearsSubtotal: '欠费小计' | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | +} | ||
| 0 | \ No newline at end of file | 67 | \ No newline at end of file |
src/views/contract/contractDetailFileLang.js
0 → 100644
src/views/contract/contractDetailFlowLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailFlow: { | ||
| 4 | + serialNumber: 'Serial Number', | ||
| 5 | + processor: 'Processor', | ||
| 6 | + status: 'Status', | ||
| 7 | + processTime: 'Process Time', | ||
| 8 | + timeConsuming: 'Time Consuming', | ||
| 9 | + opinion: 'Opinion' | ||
| 10 | + } | ||
| 11 | + }, | ||
| 12 | + zh: { | ||
| 13 | + contractDetailFlow: { | ||
| 14 | + serialNumber: '序号', | ||
| 15 | + processor: '处理人', | ||
| 16 | + status: '状态', | ||
| 17 | + processTime: '处理时间', | ||
| 18 | + timeConsuming: '耗时', | ||
| 19 | + opinion: '意见' | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
src/views/contract/contractDetailHisFeeLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailHisFee: { | ||
| 4 | + feeItem: 'Fee Item', | ||
| 5 | + payer: 'Payer', | ||
| 6 | + cycle: 'Cycle(month)', | ||
| 7 | + receivableAmount: 'Receivable/Received(¥)', | ||
| 8 | + paymentMethod: 'Payment Method', | ||
| 9 | + paymentPeriod: 'Payment Period', | ||
| 10 | + paymentTime: 'Payment Time', | ||
| 11 | + cashier: 'Cashier', | ||
| 12 | + status: 'Status', | ||
| 13 | + remark: 'Remark', | ||
| 14 | + operation: 'Operation', | ||
| 15 | + detail: 'Detail', | ||
| 16 | + accountDeduction: 'Account Deduction' | ||
| 17 | + } | ||
| 18 | + }, | ||
| 19 | + zh: { | ||
| 20 | + contractDetailHisFee: { | ||
| 21 | + feeItem: '费用项', | ||
| 22 | + payer: '收费对象', | ||
| 23 | + cycle: '周期(单位:月)', | ||
| 24 | + receivableAmount: '应收/实收(单位:元)', | ||
| 25 | + paymentMethod: '缴费方式', | ||
| 26 | + paymentPeriod: '缴费起始段', | ||
| 27 | + paymentTime: '缴费时间', | ||
| 28 | + cashier: '收银员', | ||
| 29 | + status: '状态', | ||
| 30 | + remark: '备注', | ||
| 31 | + operation: '操作', | ||
| 32 | + detail: '详情', | ||
| 33 | + accountDeduction: '账户扣款' | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | +} | ||
| 0 | \ No newline at end of file | 37 | \ No newline at end of file |
src/views/contract/contractDetailHisRoomFeeLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailHisRoomFee: { | ||
| 4 | + feeItem: 'Fee Item', | ||
| 5 | + payerObject: 'Payer Object', | ||
| 6 | + cycle: 'Cycle (unit: month)', | ||
| 7 | + receivableAmount: 'Receivable/Received (unit: yuan)', | ||
| 8 | + paymentMethod: 'Payment Method', | ||
| 9 | + paymentPeriod: 'Payment Period', | ||
| 10 | + paymentTime: 'Payment Time', | ||
| 11 | + cashier: 'Cashier', | ||
| 12 | + status: 'Status', | ||
| 13 | + remark: 'Remark', | ||
| 14 | + operation: 'Operation', | ||
| 15 | + detail: 'Detail', | ||
| 16 | + accountDeduction: 'Account Deduction' | ||
| 17 | + } | ||
| 18 | + }, | ||
| 19 | + zh: { | ||
| 20 | + contractDetailHisRoomFee: { | ||
| 21 | + feeItem: '费用项', | ||
| 22 | + payerObject: '收费对象', | ||
| 23 | + cycle: '周期(单位:月)', | ||
| 24 | + receivableAmount: '应收/实收(单位:元)', | ||
| 25 | + paymentMethod: '缴费方式', | ||
| 26 | + paymentPeriod: '缴费起始段', | ||
| 27 | + paymentTime: '缴费时间', | ||
| 28 | + cashier: '收银员', | ||
| 29 | + status: '状态', | ||
| 30 | + remark: '备注', | ||
| 31 | + operation: '操作', | ||
| 32 | + detail: '详情', | ||
| 33 | + accountDeduction: '账户扣款' | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | +} | ||
| 0 | \ No newline at end of file | 37 | \ No newline at end of file |
src/views/contract/contractDetailLang.js
0 → 100644
| 1 | + | ||
| 2 | +export const messages = { | ||
| 3 | + en: { | ||
| 4 | + contractDetail: { | ||
| 5 | + title: 'Contract Information', | ||
| 6 | + contractName: 'Contract Name', | ||
| 7 | + contractCode: 'Contract Code', | ||
| 8 | + contractType: 'Contract Type', | ||
| 9 | + partyA: 'Party A', | ||
| 10 | + partyB: 'Party B', | ||
| 11 | + aContacts: 'Party A Contact', | ||
| 12 | + bContacts: 'Party B Contact', | ||
| 13 | + aLink: 'Party A Phone', | ||
| 14 | + bLink: 'Party B Phone', | ||
| 15 | + operator: 'Operator', | ||
| 16 | + operatorLink: 'Operator Phone', | ||
| 17 | + amount: 'Contract Amount', | ||
| 18 | + startTime: 'Start Time', | ||
| 19 | + endTime: 'End Time', | ||
| 20 | + signingTime: 'Signing Time', | ||
| 21 | + status: 'Status', | ||
| 22 | + parentContract: 'Parent Contract', | ||
| 23 | + room: 'Rooms', | ||
| 24 | + file: 'Attachments', | ||
| 25 | + fee: 'Contract Fees', | ||
| 26 | + hisFee: 'Payment History', | ||
| 27 | + roomFee: 'Room Fees', | ||
| 28 | + hisRoomFee: 'Room Payment History', | ||
| 29 | + ownerInfo: 'Owner Information', | ||
| 30 | + changeLog: 'Change Log', | ||
| 31 | + draftApproval: 'Draft Approval', | ||
| 32 | + subContract: 'Sub Contracts', | ||
| 33 | + receipt: 'Receipt Reprint' | ||
| 34 | + }, | ||
| 35 | + contractDetailRoom: { | ||
| 36 | + addPropertyChange: 'Property Change', | ||
| 37 | + room: 'Room', | ||
| 38 | + floor: 'Floor', | ||
| 39 | + type: 'Type', | ||
| 40 | + area: 'Area', | ||
| 41 | + rent: 'Rent', | ||
| 42 | + roomStatus: 'Room Status', | ||
| 43 | + operation: 'Operation', | ||
| 44 | + businessAcceptance: 'Business Acceptance', | ||
| 45 | + contractArea: 'Contract Area', | ||
| 46 | + searchPlaceholder: 'Please enter room number like 1-1-1' | ||
| 47 | + }, | ||
| 48 | + contractDetailFile: { | ||
| 49 | + relatedFiles: 'Related Files' | ||
| 50 | + }, | ||
| 51 | + contractDetailFee: { | ||
| 52 | + feeItem: 'Fee Item', | ||
| 53 | + feeFlag: 'Fee Flag', | ||
| 54 | + feeType: 'Fee Type', | ||
| 55 | + receivableAmount: 'Receivable Amount', | ||
| 56 | + accountingTime: 'Accounting Time', | ||
| 57 | + receivablePeriod: 'Receivable Period', | ||
| 58 | + description: 'Description', | ||
| 59 | + status: 'Status', | ||
| 60 | + operation: 'Operation', | ||
| 61 | + temporaryFee: 'Temporary Fee', | ||
| 62 | + createFee: 'Create Fee', | ||
| 63 | + payArrears: 'Pay Arrears', | ||
| 64 | + payment: 'Payment', | ||
| 65 | + paymentHistory: 'Payment History', | ||
| 66 | + cancel: 'Cancel', | ||
| 67 | + end: 'End', | ||
| 68 | + change: 'Change', | ||
| 69 | + previousReading: 'Previous Reading', | ||
| 70 | + currentReading: 'Current Reading', | ||
| 71 | + unitPrice: 'Unit Price', | ||
| 72 | + surcharge: 'Surcharge', | ||
| 73 | + usage: 'Usage', | ||
| 74 | + algorithm: 'Algorithm', | ||
| 75 | + fixedFee: 'Fixed Fee', | ||
| 76 | + feeBasedOnActual: 'Fee based on actual situation', | ||
| 77 | + note1: 'Note: "-" means not yet receivable or fee has ended', | ||
| 78 | + note2: 'Receivable amount -1 usually means formula error', | ||
| 79 | + arrearsSubtotal: 'Arrears Subtotal' | ||
| 80 | + }, | ||
| 81 | + contractDetailHisFee: { | ||
| 82 | + feeItem: 'Fee Item', | ||
| 83 | + payer: 'Payer', | ||
| 84 | + cycle: 'Cycle(month)', | ||
| 85 | + receivableAmount: 'Receivable/Received(¥)', | ||
| 86 | + paymentMethod: 'Payment Method', | ||
| 87 | + paymentPeriod: 'Payment Period', | ||
| 88 | + paymentTime: 'Payment Time', | ||
| 89 | + cashier: 'Cashier', | ||
| 90 | + status: 'Status', | ||
| 91 | + remark: 'Remark', | ||
| 92 | + operation: 'Operation', | ||
| 93 | + detail: 'Detail', | ||
| 94 | + accountDeduction: 'Account Deduction' | ||
| 95 | + }, | ||
| 96 | + contractDetailHisRoomFee: { | ||
| 97 | + feeItem: 'Fee Item', | ||
| 98 | + payerObject: 'Payer Object', | ||
| 99 | + cycle: 'Cycle (unit: month)', | ||
| 100 | + receivableAmount: 'Receivable/Received (unit: yuan)', | ||
| 101 | + paymentMethod: 'Payment Method', | ||
| 102 | + paymentPeriod: 'Payment Period', | ||
| 103 | + paymentTime: 'Payment Time', | ||
| 104 | + cashier: 'Cashier', | ||
| 105 | + status: 'Status', | ||
| 106 | + remark: 'Remark', | ||
| 107 | + operation: 'Operation', | ||
| 108 | + detail: 'Detail', | ||
| 109 | + accountDeduction: 'Account Deduction' | ||
| 110 | + }, | ||
| 111 | + | ||
| 112 | + contractDetailFlow: { | ||
| 113 | + serialNumber: 'Serial Number', | ||
| 114 | + processor: 'Processor', | ||
| 115 | + status: 'Status', | ||
| 116 | + processTime: 'Process Time', | ||
| 117 | + timeConsuming: 'Time Consuming', | ||
| 118 | + opinion: 'Opinion' | ||
| 119 | + }, | ||
| 120 | + contractDetailSub: { | ||
| 121 | + contractName: 'Contract Name', | ||
| 122 | + contractCode: 'Contract Code', | ||
| 123 | + parentContractCode: 'Parent Contract Code', | ||
| 124 | + contractType: 'Contract Type', | ||
| 125 | + operator: 'Operator', | ||
| 126 | + contractAmount: 'Contract Amount', | ||
| 127 | + contractPartyB: 'Contract Party B', | ||
| 128 | + validityPeriod: 'Validity Period', | ||
| 129 | + draftTime: 'Draft Time', | ||
| 130 | + status: 'Status', | ||
| 131 | + operation: 'Operation', | ||
| 132 | + view: 'View' | ||
| 133 | + }, | ||
| 134 | + contractDetailOwner: { | ||
| 135 | + ownerFace: 'Owner Face', | ||
| 136 | + name: 'Name', | ||
| 137 | + sex: 'Sex', | ||
| 138 | + idCard: 'ID Card', | ||
| 139 | + address: 'Address', | ||
| 140 | + roomCount: 'Room Count', | ||
| 141 | + memberCount: 'Member Count', | ||
| 142 | + carCount: 'Car Count', | ||
| 143 | + complaintCount: 'Complaint', | ||
| 144 | + repairCount: 'Repair', | ||
| 145 | + oweFee: 'Owe Fee', | ||
| 146 | + contractCount: 'Contract' | ||
| 147 | + }, | ||
| 148 | + contractDetailReceipt: { | ||
| 149 | + feeType: 'Fee Type', | ||
| 150 | + owner: 'Owner', | ||
| 151 | + feeItem: 'Fee Item', | ||
| 152 | + feePeriod: 'Fee Period', | ||
| 153 | + totalAmount: 'Total Amount', | ||
| 154 | + payTime: 'Pay Time', | ||
| 155 | + receiptId: 'Receipt ID', | ||
| 156 | + print: 'Print', | ||
| 157 | + printSmall: 'Print Small', | ||
| 158 | + printApply: 'Apply', | ||
| 159 | + selectPrintReceipt: 'Please select receipt to print', | ||
| 160 | + selectPrint: 'Please select' | ||
| 161 | + }, | ||
| 162 | + }, | ||
| 163 | + zh: { | ||
| 164 | + contractDetail: { | ||
| 165 | + title: '合同信息', | ||
| 166 | + contractName: '合同名称', | ||
| 167 | + contractCode: '合同编号', | ||
| 168 | + contractType: '合同类型', | ||
| 169 | + partyA: '甲方', | ||
| 170 | + partyB: '乙方', | ||
| 171 | + aContacts: '甲方联系人', | ||
| 172 | + bContacts: '乙方联系人', | ||
| 173 | + aLink: '甲方联系电话', | ||
| 174 | + bLink: '乙方联系电话', | ||
| 175 | + operator: '经办人', | ||
| 176 | + operatorLink: '联系电话', | ||
| 177 | + amount: '合同金额', | ||
| 178 | + startTime: '开始时间', | ||
| 179 | + endTime: '结束时间', | ||
| 180 | + signingTime: '签订时间', | ||
| 181 | + status: '状态', | ||
| 182 | + parentContract: '父合同', | ||
| 183 | + room: '房屋', | ||
| 184 | + file: '附件', | ||
| 185 | + fee: '合同费用', | ||
| 186 | + hisFee: '合同缴费记录', | ||
| 187 | + roomFee: '房屋费用', | ||
| 188 | + hisRoomFee: '房屋缴费记录', | ||
| 189 | + ownerInfo: '业主信息', | ||
| 190 | + changeLog: '变更记录', | ||
| 191 | + draftApproval: '起草审批', | ||
| 192 | + subContract: '子合同', | ||
| 193 | + receipt: '补打收据' | ||
| 194 | + }, | ||
| 195 | + contractDetailRoom: { | ||
| 196 | + addPropertyChange: '房产变更', | ||
| 197 | + room: '房屋', | ||
| 198 | + floor: '楼层', | ||
| 199 | + type: '类型', | ||
| 200 | + area: '面积', | ||
| 201 | + rent: '租金', | ||
| 202 | + roomStatus: '房屋状态', | ||
| 203 | + operation: '操作', | ||
| 204 | + businessAcceptance: '业务受理', | ||
| 205 | + contractArea: '合同面积', | ||
| 206 | + searchPlaceholder: '请输入房屋编号 楼栋-单元-房屋 如1-1-1' | ||
| 207 | + }, | ||
| 208 | + contractDetailFile: { | ||
| 209 | + relatedFiles: '相关附件' | ||
| 210 | + }, | ||
| 211 | + contractDetailFee: { | ||
| 212 | + feeItem: '费用项目', | ||
| 213 | + feeFlag: '费用标识', | ||
| 214 | + feeType: '费用类型', | ||
| 215 | + receivableAmount: '应收金额', | ||
| 216 | + accountingTime: '建账时间', | ||
| 217 | + receivablePeriod: '应收时间段', | ||
| 218 | + description: '说明', | ||
| 219 | + status: '状态', | ||
| 220 | + operation: '操作', | ||
| 221 | + temporaryFee: '临时收费', | ||
| 222 | + createFee: '创建费用', | ||
| 223 | + payArrears: '欠费缴费', | ||
| 224 | + payment: '缴费', | ||
| 225 | + paymentHistory: '缴费历史', | ||
| 226 | + cancel: '取消', | ||
| 227 | + end: '结束', | ||
| 228 | + change: '变更', | ||
| 229 | + previousReading: '上期度数', | ||
| 230 | + currentReading: '本期度数', | ||
| 231 | + unitPrice: '单价', | ||
| 232 | + surcharge: '附加费', | ||
| 233 | + usage: '用量', | ||
| 234 | + algorithm: '算法', | ||
| 235 | + fixedFee: '固定费', | ||
| 236 | + feeBasedOnActual: '费用根据实际情况而定', | ||
| 237 | + note1: '注意:应收结束时间 "-" 表示未到应收时间或收费已结束', | ||
| 238 | + note2: '应收金额为-1一般为费用项公式设置出错请检查', | ||
| 239 | + arrearsSubtotal: '欠费小计' | ||
| 240 | + }, | ||
| 241 | + contractDetailHisFee: { | ||
| 242 | + feeItem: '费用项', | ||
| 243 | + payer: '收费对象', | ||
| 244 | + cycle: '周期(单位:月)', | ||
| 245 | + receivableAmount: '应收/实收(单位:元)', | ||
| 246 | + paymentMethod: '缴费方式', | ||
| 247 | + paymentPeriod: '缴费起始段', | ||
| 248 | + paymentTime: '缴费时间', | ||
| 249 | + cashier: '收银员', | ||
| 250 | + status: '状态', | ||
| 251 | + remark: '备注', | ||
| 252 | + operation: '操作', | ||
| 253 | + detail: '详情', | ||
| 254 | + accountDeduction: '账户扣款' | ||
| 255 | + }, | ||
| 256 | + contractDetailHisRoomFee: { | ||
| 257 | + feeItem: '费用项', | ||
| 258 | + payerObject: '收费对象', | ||
| 259 | + cycle: '周期(单位:月)', | ||
| 260 | + receivableAmount: '应收/实收(单位:元)', | ||
| 261 | + paymentMethod: '缴费方式', | ||
| 262 | + paymentPeriod: '缴费起始段', | ||
| 263 | + paymentTime: '缴费时间', | ||
| 264 | + cashier: '收银员', | ||
| 265 | + status: '状态', | ||
| 266 | + remark: '备注', | ||
| 267 | + operation: '操作', | ||
| 268 | + detail: '详情', | ||
| 269 | + accountDeduction: '账户扣款' | ||
| 270 | + }, | ||
| 271 | + | ||
| 272 | + contractDetailFlow: { | ||
| 273 | + serialNumber: '序号', | ||
| 274 | + processor: '处理人', | ||
| 275 | + status: '状态', | ||
| 276 | + processTime: '处理时间', | ||
| 277 | + timeConsuming: '耗时', | ||
| 278 | + opinion: '意见' | ||
| 279 | + }, | ||
| 280 | + contractDetailSub: { | ||
| 281 | + contractName: '合同名称', | ||
| 282 | + contractCode: '合同编号', | ||
| 283 | + parentContractCode: '父合同编号', | ||
| 284 | + contractType: '合同类型', | ||
| 285 | + operator: '经办人', | ||
| 286 | + contractAmount: '合同金额', | ||
| 287 | + contractPartyB: '合同乙方', | ||
| 288 | + validityPeriod: '有效期', | ||
| 289 | + draftTime: '起草时间', | ||
| 290 | + status: '状态', | ||
| 291 | + operation: '操作', | ||
| 292 | + view: '查看' | ||
| 293 | + }, | ||
| 294 | + contractDetailOwner: { | ||
| 295 | + ownerFace: '业主人脸', | ||
| 296 | + name: '姓名', | ||
| 297 | + sex: '性别', | ||
| 298 | + idCard: '身份证', | ||
| 299 | + address: '家庭住址', | ||
| 300 | + roomCount: '房屋数', | ||
| 301 | + memberCount: '业主成员', | ||
| 302 | + carCount: '车辆数', | ||
| 303 | + complaintCount: '投诉', | ||
| 304 | + repairCount: '报修', | ||
| 305 | + oweFee: '欠费', | ||
| 306 | + contractCount: '业主合同' | ||
| 307 | + }, | ||
| 308 | + contractDetailReceipt: { | ||
| 309 | + feeType: '费用类型', | ||
| 310 | + owner: '业主', | ||
| 311 | + feeItem: '费用项目', | ||
| 312 | + feePeriod: '收费时间段', | ||
| 313 | + totalAmount: '总金额', | ||
| 314 | + payTime: '缴费时间', | ||
| 315 | + receiptId: '收据ID', | ||
| 316 | + print: '打印', | ||
| 317 | + printSmall: '打印小票', | ||
| 318 | + printApply: '申请单', | ||
| 319 | + selectPrintReceipt: '请选择打印收据', | ||
| 320 | + selectPrint: '请选择' | ||
| 321 | + }, | ||
| 322 | + } | ||
| 323 | +} | ||
| 0 | \ No newline at end of file | 324 | \ No newline at end of file |
src/views/contract/contractDetailOwnerLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailOwner: { | ||
| 4 | + ownerFace: 'Owner Face', | ||
| 5 | + name: 'Name', | ||
| 6 | + sex: 'Sex', | ||
| 7 | + idCard: 'ID Card', | ||
| 8 | + address: 'Address', | ||
| 9 | + roomCount: 'Room Count', | ||
| 10 | + memberCount: 'Member Count', | ||
| 11 | + carCount: 'Car Count', | ||
| 12 | + complaintCount: 'Complaint', | ||
| 13 | + repairCount: 'Repair', | ||
| 14 | + oweFee: 'Owe Fee', | ||
| 15 | + contractCount: 'Contract' | ||
| 16 | + } | ||
| 17 | + }, | ||
| 18 | + zh: { | ||
| 19 | + contractDetailOwner: { | ||
| 20 | + ownerFace: '业主人脸', | ||
| 21 | + name: '姓名', | ||
| 22 | + sex: '性别', | ||
| 23 | + idCard: '身份证', | ||
| 24 | + address: '家庭住址', | ||
| 25 | + roomCount: '房屋数', | ||
| 26 | + memberCount: '业主成员', | ||
| 27 | + carCount: '车辆数', | ||
| 28 | + complaintCount: '投诉', | ||
| 29 | + repairCount: '报修', | ||
| 30 | + oweFee: '欠费', | ||
| 31 | + contractCount: '业主合同' | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | +} | ||
| 0 | \ No newline at end of file | 35 | \ No newline at end of file |
src/views/contract/contractDetailReceiptLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailReceipt: { | ||
| 4 | + feeType: 'Fee Type', | ||
| 5 | + owner: 'Owner', | ||
| 6 | + feeItem: 'Fee Item', | ||
| 7 | + feePeriod: 'Fee Period', | ||
| 8 | + totalAmount: 'Total Amount', | ||
| 9 | + payTime: 'Pay Time', | ||
| 10 | + receiptId: 'Receipt ID', | ||
| 11 | + print: 'Print', | ||
| 12 | + printSmall: 'Print Small', | ||
| 13 | + printApply: 'Apply', | ||
| 14 | + selectPrintReceipt: 'Please select receipt to print', | ||
| 15 | + selectPrint: 'Please select' | ||
| 16 | + } | ||
| 17 | + }, | ||
| 18 | + zh: { | ||
| 19 | + contractDetailReceipt: { | ||
| 20 | + feeType: '费用类型', | ||
| 21 | + owner: '业主', | ||
| 22 | + feeItem: '费用项目', | ||
| 23 | + feePeriod: '收费时间段', | ||
| 24 | + totalAmount: '总金额', | ||
| 25 | + payTime: '缴费时间', | ||
| 26 | + receiptId: '收据ID', | ||
| 27 | + print: '打印', | ||
| 28 | + printSmall: '打印小票', | ||
| 29 | + printApply: '申请单', | ||
| 30 | + selectPrintReceipt: '请选择打印收据', | ||
| 31 | + selectPrint: '请选择' | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | +} | ||
| 0 | \ No newline at end of file | 35 | \ No newline at end of file |
src/views/contract/contractDetailRoomLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailRoom: { | ||
| 4 | + addPropertyChange: 'Property Change', | ||
| 5 | + room: 'Room', | ||
| 6 | + floor: 'Floor', | ||
| 7 | + type: 'Type', | ||
| 8 | + area: 'Area', | ||
| 9 | + rent: 'Rent', | ||
| 10 | + roomStatus: 'Room Status', | ||
| 11 | + operation: 'Operation', | ||
| 12 | + businessAcceptance: 'Business Acceptance', | ||
| 13 | + contractArea: 'Contract Area', | ||
| 14 | + searchPlaceholder: 'Please enter room number like 1-1-1' | ||
| 15 | + } | ||
| 16 | + }, | ||
| 17 | + zh: { | ||
| 18 | + contractDetailRoom: { | ||
| 19 | + addPropertyChange: '房产变更', | ||
| 20 | + room: '房屋', | ||
| 21 | + floor: '楼层', | ||
| 22 | + type: '类型', | ||
| 23 | + area: '面积', | ||
| 24 | + rent: '租金', | ||
| 25 | + roomStatus: '房屋状态', | ||
| 26 | + operation: '操作', | ||
| 27 | + businessAcceptance: '业务受理', | ||
| 28 | + contractArea: '合同面积', | ||
| 29 | + searchPlaceholder: '请输入房屋编号 楼栋-单元-房屋 如1-1-1' | ||
| 30 | + } | ||
| 31 | + } | ||
| 32 | +} | ||
| 0 | \ No newline at end of file | 33 | \ No newline at end of file |
src/views/contract/contractDetailSubLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + contractDetailSub: { | ||
| 4 | + contractName: 'Contract Name', | ||
| 5 | + contractCode: 'Contract Code', | ||
| 6 | + parentContractCode: 'Parent Contract Code', | ||
| 7 | + contractType: 'Contract Type', | ||
| 8 | + operator: 'Operator', | ||
| 9 | + contractAmount: 'Contract Amount', | ||
| 10 | + contractPartyB: 'Contract Party B', | ||
| 11 | + validityPeriod: 'Validity Period', | ||
| 12 | + draftTime: 'Draft Time', | ||
| 13 | + status: 'Status', | ||
| 14 | + operation: 'Operation', | ||
| 15 | + view: 'View' | ||
| 16 | + } | ||
| 17 | + }, | ||
| 18 | + zh: { | ||
| 19 | + contractDetailSub: { | ||
| 20 | + contractName: '合同名称', | ||
| 21 | + contractCode: '合同编号', | ||
| 22 | + parentContractCode: '父合同编号', | ||
| 23 | + contractType: '合同类型', | ||
| 24 | + operator: '经办人', | ||
| 25 | + contractAmount: '合同金额', | ||
| 26 | + contractPartyB: '合同乙方', | ||
| 27 | + validityPeriod: '有效期', | ||
| 28 | + draftTime: '起草时间', | ||
| 29 | + status: '状态', | ||
| 30 | + operation: '操作', | ||
| 31 | + view: '查看' | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | +} | ||
| 0 | \ No newline at end of file | 35 | \ No newline at end of file |
src/views/contract/contractManageList.vue
| @@ -230,7 +230,7 @@ export default { | @@ -230,7 +230,7 @@ export default { | ||
| 230 | }, | 230 | }, |
| 231 | viewContract(contract) { | 231 | viewContract(contract) { |
| 232 | this.$router.push({ | 232 | this.$router.push({ |
| 233 | - path: '/contract/contractDetail', | 233 | + path: '/views/contract/contractDetail', |
| 234 | query: { | 234 | query: { |
| 235 | contractId: contract.contractId | 235 | contractId: contract.contractId |
| 236 | } | 236 | } |
src/views/owner/ownerDetail.vue
| @@ -147,7 +147,7 @@ | @@ -147,7 +147,7 @@ | ||
| 147 | <edit-owner ref="editOwner" @refresh="loadOwnerInfo"></edit-owner> | 147 | <edit-owner ref="editOwner" @refresh="loadOwnerInfo"></edit-owner> |
| 148 | <delete-fee ref="deleteFee"></delete-fee> | 148 | <delete-fee ref="deleteFee"></delete-fee> |
| 149 | <edit-fee ref="editFee"></edit-fee> | 149 | <edit-fee ref="editFee"></edit-fee> |
| 150 | - <finish-fee ref="finishFee"></finish-fee> | 150 | + <!-- <finish-fee ref="finishFee"></finish-fee> --> |
| 151 | </div> | 151 | </div> |
| 152 | </template> | 152 | </template> |
| 153 | 153 | ||
| @@ -260,7 +260,8 @@ export default { | @@ -260,7 +260,8 @@ export default { | ||
| 260 | queryOwners(params).then(response => { | 260 | queryOwners(params).then(response => { |
| 261 | const data = response.data[0] | 261 | const data = response.data[0] |
| 262 | Object.assign(this.ownerDetailInfo, data) | 262 | Object.assign(this.ownerDetailInfo, data) |
| 263 | - this.ownerDetailInfo.ownerAttrDtos = response.owners[0].ownerAttrDtos | 263 | + this.ownerDetailInfo.ownerAttrDtos = data.ownerAttrDtos |
| 264 | + this.changeTab(this.ownerDetailInfo._currentTab) | ||
| 264 | }).catch(error => { | 265 | }).catch(error => { |
| 265 | console.error('Failed to load owner info:', error) | 266 | console.error('Failed to load owner info:', error) |
| 266 | }) | 267 | }) |