From b7d451c91ec40bee70f23b1e2cf6a8797643faef Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期六, 25 四月 2026 15:18:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 app/pages/driver-certification/driver-certification.vue |  575 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 531 insertions(+), 44 deletions(-)

diff --git a/app/pages/driver-certification/driver-certification.vue b/app/pages/driver-certification/driver-certification.vue
index 96f76b6..5e361aa 100644
--- a/app/pages/driver-certification/driver-certification.vue
+++ b/app/pages/driver-certification/driver-certification.vue
@@ -27,7 +27,7 @@
 		<view class="driver-cert-page__scroll">
 			<view v-if="currentStep === 1" class="driver-cert-card">
 				<text class="driver-cert-card__title">鍩烘湰淇℃伅</text>
-				<text class="driver-cert-card__mobile">娉ㄥ唽鎵嬫満鍙凤細18155114565</text>
+				<text class="driver-cert-card__mobile">娉ㄥ唽鎵嬫満鍙凤細{{ userInfo.telephone || '' }}</text>
 
 				<view class="driver-cert-card__field">
 					<text class="driver-cert-card__label">鍙告満濮撳悕</text>
@@ -39,7 +39,7 @@
 				<view class="driver-cert-card__field">
 					<text class="driver-cert-card__label">韬唤璇佸彿</text>
 					<text class="driver-cert-card__required">*</text>
-					<input v-model="form.idCard" class="driver-cert-card__input" placeholder="璇疯緭鍏ュ徃鏈鸿韩浠借瘉鍙风爜"
+					<input type="idcard" maxlength="18" v-model="form.idcard" class="driver-cert-card__input" placeholder="璇疯緭鍏ュ徃鏈鸿韩浠借瘉鍙风爜"
 						placeholder-style="color: #b9bfc8;" />
 				</view>
 
@@ -48,8 +48,8 @@
 						<text class="driver-cert-card__label">濠氬Щ鐘跺喌</text>
 						<text class="driver-cert-card__required">*</text>
 					</view>
-					<view class="driver-cert-card__selector">
-						<text class="driver-cert-card__selector-text">璇烽�夋嫨</text>
+					<view class="driver-cert-card__selector" @click="showMaritalPicker = true">
+						<text class="driver-cert-card__selector-text" :style="{ color: form.maritalStatus !== '' ? '#333333' : '#b9bfc8' }">{{ getMaritalStatusText(form.maritalStatus) }}</text>
 						<text class="driver-cert-card__arrow">鈥�</text>
 					</view>
 				</view>
@@ -59,8 +59,8 @@
 						<text class="driver-cert-card__label">灞呬綇鍩庡競</text>
 						<text class="driver-cert-card__required">*</text>
 					</view>
-					<view class="driver-cert-card__selector">
-						<text class="driver-cert-card__selector-text">璇烽�夋嫨鐪佸競鍖�</text>
+					<view class="driver-cert-card__selector" @click="showAreaPicker = true">
+						<text class="driver-cert-card__selector-text" :style="{ color: form.areaName ? '#333333' : '#b9bfc8' }">{{ form.areaName || '璇烽�夋嫨鐪佸競鍖�' }}</text>
 						<text class="driver-cert-card__arrow">鈥�</text>
 					</view>
 				</view>
@@ -68,14 +68,21 @@
 				<view class="driver-cert-card__field">
 					<text class="driver-cert-card__label">璇︾粏鍦板潃</text>
 					<text class="driver-cert-card__required">*</text>
-					<input v-model="form.address" class="driver-cert-card__input" placeholder="璇疯緭鍏ヨ缁嗗眳浣忓湴鍧�"
+					<input v-model="form.livePlace" class="driver-cert-card__input" placeholder="璇疯緭鍏ヨ缁嗗眳浣忓湴鍧�"
 						placeholder-style="color: #b9bfc8;" />
 				</view>
 
 				<view class="driver-cert-card__field">
 					<text class="driver-cert-card__label">鏀粯瀹濊处鍙�</text>
 					<text class="driver-cert-card__required">*</text>
