Commit 35a00c34068f415659b4a8af6924890e7a512a9f

Authored by wuxw
1 parent 83338dbe

支持车辆改业主功能

src/api/owner/ownerApi.js
@@ -85,6 +85,27 @@ export function deleteOwner(data) { @@ -85,6 +85,27 @@ export function deleteOwner(data) {
85 }) 85 })
86 } 86 }
87 87
  88 +// 修改车辆所属业主
  89 +export function changeCarOwner(data) {
  90 + return new Promise((resolve, reject) => {
  91 + data.communityId = getCommunityId()
  92 + request({
  93 + url: '/owner.changeCarOwner',
  94 + method: 'post',
  95 + data
  96 + }).then(response => {
  97 + const res = response.data
  98 + if (res.code == 0) {
  99 + resolve(res)
  100 + } else {
  101 + reject(new Error(res.msg || '修改车辆业主失败'))
  102 + }
  103 + }).catch(error => {
  104 + reject(error)
  105 + })
  106 + })
  107 +}
  108 +
88 // 上传图片 109 // 上传图片
89 export function uploadImage(data) { 110 export function uploadImage(data) {
90 return new Promise((resolve, reject) => { 111 return new Promise((resolve, reject) => {
src/components/car/changeOwnerDialog.vue 0 → 100644
  1 +<template>
  2 + <el-dialog
  3 + :title="$t('listOwnerCar.changeOwner')"
  4 + :visible.sync="visible"
  5 + width="800px"
  6 + :close-on-click-modal="false"
  7 + @close="handleClose"
  8 + >
  9 + <div>
  10 + <el-form inline>
  11 + <el-form-item :label="$t('listOwnerCar.ownerName')">
  12 + <el-input
  13 + v-model.trim="searchForm.ownerName"
  14 + :placeholder="$t('listOwnerCar.inputOwnerName')"
  15 + clearable
  16 + style="width: 220px"
  17 + />
  18 + </el-form-item>
  19 + <el-form-item>
  20 + <el-button type="primary" @click="handleQuery">
  21 + {{ $t('listOwnerCar.query') }}
  22 + </el-button>
  23 + </el-form-item>
  24 + </el-form>
  25 +
  26 + <el-table
  27 + class="mt-10"
  28 + :data="ownerList"
  29 + border
  30 + v-loading="loading"
  31 + height="400px"
  32 + >
  33 + <el-table-column :label="$t('listOwnerCar.select')" width="80" align="center">
  34 + <template slot-scope="scope">
  35 + <el-radio v-model="selectedOwnerId" :label="scope.row.ownerId">
  36 + &nbsp;
  37 + </el-radio>
  38 + </template>
  39 + </el-table-column>
  40 + <el-table-column prop="name" :label="$t('listOwnerCar.ownerName')" align="center" />
  41 + <el-table-column prop="link" :label="$t('listOwnerCar.phoneNumber')" align="center" />
  42 + </el-table>
  43 +
  44 + <el-pagination
  45 + class="mt-10"
  46 + :current-page="currentPage"
  47 + :page-size="pageSize"
  48 + :page-sizes="[10, 20, 30, 50]"
  49 + layout="total, sizes, prev, pager, next, jumper"
  50 + :total="total"
  51 + @size-change="handleSizeChange"
  52 + @current-change="handleCurrentChange"
  53 + />
  54 + </div>
  55 +
  56 + <span slot="footer" class="dialog-footer">
  57 + <el-button @click="visible = false">{{ $t('listOwnerCar.cancel') }}</el-button>
  58 + <el-button type="primary" @click="handleConfirm">{{ $t('listOwnerCar.confirm') }}</el-button>
  59 + </span>
  60 + </el-dialog>
  61 +</template>
  62 +
  63 +<script>
  64 +import { queryOwners, changeCarOwner } from '@/api/owner/ownerApi'
  65 +
  66 +export default {
  67 + name: 'ChangeOwnerDialog',
  68 + data() {
  69 + return {
  70 + visible: false,
  71 + currentCar: null,
  72 + searchForm: {
  73 + ownerName: ''
  74 + },
  75 + ownerList: [],
  76 + loading: false,
  77 + selectedOwnerId: '',
  78 + currentPage: 1,
  79 + pageSize: 10,
  80 + total: 0
  81 + }
  82 + },
  83 + methods: {
  84 + open(car) {
  85 + this.currentCar = car
  86 + this.visible = true
  87 + this.selectedOwnerId = ''
  88 + this.searchForm.ownerName = ''
  89 + this.ownerList = []
  90 + this.currentPage = 1
  91 + this.total = 0
  92 + this.handleQuery()
  93 + },
  94 +
  95 + async handleQuery() {
  96 + this.loading = true
  97 + try {
  98 + const params = {
  99 + name: this.searchForm.ownerName || '',
  100 + page: this.currentPage,
  101 + row: this.pageSize,
  102 + personRole: '', // 如需只查业主,可传 '1'
  103 + roomName: '',
  104 + link: '',
  105 + idCard: '',
  106 + personType: ''
  107 + }
  108 + const res = await queryOwners(params)
  109 + // res.data 为后端返回的业主列表
  110 + this.ownerList = res.data || []
  111 + this.total = res.total || 0
  112 + } catch (error) {
  113 + console.error('查询业主列表失败:', error)
  114 + this.$message.error(this.$t('listOwnerCar.changeOwnerQueryFailed'))
  115 + } finally {
  116 + this.loading = false
  117 + }
  118 + },
  119 +
  120 + handleSizeChange(val) {
  121 + this.pageSize = val
  122 + this.currentPage = 1
  123 + this.handleQuery()
  124 + },
  125 +
  126 + handleCurrentChange(val) {
  127 + this.currentPage = val
  128 + this.handleQuery()
  129 + },
  130 +
  131 + async handleConfirm() {
  132 + if (!this.selectedOwnerId) {
  133 + this.$message.warning(this.$t('listOwnerCar.changeOwnerSelectTip'))
  134 + return
  135 + }
  136 + try {
  137 + const payload = {
  138 + memberId: this.currentCar.memberId,
  139 + newOwnerId: this.selectedOwnerId
  140 + }
  141 + await changeCarOwner(payload)
  142 + this.$message.success(this.$t('common.operationSuccess'))
  143 + this.visible = false
  144 + this.$emit('success')
  145 + } catch (error) {
  146 + console.error('修改业主失败:', error)
  147 + this.$message.error(this.$t('listOwnerCar.changeOwnerFailed'))
  148 + }
  149 + },
  150 +
  151 + handleClose() {
  152 + this.currentCar = null
  153 + this.selectedOwnerId = ''
  154 + this.searchForm.ownerName = ''
  155 + this.ownerList = []
  156 + this.currentPage = 1
  157 + this.total = 0
  158 + }
  159 + }
  160 +}
  161 +</script>
  162 +
src/views/car/listOwnerCarLang.js
@@ -88,6 +88,14 @@ export const messages = { @@ -88,6 +88,14 @@ export const messages = {
88 iotSyncDetail: 'IoT sync details', 88 iotSyncDetail: 'IoT sync details',
89 confirmRelease: 'Are you sure to release the car?', 89 confirmRelease: 'Are you sure to release the car?',
90 parkingLot: 'Parking Lot', 90 parkingLot: 'Parking Lot',
  91 + changeOwner: 'Change Owner',
  92 + ownerName: 'Owner Name',
  93 + phoneNumber: 'Phone Number',
  94 + select: 'Select',
  95 + changeOwnerQueryFailed: 'Failed to query owner list, please try again later',
  96 + changeOwnerSelectTip: 'Please select an owner first',
  97 + changeOwnerTodoTip: 'The change owner operation will be completed after backend API is ready',
  98 + changeOwnerFailed: 'Failed to change owner, please try again later',
91 } 99 }
92 }, 100 },
93 zh: { 101 zh: {
@@ -179,6 +187,14 @@ export const messages = { @@ -179,6 +187,14 @@ export const messages = {
179 iotSyncDetail: '同步物联网详情', 187 iotSyncDetail: '同步物联网详情',
180 confirmRelease: '确认释放车辆?', 188 confirmRelease: '确认释放车辆?',
181 parkingLot: '车场', 189 parkingLot: '车场',
  190 + changeOwner: '修改业主',
  191 + ownerName: '业主名称',
  192 + phoneNumber: '手机号',
  193 + select: '选择',
  194 + changeOwnerQueryFailed: '查询业主列表失败,请稍后重试',
  195 + changeOwnerSelectTip: '请先选择业主',
  196 + changeOwnerTodoTip: '后端接口开发完成后,将在此完成修改业主操作',
  197 + changeOwnerFailed: '修改业主失败,请稍后重试',
182 } 198 }
183 } 199 }
184 } 200 }
185 \ No newline at end of file 201 \ No newline at end of file
src/views/car/listOwnerCarList.vue
1 -<template> 1 +<template>
2 <div class="list-owner-car-container"> 2 <div class="list-owner-car-container">
3 <el-row :gutter="20"> 3 <el-row :gutter="20">
4 <el-col :span="3"> 4 <el-col :span="3">
@@ -131,7 +131,7 @@ @@ -131,7 +131,7 @@
131 </template> 131 </template>
132 </el-table-column> 132 </el-table-column>
133 <el-table-column prop="remark" :label="$t('listOwnerCar.remark')" align="center" /> 133 <el-table-column prop="remark" :label="$t('listOwnerCar.remark')" align="center" />
134 - <el-table-column :label="$t('listOwnerCar.operation')" align="center" width="280"> 134 + <el-table-column :label="$t('listOwnerCar.operation')" align="center" width="360">
135 <template slot-scope="scope"> 135 <template slot-scope="scope">
136 <el-button v-if="scope.row.state !== '3003' && hasPrivilege('502023032855861676')" size="mini" 136 <el-button v-if="scope.row.state !== '3003' && hasPrivilege('502023032855861676')" size="mini"
137 @click="deleteCarParkingSpace(scope.row)"> 137 @click="deleteCarParkingSpace(scope.row)">
@@ -148,6 +148,9 @@ @@ -148,6 +148,9 @@
148 @click="openEditOwnerCar(scope.row)"> 148 @click="openEditOwnerCar(scope.row)">
149 {{ $t('listOwnerCar.modify') }} 149 {{ $t('listOwnerCar.modify') }}
150 </el-button> 150 </el-button>
  151 + <el-button size="mini" type="primary" @click="openChangeOwnerDialog(scope.row)">
  152 + {{ $t('listOwnerCar.changeOwner') }}
  153 + </el-button>
151 <el-button v-if="hasPrivilege('502023032822121680')" size="mini" type="danger" 154 <el-button v-if="hasPrivilege('502023032822121680')" size="mini" type="danger"
152 @click="openDelOwnerCarModel(scope.row)"> 155 @click="openDelOwnerCarModel(scope.row)">
153 {{ $t('listOwnerCar.delete') }} 156 {{ $t('listOwnerCar.delete') }}
@@ -166,6 +169,7 @@ @@ -166,6 +169,7 @@
166 <import-owner-car ref="importOwnerCar" @success="listOwnerCarData" /> 169 <import-owner-car ref="importOwnerCar" @success="listOwnerCarData" />
167 <edit-car ref="editCar" @success="listOwnerCarData" /> 170 <edit-car ref="editCar" @success="listOwnerCarData" />
168 <delete-owner-car ref="deleteOwnerCar" @success="listOwnerCarData" /> 171 <delete-owner-car ref="deleteOwnerCar" @success="listOwnerCarData" />
  172 + <change-owner-dialog ref="changeOwnerDialog" @success="listOwnerCarData" />
169 </div> 173 </div>
170 </template> 174 </template>
171 175
@@ -174,13 +178,14 @@ import { queryOwnerCars, exportData, deleteCarParkingSpace } from &#39;@/api/car/lis @@ -174,13 +178,14 @@ import { queryOwnerCars, exportData, deleteCarParkingSpace } from &#39;@/api/car/lis
174 import ImportOwnerCar from '@/components/car/importOwnerCar' 178 import ImportOwnerCar from '@/components/car/importOwnerCar'
175 import EditCar from '@/components/car/editCar' 179 import EditCar from '@/components/car/editCar'
176 import DeleteOwnerCar from '@/components/car/deleteOwnerCar' 180 import DeleteOwnerCar from '@/components/car/deleteOwnerCar'
  181 +import ChangeOwnerDialog from '@/components/car/changeOwnerDialog'
177 import { getDict } from '@/api/community/communityApi' 182 import { getDict } from '@/api/community/communityApi'
178 import { getCommunityId } from '@/api/community/communityApi' 183 import { getCommunityId } from '@/api/community/communityApi'
179 184
180 185
181 export default { 186 export default {
182 name: 'ListOwnerCar', 187 name: 'ListOwnerCar',
183 - components: { ImportOwnerCar, EditCar, DeleteOwnerCar }, 188 + components: { ImportOwnerCar, EditCar, DeleteOwnerCar, ChangeOwnerDialog },
184 data() { 189 data() {
185 return { 190 return {
186 loading: false, 191 loading: false,
@@ -319,6 +324,10 @@ export default { @@ -319,6 +324,10 @@ export default {
319 this.$router.push(`/views/car/carDetail?memberId=${car.carId}&tab=carDetailMember`) 324 this.$router.push(`/views/car/carDetail?memberId=${car.carId}&tab=carDetailMember`)
320 }, 325 },
321 326
  327 + openChangeOwnerDialog(car) {
  328 + this.$refs.changeOwnerDialog.open(car)
  329 + },
  330 +
322 getCarState(car) { 331 getCarState(car) {
323 if (car.state === '3003') { 332 if (car.state === '3003') {
324 return this.$t('listOwnerCar.expired') 333 return this.$t('listOwnerCar.expired')