Browse Source

add order logic

dev
刘嘉炜 2 weeks ago
parent
commit
8bde07f406
  1. 13
      src/pages/order/list.vue
  2. 20
      src/subpackage/groupon/components/site/table.vue
  3. 6
      src/subpackage/groupon/pages/confirm_order/venue.vue
  4. 6
      src/subpackage/order/api/index.js
  5. 163
      src/subpackage/order/components/detail/cancel_modal.vue
  6. 10
      src/subpackage/order/components/detail/contact.vue
  7. 141
      src/subpackage/order/pages/detail.vue

13
src/pages/order/list.vue

@ -5,7 +5,7 @@ import { routeTo, showNone } from '@/utils/polish';
import { reactive, ref } from 'vue'; import { reactive, ref } from 'vue';
import { orderList } from "@/api"; import { orderList } from "@/api";
const tab = reactive({ const tab = reactive({
list: [ {name: '全部'}, {name: '已核销'}, {name: '已退款'}, ],
list: [ {name: '全部', val: ''}, { name: '待使用', val: 1 }, { name: '已退款', val: 4 }, ],
idx: 0 idx: 0
}); });
let loadPage = 1; let loadPage = 1;
@ -16,9 +16,14 @@ onLoad(() => {
}); });
onReachBottom(()=>{ onReachBottom(()=>{
getOrderLs({ page: ++loadPage });
let _status = tab.list[tab.idx]?.val ?? '';
getOrderLs({ page: ++loadPage, status: _status });
}) })
function tabChange(data){
loadPage = 1;
orderLs.value = [];
getOrderLs({ status: data.ele.val });
}
function toOrderDetail(e){ function toOrderDetail(e){
let _qryStr = `brand_id=${e?.brand_id ?? ''}&order_no=${e?.order_no ?? ''}`; let _qryStr = `brand_id=${e?.brand_id ?? ''}&order_no=${e?.order_no ?? ''}`;
@ -60,7 +65,7 @@ function order_zh_status(status){
<template> <template>
<view class="order-list"> <view class="order-list">
<view class="ol-header"> <view class="ol-header">
<tab-bar :tabs="tab.list" v-model:idx="tab.idx"></tab-bar>
<tab-bar :tabs="tab.list" v-model:idx="tab.idx" @click:tab="tabChange"></tab-bar>
</view> </view>
<view class="ol-list-content"> <view class="ol-list-content">
<view class="ol-item" v-for="(e, i) in orderLs" :key="i" @click="toOrderDetail(e)"> <view class="ol-item" v-for="(e, i) in orderLs" :key="i" @click="toOrderDetail(e)">

20
src/subpackage/groupon/components/site/table.vue

@ -33,17 +33,17 @@ const itemClick = function(k, i, j){
_tableCopy[i].items[j]._is_selected = !k?._is_selected; _tableCopy[i].items[j]._is_selected = !k?._is_selected;
// //
// //
const autoSelect = new AutoSelect({
items: _tableCopy[i].items ?? [],
index: j,
timeUnit: 2,
bookingHour: 3,
})
let [ _handleSelectItems, _noticeList ] = autoSelect.getInfo();
// const autoSelect = new AutoSelect({
// items: _tableCopy[i].items ?? [],
// index: j,
// timeUnit: 2,
// bookingHour: 3,
// })
// let [ _handleSelectItems, _noticeList ] = autoSelect.getInfo();
_tableCopy[i].items = _handleSelectItems;
//
nextTick(_=>autoSelect.showModalList(_noticeList || []));
// _tableCopy[i].items = _handleSelectItems;
// //
// nextTick(_=>autoSelect.showModalList(_noticeList || []));
emits('update:sitetable', _tableCopy); emits('update:sitetable', _tableCopy);

6
src/subpackage/groupon/pages/confirm_order/venue.vue

@ -49,10 +49,7 @@ function pvc_func(data){
} }
function confirmBtn(){ function confirmBtn(){
let _tVal = ticketInfo.value; let _tVal = ticketInfo.value;
let _classTags = (venueData.value?.venues ?? []).map(e=>e?._class_tag ?? '');
const _query = { const _query = {
verifyToken: verify_token.value ?? '', verifyToken: verify_token.value ?? '',
poiId: _tVal?.poi_id ?? '', poiId: _tVal?.poi_id ?? '',
@ -165,7 +162,8 @@ function createBookOrder(data){
></ticket-item> ></ticket-item>
<view class="vc-txt">温馨提示团购券需一次性使用完一经使用不退不换</view> <view class="vc-txt">温馨提示团购券需一次性使用完一经使用不退不换</view>
</view> </view>
<view class="vc-box vc-contact">
<!-- 没有这个字段 -->
<view class="vc-box vc-contact" v-if="false">
<view class="vc-title">*联系方式</view> <view class="vc-title">*联系方式</view>
<view class="vc-txt">为了场馆更好地为您服务请准确填写您的联系方式</view> <view class="vc-txt">为了场馆更好地为您服务请准确填写您的联系方式</view>
<view class="vc-phone"> <view class="vc-phone">

6
src/subpackage/order/api/index.js

@ -1,5 +1,11 @@
import server from '@/api/server'; import server from '@/api/server';
export const orderGet = params => server.post({ url: '/stadium/order/get', ...params }); // 预约订单详情 export const orderGet = params => server.post({ url: '/stadium/order/get', ...params }); // 预约订单详情
export const cancelCheck = params => server.post({ url: '/stadium/order/cancelCheck', ...params }); // 检测预约订单是否可以取消
export const orderCancel = params => server.post({ url: '/stadium/order/cancel', ...params }); // A我的预约订单-取消预约订单 申请退款
export const getCreateOrderProxyData = params => server.post({ url: '/pay/douyin/getCreateOrderProxyData', ...params }); // 获取抖音退款信息

163
src/subpackage/order/components/detail/cancel_modal.vue

@ -0,0 +1,163 @@
<script setup>
import { onLoad } from '@dcloudio/uni-app';
import { reactive, ref } from 'vue';
import { showNone, showModal } from "@/utils/polish";
const emits = defineEmits([ 'click:confirm' ]);
const reasonList = [
{txt: '计划有变'},
{txt: '订单信息有误,重新预定'},
{txt: '其他原因'},
];
const curTxt = ref('');
const isShow = ref(false);
const successFunc = ref(null);
onLoad(() => {
});
function init(data){
curTxt.value = '';
isShow.value = true;
successFunc.value = data?.successFunc || null;
}
function confirmBtn(){
if(!curTxt.value)return showNone('请选择取消预约原因');
emits('click:confirm', curTxt.value);
if(successFunc.value && typeof successFunc.value === 'function'){
successFunc.value(curTxt.value);
}
isShow.value = false;
}
defineExpose({ init });
</script>
<template>
<view class="vod-cancel-modal" v-show="isShow">
<view class="vcm-box">
<view class="vb-close" @click="isShow = false"></view>
<view class="vb-title">取消预约原因</view>
<view class="vb-list">
<view
:class="['vl-item', curTxt == e.txt?'active':'']"
v-for="(e,i) in reasonList"
:key="i"
@click="curTxt = e.txt">{{ e.txt }}</view>
</view>
<view class="vb-btn" hover-class="hover" @click="confirmBtn">确认</view>
</view>
</view>
</template>
<style lang="scss" scoped>
.vod-cancel-modal{
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: rgba(0,0,0,.5);
.vcm-box{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
padding-top: 78upx;
padding-bottom: 78upx;
width: 620upx;
border-radius: 10upx;
background-color: #fff;
}
@mixin closeIcon($width,$height,$color) {
transform: rotateZ(45deg);
&::before{
content: '';
display: block;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
width: $width;
height: $height;
background-color: $color;
border-radius: $height;
}
&::after{
content: '';
display: block;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
width: $height;
height: $width;
background-color: $color;
border-radius: $height;
}
}
.vb-close{
position: absolute;
right: 30upx;
top: 30upx;
width: 40upx;
height: 40upx;
@include closeIcon(4upx,40upx,#9a9a9d);
}
.vb-title{
margin-bottom: 42upx;
line-height: 44upx;
text-align: center;
font-size: 32upx;
font-weight: 500;
color: #333;
}
.vb-list{
margin-bottom: 50upx;
padding: 0 26upx;
.vl-item{
padding: 0 32upx;
border-radius: 10upx;
border: 2upx solid #F2F2F7;
background-color: #f2f2f7;
@include flcw(28upx, 104upx, #9a9a9d);
@include tHide;
&:not(:last-child){
margin-bottom: 16upx;
}
&.active{
border-color: $mColor;
background-color: rgba(0,152,116,0.2);
color: #333333;
}
}
}
@mixin hover {
position: relative;
overflow: hidden;
&::after{
content: '';
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 2;
background-color: rgba(0,0,0,.1);
}
}
.vb-btn{
margin: 0 auto;
width: 240upx;
text-align: center;
border-radius: 44upx;
background-color: $mColor;
@include flcw(32upx, 88upx, #fff);
&.hover{
@include hover;
}
}
}
</style>

10
src/subpackage/order/components/detail/contact.vue

@ -17,10 +17,11 @@ onLoad(() => {
<template> <template>
<view class="detail-contact"> <view class="detail-contact">
<view class="dc-left"> <view class="dc-left">
<view class="dl-line">
<!-- 接口没有营业时间产品说去掉 -->
<!-- <view class="dl-line">
<view class="dl-icon">&#xe60f;</view> <view class="dl-icon">&#xe60f;</view>
<view class="dl-txt">周一周日09:05-12:0014:30-24周二周四周五...</view>
</view>
<view class="dl-txt">-</view>
</view> -->
<view class="dl-line"> <view class="dl-line">
<view class="dl-icon">&#xe600;</view> <view class="dl-icon">&#xe600;</view>
<view class="dl-txt">{{ address ?? '-' }}></view> <view class="dl-txt">{{ address ?? '-' }}></view>
@ -32,7 +33,8 @@ onLoad(() => {
<view class="di-item" @click="emits('click:phone')">&#xe605;</view> <view class="di-item" @click="emits('click:phone')">&#xe605;</view>
<view class="di-item" @click="emits('click:nav')">&#xe672;</view> <view class="di-item" @click="emits('click:nav')">&#xe672;</view>
</view> </view>
<view class="dr-txt">距离23m</view>
<!-- 产品说去掉 -->
<!-- <view class="dr-txt">距离-m</view> -->
</view> </view>
</view> </view>
</template> </template>

141
src/subpackage/order/pages/detail.vue

@ -5,22 +5,29 @@ import textLine from "../components/detail/text_line.vue";
import detailGoods from "../components/detail/goods.vue"; import detailGoods from "../components/detail/goods.vue";
import detailVerify from "../components/detail/verify.vue"; import detailVerify from "../components/detail/verify.vue";
import detailContact from "../components/detail/contact.vue"; import detailContact from "../components/detail/contact.vue";
import cancelModal from "../components/detail/cancel_modal.vue";
import venueInfoAsync from "@/subpackage/groupon/components/venue_info.vue"; import venueInfoAsync from "@/subpackage/groupon/components/venue_info.vue";
import { orderGet } from "../api";
import { orderGet, cancelCheck, orderCancel, getCreateOrderProxyData } from "../api";
import { get_zh_day } from "@/utils"; import { get_zh_day } from "@/utils";
import { showLoad, hideLoad, showNone } from "@/utils/polish";
const orderInfo = ref({}); const orderInfo = ref({});
const cancelModalRef = ref(null);
// order_type 0 1/2 // order_type 0 1/2
onLoad(options => { onLoad(options => {
getOrderInfo({
brand_id: options?.brand_id ?? '',
order_no: options?.order_no ?? '',
});
});
function getOrderInfo({ brand_id, order_no }){
orderGet({ orderGet({
data: {
brand_id: options?.brand_id ?? '',
order_no: options?.order_no ?? '',
}
data: { brand_id, order_no, }
}) })
.then(res=>{ .then(res=>{
orderInfo.value = res?.data ?? {}; orderInfo.value = res?.data ?? {};
}) })
});
}
function previewImg(img){ function previewImg(img){
uni.previewImage({ urls: [ img ] }); uni.previewImage({ urls: [ img ] });
@ -34,7 +41,7 @@ function phoneClick(){
function navClick(){ function navClick(){
let _oInfo = orderInfo.value; let _oInfo = orderInfo.value;
wx.openLocation({
uni.openLocation({
latitude: +_oInfo.lat, latitude: +_oInfo.lat,
longitude: +_oInfo.lng, longitude: +_oInfo.lng,
name: _oInfo.stadium_name, name: _oInfo.stadium_name,
@ -65,6 +72,122 @@ function order_zh_status(status){
return ['未支付','待使用','已使用','已失效','已退款'][status] || ''; return ['未支付','待使用','已使用','已失效','已退款'][status] || '';
} }
function refundBtn(){
console.warn('refundBtn', cancelModalRef.value);
cancelModalRef.value.init({
successFunc: async reason => {
return serverOrderCancel({
brand_id: orderInfo.value?.brand_id ?? '',
order_no: orderInfo.value?.order_no ?? '',
reason
});
let cCheck = await dyOrderCancelCheck({
brand_id: orderInfo.value?.brand_id ?? '',
order_no: orderInfo.value?.order_no ?? '',
reason
});
if(cCheck !== 'success')return;
dyRefund(reason);
}
});
}
async function dyRefund(reason){
let _order = orderInfo.value;
try{
let _refundInfo = await getCancelOrderData(orderInfo.order_no);
console.warn('getCancelOrderData --->', _refundInfo)
if(!_refundInfo?.sku_list?.length)return;
let _skuls = _refundInfo.sku_list
let _refundObj = {
outOrderNo: _order?.order_no ?? '', //
refundInfo: { // 退
reason: [ reason ] // 退 20 退 60
},
skuList: _skuls.map(el=>({
skuId: el.sku_id,
skuType: el.sku_id_type,
quantity: el.quantity,
})),
callbackData: {
order_entry_schema: {
path: 'subpackage/order/pages/detail',
params: {
brand_id: _order?.brand_id ?? '',
order_no: _order?.order_no ?? '',
}
}
},
success: rRes =>{
console.warn('申请退款成功! dyRefund --->', rRes);
// setTimeout(_=>{
// this.getDetail({
// brand_id: orderInfo.brand_id || '',
// order_no: orderInfo.order_no || '',
// })
// }, 1000)
serverOrderCancel({
brand_id: _order?.brand_id ?? '',
order_no: _order?.order_no ?? '',
reason
});
},
fail: fErr => {
console.warn('申请退款失败 dyRefund --->', fErr);
showNone(fErr.errMsg || '申请退款失败!稍后重试')
// this.orderCancelServer({
// orderInfo,
// reason: _reason
// });
}
};
console.warn('applyRefund obj --->', _refundObj)
tt.applyRefund(_refundObj);
}catch(err){
}
}
//
function dyOrderCancelCheck({ brand_id, order_no, reason }){
return cancelCheck({
data: { brand_id, order_no, reason, }
})
.then(res=>{
console.warn('dyOrderCancelCheck--->', res);
if(res?.code === 0)return 'success';
})
}
// 退
function getCancelOrderData(order_no){
return getCreateOrderProxyData({
data: { order_no }
})
.then(res=>{
if(res?.code === 0)return res?.data ?? {};
})
}
// 退
function serverOrderCancel({ brand_id, order_no, reason }){
return orderCancel({
data: { brand_id, order_no, reason, }
})
.then(res=>{
if(res?.code === 0){
showNone(res?.message ?? '操作成功!');
setTimeout(_=>{
getOrderInfo({
brand_id,
order_no
});
}, 1200);
}
})
}
</script> </script>
<template> <template>
@ -157,9 +280,11 @@ function order_zh_status(status){
></detail-goods> ></detail-goods>
</view> </view>
<view class="od-fixed" v-if="orderInfo.pay_status == 1&&orderInfo.is_refundable"> <view class="od-fixed" v-if="orderInfo.pay_status == 1&&orderInfo.is_refundable">
<view class="of-refund">申请退款</view>
<!-- <view class="od-fixed"> -->
<view class="of-refund" @click="refundBtn">申请退款</view>
</view> </view>
</view> </view>
<cancel-modal ref="cancelModalRef"></cancel-modal>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>

Loading…
Cancel
Save