-					<input v-model="form.alipay" class="driver-cert-card__input" placeholder="璇疯緭鍏ユ敹娆炬敮浠樺疂璐﹀彿"
+					<input v-model="form.aliAccount" class="driver-cert-card__input" placeholder="璇疯緭鍏ユ敹娆炬敮浠樺疂璐﹀彿"
+						placeholder-style="color: #b9bfc8;" />
+				</view>
+
+				<view class="driver-cert-card__field">
+					<text class="driver-cert-card__label">鏀粯瀹濆鍚�</text>
+					<text class="driver-cert-card__required">*</text>
+					<input v-model="form.aliName" class="driver-cert-card__input" placeholder="璇疯緭鍏ユ敮浠樺疂濮撳悕"
 						placeholder-style="color: #b9bfc8;" />
 				</view>
 
@@ -86,15 +93,25 @@
 					</view>
 
 					<view class="driver-cert-card__upload-list">
-						<view class="driver-cert-card__upload-item">
-							<image class="driver-cert-card__upload-icon" src="/static/image/ic_camera@2x.png"
-								mode="aspectFit"></image>
-							<text class="driver-cert-card__upload-text">涓婁紶浜哄儚闈�</text>
+						<view class="driver-cert-card__upload-item" @click="handleUpload('idcardImg', 1)" style="height: 196rpx;">
+							<template v-if="previewImages.idcardImg">
+								<image class="driver-cert-card__upload-img" :src="previewImages.idcardImg" mode="widthFix"></image>
+								<view class="driver-cert-card__upload-remove" @click.stop="removeImage('idcardImg')">鍒犻櫎</view>
+							</template>
+							<template v-else>
+								<image class="driver-cert-card__upload-icon" src="/static/image/ic_camera@2x.png" mode="aspectFit"></image>
+								<text class="driver-cert-card__upload-text">涓婁紶浜哄儚闈�</text>
+							</template>
 						</view>
-						<view class="driver-cert-card__upload-item">
-							<image class="driver-cert-card__upload-icon" src="/static/image/ic_camera@2x.png"
-								mode="aspectFit"></image>
-							<text class="driver-cert-card__upload-text">涓婁紶鍥藉窘闈�</text>
+						<view class="driver-cert-card__upload-item" @click="handleUpload('idcardImgBack', 1)" style="height: 196rpx;">
+							<template v-if="previewImages.idcardImgBack">
+								<image class="driver-cert-card__upload-img" :src="previewImages.idcardImgBack" mode="widthFix"></image>
+								<view class="driver-cert-card__upload-remove" @click.stop="removeImage('idcardImgBack')">鍒犻櫎</view>
+							</template>
+							<template v-else>
+								<image class="driver-cert-card__upload-icon" src="/static/image/ic_camera@2x.png" mode="aspectFit"></image>
+								<text class="driver-cert-card__upload-text">涓婁紶鍥藉窘闈�</text>
+							</template>
 						</view>
 					</view>
 				</view>
@@ -115,8 +132,8 @@
 						<text class="driver-cert-card__label">杞﹁締绫诲瀷</text>
 						<text class="driver-cert-card__required">*</text>
 					</view>
-					<view class="driver-cert-card__selector">
-						<text class="driver-cert-card__selector-text">璇烽�夋嫨</text>
+					<view class="driver-cert-card__selector" @click="showCarTypePicker = true">
+						<text class="driver-cert-card__selector-text" :style="{ color: vehicleForm.carType ? '#333333' : '#b9bfc8' }">{{ getCarTypeText(vehicleForm.carType) }}</text>
 						<text class="driver-cert-card__arrow">鈥�</text>
 					</view>
 				</view>
@@ -128,13 +145,24 @@
 						placeholder-style="color: #b9bfc8;" />
 				</view>
 
-				<view class="driver-cert-card__field driver-cert-card__field--select">
+				<view class="driver-cert-card__field driver-cert-card__field--select" style="border: none !important;">
 					<view class="driver-cert-card__field-head">
-						<text class="driver-cert-card__label">椹鹃┒璇佹湁鏁堟湡</text>
+						<text class="driver-cert-card__label">椹鹃┒璇佹湁鏁堟湡璧�</text>
 						<text class="driver-cert-card__required">*</text>
 					</view>
