Commit b012d770c7ab3ef57104ca512b9ff8afcd5829cf

Authored by wuxw
1 parent d53a0384

v1.9 测试停车功能,页面功能优化

src/components/car/carDetailFee.vue
@@ -89,8 +89,8 @@ @@ -89,8 +89,8 @@
89 </el-row> 89 </el-row>
90 </div> 90 </div>
91 91
92 - <add-meter-water ref="addMeterWater"></add-meter-water>  
93 - <car-create-fee-add ref="carCreateFeeAdd"></car-create-fee-add> 92 + <add-meter-water ref="addMeterWater" @success="notify"></add-meter-water>
  93 + <car-create-fee-add ref="carCreateFeeAdd" @success="notify"></car-create-fee-add>
94 <delete-fee ref="deleteFee"></delete-fee> 94 <delete-fee ref="deleteFee"></delete-fee>
95 <edit-fee ref="editFee"></edit-fee> 95 <edit-fee ref="editFee"></edit-fee>
96 </div> 96 </div>
src/views/car/auditParkingSpaceApply.vue
@@ -65,23 +65,24 @@ @@ -65,23 +65,24 @@
65 </el-card> 65 </el-card>
66 66
67 <el-card class="box-card" style="margin-top: 20px;"> 67 <el-card class="box-card" style="margin-top: 20px;">
68 - <div slot="header" class="clearfix"> 68 + <div slot="header" class="flex justify-between">
69 <span>{{ $t('auditParkingSpaceApply.auditInfo') }}</span> 69 <span>{{ $t('auditParkingSpaceApply.auditInfo') }}</span>
70 </div> 70 </div>
71 71
72 <el-form ref="form" :model="formData" label-width="120px"> 72 <el-form ref="form" :model="formData" label-width="120px">
73 <el-form-item :label="$t('auditParkingSpaceApply.startRentTime')" required> 73 <el-form-item :label="$t('auditParkingSpaceApply.startRentTime')" required>
74 - <el-date-picker v-model="formData.startTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" :placeholder="$t('auditParkingSpaceApply.requiredField')"  
75 - style="width: 100%;" /> 74 + <el-date-picker v-model="formData.startTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
  75 + :placeholder="$t('auditParkingSpaceApply.requiredField')" style="width: 100%;" />
76 </el-form-item> 76 </el-form-item>
77 77
78 <el-form-item :label="$t('auditParkingSpaceApply.endRentTime')" required> 78 <el-form-item :label="$t('auditParkingSpaceApply.endRentTime')" required>
79 - <el-date-picker v-model="formData.endTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" :placeholder="$t('auditParkingSpaceApply.requiredField')"  
80 - style="width: 100%;" /> 79 + <el-date-picker v-model="formData.endTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
  80 + :placeholder="$t('auditParkingSpaceApply.requiredField')" style="width: 100%;" />
81 </el-form-item> 81 </el-form-item>
82 82
83 <el-form-item :label="$t('auditParkingSpaceApply.auditResult')" required> 83 <el-form-item :label="$t('auditParkingSpaceApply.auditResult')" required>
84 - <el-select v-model="formData.state" :placeholder="$t('auditParkingSpaceApply.selectResult')" style="width:100%"> 84 + <el-select v-model="formData.state" :placeholder="$t('auditParkingSpaceApply.selectResult')"
  85 + style="width:100%">
85 <el-option :label="$t('auditParkingSpaceApply.pass')" value="3003" /> 86 <el-option :label="$t('auditParkingSpaceApply.pass')" value="3003" />
86 <el-option :label="$t('auditParkingSpaceApply.reject')" value="4004" /> 87 <el-option :label="$t('auditParkingSpaceApply.reject')" value="4004" />
87 </el-select> 88 </el-select>
@@ -114,11 +115,8 @@ @@ -114,11 +115,8 @@
114 115
115 116
116 <!-- 搜索车位组件 --> 117 <!-- 搜索车位组件 -->
117 - <search-parking-space  
118 - ref="searchParkingSpace"  
119 - :ps-flag="formData.parkingSpaceFlag"  
120 - @choose-parking-space="handleChooseParkingSpace"  
121 - /> 118 + <search-parking-space ref="searchParkingSpace" :ps-flag="formData.parkingSpaceFlag"
  119 + @choose-parking-space="handleChooseParkingSpace" />
