261 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Vue
		
	
	
		
		
			
		
	
	
			261 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Vue
		
	
	
|  | <template> | |||
|  | 	<view class="apply-refund"> | |||
|  | 		<view class="goods bg-white m-t-20"> | |||
|  | 			<view class="flex"> | |||
|  | 				<u-image width="160rpx" height="160rpx" border-radius="6rpx" lazy-load :src="goods.image" /> | |||
|  | 				<view class="goods-info"> | |||
|  | 					<view class="line-2">{{goods.goods_name}}</view> | |||
|  | 					<view class="xs muted m-t-10">{{goods.spec_value}}</view> | |||
|  | 				</view> | |||
|  | 			</view> | |||
|  | 		</view> | |||
|  | 		<view class="opt-box m-t-20 bg-white"> | |||
|  | 			<view v-show="!hiddenOpt"> | |||
|  | 				<view class="opt-item flex row-between border-line" @tap="onlyRefund"> | |||
|  | 					<view> | |||
|  | 						<view class="lg">仅退款</view> | |||
|  | 						<view class="muted xs m-t-10">未收到货,与卖家协商同意无需退货只需退款</view> | |||
|  | 					</view> | |||
|  | 					<u-icon class="m-l-10" name="arrow-right" size="28" /> | |||
|  | 				</view> | |||
|  | 				<view class="opt-item flex row-between" @tap="allRefunds"> | |||
|  | 					<view> | |||
|  | 						<view class="lg">退货退款</view> | |||
|  | 						<view class="muted xs m-t-10">已收到货,需退还收到的实物</view> | |||
|  | 					</view> | |||
|  | 					<u-icon class="m-l-10" name="arrow-right" size="28" /> | |||
|  | 				</view> | |||
|  | 			</view> | |||
|  | 			<view v-show="hiddenOpt"> | |||
|  | 				<view class="refund-info flex row-between m-t-20"> | |||
|  | 					<view class="lable">数量</view> | |||
|  | 					<view>{{goods.goods_num}}</view> | |||
|  | 				</view> | |||
|  | 				<view class="refund-info flex row-between"> | |||
|  | 					<view class="lable">退款金额</view> | |||
|  | 					<price-format :color="colorConfig.primary" :price="goods.goods_price" /> | |||
|  | 				</view> | |||
|  | 				<view class="refund-info flex row-between" @tap="showPop=true"> | |||
|  | 					<view class="lable">退款原因</view> | |||
|  | 					<view class="flex"> | |||
|  | 						<text :class="{muted: !reasonString}">{{reasonString ? reasonString : '请选择' }}</text> | |||
|  | 						<u-icon class="m-l-10" name="arrow-right" size="28" /> | |||
|  | 					</view> | |||
|  | 				</view> | |||
|  | 				<view class="refund-info flex col-top"> | |||
|  | 					<view class="label">备注说明</view> | |||
|  | 					<view class="flex-1" style="background-color: #F8F8F8;"> | |||
|  | 						<u-input v-model="remark" type="textarea" placeholder="请描述申请售后的具体原因,100字以内" :border="false" | |||
|  | 							:height="160" /> | |||
|  | 					</view> | |||
|  | 				</view> | |||
|  | 				<view class="upload bg-white"> | |||
|  | 					<view class="title flex row-between"> | |||
|  | 						<view>上传凭证</view> | |||
|  | 						<view class="muted">(选填,最多可上传1张)</view> | |||
|  | 					</view> | |||
|  | 					<u-upload ref="uUpload" :show-progress="false" :header="{token: $store.getters.token}" | |||
|  | 						:max-count="1" width="160" height="160" :action="action" upload-text="上传图片" | |||
|  | 						@on-success="onSuccess" @on-remove="onRemove" /> | |||
|  | 				</view> | |||
|  | 			</view> | |||
|  | 		</view> | |||
|  | 
 | |||
|  | 		<button v-show="hiddenOpt" class="btn br60" type="primary" size="lg" @tap="onSubmit">申请退款</button> | |||
|  | 
 | |||
|  | 		<u-select v-model="showPop" mode="single-column" value-name="index" label-name="name" :list="reason" | |||
|  | 			@confirm="confirmSelect"></u-select> | |||
|  | 	</view> | |||
|  | 
 | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | 	import { | |||
|  | 		refundOptType | |||
|  | 	} from "@/utils/type"; | |||
|  | 	import { | |||
|  | 		baseURL | |||
|  | 	} from '@/config/app'; | |||
|  | 	import { | |||
|  | 		getGoodsInfo, | |||
|  | 		applyAfterSale, | |||
|  | 		applyAgain | |||
|  | 	} from "@/api/user"; | |||
|  | 	import { | |||
|  | 		uploadFile, | |||
|  | 		trottle | |||
|  | 	} from '@/utils/tools.js'; | |||
|  | 
 | |||