-					<view class="driver-cert-card__selector">
-						<text class="driver-cert-card__selector-text">璇烽�夋嫨</text>
+					<view class="driver-cert-card__selector" @click="openDatePicker('start')">
+						<text class="driver-cert-card__selector-text" :style="{ color: form.cardStartDate ? '#333333' : '#b9bfc8' }">{{ form.cardStartDate || '璇烽�夋嫨' }}</text>
+						<text class="driver-cert-card__arrow">鈥�</text>
+					</view>
+				</view>
+
+				<view class="driver-cert-card__field driver-cert-card__field--select" style="border: none !important;">
+					<view class="driver-cert-card__field-head">
+						<text class="driver-cert-card__label">椹鹃┒璇佹湁鏁堟湡姝�</text>
+						<text class="driver-cert-card__required">*</text>
+					</view>
+					<view class="driver-cert-card__selector" @click="openDatePicker('end')">
+						<text class="driver-cert-card__selector-text" :style="{ color: form.cardEndDate ? '#333333' : '#b9bfc8' }">{{ form.cardEndDate || '璇烽�夋嫨' }}</text>
 						<text class="driver-cert-card__arrow">鈥�</text>
 					</view>
 				</view>
@@ -146,9 +174,12 @@
 						<text class="driver-cert-card__upload-tip">鏈�澶氫笂浼�3寮犵収鐗�</text>
 					</view>
 					<view class="driver-cert-card__upload-list driver-cert-card__upload-list--single">
-						<view class="driver-cert-card__upload-item driver-cert-card__upload-item--single">
-							<image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png"
-								mode="aspectFit"></image>
+						<view v-for="(img, index) in previewImages.carImgUrls" :key="index" class="driver-cert-card__upload-item driver-cert-card__upload-item--single" @click="previewImg('carImgUrls', index)">
+							<image class="driver-cert-card__upload-image" :src="img" mode="aspectFill"></image>
+							<view class="driver-cert-card__upload-remove" @click.stop="removeImg('carImgUrls', index)">鍒犻櫎</view>
+						</view>
+						<view v-if="previewImages.carImgUrls.length < 3" class="driver-cert-card__upload-item driver-cert-card__upload-item--single" @click="handleUpload('carImgUrls', 3)">
+							<image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png" mode="aspectFit"></image>
 						</view>
 					</view>
 				</view>
@@ -160,9 +191,12 @@
 						<text class="driver-cert-card__upload-tip">鏈�澶氫笂浼�3寮犵収鐗�</text>
 					</view>
 					<view class="driver-cert-card__upload-list driver-cert-card__upload-list--single">
-						<view class="driver-cert-card__upload-item driver-cert-card__upload-item--single">
-							<image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png"
-								mode="aspectFit"></image>
+						<view v-for="(img, index) in previewImages.licenseImgUrls" :key="index" class="driver-cert-card__upload-item driver-cert-card__upload-item--single" @click="previewImg('licenseImgUrls', index)">
+							<image class="driver-cert-card__upload-image" :src="img" mode="aspectFill"></image>
+							<view class="driver-cert-card__upload-remove" @click.stop="removeImg('licenseImgUrls', index)">鍒犻櫎</view>
+						</view>
+						<view v-if="previewImages.licenseImgUrls.length < 3" class="driver-cert-card__upload-item driver-cert-card__upload-item--single" @click="handleUpload('licenseImgUrls', 3)">
+							<image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png" mode="aspectFit"></image>
 						</view>
 					</view>
 				</view>
@@ -173,9 +207,12 @@
 						<text class="driver-cert-card__upload-tip">鏈�澶氫笂浼�3寮犵収鐗�</text>
 					</view>
 					<view class="driver-cert-card__upload-list driver-cert-card__upload-list--single">
