From 2d43a1df3f5ba42710e6d21c27d1e13bdb8dfd56 Mon Sep 17 00:00:00 2001
From: zhangwei <1504152376@qq.com>
Date: 星期一, 24 三月 2025 09:23:08 +0800
Subject: [PATCH] -

---
 src/pages/delivergoods/feedback.vue |  640 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 639 insertions(+), 1 deletions(-)

diff --git a/src/pages/delivergoods/feedback.vue b/src/pages/delivergoods/feedback.vue
index 02409e3..f597c84 100644
--- a/src/pages/delivergoods/feedback.vue
+++ b/src/pages/delivergoods/feedback.vue
@@ -1,8 +1,646 @@
 <template>
+	<up-sticky bgColor="#fff">
+		<view class="coreshop-ff content c-p-10">
+			<view class="coreshop-ff content c-p-l-10 c-p-t-10 c-p-r-10">
+				<up-search placeholder="璇风偣鍑婚�夋嫨鏃ユ湡" @click='clickTime' @clear='init' disabled v-model="workTime"
+					search-icon="calendar" @search='init'></up-search>
+			</view>
+		</view>
+	</up-sticky>
+	<view class="c-p-b-100">
+		<view class="c-p-l-20 c-p-r-20" v-if="orderList&&orderList.length>0">
+			<view class="listrecord c-p-t-20" v-for="(item,index) in orderList" :key="item.keyid">
+				<view class="coreshop-ff chuany-bradius20">
+					<view class="chuany-font26">
+						<view class="chuany-flex chuany-justify-between">
+							<text class="chuany-width5">{{index+1}}</text>
+							<view class="chuany-width15">
+								{{$util.formatDate(item.deliverTime,'riqi')}}
+							</view>
+							<view class="chuany-width67" @click='goDetail(item)'>
+								<u-text size='14' :text="item.companyName" lines="1">
+								<!-- <u-text size='14' :text="item.remark||item.companyName" lines="1"> -->
+								</u-text>
+							</view>
+							<view class="chuany-width11 chuany-flex chuany-justify-between">
+								<up-icon v-if="item.deliveredstatus=='Undeliver'" name="play-right" size='18'
+									@tap.stop='startOrder(item)'></up-icon>
+								<up-icon v-else-if="item.deliveredstatus=='Deliver'" name="checkbox-mark" size='18'
+									@tap.stop="editOrder(item)"></up-icon>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<up-loadmore :status="loadStatus" />
+		</view>
+		<view v-else>
+			<up-empty text='鏆傛棤' icon="/static/order.png">
+			</up-empty>
+		</view>
+		<up-modal title="瀹屾垚閫佽揣" :show="show7" showCancelButton @confirm="confirmSave" @cancel='cancelModal'
+			:asyncClose="true" ref='modalFinish'>
+			<up-form labelPosition="left" :model="arrangeInfo" ref="formFinishRef" labelWidth='140rpx'>
+				<up-form-item label="鏀惰揣鍗曚綅" prop="buyerId" :borderBottom='false' ref="item1">
+					<up-input v-model="arrangeInfo.companyName" placeholder="璇烽�夋嫨鏀惰揣鍗曚綅" border="none" readonly>
+					</up-input>
+				</up-form-item>
+				<up-form-item label="鎰忚鍙嶉" prop="wentifankui" labelPosition='top' :borderBottom='false' ref="item1">
+					<up-input v-model="arrangeInfo.wentifankui" border="none" placeholder="璇疯緭鍏ユ剰瑙佸弽棣�"></up-input>
+				</up-form-item>
+
+				<up-form-item label="閫佽揣鍗�" prop="attachments" required>
+					<tem-upload-file immediate :url="`https://appimchat.oss-cn-chengdu.aliyuncs.com`" ref="uploadB"
+						:isSource='true' fileType="all" @success="success('File',$event)" @error="errorInvoice"
+						@complete="completeInvoice('',$event)">
+					</tem-upload-file>
+				</up-form-item>
+			</up-form>
+		</up-modal>
+		<up-modal title="鍑鸿溅鎵撳崱" :show="showClockIn" showCancelButton @confirm="confirmClockSave" @cancel='cancelModal'
+			:asyncClose="true" ref='clockInModal'>
+			<up-form labelPosition="left" :model="clockInfo" ref="formClockInRef" labelWidth='140rpx'>
+				<up-form-item label="杞﹁締妫�鏌�" prop="carConditionAttachments" v-if="clockInfo.clockType=='ClockIn'"
+					required>
+					<tem-upload-file immediate btnText="涓婁紶鐓х墖" :url="`https://appimchat.oss-cn-chengdu.aliyuncs.com`"
+						ref="carCondition" :isSource='true' fileType="all"
+						@success="successClock('carCondition',$event)" @error="errorInvoice"
+						@complete="completeInvoice('carCondition',$event)">
+					</tem-upload-file>
+				</up-form-item>
+				<template v-else>
+					<up-form-item label="瑁呰揣鐓х墖" prop="attachments" required>
+						<tem-upload-file immediate btnText="涓婁紶鐓х墖" :url="`https://appimchat.oss-cn-chengdu.aliyuncs.com`"
+							ref="zhuanghuo" :isSource='true' fileType="all" @success="successClock('zhuanghuo',$event)"
+							@error="errorInvoice" @complete="completeInvoice('zhuanghuo',$event)">
+						</tem-upload-file>
+					</up-form-item>
+					<up-form-item label="鏈璐у師鍥�" prop="emptyCause" :borderBottom='false' @click="clickAction"
+						labelWidth='160rpx' ref="item1">
+						<up-input v-model="clockInfo.emptyCause" disabled border="none" disabledColor="#ffffff"
+							placeholder="璇烽�夋嫨鏈璐у師鍥�"></up-input>
+					</up-form-item>
+				</template>
+				<up-form-item label="閲岀▼琛�" required prop="mileage" :borderBottom='false' ref="item1">
+					<up-input v-model="clockInfo.mileage" placeholder="璇疯緭鍏ラ噷绋�" border="none" type="digit">
+						<template #suffix>
+							<text>km</text>
+						</template>
+					</up-input>
+				</up-form-item>
+				<up-form-item label="閲岀▼鐓х墖" required prop="mileageImg" :borderBottom='false' ref="item1">
+					<tem-upload-file immediate max="1" btnText="涓婁紶鐓х墖"
+						:url="`https://appimchat.oss-cn-chengdu.aliyuncs.com`" ref="licheng" :isSource='true'
+						fileType="all" @success="successClock('licheng',$event)" @error="errorInvoice"
+						@complete="completeInvoice('licheng',$event)">
+					</tem-upload-file>
+				</up-form-item>
+				<up-form-item label="杞﹀喌澶囨敞" prop="carCondition" labelPosition='top' :borderBottom='false' ref="item1">
+					<up-input v-model="clockInfo.carCondition" border="none" placeholder="璇疯緭鍏ヨ溅鍐靛娉�"></up-input>
+				</up-form-item>
+			</up-form>
+		</up-modal>
+		<fui-date-picker :show="datePickerShow" :value="getFirstDayOfMonth()" type="3" zIndex="10000"
+			@change="changePicker" :minDate='minDate' :maxDate='maxDate' @cancel="clickTime"></fui-date-picker>
+		<up-action-sheet :show="showActions" :actions="actions" title="璇烽�夋嫨" @close="showActions = false"
+			@select="selectItem">
+		</up-action-sheet>
+		<!-- <view class="tabbtns chuany-flex chuany-justify-between">
+			<view class="chuany-width45">
+				<up-button type="primary" text="鍑鸿溅鎵撳崱" @click="clockIn('ClockIn')"></up-button>
+			</view>
+			<view class="chuany-width45">
+				<up-button type="success" text="涓嬬彮鎵撳崱" @click="clockIn('Clockout')"></up-button>
+			</view>
+		</view> -->
+	</view>
 </template>
 
 <script>
