Commit b012d770c7ab3ef57104ca512b9ff8afcd5829cf

Authored by wuxw
1 parent d53a0384

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

src/components/car/carDetailFee.vue
... ... @@ -89,8 +89,8 @@
89 89 </el-row>
90 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 94 <delete-fee ref="deleteFee"></delete-fee>
95 95 <edit-fee ref="editFee"></edit-fee>
96 96 </div>
... ...
src/views/car/auditParkingSpaceApply.vue
... ... @@ -65,23 +65,24 @@
65 65 </el-card>
66 66  
67 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 69 <span>{{ $t('auditParkingSpaceApply.auditInfo') }}</span>
70 70 </div>
71 71  
72 72 <el-form ref="form" :model="formData" label-width="120px">
73 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 76 </el-form-item>
77 77  
78 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 81 </el-form-item>
82 82  
83 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 86 <el-option :label="$t('auditParkingSpaceApply.pass')" value="3003" />
86 87 <el-option :label="$t('auditParkingSpaceApply.reject')" value="4004" />
87 88 </el-select>
... ... @@ -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 120 </div>
123 121 </template>
124 122  
... ... @@ -172,6 +170,7 @@ export default {
172 170 const res = await getParkingSpaceApplyDetail(params)
173 171 if (res.data && res.data.length > 0) {
174 172 Object.assign(this.formData, res.data[0])
  173 + this.formData.state = ''
175 174 }
176 175 } catch (error) {
177 176 this.$message.error(this.$t('common.queryFailed'))
... ...
src/views/car/carAddParkingSpaceList.vue
... ... @@ -10,7 +10,7 @@
10 10 <el-form label-width="120px">
11 11 <el-row :gutter="20">
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 14 <el-input v-model="carAddParkingSpaceInfo.psName" disabled style="width: 80%;"
15 15 :placeholder="$t('hireParkingSpace.parkingSpacePlaceholder')" />
16 16 <el-button type="primary" size="small" class="margin-left" @click="openSearchParkingSpaceModel">
... ...
src/views/car/carDetail.vue
1 1 <template>
2   - <div class="car-detail-container">
  2 + <div class="car-detail-container padding">
3 3 <div class="white-bg padding-left padding-right padding-top border-radius-top">
4 4 <el-row type="flex" justify="space-between">
5 5 <div class="text-title">
... ...
src/views/car/hireParkingSpaceLang.js
... ... @@ -32,7 +32,10 @@ export const messages = {
32 32 licenseType: 'License type is required',
33 33 owner: 'Owner is required',
34 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 40 saveSuccess: 'Vehicle information saved successfully!',
38 41 saveError: 'Failed to save vehicle information'
... ... @@ -85,7 +88,9 @@ export const messages = {
85 88 licenseType: '车牌类型不能为空',
86 89 owner: '业主不能为空',
87 90 parkingSpace: '车位不能为空',
88   - dateRange: '请选择日期范围'
  91 + dateRange: '请选择日期范围',
  92 + startTime:'开始时间不能为空',
  93 + endTime:'结束时间不能为空'
89 94 },
90 95 saveSuccess: '车辆信息保存成功!',
91 96 saveError: '车辆信息保存失败'
... ...
src/views/car/hireParkingSpaceList.vue
... ... @@ -10,10 +10,10 @@
10 10 </div>
11 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 14 <el-row :gutter="20">
15 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 17 <el-input v-model="hireParkingSpaceInfo.carNum" :placeholder="$t('hireParkingSpace.carNumPlaceholder')" />
18 18 </el-form-item>
19 19 </el-col>
... ... @@ -27,7 +27,7 @@
27 27  
28 28 <el-row :gutter="20">
29 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 31 <el-select v-model="hireParkingSpaceInfo.carType" class="w-full"
32 32 :placeholder="$t('hireParkingSpace.carTypePlaceholder')">
33 33 <el-option v-for="carType in hireParkingSpaceInfo.carTypes" :key="carType.statusCd" :label="carType.name"
... ... @@ -45,7 +45,7 @@
45 45  
46 46 <el-row :gutter="20">
47 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 49 <el-select v-model="hireParkingSpaceInfo.leaseType" class="w-full"
50 50 :placeholder="$t('hireParkingSpace.licenseTypePlaceholder')" @change="changeLeaseType">
51 51 <el-option :label="$t('hireParkingSpace.monthlyRent')" value="H" />
... ... @@ -59,13 +59,13 @@
59 59  
60 60 <el-row v-if="showDateRange" :gutter="20">
61 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 63 <el-date-picker v-model="hireParkingSpaceInfo.startTime" type="date" value-format="yyyy-MM-dd" class="w-full"
64 64 :placeholder="$t('hireParkingSpace.startTimePlaceholder')" />
65 65 </el-form-item>
66 66 </el-col>
67 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 69 <el-date-picker v-model="hireParkingSpaceInfo.endTime" type="date" value-format="yyyy-MM-dd" class="w-full"
70 70 :placeholder="$t('hireParkingSpace.endTimePlaceholder')" />
71 71 </el-form-item>
... ... @@ -74,7 +74,7 @@
74 74  
75 75 <el-row :gutter="20">
76 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 78 <el-input v-model="hireParkingSpaceInfo.ownerName" disabled
79 79 :placeholder="$t('hireParkingSpace.ownerPlaceholder')" />
80 80 </el-form-item>
... ... @@ -87,7 +87,7 @@
87 87 </div>
88 88 </el-col>
89 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 91 <el-input v-model="hireParkingSpaceInfo.psName" disabled
92 92 :placeholder="$t('hireParkingSpace.parkingSpacePlaceholder')" />
93 93 </el-form-item>
... ... @@ -164,12 +164,43 @@ export default {
164 164 psName: '',
165 165 attrs: [],
166 166 carTypes: []
167   - }
  167 + },
168 168 }
169 169 },
170 170 computed: {
171 171 showDateRange() {
172 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 206 async created() {
... ... @@ -221,6 +252,10 @@ export default {
221 252 changeLeaseType() {
222 253 this.hireParkingSpaceInfo.startTime = ''
223 254 this.hireParkingSpaceInfo.endTime = ''
  255 + // 清除时间字段的验证状态
  256 + this.$nextTick(() => {
  257 + this.$refs.form.clearValidate(['startTime', 'endTime'])
  258 + })
224 259 },
225 260  
226 261 openChooseOwner() {
... ... @@ -230,6 +265,8 @@ export default {
230 265 handleChooseOwner(owner) {
231 266 this.hireParkingSpaceInfo.ownerName = owner.name
232 267 this.hireParkingSpaceInfo.ownerId = owner.memberId
  268 + // 触发表单验证
  269 + this.$refs.form.validateField('ownerId')
233 270 },
234 271  
235 272 openSearchParkingSpaceModel() {
... ... @@ -239,46 +276,26 @@ export default {
239 276 handleChooseParkingSpace(parkingSpace) {
240 277 this.hireParkingSpaceInfo.psName = `${parkingSpace.areaNum}-${parkingSpace.num}`
241 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 292 for (const attr of this.hireParkingSpaceInfo.attrs) {
270 293 if (attr.required === 'Y' && !attr.value) {
271 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 299 try {
283 300 const params = {
284 301 ...this.hireParkingSpaceInfo,
... ...
src/views/car/parkingSpaceApplyManageList.vue
1 1 <template>
2   - <div class="parking-space-apply-manage">
  2 + <div class="parking-space-apply-manage padding">
3 3 <el-card class="search-card">
4 4 <div slot="header" class="clearfix flex justify-between">
5 5 <span>{{ $t('parkingSpaceApplyManage.searchCondition') }}</span>
... ...