-						<view class="driver-cert-card__upload-item driver-cert-card__upload-item--single">
-							<image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png"
-								mode="aspectFit"></image>
+						<view v-for="(img, index) in previewImages.otherImgUrls" :key="index" class="driver-cert-card__upload-item driver-cert-card__upload-item--single" @click="previewImg('otherImgUrls', index)">
+							<image class="driver-cert-card__upload-image" :src="img" mode="aspectFill"></image>
+							<view class="driver-cert-card__upload-remove" @click.stop="removeImg('otherImgUrls', index)">鍒犻櫎</view>
+						</view>
+						<view v-if="previewImages.otherImgUrls.length < 3" class="driver-cert-card__upload-item driver-cert-card__upload-item--single" @click="handleUpload('otherImgUrls', 3)">
+							<image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png" mode="aspectFit"></image>
 						</view>
 					</view>
 				</view>
@@ -184,10 +221,10 @@
 		</view>
 
 		<view class="driver-cert-page__bottom-bar">
-			<label v-if="currentStep === 2" class="driver-cert-page__agreement">
-				<radio class="driver-cert-page__agreement-radio" :checked="true" color="#2D7CFF" />
+			<view v-if="currentStep === 2" class="driver-cert-page__agreement" @click="isAgreed = !isAgreed">
+				<image class="driver-cert-page__agreement-icon" :src="isAgreed ? '/static/image/ic_accept_sel@2x.png' : '/static/image/ic_accept@2x.png'" mode="widthFix"></image>
 				<text class="driver-cert-page__agreement-text">鎴戝凡闃呰骞跺悓鎰忋�婇闄╁0鏄庛�嬨�併�婅鏉庡瘎瀛樺憳椤荤煡銆嬪強銆婃湇鍔″崗璁��</text>
-			</label>
+			</view>
 
 			<view class="driver-cert-page__actions" :class="{ 'driver-cert-page__actions--dual': currentStep === 2 }">
 				<button v-if="currentStep === 2" class="driver-cert-page__submit driver-cert-page__submit--ghost"
@@ -196,32 +233,458 @@
 					@click="handlePrimaryAction">{{ currentStep === 1 ? '涓嬩竴姝�' : '鎻愪氦璁よ瘉鐢宠' }}</button>
 			</view>
 		</view>
+
+		<u-picker
+			:show="showAreaPicker"
+			v-if="areaList && areaList.length > 0"
+			ref="uPicker"
+			confirmColor="#10B2FA"
+			keyName="text"
+			:columns="areaColumns"
+			@confirm="confirmArea"
+			@change="changeAreaHandler"
+			@cancel="showAreaPicker = false" />
+
+		<u-picker
+			:show="showMaritalPicker"
+			confirmColor="#10B2FA"
+			keyName="text"
+			:columns="[maritalOptions]"
+			@confirm="confirmMarital"
+			@cancel="showMaritalPicker = false" />
+
+		<u-picker
+			:show="showCarTypePicker"
+			v-if="carTypeList && carTypeList.length > 0"
+			confirmColor="#10B2FA"
+			keyName="text"
+			:columns="carTypeColumns"
+			@confirm="confirmCarType"
+			@cancel="showCarTypePicker = false" />
+
+		<u-datetime-picker
+			:show="showDatePicker"
+			v-model="datePickerValue"
+			mode="date"
+			:minDate="datePickerMode === 'end' ? this.form.cardStartDate : 0"
+			@confirm="confirmDate"
+			@cancel="showDatePicker = false" />
 	</view>
 </template>
 
 <script>