|  | 	export default { | |||
|  | 		data() { | |||
|  | 			return { | |||
|  | 				action: baseURL + '/api/file/formimage', | |||
|  | 				hiddenOpt: false, | |||
|  | 				optTyle: refundOptType.ONLY_REFUND, | |||
|  | 				goods: {}, | |||
|  | 				reason: [], | |||
|  | 				showPop: false, | |||
|  | 				reasonString: '', | |||
|  | 				fileList: [], | |||
|  | 				remark: "" | |||
|  | 			}; | |||
|  | 		}, | |||
|  | 		onLoad(options) { | |||
|  | 			const { | |||
|  | 				order_id, | |||
|  | 				item_id, | |||
|  | 				after_sale_id | |||
|  | 			} = this.$Route.query | |||
|  | 			this.orderId = order_id; | |||
|  | 			this.itemId = item_id; | |||
|  | 			this.afterSaleId = after_sale_id; | |||
|  | 			this.getGoodsInfoFun(); | |||
|  | 			this.onSubmit = trottle(this.onSubmit, 1000, this) | |||
|  | 		}, | |||
|  | 
 | |||
|  | 		methods: { | |||
|  | 			confirmSelect(e) { | |||
|  | 				this.reasonString = e[0].label | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			onlyRefund() { | |||
|  | 				this.optTyle = refundOptType.ONLY_REFUND | |||
|  | 				this.hiddenOpt = true | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			allRefunds() { | |||
|  | 				this.optTyle = refundOptType.REFUNDS; | |||
|  | 				this.hiddenOpt = true; | |||
|  | 			}, | |||
|  | 			onSuccess(e) { | |||
|  | 				this.fileList.push(e.data.base_uri) | |||
|  | 			}, | |||
|  | 			onRemove(index) { | |||
|  | 				this.fileList.splice(index, 1) | |||
|  | 				console.log(index) | |||
|  | 			}, | |||
|  | 			async onSubmit() { | |||
|  | 				const { | |||
|  | 					reason, | |||
|  | 					reasonString, | |||
|  | 					optTyle, | |||
|  | 					remark, | |||
|  | 					fileList | |||
|  | 				} = this; | |||
|  | 				if (!reasonString) { | |||
|  | 					return this.$toast({ | |||
|  | 						title: '请选择退款原因' | |||
|  | 					}); | |||
|  | 				} | |||
|  | 				const params = { | |||
|  | 					reason: reasonString, | |||
|  | 					refund_type: optTyle, | |||
|  | 					remark: remark, | |||
|  | 					img: fileList.length ? fileList[0] : '' | |||
|  | 				}; | |||
|  | 				if (this.afterSaleId) { | |||
|  | 					params.id = this.afterSaleId | |||
|  | 				} else { | |||
|  | 					params.item_id = this.itemId | |||
|  | 					params.order_id = this.orderId | |||
|  | 				} | |||
|  | 				const { | |||
|  | 					data, | |||
|  | 					code, | |||
|  | 					msg | |||
|  | 				} = this.afterSaleId ? await applyAgain(params) : await applyAfterSale(params) | |||
|  | 				if (code == 1) { | |||
|  | 					this.$toast({ | |||
|  | 						title: msg | |||
|  | 					}); | |||
|  | 					uni.$emit("refreshsale") | |||
|  | 					setTimeout(() => { | |||
|  | 						this.$Router.replace({ | |||
|  | 							path: '/bundle/pages/after_sales_detail/after_sales_detail', | |||
|  | 							query: { | |||
|  | 								id: data.after_sale_id | |||
|  | 							} | |||
|  | 						}) | |||
|  | 					}, 1000) | |||
|  | 				} | |||
|  | 
 | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			getGoodsInfoFun() { | |||
|  | 				let { | |||
|  | 					orderId, | |||
|  | 					itemId | |||
|  | 				} = this; | |||
|  | 				getGoodsInfo({ | |||
|  | 					order_id: orderId, | |||
|  | 					item_id: itemId | |||
|  | 				}).then(res => { | |||
|  | 					if (res.code == 1) { | |||
|  | 						this.goods = res.data.goods; | |||
|  | 						this.reason = res.data.reason.map((item, index) => ({ | |||
|  | 							name: item, | |||
|  | 							index | |||
|  | 						})); | |||
|  | 					} | |||
|  | 				}); | |||
|  | 			} | |||
|  | 
 | |||
|  | 		} | |||
|  | 	}; | |||
|  | </script> | |||
|  | <style lang="scss"> | |||
|  | 	.apply-refund { | |||
|  | 		padding-bottom: 50rpx; | |||
|  | 
 | |||
|  | 		.goods { | |||
|  | 			padding: 20rpx 24rpx; | |||
|  | 
 | |||
|  | 			.goods-info { | |||
|  | 				margin-left: 24rpx; | |||
|  | 				flex: 1; | |||
|  | 			} | |||
|  | 		} | |||
|  | 
 | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.opt-box { | |||
|  | 		.opt-item { | |||
|  | 			padding: 20rpx 20rpx 30rpx; | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 	.apply-refund { | |||
|  | 		.refund-info { | |||
|  | 			padding: 24rpx 20rpx; | |||
|  | 			border-bottom: $-solid-border; | |||
|  | 
 | |||
|  | 			.label { | |||
|  | 				width: 140rpx; | |||
|  | 				margin-top: 19rpx; | |||
|  | 			} | |||
|  | 
 | |||
|  | 			textarea { | |||
|  | 				flex: 1; | |||
|  | 				height: 172rpx; | |||
|  | 				border-radius: 10rpx; | |||
|  | 				padding: 20rpx; | |||
|  | 				box-sizing: border-box; | |||
|  | 			} | |||
|  | 		} | |||
|  | 
 | |||
|  | 		.upload { | |||
|  | 			padding: 0 20rpx 30rpx; | |||
|  | 
 | |||
|  | 			.title { | |||
|  | 				padding: 24rpx 0; | |||
|  | 			} | |||
|  | 		} | |||
|  | 
 | |||
|  | 		.btn { | |||
|  | 			margin: 30rpx 26rpx | |||
|  | 		} | |||
|  | 	} | |||
|  | </style> |