chenkainan 4 months ago
parent
commit
5eaae6d97e
  1. 7
      pages.json
  2. 2
      pages/index/index.vue
  3. 13
      pages/login/login.vue
  4. 2
      pages/user/user.vue
  5. 9
      subPackages/homestay/order.vue
  6. 272
      subPackages/order/orderDetail.vue
  7. 396
      subPackages/order/trades.vue

7
pages.json

@ -199,6 +199,13 @@
"navigationBarTitleText": "全部订单"
}
},
{
"path": "order/orderDetail",
"style": {
"navigationBarTitleText": "订单详情",
"navigationStyle": "custom"
}
},
{
"path": "homestay/index",
"style": {

2
pages/index/index.vue

@ -124,7 +124,7 @@
this.gotoDetailByType(item.product_model)
break;
case 2:
this.gotoPath(item.tdata.url)
this.gotoPath(item.front_model.inside)
break;
case 3:
this.gotoWebUrl(item.tdata.url)

13
pages/login/login.vue

@ -27,6 +27,7 @@ export default {
data() {
return {
isAgreed: false,
openid: ''
};
},
onLoad(options) {
@ -46,10 +47,10 @@ export default {
code: e.detail.code,
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
token: uni.getStorageSync('token1')
}, '/api/mini_program/bindPhoneNumber')
openid: this.openid
}, '/api/uservice/user/bindPhoneNumber')
.then(res => {
this.$store.commit('changeUserInfo', res.data.userinfo);
this.$store.commit('changeUserInfo', res.data);
this.navigateBasedOnPath();
})
.catch(error => {
@ -107,11 +108,11 @@ export default {
loginType: 3
}, '/api/uservice/user/wxLogin')
.then(resTwo => {
this.$store.commit('changeUserInfo', resTwo.data.userinfo);
if (resTwo.data.userinfo.mobile) {
this.$store.commit('changeUserInfo', resTwo.data);
if (resTwo.data.isBindMobile) {
this.navigateBasedOnPath();
} else {
uni.setStorageSync('token1', resTwo.data.userinfo.token);
this.openid = resTwo.data.openid
this.$refs.popup.open('bottom');
}
})

2
pages/user/user.vue

@ -10,7 +10,7 @@
class="headImg" v-else></image>
</view>
<view class="username" v-if="userInfo.nickname">{{userInfo.nickname}}</view>
<view class="username" >请登录/注册 ></view>
<view class="username" v-else>请登录/注册 ></view>
</view>
<view class="top-right" v-if="userInfo.nickname">
个人信息 <image src="https://static.ticket.sz-trip.com/tongli/images/user/rightIcon1.png" mode=""></image>

9
subPackages/homestay/order.vue

@ -310,19 +310,20 @@
]
}
console.log('data',data)
this.Post({
method: 'POST',
data: JSON.stringify(data)
}, '/api/order/create').then(res => {
console.log('成功');
if (res.code == 1) {
return;
uni.removeStorageSync('hotelOrderInfo')
this.Post({
order_id: res.data.order_id,
type: "miniprogram",
platform: 'miniprogram'
}, '/api/pay/unify').then(res => {
pay_platform: "miniprogram",
pay_method: 'abc'
}, '/api/order/pay').then(res => {
if (res.data) {
uni.requestPayment({
nonceStr: res.data.nonceStr,

272
subPackages/order/orderDetail.vue

@ -0,0 +1,272 @@
<template>
<view class="bg">
<view class="title-box">
<uni-icons type="left" size="30" @click="goBack"></uni-icons>
<view>订单状态</view>
</view>
<view class="state-box">
<view>{{info.state_text}}</view>
<!-- 待支付时会显示自动取消时间 -->
<view v-if="info.state=='WAIT_PAYMENT'" class="close-time">订单将在<span>{{info.close_time.slice(-8)}}</span>自动取消</view>
<!-- 待退款 -->
<view v-if="info.state=='REFUNDING'" class="close-time">系统将在1-7个工作日内原路退回您的原支付账户</view>
<!-- 退款完成 -->
<view v-if="info.state=='REFUND'" class="close-time">您的退款金额已退还到您的原支付账户</view>
</view>
<view class="box">
<!-- 循环子订单 -->
<view v-for="(item,index) in orderChildList" :key="index">
<view class="product-box">
<view class="title" @click="item.type=item.product_model;gotoDetailByType(item)">
{{item.product_title}}
<image src="https://static.ticket.sz-trip.com/shiweisuzhou/images/order/rightIcon.png" class="rightIcon"></image>
</view>
<view class="subtitle" v-if="item.use_date"><span>出行时间</span>{{item.use_date}}</view>
<view class="subtitle" v-if="item.use_date"><span>开放时间</span>{{item.use_date}}</view>
<view class="line"></view>
<view class="skutitle flex-between">
<view>{{item.sku_name}}</view>
<view>
<span>{{item.product_price / 100}}</span>
x{{item.product_num}}
</view>
</view>
</view>
<view class="product-box">
<view class="title">出行人</view>
<view class="subtitle flex-between">
<span>手机号</span>{{item.phone}}
</view>
</view>
</view>
<view class="product-box">
<view class="subtitle flex-between">
<span>商品总额</span>{{info.total_money / 100}}
</view>
<view class="subtitle flex-between">
<span>优惠券</span>-{{info.preference_money / 100}}
</view>
<view class="subtitle flex-between">
<span>实付金额</span><view class="price">{{info.paid_money / 100}}</view>
</view>
</view>
<view class="product-box">
<view class="title">订单信息</view>
<view class="subtitle" style="display: flex;">
<span>订单账号</span>{{info.order_id}}
<view class="copy flex-around" @click="clickCopy">
<image src="https://static.ticket.sz-trip.com/shiweisuzhou/images/order/copy.png"></image>
复制
</view>
</view>
<view class="subtitle">
<span>下单时间</span>{{info.close_time}}
</view>
</view>
<view class="kefu-box">
<image src="https://static.ticket.sz-trip.com/shiweisuzhou/images/order/kefu.png"></image>
联系客服
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
orderId: '',
info: {},
orderChildList: []
}
},
onLoad(option) {
this.orderId = option.id
this.getDetail()
},
methods: {
getDetail() {
this.Post({
order_id: this.orderId
},'/api/order/query').then(res => {
console.log(res.data)
this.info = res.data
this.orderChildList = res.data.order_product_list
// 线
// this.info.order_product_list.forEach(item => {})
})
},
//
clickCopy() {
uni.setClipboardData({
data: this.info.order_id, //
success: () => {
//
uni.showToast({
title: '复制成功',
icon: 'none'
});
}
});
},
}
}
</script>
<style lang="scss" scoped>
.bg {
width: 750rpx;
overflow-x: hidden;
min-height: 100vh;
background-color: #F7F7F7;
padding-bottom: 200rpx;
}
.title-box {
font-size: 40rpx;
padding: 0 26.67rpx;
z-index: 2;
display: flex;
align-items: center;
width: 100%;
background: #D3E8A7;
height: 176rpx;
padding: 90rpx 26rpx 0 ;
view {
font-weight: 400;
font-size: 36rpx;
color: #000000;
margin-left: 230rpx;
}
}
.state-box {
width: 750rpx;
height: 240rpx;
background: linear-gradient(180deg, #D3E8A7, #D3E8A7, #D3E8A7, #F7F7F7);
padding: 42rpx 0 0 53rpx;
font-weight: bold;
font-size: 43rpx;
color: #000000;
.close-time {
font-weight: 500;
font-size: 27rpx;
color: #000000;
span {
color: #C3282E;
}
}
}
.box {
position: relative;
padding: 0 26rpx;
margin-top: -66rpx;
.product-box {
padding: 28rpx 28rpx 46rpx;
margin-bottom: 22rpx;
background: #FFFFFF;
border-radius: 20rpx;
.title {
font-weight: bold;
font-size: 36rpx;
color: #000000;
display: flex;
align-items: center;
.rightIcon {
width: 17.33rpx;
height: 29.33rpx;
margin-left: 25rpx;
}
}
.subtitle {
font-weight: 500;
font-size: 27rpx;
color: #000000;
margin-top: 18rpx;
span {
color: #666666;
min-width: 125rpx;
}
}
.line {
width: 643rpx;
height: 1rpx;
background: #D8D8D8;
margin: 33rpx 0;
}
.skutitle {
font-weight: 500;
font-size: 27rpx;
color: #000000;
span {
margin-right: 60rpx;
}
}
.price {
font-weight: bold;
font-size: 34rpx;
color: #C3282E;
}
.price::before {
font-size: 24rpx;
content: '¥';
}
.copy {
width: 93rpx;
height: 37rpx;
border-radius: 11rpx;
border: 1rpx solid #515150;
font-weight: 500;
font-size: 22rpx;
color: #515150;
margin-left: 30rpx;
image {
width: 22rpx;
height: 23.33rpx;
}
}
}
.kefu-box {
height: 96rpx;
background: #FFFFFF;
border-radius: 20rpx;
padding-left: 27rpx;
display: flex;
align-items: center;
font-weight: 500;
font-size: 31rpx;
color: #000000;
image {
width: 44rpx;
height: 44rpx;
margin-right: 14rpx;
}
}
}
</style>

396
subPackages/order/trades.vue

@ -1,28 +1,34 @@
<template>
<view class="bg">
<!-- 顶部搜索和筛选区域 -->
<view class="top-bg">
<view class="flex-around" style="margin-bottom: 20rpx;">
<view class="search-box">
<view class="left">
<image src="https://static.ticket.sz-trip.com/yandu/images/eventCalendar/search.png"
mode="aspectFill"></image>
<input v-model="keywords" type="text" placeholder="请输入关键字" @confirm="search()" />
<image src="https://static.ticket.sz-trip.com/yandu/images/eventCalendar/search.png" mode="aspectFill"></image>
<input v-model="keywords" type="text" placeholder="请输入关键字" @confirm="search" />
</view>
</view>
<view class="select-btn" @click="range = []; dateIndex = null; $refs.popup.open()">
<image src="https://static.ticket.sz-trip.com/shiweisuzhou/images/order/select.png" mode="aspectFill"></image>
筛选
</view>
<!-- <view class="btn" @click="search()">搜索</view> -->
</view>
<view class="common-box">
<view class="common-types com-flex-tao">
<view @click="setType(index)" v-for="(item, index) in typeList" :key="item.id"
:class="['common-type', typeIndex == index ? 'active' : '']">
:class="['common-type', typeIndex === index ? 'active' : '']">
{{ item.name }}
</view>
</view>
</view>
</view>
<view class="list-common-empty" v-if="list.length == 0">
<!-- 无订单提示 -->
<view class="list-common-empty" v-if="list.length === 0">
<img src="https://static.ticket.sz-trip.com/shiweisuzhou/images/user/noTrades.png" />
<p class="list-common-empty-tip">还没有订单赶快去下单吧~</p>
</view>
<!-- 订单列表 -->
<view class="trade-list" v-if="list.length > 0">
<view v-for="(item, key) in list" :key="item.id" class="trade-items" v-if="showItem(item)"
@click="() => choseType(item)">
@ -50,19 +56,42 @@
<text>{{ item.total_money / 100 }}</text>
</view>
<view class="trade-item-btns">
<view @click.stop="() => refund(item.order_id, key)" v-if="item.status == 'PAYMENT_SUCCESSFULLY'">
申请退款</view>
<view @click.stop="() => closeOrder(item.order_id, item)" v-if="item.status == 'WAIT_PAYMENT'">关闭订单
<view @click.stop="() => refund(item.order_id, key)" v-if="['WAIT_POST','WAIT_USE','PAID'].includes(item.state)">
取消订单
</view>
<view @click.stop="() => closeOrder(item.order_id, item)" v-if="item.state === 'UNPAID'">
关闭订单
</view>
<view @click.stop="confirmpost(item.order_id, key)" v-if="item.postFlag">确认收货</view>
<view class="pay-btn" @click.stop="setOrderId(item.order_id)" v-if="item.status == 'WAIT_PAYMENT'">
立即支付</view>
<!-- <view @click.stop="confirmpost(item.order_id, key)" v-if="item.postFlag">确认收货</view> -->
<view class="pay-btn" @click.stop="setOrderId(item.order_id)" v-if="item.state === 'UNPAID'">
立即支付
</view>
</view>
</view>
<!-- <view v-if="list.length === 0 && finished" class="noDate">
<view>暂无订单</view>
</view> -->
</view>
<!-- 筛选弹框 -->
<uni-popup ref="popup" type="bottom" :safe-area="false">
<view class="popup-box">
<view class="popup-top flex-between">
<view @click="$refs.popup.close()">取消</view>
<view>订单筛选</view>
<view @click="changeDate">确定</view>
</view>
<view class="popup-content">
<view class="content-top">下单时间</view>
<view class="content-bottom">
<view class="flex-between">
<view :class="['content-item', {'content-active': dateIndex === 0 && range.length === 0}]"
@click="range = []; dateIndex = 0">近七天</view>
<view :class="['content-item', {'content-active': dateIndex === 1 && range.length === 0}]"
@click="range = []; dateIndex = 1">近三十天</view>
</view>
<uni-datetime-picker v-model="range" type="daterange" :end="new Date().Format('Y-MM-dd')" />
</view>
</view>
</view>
</uni-popup>
</view>
</template>
@ -73,89 +102,95 @@
return {
finished: false,
list: [],
typeList: [{
name: '全部',
id: 'ALL'
},
{
name: '待付款',
id: 'WAIT_PAYMENT'
},
{
name: '待发货',
id: 'WAIT_POST'
},
{
name: '待使用/出行',
id: 'WAIT_USE'
},
{
name: '待收货',
id: 'WAIT_DELIVERY'
},
{
name: '退款/售后',
id: 'NEED_REFUND'
}
typeList: [
{ name: '全部', id: 'ALL' },
{ name: '待付款', id: 'WAIT_PAYMENT' },
{ name: '待发货', id: 'WAIT_POST' },
{ name: '待使用/出行', id: 'WAIT_USE' },
{ name: '待收货', id: 'WAIT_DELIVERY' },
{ name: '退款/售后', id: 'NEED_REFUND' }
],
typeIndex: 0,
ajaxFlag: true,
keywords: '',
orderId: null,
dateRange: [],
type: ''
type: '',
range: [],
dateIndex: null,
};
},
onLoad(options) {
console.log(options);
if (options.type) this.typeIndex = this.typeList.findIndex(vm => vm.name === options.type);
uni.$on("updateDataByConnect", this.getDataByConnect)
if (options.type) {
this.typeIndex = this.typeList.findIndex(vm => vm.name === options.type);
}
uni.$on("updateDataByConnect", this.getDataByConnect);
},
onShow() {
this.getList();
},
onUnload() {
uni.$off("updateDataByConnect", this.getDataByConnect)
uni.$off("updateDataByConnect", this.getDataByConnect);
},
onReachBottom() {
if (this.finished) return false;
this.getList();
},
watch: {
range(newval) {
console.log('范围选:', this.range);
},
},
methods: {
// n
getLastNDays(n) {
const endDate = new Date();
const startDate = new Date();
startDate.setDate(endDate.getDate() - n + 1); //
// YYYY-MM-DD
const formatDate = (date) => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
};
return [formatDate(startDate), formatDate(endDate)];
},
//
getDataByConnect(data) {
if (data.msgType == "updateOrderTrades") {
this.list = [];
this.finished = false;
this.getList()
if (data.msgType === "updateOrderTrades") {
this.resetList();
this.getList();
}
},
emptyFunc() {
},
//
showItem(item) {
let flag = true;
// if (this.typeIndex == 2 && item.order_child[0] && !item.order_child[0].consignee) flag = false
// if (this.typeIndex === 2 && item.order_child[0] && !item.order_child[0].consignee) flag = false;
return flag;
},
//
onReload() {
this.list = [];
this.finished = false;
this.resetList();
this.getList();
},
//
setType(index) {
this.typeIndex = index;
this.onReload();
},
// ID
setOrderId(id) {
let that = this;
that.orderId = id;
that.Post({
this.orderId = id;
this.Post({
order_id: id,
type: "miniprogram",
platform: 'miniprogram'
},
'/api/pay/unify'
).then(res => {
}, '/api/pay/unify')
.then(res => {
if (res.data) {
uni.requestPayment({
nonceStr: res.data.nonceStr,
@ -169,15 +204,14 @@
'hRZoiEES2BWtKb6Xgsnn8khLQH9un5j_11qu0bwlhfE',
//
'YyTCUIYBnrj9CyKks8cOjNX_Rk8a4yVdswMP-zXVbhc'
]
];
uni.requestSubscribeMessage({
tmplIds: templateIds,
complete (res) {
that.list = [];
that.finished = false;
that.getList()
complete: () => {
this.resetList();
this.getList();
}
})
});
}
});
}
@ -185,28 +219,22 @@
},
//
confirmpost(id, index) {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认收货?',
success: successRes => {
if (successRes.confirm) {
that.Post({
order_id: id
},
'/api/order/confirmPost'
).then(res => {
if (res.code == 1) {
list[index].order_child.map(item => {
this.Post({ order_id: id }, '/api/order/confirmPost')
.then(res => {
if (res.code === 1) {
this.list[index].order_child.forEach(item => {
item.status = 'WAIT_COMMENT';
});
list[index].status = 'WAIT_COMMENT';
list[index].postFlag = false;
that.list = list;
uni.showToast({
title: '操作成功'
});
that.$forceUpdate();
this.list[index].status = 'WAIT_COMMENT';
this.list[index].postFlag = false;
this.list = [...this.list];
uni.showToast({ title: '操作成功' });
this.$forceUpdate();
}
});
}
@ -215,27 +243,17 @@
},
//
closeOrder(id, index) {
console.log(id);
console.log(index);
let that = this;
uni.showModal({
title: '提示',
content: '是否关闭订单?',
success: successRes => {
if (successRes.confirm) {
that.Post({
order_id: id
},
'/api/order/closeOrder'
).then(res => {
if (res.code == 1) {
uni.showToast({
title: '关闭成功',
icon: 'success'
});
that.list = [];
that.finished = false;
that.getList();
this.Post({ order_id: id }, '/api/order/close')
.then(res => {
if (res.code === 1) {
uni.showToast({ title: '关闭成功', icon: 'success' });
this.resetList();
this.getList();
}
});
}
@ -244,25 +262,17 @@
},
//
deletOrder(id) {
let that = this;
uni.showModal({
title: '提示',
content: '是否删除订单?',
success: successRes => {
if (successRes.confirm) {
that.Post({
order_id: id
},
'/api/order/delOrder'
).then(res => {
if (res.code == 1) {
uni.showToast({
title: '删除成功',
icon: 'success'
});
that.list = [];
that.finished = false;
that.getList();
this.Post({ order_id: id }, '/api/order/delOrder')
.then(res => {
if (res.code === 1) {
uni.showToast({ title: '删除成功', icon: 'success' });
this.resetList();
this.getList();
}
});
}
@ -271,82 +281,86 @@
},
// 退
refund(id, index) {
console.log(id);
let that = this;
uni.showModal({
title: '提示',
content: '是否申请退款?',
success: successRes => {
if (successRes.confirm) {
that.Post({
order_id: id
},
'/api/order/applyRefund'
).then(res => {
if (res.code == 1) {
uni.showToast({
title: '申请成功',
icon: 'success'
});
that.onReload();
this.Post({ order_id: id }, '/api/order/refund')
.then(res => {
if (res.code === 1) {
uni.showToast({ title: '申请成功', icon: 'success' });
this.onReload();
}
});
}
}
});
},
search(e) {
this.list = [];
//
search() {
this.resetList();
this.getList();
// if (e.keyCode == 13) {
// //
// this.keywords = e.target.value;
// }
},
//
changeDate() {
if (this.dateIndex === 0) {
this.range = this.getLastNDays(7);
} else if (this.dateIndex === 1) {
this.range = this.getLastNDays(30);
}
this.$refs.popup.close();
this.resetList();
this.getList();
},
//
getList() {
let data = {
state: this.typeList[this.typeIndex].id == 'ALL' ? '' : this.typeList[this.typeIndex].true_id ||
this.typeList[this.typeIndex].id,
const data = {
state: this.typeList[this.typeIndex].id === 'ALL' ? '' : this.typeList[this.typeIndex].id,
offset: this.list.length,
limit: 5,
keywords: this.keywords,
type: this.typeList[this.typeIndex].name == '待使用' ? 1 : (this.typeList[this.typeIndex].name ==
'待发货' ? 2 : '')
start_date: this.range[0] || '',
end_date: this.range[1] || ''
};
this.Post(data, '/api/order/list').then(res => {
this.list = [...this.list, ...res.data.list]
this.Post(data, '/api/order/list')
.then(res => {
this.list = [...this.list, ...res.data.list];
if (res.data.length < 5) {
this.finished = true;
}
});
},
//
UpdateOrder(id) {
this.ajaxFlag = false;
let list = this.list;
this.Post({
order_id: id
},
'/api/order/orderDetail'
).then(res => {
this.Post({ order_id: id }, '/api/order/orderDetail')
.then(res => {
this.ajaxFlag = true;
list.map(item => {
if (item.order_id == id) {
item = res.data;
const newList = this.list.map(item => {
if (item.order_id === id) {
return res.data;
}
return item;
});
this.list = list;
this.list = newList;
});
},
//
choseType(item) {
uni.navigateTo({
url: '/subPackages/order/detail?id=' + item.order_id
});
uni.navigateTo({ url: `/subPackages/order/orderDetail?id=${item.order_id}` });
},
//
resetList() {
this.list = [];
this.finished = false;
}
}
};
</script>
<style scoped lang="scss">
//
view {
box-sizing: border-box;
}
@ -558,6 +572,7 @@
font-weight: bold;
color: rgba(195, 40, 46, 1);
}
.trade-item-info text::before {
font-size: 26rpx;
content: '¥';
@ -629,7 +644,7 @@
}
.search-box {
width: 697rpx;
width: 600rpx;
height: 67rpx;
background: #f2f2f2;
border-radius: 33rpx;
@ -637,8 +652,6 @@
align-items: center;
justify-content: space-between;
padding: 0 8rpx 0 28rpx;
margin: 0 auto;
margin-bottom: 20rpx;
.left {
display: flex;
@ -675,4 +688,81 @@
background: #fff;
padding-top: 20rpx;
}
.select-btn {
font-weight: bold;
font-size: 20rpx;
color: #6A8A27;
image {
width: 33.33rpx;
height: 33.33rpx;
display: block;
}
}
.popup-box {
height: 70vh;
border-radius: 10rpx 10rpx 0 0;
background: #F7F7F7;
padding: 0 25rpx;
.popup-top {
height: 110rpx;
font-weight: 400;
font-size: 31rpx;
color: #000000;
&>view:nth-child(2) {
font-weight: bold;
font-size: 35rpx;
}
&>view:last-child {
color: #6A8A2D;
}
}
.popup-content {
height: calc(70vh - 110rpx);
padding: 0 28rpx;
background-color: #fff;
.content-top {
height: 94rpx;
border-bottom: 1px solid #CCCCCC;
font-weight: bold;
font-size: 32rpx;
color: #000000;
display: flex;
align-items: center;
}
.content-bottom {
padding-top: 40rpx;
.content-item {
margin-bottom: 27rpx;
width: 307rpx;
line-height: 67rpx;
text-align: center;
background: #FFFFFF;
border-radius: 7rpx;
border: 1px solid #CCCCCC;
font-weight: 500;
font-size: 31rpx;
color: #000000;
}
.content-active {
border: 1px solid #6A8A27;
color: #6A8A27;
}
::v-deep .uni-date {
border: 1px solid #CCCCCC;
}
}
}
}
</style>
Loading…
Cancel
Save