Zory 3 weken geleden
bovenliggende
commit
378a7cfbb0

+ 1 - 1
奥莱优品/App.vue

@@ -46,7 +46,7 @@ export default {
 				force:true,
 				success(lres){
 					tt.request({
-						url:"https://tran.jsshuita.cn/v2/home/mobile",
+						url:"https://tran.jsshuita.cn/dy/home/mobile",
 						data:{iv:iv,encryptedData:encryptedData,code:lres.code},
 						method:"POST",
 						success(res){

+ 16 - 0
奥莱优品/api/model/complaint.js

@@ -0,0 +1,16 @@
+import request from '@/static/js/request.js'
+
+export default {
+	list: {
+		url: `/complaint/list`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	},
+	detail: {
+		url: `/complaint/detail`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	}
+}

+ 18 - 0
奥莱优品/api/model/order.js

@@ -19,10 +19,28 @@ export default {
 			return await request.request(this.url,"GET",data,false,true,true)
 		}
 	},
+	goods: {
+		url: `/order/goods`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	},
 	complaint: {
 		url: `/order/complaint`,
 		post: async function(data={}) {
 			return await request.request(this.url,"POST",data,false,true,true)
 		}
+	},
+	address: {
+		url: `/order/done`,
+		post: async function(data={}) {
+			return await request.request(this.url,"POST",data,false,true,true)
+		}
+	},
+	refund: {
+		url: `/order/refund`,
+		post: async function(data={}) {
+			return await request.request(this.url,"POST",data,false,true,true)
+		}
 	}
 }

+ 175 - 0
奥莱优品/components/chat/goods.vue

@@ -0,0 +1,175 @@
+<template>
+	<view>
+		<uni-popup ref="orderPop" type="bottom" border-radius="10px 10px 0 0" background-color="#f1f1f1" :mask-click="false">
+			<view class="order-popup">
+				<view class="order-title">
+					<view class="name">选择商品</view>
+					<view class="close" @click="closeOrder()"><image src="/static/image/close.png"></image></view>
+				</view>
+				<view class="order-body-con" v-if="orderList.length > 0">
+				<scroll-view class="order-body" scroll-y scroll-with-animation @scrolltoupper="scrolltoupper" @scrolltolower="scrolltolower" upper-threshold="80">
+					<view class="m-order-s" v-for="(items,index) in orderList" :key="index">
+						<view class="order-img" @click="checkOrder(index,items.check)"><image :src="items.image" mode="widthFix"></image></view>
+						<view class="order-info">
+							<view class="title" @click="checkOrder(index,items.check)">{{items.title}}</view>
+							<view class="desc">
+								<uni-number-box v-model="items.number" :min="1"></uni-number-box>
+							</view>
+						</view>
+						<view class="status-btn-group" @click="checkOrder(index,items.check)">
+							<view class="status danger" v-if="!items.check">选择</view>
+							<view class="status success" v-else>已选择</view>
+						</view>
+					</view>
+					<view class="view-more" v-if="orderData.loading">
+						<uni-load-more status="loading"></uni-load-more>
+					</view>
+				</scroll-view>
+				</view>
+				<view class="order-body" v-else>
+					<view class="empty-body">暂无数据...</view>
+				</view>
+				<view class="address-footer" v-if="orderList.length > 0">
+					<view class="footer-btn" @click="closeOrder">取消</view>
+					<view class="footer-btn full" @click="sendGoods">确定</view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script>
+export default {
+	data () {
+		return {
+			orderList:[],
+			orderData:{
+				page:1,
+				size:10,
+				loading:false,
+				isDone:false
+			},
+			orderId:0,
+			goodsNum:0
+		}
+	},
+	methods: {
+		open() {
+			this.$nextTick(()=>{
+				this.$refs.orderPop.open()
+			})
+			return this;
+		},
+		checkOrder(index,state) {
+			this.orderList[index].check = !state;
+		},
+		closeOrder(){
+			this.$nextTick(()=>{
+				this.$refs.orderPop.close()
+			})
+		},
+		setData(data) {
+			this.orderData.page = 1;
+			this.orderData.loading = false;
+			this.orderData.isDone = false;
+			this.orderList  = [];
+			app.orderId = data.order;
+			app.goodsNum = data.num;
+			this.getOrder();
+		},
+		sendGoods(){
+			var checkedItems = this.orderList.filter(item => item.check === true);
+			if (checkedItems.length == 0) return this.$dialog.showSuccess("请至少选择一个")
+			var total = checkedItems.reduce((sum, item) => sum + item.number, 0);
+			if (total < app.goodsNum) return this.$dialog.showSuccess("请选择"+app.goodsNum+"份")
+			if (total > app.goodsNum) return this.$dialog.showSuccess("最多只能选择"+app.goodsNum+"份")
+			this.$refs.orderPop.close()
+			this.$emit("send",checkedItems)
+		},
+		sendOrder(data){
+			this.$refs.orderPop.close()
+			this.$emit("send",data)
+		},
+		scrolltoupper(){},
+		scrolltolower(e){
+			if (this.orderData.isDone || this.orderList.length == 0) return ;
+			this.getOrder()
+		},
+		async getOrder(){
+			this.orderData.loading = true;
+			var formData = {};
+			formData.order = app.orderId;
+			formData.page = this.orderData.page;
+			formData.size = this.orderData.size;
+			// formData.status = 1;
+			var resp = await this.$api.order.goods.get(formData)
+			this.orderData.loading = false;
+			if (resp.code == 0) {
+				return this.$dialog.showSuccess(resp.msg)
+			}
+			if (resp.data.data.length > 0) {
+				this.orderData.page ++;
+				this.orderList = [...this.orderList,...resp.data.data];
+			} else {
+				this.orderData.isDone = true;
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.order-popup .order-title{display: flex;align-items: center;justify-content: space-between;font-size: 32upx;padding: 20upx;font-weight: bold;}
+.order-popup .input-value-border{border: 0;}
+.order-popup .order-title.bb1{border-bottom: 2upx solid #efefef;}
+.order-popup .order-title image{width: 40upx;height: 40upx;}
+.order-popup .order-body{
+	height: 50vh;overflow: auto;background-color: #fff;border-radius: 20rpx;
+}
+.order-popup.address .order-body{height: 60vh;overflow: auto;padding: 20upx;}
+.order-body-con{margin: 20rpx;}
+
+.view-more{text-align: center;font-size: 24upx;color: #666;padding: 20upx;}
+.order-popup .u-input {height: 60upx;}
+.order-popup .submit-btn{
+	border-top: 2upx solid #efefef;
+	border-radius: 0;
+}
+.address-footer{
+	display: flex;
+	align-items: center;
+	justify-content: space-around;
+	gap: 20rpx;
+	padding: 0 20rpx 20rpx;
+	.footer-btn{
+		background-color: #fff;
+		border: 2rpx solid $main-text-color;
+		border-radius: 10rpx;
+		color: $main-text-color;
+		height: 80rpx;
+		line-height: 80rpx;
+		text-align: center;
+		flex: 1;
+		&.full{
+			border: 2rpx solid $main-color;
+			background-color: $main-color;
+			color: #fff;
+		}
+	}
+}
+.m-order-s{border-bottom:2rpx solid #f1f1f1;border-radius: 10upx;display: flex;font-size: 28upx;position: relative;padding: 20upx;}
+.m-order-s .order-img {display: flex;align-items: center;justify-content: center;}
+.m-order-s .order-img image{width: 150upx;height: 150upx;}
+.m-order-s .order-info {padding: 15upx;flex:1;overflow: hidden;}
+.m-order-s .order-info .title{font-size: 28upx;overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 2;display: -webkit-box;-webkit-box-orient: vertical;}
+.m-order-s .order-info .desc{font-size: 24upx;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;color: #999;margin-top: 10rpx;}
+.m-order-s .order-info .price{font-size: 28upx;color: #f00;}
+.m-order-s .status-btn-group{position: absolute;right: 10rpx;bottom: 10rpx;display: flex;align-items: center;gap: 15upx;}
+.m-order-s .status{border-radius: 10upx 0 10upx 0;background-color: #909399;font-size: 24upx;color: #fff;padding: 10upx;}
+.m-order-s .status.info{background-color: #909399;}
+.m-order-s .status.primary{background-color: #409eff;}
+.m-order-s .status.success{background-color: #67c23a;}
+.m-order-s .status.danger{background-color: #f56c6c;}
+.m-order-s .status.warn{background-color: #e6a23c;}
+.empty-body{display: flex;align-items: center;justify-content: center;height: 100%;}
+</style>

+ 1 - 1
奥莱优品/components/kfService/complaint.vue

@@ -73,7 +73,7 @@ export default {
 <style>
 .ts-body .ts-title{display: flex;align-items: center;justify-content: space-between;font-size: 28upx;padding: 20upx;}
 .ts-body .ts-title image{width: 40upx;height: 40upx;}
-.ts-body .ts-content{height: 40vh;overflow: auto;padding: 20upx;}
+.ts-body .ts-content{height: 60vh;overflow: auto;padding: 20upx;}
 .ts-body .ts-list{margin-bottom: 20upx;}
 .ts-body .ts-list .ts-sub-title{line-height: 32upx;color: #666;font-size: 24upx;margin-bottom: 20upx;}
 .ts-body .ts-list .ts-item-body{background-color: #fff;border-radius: 10upx;padding: 20upx;}

+ 32 - 0
奥莱优品/components/kfService/kfService.vue

@@ -46,6 +46,38 @@ export default {
 			this.$nextTick(()=>{
 				this.$refs.servicePop.open()
 			})
+		},
+		callMobile(mobile){
+			uni.makePhoneCall({
+				phoneNumber:mobile,
+				success() {
+
+				},
+				fail() {
+
+				}
+			})
+			// uni.setClipboardData({
+			// 	data:mobile,
+			// 	showToast: false,
+			// 	success() {
+			// 		uni.hideToast();
+			// 		uni.showToast({
+			// 			title: '复制号码成功',
+			// 			icon: 'none'
+			// 		});
+			// 	},
+			// 	fail() {
+			// 		uni.showToast({
+			// 			title: '复制失败',
+			// 			icon: 'error'
+			// 		});
+			// 	}
+			// })
+			this.$nextTick(()=>{
+				uni.showTabBar();
+				this.$refs.servicePop.close()
+			})
 		}
 	}
 }

+ 85 - 0
奥莱优品/components/kfService/refund.vue

@@ -0,0 +1,85 @@
+<template>
+	<uni-popup ref="servicePop" type="bottom" border-radius="10px 10px 0 0" background-color="#f1f1f1">
+		<view class="ts-body">
+			<view class="ts-title">
+				退款原因
+				<view class="right" @click="orderTs(2)"><image src="/static/image/close.png"></image></view>
+			</view>
+			<view class="ts-content">
+				<view class="ts-list">
+					<view class="ts-sub-title">个人原因</view>
+					<view class="ts-item-body">
+						<view class="ts-item" @click="toTs('买多了/买错了')">买多了/买错了<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('计划有变,暂时不需要了')">计划有变,暂时不需要了<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('没看清使用规则,要用时才发现限制')">没看清使用规则,要用时才发现限制<image src="/static/image/right-black.png"></image></view>
+					</view>
+				</view>
+				<view class="ts-list">
+					<view class="ts-sub-title">商家原因</view>
+					<view class="ts-item-body">
+						<view class="ts-item" @click="toTs('电话/发消息联系不上商家')">电话/发消息联系不上商家<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('商品缺货/无货')">商品缺货/无货<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('商家营业但不接待')">商家营业但不接待<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('商家停业/装修/转让')">商家停业/装修/转让<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('需加价/购买其他商品才能使用')">需加价/购买其他商品才能使用<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('商家要求改用其他方式/平台付款')">商家要求改用其他方式/平台付款<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('预约不到合适的时间')">预约不到合适的时间<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('商品涉及假冒品牌')">商品涉及假冒品牌<image src="/static/image/right-black.png"></image></view>
+					</view>
+				</view>
+				<view class="ts-list">
+					<view class="ts-sub-title">其他原因</view>
+					<view class="ts-item-body">
+						<view class="ts-item" @click="toTs('排队太久')">排队太久<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('其他平台/方式购买更优惠')">其他平台/方式购买更优惠<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('朋友/网上评价不好')">朋友/网上评价不好<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('可用的门店距离太远')">可用的门店距离太远<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('担心安全问题(疫情、天气等)')">担心安全问题(疫情、天气等)<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('其他')">其他<image src="/static/image/right-black.png"></image></view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			orderSn:0
+		}
+	},
+	methods: {
+		orderTs(type){
+			if (type == 1) {
+				this.$refs.servicePop.open()
+			} else {
+				this.$refs.servicePop.close()
+			}
+		},
+		open(data) {
+			this.orderSn = data;
+			this.$nextTick(()=>{
+				this.$refs.servicePop.open()
+			})
+		},
+		toTs(name){
+			this.$emit("success",name)
+			this.$refs.servicePop.close()
+		}
+	}
+}
+</script>
+
+<style>
+.ts-body .ts-title{display: flex;align-items: center;justify-content: space-between;font-size: 28upx;padding: 20upx;}
+.ts-body .ts-title image{width: 40upx;height: 40upx;}
+.ts-body .ts-content{height: 60vh;overflow: auto;padding: 20upx;}
+.ts-body .ts-list{margin-bottom: 20upx;}
+.ts-body .ts-list .ts-sub-title{line-height: 32upx;color: #666;font-size: 24upx;margin-bottom: 20upx;}
+.ts-body .ts-list .ts-item-body{background-color: #fff;border-radius: 10upx;padding: 20upx;}
+.ts-body .ts-list .ts-item-body .ts-item{font-size: 28upx;color: #333;display: flex;align-items: center;justify-content: space-between;border-bottom: 2upx solid #f8f8f8;padding: 20upx 0;}
+.ts-body .ts-list .ts-item-body .ts-item:last-child{border-bottom: 0;}
+.ts-body .ts-list .ts-item-body .ts-item image{width: 40upx;height: 40upx;}
+</style>

+ 6 - 0
奥莱优品/package.json

@@ -0,0 +1,6 @@
+{
+  "dependencies": {
+    "intl": "^1.2.5"
+  },
+  "industrySDK": true
+}

+ 22 - 6
奥莱优品/pages.json

@@ -54,12 +54,6 @@
 				"navigationBarTitleText": ""
 			}
 		},
-		{
-			"path": "pages/order/tips",
-			"style": {
-				"navigationBarTitleText": ""
-			}
-		},
 		{
 			"path": "pages/user/license",
 			"style": {
@@ -99,6 +93,28 @@
 				"navigationBarTitleText": "交易投诉",
 				"navigationBarBackgroundColor": "#ffffff"
 			}
+		},
+		{
+			"path": "pages/complaint/list",
+			"style": {
+				"navigationBarTitleText": "投诉列表",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+		},
+		{
+			"path": "pages/complaint/detail",
+			"style": {
+				"navigationBarTitleText": "投诉记录",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+		},
+		{
+			"path": "pages/order/refund",
+			"style": {
+				"navigationBarTitleText": "申请退款",
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black"
+			}
 		}
 	],
 	"globalStyle": {

+ 154 - 0
奥莱优品/pages/complaint/detail.vue

@@ -0,0 +1,154 @@
+<template>
+	<view>
+		<view class="loading-content" v-if="loading">
+			<view class="store-header">
+				<view class="logo"><view class="skeleton-line animate"></view></view>
+				<view class="info">
+					<view class="skeleton-line animate"></view>
+					<view class="skeleton-line animate mt15"></view>
+				</view>
+			</view>
+			<view class="store-detail">
+				<view class="detail-left">
+					<view class="skeleton-line animate"></view>
+					<view class="skeleton-line animate mt15"></view>
+				</view>
+			</view>
+			<view class="store-goods">
+				<view class="goods-item" v-for="(item,index) in 3" :key="index">
+					<view class="image"><view class="skeleton-line animate"></view></view>
+					<view class="info">
+						<view class="skeleton-line animate"></view>
+						<view class="skeleton-line animate mt15"></view>
+						<view class="skeleton-line animate mt15"></view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<block v-else>
+		<view class="ts-header">
+			<view class="ts-h-title">投诉门店</view>
+			<view class="store-info">
+				<view class="store-left">
+					<view class="name">{{dataInfo.store.poi_name}}</view>
+					<view class="address">{{dataInfo.store.poi_address}}</view>
+				</view>
+			</view>
+		</view>
+		<view class="ts-body">
+			<view class="order-status" v-if="dataInfo.status == 0">
+				<image src="https://jymini.oss-cn-guangzhou.aliyuncs.com/mini/complaint-2.svg"></image>
+			</view>
+			<view class="order-status" v-if="dataInfo.status == 1">
+				<image src="https://jymini.oss-cn-guangzhou.aliyuncs.com/mini/complaint-3.svg"></image>
+			</view>
+			<view class="ts-form">
+				<view class="ts-form-item">
+					<view class="form-title">具体问题 <text>*</text></view>
+					<view class="form-input">
+						{{dataInfo.question}}
+					</view>
+				</view>
+				<view class="ts-form-item">
+					<view class="form-title">问题订单 <text>*</text></view>
+					<view class="form-input">
+						{{dataInfo.order_sn}}
+					</view>
+				</view>
+				<view class="ts-form-item">
+					<view class="form-title">联系方式</view>
+					<view class="form-input">
+						{{dataInfo.mobile}}
+					</view>
+				</view>
+				<view class="ts-form-item">
+					<view class="form-title">详细补充 <text>*</text></view>
+					<view class="form-input-text">
+						{{dataInfo.content}}
+					</view>
+				</view>
+				<view class="ts-form-item">
+					<view class="form-title">回复结果 <text>*</text></view>
+					<view class="form-input-text">
+						<view class="data" v-html="dataInfo.remark"></view>
+					</view>
+				</view>
+			</view>
+		</view>
+		</block>
+	</view>
+</template>
+
+<script>
+var app;
+export default {
+	data() {
+		return {
+			options:null,
+			disabled:false,
+			dataInfo:null,
+			loading:true
+		}
+	},
+	onLoad(options) {
+		app = this;
+		app.options = options;
+		app.getDetail()
+	},
+	methods: {
+		tipsPop(){
+			app.$refs.tspopup.close()
+		},
+		async getDetail(){
+			app.loading = true;
+			var res = await app.$api.complaint.detail.get(app.options);
+			app.loading = false;
+			if (res.code == 0) {
+				app.$dialog.showSuccess(validation,"none",function(){
+					uni.navigateBack()
+				});
+				return false;
+			}
+			app.dataInfo = res.data;
+		}
+	}
+}
+</script>
+
+<style>
+page{background-color: #f8f8f8;}
+.loading-content{margin: 20upx;}
+.form-input-text{font-size: 28upx;line-height: 43upx;}
+.form-input-text image{width: 100%;}
+.form-input-text img{width: 100%;}
+.ts-popup{background-color: #fff;width: 90vw;border-radius: 20upx;}
+.ts-popup .title{font-size: 32upx;color: #333;font-weight: bold;padding: 30upx 0;text-align: center;}
+.ts-popup .sub-title{color: #f00;padding: 20upx 0;text-align: center;font-size: 28upx;}
+.ts-popup .tips-body{width: 90%;margin: 0 auto;}
+.ts-popup .tips-body .item-title{font-size: 28upx;color: #333;padding: 15upx 0;}
+.ts-popup .tips-body .item-desc{font-size: 28upx;color: #333;line-height: 46upx;margin-bottom: 20upx;}
+.ts-popup .pup-close{padding-top: 40upx;}
+.ts-popup .pup-close .pop-btn{border: 0;background-color: #f00;font-size: 32upx;color: #fff;border-radius: 0 0 20upx 20upx;padding: 15upx 0;cursor: pointer;}
+
+.ts-header{padding: 20upx 0;margin-bottom: 20upx;}
+.ts-header .ts-h-title{font-size: 28upx;color: #666;padding: 20upx;}
+.ts-header .store-info{background-color: #fff;padding: 20upx;}
+.ts-header .store-info .store-left .name{font-size: 30rpx;color: #333;font-weight: bold;line-height: 80upx;}
+.ts-header .store-info .store-left .address{font-size: 24rpx;color: #999;}
+.ts-body{background-color: #fff;padding: 20upx;position: relative;overflow: hidden;}
+
+.ts-body .order-status{position: absolute;right: 20upx;top: 20upx;}
+.ts-body .order-status image{width: 120upx;height: 120upx;transform: rotate(45deg);}
+
+.ts-form .ts-form-item{border-bottom: 2upx solid #f8f8f8;padding-bottom: 10upx;}
+.ts-form .ts-form-item:last-child{border-bottom: 0;}
+.ts-form .ts-form-item .form-title{color: #333;font-size: 28upx;padding: 20upx 0;}
+.ts-form .ts-form-item .form-title text{color: #f00;margin-left: 10upx;}
+.ts-form .ts-form-item .form-input{font-size: 28upx;color: #333;height: 80upx;display: flex;align-items: center;}
+.ts-form .ts-form-item .ts-input{height: 100%;border: 0;box-shadow: none;width: 100%;}
+.ts-form .form-input-textarea{height: 200upx;font-size: 28upx;color: #333;}
+.footer{position: fixed;bottom: 0;background-color: #fff;padding: 20upx 20upx 0 20upx;border-top: 2upx solid #f8f8f8;left: 0;right: 0;}
+.footer .footer-safe {height: env(safe-area-inset-bottom);width: 100%;}
+.footer .footer-btn{padding: 20upx 0;}
+.footer .footer-btn .btn{color: #fff;background-color: #f00;border-radius: 10upx;}
+</style>

+ 240 - 0
奥莱优品/pages/complaint/list.vue

@@ -0,0 +1,240 @@
+<template>
+	<view class="content">
+		<view class="tab-menu">
+			<view :class="orderState==0?'tab-item active':'tab-item'" @click="orderStatus(0)">全部</view>
+			<view :class="orderState==1?'tab-item active':'tab-item'" @click="orderStatus(1)">已受理</view>
+			<view :class="orderState==2?'tab-item active':'tab-item'" @click="orderStatus(2)">已回复</view>
+		</view>
+		<scroll-view class="order-body" scroll-y scroll-with-animation @scrolltoupper="scrolltoupper" @scrolltolower="scrolltolower" upper-threshold="80">
+			<view class="order-list" v-if="orderList.length == 0 && orderData.loading">
+				<view class="order-item" v-for="(item,indx) in 3" :key="indx">
+					<view class="item-header">
+						<view class="item-store" style="flex: 1;"><view class="skeleton-line animate"></view></view>
+					</view>
+					<view class="item-goods">
+						<view class="image">
+							<view class="skeleton-line animate"></view>
+						</view>
+						<view class="info">
+							<view class="title">
+								<view class="skeleton-line animate"></view>
+							</view>
+							<view class="tags">
+								<view class="skeleton-line animate"></view>
+							</view>
+							<view class="tags">
+								<view class="skeleton-line animate"></view>
+							</view>
+						</view>
+					</view>
+					<view class="mt15">
+						<view class="skeleton-line animate"></view>
+					</view>
+					<view class="item-footer mt15">
+						<view class="footer-left" style="width: 30%;">
+							<view class="skeleton-line animate"></view>
+						</view>
+						<view class="footer-group-btn" style="width: 30%;">
+							<view class="skeleton-line animate"></view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="order-list" v-else>
+				<view class="empty-body" v-if="orderList.length == 0">
+					<view class="imgs">
+						<image src="/static/image/empty.png" mode="widthFix"></image>
+						<view class="tip">没有更多数据啦~</view>
+					</view>
+				</view>
+				<view v-else>
+					<navigator hover-class="none" :url="'/pages/complaint/detail?id='+item.id" class="order-item" v-for="(item,indx) in orderList" :key="indx">
+						<view class="order-info">
+							<view class="info-item">
+								<view class="name">订单编号</view>
+								<view class="item-content">{{ item.order_sn }}</view>
+							</view>
+							<view class="info-item">
+								<view class="name">投诉事项</view>
+								<view class="item-content">{{ item.question }}</view>
+							</view>
+							<view class="order-status" v-if="item.status == 0">
+								<image src="https://jymini.oss-cn-guangzhou.aliyuncs.com/mini/complaint-2.svg"></image>
+							</view>
+							<view class="order-status" v-if="item.status == 1">
+								<image src="https://jymini.oss-cn-guangzhou.aliyuncs.com/mini/complaint-3.svg"></image>
+							</view>
+						</view>
+						<view class="order-footer">
+							<view class="footer-l">{{item.create_at}}</view>
+							<view class="footer-r">
+								<view class="btn danger">查看详情</view>
+							</view>
+						</view>
+					</navigator>
+				</view>
+			</view>
+			<view class="line-height"></view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+var app;
+const pageSize = 10;
+export default {
+	data() {
+		return {
+			orderState:0,
+			poiId:0,
+			orderData:{
+				size:pageSize,
+				page:1,
+				loading:true,
+				isDone:false
+			},
+			orderList:[],
+		}
+	},
+	onLoad({poi}) {
+		app = this;
+		app.poiId = poi;
+		app.getOrder()
+	},
+	methods: {
+		scrolltoupper(){},
+		scrolltolower(e){
+			if (app.orderData.isDone || app.orderList.length == 0) return ;
+			app.getOrder()
+		},
+		toDetail(order){
+			uni.navigateTo({
+				url:"/pages/order/detail?order="+order
+			})
+		},
+		orderStatus(state) {
+			app.orderState = state
+			app.orderList = [];
+			app.orderData = {
+				size:pageSize,
+				page:1,
+				loading:false,
+				isDone:false
+			};
+			app.getOrder()
+		},
+		async getOrder(){
+			app.orderData.loading = true;
+			var formData = {};
+			formData.poi = app.poiId;
+			formData.page = app.orderData.page;
+			formData.size = app.orderData.size;
+			formData.status = app.orderState;
+			var resp = await app.$api.complaint.list.get(formData)
+			app.orderData.loading = false;
+			if (resp.code == 401) {
+				app.isLogin = false;
+				return ;
+			}
+			if (resp.code == 0) {
+				return app.$dialog.showSuccess(resp.msg)
+			}
+			app.isLogin = true;
+			if (resp.data.rows.length > 0) {
+				app.orderData.page ++;
+				app.orderList = [...app.orderList,...resp.data.rows];
+			} else {
+				app.orderData.isDone = true;
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.tab-menu{
+	height: 80rpx;
+	line-height: 80rpx;
+	background-color: #fff;
+	display: flex;
+	align-items: center;
+	font-size: 28rpx;
+	color: #666;
+	justify-content: space-around;
+	.tab-item{
+		position: relative;
+		color: $main-text-color;
+		&.active{
+			color: $main-color;
+			font-weight: 700;
+			&::after{
+				position: absolute;
+				content: "";
+				width: 30%;
+				left: 35%;
+				height: 4rpx;
+				bottom: 0;
+				background-color: $main-color;
+			}
+		}
+	}
+}
+
+.order-body{
+	height: 0;
+	flex: 1;
+}
+.content{
+    position: fixed;
+    z-index: 1;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    background-color: #ededed;
+	display: flex;
+	flex-direction: column;
+	.line-height{
+		height: 40rpx;
+		width: 100%;
+	}
+}
+.empty-body{
+	display: flex;align-items: center;justify-content: center;flex-direction: column;height: calc(100vh - 100upx);
+	.imgs{
+		text-align: center;font-size: 28upx;color: #666;
+		image{height: 160upx;width: 160upx;}
+		.tip{margin-top: 20upx;}
+	}
+	.re-btn{
+		width: 180upx;
+		height: 80upx;
+		line-height: 80upx;
+		text-align: center;
+		font-size: 28upx;
+		color: #fff;
+		background-color: $main-color;
+		border-radius: 10upx;
+		margin-top: 60upx;
+	}
+}
+.order-item{background-color: #fff;padding: 20upx;border-radius: 10upx;width: calc(100% - 40upx);margin: 20upx auto;}
+.order-item .item-header{display: flex;align-items: center;height: 60upx;line-height: 60upx;}
+.order-item .item-header .order-status{font-size: 28upx;color: #f00;}
+.order-item .item-header .order-status.success{color: #007aff;}
+.order-item .item-header .order-time{font-size: 24upx;color: #999;margin-left: auto;margin-right: 0;}
+
+.order-footer{display: flex;text-align: right;padding: 20upx 0;border-top: 2upx solid #f8f8f8;align-items: center;margin-top: 20rpx;}
+.order-footer .footer-l{font-size: 28upx;color: #666;}
+.order-footer .footer-r{display: flex;margin-left: auto;margin-right: 0;flex: 1;justify-content: end;gap: 20upx;}
+.order-footer .btn{width: 160upx;height: 60upx;line-height: 60upx;text-align: center;border: 2upx solid #ccc;color: #333;font-size: 28upx;border-radius: 10upx;}
+.order-footer .btn.danger{border:2upx solid #f00;color: #f00;}
+.order-footer .btn.blue{border:2upx solid #007aff;color: #007aff;}
+.order-info{position: relative;}
+.order-info .order-status{position: absolute;right: 20upx;top: 20upx;}
+.order-info .order-status image{width: 120upx;height: 120upx;transform: rotate(45deg);}
+.order-info .name{font-size: 28upx;color: #666;padding: 20upx 0;}
+.order-info .item-content{font-size: 28upx;color: #000;}
+.order-info .item-content .order-status{font-size: 28upx;color: #f00;}
+.order-info .item-content .order-status.success{color: #007aff;}
+</style>

+ 19 - 3
奥莱优品/pages/goods/detail.vue

@@ -253,7 +253,8 @@ export default {
 			buyGoods:null,
 			currIndex:0,
 			swiperHeight:240,
-			userState:0
+			userState:0,
+			isBuy:1
 		}
 	},
 	onLoad(options) {
@@ -332,11 +333,22 @@ export default {
 				// 继续支付失败(超时、取消、关闭)
 			}
 		},
-		buyOrder(type){
+		async buyOrder(type){
 			if (!app.isLogin) {
 				return ;
 			}
-			if (type == 1) {
+			if (type == 1) {
+				uni.showLoading({
+					title:"请求中..."
+				})
+				var resp = await this.$api.goods.check.get({"poi":app.goodsData.poi_id});
+				uni.hideLoading();
+				if (resp.code == 0) {
+					return app.$dialog.showSuccess(resp.msg);
+				}
+				if (resp.data.buy == 0) {
+					return app.$dialog.showSuccess(resp.data.msg);
+				}
 				app.$refs.buypopup.open()
 			} else {
 				app.$refs.buypopup.close()
@@ -428,7 +440,11 @@ export default {
 				this.$refs.loginCom.open();
 				return ;
 			}
+			uni.showLoading({
+				title:"请求中..."
+			})
 			var resp = await this.$api.goods.check.get();
+			uni.hideLoading();
 			if (resp.code == 0) {
 				return app.$dialog.showSuccess(resp.msg);
 			}

+ 49 - 1
奥莱优品/pages/order/detail.vue

@@ -68,6 +68,11 @@
 									</view>
 									<view class="status-desc">服务进行中,有疑问请咨询客服</view>
 								</template>
+								<template v-if="orderData && orderData.status == 8">
+									<view class="status-name">
+										<image src="/static/image/order/refund.svg"></image>退款审核中</view>
+									<view class="status-desc">已申请退款,商家预计1-3个工作日完成审核</view>
+								</template>
 							</view>
 						</view>
 						<view class="item-goods">
@@ -191,6 +196,12 @@
 							<template v-if="orderData.status == 5">
 								<view class="btn" @click="toGoods">再次购买</view>
 							</template>
+							<template v-if="orderData.status == 7">
+								<view class="btn" @click="toAfterRefund">申请退款</view>
+							</template>
+							<template v-if="orderData.status == 8">
+								<view class="btn" @click="$dialog.jumpUri('/pages/service/chat?poi='+storeData.poi_id+'&source=apply&order='+orderData.order_sn,1);">催促审核</view>
+							</template>
 						</view>
 					</view>
 					<view class="footer-safe"></view>
@@ -249,6 +260,44 @@ export default {
 			}
 			this.$refs.kfService.open(app.storeData);
 		},
+		toGoods(){
+			uni.navigateTo({
+				url:"/pages/goods/detail?goods="+app.orderData.product_id
+			})
+		},
+		toAfterRefund(){
+			uni.showModal({
+				title: "提示",
+				content: "当前阶段退款需商家进行审核,如有疑问,请联系商家咨询",
+				confirmText: "确定退款",
+				success(res) {
+					if (res.confirm) {
+						uni.navigateTo({
+							url:'/pages/order/refund?order='+app.order,
+							events:{
+								acceptData: (data) => {
+									this.getOrder()
+								}
+							}
+						})
+					}
+				}
+			});
+		},
+		toAfter(){
+			uni.showModal({
+				title: "提示",
+				content: "当前阶段暂不支持退款,如遇特殊情况,请联系商家协商退款",
+				confirmText: "联系商家",
+				success(res) {
+					if (res.confirm) {
+						uni.navigateTo({
+							url:'/pages/service/chat?poi='+app.storeData.poi_id+'&source=detail&order='+app.orderData.order_sn
+						})
+					}
+				}
+			});
+		},
 		orderTs(){
 			this.$refs.complaint.open(app.order);
 		},
@@ -326,7 +375,6 @@ export default {
 			const { orderId } = event.detail;
 			const goodsDetail = [
 				{
-					refundRelatedItemType: 2,
 					itemOrderId:app.orderData.item_order_id //商品单,可在预下单回调itemOrderlist里获取,或通过查询券状态接口获取
 				}
 			];

+ 112 - 12
奥莱优品/pages/order/done.vue

@@ -20,7 +20,10 @@
 							</view>
 							<view class="info">
 								<view class="title">
-									<view class="name">{{ orderData.product.product_name }}</view>
+									<view class="name" v-if="orderData.product.is_new==1">
+										{{orderData.product.price}}元代{{orderData.product.line_price}}元商场权益券{{orderData.product.product_name}}
+									</view>
+									<view class="name" v-else>{{ orderData.product.product_name }}</view>
 									<view class="num">x{{ orderData.number }}</view>
 								</view>
 								<view class="tags">
@@ -32,17 +35,39 @@
 						</view>
 					</view>
 					<view class="order-info">
-						<view class="title-h">完善信息</view>
+						<view class="title-h">意向商品<text>(可选{{orderData.number}}份)</text></view>
+						<view class="goods-item" v-for="(item,indx) in doneGoods" :key="indx">
+							<view class="item-goods" style="padding: 10rpx;background-color: #f8f8f8;">
+								<view class="item-goods-body">
+									<view class="image">
+										<image :src="item.image"></image>
+									</view>
+									<view class="info">
+										<view class="title">
+											<view class="name">{{ item.title }}</view>
+										</view>
+										<view class="tags">
+											<view></view>
+											<view class="price">x{{ item.number }}</view>
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+						<view class="goods-item-check" @click="chooseGoods">{{doneGoods.length == 0 ? '请选择': '更换其他'}}</view>
+					</view>
+					<view class="order-info">
+						<view class="title-h">会员信息</view>
 						<view class="form-feedbak">
 							<view class="title"><text>*</text>姓名</view>
 							<view class="form-textarea">
-								<input :value="addressForm.nickname" data-field="nickname"  placeholder="请输入" class="u-input" />
+								<input v-model="addressForm.nickname" data-field="nickname"  placeholder="请输入" class="u-input" />
 							</view>
 						</view>
 						<view class="form-feedbak">
 							<view class="title"><text>*</text>手机号码</view>
 							<view class="form-textarea">
-								<input :value="addressForm.mobile" data-field="mobile" placeholder="请输入" class="u-input" />
+								<input v-model="addressForm.mobile" data-field="mobile" placeholder="请输入" class="u-input" />
 							</view>
 						</view>
 						<view class="form-feedbak">
@@ -54,7 +79,7 @@
 						<view class="form-feedbak">
 							<view class="title"><text>*</text>详细地址</view>
 							<view class="form-textarea">
-								<input :value="addressForm.address" data-field="address"  placeholder="请输入" class="u-textarea" />
+								<input v-model="addressForm.address" data-field="address"  placeholder="请输入" class="u-textarea" />
 							</view>
 						</view>
 					</view>
@@ -63,9 +88,8 @@
 			</scroll-view>
 			<view class="footer">
 				<view class="footer-op">
-					<view class="footer-left"></view>
 					<view class="footer-right">
-						<view class="btn">再次购买</view>
+						<button :loading="isSubmit" :disabled="isSubmit" class="btn full" @click="submitOrder">提交</button>
 					</view>
 				</view>
 				<view class="footer-safe"></view>
@@ -101,26 +125,36 @@
 				</view>
 				<view class="address-footer">
 					<view class="footer-btn" @click="closeOrder">取消</view>
-					<view class="footer-btn full">确定</view>
+					<view class="footer-btn full" @click="checkAddress">确定</view>
 				</view>
 			</view>
 		</uni-popup>
+
+		<goodsDialog ref="goodsDialog" @send="sendGoods"></goodsDialog>
 	</view>
 </template>
 
 <script>
 var app;
-export default {
+import goodsDialog from '@/components/chat/goods';
+import form from "@/static/js/form.js";
+export default {
+	components: {
+		goodsDialog
+	},
 	data() {
 		return {
+			eventChannel:null,
 			optionData:null,
 			orderData:null,
 			loading:false,
 			cityData:[],
 			addressForm:{},
+			isSubmit:false,
 			addressData:{
-				index:0,
-				name:"请选择"
+				name:"请选择",
+				hide:null,
+				list:[]
 			},
 			fristData:{
 				index:null,
@@ -137,14 +171,60 @@ export default {
 				name:"",
 				list:[]
 			},
+			doneGoods:[]
 		}
 	},
 	onLoad(options) {
 		app = this;
 		app.optionData = options;
+		app.eventChannel = this.getOpenerEventChannel();
 		this.getOrder();
 	},
 	methods: {
+		async submitOrder(){
+			if (app.doneGoods.length == 0) return app.$dialog.showSuccess("请选择意向商品");
+			var formData = this.addressForm;
+			var validation = form.validation(formData,[
+				{name:"nickname",rule:["required"],msg:["请输入姓名"]},
+				{name:"mobile",rule:["required","isMobile"],msg:["请填写手机号码","手机号码格式错误"]},
+				{name:"address",rule:["required"],msg:["请输入"]},
+			]);
+			if(validation){
+				this.$dialog.showSuccess(validation);
+				return false;
+			}
+			if (!app.addressData.hide) return app.$dialog.showSuccess("请选择地区");
+			formData.goods = JSON.stringify(app.doneGoods);
+			formData.city = JSON.stringify(app.addressData)
+			formData.order = app.optionData.order
+			app.isSubmit = true;
+			var resp = await app.$api.order.address.post(formData);
+			app.isSubmit = false;
+			if (resp.code !== 1) return app.$dialog.showSuccess(resp.msg);
+			app.$dialog.showSuccess(resp.msg);
+			app.eventChannel.emit('acceptData', { msg: '会员信息已完善' });
+			uni.navigateBack();
+		},
+		chooseGoods(){
+			this.$nextTick(()=>{
+				this.$refs.goodsDialog.open().setData({"order":app.optionData.order,"num":app.orderData.number});
+			})
+		},
+		sendGoods(data){
+			app.doneGoods = data;
+		},
+		checkAddress(){
+			if (!app.fristData.index) return this.$dialog.showSuccess("请完善地区信息!");
+			if (!app.secondData.index) return this.$dialog.showSuccess("请完善地区信息~");
+			if (!app.threeData.index) return this.$dialog.showSuccess("请完善地区信息");
+			var fristData = app.cityData[app.fristData.index];
+			var secondData = fristData.children[app.secondData.index];
+			var threeData = secondData.children[app.threeData.index];
+			app.addressData.name = fristData.text+"/"+secondData.text+"/"+threeData.text
+			app.addressData.hide = fristData.text+secondData.text+threeData.text
+			app.addressData.list = [fristData.value,secondData.value,threeData.value]
+			app.$refs.addressPop.close()
+		},
 		addClick(indx,type) {
 			if (type == 1) {
 				app.fristData.index = indx;
@@ -216,6 +296,16 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+.goods-item-check{
+	margin: 20rpx;
+	border: 2rpx solid $main-text-color;
+	height: 80rpx;
+	line-height: 80rpx;
+	text-align: center;
+	font-size: 28rpx;
+	color: $main-text-color;
+	border-radius: 10rpx;
+}
 .address-pop{
 	.address-check{
 		display: flex;
@@ -315,7 +405,15 @@ export default {
 	.order-info{
 		border-radius: 20rpx;
 		background-color: #fff;padding: 20upx;margin-top: 20upx;
-		.title-h{font-size: 32upx;color: #333;font-weight: bold;margin-bottom: 20rpx;}
+		.title-h{
+			font-size: 32upx;color: #333;font-weight: bold;margin-bottom: 20rpx;
+			text {
+				font-size: 28rpx;
+				color: #666;
+				font-weight: normal;
+				margin-left: 20rpx;
+			}
+		}
 
 	}
 	.item-goods{
@@ -403,7 +501,9 @@ export default {
 			display: flex;
 			align-items: center;
 			gap: 20rpx;
+			flex: 1;
 			.btn{
+				width: 100%;
 				font-size: 28rpx;
 				height: 80upx;
 				border-radius: 10upx;

+ 9 - 3
奥莱优品/pages/order/order.vue

@@ -63,6 +63,7 @@
 						<view class="item-status fail" v-if="item.status == 5">已关闭</view>
 						<view class="item-status warn" v-if="item.status == 6">部分退款</view>
 						<view class="item-status success" v-if="item.status == 7">履约中</view>
+						<view class="item-status warn" v-if="item.status == 8">退款审核中</view>
 					</view>
 					<view class="item-goods" @click="toDetail(item.out_order_no)">
 						<view class="image">
@@ -87,8 +88,13 @@
 					<view class="item-footer" @click="toDetail(item.out_order_no)">
 						<view class="footer-left">实付 <text>{{ $dialog.formatMoney(item.pay_money,true) }}</text></view>
 						<view class="footer-group-btn">
-							<view :class="indx%2==0?'button border':'button warn'">继续支付</view>
-							<view class="button fail">申请退款</view>
+							<view v-if="item.status == 0" class="button warn">继续支付</view>
+							<view v-if="item.status == 1" class="button border">立即预约</view>
+							<view v-if="item.status == 1" class="button border">申请退款</view>
+							<view v-if="item.status == 2" class="button warn">再来一单</view>
+							<view v-if="item.status == 7" class="button warn">申请退款</view>
+							<view v-if="item.status == 4||item.status == 3" class="button border">再次购买</view>
+							<view v-if="item.status == 5||item.status == 6||item.status == 7||item.status == 8" class="button warn">查看详情</view>
 						</view>
 					</view>
 				</view>
@@ -103,7 +109,7 @@
 
 <script>
 var app;
-const pageSize = 20;
+const pageSize = 10;
 export default {
 	data() {
 		return {

+ 366 - 0
奥莱优品/pages/order/refund.vue

@@ -0,0 +1,366 @@
+<template>
+	<view class="content">
+		<template v-if="loading">
+			<view class="skeleton">
+				<view class="skeleton-line max animate" style="height: 200upx;"></view>
+				<view class="skeleton-line animate"></view>
+				<view class="skeleton-line min animate"></view>
+				<view class="skeleton-line min animate"></view>
+				<view class="skeleton-line max animate" style="height: 200upx;"></view>
+				<view class="skeleton-line max animate" style="height: 200upx;"></view>
+			</view>
+		</template>
+		<template v-else>
+		<scroll-view class="goods-body" scroll-y scroll-with-animation>
+			<view class="order-body">
+				<view class="item-goods">
+					<view class="item-goods-body">
+						<view class="image">
+							<image :src="orderData.img"></image>
+						</view>
+						<view class="info">
+							<view class="title">
+								<view class="name" v-if="goodsData.is_new == 1">{{goodsData.price}}元代{{goodsData.line_price}}元商场权益券{{ goodsData.product_name }}</view>
+								<view class="name" v-else>{{ goodsData.product_name }}</view>
+								<view class="num">x{{ orderData.number }}</view>
+							</view>
+							<view class="tags">
+								{{orderData.sku_name?orderData.sku_name:'默认'}}
+								<view class="price">{{ $dialog.formatMoney(orderData.price,true) }}</view>
+							</view>
+							<view class="price-right">实付 <text>{{ $dialog.formatMoney(orderData.pay_money,true) }}</text></view>
+						</view>
+					</view>
+				</view>
+				<view class="order-info">
+					<view class="info-item">
+						<view class="name">订单编号</view>
+						<view class="right">{{ orderData.out_order_no }}</view>
+					</view>
+					<view class="info-item" @click="refundMsg">
+						<view class="name">退款原因<text class="red">*</text></view>
+						<view class="right">
+							{{refundMsgText?refundMsgText:'请至少选择1项'}}
+							<view class="icon"><image src="/static/image/right.svg"></image></view>
+						</view>
+					</view>
+					<view class="info-item">
+						<view class="name">退款金额</view>
+						<view class="right red">{{ $dialog.formatMoney(orderData.pay_money,true) }}</view>
+					</view>
+					<view class="info-item">
+						<view class="name">退款路径<text>*</text></view>
+						<view class="right">
+							<radio-group @change="radioChange">
+								<view class="flex-radio">
+									<label class="uni-list-cell uni-list-cell-pd" v-for="(item, index) in items" :key="item.value">
+										<view>
+											<radio :value="item.value" style="transform: scale(0.7);" :checked="index === current" />
+										</view>
+										<view>{{item.name}}</view>
+									</label>
+								</view>
+							</radio-group>
+						</view>
+					</view>
+					<template v-if="itemsName == 'alipay'">
+					<view class="info-item">
+						<view class="name">姓名<text>*</text></view>
+						<view class="right">
+							<input v-model="aliData.truename" placeholder="请填写真实姓名" class="right-input" />
+						</view>
+					</view>
+					<view class="info-item">
+						<view class="name">支付宝帐号<text>*</text></view>
+						<view class="right">
+							<input v-model="aliData.account" placeholder="请输入" class="right-input" />
+						</view>
+					</view>
+					</template>
+					<template v-if="itemsName == 'bank'">
+						<view class="info-item">
+							<view class="name">姓名<text>*</text></view>
+							<view class="right">
+								<input v-model="bankData.truename" placeholder="请填写真实姓名" class="right-input" />
+							</view>
+						</view>
+						<view class="info-item">
+							<view class="name">银行卡号<text>*</text></view>
+							<view class="right">
+								<input v-model="bankData.card" placeholder="请输入银行卡号" class="right-input" />
+							</view>
+						</view>
+						<view class="info-item">
+							<view class="name">开户行<text>*</text></view>
+							<view class="right">
+								<input v-model="bankData.name" placeholder="请输入开户行全称" class="right-input" />
+							</view>
+						</view>
+					</template>
+				</view>
+
+			</view>
+			<view class="line-height"></view>
+		</scroll-view>
+		<view class="footer">
+			<view class="tips">申请退款后需商家审核,审核时间预计1-3个工作日</view>
+			<view class="footer-op">
+				<button :loading="isSubmit" :disabled="isSubmit" class="btn full" @click="submitForm">提交申请</button>
+			</view>
+			<view class="footer-safe"></view>
+		</view>
+		</template>
+		<refundMain ref="refundMain" @success="refundHandle"></refundMain>
+	</view>
+</template>
+
+<script>
+var app;
+import refundMain from "@/components/kfService/refund";
+export default {
+	components: {
+		refundMain
+	},
+	data() {
+		return {
+			orderId:0,
+			current: 0,
+			goodsData:null,
+			orderData:null,
+			loading:true,
+			refundMsgText:null,
+			isSubmit:false,
+			items:[
+				{
+					value: 'alipay',
+					name: '支付宝',
+					checked: 'true'
+				},
+				{
+					value: 'bank',
+					name: '银行卡'
+				}
+			],
+			bankData:{},
+			aliData:{},
+			itemsName:"alipay"
+		}
+	},
+	onLoad({order}) {
+		app = this;
+		app.orderId = order;
+		app.getOrder();
+	},
+	methods: {
+		async submitForm(){
+			var formData = {};
+			if (!app.refundMsgText) return app.$dialog.showSuccess("请至少选择1项")
+			formData.order = app.orderId;
+			formData.msg = app.refundMsgText;
+			formData.type = app.itemsName;
+			if (app.itemsName == "alipay") {
+				formData.content = JSON.stringify(app.aliData);
+			} else {
+				formData.content = JSON.stringify(app.bankData);
+			}
+			var resp = await app.$api.order.refund.post(formData);
+			if (resp.code !== 1) return app.$dialog.showSuccess(resp.msg)
+			app.$dialog.showSuccess(resp.msg)
+			app.eventChannel.emit('acceptData', { msg: '会员信息已完善' });
+			uni.navigateBack();
+		},
+		refundMsg(){
+			this.$refs.refundMain.open();
+		},
+		radioChange: function(evt) {
+			app.itemsName = evt.detail.value;
+			for (let i = 0; i < this.items.length; i++) {
+				if (this.items[i].value === evt.detail.value) {
+					this.current = i;
+					break;
+				}
+			}
+		},
+		refundHandle(data){
+			app.refundMsgText = data;
+		},
+		async getOrder(){
+			app.loading = true;
+			var res = await app.$api.order.detail.get({"order":app.orderId});
+			app.loading = false;
+			if (res.code && res.code == 0) {
+				app.$dialog.showSuccess(res.msg);
+				uni.navigateBack()
+				return ;
+			}
+			app.goodsData = res.data.product;
+			app.orderData = res.data;
+		},
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.content{
+    position: fixed;
+    z-index: 1;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    background-color: #f1f1f1;
+	display: flex;
+	flex-direction: column;
+	.line-height{
+		height: 40rpx;
+		width: 100%;
+	}
+}
+.right-input{
+	border: 0;
+	box-shadow: none;
+	text-align: right;
+	width: 100%;
+}
+.flex-radio{
+	display: flex;
+	align-items: center;
+	gap: 20rpx;
+	.uni-list-cell{
+		display: flex;
+		align-items: center;
+	}
+}
+.goods-body{
+	height: 0;
+	flex: 1;
+}
+.footer{
+	background-color: #fff;
+	padding: 20upx 20upx 0 20upx;border-top: 2upx solid #f8f8f8;
+	.footer-safe {
+		height: env(safe-area-inset-bottom);width: 100%;
+	}
+	.tips{
+		font-size: 24rpx;
+		color: #999;
+		margin-bottom: 20rpx;
+	}
+	.btn{
+		font-size: 32rpx;
+		height: 100upx;
+		border-radius: 10upx;
+		line-height: 100upx;
+		text-align: center;
+		min-width: 200rpx;
+		color: #333;
+		border: 2rpx solid #ccc;
+		&.full{
+			background-color: $main-color;
+			color: #fff;
+			border: 2rpx solid $main-color;
+		}
+	}
+}
+.order-body {
+	width: 95%;
+	margin: 20rpx auto;
+	.order-info{
+		border-radius: 20rpx;
+		background-color: #fff;padding: 20upx;margin-top: 20upx;
+		.title{font-size: 32upx;color: #333;font-weight: bold;margin-bottom: 20upx;}
+		.info-item{
+			font-size: 28upx;display: flex;align-items: center;
+			padding: 30rpx 0;
+			.name{
+				text {
+					color: $main-color;
+					margin-left: 10rpx;
+				}
+			}
+			.right{
+				&.red{
+					color: $main-color;
+					font-size: 32rpx;
+				}
+				display: flex;
+				align-items: center;
+				color: #666;margin-left: auto;margin-right: 0;
+				flex: 1;
+				justify-content: right;
+				image {
+					width: 40rpx;
+					height: 40rpx;
+				}
+				text{border: 2upx solid #ccc;color: #333;font-size: 24upx;padding: 0 15upx;margin-left: 20upx;border-radius: 5upx;}
+			}
+		}
+	}
+	.item-goods{
+		background-color: #fff;
+		margin-top: 20rpx;
+		border-radius: 20rpx;
+		padding: 20rpx;
+		.item-goods-body{
+			display: flex;
+			align-items: center;
+			gap: 20rpx;
+		}
+		.stock{
+			text-align: right;
+		}
+		.image {
+			height: 140rpx;
+			overflow: hidden;display: flex;align-items: center;min-width: 140rpx;
+			position: relative;
+			image {
+				width: 140rpx;
+				border-radius: 10upx;
+				height: 100%;
+			}
+		}
+		.info{
+			flex: 1 1 0%;
+			overflow: hidden;
+			.title{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.name {
+					overflow: hidden;
+					text-overflow: ellipsis;
+					font-size: 32rpx;
+					display: -webkit-box;
+					-webkit-line-clamp: 2;
+					 -webkit-box-orient: vertical;
+					color: #333;
+					font-weight: 900;
+				}
+			}
+			.price-right{
+				text-align: right;
+				color: $main-color;
+				margin-top: 20rpx;
+				font-size: 28rpx;
+				text {
+					font-size: 30rpx;
+					font-weight: 800;
+				}
+			}
+			.tags {
+				color: #94a3b8;
+				font-size: 24rpx;
+				margin: 10rpx 0;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.price {
+					font-size: 28rpx;
+					color: $main-text-color;
+					font-weight: 600;
+				}
+			}
+		}
+	}
+}
+</style>

+ 0 - 33
奥莱优品/pages/order/tips.vue

@@ -1,33 +0,0 @@
-<template>
-	<view>
-
-	</view>
-</template>
-
-<script>
-export default {
-	data() {
-		return {
-
-		}
-	},
-	onLoad() {
-		uni.enableAlertBeforeUnload({
-			message: "是否确认返回",
-			  success(res) {
-			    console.log("开启页面返回询问对话框成功", res);
-			  },
-			  fail(err) {
-			    console.log("开启页面返回询问对话框失败", err);
-			  },
-		})
-	},
-	methods: {
-
-	}
-}
-</script>
-
-<style>
-
-</style>

+ 15 - 8
奥莱优品/pages/service/chat.vue

@@ -127,8 +127,8 @@ export default {
 			screenWidth:0,
 			pushData: {
 				obj:null,
-				auth:"http://192.168.3.16:9881/plugin/webman/push/auth",
-				url: 'ws://192.168.3.16:3131',
+				auth:"https://tran.jsshuita.cn/plugin/webman/push/auth",
+				url: 'wss://tran.jsshuita.cn/ws',
 			},
 			isFocus:false,
 			chatData:{
@@ -173,20 +173,27 @@ export default {
 		},
 		toAddress(data){
 			uni.navigateTo({
-				url:"/pages/order/done?order="+data.order
+				url:"/pages/order/done?order="+data.order,
+				events:{
+					acceptData: (data) => {
+						this.text = data.msg;
+						this.sendingText();
+					}
+				}
 			})
 		},
 		clickText(text){
 			const regex = /(1[3-9]\d{9})|(\d{3,4}-\d{7,8})|(\d{7,12})/g;
 			const matches = text.match(regex);
 			if (!matches) return ;
-			uni.makePhoneCall({
-				phoneNumber:matches[0],
+			uni.setClipboardData({
+				data:matches[0],
 				success() {
-
+					uni.hideToast();
+					app.$dialog.showSuccess("复制号码成功")
 				},
-				fail(){
-
+				fail() {
+					app.$dialog.showSuccess("复制失败")
 				}
 			})
 		},

+ 5 - 3
奥莱优品/pages/user/license.vue

@@ -32,11 +32,13 @@ export default {
 	data() {
 		return {
 			loading:true,
-			license:""
+			license:"",
+			poiId:0
 		}
 	},
-	onLoad() {
+	onLoad({poi}) {
 		app = this;
+		app.poiId = poi;
 		app.getLicense()
 	},
 	methods: {
@@ -45,7 +47,7 @@ export default {
 		},
 		async getLicense(){
 			app.loading = true;
-			var res = await app.$api.home.license.get();
+			var res = await app.$api.home.license.get({"poi":app.poiId});
 			app.loading = false;
 			if (res.code !== 1) {
 				return app.$dialog.showSuccess(res.msg,function(){

+ 19 - 2
奥莱优品/pages/user/user.vue

@@ -29,11 +29,11 @@
 					<view class="name">商家客服</view>
 					<view class="right"><image src="/static/image/right.svg"></image></view>
 				</view>
-				<navigator hover-class="none" class="menu-item" url="/pages/user/license">
+				<view @click="toLicense" class="menu-item" url="/pages/user/license">
 					<view class="icon"><image src="/static/image/zizhi.png"></image></view>
 					<view class="name">服务资质</view>
 					<view class="right"><image src="/static/image/right.svg"></image></view>
-				</navigator>
+				</view>
 			</view>
 			<view class="user-menu" v-if="isLogin">
 				<view class="menu-item" @click="outLogin">
@@ -74,12 +74,20 @@ export default {
 			this.$refs.loginCom.open();
 		},
 		toLink(){
+			const data = uni.getStorageSync("contact");
+			if (!data) {
+				return app.$dialog.showSuccess("请先从首页进入")
+			}
 			if (!app.isLogin) {
 				this.$refs.loginCom.open();
 				return ;
 			}
+			uni.navigateTo({
+				url:"/pages/complaint/list?poi="+data.poi_id
+			})
 		},
 		loginSuccess(token){
+			app.isLogin = token;
 			app.getUser()
 		},
 		outLogin(){
@@ -90,6 +98,15 @@ export default {
 				}
 			})
 		},
+		toLicense(){
+			const data = uni.getStorageSync("contact");
+			if (!data) {
+				return app.$dialog.showSuccess("请先从首页进入")
+			}
+			uni.navigateTo({
+				url:"/pages/user/license?poi="+data.poi_id
+			})
+		},
 		kfPop(){
 			const isLogin = uni.getStorageSync("user_token");
 			if (!isLogin) {

+ 18 - 11
奥莱优品/pages/web/web.vue

@@ -1,22 +1,29 @@
 <template>
 	<view>
-		
+		<web-view :src="url"></web-view>
 	</view>
 </template>
 
-<script>
-	export default {
-		data() {
-			return {
-				
-			}
-		},
-		methods: {
-			
+<script>
+var app;
+export default {
+	data() {
+		return {
+			url:""
 		}
+	},
+	onLoad({type}) {
+		app = this;
+		var url = "https://tran.jsshuita.cn/index/protocol?name="+type;
+		console.log('url',url)
+		app.url = url;
+	},
+	methods: {
+
 	}
+}
 </script>
 
 <style>
 
-</style>
+</style>

+ 2 - 2
奥莱优品/static/js/request.js

@@ -15,9 +15,9 @@ const axg = {
 		return '/api';
 		// #endif
 		// #ifdef MP
-		// return 'https://tran.jsshuita.cn/v2'
+		return 'https://tran.jsshuita.cn/v2'
 		// return 'http://192.168.3.16:9881/v2'
-		return 'http://192.168.2.142:9881/v2'
+		// return 'http://192.168.2.142:9881/v2'
 		// #endif
 	},
 	toast: function(text, duration, success) {

+ 4 - 4
奥莱优品/utils/css/main.css

@@ -125,7 +125,7 @@ switch.checked::before {
 	src: url('https://blue-data.oss-cn-guangzhou.aliyuncs.com/fonts/Bold.ttf') format('truetype');
 }
 /* #ifndef MP-ALIPAY */
-radio::before,
+/* radio::before,
 checkbox::before {
 	font-family: "cuIcon";
 	content: "\e645";
@@ -140,7 +140,7 @@ checkbox::before {
 	transform: scale(1, 1);
 	transition: all 0.3s ease-in-out 0s;
 	z-index: 9;
-}
+} */
 
 radio .wx-radio-input,
 checkbox .wx-checkbox-input,
@@ -3568,7 +3568,7 @@ scroll-view.cu-steps .cu-item {
 }
 
 .bg-gradual-blue {
-	background-image: linear-gradient(45deg, #0081ff, #1cbbb4); 
+	background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
 	color: #ffffff;
 }
 
@@ -4091,4 +4091,4 @@ scroll-view.cu-steps .cu-item {
 .level-bg-5 {
 	background: linear-gradient(270deg, #4C4C4C 0%, #7D7D7D 100%);
 	color: #fff;
-}
+}