122 </div> 120 </div>
123 </template> 121 </template>
124 122
@@ -172,6 +170,7 @@ export default { @@ -172,6 +170,7 @@ export default {
172 const res = await getParkingSpaceApplyDetail(params) 170 const res = await getParkingSpaceApplyDetail(params)
173 if (res.data && res.data.length > 0) { 171 if (res.data && res.data.length > 0) {
174 Object.assign(this.formData, res.data[0]) 172 Object.assign(this.formData, res.data[0])
  173 + this.formData.state = ''
175 } 174 }
176 } catch (error) { 175 } catch (error) {
177 this.$message.error(this.$t('common.queryFailed')) 176 this.$message.error(this.$t('common.queryFailed'))
src/views/car/carAddParkingSpaceList.vue
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 <el-form label-width="120px"> 10 <el-form label-width="120px">
11 <el-row :gutter="20"> 11 <el-row :gutter="20">
12 <el-col :span="12"> 12 <el-col :span="12">
13 - <el-form-item :label="$t('hireParkingSpace.parkingSpace')" prop="psName" required> 13 + <el-form-item :label="$t('hireParkingSpace.parkingSpace')" prop="psName" >
14 <el-input v-model="carAddParkingSpaceInfo.psName" disabled style="width: 80%;" 14 <el-input v-model="carAddParkingSpaceInfo.psName" disabled style="width: 80%;"
15 :placeholder="$t('hireParkingSpace.parkingSpacePlaceholder')" /> 15 :placeholder="$t('hireParkingSpace.parkingSpacePlaceholder')" />
16 <el-button type="primary" size="small" class="margin-left" @click="openSearchParkingSpaceModel"> 16 <el-button type="primary" size="small" class="margin-left" @click="openSearchParkingSpaceModel">
src/views/car/carDetail.vue
1 <template> 1 <template>
2 - <div class="car-detail-container"> 2 + <div class="car-detail-container padding">
3 <div class="white-bg padding-left padding-right padding-top border-radius-top"> 3 <div class="white-bg padding-left padding-right padding-top border-radius-top">
4 <el-row type="flex" justify="space-between"> 4 <el-row type="flex" justify="space-between">
5 <div class="text-title"> 5 <div class="text-title">
src/views/car/hireParkingSpaceLang.js
@@ -32,7 +32,10 @@ export const messages = { @@ -32,7 +32,10 @@ export const messages = {
32 licenseType: 'License type is required', 32 licenseType: 'License type is required',
33 owner: 'Owner is required', 33 owner: 'Owner is required',
34 parkingSpace: 'Parking space is required', 34 parkingSpace: 'Parking space is required',
35 - dateRange: 'Date range is required' 35 + dateRange: 'Date range is required',
  36 + startTime:'start time is required',
  37 + endTime:'end time is required'
  38 +
36 }, 39 },
37 saveSuccess: 'Vehicle information saved successfully!', 40 saveSuccess: 'Vehicle information saved successfully!',
38 saveError: 'Failed to save vehicle information' 41 saveError: 'Failed to save vehicle information'
@@ -85,7 +88,9 @@ export const messages = { @@ -85,7 +88,9 @@ export const messages = {
85 licenseType: '车牌类型不能为空', 88 licenseType: '车牌类型不能为空',
86 owner: '业主不能为空', 89 owner: '业主不能为空',
87 parkingSpace: '车位不能为空', 90 parkingSpace: '车位不能为空',
88 - dateRange: '请选择日期范围' 91 + dateRange: '请选择日期范围',
  92 + startTime:'开始时间不能为空',
  93 + endTime:'结束时间不能为空'
89 }, 94 },
90 saveSuccess: '车辆信息保存成功!', 95 saveSuccess: '车辆信息保存成功!',
91 saveError: '车辆信息保存失败' 96 saveError: '车辆信息保存失败'
src/views/car/hireParkingSpaceList.vue
@@ -10,10 +10,10 @@ @@ -10,10 +10,10 @@
10 </div> 10 </div>
11 </div> 11 </div>
12 12
13 - <el-form ref="form" :model="hireParkingSpaceInfo" label-width="120px" label-position="right"> 13 + <el-form ref="form" :model="hireParkingSpaceInfo" :rules="dynamicRules" label-width="120px" label-position="right">
14 <el-row :gutter="20"> 14 <el-row :gutter="20">
15 <el-col :span="12"> 15 <el-col :span="12">
16 - <el-form-item :label="$t('hireParkingSpace.carNum')" prop="carNum" required> 16 + <el-form-item :label="$t('hireParkingSpace.carNum')" prop="carNum" >
17 <el-input v-model="hireParkingSpaceInfo.carNum" :placeholder="$t('hireParkingSpace.carNumPlaceholder')" /> 17 <el-input v-model="hireParkingSpaceInfo.carNum" :placeholder="$t('hireParkingSpace.carNumPlaceholder')" />
18 </el-form-item> 18 </el-form-item>
19 </el-col> 19 </el-col>
@@ -27,7 +27,7 @@ @@ -27,7 +27,7 @@
27 27
28 <el-row :gutter="20"> 28 <el-row :gutter="20">
29 <el-col :span="12"> 29 <el-col :span="12">
30 - <el-form-item :label="$t('hireParkingSpace.carType')" prop="carType" required> 30 + <el-form-item :label="$t('hireParkingSpace.carType')" prop="carType" >
31 <el-select v-model="hireParkingSpaceInfo.carType" class="w-full" 31 <el-select v-model="hireParkingSpaceInfo.carType" class="w-full"
32 :placeholder="$t('hireParkingSpace.carTypePlaceholder')"> 32 :placeholder="$t('hireParkingSpace.carTypePlaceholder')">
33 <el-option v-for="carType in hireParkingSpaceInfo.carTypes" :key="carType.statusCd" :label="carType.name" 33 <el-option v-for="carType in hireParkingSpaceInfo.carTypes" :key="carType.statusCd" :label="carType.name"
@@ -45,7 +45,7 @@ @@ -45,7 +45,7 @@
45 45
46 <el-row :gutter="20"> 46 <el-row :gutter="20">
47 <el-col :span="12"> 47 <el-col :span="12">
48 - <el-form-item :label="$t('hireParkingSpace.licenseType')" prop="leaseType" required> 48 + <el-form-item :label="$t('hireParkingSpace.licenseType')" prop="leaseType" >
49 <el-select v-model="hireParkingSpaceInfo.leaseType" class="w-full" 49 <el-select v-model="hireParkingSpaceInfo.leaseType" class="w-full"
50 :placeholder="$t('hireParkingSpace.licenseTypePlaceholder')" @change="changeLeaseType"> 50 :placeholder="$t('hireParkingSpace.licenseTypePlaceholder')" @change="changeLeaseType">
51 <el-option :label="$t('hireParkingSpace.monthlyRent')" value="H" /> 51 <el-option :label="$t('hireParkingSpace.monthlyRent')" value="H" />
@@ -59,13 +59,13 @@ @@ -59,13 +59,13 @@
59 59
60 <el-row v-if="showDateRange" :gutter="20"> 60 <el-row v-if="showDateRange" :gutter="20">
61 <el-col :span="12"> 61 <el-col :span="12">
62 - <el-form-item :label="$t('hireParkingSpace.startTime')" prop="startTime" required> 62 + <el-form-item :label="$t('hireParkingSpace.startTime')" prop="startTime" >
63 <el-date-picker v-model="hireParkingSpaceInfo.startTime" type="date" value-format="yyyy-MM-dd" class="w-full" 63 <el-date-picker v-model="hireParkingSpaceInfo.startTime" type="date" value-format="yyyy-MM-dd" class="w-full"
64 :placeholder="$t('hireParkingSpace.startTimePlaceholder')" /> 64 :placeholder="$t('hireParkingSpace.startTimePlaceholder')" />
65 </el-form-item> 65 </el-form-item>
66 </el-col> 66 </el-col>
67 <el-col :span="12"> 67 <el-col :span="12">
68 - <el-form-item :label="$t('hireParkingSpace.endTime')" prop="endTime" required> 68 + <el-form-item :label="$t('hireParkingSpace.endTime')" prop="endTime" >
69 <el-date-picker v-model="hireParkingSpaceInfo.endTime" type="date" value-format="yyyy-MM-dd" class="w-full" 69 <el-date-picker v-model="hireParkingSpaceInfo.endTime" type="date" value-format="yyyy-MM-dd" class="w-full"
70 :placeholder="$t('hireParkingSpace.endTimePlaceholder')" /> 70 :placeholder="$t('hireParkingSpace.endTimePlaceholder')" />
71 </el-form-item> 71 </el-form-item>
@@ -74,7 +74,7 @@ @@ -74,7 +74,7 @@
74 74
75 <el-row :gutter="20"> 75 <el-row :gutter="20">
76 <el-col :span="8"> 76 <el-col :span="8">
77 - <el-form-item :label="$t('hireParkingSpace.owner')" prop="ownerName" required> 77 + <el-form-item :label="$t('hireParkingSpace.owner')" prop="ownerName" >
78 <el-input v-model="hireParkingSpaceInfo.ownerName" disabled 78 <el-input v-model="hireParkingSpaceInfo.ownerName" disabled
79 :placeholder="$t('hireParkingSpace.ownerPlaceholder')" /> 79 :placeholder="$t('hireParkingSpace.ownerPlaceholder')" />
80 </el-form-item> 80 </el-form-item>
@@ -87,7 +87,7 @@ @@ -87,7 +87,7 @@
87 </div> 87 </div>
88 </el-col> 88 </el-col>
89 <el-col :span="8"> 89 <el-col :span="8">
90 - <el-form-item :label="$t('hireParkingSpace.parkingSpace')" prop="psName" required> 90 + <el-form-item :label="$t('hireParkingSpace.parkingSpace')" prop="psName" >
91 <el-input v-model="hireParkingSpaceInfo.psName" disabled 91 <el-input v-model="hireParkingSpaceInfo.psName" disabled
92 :placeholder="$t('hireParkingSpace.parkingSpacePlaceholder')" /> 92 :placeholder="$t('hireParkingSpace.parkingSpacePlaceholder')" />
93 </el-form-item> 93 </el-form-item>
@@ -164,12 +164,43 @@ export default { @@ -164,12 +164,43 @@ export default {
164 psName: '', 164 psName: '',
165 attrs: [], 165 attrs: [],
166 carTypes: [] 166 carTypes: []
167 - } 167 + },
168 } 168 }
169 }, 169 },
170 computed: { 170 computed: {
171 showDateRange() { 171 showDateRange() {
172 return ['H', 'S'].includes(this.hireParkingSpaceInfo.leaseType) 172 return ['H', 'S'].includes(this.hireParkingSpaceInfo.leaseType)
  173 + },
  174 + dynamicRules() {
  175 + const baseRules = {
  176 + carNum: [
  177 + { required: true, message: this.$t('hireParkingSpace.validate.carNum'), trigger: 'blur' }
  178 + ],
  179 + carType: [
  180 + { required: true, message: this.$t('hireParkingSpace.validate.carType'), trigger: 'change' }
  181 + ],
  182 + leaseType: [
  183 + { required: true, message: this.$t('hireParkingSpace.validate.licenseType'), trigger: 'change' }
  184 + ],
  185 + ownerName: [
  186 + { required: true, message: this.$t('hireParkingSpace.validate.owner'), trigger: 'change' }
  187 + ],
  188 + psName: [
  189 + { required: true, message: this.$t('hireParkingSpace.validate.parkingSpace'), trigger: 'change' }
  190 + ]
  191 + }
  192 +
  193 + // 根据租赁类型动态添加时间验证规则
  194 + if (this.showDateRange) {
  195 + baseRules.startTime = [
  196 + { required: true, message: this.$t('hireParkingSpace.validate.startTime'), trigger: 'change' }
  197 + ]
  198 + baseRules.endTime = [
  199 + { required: true, message: this.$t('hireParkingSpace.validate.endTime'), trigger: 'change' }
  200 + ]
  201 + }
  202 +
  203 + return baseRules
173 } 204 }
174 }, 205 },
175 async created() { 206 async created() {
@@ -221,6 +252,10 @@ export default { @@ -221,6 +252,10 @@ export default {
221 changeLeaseType() { 252 changeLeaseType() {
222 this.hireParkingSpaceInfo.startTime = '' 253 this.hireParkingSpaceInfo.startTime = ''
223 this.hireParkingSpaceInfo.endTime = '' 254 this.hireParkingSpaceInfo.endTime = ''
  255 + // 清除时间字段的验证状态
  256 + this.$nextTick(() => {
  257 + this.$refs.form.clearValidate(['startTime', 'endTime'])
  258 + })
224 }, 259 },
225 260
226 openChooseOwner() { 261 openChooseOwner() {
@@ -230,6 +265,8 @@ export default { @@ -230,6 +265,8 @@ export default {
230 handleChooseOwner(owner) { 265 handleChooseOwner(owner) {
231 this.hireParkingSpaceInfo.ownerName = owner.name 266 this.hireParkingSpaceInfo.ownerName = owner.name
232 this.hireParkingSpaceInfo.ownerId = owner.memberId 267 this.hireParkingSpaceInfo.ownerId = owner.memberId
  268 + // 触发表单验证
  269 + this.$refs.form.validateField('ownerId')
233 }, 270 },
234 271
235 openSearchParkingSpaceModel() { 272 openSearchParkingSpaceModel() {
@@ -239,46 +276,26 @@ export default { @@ -239,46 +276,26 @@ export default {
239 handleChooseParkingSpace(parkingSpace) { 276 handleChooseParkingSpace(parkingSpace) {
240 this.hireParkingSpaceInfo.psName = `${parkingSpace.areaNum}-${parkingSpace.num}` 277 this.hireParkingSpaceInfo.psName = `${parkingSpace.areaNum}-${parkingSpace.num}`
241 this.hireParkingSpaceInfo.psId = parkingSpace.psId 278 this.hireParkingSpaceInfo.psId = parkingSpace.psId
  279 + // 触发表单验证
  280 + this.$refs.form.validateField('psId')
242 }, 281 },
243 282
244 - validateForm() {  
245 - const requiredFields = [  
246 - { field: 'carNum', message: this.$t('hireParkingSpace.validate.carNum') },  
247 - { field: 'carType', message: this.$t('hireParkingSpace.validate.carType') },  
248 - { field: 'leaseType', message: this.$t('hireParkingSpace.validate.licenseType') },  
249 - { field: 'ownerId', message: this.$t('hireParkingSpace.validate.owner') },  
250 - { field: 'psId', message: this.$t('hireParkingSpace.validate.parkingSpace') }  
251 - ]  
252 -  
253 - for (const { field, message } of requiredFields) {  
254 - if (!this.hireParkingSpaceInfo[field]) {  
255 - this.$message.error(message)  
256 - return false  
257 - }  
258 - }  
259 -  
260 - // 验证日期范围  
261 - if (this.showDateRange) {  
262 - if (!this.hireParkingSpaceInfo.startTime || !this.hireParkingSpaceInfo.endTime) {  
263 - this.$message.error(this.$t('hireParkingSpace.validate.dateRange'))  
264 - return false  
265 - } 283 + async saveAddCarInfo() {
  284 + // 使用 Element UI 表单验证
  285 + try {
  286 + await this.$refs.form.validate()
  287 + } catch (error) {
  288 + return
266 } 289 }
267 290
268 // 验证自定义属性 291 // 验证自定义属性
269 for (const attr of this.hireParkingSpaceInfo.attrs) { 292 for (const attr of this.hireParkingSpaceInfo.attrs) {
270 if (attr.required === 'Y' && !attr.value) { 293 if (attr.required === 'Y' && !attr.value) {
271 this.$message.error(attr.specHoldplace) 294 this.$message.error(attr.specHoldplace)
272 - return false 295 + return
273 } 296 }
274 } 297 }
275 298
276 - return true  
277 - },  
278 -  
279 - async saveAddCarInfo() {  
280 - if (!this.validateForm()) return  
281 -  
282 try { 299 try {
283 const params = { 300 const params = {
284 ...this.hireParkingSpaceInfo, 301 ...this.hireParkingSpaceInfo,
src/views/car/parkingSpaceApplyManageList.vue
1 <template> 1 <template>
2 - <div class="parking-space-apply-manage"> 2 + <div class="parking-space-apply-manage padding">
3 <el-card class="search-card"> 3 <el-card class="search-card">
4 <div slot="header" class="clearfix flex justify-between"> 4 <div slot="header" class="clearfix flex justify-between">
5 <span>{{ $t('parkingSpaceApplyManage.searchCondition') }}</span> 5 <span>{{ $t('parkingSpaceApplyManage.searchCondition') }}</span>