+    import { mapState } from 'vuex'
 	export default {
 		data() {
 			return {
+				showAreaPicker: false,
+				showMaritalPicker: false,
+				maritalOptions: [
+					{ value: '0', text: '鏈' },
+					{ value: '1', text: '宸插' },
+					{ value: '2', text: '绂诲紓' },
+					{ value: '3', text: '涓у伓' }
+				],
+				areaList: [],
+				areaColumns: [],
 				currentStep: 1,
 				form: {
+					areaId: '',
+					areaName: '',
 					name: '',
-					idCard: '',
-					address: '',
-					alipay: ''
+					idcard: '',
+					maritalStatus: '',
+					livePlace: '',
+					aliAccount: '',
+					aliName: '',
+					idcardImg: '',
+					idcardImgBack: '',
+					carCode: '',
+					carType: '',
+					carColor: '',
+					cardStartDate: '',
+					cardEndDate: '',
+					carImgUrls: [],
+					licenseImgUrls: [],
+					otherImgUrls: []
 				},
 				vehicleForm: {
 					plateNumber: '',
-					color: ''
-				}
+					color: '',
+					carType: ''
+				},
+				showCarTypePicker: false,
+				carTypeList: [],
+				carTypeColumns: [],
+				showDatePicker: false,
+				datePickerMode: 'start',
+				datePickerValue: Number(new Date()),
+				uploadPaths: {
+					idcardImg: 'driver/idcard/front',
+					idcardImgBack: 'driver/idcard/back',
+					carImgUrls: 'driver/car',
+					licenseImgUrls: 'driver/license',
+					otherImgUrls: 'driver/other'
+				},
+				previewImages: {
+					idcardImg: '',
+					idcardImgBack: '',
+					carImgUrls: [],
+					licenseImgUrls: [],
+					otherImgUrls: []
+				},
+				isAgreed: false,
+				imgPrefix: ''
 			}
 		},
