Commit 6d21390a0dec5a4f321adcbc66db2ff3495217a9

Authored by wuxw
1 parent 5f798b88

开发车辆详情页面

Showing 58 changed files with 2785 additions and 21 deletions
src/api/car/addCarModalApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +export function saveOwnerCarMember(data) {
  3 + return request({
  4 + url: '/owner.saveOwnerCarMember',
  5 + method: 'post',
  6 + data
  7 + })
  8 +}
0 \ No newline at end of file 9 \ No newline at end of file
src/api/car/carDetailApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// Get owner car detail
  4 +export function getOwnerCarDetail(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/owner.queryOwnerCars',
  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 || 'Failed to get owner car detail'))
  16 + }
  17 + }).catch(error => {
  18 + reject(error)
  19 + })
  20 + })
  21 +}
  22 +
  23 +// Update car information
  24 +export function updateCarInfo(data) {
  25 + return new Promise((resolve, reject) => {
  26 + request({
  27 + url: '/car.updateCarInfo',
  28 + method: 'post',
  29 + data
  30 + }).then(response => {
  31 + const res = response.data
  32 + if (res.code === 0) {
  33 + resolve(res)
  34 + } else {
  35 + reject(new Error(res.msg || 'Failed to update car information'))
  36 + }
  37 + }).catch(error => {
  38 + reject(error)
  39 + })
  40 + })
  41 +}
  42 +
  43 +// Get car fee list
  44 +export function getCarFeeList(params) {
  45 + return new Promise((resolve, reject) => {
  46 + request({
  47 + url: '/fee.queryCarFee',
  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 || 'Failed to get car fee list'))
  56 + }
  57 + }).catch(error => {
  58 + reject(error)
  59 + })
  60 + })
  61 +}
  62 +
  63 +// Get car payment history
  64 +export function getCarPaymentHistory(params) {
  65 + return new Promise((resolve, reject) => {
  66 + request({
  67 + url: '/fee.queryCarPaymentHistory',
  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 || 'Failed to get car payment history'))
  76 + }
  77 + }).catch(error => {
  78 + reject(error)
  79 + })
  80 + })
  81 +}
0 \ No newline at end of file 82 \ No newline at end of file
src/api/car/carDetailApplyParkingSpaceApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function listParkingSpaceApply(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/parkingSpaceApply.listParkingSpaceApply',
  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/car/carDetailCarInoutApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function getCarInoutDetail(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/iot.getOpenApi',
  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/car/carDetailCouponApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function listParkingCouponCar(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/iot.getOpenApi',
  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/car/carDetailCouponOrderApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function listParkingCouponCarOrder(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/iot.getOpenApi',
  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/car/carDetailFeeApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function listFee(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/fee.listFee',
  7 + method: 'get',
  8 + params
  9 + }).then(response => {
  10 + const res = response.data
  11 + resolve(res)
  12 +
  13 + }).catch(error => {
  14 + reject(error)
  15 + })
  16 + })
  17 +}