+	import {
+		mapActions,
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				datePickerShow: false,
+				shougHuoshow: false,
+				workTime: this.$util.formatDate(new Date()),
+				orderList: [],
+				loadStatus: 'loadmore',
+				pageIndex: 1,
+				pageSize: 30,
+				contentVal: '',
+				customerList: [],
+				isEdit: false,
+				editItem: {},
+				isLoading: false,
+				show7: false,
+				showClockIn: false,
+				showActions: false,
+				driverName: '',
+				// actions: [{
+				// 	name: '鏈畬鎴�',
+				// 	id: 'Reject'
+				// }, {
+				// 	name: '宸插畬鎴�',
+				// 	id: 'Delivered'
+				// }],
+				actions: [{
+					name: '璐х墿涓嶉綈',
+					id: '璐х墿涓嶉綈'
+				}, {
+					name: '鏈畬宸�',
+					id: '鏈畬宸�'
+				}],
+				// selectAc: '宸插畬鎴�',
+				minDate: this.$util.formatDate(new Date(), null, -7),
+				maxDate: this.$util.formatDate(new Date(), null, 7),
+				deliverTime: Number(new Date(this.$util.formatDate(new Date(), null, 1))),
+				arrangeInfo: {
+					keyid: '',
+					wentifankui: '',
+					companyName: '',
+					attachments: [],
+					Deliveredstatus: 'Delivered'
+				},
+				rules: {
+					'mileage': {
+						type: 'string',
+						required: true,
+						message: '璇疯緭鍏ラ噷绋�',
+						trigger: ['blur', 'change']
+					},
+					'attachments': {
+						type: 'array',
+						required: true,
+						message: '璇蜂笂浼犺璐х収鐗�',
+						trigger: ['blur', 'change']
+					},
+					'carConditionAttachments': {
+						type: 'array',
+						required: true,
+						message: '璇蜂笂浼犺溅杈嗘鏌ョ収鐗�',
+						trigger: ['blur', 'change']
+					},
+					'mileageImg': {
+						type: 'string',
+						required: true,
+						message: '璇蜂笂浼犻噷绋嬬収鐗�',
+						trigger: ['blur', 'change']
+					},
+				},
+				rules1: {
+					'attachments': {
+						type: 'array',
+						required: true,
+						message: '璇蜂笂浼犻�佽揣鍗曠収鐗�',
+						trigger: ['blur', 'change']
+					},
+				},
+				radio: '',
+				switchVal: false,
+				driverList: [],
+				buyerName: '',
+				timeStart: new Date(),
+				timeEnd: new Date(),
+				sevenDaysDriver: [],
+				deliverKeyID: '',
+				deliverKeyName: '',
+				companyName: '',
+				clockInfo: {
+					emptyCause: '',
+					carConditionAttachments: [],
+					attachments: [],
+					mileageImg: '',
+					clockType: '', //ClockIn ,Clockout
+					carCondition: ''
+				},
+			}
+		},
+		onShow() {
+			this.init()
+		},
+		onReady() {
+			this.$refs.formClockInRef.setRules(this.rules);
+			this.$refs.formFinishRef.setRules(this.rules1);
+		},
+		onLoad() {
+			this.Getdrivers()
+			this.getCustomer()
+			this.GetDriversOfWithin7days()
+		},
+		onReachBottom() {
+			if (this.loadStatus != 'nomore') {
+				this.getList()
+			}
+		},
+		onPullDownRefresh() {
+			this.timeStart = new Date()
+			this.timeEnd = new Date()
+			this.workTime = this.$util.formatDate(new Date())
+			this.deliverKeyName = ''
+			this.init()
+			uni.stopPullDownRefresh();
+		},
+		methods: {
+			clockIn(text) {
+				this.clockInfo.clockType = text
+				this.showClockIn = true
+			},
+			success(text, e) {
+				//e.res 涓烘湇鍔″櫒杩斿洖鏁版嵁
+				//涓婁紶鎴愬姛鍥炶皟锛屽鐞嗘湇鍔″櫒杩斿洖鏁版嵁銆愭澶勬牴鎹疄闄呰繑鍥炴暟鎹繘琛屽鐞嗐��
+				let obj = {}
+				let res = e.res
+				if (res.statusCode == 200) {
+					obj.PlanAttachment = res.data
+					this.arrangeInfo.attachments.push(obj)
+					this.$refs.uploadB.urls.push(res.data)
+					this.$refs.uploadB.urls = this.$refs.uploadB.urls.filter(item => {
+						return item.indexOf('https') !== -1
+					})
+					this.$refs.uploadB.status.push('success')
+					this.$refs.uploadB.status.length = this.$refs.uploadB.urls.length
+				} else {
+					uni.$u.toast(res.error)
+					this.$refs.uploadB.deleteImage()
+				}
+				console.log(this.arrangeInfo.attachments);
+			},
+			successClock(text, e) {
+				let obj = {}
+				//e.res 涓烘湇鍔″櫒杩斿洖鏁版嵁
+				//涓婁紶鎴愬姛鍥炶皟锛屽鐞嗘湇鍔″櫒杩斿洖鏁版嵁銆愭澶勬牴鎹疄闄呰繑鍥炴暟鎹繘琛屽鐞嗐��
+				let res = e.res
+				// let res = JSON.parse(e.res.data.replace(/\ufeff/g, "") || "{}")
+				if (res.statusCode == 200) {
+					if (res.data && text == 'carCondition') {
+						obj.planAttachment = res.data //杞﹁締妫�鏌ョ収鐗�
+						this.$refs.carCondition.urls.push(res.data)
+						this.$refs.carCondition.urls = this.$refs.carCondition.urls.filter(item => {
+							return item.indexOf('https') !== -1
+						})
+						this.$refs.carCondition.status.push('success')
+						this.$refs.carCondition.status.length = this.$refs.carCondition.urls.length
+						console.log(this.$refs.carCondition.status);
+						this.clockInfo.carConditionAttachments.push(obj)
+					} else if (res.data && text == 'licheng') {
+						this.clockInfo.mileageImg = res.data //閲岀▼鐓х墖
+						this.$refs.licheng.urls.push(res.data)
+						this.$refs.licheng.urls = this.$refs.licheng.urls.filter(item => {
+							return item.indexOf('https') !== -1
+						})
+						this.$refs.licheng.status.push('success')
+						this.$refs.licheng.status.length = this.$refs.licheng.urls.length
+					} else {
+						obj.planAttachment = res.data //瑁呰揣鐓х墖
+						this.$refs.zhuanghuo.urls.push(res.data)
+						this.$refs.zhuanghuo.urls = this.$refs.zhuanghuo.urls.filter(item => {
+							return item.indexOf('https') !== -1
+						})
+						this.$refs.zhuanghuo.status.push('success')
+						this.$refs.zhuanghuo.status.length = this.$refs.zhuanghuo.urls.length
+						this.clockInfo.attachments.push(obj)
+					}
+				} else {
+					uni.$u.toast(res.error)
+					if (text == 'carCondition') {
+						this.$refs.carCondition.deleteImage()
+					} else if (text == 'licheng') {
+						this.$refs.licheng.deleteImage()
+					} else {
+						this.$refs.zhuanghuo.deleteImage()
+					}
+				}
+			},
+			GetDriversOfWithin7days() {
+				this.$api.GetDriversOfWithin7days().then(res => {
+					if (res.code == 1) {
+						this.sevenDaysDriver = res.data
+					}
+				})
+			},
+			changePicker(val) {
+				console.log(val);
+				this.workTime = val.result 
+				this.timeStart = new Date(val.result) //宸ヤ綔寮�濮嬫椂闂�
+				this.timeEnd = new Date(val.result)
+				this.datePickerShow = !this.datePickerShow
+				this.init()
+			},
+			confirmDate(val) {
+				console.log(val);
+				this.arrangeInfo.deliverTime = val
+				this.shougHuoshow = false
+			},
+			getCustomer() {
+				this.$api.GeCorporateClients().then(res => {
+					if (res.code == 1) {
+						this.customerList = res.data
+						this.customerList.forEach(item => {
+							item.name = item.companyName
+						})
+					}
+				})
+			},
+			selectItem(item) {
+				this.arrangeInfo.Deliveredstatus = item.id
+				// this.selectAc = item.name
+			},
+			getFirstDayOfMonth() {
+				var currentDate = new Date();
+				// currentDate.setDate(1); // 灏嗘棩鏈熻涓�1
+				return this.$util.formatDate(currentDate);
+			},
+			clickTime() {
+				this.datePickerShow = !this.datePickerShow
+			},
+			clickShouTime() {
+				this.shougHuoshow = !this.shougHuoshow
+			},
+			clickAction() {
+				this.showActions = true
+				uni.hideKeyboard()
+			},
+			editOrder(item) {
+				this.isEdit = true
+				this.$refs.uploadB.urls = []
+				this.$refs.uploadB.status = []
+				this.arrangeInfo.keyid = item.keyid
+				this.arrangeInfo.companyName = item.companyName
+				this.show7 = true
+				// let obj = this.customerList.find(ite => {
+				// 	return ite.keyid == item.buyerId
+				// })
+				// this.buyerName = obj.companyName
+			},
+			startOrder(item) {
+				let that = this
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭寮�濮嬮�佽揣鍚楋紵',
+					success: function(res) {
+						if (res.confirm) {
+							// 鎵ц纭鍚庣殑鎿嶄綔
+							that.$api.StartDeliverPlan(item.keyid).then(req => {
+								if (req.code == 1) {
+									that.$util.showToast({
+										title: '寮�濮嬮�佽揣鎴愬姛锛�'
+									})
+									that.init()
+								} else {
+									that.$util.showToast({
+										title: req.error
+									})
+								}
+							})
+						} else {
+							// 鎵ц鍙栨秷鍚庣殑鎿嶄綔
+						}
+					}
+				})
+			},
+			init() {
+				this.pageIndex = 1
+				this.pageSize = 30
+				this.loadStatus = 'loadmore'
+				this.orderList = []
+				this.contentVal = ''
+				this.getList()
+			},
+			//閫夋嫨鍥剧墖鎴栦笂浼犲畬鎴愭椂瑙﹀彂
+			completeInvoice(val, e) {
+				if (e.action == 'delete') {
+					if (val == 'licheng') {
+						this.clockInfo.mileageImg = ''
+						return
+					}
+					switch (val) {
+						case 'carCondition':
+							this.clockInfo.carConditionAttachments = []
+							break;
+						case 'zhuanghuo':
+							this.clockInfo.attachments = []
+							break;
+						default:
+							this.arrangeInfo.attachments = []
+							break;
+					}
+					// 鍒犻櫎澶勭悊
+					console.log(e.urls, 'e.urls', this.arrangeInfo.attachments);
+					e.urls.forEach(item => {
+						let obj = {}
+						obj.planAttachment = item //鍙戠エ
+						console.log(item);
+						switch (val) {
+							case 'carCondition':
+								this.clockInfo.carConditionAttachments.push(obj)
+								break;
+							case 'zhuanghuo':
+								this.clockInfo.attachments.push(obj)
+								break;
+							default:
+								this.arrangeInfo.attachments.push(obj)
+								break;
+						}
+					})
+					console.log(e, this.arrangeInfo, this.clockInfo, '0-0-0-');
+					return
+				}
+				// $util.pathToBase64(e.urls[0]).then(res => {
+				// 	idCardFaceBase64.value = res
+				// 	console.log(idCardFaceBase64, idCardFaceBase64.value);
+				// })
+			},
+			errorInvoice(e) {
+				console.log(e, '--------------');
+			},
+			confirmSave() {
+				this.$refs.formFinishRef.validate().then(res => {
+					this.$api.FinishDeliverPlan(this.arrangeInfo).then(res => {
+						if (res.code == 1) {
+							this.arrangeInfo = {
+								keyid: '',
+								wentifankui: '',
+								companyName: '',
+								attachments: [],
+								Deliveredstatus: 'Delivered'
+							}
+							this.show7 = false
+							this.driverName = ''
+							this.buyerName = ''
+							this.init()
+						} else {
+							this.$refs.modalFinish.loading = false
+							this.$util.showToast({
+								title: res.error
+							})
+						}
+					})
+				}).catch(errors => {
+					this.$refs.modalFinish.loading = false
+				})
+			},
+			confirmClockSave() {
+				console.log(this.clockInfo);
+				// if (!this.clockInfo.mileageImg) {
+				// 	this.$refs.clockInModal.loading = false
+				// 	return this.$util.showToast({
+				// 		title: '璇蜂笂浼犻噷绋嬬収鐗囷紒'
+				// 	})
+				// }
+				this.clockInfo = this.$util.removeEmptyValuesRecursive(this.clockInfo)
+				this.$refs.formClockInRef.validate().then(res => {
+					this.$api.Clock(this.clockInfo).then(res => {
+						if (res.code == 1) {
+							this.clockInfo = {
+								emptyCause: '',
+								carConditionAttachments: [],
+								mileageImg: '',
+								attachments: [],
+								clockType: '', //ClockIn ,Clockout
+								carCondition: ''
+							}
+							this.showClockIn = false
+							// this.init()
+						} else {
+							this.$util.showToast({
+								title: res.error
+							})
+							this.$refs.clockInModal.loading = false
+						}
+					})
+				}).catch(errors => {
+					this.$refs.clockInModal.loading = false
+				})
+
+
+			},
+			cancelModal() {
+				this.showClockIn = false
+				this.show7 = false
+				this.arrangeInfo = {
+					deliverTime: this.$util.formatDate(new Date(), null, 1),
+					driverId: '',
+					buyerId: '',
+					dianhua: '',
+					wentifankui: '',
+					lianxiren: '',
+					dizhi: '',
+				}
+				this.clockInfo = {
+					emptyCause: '',
+					carConditionAttachments: [],
+					mileageImg: '',
+					attachments: [],
+					clockType: '', //ClockIn ,Clockout
+					carCondition: ''
+				}
+				this.driverName = ''
+				this.buyerName = ''
+			},
+			Getdrivers() {
+				this.$api.Getdrivers().then(res => {
+					if (res.code == 1) {
+						this.driverList = res.data
+					}
+				})
+			},
+			getList() {
+				this.deliverKeyName == '' ? this.deliverKeyID = '' : null
+				let data = {
+					page: {
+						pageIndex: this.pageIndex,
+						pageSize: this.pageSize,
+					}
+				}
+				if (this.timeStart) {
+					data.timeStart = this.timeStart
+				}
+				if (this.timeEnd) {
+					data.timeEnd = this.timeEnd
+				}
+				if (this.deliverKeyID) {
+					data.deliverKeyID = this.deliverKeyID
+				}
+				this.$api.driverGetDeliverPlans(data).then(res => {
+					if (res.code == 1) {
+						if (this.pageIndex == 1) {
+							this.orderList = res.data.data
+						} else {
+							this.orderList = this.orderList.concat(...res.data.data)
+						}
+						console.log(this.orderList, 'orderList鈥�');
+						// totalPages = res.data.totalCount
+						// 鏍规嵁count鏁伴噺鍒ゆ柇鏄惁杩樻湁鏁版嵁
+						if (res.data.page.totalCount > this.orderList.length) {
+							this.loadStatus = 'loadmore'
+							this.pageIndex++
+						} else {
+							// 鏁版嵁宸插姞杞藉畬姣�
+							this.loadStatus = 'nomore'
+						}
+					} else {
+						// _that.$refs.uToast.show({ message: res.msg, type: 'error' });
+					}
+				})
+			},
+			accept(item) {
+				let that = this
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭鍙楃悊璇ラ�佽揣鍚楋紵',
+					success: function(res) {
+						if (res.confirm) {
+							// 鎵ц纭鍚庣殑鎿嶄綔
+							that.$api.AcceptAppointmentDeliver(item.keyid).then(req => {
+								if (req.code == 1) {
+									that.$util.showToast({
+										title: '鍙楃悊鎴愬姛锛�'
+									})
+									that.init()
+								} else {
+									that.$util.showToast({
+										title: req.error
+									})
+								}
+							})
+						} else {
+							// 鎵ц鍙栨秷鍚庣殑鎿嶄綔
+						}
+					}
+				})
+			},
+			actionClick(item, e) {
+				console.log(e);
+				if (e.index == 0) {
+					this.contentVal = item.wentifankui
+				}
+			},
+			goDetail(item) {
+				uni.navigateTo({
+					url: `/pages/delivergoods/feedbackdetail?KeyId=${item.keyid}`
+				});
+			}
+		}
+	}
 </script>
 
-<style>
+<style lang="scss">
+	.u-textarea {
+		padding: 0 !important;
+	}
+
+	.u-form-item__body {
+		padding: 5px 0 !important;
+	}
+
+	.labelSty {
+		.u-form-item__body__left.data-v-98223e3d {
+			display: block;
+		}
+	}
 </style>
\ No newline at end of file

--
Gitblit v1.9.1