+		computed: {
+			...mapState(['userInfo'])
+		},
+		onLoad() {
+			this.getAreaList()
+			this.getCategoryList()
+			this.getVerifyDetail()
+		},
 		methods: {
+			getMaritalStatusText(value) {
+				if (!value && value !== 0) return '璇烽�夋嫨'
+				const item = this.maritalOptions.find(option => option.value === String(value))
+				return item ? item.text : '璇烽�夋嫨'
+			},
+			getVerifyDetail() {
+				this.$u.api.verifyDetail().then(res => {
+					if (res.code === 200 && res.data) {
+						if (res.data.auditStatus !== 99) {
+							this.imgPrefix = res.data.imgPrefix
+							this.form.areaId = res.data.areaId || ''
+							this.form.areaName = [res.data.provinceName, res.data.cityName, res.data.districtName].filter(Boolean).join('/')
+							this.form.name = res.data.name || ''
+							this.form.idcard = res.data.idcard || ''
+							this.form.maritalStatus = res.data.maritalStatus !== undefined ? String(res.data.maritalStatus) : ''
+							this.form.livePlace = res.data.livePlace || ''
+							this.form.aliAccount = res.data.aliAccount || ''
+							this.form.aliName = res.data.aliName || ''
+							this.form.idcardImg = res.data.idcardImg || ''
+							this.form.idcardImgBack = res.data.idcardImgBack || ''
+							this.form.cardStartDate = res.data.cardStartDate ? res.data.cardStartDate.split(' ')[0] : ''
+							this.form.cardEndDate = res.data.cardEndDate ? res.data.cardEndDate.split(' ')[0] : ''
+							this.vehicleForm.plateNumber = res.data.carCode || ''
+							this.vehicleForm.carType = res.data.carType || ''
+							this.vehicleForm.color = res.data.carColor || ''
+							this.previewImages.idcardImg = res.data.idcardImg ? res.data.imgPrefix + res.data.idcardImg : ''
+							this.previewImages.idcardImgBack = res.data.idcardImgBack ? res.data.imgPrefix + res.data.idcardImgBack : ''
+							this.form.carImgUrls = (res.data.carImgList || []).map(item => item.fileurl)
+							this.form.licenseImgUrls = (res.data.licenseImgList || []).map(item => item.fileurl)
+							this.form.otherImgUrls = (res.data.otherImgList || []).map(item => item.fileurl)
+							this.previewImages.carImgUrls = (res.data.carImgList || []).map(item => res.data.imgPrefix + item.fileurl)
+							this.previewImages.licenseImgUrls = (res.data.licenseImgList || []).map(item => res.data.imgPrefix + item.fileurl)
+							this.previewImages.otherImgUrls = (res.data.otherImgList || []).map(item => res.data.imgPrefix + item.fileurl)
+						}
+					}
+				})
+			},
+			confirmMarital(e) {
+				const { value } = e.value[0]
+				this.form.maritalStatus = value
+				this.showMaritalPicker = false
+			},
+			handleUpload(field, maxCount = 1) {
+				const currentList = this.previewImages[field]
+				const currentCount = Array.isArray(currentList) ? currentList.length : (currentList ? 1 : 0)
+				if (currentCount >= maxCount) {
+					uni.showToast({ title: `鏈�澶氫笂浼�${maxCount}寮燻, icon: 'none' })
+					return
+				}
+				uni.chooseImage({
+					count: maxCount,
+					sizeType: ['compressed'],
+					sourceType: ['album', 'camera'],
+					success: (res) => {
+						const allTempPaths = res.tempFilePaths
+						const remaining = maxCount - currentCount
+						const tempFilePaths = allTempPaths.slice(0, remaining)
+						this.uploadFiles(field, tempFilePaths, maxCount)
+					}
+				})
+			},
+			uploadFiles(field, tempFilePaths, maxCount) {
+				const uploadPath = this.uploadPaths[field]
+				let uploadedCount = 0
+				const isSingle = maxCount === 1
+				uni.showLoading({ title: '涓婁紶涓�...' })
+				tempFilePaths.forEach((tempPath, index) => {
+					uni.uploadFile({
+						url: this.$baseUrl + '/web/public/upload',
+						filePath: tempPath,
+						name: 'file',
+						formData: {
+							folder: 'driver'
+						},
+						success: (uploadRes) => {
+							const data = JSON.parse(uploadRes.data)
+							if (data.code === 200) {
+								const fullUrl = data.data
+								console.log(fullUrl)
+								if (isSingle) {
+									this.form[field] = fullUrl.imgaddr
+									this.previewImages[field] = fullUrl.url
+								} else {
+									this.form[field].push(fullUrl.imgaddr)
+									this.previewImages[field].push(fullUrl.url)
+								}
+							}
+							uploadedCount++
+							if (uploadedCount === tempFilePaths.length) {
+								uni.hideLoading()
+							}
+						},
+						fail: () => {
+							uploadedCount++
+							uni.showToast({ title: '涓婁紶澶辫触', icon: 'none' })
+							if (uploadedCount === tempFilePaths.length) {
+								uni.hideLoading()
+							}
+						}
+					})
+				})
+			},
+			getFullPath(halfPath) {
+				if (!halfPath) return ''
+				if (halfPath.startsWith('http')) return halfPath
+				const baseUrl = this.$baseUrl || ''
+				return baseUrl + halfPath
+			},
+			previewImg(field, index) {
+				const urls = Array.isArray(this.previewImages[field]) ? this.previewImages[field] : [this.previewImages[field]]
+				uni.previewImage({
+					current: index,
+					urls: urls
+				})
+			},
+			removeImg(field, index) {
+				const isSingle = !Array.isArray(this.form[field])
+				if (isSingle) {
+					this.form[field] = ''
+					this.previewImages[field] = ''
+				} else {
+					this.form[field].splice(index, 1)
+					this.previewImages[field].splice(index, 1)
+				}
+			},
+			removeImage(field) {
+				this.form[field] = ''
+				this.previewImages[field] = ''
+			},
+			getCategoryList() {
+				this.$u.api.getCategoryList({ type: 1 }).then(res => {
+					if (res.code === 200) {
+						this.carTypeList = res.data
+						this.carTypeColumns = [this.carTypeList.map(item => {
+							return {
+								id: item.id,
+								text: item.name
+							}
+						})]
+					}
+				})
+			},
+			getCarTypeText(value) {
+				if (!value) return '璇烽�夋嫨'
+				const item = this.carTypeList.find(option => option.id === value)
+				return item ? item.name : '璇烽�夋嫨'
+			},
+			confirmCarType(e) {
+				const { id, text } = e.value[0]
+				this.vehicleForm.carType = id
+				this.showCarTypePicker = false
+			},
+			openDatePicker(mode) {
+				this.datePickerMode = mode
+				if (mode === 'end' && this.form.cardStartDate) {
+					this.datePickerValue = new Date(this.form.cardStartDate).getTime()
+				} else {
+					this.datePickerValue = Number(new Date())
+				}
+				this.showDatePicker = true
+			},
+			confirmDate(e) {
+				const date = this.formatDate(e.value)
+				if (this.datePickerMode === 'start') {
+					this.form.cardStartDate = date
+				} else {
+					this.form.cardEndDate = date
+				}
+				this.showDatePicker = false
+			},
+			formatDate(timestamp) {
+				const date = new Date(timestamp)
+				const year = date.getFullYear()
+				const month = String(date.getMonth() + 1).padStart(2, '0')
+				const day = String(date.getDate()).padStart(2, '0')
+				return `${year}-${month}-${day}`
+			},
+			getAreaList() {
+				this.$u.api.treeList({
+					type: 0,
+					flag: 1
+				}).then(res => {
+					if (res.code === 200) {
+						this.areaList = res.data
+						this.areaColumns[0] = this.areaList.map(item => {
+							return {
+								id: item.id,
+								text: item.name
+							}
+						})
+						this.areaColumns[1] = this.areaList[0].childList.map(item => {
+							return {
+								id: item.id,
+								text: item.name
+							}
+						})
+						this.areaColumns[2] = this.areaList[0].childList[0].childList.map(item => {
+							return {
+								id: item.id,
+								text: item.name
+							}
+						})
+					}
+				})
+			},
+			changeAreaHandler(e) {
+				const { columnIndex, indexs, picker = this.$refs.uPicker } = e
+				if (columnIndex === 0) {
+					let city = this.areaList[indexs[0]].childList.map(item => {
+						return {
+							id: item.id,
+							text: item.name
+						}
+					})
+					let qu = this.areaList[indexs[0]].childList[0].childList.map(item => {
+						return {
+							id: item.id,
+							text: item.name
+						}
+					})
+					picker.setColumnValues(1, city)
+					picker.setColumnValues(2, qu)
+				} else if (columnIndex === 1) {
+					let qu = this.areaList[indexs[0]].childList[indexs[1]].childList.map(item => {
+						return {
+							id: item.id,
+							text: item.name
+						}
+					})
+					picker.setColumnValues(2, qu)
+				}
+			},
+			confirmArea(e) {
+				this.form.areaId = e.value[e.value.length - 1].id
+				this.form.areaName = e.value[0].text + '/' + e.value[1].text + '/' + e.value[2].text
+				this.showAreaPicker = false
+			},
 			handlePrimaryAction() {
 				if (this.currentStep === 1) {
+					if (!this.validateStep1()) return
 					this.scrollToTop()
 					this.currentStep = 2
+				} else {
+					if (!this.isAgreed) {
+						uni.showToast({ title: '璇峰厛鍚屾剰鍗忚', icon: 'none' })
+						return
+					}
+					this.submitVerify()
 				}
+			},
+			validateStep1() {
+				if (!this.form.name) {
+					uni.showToast({ title: '璇疯緭鍏ュ徃鏈哄鍚�', icon: 'none' })
+					return false
+				}
+				if (!this.form.idcard) {
+					uni.showToast({ title: '璇疯緭鍏ヨ韩浠借瘉鍙�', icon: 'none' })
+					return false
+				}
+				if (!this.form.maritalStatus && this.form.maritalStatus !== 0) {
+					uni.showToast({ title: '璇烽�夋嫨濠氬Щ鐘跺喌', icon: 'none' })
+					return false
+				}
+				if (!this.form.areaId) {
+					uni.showToast({ title: '璇烽�夋嫨灞呬綇鍩庡競', icon: 'none' })
+					return false
+				}
+				if (!this.form.livePlace) {
+					uni.showToast({ title: '璇疯緭鍏ヨ缁嗗湴鍧�', icon: 'none' })
+					return false
+				}
+				if (!this.form.aliAccount) {
+					uni.showToast({ title: '璇疯緭鍏ユ敮浠樺疂璐﹀彿', icon: 'none' })
+					return false
+				}
+				if (!this.form.aliName) {
+					uni.showToast({ title: '璇疯緭鍏ユ敮浠樺疂濮撳悕', icon: 'none' })
+					return false
+				}
+				if (!this.form.idcardImg) {
+					uni.showToast({ title: '璇蜂笂浼犺韩浠借瘉浜哄儚闈�', icon: 'none' })
+					return false
+				}
+				if (!this.form.idcardImgBack) {
+					uni.showToast({ title: '璇蜂笂浼犺韩浠借瘉鍥藉窘闈�', icon: 'none' })
+					return false
+				}
+				return true
+			},
+			validateStep2() {
+				if (!this.vehicleForm.plateNumber) {
+					uni.showToast({ title: '璇疯緭鍏ヨ溅鐗屽彿', icon: 'none' })
+					return false
+				}
+				if (!this.vehicleForm.carType) {
+					uni.showToast({ title: '璇烽�夋嫨杞﹁締绫诲瀷', icon: 'none' })
+					return false
+				}
+				if (!this.vehicleForm.color) {
+					uni.showToast({ title: '璇疯緭鍏ヨ溅杈嗛鑹�', icon: 'none' })
+					return false
+				}
+				if (this.form.carImgUrls.length === 0) {
+					uni.showToast({ title: '璇蜂笂浼犺溅杈嗙収鐗�', icon: 'none' })
+					return false
+				}
+				if (this.form.licenseImgUrls.length === 0) {
+					uni.showToast({ title: '璇蜂笂浼犻┚椹惰瘉鐓х墖', icon: 'none' })
+					return false
+				}
+				return true
+			},
+			submitVerify() {
+				if (!this.validateStep2()) return
+				uni.showLoading({ title: '鎻愪氦涓�...' })
+				const submitData = {
+					...this.form,
+					carType: this.vehicleForm.carType,
+					carColor: this.vehicleForm.color,
+					carCode: this.vehicleForm.plateNumber,
+					carImgUrls: this.form.carImgUrls || [],
+					licenseImgUrls: this.form.licenseImgUrls || [],
+					otherImgUrls: this.form.otherImgUrls || []
+				}
+				console.log(submitData)
+				this.$u.api.submitVerify(submitData).then(res => {
+					uni.hideLoading()
+					if (res.code === 200) {
+						uni.showToast({ title: '鎻愪氦鎴愬姛', icon: 'success' })
+						setTimeout(() => {
+							uni.navigateBack()
+						}, 1500)
+					} else {
+						uni.showToast({ title: res.msg || '鎻愪氦澶辫触', icon: 'none' })
+					}
+				}).catch(err => {
+					uni.hideLoading()
+					uni.showToast({ title: '鎻愪氦澶辫触', icon: 'none' })
+				})
 			},
 			goPrevStep() {
 				this.scrollToTop()
@@ -394,10 +857,11 @@
 			margin-bottom: 18rpx;
 		}
 
-		&__agreement-radio {
-			transform: scale(0.9);
-			transform-origin: left top;
+		&__agreement-icon {
+			width: 40rpx;
+			height: 40rpx;
 			margin-right: 6rpx;
+			flex-shrink: 0;
 		}
 
 		&__agreement-text {
@@ -489,7 +953,7 @@
 		}
 
 		&__upload-block {
-			padding-top: 28rpx;
+			padding: 30rpx 0;
 
 			&--stacked {
 				border-top: 1rpx solid #eef1f5;
@@ -500,7 +964,7 @@
 		&__upload-list {
 			display: flex;
 			gap: 20rpx;
-			margin-top: 22rpx;
+			margin-top: 30rpx;
 
 			&--single {
 				gap: 0;
@@ -508,6 +972,7 @@
 		}
 
 		&__upload-item {
+			position: relative;
 			flex: 1;
 			height: 144rpx;
 			border-radius: 16rpx;
@@ -516,6 +981,7 @@
 			flex-direction: column;
 			align-items: center;
 			justify-content: center;
+			overflow: visible;
 
 			&--single {
 				flex: none;
@@ -540,6 +1006,27 @@
 			color: #8f96a3;
 		}
 
+		&__upload-img {
+			width: 100%;
+			border-radius: 8rpx;
+		}
+
+		&__upload-remove {
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			width: 100%;
+			height: 40rpx;
+			line-height: 40rpx;
+			text-align: center;
+			background: rgba(0,0,0,0.5);
+			border-radius: 0rpx 0rpx 8rpx 8rpx;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			z-index: 99;
+		}
+
 		&__upload-tip {
 			margin-left: 10rpx;
 			font-size: 22rpx;

--
Gitblit v1.9.3