Commit fc9bd1db403ef1a693f8f03b3d2a7954d50bddd4

Authored by wuxw
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
  1 +import request from '@/utils/request'
  2 +
  3 +export function listFee(params) {
  4 + return request({
  5 + url: '/fee.listFee',
  6 + method: 'get',
  7 + params
  8 + })
  9 +}
0 \ No newline at end of file 10 \ No newline at end of file
src/api/contract/contractDetailFileApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function queryContractFile(params) {
  4 + return request({
  5 + url: '/contractFile/queryContractFile',
  6 + method: 'get',
  7 + params
  8 + })
  9 +}
0 \ No newline at end of file 10 \ No newline at end of file
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
  1 +import request from '@/utils/request'
  2 +
  3 +export function queryFeeDetail(params) {
  4 + return request({
  5 + url: '/fee.queryFeeDetail',
  6 + method: 'get',
  7 + params
  8 + })
  9 +}
0 \ No newline at end of file 10 \ No newline at end of file
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 &#39;../views/contract/contractMa @@ -8,6 +8,7 @@ import { messages as contractManageMessages } from &#39;../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
  1 +export const messages = {
  2 + en: {
  3 + contractDetailFile: {
  4 + relatedFiles: 'Related Files'
  5 + }
  6 + },
  7 + zh: {
  8 + contractDetailFile: {
  9 + relatedFiles: '相关附件'
  10 + }
  11 + }
  12 +}
0 \ No newline at end of file 13 \ No newline at end of file
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 })