0 \ No newline at end of file 18 \ No newline at end of file
src/api/car/carDetailTransactionCarApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function getMachineTranslates(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/machineTranslate.listMachineTranslates',
  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/property/deleteParkingSpaceApplyApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function deleteParkingSpaceApply(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/parkingSpaceApply.deleteParkingSpaceApply',
  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/property/editMachineTranslateApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function resyncMachineTranslate(data) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/machineTranslate.resyncMachineTranslate',
  7 + method: 'post',
  8 + data
  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/property/editParkingSpaceApplyApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function updateParkingSpaceApply(data) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/parkingSpaceApply.updateParkingSpaceApply',
  7 + method: 'post',
  8 + data
  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/components/car/addCarModal.vue 0 → 100644
  1 +<template>
  2 + <el-dialog :title="$t('addCarModal.addCar')" :visible.sync="visible" width="50%">
  3 + <el-form :model="addCarModelInfo" :rules="rules" ref="addCarForm">
  4 + <el-form-item :label="$t('addCarModal.licensePlate')" prop="carNum">
  5 + <el-input v-model="addCarModelInfo.carNum" :placeholder="$t('addCarModal.licensePlateRequired')"></el-input>
  6 + </el-form-item>
  7 + <el-form-item :label="$t('addCarModal.carBrand')" prop="carBrand">
  8 + <el-input v-model="addCarModelInfo.carBrand" :placeholder="$t('addCarModal.carBrandRequired')"></el-input>
  9 + </el-form-item>
  10 + <el-form-item :label="$t('addCarModal.carType')" prop="carType">
  11 + <el-select v-model="addCarModelInfo.carType" :placeholder="$t('addCarModal.carTypeRequired')"
  12 + style="width:100%">
  13 + <el-option v-for="carType in carTypes" :key="carType.statusCd" :label="carType.name"
  14 + :value="carType.statusCd"></el-option>
  15 + </el-select>
  16 + </el-form-item>
  17 + <el-form-item :label="$t('addCarModal.color')" prop="carColor">
  18 + <el-input v-model="addCarModelInfo.carColor" :placeholder="$t('addCarModal.colorRequired')"></el-input>
  19 + </el-form-item>
  20 + <el-form-item :label="$t('addCarModal.remark')">
  21 + <el-input type="textarea" v-model="addCarModelInfo.remark" :placeholder="$t('addCarModal.remarkPlaceholder')"
  22 + rows="3"></el-input>
  23 + </el-form-item>
  24 + </el-form>
  25 + <div slot="footer" class="dialog-footer">
  26 + <el-button @click="visible = false">{{ $t('common.cancel') }}</el-button>
  27 + <el-button type="primary" @click="saveAddCarInfo">{{ $t('common.save') }}</el-button>
  28 + </div>
  29 + </el-dialog>
  30 +</template>
  31 +
  32 +<script>
  33 +import { saveOwnerCarMember } from '@/api/car/addCarModalApi'
  34 +import { getDict } from '@/api/community/communityApi'
  35 +import { getCommunityId } from '@/api/community/communityApi'
  36 +
  37 +export default {
  38 + name: 'AddCarModal',
  39 + data() {
  40 + return {
  41 + visible: false,
  42 + addCarModelInfo: {
  43 + flowComponent: 'addCar',
  44 + carNum: '',
  45 + carBrand: '',
  46 + carType: '',
  47 + carColor: '',
  48 + remark: "",
  49 + carId: ''
  50 + },
  51 + carTypes: [],
  52 + rules: {
  53 + carNum: [
  54 + { required: true, message: this.$t('addCarModal.licensePlateRequired'), trigger: 'blur' },
  55 + { min: 2, max: 12, message: this.$t('addCarModal.licensePlateInvalid'), trigger: 'blur' }
  56 + ],
  57 + carBrand: [
  58 + { required: true, message: this.$t('addCarModal.carBrandRequired'), trigger: 'blur' },
  59 + { max: 50, message: this.$t('addCarModal.carBrandTooLong'), trigger: 'blur' }
  60 + ],
  61 + carType: [
  62 + { required: true, message: this.$t('addCarModal.carTypeRequired'), trigger: 'change' }
  63 + ],
  64 + carColor: [
  65 + { required: true, message: this.$t('addCarModal.colorRequired'), trigger: 'blur' },
  66 + { max: 12, message: this.$t('addCarModal.colorTooLong'), trigger: 'blur' }
  67 + ]
  68 + }
  69 + }
  70 + },
  71 + created() {
  72 + this.communityId = getCommunityId()
  73 + this.loadCarTypes()
  74 + },
  75 + methods: {
  76 + async loadCarTypes() {
  77 + try {
  78 + const data = await getDict('owner_car', 'car_type')
  79 + this.carTypes = data
  80 + } catch (error) {
  81 + console.error('获取字典数据失败:', error)
  82 + }
  83 + },
  84 + open(data) {
  85 + this.addCarModelInfo.carId = data.carId
  86 + this.visible = true
  87 + this.$nextTick(() => {
  88 + this.$refs.addCarForm.resetFields()
  89 + })
  90 + },
  91 + saveAddCarInfo() {
  92 + this.$refs.addCarForm.validate(valid => {
  93 + if (valid) {
  94 + this.addCarModelInfo.communityId = this.communityId
  95 + saveOwnerCarMember(this.addCarModelInfo).then(response => {
  96 + if (response.code === 0) {
  97 + this.visible = false
  98 + this.clearAddCarModalInfo()
  99 + this.$emit('notify')
  100 + this.$message.success(this.$t('common.addSuccess'))
  101 + } else {
  102 + this.$message.error(response.msg)
  103 + }
  104 + }).catch(error => {
  105 + console.error('请求失败处理', error)
  106 + this.$message.error(error)
  107 + })
  108 + }
  109 + })
  110 + },
  111 + clearAddCarModalInfo() {
  112 + this.addCarModelInfo = {
  113 + flowComponent: 'addCar',
  114 + carNum: '',
  115 + carBrand: '',
  116 + carType: '',
  117 + carColor: '',
  118 + remark: "",
  119 + carNumType: '',
  120 + carId: ''
  121 + }
  122 + }
  123 + }
  124 +}
  125 +</script>
0 \ No newline at end of file 126 \ No newline at end of file
src/components/car/carDetailApplyParkingSpace.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <el-row>
  4 + <el-col :span="24" class="text-right">
  5 + <el-button type="primary" size="small" @click="_openAddParkingSpaceApplyModal">
  6 + {{$t('carDetailApplyParkingSpace.applyParkingSpace')}}
  7 + </el-button>
  8 + </el-col>
  9 + </el-row>
  10 +
  11 + <div class="margin-top">
  12 + <el-table :data="carDetailApplyParkingSpaceInfo.parkingSpaceApplys" border style="width: 100%">
  13 + <el-table-column prop="applyId" :label="$t('carDetailApplyParkingSpace.applyId')" align="center"></el-table-column>
  14 + <el-table-column prop="carNum" :label="$t('carDetailApplyParkingSpace.carNum')" align="center"></el-table-column>
  15 + <el-table-column :label="$t('carDetailApplyParkingSpace.parkingSpace')" align="center">
  16 + <template slot-scope="scope">
  17 + {{scope.row.psId ? `${scope.row.areaNum}停车场 - ${scope.row.num}停车位` : $t('carDetailApplyParkingSpace.none')}}
  18 + </template>
  19 + </el-table-column>
  20 + <el-table-column prop="carBrand" :label="$t('carDetailApplyParkingSpace.carBrand')" align="center"></el-table-column>
  21 + <el-table-column :label="$t('carDetailApplyParkingSpace.carType')" align="center">
  22 + <template slot-scope="scope">
  23 + {{_getParkingSpaceApplyCatType(scope.row.carType)}}
  24 + </template>
  25 + </el-table-column>
  26 + <el-table-column prop="carColor" :label="$t('carDetailApplyParkingSpace.color')" align="center"></el-table-column>
  27 + <el-table-column prop="startTime" :label="$t('carDetailApplyParkingSpace.startTime')" align="center"></el-table-column>
  28 + <el-table-column prop="endTime" :label="$t('carDetailApplyParkingSpace.endTime')" align="center"></el-table-column>
  29 + <el-table-column prop="applyPersonName" :label="$t('carDetailApplyParkingSpace.applicant')" align="center"></el-table-column>
  30 + <el-table-column prop="applyPersonLink" :label="$t('carDetailApplyParkingSpace.phone')" align="center"></el-table-column>
  31 + <el-table-column :label="$t('carDetailApplyParkingSpace.auditResult')" align="center">
  32 + <template slot-scope="scope">
  33 + <el-tag :type="getStateTagType(scope.row.state)">
  34 + {{_getParkingSpaceApplyState(scope.row.state)}}
  35 + </el-tag>
  36 + </template>
  37 + </el-table-column>
  38 + <el-table-column :label="$t('carDetailApplyParkingSpace.operation')" align="center">
  39 + <template slot-scope="scope">
  40 + <el-button-group>
  41 + <el-button v-if="scope.row.state == '1001'" size="mini" @click="_openAuditParkingSpaceApplyModal(scope.row)">
  42 + {{$t('carDetailApplyParkingSpace.audit')}}
  43 + </el-button>
  44 + <el-button v-if="scope.row.state == '1001'" size="mini" @click="_openEditParkingSpaceApplyModel(scope.row)">
  45 + {{$t('carDetailApplyParkingSpace.edit')}}
  46 + </el-button>
  47 + <el-button size="mini" @click="_openDeleteParkingSpaceApplyModel(scope.row)">
  48 + {{$t('carDetailApplyParkingSpace.delete')}}
  49 + </el-button>
  50 + </el-button-group>
  51 + </template>
  52 + </el-table-column>
  53 + </el-table>
  54 +
  55 + <el-row>
  56 + <el-col :span="16" :offset="8">
  57 + <el-pagination
  58 + @current-change="handleCurrentChange"
  59 + :current-page="currentPage"
  60 + :page-size="pageSize"
  61 + layout="total, prev, pager, next, jumper"
  62 + :total="total">
  63 + </el-pagination>
  64 + </el-col>
  65 + </el-row>
  66 + </div>
  67 +
  68 + <edit-parking-space-apply ref="editParkingSpaceApply"></edit-parking-space-apply>
  69 + <delete-parking-space-apply ref="deleteParkingSpaceApply"></delete-parking-space-apply>
  70 + </div>
  71 +</template>
  72 +
  73 +<script>
  74 +import { listParkingSpaceApply } from '@/api/car/carDetailApplyParkingSpaceApi'
  75 +import EditParkingSpaceApply from '@/components/property/editParkingSpaceApply'
  76 +import DeleteParkingSpaceApply from '@/components/property/deleteParkingSpaceApply'
  77 +
  78 +export default {
  79 + name: 'CarDetailApplyParkingSpace',
  80 + components: {
  81 + EditParkingSpaceApply,
  82 + DeleteParkingSpaceApply
  83 + },
  84 + data() {
  85 + return {
  86 + carDetailApplyParkingSpaceInfo: {
  87 + parkingSpaceApplys: [],
  88 + carId: '',
  89 + carNum: '',
  90 + memberId: ''
  91 + },
  92 + currentPage: 1,
  93 + pageSize: 10,
  94 + total: 0
  95 + }
  96 + },
  97 + methods: {
  98 + switch(data) {
  99 + this.carDetailApplyParkingSpaceInfo.carId = data.carId
  100 + this.carDetailApplyParkingSpaceInfo.carNum = data.carNum
  101 + this.carDetailApplyParkingSpaceInfo.memberId = data.memberId
  102 + this._loadCarDetailApplyParkingSpaceData(this.currentPage, this.pageSize)
  103 + },
  104 + _loadCarDetailApplyParkingSpaceData(page, row) {
  105 + const params = {
  106 + communityId: this.$store.state.community.communityId,
  107 + carNum: this.carDetailApplyParkingSpaceInfo.carNum,
  108 + page,
  109 + row
  110 + }
  111 +
  112 + listParkingSpaceApply(params).then(response => {
  113 + this.carDetailApplyParkingSpaceInfo.parkingSpaceApplys = response.data.data
  114 + this.total = response.data.total
  115 + }).catch(error => {
  116 + console.error('请求失败:', error)
  117 + })
  118 + },
  119 + handleCurrentChange(val) {
  120 + this.currentPage = val
  121 + this._loadCarDetailApplyParkingSpaceData(val, this.pageSize)
  122 + },
  123 + _openAddParkingSpaceApplyModal() {
  124 + this.$router.push('/property/addParkingSpaceApply')
  125 + },
  126 + _openAuditParkingSpaceApplyModal(apply) {
  127 + this.$router.push(`/property/auditParkingSpaceApply?applyId=${apply.applyId}`)
  128 + },
  129 + _openEditParkingSpaceApplyModel(parkingSpaceApply) {
  130 + this.$refs.editParkingSpaceApply.open(parkingSpaceApply)
  131 + },
  132 + _openDeleteParkingSpaceApplyModel(parkingSpaceApply) {
  133 + this.$refs.deleteParkingSpaceApply.open(parkingSpaceApply)
  134 + },
  135 + _getParkingSpaceApplyState(state) {
  136 + const states = {
  137 + '1001': this.$t('carDetailApplyParkingSpace.pendingReview'),
  138 + '2002': this.$t('carDetailApplyParkingSpace.pendingPayment'),
  139 + '3003': this.$t('carDetailApplyParkingSpace.completed'),
  140 + '4004': this.$t('carDetailApplyParkingSpace.auditFailed')
  141 + }
  142 + return states[state] || this.$t('carDetailApplyParkingSpace.abnormalStatus')
  143 + },
  144 + _getParkingSpaceApplyCatType(type) {
  145 + const types = {
  146 + '9901': this.$t('carDetailApplyParkingSpace.familyCar'),
  147 + '9902': this.$t('carDetailApplyParkingSpace.bus'),
  148 + '9903': this.$t('carDetailApplyParkingSpace.truck')
  149 + }
  150 + return types[type] || this.$t('carDetailApplyParkingSpace.abnormalVehicle')
  151 + },
  152 + getStateTagType(state) {
  153 + const types = {
  154 + '1001': 'info',
  155 + '2002': 'warning',
  156 + '3003': 'success',
  157 + '4004': 'danger'
  158 + }
  159 + return types[state] || 'info'
  160 + }
  161 + }
  162 +}
  163 +</script>
0 \ No newline at end of file 164 \ No newline at end of file
src/components/car/carDetailApplyParkingSpaceDemo.vue 0 → 100644
  1 +<template>
  2 + <car-detail-apply-parking-space ref="carDetailApplyParkingSpace"></car-detail-apply-parking-space>
  3 +</template>
  4 +
  5 +<script>
  6 +import CarDetailApplyParkingSpace from '@/components/car/carDetailApplyParkingSpace'
  7 +
  8 +export default {
  9 + components: {
  10 + CarDetailApplyParkingSpace
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.carDetailApplyParkingSpace.switch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/car/carDetailCarInout.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <div class="margin-top">
  4 + <el-table :data="carDetailCarInoutInfo.carIns" border style="width: 100%">
  5 + <el-table-column :label="$t('carDetailCarInout.entryImage')" align="center">
  6 + <template slot-scope="scope">
  7 + <el-image style="width: 60px; height: 60px;" :src="scope.row.photoJpg || '/img/noPhoto.jpg'"
  8 + :preview-src-list="[scope.row.photoJpg]" fit="cover" class="border-radius">
  9 + </el-image>
  10 + </template>
  11 + </el-table-column>
  12 + <el-table-column prop="inoutId" :label="$t('carDetailCarInout.inoutId')" align="center"></el-table-column>
  13 + <el-table-column :label="$t('carDetailCarInout.carStatus')" align="center">
  14 + <template slot-scope="scope">
  15 + {{ scope.row.carInout === '3306' ? $t('carDetailCarInout.entry') :
  16 + $t('carDetailCarInout.exit')}}({{ scope.row.stateName }})
  17 + </template>
  18 + </el-table-column>
  19 + <el-table-column prop="carNum" :label="$t('carDetailCarInout.carNum')" align="center"></el-table-column>
  20 + <el-table-column prop="paNum" :label="$t('carDetailCarInout.parkingLot')" align="center"></el-table-column>
  21 + <el-table-column :label="$t('carDetailCarInout.billingRule')" align="center">
  22 + <template slot-scope="scope">
  23 + <el-link type="primary" @click="_viewTempFeeConfigInOutCar(scope.row.configId)">
  24 + {{ scope.row.feeName }} <i class="el-icon-info"></i>
  25 + </el-link>
  26 + </template>
  27 + </el-table-column>
  28 + <el-table-column prop="carTypeName" :label="$t('carDetailCarInout.carType')" align="center"></el-table-column>
  29 + <el-table-column prop="inTime" :label="$t('carDetailCarInout.entryTime')" align="center"></el-table-column>
  30 + <el-table-column :label="$t('carDetailCarInout.exitTime')" align="center">
  31 + <template slot-scope="scope">
  32 + {{ scope.row.carInout !== '3307' ? '-' : scope.row.outTime }}
  33 + </template>
  34 + </el-table-column>
  35 + <el-table-column :label="$t('carDetailCarInout.parkingTime')" align="center">
  36 + <template slot-scope="scope">
  37 + {{ scope.row.hours }}{{ $t('carDetailCarInout.hour') }}{{ scope.row.min }}{{ $t('carDetailCarInout.minute') }}
  38 + </template>
  39 + </el-table-column>
  40 + <el-table-column :label="$t('carDetailCarInout.chargeAmount')" align="center">
  41 + <template slot-scope="scope">
  42 + {{ scope.row.carType !== 'T' ? '-' : scope.row.payCharge }}
  43 + </template>
  44 + </el-table-column>
  45 + <el-table-column prop="remark" :label="$t('carDetailCarInout.remark')" align="center"></el-table-column>
  46 + </el-table>
  47 +
  48 + <el-row>
  49 + <el-col :span="16" :offset="8">
  50 + <el-pagination @current-change="handleCurrentChange" :current-page="currentPage" :page-size="pageSize"
  51 + layout="total, prev, pager, next, jumper" :total="total">
  52 + </el-pagination>
  53 + </el-col>
  54 + </el-row>
  55 + </div>
  56 + </div>
  57 +</template>
  58 +
  59 +<script>
  60 +import { getCarInoutDetail } from '@/api/car/carDetailCarInoutApi'
  61 +
  62 +export default {
  63 + name: 'CarDetailCarInout',
  64 + data() {
  65 + return {
  66 + carDetailCarInoutInfo: {
  67 + carIns: [],
  68 + carId: '',
  69 + memberId: '',
  70 + carNum: '',
  71 + areaNum: ''
  72 + },
  73 + currentPage: 1,
  74 + pageSize: 10,
  75 + total: 0
  76 + }
  77 + },
  78 + methods: {
  79 + switch(data) {
  80 + this.carDetailCarInoutInfo.carId = data.carId
  81 + this.carDetailCarInoutInfo.carNum = data.carNum
  82 + this.carDetailCarInoutInfo.areaNum = data.areaNum
  83 + this.carDetailCarInoutInfo.memberId = data.memberId
  84 + this._loadCarDetailCarInoutData(this.currentPage, this.pageSize)
  85 + },
  86 + _loadCarDetailCarInoutData(page, row) {
  87 + const params = {
  88 + communityId: this.$store.state.community.communityId,
  89 + carNum: this.carDetailCarInoutInfo.carNum,
  90 + paNum: this.carDetailCarInoutInfo.areaNum,
  91 + iotApiCode: 'listCarInoutDetailBmoImpl',
  92 + page,
  93 + row
  94 + }
  95 +
  96 + getCarInoutDetail(params).then(response => {
  97 + this.carDetailCarInoutInfo.carIns = response.data.data
  98 + this.total = response.data.total
  99 + }).catch(error => {
  100 + console.error('请求失败:', error)
  101 + })
  102 + },
  103 + handleCurrentChange(val) {
  104 + this.currentPage = val
  105 + this._loadCarDetailCarInoutData(val, this.pageSize)
  106 + },
  107 + _viewTempFeeConfigInOutCar(configId) {
  108 + // 查看计费规则详情
  109 + console.log(configId)
  110 + },
  111 + _carInoutOpenFile(fileUrl) {
  112 + // 打开文件预览
  113 + window.open(fileUrl)
  114 + }
  115 + }
  116 +}
  117 +</script>
0 \ No newline at end of file 118 \ No newline at end of file
src/components/car/carDetailCarInoutDemo.vue 0 → 100644
  1 +<template>
  2 + <car-detail-car-inout ref="carDetailCarInout"></car-detail-car-inout>
  3 +</template>
  4 +
  5 +<script>
  6 +import CarDetailCarInout from '@/components/car/carDetailCarInout'
  7 +
  8 +export default {
  9 + components: {
  10 + CarDetailCarInout
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.carDetailCarInout.switch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/car/carDetailCoupon.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <div class="margin-top">
  4 + <el-table :data="carDetailCouponInfo.carDetailCoupons" border style="width: 100%">
  5 + <el-table-column prop="carNum" :label="$t('carDetailCoupon.car')" align="center"></el-table-column>
  6 + <el-table-column prop="couponName" :label="$t('carDetailCoupon.coupon')" align="center"></el-table-column>
  7 + <el-table-column prop="shopName" :label="$t('carDetailCoupon.shop')" align="center"></el-table-column>
  8 + <el-table-column prop="paName" :label="$t('carDetailCoupon.parkingLot')" align="center"></el-table-column>
  9 + <el-table-column prop="giveWayName" :label="$t('carDetailCoupon.giveWay')" align="center"></el-table-column>
  10 + <el-table-column prop="typeCdName" :label="$t('carDetailCoupon.couponType')" align="center"></el-table-column>
  11 + <el-table-column prop="value" :label="$t('carDetailCoupon.value')" align="center"></el-table-column>
  12 + <el-table-column prop="startTime" :label="$t('carDetailCoupon.startTime')" align="center"></el-table-column>
  13 + <el-table-column prop="endTime" :label="$t('carDetailCoupon.endTime')" align="center"></el-table-column>
  14 + <el-table-column prop="createTime" :label="$t('carDetailCoupon.giveTime')" align="center"></el-table-column>
  15 + <el-table-column prop="stateName" :label="$t('carDetailCoupon.status')" align="center"></el-table-column>
  16 + <el-table-column prop="remark" :label="$t('carDetailCoupon.remark')" align="center"></el-table-column>
  17 + </el-table>
  18 +
  19 + <el-row>
  20 + <el-col :span="16" :offset="8">
  21 + <el-pagination
  22 + @current-change="handleCurrentChange"
  23 + :current-page="currentPage"
  24 + :page-size="pageSize"
  25 + layout="total, prev, pager, next, jumper"
  26 + :total="total">
  27 + </el-pagination>
  28 + </el-col>
  29 + </el-row>
  30 + </div>
  31 + </div>
  32 +</template>
  33 +
  34 +<script>
  35 +import { listParkingCouponCar } from '@/api/car/carDetailCouponApi'
  36 +
  37 +export default {
  38 + name: 'CarDetailCoupon',
  39 + data() {
  40 + return {
  41 + carDetailCouponInfo: {
  42 + carDetailCoupons: [],
  43 + carId: '',
  44 + memberId: '',
  45 + carNum: '',
  46 + paId: ''
  47 + },
  48 + currentPage: 1,
  49 + pageSize: 10,
  50 + total: 0
  51 + }
  52 + },
  53 + methods: {
  54 + switch(data) {
  55 + this.carDetailCouponInfo.carId = data.carId
  56 + this.carDetailCouponInfo.carNum = data.carNum
  57 + this.carDetailCouponInfo.paId = data.paId
  58 + this.carDetailCouponInfo.memberId = data.memberId
  59 + this._loadCarDetailCouponData(this.currentPage, this.pageSize)
  60 + },
  61 + _loadCarDetailCouponData(page, row) {
  62 + const params = {
  63 + communityId: this.$store.state.community.communityId,
  64 + carNum: this.carDetailCouponInfo.carNum,
  65 + iotApiCode: 'listParkingCouponCarBmoImpl',
  66 + page,
  67 + row
  68 + }
  69 +
  70 + listParkingCouponCar(params).then(response => {
  71 + this.carDetailCouponInfo.carDetailCoupons = response.data.data
  72 + this.total = response.data.total
  73 + }).catch(error => {
  74 + console.error('请求失败:', error)
  75 + })
  76 + },
  77 + handleCurrentChange(val) {
  78 + this.currentPage = val
  79 + this._loadCarDetailCouponData(val, this.pageSize)
  80 + }
  81 + }
  82 +}
  83 +</script>
0 \ No newline at end of file 84 \ No newline at end of file
src/components/car/carDetailCouponDemo.vue 0 → 100644
  1 +<template>
  2 + <car-detail-coupon ref="carDetailCoupon"></car-detail-coupon>
  3 +</template>
  4 +
  5 +<script>
  6 +import CarDetailCoupon from '@/components/car/carDetailCoupon'
  7 +
  8 +export default {
  9 + components: {
  10 + CarDetailCoupon
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.carDetailCoupon.switch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/car/carDetailCouponOrder.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <div class="margin-top">
  4 + <el-table :data="carDetailCouponOrderInfo.orders" border style="width: 100%">
  5 + <el-table-column prop="orderId" :label="$t('carDetailCouponOrder.orderId')" align="center"></el-table-column>
  6 + <el-table-column prop="carNum" :label="$t('carDetailCouponOrder.carNum')" align="center"></el-table-column>
  7 + <el-table-column prop="couponName" :label="$t('carDetailCouponOrder.coupon')" align="center"></el-table-column>
  8 + <el-table-column prop="shopName" :label="$t('carDetailCouponOrder.shop')" align="center"></el-table-column>
  9 + <el-table-column prop="paName" :label="$t('carDetailCouponOrder.parkingLot')" align="center"></el-table-column>
  10 + <el-table-column prop="machineName" :label="$t('carDetailCouponOrder.machine')" align="center"></el-table-column>
  11 + <el-table-column prop="createTime" :label="$t('carDetailCouponOrder.verifyTime')" align="center"></el-table-column>
  12 + <el-table-column prop="remark" :label="$t('carDetailCouponOrder.remark')" align="center"></el-table-column>
  13 + </el-table>
  14 +
  15 + <el-row>
  16 + <el-col :span="16" :offset="8">
  17 + <el-pagination
  18 + @current-change="handleCurrentChange"
  19 + :current-page="currentPage"
  20 + :page-size="pageSize"
  21 + layout="total, prev, pager, next, jumper"
  22 + :total="total">
  23 + </el-pagination>
  24 + </el-col>
  25 + </el-row>
  26 + </div>
  27 + </div>
  28 +</template>
  29 +
  30 +<script>
  31 +import { listParkingCouponCarOrder } from '@/api/car/carDetailCouponOrderApi'
  32 +
  33 +export default {
  34 + name: 'CarDetailCouponOrder',
  35 + data() {
  36 + return {
  37 + carDetailCouponOrderInfo: {
  38 + orders: [],
  39 + carId: '',
  40 + memberId: '',
  41 + carNum: '',
  42 + paId: ''
  43 + },
  44 + currentPage: 1,
  45 + pageSize: 10,
  46 + total: 0
  47 + }
  48 + },
  49 + methods: {
  50 + switch(data) {
  51 + this.carDetailCouponOrderInfo.carId = data.carId
  52 + this.carDetailCouponOrderInfo.carNum = data.carNum
  53 + this.carDetailCouponOrderInfo.paId = data.paId
  54 + this.carDetailCouponOrderInfo.memberId = data.memberId
  55 + this._loadCarDetailCouponOrderData(this.currentPage, this.pageSize)
  56 + },
  57 + _loadCarDetailCouponOrderData(page, row) {
  58 + const params = {
  59 + communityId: this.$store.state.community.communityId,
  60 + carNum: this.carDetailCouponOrderInfo.carNum,
  61 + iotApiCode: 'listParkingCouponCarOrderBmoImpl',
  62 + page,
  63 + row
  64 + }
  65 +
  66 + listParkingCouponCarOrder(params).then(response => {
  67 + this.carDetailCouponOrderInfo.orders = response.data.data
  68 + this.total = response.data.total
  69 + }).catch(error => {
  70 + console.error('请求失败:', error)
  71 + })
  72 + },
  73 + handleCurrentChange(val) {
  74 + this.currentPage = val
  75 + this._loadCarDetailCouponOrderData(val, this.pageSize)
  76 + }
  77 + }
  78 +}
  79 +</script>
0 \ No newline at end of file 80 \ No newline at end of file
src/components/car/carDetailCouponOrderDemo.vue 0 → 100644
  1 +<template>
  2 + <car-detail-coupon-order ref="carDetailCouponOrder"></car-detail-coupon-order>
  3 +</template>
  4 +
  5 +<script>
  6 +import CarDetailCouponOrder from '@/components/car/carDetailCouponOrder'
  7 +
  8 +export default {
  9 + components: {
  10 + CarDetailCouponOrder
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.carDetailCouponOrder.switch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/car/carDetailFee.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <el-row>
  4 + <el-col :span="24" class="text-right">
  5 + <el-button type="primary" size="small" style="margin-left:10px" @click="_openCarCreateFeeAddModal()">
  6 + {{ $t('carDetailFee.createFee') }}
  7 + </el-button>
  8 + </el-col>
  9 + </el-row>
  10 +
  11 + <div class="margin-top">
  12 + <el-table :data="carDetailFeeInfo.fees" style="width: 100%">
  13 + <el-table-column prop="feeName" :label="$t('carDetailFee.feeItem')" align="center">
  14 + <template #default="{ row }">
  15 + <span class="hand" @click="_viewCarFeeConfig(row)">{{ row.feeName }}
  16 + <i class="el-icon-info"></i>
  17 + </span>
  18 + </template>
  19 + </el-table-column>
  20 + <el-table-column prop="feeFlagName" :label="$t('carDetailFee.feeFlag')" align="center"></el-table-column>
  21 + <el-table-column prop="feeTypeCdName" :label="$t('carDetailFee.feeType')" align="center"></el-table-column>
  22 + <el-table-column prop="amountOwed" :label="$t('carDetailFee.amountReceivable')"
  23 + align="center"></el-table-column>
  24 + <el-table-column prop="startTime" :label="$t('carDetailFee.accountingTime')" align="center"></el-table-column>
  25 + <el-table-column :label="$t('carDetailFee.receivablePeriod')" align="center">
  26 + <template #default="{ row }">
  27 + {{ _getEndTime(row) }}~<br />{{ _getDeadlineTime(row) }}
  28 + </template>
  29 + </el-table-column>
  30 + <el-table-column :label="$t('carDetailFee.remark')" align="center">
  31 + <template #default="{ row }">
  32 + <div v-if="row.feeTypeCd == '888800010015' || row.feeTypeCd == '888800010016'">
  33 + <div>
  34 + <span>{{ $t('carDetailFee.previousReading') }}</span>:{{ row.preDegrees }}
  35 + </div>
  36 + <div>
  37 + <span>{{ $t('carDetailFee.currentReading') }}</span>:{{ row.curDegrees }}
  38 + </div>
  39 + <div>
  40 + <span>{{ $t('carDetailFee.unitPrice') }}</span>:{{ row.mwPrice ? row.mwPrice : row.squarePrice }}
  41 + </div>
  42 + <div>
  43 + <span>{{ $t('carDetailFee.additionalFee') }}</span>:{{ row.additionalAmount }}
  44 + </div>
  45 + </div>
  46 + <div v-else>
  47 + <div>
  48 + <span>{{ $t('carDetailFee.unitPrice') }}</span>:{{ row.squarePrice }}
  49 + </div>
  50 + <div>
  51 + <span>{{ $t('carDetailFee.fixedFee') }}</span>:{{ row.additionalAmount }}
  52 + </div>
  53 + </div>
  54 + </template>
  55 + </el-table-column>
  56 + <el-table-column prop="stateName" :label="$t('carDetailFee.status')" align="center"></el-table-column>
  57 + <el-table-column :label="$t('carDetailFee.operation')" align="center">
  58 + <template #default="{ row }">
  59 + <el-button type="text" v-if="row.state != '2009001' && hasPrivilege('502020082314267912')"
  60 + @click="_payFee(row)">
  61 + {{ $t('carDetailFee.payment') }}
  62 + </el-button>
  63 + <el-button type="text" @click="_payFeeHis(row)">
  64 + {{ $t('carDetailFee.history') }}
  65 + </el-button>
  66 + <el-button type="text" v-if="hasPrivilege('502020090604200029')" @click="_deleteFee(row)">
  67 + {{ $t('carDetailFee.cancel') }}
  68 + </el-button>
  69 + <el-button type="text" v-if="row.state != '2009001' && hasPrivilege('502020090427190001')"
  70 + @click="_editFee(row)">
  71 + {{ $t('carDetailFee.change') }}
  72 + </el-button>
  73 + <el-button type="text" @click="_viewCarFee(row)">
  74 + {{ $t('carDetailFee.detail') }}
  75 + </el-button>
  76 + </template>
  77 + </el-table-column>
  78 + </el-table>
  79 +
  80 + <el-row class="margin-top">
  81 + <el-col :span="12">
  82 + <span>{{ $t('carDetailFee.paymentNotice') }}</span>
  83 + </el-col>
  84 + <el-col :span="12" class="text-right">
  85 + <el-pagination @current-change="handleCurrentChange" :current-page="pagination.currentPage"
  86 + :page-size="pagination.pageSize" :total="pagination.total" layout="prev, pager, next, jumper">
  87 + </el-pagination>
  88 + </el-col>
  89 + </el-row>
  90 + </div>
  91 +
  92 + <add-meter-water ref="addMeterWater"></add-meter-water>
  93 + <car-create-fee-add ref="carCreateFeeAdd"></car-create-fee-add>
  94 + <delete-fee ref="deleteFee"></delete-fee>
  95 + <edit-fee ref="editFee"></edit-fee>
  96 + </div>
  97 +</template>
  98 +
  99 +<script>
  100 +import { listFee } from '@/api/car/carDetailFeeApi'
  101 +import AddMeterWater from '@/components/fee/addMeterWater'
  102 +import CarCreateFeeAdd from '@/components/fee/carCreateFeeAdd'
  103 +import DeleteFee from '@/components/fee/deleteFee'
  104 +import EditFee from '@/components/fee/editFee'
  105 +import { getCommunityId } from '@/api/community/communityApi'
  106 +
  107 +export default {
  108 + name: 'CarDetailFee',
  109 + components: {
  110 + AddMeterWater,
  111 + CarCreateFeeAdd,
  112 + DeleteFee,
  113 + EditFee
  114 + },
  115 + data() {
  116 + return {
  117 + carDetailFeeInfo: {
  118 + fees: [],
  119 + carId: '',
  120 + memberId: '',
  121 + carNum: ''
  122 + },
  123 + pagination: {
  124 + currentPage: 1,
  125 + pageSize: 10,
  126 + total: 0
  127 + }
  128 + }
  129 + },
  130 + created() {
  131 + this.communityId = getCommunityId()
  132 + },
  133 + methods: {
  134 + open(data) {
  135 + this.carDetailFeeInfo.carId = data.carId
  136 + this.carDetailFeeInfo.carNum = data.carNum
  137 + this.carDetailFeeInfo.memberId = data.memberId
  138 + this._loadCarDetailFeeData(1, this.pagination.pageSize)
  139 + },
  140 + switch(data) {
  141 + this.carDetailFeeInfo.carId = data.carId
  142 + this.carDetailFeeInfo.carNum = data.carNum
  143 + this.carDetailFeeInfo.memberId = data.memberId
  144 + this._loadCarDetailFeeData(1, this.pagination.pageSize)
  145 + },
  146 + notify() {
  147 + this._loadCarDetailFeeData(this.pagination.currentPage, this.pagination.pageSize)
  148 + },
  149 + handleCurrentChange(val) {
  150 + this.pagination.currentPage = val
  151 + this._loadCarDetailFeeData(val, this.pagination.pageSize)
  152 + },
  153 + _loadCarDetailFeeData(page, row) {
  154 + const params = {
  155 + communityId: this.communityId,
  156 + payerObjId: this.carDetailFeeInfo.memberId,
  157 + page: page,
  158 + row: row
  159 + }
  160 +
  161 + listFee(params).then(response => {
  162 + this.carDetailFeeInfo.fees = response.fees
  163 + this.pagination.total = response.records
  164 + }).catch(error => {
  165 + console.error('请求失败处理', error)
  166 + })
  167 + },
  168 + _payFee(fee) {
  169 + fee.roomName = this.carDetailFeeInfo.carNum
  170 + this.$router.push(`/views/fee/payFeeOrder?feeId=${fee.feeId}`)
  171 + },
  172 + _payFeeHis(fee) {
  173 + this.$router.push(`/views/fee/propertyFee?${this.objToQueryString(fee)}`)
  174 + },
  175 + _editFee(fee) {
  176 + this.$refs.editFee.open(fee)
  177 + },
  178 + _deleteFee(fee) {
  179 + this.$refs.deleteFee.open({
  180 + communityId: this.communityId,
  181 + feeId: fee.feeId
  182 + })
  183 + },
  184 + _openCarCreateFeeAddModal() {
  185 + this.$refs.carCreateFeeAdd.open({
  186 + isMore: false,
  187 + car: this.carDetailFeeInfo
  188 + })
  189 + },
  190 + _openAddMeterWaterModal() {
  191 + this.$refs.addMeterWater.open({
  192 + roomId: this.carDetailFeeInfo.carId,
  193 + roomName: this.carDetailFeeInfo.carNum,
  194 + ownerName: this.carDetailFeeInfo.parkingName,
  195 + objType: '6666'
  196 + })
  197 + },
  198 + _getDeadlineTime(fee) {
  199 + if (fee.amountOwed == 0 && fee.endTime == fee.deadlineTime) {
  200 + return "-"
  201 + }
  202 + if (fee.state == '2009001') {
  203 + return "-"
  204 + }
  205 + return fee.deadlineTime
  206 + },
  207 + _getEndTime(fee) {
  208 + if (fee.state == '2009001') {
  209 + return "-"
  210 + }
  211 + return fee.endTime
  212 + },
  213 + _viewCarFeeConfig(fee) {
  214 + // 实现查看费用配置逻辑
  215 + //window.open(`/#/views/fee/feeDetailConfig?configId=${fee.configId}`)
  216 + console.log(fee)
  217 + },
  218 + _viewCarFee(fee) {
  219 + // 实现查看费用详情逻辑
  220 + window.open(`/#/views/fee/feeDetail?feeId=${fee.feeId}`)
  221 + },
  222 + objToQueryString(obj) {
  223 + return Object.keys(obj).map(key => `${key}=${obj[key]}`).join('&')
  224 + },
  225 + }
  226 +}
  227 +</script>
  228 +
  229 +<style scoped>
  230 +.hand {
  231 + cursor: pointer;
  232 +}
  233 +
  234 +.text-right {
  235 + text-align: right;
  236 +}
  237 +
  238 +.margin-top {
  239 + margin-top: 20px;
  240 +}
  241 +</style>
0 \ No newline at end of file 242 \ No newline at end of file
src/components/car/carDetailFeeDemo.vue 0 → 100644
  1 +<template>
  2 + <car-detail-fee ref="carDetailFee"></car-detail-fee>
  3 +</template>
  4 +
  5 +<script>
  6 +import CarDetailFee from '@/components/car/carDetailFee'
  7 +
  8 +export default {
  9 + components: {
  10 + CarDetailFee
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.carDetailFee.switch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/car/carDetailMember.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <el-row>
  4 + <el-col :span="24" class="text-right">
  5 + <el-button type="primary" size="small" @click="_addOwnerCarMember">
  6 + {{ $t('common.add') }}
  7 + </el-button>
  8 + </el-col>
  9 + </el-row>
  10 +
  11 + <div class="margin-top">
  12 + <el-table :data="carDetailMemberInfo.ownerCars" style="width: 100%">
  13 + <el-table-column prop="carNum" :label="$t('carDetailMember.licensePlate')" align="center"></el-table-column>
  14 + <el-table-column prop="roomName" :label="$t('carDetailMember.roomNumber')" align="center"></el-table-column>
  15 + <el-table-column prop="carBrand" :label="$t('carDetailMember.carBrand')" align="center"></el-table-column>
  16 + <el-table-column prop="carTypeName" :label="$t('carDetailMember.carType')" align="center"></el-table-column>
  17 + <el-table-column prop="carColor" :label="$t('carDetailMember.color')" align="center"></el-table-column>
  18 + <el-table-column :label="$t('carDetailMember.owner')" align="center">
  19 + <template #default="{ row }">
  20 + {{ row.ownerName }}({{ row.link }})
  21 + </template>
  22 + </el-table-column>
  23 + <el-table-column :label="$t('carDetailMember.parkingSpace')" align="center">
  24 + <template #default="{ row }">
  25 + <span v-if="row.areaNum">
  26 + {{ row.areaNum }}{{ $t('carDetailMember.parkingLot') }}{{ row.num }}{{ $t('carDetailMember.parkingSpace') }}
  27 + </span>
  28 + <span v-else>
  29 + {{ $t('carDetailMember.none') }}
  30 + </span>
  31 + </template>
  32 + </el-table-column>
  33 + <el-table-column prop="startTime" :label="$t('carDetailMember.startTime')" align="center"></el-table-column>
  34 + <el-table-column prop="endTime" :label="$t('carDetailMember.endTime')" align="center"></el-table-column>
  35 + <el-table-column :label="$t('carDetailMember.status')" align="center">
  36 + <template #default="{ row }">
  37 + {{ row.stateName }}
  38 + <span v-if="row.iotStateName">
  39 + ({{ row.iotStateName }})
  40 + </span>
  41 + </template>
  42 + </el-table-column>
  43 + <el-table-column :label="$t('carDetailMember.operation')" align="center">
  44 + <template #default="{ row }">
  45 + <el-button type="text" @click="_openEditOwnerCar(row)">
  46 + {{ $t('common.edit') }}
  47 + </el-button>
  48 + <el-button type="text" @click="_openDelOwnerCarModel(row)">
  49 + {{ $t('common.delete') }}
  50 + </el-button>
  51 + </template>
  52 + </el-table-column>
  53 + </el-table>
  54 +
  55 + <el-row class="margin-top">
  56 + <el-col :span="24" class="text-right">
  57 + <el-pagination @current-change="handleCurrentChange" :current-page="pagination.currentPage"
  58 + :page-size="pagination.pageSize" :total="pagination.total" layout="prev, pager, next, jumper">
  59 + </el-pagination>
  60 + </el-col>
  61 + </el-row>
  62 + </div>
  63 +
  64 + <add-car-modal ref="addCarModal" @notify="notify"></add-car-modal>
  65 + <edit-member-car ref="editMemberCar" @notify="notify"></edit-member-car>
  66 + <delete-owner-car ref="deleteOwnerCar" @notify="notify"></delete-owner-car>
  67 + </div>
  68 +</template>
  69 +
  70 +<script>
  71 +import { getOwnerCarDetail } from '@/api/car/carDetailApi'
  72 +import AddCarModal from '@/components/car/addCarModal'
  73 +import EditMemberCar from '@/components/car/editMemberCar'
  74 +import DeleteOwnerCar from '@/components/car/deleteOwnerCar'
  75 +import { getCommunityId } from '@/api/community/communityApi'
  76 +
  77 +export default {
  78 + name: 'CarDetailMember',
  79 + components: {
  80 + AddCarModal,
  81 + EditMemberCar,
  82 + DeleteOwnerCar
  83 + },
  84 + data() {
  85 + return {
  86 + carDetailMemberInfo: {
  87 + ownerCars: [],
  88 + carId: '',
  89 + carNum: '',
  90 + memberId: ''
  91 + },
  92 + pagination: {
  93 + currentPage: 1,
  94 + pageSize: 10,
  95 + total: 0
  96 + }
  97 + }
  98 + },
  99 + created() {
  100 + this.communityId = getCommunityId()
  101 + },
  102 + methods: {
  103 + switch(data) {
  104 + this.carDetailMemberInfo.carId = data.carId
  105 + this.carDetailMemberInfo.carNum = data.carNum
  106 + this.carDetailMemberInfo.memberId = data.memberId
  107 + this._loadCarDetailMemberData(1, this.pagination.pageSize)
  108 + },
  109 + notify() {
  110 + this._loadCarDetailMemberData(this.pagination.currentPage, this.pagination.pageSize)
  111 + },
  112 + handleCurrentChange(val) {
  113 + this.pagination.currentPage = val
  114 + this._loadCarDetailMemberData(val, this.pagination.pageSize)
  115 + },
  116 + _loadCarDetailMemberData(page, row) {
  117 + const params = {
  118 + communityId: this.communityId,
  119 + carId: this.carDetailMemberInfo.carId,
  120 + carTypeCd: '1002',
  121 + page: page,
  122 + row: row
  123 + }
  124 +
  125 + getOwnerCarDetail(params).then(response => {
  126 + this.carDetailMemberInfo.ownerCars = response.data
  127 + this.pagination.total = response.records
  128 + }).catch(error => {
  129 + console.error('请求失败处理', error)
  130 + })
  131 + },
  132 + _addOwnerCarMember() {
  133 + this.$refs.addCarModal.open({
  134 + carId: this.carDetailMemberInfo.carId
  135 + })
  136 + },
  137 + _openEditOwnerCar(car) {
  138 + this.$refs.editMemberCar.open(car)
  139 + },
  140 + _openDelOwnerCarModel(car) {
  141 + this.$refs.deleteOwnerCar.open(car)
  142 + },
  143 + _viewIotStateRemark(car) {
  144 + const data = {
  145 + "同步说明": car.iotRemark
  146 + }
  147 + this.$emit('viewData', {
  148 + title: `${car.carNum} 同步物联网详情`,
  149 + data: data
  150 + })
  151 + }
  152 + }
  153 +}
  154 +</script>
  155 +
  156 +<style scoped>
  157 +.margin-top {
  158 + margin-top: 20px;
  159 +}
  160 +
  161 +.text-right {
  162 + text-align: right;
  163 +}
  164 +</style>
0 \ No newline at end of file 165 \ No newline at end of file
src/components/car/carDetailTransactionCar.vue 0 → 100644
  1 +<template>
  2 + <div class="margin-top">
  3 + <div class="margin-top-lg"></div>
  4 + <div class="margin-top">
  5 + <el-table :data="carDetailTransactionCarInfo.machineTranslates" border style="width: 100%">
  6 + <el-table-column prop="machineTranslateId" :label="$t('carDetailTransactionCar.syncId')" align="center"></el-table-column>
  7 + <el-table-column prop="machineCode" :label="$t('carDetailTransactionCar.deviceCode')" align="center"></el-table-column>
  8 + <el-table-column prop="typeCdName" :label="$t('carDetailTransactionCar.objectType')" align="center"></el-table-column>
  9 + <el-table-column prop="objName" :label="$t('carDetailTransactionCar.objectName')" align="center"></el-table-column>
  10 + <el-table-column prop="machineCmdName" :label="$t('carDetailTransactionCar.command')" align="center"></el-table-column>
  11 + <el-table-column prop="stateName" :label="$t('carDetailTransactionCar.status')" align="center"></el-table-column>
  12 + <el-table-column prop="remark" :label="$t('carDetailTransactionCar.remark')" align="center" width="80px"></el-table-column>
  13 + <el-table-column prop="updateTime" :label="$t('carDetailTransactionCar.syncTime')" align="center"></el-table-column>
  14 + <el-table-column :label="$t('carDetailTransactionCar.operation')" align="center">
  15 + <template slot-scope="scope">
  16 + <el-button size="mini" @click="_openEditMachineTranslateModel(scope.row)">
  17 + {{$t('carDetailTransactionCar.resync')}}
  18 + </el-button>
  19 + </template>
  20 + </el-table-column>
  21 + </el-table>
  22 +
  23 + <el-row>
  24 + <el-col :span="16" :offset="8">
  25 + <el-pagination
  26 + @current-change="handleCurrentChange"
  27 + :current-page="currentPage"
  28 + :page-size="pageSize"
  29 + layout="total, prev, pager, next, jumper"
  30 + :total="total">
  31 + </el-pagination>
  32 + </el-col>
  33 + </el-row>
  34 + </div>
  35 +
  36 + <edit-machine-translate ref="editMachineTranslate"></edit-machine-translate>
  37 + </div>
  38 +</template>
  39 +
  40 +<script>
  41 +import { getMachineTranslates } from '@/api/car/carDetailTransactionCarApi'
  42 +import EditMachineTranslate from '@/components/property/editMachineTranslate'
  43 +
  44 +export default {
  45 + name: 'CarDetailTransactionCar',
  46 + components: {
  47 + EditMachineTranslate
  48 + },
  49 + data() {
  50 + return {
  51 + carDetailTransactionCarInfo: {
  52 + machineTranslates: [],
  53 + ownerId: '',
  54 + carId: '',
  55 + memberId: ''
  56 + },
  57 + currentPage: 1,
  58 + pageSize: 10,
  59 + total: 0
  60 + }
  61 + },
  62 + methods: {
  63 + switch(data) {
  64 + this.carDetailTransactionCarInfo.carId = data.carId
  65 + this.carDetailTransactionCarInfo.memberId = data.memberId
  66 + this._loadCarDetailTransactionCarData(this.currentPage, this.pageSize)
  67 + },
  68 + _loadCarDetailTransactionCarData(page, row) {
  69 + const params = {
  70 + page,
  71 + row,
  72 + communityId: this.$store.state.community.communityId,
  73 + objId: this.carDetailTransactionCarInfo.memberId,
  74 + typeCd: '4455'
  75 + }
  76 +
  77 + getMachineTranslates(params).then(response => {
  78 + this.carDetailTransactionCarInfo.machineTranslates = response.data.machineTranslates
  79 + this.total = response.data.total
  80 + }).catch(error => {
  81 + console.error('请求失败:', error)
  82 + })
  83 + },
  84 + handleCurrentChange(val) {
  85 + this.currentPage = val
  86 + this._loadCarDetailTransactionCarData(val, this.pageSize)
  87 + },
  88 + _openEditMachineTranslateModel(machineTranslate) {
  89 + this.$refs.editMachineTranslate.open(machineTranslate)
  90 + }
  91 + }
  92 +}
  93 +</script>
0 \ No newline at end of file 94 \ No newline at end of file
src/components/car/carDetailTransactionCarDemo.vue 0 → 100644
  1 +<template>
  2 + <car-detail-transaction-car ref="carDetailTransactionCar"></car-detail-transaction-car>
  3 +</template>
  4 +
  5 +<script>
  6 +import CarDetailTransactionCar from '@/components/car/carDetailTransactionCar'
  7 +
  8 +export default {
  9 + components: {
  10 + CarDetailTransactionCar
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.carDetailTransactionCar.switch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/car/editMemberCar.vue 0 → 100644
  1 +<template>
  2 + <el-dialog :title="$t('editMemberCar.edit')" :visible.sync="visible" width="50%">
  3 + <el-form :model="editMemberCarInfo" :rules="rules" ref="editMemberCarForm">
  4 + <el-form-item :label="$t('editMemberCar.licensePlate')" prop="carNum">
  5 + <el-input v-model="editMemberCarInfo.carNum" :placeholder="$t('editMemberCar.licensePlateRequired')"></el-input>
  6 + </el-form-item>
  7 + <el-form-item :label="$t('editMemberCar.carBrand')">
  8 + <el-input v-model="editMemberCarInfo.carBrand" :placeholder="$t('editMemberCar.carBrandOptional')"></el-input>
  9 + </el-form-item>
  10 + <el-form-item :label="$t('editMemberCar.carType')" prop="carType">
  11 + <el-select v-model="editMemberCarInfo.carType" :placeholder="$t('editMemberCar.carTypeRequired')" style="width:100%">
  12 + <el-option v-for="carType in carTypes" :key="carType.statusCd"
  13 + :label="carType.name" :value="carType.statusCd"></el-option>
  14 + </el-select>
  15 + </el-form-item>
  16 + <el-form-item :label="$t('editMemberCar.color')">
  17 + <el-input v-model="editMemberCarInfo.carColor" :placeholder="$t('editMemberCar.colorOptional')"></el-input>
  18 + </el-form-item>
  19 + <el-form-item :label="$t('editMemberCar.remark')">
  20 + <el-input type="textarea" v-model="editMemberCarInfo.remark" :placeholder="$t('editMemberCar.remarkPlaceholder')" rows="3"></el-input>
  21 + </el-form-item>
  22 + </el-form>
  23 + <div slot="footer" class="dialog-footer">
  24 + <el-button @click="visible = false">{{ $t('common.cancel') }}</el-button>
  25 + <el-button type="primary" @click="_submitEditMemberCarInfo">{{ $t('common.save') }}</el-button>
  26 + </div>
  27 + </el-dialog>
  28 +</template>
  29 +
  30 +<script>
  31 +import { editOwnerCar } from '@/api/car/listOwnerCarApi'
  32 +import { getDict } from '@/api/community/communityApi'
  33 +import { getCommunityId } from '@/api/community/communityApi'
  34 +
  35 +export default {
  36 + name: 'EditMemberCar',
  37 + data() {
  38 + return {
  39 + visible: false,
  40 + editMemberCarInfo: {
  41 + carId: '',
  42 + memberId: '',
  43 + carNum: '',
  44 + carBrand: '',
  45 + carType: '',
  46 + carColor: '',
  47 + remark: "",
  48 + startTime: '',
  49 + endTime: '',
  50 + carNumType: '',
  51 + leaseType: '',
  52 + },
  53 + carTypes: [],
  54 + rules: {
  55 + carNum: [
  56 + { required: true, message: this.$t('editMemberCar.licensePlateRequired'), trigger: 'blur' },
  57 + { min: 2, max: 12, message: this.$t('editMemberCar.licensePlateInvalid'), trigger: 'blur' }
  58 + ],
  59 + carType: [
  60 + { required: true, message: this.$t('editMemberCar.carTypeRequired'), trigger: 'change' }
  61 + ],
  62 + memberId: [
  63 + { required: true, message: this.$t('editMemberCar.carDataError'), trigger: 'blur' }
  64 + ]
  65 + }
  66 + }
  67 + },
  68 + created() {
  69 + this.communityId = getCommunityId()
  70 + this.loadCarTypes()
  71 + },
  72 + methods: {
  73 + async loadCarTypes() {
  74 + try {
  75 + const data = await getDict('owner_car', 'car_type')
  76 + this.carTypes = data
  77 + } catch (error) {
  78 + console.error('获取字典数据失败:', error)
  79 + }
  80 + },
  81 + open(carInfo) {
  82 + this.editMemberCarInfo = Object.assign({}, carInfo)
  83 + this.visible = true
  84 + this.$nextTick(() => {
  85 + this.$refs.editMemberCarForm.clearValidate()
  86 + })
  87 + },
  88 + _submitEditMemberCarInfo() {
  89 + this.$refs.editMemberCarForm.validate(valid => {
  90 + if (valid) {
  91 + this.editMemberCarInfo.communityId = this.communityId
  92 + editOwnerCar(this.editMemberCarInfo).then(response => {
  93 + if (response.code === 0) {
  94 + this.visible = false
  95 + this.$emit('notify')
  96 + this.$message.success(this.$t('common.editSuccess'))
  97 + } else {
  98 + this.$message.error(response.msg)
  99 + }
  100 + }).catch(error => {
  101 + console.error('请求失败处理', error)
  102 + this.$message.error(error)
  103 + })
  104 + }
  105 + })
  106 + }
  107 + }
  108 +}
  109 +</script>
0 \ No newline at end of file 110 \ No newline at end of file
src/components/car/ownerDetailOweFee.vue 0 → 100644
  1 +<template>
  2 + <div class="margin-top">
  3 + <el-row class="margin-top-lg">
  4 + <el-col :span="24" class="text-right">
  5 + <el-button type="primary" size="small" style="margin-left:10px" v-if="hasPrivilege('502020082314267912')"
  6 + @click="_openBatchPayRoomFeeModal()">
  7 + {{ $t('ownerDetailOweFee.batchPayment') }}
  8 + </el-button>
  9 + </el-col>
  10 + </el-row>
  11 +
  12 + <div class="margin-top">
  13 + <el-table :data="ownerDetailOweFeeInfo.fees" style="width: 100%">
  14 + <el-table-column prop="payerObjName" :label="$t('ownerDetailOweFee.paymentObject')"
  15 + align="center"></el-table-column>
  16 + <el-table-column prop="ownerName" :label="$t('ownerDetailOweFee.ownerName')" align="center"></el-table-column>
  17 + <el-table-column prop="ownerTel" :label="$t('ownerDetailOweFee.phone')" align="center"></el-table-column>
  18 + <el-table-column prop="endTime" :label="$t('ownerDetailOweFee.startTime')" align="center"></el-table-column>
  19 + <el-table-column prop="deadlineTime" :label="$t('ownerDetailOweFee.endTime')" align="center"></el-table-column>
  20 + <el-table-column prop="amountOwed" :label="$t('ownerDetailOweFee.totalAmount')"
  21 + align="center"></el-table-column>
  22 + <el-table-column prop="updateTime" :label="$t('ownerDetailOweFee.updateTime')" align="center"></el-table-column>
  23 + </el-table>
  24 +
  25 + <el-row class="margin-top">
  26 + <el-col :span="12">
  27 + <span>{{ $t('ownerDetailOweFee.paymentNotice') }}</span>
  28 + </el-col>
  29 + <el-col :span="12" class="text-right">
  30 + <el-pagination @current-change="handleCurrentChange" :current-page="pagination.currentPage"
  31 + :page-size="pagination.pageSize" :total="pagination.total" layout="prev, pager, next, jumper">
  32 + </el-pagination>
  33 + </el-col>
  34 + </el-row>
  35 + </div>
  36 + </div>
  37 +</template>
  38 +
  39 +<script>
  40 +import { queryReportOweFee } from '@/api/fee/listOweFeeApi'
  41 +import { getCommunityId } from '@/api/community/communityApi'
  42 +
  43 +export default {
  44 + name: 'OwnerDetailOweFee',
  45 + data() {
  46 + return {
  47 + ownerDetailOweFeeInfo: {
  48 + fees: [],
  49 + ownerId: ''
  50 + },
  51 + pagination: {
  52 + currentPage: 1,
  53 + pageSize: 10,
  54 + total: 0
  55 + }
  56 + }
  57 + },
  58 + created() {
  59 + this.communityId = getCommunityId()
  60 + },
  61 + methods: {
  62 + switch(data) {
  63 + this.ownerDetailOweFeeInfo.ownerId = data.ownerId
  64 + this._loadOwnerDetailOweFeeData(1, this.pagination.pageSize)
  65 + },
  66 + handleCurrentChange(val) {
  67 + this.pagination.currentPage = val
  68 + this._loadOwnerDetailOweFeeData(val, this.pagination.pageSize)
  69 + },
  70 + _loadOwnerDetailOweFeeData(page, row) {
  71 + const params = {
  72 + communityId: this.communityId,
  73 + ownerId: this.ownerDetailOweFeeInfo.ownerId,
  74 + page: page,
  75 + row: row
  76 + }
  77 +
  78 + queryReportOweFee(params).then(response => {
  79 + this.ownerDetailOweFeeInfo.fees = response.data
  80 + this.pagination.total = response.records
  81 + }).catch(error => {
  82 + console.error('请求失败处理', error)
  83 + })
  84 + },
  85 + _openBatchPayRoomFeeModal() {
  86 + this.$router.push(`/views/fee/batchPayFeeOrder?ownerId=${this.ownerDetailOweFeeInfo.ownerId}&payerObjType=3333`)
  87 + },
  88 + }
  89 +}
  90 +</script>
  91 +
  92 +<style scoped>
  93 +.margin-top {
  94 + margin-top: 20px;
  95 +}
  96 +
  97 +.margin-top-lg {
  98 + margin-top: 30px;
  99 +}
  100 +
  101 +.text-right {
  102 + text-align: right;
  103 +}
  104 +</style>
0 \ No newline at end of file 105 \ No newline at end of file
src/components/fee/carCreateFeeAdd.vue
1 <template> 1 <template>
2 - <el-dialog :title="$t('carCreateFeeAdd.createFee')" :visible.sync="visible" width="50%" @close="handleClose"> 2 + <el-dialog :title="$t('carCreateFeeAdd.createFee')" :visible.sync="visible" width="40%" @close="handleClose">
3 <el-form :model="form" label-width="150px" ref="form"> 3 <el-form :model="form" label-width="150px" ref="form">
4 <el-form-item v-if="isMore" :label="$t('carCreateFeeAdd.chargeScope')" prop="locationTypeCd" 4 <el-form-item v-if="isMore" :label="$t('carCreateFeeAdd.chargeScope')" prop="locationTypeCd"
5 :rules="[{ required: true, message: $t('carCreateFeeAdd.requiredChargeScope') }]"> 5 :rules="[{ required: true, message: $t('carCreateFeeAdd.requiredChargeScope') }]">
@@ -13,7 +13,8 @@ @@ -13,7 +13,8 @@
13 <el-input v-model="form.locationTypeCdName" disabled :placeholder="$t('carCreateFeeAdd.requiredChargeScope')" /> 13 <el-input v-model="form.locationTypeCdName" disabled :placeholder="$t('carCreateFeeAdd.requiredChargeScope')" />
14 </el-form-item> 14 </el-form-item>
15 15
16 - <el-form-item v-if="form.locationTypeCd === '3000' && isMore" :label="$t('carCreateFeeAdd.parkingLot')" prop="paId"> 16 + <el-form-item v-if="form.locationTypeCd === '3000' && isMore" :label="$t('carCreateFeeAdd.parkingLot')"
  17 + prop="paId">
17 <parking-area-select2 @change="handleParkingAreaChange" /> 18 <parking-area-select2 @change="handleParkingAreaChange" />
18 </el-form-item> 19 </el-form-item>
19 20
@@ -194,4 +195,9 @@ export default { @@ -194,4 +195,9 @@ export default {
194 } 195 }
195 } 196 }
196 } 197 }
197 -</script>  
198 \ No newline at end of file 198 \ No newline at end of file
  199 +</script>
  200 +<style scoped>
  201 +.el-form-item {
  202 + width: 90%;
  203 +}
  204 +</style>
199 \ No newline at end of file 205 \ No newline at end of file
src/components/fee/feeDetailHisFee.vue
@@ -101,7 +101,7 @@ export default { @@ -101,7 +101,7 @@ export default {
101 this._loadFeeDetailHisFeeData() 101 this._loadFeeDetailHisFeeData()
102 }, 102 },
103 _toRefundFee(detail) { 103 _toRefundFee(detail) {
104 - this.$router.push(`/pages/property/propertyFee?feeId=${detail.feeId}`) 104 + this.$router.push(`/views/fee/propertyFee?feeId=${detail.feeId}`)
105 }, 105 },
106 dateFormat(date) { 106 dateFormat(date) {
107 return this.$moment(date).format('YYYY-MM-DD') 107 return this.$moment(date).format('YYYY-MM-DD')
src/components/fee/simplifyRefundDeposit.vue
@@ -105,7 +105,7 @@ export default { @@ -105,7 +105,7 @@ export default {
105 this.$router.push(`/pages/fee/refundDepositFee?roomId=${roomId}`) 105 this.$router.push(`/pages/fee/refundDepositFee?roomId=${roomId}`)
106 }, 106 },
107 _toSimplifyFeeDepositFeeDetail(fee) { 107 _toSimplifyFeeDepositFeeDetail(fee) {
108 - this.$router.push(`/pages/property/propertyFee?feeId=${fee.feeId}`) 108 + this.$router.push(`/views/fee/propertyFee?feeId=${fee.feeId}`)
109 }, 109 },
110 switchData(param) { 110 switchData(param) {
111 if (!param.roomId) return 111 if (!param.roomId) return
src/components/owner/ownerDetailHisFee.vue
@@ -109,7 +109,7 @@ export default { @@ -109,7 +109,7 @@ export default {
109 } 109 }
110 }, 110 },
111 _toRefundFee(detail) { 111 _toRefundFee(detail) {
112 - this.$router.push(`/pages/property/propertyFee?feeId=${detail.feeId}`) 112 + this.$router.push(`/views/fee/propertyFee?feeId=${detail.feeId}`)
113 }, 113 },
114 handleCurrentChange(val) { 114 handleCurrentChange(val) {
115 this.currentPage = val 115 this.currentPage = val
src/components/owner/ownerDetailRoomFee.vue
@@ -227,7 +227,7 @@ export default { @@ -227,7 +227,7 @@ export default {
227 this.$emit('editFee', fee) 227 this.$emit('editFee', fee)
228 }, 228 },
229 _payRoomFeeHis(fee) { 229 _payRoomFeeHis(fee) {
230 - this.$router.push(`/property/propertyFee?${this.objToGetParam(fee)}`) 230 + this.$router.push(`/views/fee/propertyFee?${this.objToGetParam(fee)}`)
231 }, 231 },
232 _deleteRoomFee(fee) { 232 _deleteRoomFee(fee) {
233 this.$emit('deleteFee', { 233 this.$emit('deleteFee', {
@@ -247,7 +247,7 @@ export default { @@ -247,7 +247,7 @@ export default {
247 this.$message.warning(this.$t('ownerDetailRoomFee.selectRoom')) 247 this.$message.warning(this.$t('ownerDetailRoomFee.selectRoom'))
248 return 248 return
249 } 249 }
250 - this.$router.push(`/property/owePayFeeOrder?payObjId=${_ids.join(',')}&payObjType=3333&roomName=`) 250 + this.$router.push(`/views/fee/owePayFeeOrder?payObjId=${_ids.join(',')}&payObjType=3333&roomName=`)
251 }, 251 },
252 _printOwnOrder() { 252 _printOwnOrder() {
253 const _ids = this.ownerDetailRoomFeeInfo.payerObjIds 253 const _ids = this.ownerDetailRoomFeeInfo.payerObjIds
src/components/property/deleteParkingSpaceApply.vue 0 → 100644
  1 +<template>
  2 + <el-dialog :title="$t('deleteParkingSpaceApply.title')" :visible.sync="visible" width="30%">
  3 + <span>{{ $t('deleteParkingSpaceApply.confirmDelete') }}</span>
  4 + <span slot="footer" class="dialog-footer">
  5 + <el-button @click="visible = false">{{ $t('common.cancel') }}</el-button>
  6 + <el-button type="primary" @click="handleConfirm">{{ $t('common.confirm') }}</el-button>
  7 + </span>
  8 + </el-dialog>
  9 +</template>
  10 +
  11 +<script>
  12 +import { deleteParkingSpaceApply } from '@/api/property/deleteParkingSpaceApplyApi'
  13 +
  14 +export default {
  15 + name: 'DeleteParkingSpaceApply',
  16 + data() {
  17 + return {
  18 + visible: false,
  19 + applyId: ''
  20 + }
  21 + },
  22 + methods: {
  23 + open(data) {
  24 + this.applyId = data.applyId
  25 + this.visible = true
  26 + },
  27 + handleConfirm() {
  28 + deleteParkingSpaceApply({ applyId: this.applyId }).then(response => {
  29 + console.log(response)
  30 + this.$message.success(this.$t('deleteParkingSpaceApply.deleteSuccess'))
  31 + this.visible = false
  32 + this.$emit('refresh')
  33 + }).catch(error => {
  34 + this.$message.error(error.message)
  35 + })
  36 + }
  37 + }
  38 +}
  39 +</script>
0 \ No newline at end of file 40 \ No newline at end of file
src/components/property/editMachineTranslate.vue 0 → 100644
  1 +<template>
  2 + <el-dialog :title="$t('editMachineTranslate.title')" :visible.sync="visible" width="50%">
  3 + <el-form :model="form" label-width="120px">
  4 + <el-form-item :label="$t('editMachineTranslate.machineCode')">
  5 + <el-input v-model="form.machineCode" disabled></el-input>
  6 + </el-form-item>
  7 + <el-form-item :label="$t('editMachineTranslate.objectType')">
  8 + <el-input v-model="form.typeCdName" disabled></el-input>
  9 + </el-form-item>
  10 + <el-form-item :label="$t('editMachineTranslate.objectName')">
  11 + <el-input v-model="form.objName" disabled></el-input>
  12 + </el-form-item>
  13 + <el-form-item :label="$t('editMachineTranslate.remark')">
  14 + <el-input type="textarea" v-model="form.remark"></el-input>
  15 + </el-form-item>
  16 + </el-form>
  17 + <span slot="footer" class="dialog-footer">
  18 + <el-button @click="visible = false">{{$t('common.cancel')}}</el-button>
  19 + <el-button type="primary" @click="handleSubmit">{{$t('common.confirm')}}</el-button>
  20 + </span>
  21 + </el-dialog>
  22 +</template>
  23 +
  24 +<script>
  25 +import { resyncMachineTranslate } from '@/api/property/editMachineTranslateApi'
  26 +
  27 +export default {
  28 + name: 'EditMachineTranslate',
  29 + data() {
  30 + return {
  31 + visible: false,
  32 + form: {
  33 + machineTranslateId: '',
  34 + machineCode: '',
  35 + typeCdName: '',
  36 + objName: '',
  37 + remark: ''
  38 + }
  39 + }
  40 + },
  41 + methods: {
  42 + open(data) {
  43 + this.form = {
  44 + machineTranslateId: data.machineTranslateId,
  45 + machineCode: data.machineCode,
  46 + typeCdName: data.typeCdName,
  47 + objName: data.objName,
  48 + remark: data.remark || ''
  49 + }
  50 + this.visible = true
  51 + },
  52 + handleSubmit() {
  53 + resyncMachineTranslate(this.form).then(response => {
  54 + console.log(response)
  55 + this.$message.success(this.$t('editMachineTranslate.resyncSuccess'))
  56 + this.visible = false
  57 + this.$emit('refresh')
  58 + }).catch(error => {
  59 + this.$message.error(error.message)
  60 + })
  61 + }
  62 + }
  63 +}
  64 +</script>
0 \ No newline at end of file 65 \ No newline at end of file
src/components/property/editParkingSpaceApply.vue 0 → 100644
  1 +<template>
  2 + <el-dialog :title="$t('editParkingSpaceApply.title')" :visible.sync="visible" width="50%">
  3 + <el-form :model="form" label-width="120px">
  4 + <el-form-item :label="$t('editParkingSpaceApply.carNum')">
  5 + <el-input v-model="form.carNum" disabled></el-input>
  6 + </el-form-item>
  7 + <el-form-item :label="$t('editParkingSpaceApply.carBrand')">
  8 + <el-input v-model="form.carBrand"></el-input>
  9 + </el-form-item>
  10 + <el-form-item :label="$t('editParkingSpaceApply.carType')">
  11 + <el-select v-model="form.carType" style="width:100%">
  12 + <el-option v-for="item in carTypes" :key="item.value" :label="item.label" :value="item.value">
  13 + </el-option>
  14 + </el-select>
  15 + </el-form-item>
  16 + <el-form-item :label="$t('editParkingSpaceApply.carColor')">
  17 + <el-input v-model="form.carColor"></el-input>
  18 + </el-form-item>
  19 + <el-form-item :label="$t('editParkingSpaceApply.startTime')">
  20 + <el-date-picker v-model="form.startTime" type="datetime" style="width:100%" value-format="yyyy-MM-dd HH:mm:ss">
  21 + </el-date-picker>
  22 + </el-form-item>
  23 + <el-form-item :label="$t('editParkingSpaceApply.endTime')">
  24 + <el-date-picker v-model="form.endTime" type="datetime" style="width:100%" value-format="yyyy-MM-dd HH:mm:ss">
  25 + </el-date-picker>
  26 + </el-form-item>
  27 + <el-form-item :label="$t('editParkingSpaceApply.remark')">
  28 + <el-input type="textarea" v-model="form.remark"></el-input>
  29 + </el-form-item>
  30 + </el-form>
  31 + <span slot="footer" class="dialog-footer">
  32 + <el-button @click="visible = false">{{ $t('common.cancel') }}</el-button>
  33 + <el-button type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</el-button>
  34 + </span>
  35 + </el-dialog>
  36 +</template>
  37 +
  38 +<script>
  39 +import { updateParkingSpaceApply } from '@/api/property/editParkingSpaceApplyApi'
  40 +import { getDict } from '@/api/community/communityApi'
  41 +
  42 +export default {
  43 + name: 'EditParkingSpaceApply',
  44 + data() {
  45 + return {
  46 + visible: false,
  47 + carTypes: [],
  48 + form: {
  49 + applyId: '',
  50 + carNum: '',
  51 + carBrand: '',
  52 + carType: '',
  53 + carColor: '',
  54 + startTime: '',
  55 + endTime: '',
  56 + remark: ''
  57 + }
  58 + }
  59 + },
  60 + created() {
  61 + this.getCarTypes()
  62 + },
  63 + methods: {
  64 + getCarTypes() {
  65 + getDict('car_type').then(response => {
  66 + this.carTypes = response.data.map(item => ({
  67 + value: item.code,
  68 + label: item.name
  69 + }))
  70 + })
  71 + },
  72 + open(data) {
  73 + this.form = {
  74 + applyId: data.applyId,
  75 + carNum: data.carNum,
  76 + carBrand: data.carBrand,
  77 + carType: data.carType,
  78 + carColor: data.carColor,
  79 + startTime: data.startTime,
  80 + endTime: data.endTime,
  81 + remark: data.remark || ''
  82 + }
  83 + this.visible = true
  84 + },
  85 + handleSubmit() {
  86 + updateParkingSpaceApply(this.form).then(response => {
  87 + console.log(response)
  88 + this.$message.success(this.$t('editParkingSpaceApply.updateSuccess'))
  89 + this.visible = false
  90 + this.$emit('refresh')
  91 + }).catch(error => {
  92 + this.$message.error(error.message)
  93 + })
  94 + }
  95 + }
  96 +}
  97 +</script>
0 \ No newline at end of file 98 \ No newline at end of file
src/components/simplify/simplifyCarFee.vue
@@ -265,7 +265,7 @@ export default { @@ -265,7 +265,7 @@ export default {
265 this.$router.push(`/views/fee/payFeeOrderfeeId=${fee.feeId}`) 265 this.$router.push(`/views/fee/payFeeOrderfeeId=${fee.feeId}`)
266 }, 266 },
267 _simplifyCarPayFeeHis(fee) { 267 _simplifyCarPayFeeHis(fee) {
268 - this.$router.push(`/pages/property/propertyFee?${this.objToGetParam(fee)}`) 268 + this.$router.push(`/views/fee/propertyFee?${this.objToGetParam(fee)}`)
269 }, 269 },
270 _simplifyCarEditFee(fee) { 270 _simplifyCarEditFee(fee) {
271 this.$emit('editFee', fee) 271 this.$emit('editFee', fee)
src/components/simplify/simplifyOwnerCar.vue
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 border> 15 border>
16 <el-table-column :label="$t('simplifyOwnerCar.plateNumber')" align="center"> 16 <el-table-column :label="$t('simplifyOwnerCar.plateNumber')" align="center">
17 <template #default="{row}"> 17 <template #default="{row}">
18 - <router-link :to="`/pages/car/carDetail?memberId=${row.memberId}`" target="_blank"> 18 + <router-link :to="`/views/car/carDetail?memberId=${row.memberId}`" target="_blank">
19 {{row.carNum}} 19 {{row.carNum}}
20 </router-link> 20 </router-link>
21 </template> 21 </template>
src/i18n/carI18n.js
@@ -14,6 +14,7 @@ import { messages as tempCarPaymentMessages } from &#39;../views/car/tempCarPaymentL @@ -14,6 +14,7 @@ import { messages as tempCarPaymentMessages } from &#39;../views/car/tempCarPaymentL
14 import { messages as parkingSpaceApplyManageMessages } from '../views/car/parkingSpaceApplyManageLang' 14 import { messages as parkingSpaceApplyManageMessages } from '../views/car/parkingSpaceApplyManageLang'
15 import { messages as addParkingSpaceApplyMessages } from '../views/car/addParkingSpaceApplyLang' 15 import { messages as addParkingSpaceApplyMessages } from '../views/car/addParkingSpaceApplyLang'
16 import { messages as auditParkingSpaceApplyMessages } from '../views/car/auditParkingSpaceApplyLang' 16 import { messages as auditParkingSpaceApplyMessages } from '../views/car/auditParkingSpaceApplyLang'
  17 +import { messages as carDetailMessages } from '../views/car/carDetailLang.js'
17 18
18 export const messages = { 19 export const messages = {
19 en: { 20 en: {
@@ -33,6 +34,7 @@ export const messages = { @@ -33,6 +34,7 @@ export const messages = {
33 ...parkingSpaceApplyManageMessages.en, 34 ...parkingSpaceApplyManageMessages.en,
34 ...addParkingSpaceApplyMessages.en, 35 ...addParkingSpaceApplyMessages.en,
35 ...auditParkingSpaceApplyMessages.en, 36 ...auditParkingSpaceApplyMessages.en,
  37 + ...carDetailMessages.en,
36 }, 38 },
37 zh: { 39 zh: {
38 ...adminCarMessages.zh, 40 ...adminCarMessages.zh,
@@ -51,5 +53,6 @@ export const messages = { @@ -51,5 +53,6 @@ export const messages = {
51 ...parkingSpaceApplyManageMessages.zh, 53 ...parkingSpaceApplyManageMessages.zh,
52 ...addParkingSpaceApplyMessages.zh, 54 ...addParkingSpaceApplyMessages.zh,
53 ...auditParkingSpaceApplyMessages.zh, 55 ...auditParkingSpaceApplyMessages.zh,
  56 + ...carDetailMessages.zh,
54 } 57 }
55 } 58 }
56 \ No newline at end of file 59 \ No newline at end of file
src/router/carRouter.js
@@ -79,5 +79,10 @@ export default [ @@ -79,5 +79,10 @@ export default [
79 name: '/views/car/auditParkingSpaceApply', 79 name: '/views/car/auditParkingSpaceApply',
80 component: () => import('@/views/car/auditParkingSpaceApply.vue') 80 component: () => import('@/views/car/auditParkingSpaceApply.vue')
81 }, 81 },
  82 + {
  83 + path:'/views/car/carDetail',
  84 + name:'/views/car/carDetail',
  85 + component: () => import('@/views/car/carDetail.vue')
  86 + },
82 87
83 ] 88 ]
84 \ No newline at end of file 89 \ No newline at end of file
src/views/car/carDetail.vue 0 → 100644
  1 +<template>
  2 + <div class="car-detail-container">
  3 + <div class="white-bg padding-left padding-right padding-top border-radius-top">
  4 + <el-row type="flex" justify="space-between">
  5 + <div class="text-title">
  6 + {{ $t('carDetail.vehicleInfo') }}
  7 + </div>
  8 + <div>
  9 + <el-button type="primary" size="small" style="margin-left:10px" v-if="hasPrivilege('502023032804261679')"
  10 + @click="_openEditDetailOwnerCar()">
  11 + {{ $t('common.edit') }}
  12 + </el-button>
  13 + </div>
  14 + </el-row>
  15 +
  16 + <!-- Vehicle Information -->
  17 + <div class="margin-top">
  18 + <el-form class="text-left">
  19 + <el-row :gutter="20">
  20 + <el-col :span="6">
  21 + <el-form-item :label="$t('carDetail.licensePlate')">
  22 + <label>{{ carDetailInfo.carNum || '-' }}</label>
  23 + </el-form-item>
  24 + </el-col>
  25 + <el-col :span="6">
  26 + <el-form-item :label="$t('carDetail.carBrand')">
  27 + <label>{{ carDetailInfo.carBrand || '-' }}</label>
  28 + </el-form-item>
  29 + </el-col>
  30 + <el-col :span="6">
  31 + <el-form-item :label="$t('carDetail.carType')">
  32 + <label>{{ carDetailInfo.leaseTypeName || '-' }}</label>
  33 + </el-form-item>
  34 + </el-col>
  35 + <el-col :span="6">
  36 + <el-form-item :label="$t('carDetail.color')">
  37 + <label>{{ carDetailInfo.carColor || '-' }}</label>
  38 + </el-form-item>
  39 + </el-col>
  40 + </el-row>
  41 +
  42 + <el-row :gutter="20">
  43 + <el-col :span="6">
  44 + <el-form-item :label="$t('carDetail.licenseType')">
  45 + <label>{{ carDetailInfo.carTypeName || '-' }}</label>
  46 + </el-form-item>
  47 + </el-col>
  48 + <el-col :span="6">
  49 + <el-form-item :label="$t('carDetail.leaseStart')">
  50 + <label>{{ carDetailInfo.startTime || '-' }}</label>
  51 + </el-form-item>
  52 + </el-col>
  53 + <el-col :span="6">
  54 + <el-form-item :label="$t('carDetail.leaseEnd')">
  55 + <label>{{ carDetailInfo.endTime || '-' }}</label>
  56 + </el-form-item>
  57 + </el-col>
  58 + <el-col :span="6">
  59 + <el-form-item :label="$t('carDetail.remark')">
  60 + <label>{{ carDetailInfo.remark || '-' }}</label>
  61 + </el-form-item>
  62 + </el-col>
  63 + </el-row>
  64 +
  65 + <el-row :gutter="20">
  66 + <el-col :span="6">
  67 + <el-form-item :label="$t('carDetail.parkingLot')">
  68 + <label>{{ carDetailInfo.areaNum || '-' }}</label>
  69 + </el-form-item>
  70 + </el-col>
  71 + <el-col :span="6">
  72 + <el-form-item :label="$t('carDetail.parkingSpace')">
  73 + <label>{{ carDetailInfo.num || '-' }}</label>
  74 + </el-form-item>
  75 + </el-col>
  76 + <el-col :span="6">
  77 + <el-form-item :label="$t('carDetail.status')">
  78 + <label>{{ carDetailInfo.stateName || '-' }}</label>
  79 + </el-form-item>
  80 + </el-col>
  81 + <el-col :span="6">
  82 + <el-form-item :label="$t('carDetail.relatedHouse')">
  83 + <label>{{ carDetailInfo.roomName || '-' }}</label>
  84 + </el-form-item>
  85 + </el-col>
  86 + </el-row>
  87 + </el-form>
  88 + </div>
  89 +
  90 + <divider/>
  91 +
  92 + <div class="margin-top-sm">
  93 + <el-tabs v-model="carDetailInfo._currentTab" @tab-click="changeTab(carDetailInfo._currentTab)">
  94 + <el-tab-pane :label="$t('carDetail.vehicleFee')" name="carDetailFee"></el-tab-pane>
  95 + <el-tab-pane :label="$t('carDetail.paymentRecord')" name="ownerDetailHisFee"></el-tab-pane>
  96 + <el-tab-pane :label="$t('carDetail.modificationRecord')" name="carDetailHis"></el-tab-pane>
  97 + <el-tab-pane :label="$t('carDetail.memberVehicle')" name="carDetailMember"></el-tab-pane>
  98 + <el-tab-pane :label="$t('carDetail.ownerInfo')" name="carDetailOwner"></el-tab-pane>
  99 + <el-tab-pane :label="$t('carDetail.ownerHouse')" name="ownerDetailRoom"></el-tab-pane>
  100 + <el-tab-pane :label="$t('carDetail.ownerVehicle')" name="ownerDetailCar"></el-tab-pane>
  101 + <el-tab-pane :label="$t('carDetail.ownerArrears')" name="ownerDetailOweFee"></el-tab-pane>
  102 + <el-tab-pane :label="$t('carDetail.licenseSync')" name="carDetailTransactionCar"></el-tab-pane>
  103 + <el-tab-pane :label="$t('carDetail.parkingApplication')" name="carDetailApplyParkingSpace"></el-tab-pane>
  104 + <el-tab-pane :label="$t('carDetail.accessRecord')" name="carDetailCarInout"></el-tab-pane>
  105 + <el-tab-pane :label="$t('carDetail.coupon')" name="carDetailCoupon"></el-tab-pane>
  106 + <el-tab-pane :label="$t('carDetail.couponVerification')" name="carDetailCouponOrder"></el-tab-pane>
  107 + </el-tabs>
  108 + </div>
  109 + </div>
  110 +
  111 + <div class="white-bg padding-left padding-right padding-top border-radius-bottom">
  112 + <car-detail-fee v-if="carDetailInfo._currentTab === 'carDetailFee'" ref="carDetailFee"></car-detail-fee>
  113 + <owner-detail-room v-if="carDetailInfo._currentTab === 'ownerDetailRoom'"
  114 + ref="ownerDetailRoom"></owner-detail-room>
  115 + <owner-detail-car v-if="carDetailInfo._currentTab === 'ownerDetailCar'" ref="ownerDetailCar"></owner-detail-car>
  116 + <owner-detail-owe-fee v-if="carDetailInfo._currentTab === 'ownerDetailOweFee'"
  117 + ref="ownerDetailOweFee"></owner-detail-owe-fee>
  118 + <owner-detail-his-fee v-if="carDetailInfo._currentTab === 'ownerDetailHisFee'"
  119 + ref="ownerDetailHisFee"></owner-detail-his-fee>
  120 + <car-detail-his v-if="carDetailInfo._currentTab === 'carDetailHis'" ref="carDetailHis"></car-detail-his>
  121 + <car-detail-member v-if="carDetailInfo._currentTab === 'carDetailMember'"
  122 + ref="carDetailMember"></car-detail-member>
  123 + <car-detail-owner v-if="carDetailInfo._currentTab === 'carDetailOwner'" ref="carDetailOwner"></car-detail-owner>
  124 + <car-detail-transaction-car v-if="carDetailInfo._currentTab === 'carDetailTransactionCar'"
  125 + ref="carDetailTransactionCar"></car-detail-transaction-car>
  126 + <car-detail-apply-parking-space v-if="carDetailInfo._currentTab === 'carDetailApplyParkingSpace'"
  127 + ref="carDetailApplyParkingSpace"></car-detail-apply-parking-space>
  128 + <car-detail-car-inout v-if="carDetailInfo._currentTab === 'carDetailCarInout'"
  129 + ref="carDetailCarInout"></car-detail-car-inout>
  130 + <car-detail-coupon v-if="carDetailInfo._currentTab === 'carDetailCoupon'"
  131 + ref="carDetailCoupon"></car-detail-coupon>
  132 + <car-detail-coupon-order v-if="carDetailInfo._currentTab === 'carDetailCouponOrder'"
  133 + ref="carDetailCouponOrder"></car-detail-coupon-order>
  134 + </div>
  135 +
  136 + <edit-car ref="editCar"></edit-car>
  137 + </div>
  138 +</template>
  139 +
  140 +<script>
  141 +import CarDetailFee from '@/components/car/carDetailFee'
  142 +import OwnerDetailRoom from '@/components/owner/ownerDetailRoom'
  143 +import OwnerDetailCar from '@/components/owner/ownerDetailCar'
  144 +import OwnerDetailOweFee from '@/components/car/ownerDetailOweFee'
  145 +import OwnerDetailHisFee from '@/components/owner/ownerDetailHisFee'
  146 +import CarDetailHis from '@/components/system/carDetailHis'
  147 +import CarDetailMember from '@/components/car/carDetailMember'
  148 +import CarDetailOwner from '@/components/fee/carDetailOwner'
  149 +import CarDetailTransactionCar from '@/components/car/carDetailTransactionCar'
  150 +import CarDetailApplyParkingSpace from '@/components/car/carDetailApplyParkingSpace'
  151 +import CarDetailCarInout from '@/components/car/carDetailCarInout'
  152 +import CarDetailCoupon from '@/components/car/carDetailCoupon'
  153 +import CarDetailCouponOrder from '@/components/car/carDetailCouponOrder'
  154 +import EditCar from '@/components/car/editCar'
  155 +import { getCommunityId } from '@/api/community/communityApi'
  156 +import { getOwnerCarDetail } from '@/api/car/carDetailApi'
  157 +import Divider from '@/components/system/divider'
  158 +
  159 +export default {
  160 + name: 'CarDetail',
  161 + components: {
  162 + CarDetailFee,
  163 + OwnerDetailRoom,
  164 + OwnerDetailCar,
  165 + OwnerDetailOweFee,
  166 + OwnerDetailHisFee,
  167 + CarDetailHis,
  168 + CarDetailMember,
  169 + CarDetailOwner,
  170 + CarDetailTransactionCar,
  171 + CarDetailApplyParkingSpace,
  172 + CarDetailCarInout,
  173 + CarDetailCoupon,
  174 + CarDetailCouponOrder,
  175 + EditCar,
  176 + Divider
  177 + },
  178 + data() {
  179 + return {
  180 + carDetailInfo: {
  181 + memberId: '',
  182 + carId: '',
  183 + carNum: '',
  184 + carTypeCd: '',
  185 + carTypeCdName: '',
  186 + carType: '',
  187 + carTypeName: '',
  188 + startTime: '',
  189 + endTime: '',
  190 + leaseType: '',
  191 + leaseTypeName: '',
  192 + areaNum: '',
  193 + num: '',
  194 + remark: '',
  195 + stateName: '',
  196 + carColor: '',
  197 + carBrand: '',
  198 + ownerId: '',
  199 + roomName: '',
  200 + carNumType: '',
  201 + paId: '',
  202 + _currentTab: 'carDetailFee',
  203 + needBack: false
  204 + },
  205 + communityId: ''
  206 + }
  207 + },
  208 + created() {
  209 + this.communityId = getCommunityId()
  210 + this.carDetailInfo.memberId = this.$route.query.memberId
  211 + if (this.carDetailInfo.memberId) {
  212 + this._loadCarDetailInfo()
  213 + }
  214 + },
  215 + methods: {
  216 + _loadCarDetailInfo() {
  217 + const params = {
  218 + page: 1,
  219 + row: 1,
  220 + memberId: this.carDetailInfo.memberId,
  221 + communityId: this.communityId
  222 + }
  223 +
  224 + getOwnerCarDetail(params)
  225 + .then(response => {
  226 + const carInfo = response.data[0]
  227 + Object.assign(this.carDetailInfo, carInfo)
  228 + this.changeTab(this.carDetailInfo._currentTab)
  229 + })
  230 + .catch(error => {
  231 + console.error('Failed to load car detail:', error)
  232 + })
  233 + },
  234 + changeTab(tab) {
  235 + this.carDetailInfo._currentTab = tab
  236 + const tabData = {
  237 + memberId: this.carDetailInfo.memberId,
  238 + carId: this.carDetailInfo.carId,
  239 + ownerId: this.carDetailInfo.ownerId,
  240 + carNum: this.carDetailInfo.carNum,
  241 + paId: this.carDetailInfo.paId,
  242 + areaNum: this.carDetailInfo.areaNum
  243 + }
  244 + setTimeout(() => {
  245 + if (this.$refs[tab]) {
  246 + if(tab === 'ownerDetailHisFee'){
  247 + this.$refs[tab].open(this.carDetailInfo.ownerId)
  248 + }else{
  249 + this.$refs[tab].open(tabData)
  250 + }
  251 + }
  252 + }, 100)
  253 +
  254 + },
  255 + _openEditDetailOwnerCar() {
  256 + this.$refs.editCar.open(this.carDetailInfo)
  257 + },
  258 + }
  259 +}
  260 +</script>
  261 +
  262 +<style scoped>
  263 +.white-bg {
  264 + background: #fff;
  265 +}
  266 +
  267 +.padding-left {
  268 + padding-left: 20px;
  269 +}
  270 +
  271 +.padding-right {
  272 + padding-right: 20px;
  273 +}
  274 +
  275 +.padding-top {
  276 + padding-top: 20px;
  277 +}
  278 +
  279 +.border-radius-top {
  280 + border-radius: 4px 4px 0 0;
  281 +}
  282 +
  283 +.border-radius-bottom {
  284 + border-radius: 0 0 4px 4px;
  285 +}
  286 +
  287 +.margin-top {
  288 + margin-top: 20px;
  289 +}
  290 +
  291 +.margin-top-sm {
  292 + margin-top: 10px;
  293 +}
  294 +
  295 +.text-title {
  296 + font-size: 18px;
  297 + font-weight: bold;
  298 +}
  299 +</style>
0 \ No newline at end of file 300 \ No newline at end of file
src/views/car/carDetailApplyParkingSpaceLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + carDetailApplyParkingSpace: {
  4 + applyParkingSpace: 'Apply Parking Space',
  5 + applyId: 'Apply ID',
  6 + carNum: 'Car Number',
  7 + parkingSpace: 'Parking Space',
  8 + none: 'None',
  9 + carBrand: 'Car Brand',
  10 + carType: 'Car Type',
  11 + color: 'Color',
  12 + startTime: 'Start Time',
  13 + endTime: 'End Time',
  14 + applicant: 'Applicant',
  15 + phone: 'Phone',
  16 + auditResult: 'Audit Result',
  17 + operation: 'Operation',
  18 + audit: 'Audit',
  19 + edit: 'Edit',
  20 + delete: 'Delete',
  21 + pendingReview: 'Pending Review',
  22 + pendingPayment: 'Pending Payment',
  23 + completed: 'Completed',
  24 + auditFailed: 'Audit Failed',
  25 + abnormalStatus: 'Abnormal Status',
  26 + familyCar: 'Family Car',
  27 + bus: 'Bus',
  28 + truck: 'Truck',
  29 + abnormalVehicle: 'Abnormal Vehicle'
  30 + }
  31 + },
  32 + zh: {
  33 + carDetailApplyParkingSpace: {
  34 + applyParkingSpace: '申请车位',
  35 + applyId: '申请ID',
  36 + carNum: '车牌号',
  37 + parkingSpace: '停车位',
  38 + none: '无',
  39 + carBrand: '汽车品牌',
  40 + carType: '车辆类型',
  41 + color: '颜色',
  42 + startTime: '起租时间',
  43 + endTime: '结租时间',
  44 + applicant: '申请人',
  45 + phone: '手机号',
  46 + auditResult: '审核结果',
  47 + operation: '操作',
  48 + audit: '审核',
  49 + edit: '修改',
  50 + delete: '删除',
  51 + pendingReview: '待审核',
  52 + pendingPayment: '待缴费',
  53 + completed: '完成',
  54 + auditFailed: '审核失败',
  55 + abnormalStatus: '状态异常',
  56 + familyCar: '家用小汽车',
  57 + bus: '客车',
  58 + truck: '货车',
  59 + abnormalVehicle: '异常车辆'
  60 + }
  61 + }
  62 +}
0 \ No newline at end of file 63 \ No newline at end of file
src/views/car/carDetailCarInoutLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + carDetailCarInout: {
  4 + entryImage: 'Entry Image',
  5 + inoutId: 'Inout ID',
  6 + carStatus: 'Car Status',
  7 + entry: 'Entry',
  8 + exit: 'Exit',
  9 + carNum: 'Car Number',
  10 + parkingLot: 'Parking Lot',
  11 + billingRule: 'Billing Rule',
  12 + carType: 'Car Type',
  13 + entryTime: 'Entry Time',
  14 + exitTime: 'Exit Time',
  15 + parkingTime: 'Parking Time',
  16 + hour: 'hour',
  17 + minute: 'minute',
  18 + chargeAmount: 'Charge Amount',
  19 + remark: 'Remark'
  20 + }
  21 + },
  22 + zh: {
  23 + carDetailCarInout: {
  24 + entryImage: '进场图',
  25 + inoutId: '进出场编号',
  26 + carStatus: '车辆状态',
  27 + entry: '进场',
  28 + exit: '出场',
  29 + carNum: '车牌号',
  30 + parkingLot: '停车场',
  31 + billingRule: '计费规则',
  32 + carType: '车牌类型',
  33 + entryTime: '进场时间',
  34 + exitTime: '出场时间',
  35 + parkingTime: '停车时间',
  36 + hour: '小时',
  37 + minute: '分',
  38 + chargeAmount: '收费金额',
  39 + remark: '说明'
  40 + }
  41 + }
  42 +}
0 \ No newline at end of file 43 \ No newline at end of file
src/views/car/carDetailCouponLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + carDetailCoupon: {
  4 + car: 'Car',
  5 + coupon: 'Coupon',
  6 + shop: 'Shop',
  7 + parkingLot: 'Parking Lot',
  8 + giveWay: 'Give Way',
  9 + couponType: 'Coupon Type',
  10 + value: 'Value',
  11 + startTime: 'Start Time',
  12 + endTime: 'End Time',
  13 + giveTime: 'Give Time',
  14 + status: 'Status',
  15 + remark: 'Remark'
  16 + }
  17 + },
  18 + zh: {
  19 + carDetailCoupon: {
  20 + car: '车辆',
  21 + coupon: '优惠券',
  22 + shop: '商家店铺',
  23 + parkingLot: '停车场',
  24 + giveWay: '赠送方式',
  25 + couponType: '优惠方式',
  26 + value: '面值',
  27 + startTime: '开始时间',
  28 + endTime: '结束时间',
  29 + giveTime: '赠送时间',
  30 + status: '状态',
  31 + remark: '说明'
  32 + }
  33 + }
  34 +}
0 \ No newline at end of file 35 \ No newline at end of file
src/views/car/carDetailCouponOrderLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + carDetailCouponOrder: {
  4 + orderId: 'Order ID',
  5 + carNum: 'Car Number',
  6 + coupon: 'Coupon',
  7 + shop: 'Shop',
  8 + parkingLot: 'Parking Lot',
  9 + machine: 'Machine',
  10 + verifyTime: 'Verify Time',
  11 + remark: 'Remark'
  12 + }
  13 + },
  14 + zh: {
  15 + carDetailCouponOrder: {
  16 + orderId: '核销订单',
  17 + carNum: '核销车辆',
  18 + coupon: '优惠券',
  19 + shop: '商家店铺',
  20 + parkingLot: '停车场',
  21 + machine: '道闸',
  22 + verifyTime: '核销时间',
  23 + remark: '说明'
  24 + }
  25 + }
  26 +}
0 \ No newline at end of file 27 \ No newline at end of file
src/views/car/carDetailFeeLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + carDetailFee: {
  4 + createFee: 'Create Fee',
  5 + feeItem: 'Fee Item',
  6 + feeFlag: 'Fee Flag',
  7 + feeType: 'Fee Type',
  8 + amountReceivable: 'Amount Receivable',
  9 + accountingTime: 'Accounting Time',
  10 + receivablePeriod: 'Receivable Period',
  11 + remark: 'Remark',
  12 + status: 'Status',
  13 + operation: 'Operation',
  14 + previousReading: 'Previous Reading',
  15 + currentReading: 'Current Reading',
  16 + unitPrice: 'Unit Price',
  17 + additionalFee: 'Additional Fee',
  18 + fixedFee: 'Fixed Fee',
  19 + payment: 'Payment',
  20 + history: 'History',
  21 + cancel: 'Cancel',
  22 + change: 'Change',
  23 + detail: 'Detail',
  24 + paymentNotice: 'Please go to the business acceptance page for payment'
  25 + }
  26 + },
  27 + zh: {
  28 + carDetailFee: {
  29 + createFee: '创建费用',
  30 + feeItem: '费用项目',
  31 + feeFlag: '费用标识',
  32 + feeType: '费用类型',
  33 + amountReceivable: '应收金额',
  34 + accountingTime: '建账时间',
  35 + receivablePeriod: '应收时间段',
  36 + remark: '说明',
  37 + status: '状态',
  38 + operation: '操作',
  39 + previousReading: '上期度数',
  40 + currentReading: '本期度数',
  41 + unitPrice: '单价',
  42 + additionalFee: '附加费',
  43 + fixedFee: '固定费',
  44 + payment: '缴费',
  45 + history: '历史',
  46 + cancel: '取消',
  47 + change: '变更',
  48 + detail: '详情',
  49 + paymentNotice: '缴费请到业务受理页面缴费'
  50 + }
  51 + }
  52 +}
0 \ No newline at end of file 53 \ No newline at end of file
src/views/car/carDetailLang.js 0 → 100644
  1 +
  2 +export const messages = {
  3 + en: {
  4 + carDetail: {
  5 + vehicleInfo: 'Vehicle Information',
  6 + licensePlate: 'License Plate:',
  7 + carBrand: 'Car Brand:',
  8 + carType: 'Car Type:',
  9 + color: 'Color:',
  10 + licenseType: 'License Type:',
  11 + leaseStart: 'Lease Start:',
  12 + leaseEnd: 'Lease End:',
  13 + remark: 'Remark:',
  14 + parkingLot: 'Parking Lot:',
  15 + parkingSpace: 'Parking Space:',
  16 + status: 'Status:',
  17 + relatedHouse: 'Related House:',
  18 + vehicleFee: 'Vehicle Fee',
  19 + paymentRecord: 'Payment Record',
  20 + modificationRecord: 'Modification Record',
  21 + memberVehicle: 'Member Vehicle',
  22 + ownerInfo: 'Owner Info',
  23 + ownerHouse: 'Owner House',
  24 + ownerVehicle: 'Owner Vehicle',
  25 + ownerArrears: 'Owner Arrears',
  26 + licenseSync: 'License Sync',
  27 + parkingApplication: 'Parking Application',
  28 + accessRecord: 'Access Record',
  29 + coupon: 'Coupon',
  30 + couponVerification: 'Coupon Verification'
  31 + },
  32 + carDetailFee: {
  33 + createFee: 'Create Fee',
  34 + feeItem: 'Fee Item',
  35 + feeFlag: 'Fee Flag',
  36 + feeType: 'Fee Type',
  37 + amountReceivable: 'Amount Receivable',
  38 + accountingTime: 'Accounting Time',
  39 + receivablePeriod: 'Receivable Period',
  40 + remark: 'Remark',
  41 + status: 'Status',
  42 + operation: 'Operation',
  43 + previousReading: 'Previous Reading',
  44 + currentReading: 'Current Reading',
  45 + unitPrice: 'Unit Price',
  46 + additionalFee: 'Additional Fee',
  47 + fixedFee: 'Fixed Fee',
  48 + payment: 'Payment',
  49 + history: 'History',
  50 + cancel: 'Cancel',
  51 + change: 'Change',
  52 + detail: 'Detail',
  53 + paymentNotice: 'Please go to the business acceptance page for payment'
  54 + },
  55 + carDetailTransactionCar: {
  56 + syncId: 'Sync ID',
  57 + deviceCode: 'Device Code',
  58 + objectType: 'Object Type',
  59 + objectName: 'Object Name',
  60 + command: 'Command',
  61 + status: 'Status',
  62 + remark: 'Remark',
  63 + syncTime: 'Sync Time',
  64 + operation: 'Operation',
  65 + resync: 'Resync'
  66 + },
  67 + carDetailApplyParkingSpace: {
  68 + applyParkingSpace: 'Apply Parking Space',
  69 + applyId: 'Apply ID',
  70 + carNum: 'Car Number',
  71 + parkingSpace: 'Parking Space',
  72 + none: 'None',
  73 + carBrand: 'Car Brand',
  74 + carType: 'Car Type',
  75 + color: 'Color',
  76 + startTime: 'Start Time',
  77 + endTime: 'End Time',
  78 + applicant: 'Applicant',
  79 + phone: 'Phone',
  80 + auditResult: 'Audit Result',
  81 + operation: 'Operation',
  82 + audit: 'Audit',
  83 + edit: 'Edit',
  84 + delete: 'Delete',
  85 + pendingReview: 'Pending Review',
  86 + pendingPayment: 'Pending Payment',
  87 + completed: 'Completed',
  88 + auditFailed: 'Audit Failed',
  89 + abnormalStatus: 'Abnormal Status',
  90 + familyCar: 'Family Car',
  91 + bus: 'Bus',
  92 + truck: 'Truck',
  93 + abnormalVehicle: 'Abnormal Vehicle'
  94 + },
  95 + carDetailCarInout: {
  96 + entryImage: 'Entry Image',
  97 + inoutId: 'Inout ID',
  98 + carStatus: 'Car Status',
  99 + entry: 'Entry',
  100 + exit: 'Exit',
  101 + carNum: 'Car Number',
  102 + parkingLot: 'Parking Lot',
  103 + billingRule: 'Billing Rule',
  104 + carType: 'Car Type',
  105 + entryTime: 'Entry Time',
  106 + exitTime: 'Exit Time',
  107 + parkingTime: 'Parking Time',
  108 + hour: 'hour',
  109 + minute: 'minute',
  110 + chargeAmount: 'Charge Amount',
  111 + remark: 'Remark'
  112 + },
  113 + carDetailCoupon: {
  114 + car: 'Car',
  115 + coupon: 'Coupon',
  116 + shop: 'Shop',
  117 + parkingLot: 'Parking Lot',
  118 + giveWay: 'Give Way',
  119 + couponType: 'Coupon Type',
  120 + value: 'Value',
  121 + startTime: 'Start Time',
  122 + endTime: 'End Time',
  123 + giveTime: 'Give Time',
  124 + status: 'Status',
  125 + remark: 'Remark'
  126 + },
  127 + carDetailCouponOrder: {
  128 + orderId: 'Order ID',
  129 + carNum: 'Car Number',
  130 + coupon: 'Coupon',
  131 + shop: 'Shop',
  132 + parkingLot: 'Parking Lot',
  133 + machine: 'Machine',
  134 + verifyTime: 'Verify Time',
  135 + remark: 'Remark'
  136 + }
  137 + },
  138 + zh: {
  139 + carDetail: {
  140 + vehicleInfo: '车辆信息',
  141 + licensePlate: '车牌号:',
  142 + carBrand: '车品牌:',
  143 + carType: '车类型:',
  144 + color: '颜色:',
  145 + licenseType: '车牌类型:',
  146 + leaseStart: '起租时间:',
  147 + leaseEnd: '结租时间:',
  148 + remark: '备注:',
  149 + parkingLot: '停车场:',
  150 + parkingSpace: '车位:',
  151 + status: '状态:',
  152 + relatedHouse: '关联房屋:',
  153 + vehicleFee: '车辆费用',
  154 + paymentRecord: '缴费记录',
  155 + modificationRecord: '修改记录',
  156 + memberVehicle: '成员车辆',
  157 + ownerInfo: '业主信息',
  158 + ownerHouse: '业主房屋',
  159 + ownerVehicle: '业主车辆',
  160 + ownerArrears: '业主欠费',
  161 + licenseSync: '车牌同步',
  162 + parkingApplication: '车位申请',
  163 + accessRecord: '出入场记录',
  164 + coupon: '优惠券',
  165 + couponVerification: '优惠券核销'
  166 + },
  167 + carDetailFee: {
  168 + createFee: '创建费用',
  169 + feeItem: '费用项目',
  170 + feeFlag: '费用标识',
  171 + feeType: '费用类型',
  172 + amountReceivable: '应收金额',
  173 + accountingTime: '建账时间',
  174 + receivablePeriod: '应收时间段',
  175 + remark: '说明',
  176 + status: '状态',
  177 + operation: '操作',
  178 + previousReading: '上期度数',
  179 + currentReading: '本期度数',
  180 + unitPrice: '单价',
  181 + additionalFee: '附加费',
  182 + fixedFee: '固定费',
  183 + payment: '缴费',
  184 + history: '历史',
  185 + cancel: '取消',
  186 + change: '变更',
  187 + detail: '详情',
  188 + paymentNotice: '缴费请到业务受理页面缴费'
  189 + },
  190 + carDetailTransactionCar: {
  191 + syncId: '同步ID',
  192 + deviceCode: '设备编码',
  193 + objectType: '对象类型',
  194 + objectName: '对象名称',
  195 + command: '指令',
  196 + status: '状态',
  197 + remark: '说明',
  198 + syncTime: '同步时间',
  199 + operation: '操作',
  200 + resync: '重新同步'
  201 + },
  202 + carDetailApplyParkingSpace: {
  203 + applyParkingSpace: '申请车位',
  204 + applyId: '申请ID',
  205 + carNum: '车牌号',
  206 + parkingSpace: '停车位',
  207 + none: '无',
  208 + carBrand: '汽车品牌',
  209 + carType: '车辆类型',
  210 + color: '颜色',
  211 + startTime: '起租时间',
  212 + endTime: '结租时间',
  213 + applicant: '申请人',
  214 + phone: '手机号',
  215 + auditResult: '审核结果',
  216 + operation: '操作',
  217 + audit: '审核',
  218 + edit: '修改',
  219 + delete: '删除',
  220 + pendingReview: '待审核',
  221 + pendingPayment: '待缴费',
  222 + completed: '完成',
  223 + auditFailed: '审核失败',
  224 + abnormalStatus: '状态异常',
  225 + familyCar: '家用小汽车',
  226 + bus: '客车',
  227 + truck: '货车',
  228 + abnormalVehicle: '异常车辆'
  229 + },
  230 + carDetailCarInout: {
  231 + entryImage: '进场图',
  232 + inoutId: '进出场编号',
  233 + carStatus: '车辆状态',
  234 + entry: '进场',
  235 + exit: '出场',
  236 + carNum: '车牌号',
  237 + parkingLot: '停车场',
  238 + billingRule: '计费规则',
  239 + carType: '车牌类型',
  240 + entryTime: '进场时间',
  241 + exitTime: '出场时间',
  242 + parkingTime: '停车时间',
  243 + hour: '小时',
  244 + minute: '分',
  245 + chargeAmount: '收费金额',
  246 + remark: '说明'
  247 + },
  248 + carDetailCoupon: {
  249 + car: '车辆',
  250 + coupon: '优惠券',
  251 + shop: '商家店铺',
  252 + parkingLot: '停车场',
  253 + giveWay: '赠送方式',
  254 + couponType: '优惠方式',
  255 + value: '面值',
  256 + startTime: '开始时间',
  257 + endTime: '结束时间',
  258 + giveTime: '赠送时间',
  259 + status: '状态',
  260 + remark: '说明'
  261 + },
  262 + carDetailCouponOrder: {
  263 + orderId: '核销订单',
  264 + carNum: '核销车辆',
  265 + coupon: '优惠券',
  266 + shop: '商家店铺',
  267 + parkingLot: '停车场',
  268 + machine: '道闸',
  269 + verifyTime: '核销时间',
  270 + remark: '说明'
  271 + }
  272 + }
  273 +}
src/views/car/carDetailTransactionCarLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + carDetailTransactionCar: {
  4 + syncId: 'Sync ID',
  5 + deviceCode: 'Device Code',
  6 + objectType: 'Object Type',
  7 + objectName: 'Object Name',
  8 + command: 'Command',
  9 + status: 'Status',
  10 + remark: 'Remark',
  11 + syncTime: 'Sync Time',
  12 + operation: 'Operation',
  13 + resync: 'Resync'
  14 + }
  15 + },
  16 + zh: {
  17 + carDetailTransactionCar: {
  18 + syncId: '同步ID',
  19 + deviceCode: '设备编码',
  20 + objectType: '对象类型',
  21 + objectName: '对象名称',
  22 + command: '指令',
  23 + status: '状态',
  24 + remark: '说明',
  25 + syncTime: '同步时间',
  26 + operation: '操作',
  27 + resync: '重新同步'
  28 + }
  29 + }
  30 +}
0 \ No newline at end of file 31 \ No newline at end of file
src/views/car/listOwnerCarList.vue
@@ -72,7 +72,7 @@ @@ -72,7 +72,7 @@
72 <el-table :data="ownerCars" border v-loading="loading"> 72 <el-table :data="ownerCars" border v-loading="loading">
73 <el-table-column prop="carNum" :label="$t('listOwnerCar.carNum')" align="center"> 73 <el-table-column prop="carNum" :label="$t('listOwnerCar.carNum')" align="center">
74 <template slot-scope="scope"> 74 <template slot-scope="scope">
75 - <router-link :to="`/pages/car/carDetail?memberId=${scope.row.memberId}`" target="_blank"> 75 + <router-link :to="`/views/car/carDetail?memberId=${scope.row.memberId}`" target="_blank">
76 {{ scope.row.carNum }} 76 {{ scope.row.carNum }}
77 </router-link> 77 </router-link>
78 </template> 78 </template>
src/views/common/commonLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + common: {
  4 + cancel: 'Cancel',
  5 + confirm: 'Confirm'
  6 + }
  7 + },
  8 + zh: {
  9 + common: {
  10 + cancel: '取消',
  11 + confirm: '确定'
  12 + }
  13 + }
  14 +}
0 \ No newline at end of file 15 \ No newline at end of file
src/views/fee/buyCarMonthCardList.vue
1 <template> 1 <template>
2 <el-card class="buy-car-month-card-container"> 2 <el-card class="buy-car-month-card-container">
3 - <div slot="header">  
4 - <h5>{{ $t('buyCarMonthCard.title') }}</h5> 3 + <div slot="header" class="flex justify-between">
  4 + <div>{{ $t('buyCarMonthCard.title') }}</div>
5 </div> 5 </div>
6 6
7 - <el-form ref="form" :model="buyCarMonthCardInfo" label-width="120px"> 7 + <el-form ref="form" :model="buyCarMonthCardInfo" label-width="120px" class="text-left">
8 <el-form-item :label="$t('buyCarMonthCard.carNum')" prop="carNum" 8 <el-form-item :label="$t('buyCarMonthCard.carNum')" prop="carNum"
9 :rules="[{ required: true, message: $t('buyCarMonthCard.rules.carNumRequired'), trigger: 'blur' }]"> 9 :rules="[{ required: true, message: $t('buyCarMonthCard.rules.carNumRequired'), trigger: 'blur' }]">
10 <el-input v-model="buyCarMonthCardInfo.carNum" :placeholder="$t('buyCarMonthCard.placeholders.carNum')" 10 <el-input v-model="buyCarMonthCardInfo.carNum" :placeholder="$t('buyCarMonthCard.placeholders.carNum')"
@@ -51,7 +51,7 @@ @@ -51,7 +51,7 @@
51 </el-input> 51 </el-input>
52 </el-form-item> 52 </el-form-item>
53 53
54 - <el-form-item> 54 + <el-form-item class="text-right">
55 <el-button type="primary" @click="saveCarMonthOrderInfo"> 55 <el-button type="primary" @click="saveCarMonthOrderInfo">
56 <i class="el-icon-check"></i>{{ $t('common.submit') }} 56 <i class="el-icon-check"></i>{{ $t('common.submit') }}
57 </el-button> 57 </el-button>
src/views/fee/contractCreateFeeList.vue
@@ -216,7 +216,7 @@ export default { @@ -216,7 +216,7 @@ export default {
216 }, 216 },
217 handlePayFee(row) { 217 handlePayFee(row) {
218 this.$router.push({ 218 this.$router.push({
219 - path: '/property/owePayFeeOrder', 219 + path: '/views/fee/owePayFeeOrder',
220 query: { 220 query: {
221 payObjId: row.contractId, 221 payObjId: row.contractId,
222 payObjType: '7777', 222 payObjType: '7777',
src/views/fee/listCarFeeList.vue
@@ -191,7 +191,7 @@ export default { @@ -191,7 +191,7 @@ export default {
191 this.$router.push({ path: '/views/fee/payFeeOrder', query: { feeId: fee.feeId } }) 191 this.$router.push({ path: '/views/fee/payFeeOrder', query: { feeId: fee.feeId } })
192 }, 192 },
193 _payFeeHis(fee) { 193 _payFeeHis(fee) {
194 - this.$router.push({ path: '/property/propertyFee', query: fee }) 194 + this.$router.push({ path: '/views/fee/propertyFee', query: fee })
195 }, 195 },
196 _editFee(fee) { 196 _editFee(fee) {
197 this.$refs.editFee.open(fee) 197 this.$refs.editFee.open(fee)
@@ -240,7 +240,7 @@ export default { @@ -240,7 +240,7 @@ export default {
240 }, 240 },
241 _viewCarFee(fee) { 241 _viewCarFee(fee) {
242 // 查看费用详情逻辑 242 // 查看费用详情逻辑
243 - console.log(fee) 243 + window.open(`/#/views/fee/feeDetail?feeId=${fee.feeId}`)
244 244
245 }, 245 },
246 _splitPayFee(fee) { 246 _splitPayFee(fee) {
src/views/fee/refundDepositFeeList.vue
@@ -121,7 +121,7 @@ export default { @@ -121,7 +121,7 @@ export default {
121 this.listFeeDeposit() 121 this.listFeeDeposit()
122 }, 122 },
123 toFeeDetail(fee) { 123 toFeeDetail(fee) {
124 - this.$router.push(`/pages/property/propertyFee?feeId=${fee.feeId}`) 124 + this.$router.push(`/views/fee/propertyFee?feeId=${fee.feeId}`)
125 }, 125 },
126 printRefundFeeReceipt() { 126 printRefundFeeReceipt() {
127 window.open(`/#/views/owner/ownerDetail?ownerId=${this.refundDepositFeeInfo.ownerId}&currentTab=ownerDetailReceipt`) 127 window.open(`/#/views/owner/ownerDetail?ownerId=${this.refundDepositFeeInfo.ownerId}&currentTab=ownerDetailReceipt`)
src/views/fee/returnPayFeeManageList.vue
@@ -289,7 +289,7 @@ export default { @@ -289,7 +289,7 @@ export default {
289 } 289 }
290 }, 290 },
291 _toReturnFeeDetail(payFee) { 291 _toReturnFeeDetail(payFee) {
292 - this.$router.push(`/pages/property/propertyFee?feeId=${payFee.feeId}`) 292 + this.$router.push(`/views/fee/propertyFee?feeId=${payFee.feeId}`)
293 }, 293 },
294 notifyAuditInfo(auditInfo) { 294 notifyAuditInfo(auditInfo) {
295 this._auditReturnPayFeeState(auditInfo) 295 this._auditReturnPayFeeState(auditInfo)
src/views/property/deleteParkingSpaceApplyLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + deleteParkingSpaceApply: {
  4 + title: 'Delete Application',
  5 + confirmDelete: 'Are you sure to delete this application?',
  6 + deleteSuccess: 'Delete successfully'
  7 + }
  8 + },
  9 + zh: {
  10 + deleteParkingSpaceApply: {
  11 + title: '删除申请',
  12 + confirmDelete: '确定要删除此申请吗?',
  13 + deleteSuccess: '删除成功'
  14 + }
  15 + }
  16 +}
0 \ No newline at end of file 17 \ No newline at end of file
src/views/property/editMachineTranslateLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + editMachineTranslate: {
  4 + title: 'Resync Device',
  5 + machineCode: 'Device Code',
  6 + objectType: 'Object Type',
  7 + objectName: 'Object Name',
  8 + remark: 'Remark',
  9 + resyncSuccess: 'Resync successfully'
  10 + }
  11 + },
  12 + zh: {
  13 + editMachineTranslate: {
  14 + title: '重新同步设备',
  15 + machineCode: '设备编码',
  16 + objectType: '对象类型',
  17 + objectName: '对象名称',
  18 + remark: '说明',
  19 + resyncSuccess: '重新同步成功'
  20 + }
  21 + }
  22 +}
0 \ No newline at end of file 23 \ No newline at end of file
src/views/property/editParkingSpaceApplyLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + editParkingSpaceApply: {
  4 + title: 'Edit Parking Space Application',
  5 + carNum: 'Car Number',
  6 + carBrand: 'Car Brand',
  7 + carType: 'Car Type',
  8 + carColor: 'Color',
  9 + startTime: 'Start Time',
  10 + endTime: 'End Time',
  11 + remark: 'Remark',
  12 + updateSuccess: 'Update successfully'
  13 + }
  14 + },
  15 + zh: {
  16 + editParkingSpaceApply: {
  17 + title: '修改车位申请',
  18 + carNum: '车牌号',
  19 + carBrand: '汽车品牌',
  20 + carType: '车辆类型',
  21 + carColor: '颜色',
  22 + startTime: '起租时间',
  23 + endTime: '结租时间',
  24 + remark: '说明',
  25 + updateSuccess: '修改成功'
  26 + }
  27 + }
  28 +}
0 \ No newline at end of file 29 \ No newline at end of file
src/views/report/reportPayFeeDepositList.vue
@@ -397,7 +397,7 @@ export default { @@ -397,7 +397,7 @@ export default {
397 } 397 }
398 }, 398 },
399 openPayFeeDetail(fee) { 399 openPayFeeDetail(fee) {
400 - this.$router.push(`/pages/property/propertyFee?feeId=${fee.feeId}`) 400 + this.$router.push(`/views/fee/propertyFee?feeId=${fee.feeId}`)
401 } 401 }
402 } 402 }
403 } 403 }