Commit b012d770c7ab3ef57104ca512b9ff8afcd5829cf
1 parent
d53a0384
v1.9 测试停车功能,页面功能优化
Showing
7 changed files
with
77 additions
and
56 deletions
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
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