Zory пре 6 дана
родитељ
комит
3a9e851ed2

+ 7 - 0
pages.json

@@ -124,6 +124,13 @@
 					"pay-button-sdk": "tta5a3d31e3aecfb9b11://pay-button"
 				}
 			}
+		},
+		{
+			"path": "pages/order/complaint/complaint",
+			"style": {
+				"navigationBarTitleText": "交易投诉",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
 		}
 	],
 	"tabBar": {

+ 136 - 0
pages/order/complaint/complaint.vue

@@ -0,0 +1,136 @@
+<template>
+	<view>
+		<view class="ts-header">
+			<view class="ts-h-title">投诉门店</view>
+			<view class="store-info">
+				<view class="store-left">
+					<view class="name">{{options.poi_name}}</view>
+					<view class="address">{{options.poi_address}}</view>
+				</view>
+			</view>
+		</view>
+		<view class="ts-body">
+			<view class="ts-form">
+				<view class="ts-form-item">
+					<view class="form-title">具体问题 <text>*</text></view>
+					<view class="form-input">
+						{{options.text}}
+					</view>
+				</view>
+				<view class="ts-form-item">
+					<view class="form-title">问题订单 <text>*</text></view>
+					<view class="form-input">
+						{{options.order}}
+					</view>
+				</view>
+				<view class="ts-form-item">
+					<view class="form-title">联系方式</view>
+					<view class="form-input">
+						<input type="number" v-model="options.mobile" class="ts-input" placeholder="请输入手机号" />
+					</view>
+				</view>
+				<view class="ts-form-item">
+					<view class="form-title">详细补充 <text>*</text></view>
+					<view class="form-input-textarea">
+						<textarea class="ts-input" v-model="options.content" placeholder="请详细描述该笔订单中您遇到的问题,描述内容不能为空" rows="10"></textarea>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="footer">
+			<view class="footer-btn">
+				<button class="btn" :disabled="disabled" @click="submitTs">提交</button>
+			</view>
+			<view class="footer-safe"></view>
+		</view>
+		<uni-popup ref="tspopup" type="center" border-radius="10px 10px 0 0" background-color="#f8f8f8">
+			<view class="ts-popup">
+				<view class="title">我要投诉门店</view>
+				<view class="sub-title">请仔细阅读投诉说明</view>
+				<view class="sub-title">受理时间1个工作日</view>
+				<view class="tips-body">
+					<view class="item-title">【退款/退货纠纷】</view>
+					<view class="item-desc">在订单页-申请退款,门店需在24小时处理,否则平台将自动退款,如门店拒绝退款可在此投诉;</view>
+					<view class="item-title">【质量/涉假问题】</view>
+					<view class="item-desc">为避免恶意投诉,请上传包含单位公章及证书编号检测报告, 请往下滑动查看《检测报告案例》</view>
+				</view>
+				<view class="pup-close">
+					<button class="pop-btn" @click="tipsPop">我已阅读并确认</button>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script>
+var app;
+import * as Api from "@/static/api/order.js";
+import form from "@/static/js/form.js"
+export default {
+	data() {
+		return {
+			options:null,
+			disabled:false
+		}
+	},
+	onLoad(options) {
+		app = this;
+		app.options = options;
+		app.$nextTick(()=>{
+			app.$refs.tspopup.open()
+		})
+	},
+	methods: {
+		tipsPop(){
+			app.$refs.tspopup.close()
+		},
+		submitTs(){
+			var validation = form.validation(app.options,[
+				{name:"content",rule:["required"],msg:["请输入描述内容"]}
+			]);
+			if(validation){
+				app.$dialog.showSuccess(validation);
+				return false;
+			}
+			Api.complaint(app.options).then((res)=>{
+				if (res.code == 0) {
+					return app.$dialog.showSuccess(res.msg);
+				}
+				app.$dialog.showSuccess(res.msg,"none",function(){
+					uni.navigateBack()
+				});
+			})
+		}
+	}
+}
+</script>
+
+<style>
+page{background-color: #f8f8f8;}
+.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;}
+.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>

+ 104 - 14
pages/order/detail.vue

@@ -27,7 +27,18 @@
 				<view class="status-name" v-if="orderData.status == 5">已关闭</view>
 				
 				<view class="status-desc" v-if="orderData.status == 0">超过30分钟未支付,订单将自动取消</view>
-				<view class="status-desc" v-if="orderData.status == 1">待使用</view>
+				<view class="status-desc-qrcode" v-if="orderData.status == 1">
+					<view class="qrcode-img">
+						<ikun-qrcode
+							width="200"
+							height="200"
+							unit="rpx"
+							color="#000000"
+							:data="orderData.out_order_no">
+						</ikun-qrcode>
+					</view>
+					<view class="qrcode-text">券码 {{orderData.out_order_no}} <text @click="copyOrder(orderData.out_order_no)">复制</text></view>
+				</view>
 				<view class="status-desc success" v-if="orderData.status == 2">服务已完成,欢迎您再次使用</view>
 				<view class="status-desc" v-if="orderData.status == 3">{{ $dialog.formatMoney(orderData.pay_money,true) }} 已原路退回</view>
 				<view class="status-desc" v-if="orderData.status == 4">已申请退款,钱款预计1-3个自然日到账</view>
@@ -49,13 +60,20 @@
 				<view class="safe-item"><image src="/static/image/check.png"></image>过期退</view>
 				<view class="safe-item"><image src="/static/image/check.png"></image>随时退</view>
 			</view>
-			<view class="home-store" @click="showService(1)">
-				<view class="left">
-					<image src="/static/image/kefu.png"></image>
-					<view class="name">联系客服</view>
+			<view class="home-store">
+				<view class="service-detail" @click="showService(1)">
+					<view class="left">
+						<image src="/static/image/kefu.png"></image>
+						<view class="name">联系客服<text v-if="storeData">{{storeData.start_at}}-{{storeData.end_at}}</text></view>
+					</view>
+					<view class="right" v-if="storeData">
+						<!-- <text class="status success">{{storeData.start_at}}-{{storeData.end_at}}</text> -->
+						<image src="/static/image/right-black.png"></image>
+					</view>
 				</view>
-				<view class="right" v-if="storeData">
-					<text class="status success">{{storeData.start_at}}-{{storeData.end_at}}</text>
+				<view class="service-btn" @click="orderTs(1)">
+					<image src="/static/image/face.svg"></image>
+					<view class="btn-name">我要投诉</view>
 					<image src="/static/image/right-black.png"></image>
 				</view>
 			</view>
@@ -77,13 +95,13 @@
 			<view class="order-info">
 				<view class="title">订单信息</view>
 				<view class="info-item">
-					<view class="name">来客订单号</view>
+					<view class="name">订单号</view>
 					<view class="right">{{ orderData.order_sn }} <text @click="copyOrder(orderData.order_sn)">复制</text></view>
 				</view>
-				<view class="info-item">
+				<!-- <view class="info-item">
 					<view class="name">订单编号</view>
 					<view class="right">{{ orderData.out_order_no }} <text @click="copyOrder(orderData.out_order_no)">复制</text></view>
-				</view>
+				</view> -->
 				<view class="info-item">
 					<view class="name">下单时间</view>
 					<view class="right">{{ orderData.create_at }}</view>
@@ -161,6 +179,46 @@
 				</view>
 				<view class="footer-safe"></view>
 			</view>
+			
+			<uni-popup ref="tspopup" type="bottom" border-radius="10px 10px 0 0" background-color="#f8f8f8">
+				<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 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>
+						</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>
+						</view>
+					</view>
+				</view>
+			</uni-popup>
 		</block>
 	</view>
 </template>
@@ -177,7 +235,8 @@ export default {
 			goodsData:null,
 			orderData:null,
 			storeData:null,
-			orderTime:null
+			orderTime:null,
+			tsStatus:false
 		}
 	},
 	created() {
@@ -192,6 +251,19 @@ export default {
 		app.getOrder()
 	},
 	methods: {
+		toTs(text){
+			app.$refs.tspopup.close()
+			uni.navigateTo({
+				url:"/pages/order/complaint/complaint?order="+app.order+"&text="+text+"&poi_name="+app.poiData.poi_name+"&poi_address="+app.poiData.poi_address
+			})
+		},
+		orderTs(type){
+			if (type == 1) {
+				app.$refs.tspopup.open()
+			} else {
+				app.$refs.tspopup.close()
+			}
+		},
 		onPay(event){
 			console.log("event",event)
 			const { status, outOrderNo, result } = event.detail;
@@ -366,6 +438,19 @@ export default {
 page{background-color: #f8f8f8;}
 .skeleton{width: 90%;margin: 20upx auto;}
 .line-footer{height: 200upx;}
+.status-desc-qrcode{text-align: center;font-size: 24upx;padding-top: 30upx;display: flex;align-items: center;justify-content: center;flex-direction: column;}
+.status-desc-qrcode .qrcode-img{background-color: #fff;padding: 20upx;}
+.status-desc-qrcode .qrcode-text{margin-top: 20upx;}
+.status-desc-qrcode .qrcode-text text{margin-left: 10upx;color: #007aff;}
+.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-list{margin-top: 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;}
 
 .footer{position: fixed;bottom: 0;background-color: #fff;padding: 20upx 20upx 0 20upx;border-top: 2upx solid #f8f8f8;left: 0;right: 0;}
 .footer .footer-op{display: flex;align-items: center;}
@@ -401,14 +486,19 @@ page{background-color: #f8f8f8;}
 .goods-info .desc{font-size: 24upx;color: #999;display: flex;align-items: center;justify-content: space-between;margin: 20upx 0;}
 .goods-info .total{font-size: 30upx;color: #333;text-align: right;font-weight: bold;}
 
-.home-store{margin: 20upx auto;display: flex;align-items: center;background-color: #fff;border-radius: 10upx;display: flex;align-items: center;padding: 30upx;}
+.home-store{margin: 20upx auto;display: flex;align-items: center;display: flex;align-items: center;gap: 20upx;justify-content: space-between;}
+.home-store .service-detail{display: flex;align-items: center;background-color: #fff;border-radius: 10upx;flex: 1;height: 120upx;padding: 0 20upx;}
+.home-store .service-btn{background-color: #fff;text-align: center;padding: 0 30upx;font-size: 28upx;height: 120upx;line-height: 120upx;display: flex;align-items: center;justify-content: space-between;}
+.home-store .service-btn .btn-name{margin-left: 15upx;}
+.home-store .service-btn image{width: 40upx;height: 40upx;}
 .home-store .store-right{width: 120upx;height: 120upx;background-color: #fff;text-align: center;display: flex;align-items: center;justify-content: center;margin-left: auto;margin-right: 0;border-radius: 10upx;}
-.home-store .store-right image{width: 60upx;height: 60upx;}
+.home-store .store-right image{width: 50upx;height: 50upx;}
 .home-store .left{display: flex;align-items: center;}
-.home-store .left image{width: 60upx;height: 60upx;margin-right: 20upx;}
+.home-store .left image{width: 50upx;height: 50upx;margin-right: 15upx;}
 .home-store .right {margin-left: auto;margin-right: 0;display: flex;align-items: center;}
 .home-store .right image{width: 50upx;height: 50upx;}
 .home-store .name{font-size: 32upx;color: #000;font-weight: bold;}
+.home-store .name text{font-size: 24upx;color: #666;font-weight: normal;margin-left: 20upx;}
 .home-store .desc{font-size: 26upx;color: #666;margin-top: 20upx;}
 .home-store .status{color: #333;font-size: 28upx;padding:5upx 15upx;border-radius: 10upx;margin-left: 10upx;}
 .home-store .status.error{background-color: #fef0f0;color: #f56c6c;}

+ 8 - 4
pages/service/chat/chat.vue

@@ -53,16 +53,16 @@
 				</view>
 			</scroll-view>
 			<view class="bottomOperationRef">
-				<!-- <view class="bottom-btn-group">
-					<view class="btn-item">
+				<view class="bottom-btn-group">
+					<!-- <view class="btn-item">
 						<image src="https://jymini.oss-cn-guangzhou.aliyuncs.com/mini/star.svg"></image>
 						<view class="name">评价服务</view>
-					</view>
+					</view> -->
 					<view class="btn-item" @click="showOrder(1)">
 						<image src="https://jymini.oss-cn-guangzhou.aliyuncs.com/mini/order.svg"></image>
 						<view class="name">我的订单</view>
 					</view>
-				</view> -->
+				</view>
 				<view class="bottom-operation-box">
 					<view class="input-text">
 						<textarea class="input" placeholder="输入点什么呢..." auto-height="true" confirm-type="send" type="text" :focus="isFocus"
@@ -334,7 +334,11 @@ export default {
 					if (payInfo.status == 1) {
 						return this.$dialog.showSuccess("已完成支付")
 					}
+					uni.showLoading({
+						title:"发起中..."
+					})
 					Api.pricePay({order:payInfo.order}).then((res)=>{
+						uni.hideLoading()
 						if (res.code == 0) {
 							return app.$dialog.showSuccess(res.msg)
 						}

+ 6 - 2
static/api/order.js

@@ -9,14 +9,18 @@ const apiUri = {
 	repay: '/order/repay',
 	refund: '/order/refund',
 	mobile: '/order/mobile',
-	pricePay: '/order/pricePay'
+	pricePay: '/order/pricePay',
+	complaint: '/order/complaint'
 }
 
 export function confirm(param) {
 	return request.request(apiUri.confirm,'GET', param,false,true,true)
 }
+export function complaint(param) {
+	return request.request(apiUri.complaint,'POST', param,false,true,false)
+}
 export function pricePay(param) {
-	return request.request(apiUri.pricePay,'POST', param,false,true,false)
+	return request.request(apiUri.pricePay,'POST', param,false,true,true)
 }
 export function toPay(param) {
 	return request.request(apiUri.toPay,'POST', param,false,true,false)

+ 36 - 0
uni_modules/ikun-qrcode/changelog.md

@@ -0,0 +1,36 @@
+## 1.0.18(2026-03-20)
+docs:不支持uniapp-x, 近期没有适配计划,已更新到说明文档。
+## 1.0.17(2025-10-23)
+chore: 增加开源地址
+## 1.0.16(2025-07-10)
+doc:整理文档
+## 1.0.15(2025-07-04)
+doc: unit字段 只支持rpx,px,为了兼容nvue。
+## 1.0.14(2025-04-28)
+doc: 文档更新
+## 1.0.13(2025-04-28)
+feat: 添加中间的logo图片
+## 1.0.12(2025-04-22)
+修复微信小程序rpx计算误差,使用vw来代替
+## 1.0.11(2025-04-14)
+docs: 不支持canvas相关的属性,如保存。
+## 1.0.10(2024-10-16)
+优化markdown排版
+## 1.0.9(2024-10-16)
+更新微信小程序在各平台测试结果
+## 1.0.8(2024-10-16)
+ipados 18.0微信小程序发行正式版,测试可以正常出二维码。 (PS: 如果一直转圈动画,排查你的url变量是否为空,是否被微信拦截了接口数据)、 
+## 1.0.7(2024-08-02)
+fix: cssName修复
+## 1.0.6(2024-08-01)
+修复README.md
+## 1.0.5(2024-08-01)
+README新增:vue2,vue3详细用法
+## 1.0.4(2024-08-01)
+更新vue2,vue3详细用法
+## 1.0.3(2024-08-01)
+更新vue2/vue3详细用法
+## 1.0.0版本
+极简的二维码生成组件,vue2 / vue3 可用. 100行搞定。
+### 特点
+- 使用基础的view来生成二维码的点,而不是canvas,避免带来层级问题。

Разлика између датотеке није приказан због своје велике величине
+ 6 - 0
uni_modules/ikun-qrcode/components/ikun-qrcode/ikun-qrcode.vue


Разлика између датотеке није приказан због своје велике величине
+ 33 - 0
uni_modules/ikun-qrcode/components/ikun-qrcode/uqrcode_latest.js


+ 100 - 0
uni_modules/ikun-qrcode/package.json

@@ -0,0 +1,100 @@
+{
+  "id": "ikun-qrcode",
+  "displayName": "【ikun-qrcode】极简的二维码生成组件,使用view而非canvas避免层级问题",
+  "version": "1.0.18",
+  "description": "ikun-qrcode,极简的二维码生成组件,使用view而非canvas避免层级问题",
+  "keywords": [
+    "ikun-qrcode",
+    "qrcode",
+    "二维码"
+],
+  "repository": "https://github.com/ikun-ui-uniapp/ikun-qrcode.git",
+  "engines": {
+    "HBuilderX": "^3.97",
+    "uni-app": "^3.7.1",
+    "uni-app-x": ""
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "无"
+    },
+    "npmurl": "",
+    "darkmode": "x",
+    "i18n": "x",
+    "widescreen": "√"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "√",
+        "aliyun": "√",
+        "alipay": "√"
+      },
+      "client": {
+        "uni-app": {
+          "vue": {
+            "vue2": "√",
+            "vue3": "√"
+          },
+          "web": {
+            "safari": "√",
+            "chrome": "√"
+          },
+          "app": {
+            "vue": "√",
+            "nvue": "√",
+            "android": "√",
+            "ios": "√",
+            "harmony": "√"
+          },
+          "mp": {
+            "weixin": "√",
+            "alipay": "√",
+            "toutiao": "√",
+            "baidu": "√",
+            "kuaishou": "√",
+            "jd": "√",
+            "harmony": "√",
+            "qq": "√",
+            "lark": "√",
+            "xhs": "-"
+          },
+          "quickapp": {
+            "huawei": "√",
+            "union": "√"
+          }
+        },
+        "uni-app-x": {
+          "web": {
+            "safari": "-",
+            "chrome": "-"
+          },
+          "app": {
+            "android": "-",
+            "ios": "-",
+            "harmony": "-"
+          },
+          "mp": {
+            "weixin": "-"
+          }
+        }
+      }
+    }
+  }
+}

Разлика између датотеке није приказан због своје велике величине
+ 43 - 0
uni_modules/ikun-qrcode/readme.md


Неке датотеке нису приказане због велике количине промена