| | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | type: 'customer', |
| | | query: { |
| | | status: '', |
| | | }, |
| | | status: [ |
| | | {name: '全部', value: ''}, |
| | | {name: '待付款', value: 'PENDING'}, |
| | | {name: '待发货', value: 'SEND'}, |
| | | {name: '待收货', value: 'RECEIVE'}, |
| | | {name: '待评价', value: 'EVALUATE'}, |
| | | {name: '已完成', value: 'COMPLETED'}, |
| | | {name: '已退款', value: 'REFUND'}, |
| | | ] |
| | | }; |
| | | }, |
| | | onLoad(options) { |
| | | this.query.status = options.status || '' |
| | | this.listApi = `/api/customer/order/list` |
| | | this.getList() |
| | | }, |
| | | onReachBottom() { |
| | | this.page.current += 1 |
| | | this.getMore() |
| | | }, |
| | | async onPullDownRefresh() { |
| | | this.page.current = 1 |
| | | await this.getList() |
| | | uni.stopPullDownRefresh() |
| | | }, |
| | | methods: { |
| | | toDetail(item) { |
| | | // 订单详情页面 |
| | | console.log(' toDetail item',item) |
| | | uni.navigateTo({ |
| | | url: '/pages/order/order-detail?id=' + item.id |
| | | }) |
| | | }, |
| | | }, |
| | | } |
| | | </script> |
| | | <template> |
| | | <view> |
| | | <!-- 团购、粗去玩、深夜食堂、挖宝商品 --> |
| | | <view style="position: fixed;left: 0;right: 0;top: 0;background-color: #fff;height: 84rpx;z-index: 999;"> |
| | | <top-tabs :tabs="tabs" :flg.sync="tabIndex" @change="changeTab"></top-tabs> |
| | | <view class="order-container"> |
| | | <view class="order-top"> |
| | | <view class="title">订单信息</view> |
| | | <view class="flex"> |
| | | <image class="image img100" |
| | | src="https://hmy-flower.oss-cn-shanghai.aliyuncs.com/67/67acf980f310460a97d305c6ffc7e811位图@2x (1).png"></image> |
| | | <view>消费订单:¥<span class="m-r-10">{{ '0' }}</span> 总消费:¥<span>{{ '0' }}</span></view> |
| | | </view> |
| | | </view> |
| | | <view class="status-list m-t-12 flex flex-wrap-normal"> |
| | | <view v-for="each of status" :key="each.value" |
| | | @click.stop="(e)=>{ |
| | | query.status = each.value || ''; |
| | | refreshList(); |
| | | }" |
| | | class="status-each" :class="[query.status===each.value?'cur':'']"> |
| | | {{ each.name }} |
| | | </view> |
| | | </view> |
| | | <no-data v-if="!list||list.length===0" style="width: 100%;" class="m-t-12"></no-data> |
| | | <view v-for="(item,index) in list" :key="index" class="m-t-12"> |
| | | <view @click.stop="toDetail(item)" class="order-item list-item"> |
| | | <view class="title flex"> |
| | | <view> |
| | | 订单:{{ item.orderNo }} |
| | | </view> |
| | | <view class="status t-red m-l-a m-r-0">¥{{ item.paymentAmount || item.totalAmount || '0'}}</view> |
| | | </view> |
| | | <view class="desc flex" v-if="!query.status"> |
| | | <view class="label"> |
| | | 订单状态: |
| | | </view> |
| | | <view class="value">{{ item.statusBackendStr }}</view> |
| | | </view> |
| | | <view class="desc flex"> |
| | | <view class="label"> |
| | | 收货人: |
| | | </view> |
| | | <view class="value">{{ item.customer }}</view> |
| | | </view> |
| | | <view class="desc flex"> |
| | | <view class="label"> |
| | | 收货人手机号码: |
| | | </view> |
| | | <view class="value">{{ item.customerTel }}</view> |
| | | </view> |
| | | <view class="desc flex"> |
| | | <view class="label"> |
| | | 收货地址: |
| | | </view> |
| | | <view class="value">{{ item.customerAddress }}</view> |
| | | </view> |
| | | <view class="desc flex"> |
| | | <view class="label"> |
| | | 支付时间: |
| | | </view> |
| | | <view class="value">{{ item.paymentTime }}</view> |
| | | </view> |
| | | </view> |
| | | |
| | | </view> |
| | | <view style="height: 100rpx;"></view> |
| | | <!-- 根据tab不同显示不同信息 --> |
| | | </view> |
| | | |
| | | <!-- 根据不同加载不同的继续的底部 --> |
| | | <view style="min-height: calc(100vh - 200rpx);"> |
| | | <no-data v-if="!list||list.length==0" style="width: 100%;"></no-data> |
| | | <view v-if="type=='shop'" class="order-container"> |
| | | <card-list-item source="order" :type="type" :dto="item" v-for="(item,index) in list" @refresh="refresh" |
| | | :key="index"></card-list-item> |
| | | </view> |
| | | <view v-if="type=='travel'" class="order-container"> |
| | | <card-list-item source="order" :type="type" :dto="item" v-for="(item,index) in list" @refresh="refresh" |
| | | :key="index"></card-list-item> |
| | | </view> |
| | | <view v-if="type=='canteen'" class="order-container"> |
| | | <!-- 时间,状态 --> |
| | | <view class="order-item good-item" v-for="(item,index) in list" :key="index"> |
| | | <view class="flex "> |
| | | <view class="time">下单: {{item.createdDate}}</view> |
| | | <view class="status">{{item.statusStr}}</view> |
| | | </view> |
| | | |
| | | <view class="flex"> |
| | | <!-- overfi --> |
| | | <scroll-view class="flex scroll-view" :scroll-x="true" style="max-width: 500rpx;" |
| | | v-if="item.items"> |
| | | <view v-for="each of item.items" class="item-each"> |
| | | <image :src="each.cover" class="cover"></image> |
| | | <!-- 文字缩写 --> |
| | | <view class="cover-name word-e">{{each.name}}</view> |
| | | </view> |
| | | </scroll-view> |
| | | <view style="min-width: 100rpx;margin-left: auto;"> |
| | | <view class="price"><span class="dot">¥</span>{{item.totalAmount||'0.0'}}</view> |
| | | <view class="num-tip">共{{getItemsNum(item.items)||0}}件</view> |
| | | </view> |
| | | </view> |
| | | <!-- <view class="address"> |
| | | {{item.customerAddress}} |
| | | </view> --> |
| | | <view class="infos"> |
| | | <view class="flex"> |
| | | <view class="info-user-name flex flex1"> |
| | | <uni-icons type="person-filled" class="icon"></uni-icons> |
| | | {{item.customer}} |
| | | </view> |
| | | <view class="info-user-tel flex flex1"> |
| | | <uni-icons type="phone-filled" class="icon"></uni-icons> |
| | | {{item.customerTel}} |
| | | </view> |
| | | </view> |
| | | <view class="info-user-address flex"> |
| | | <uni-icons type="location-filled" class="icon"></uni-icons> |
| | | {{item.customerAddress}} |
| | | </view> |
| | | |
| | | </view> |
| | | <view class="buttons"> |
| | | <view class="button-wuliu button" v-if="item.status=='PENDING'||item.status==='PREPAYMENT'" |
| | | @click.stop="toPay(item)">支付订单</view> |
| | | <view class="button-wuliu button" v-if="item.status=='PENDING'||item.status==='PREPAYMENT'" |
| | | @click.stop="cancelPay(item)">取消订单</view> |
| | | |
| | | <view class="button-shouhuo button" @click.stop="toOrderDetail(item)">订单详情</view> |
| | | </view> |
| | | </view> |
| | | <!-- 货物单 --> |
| | | <!-- 地址 --> |
| | | </view> |
| | | <view v-if="type=='good'" class="order-container"> |
| | | <view class="order-item good-item" v-for="(item,index) in list" :key="index"> |
| | | <view class="flex "> |
| | | <view class="time">下单: {{item.createdDate}}</view> |
| | | <view class="status">{{item.statusStr}}</view> |
| | | </view> |
| | | <view class="flex"> |
| | | <image class="cover" :src="item.items[0].cover"></image> |
| | | <view> |
| | | <view class="name">{{item.items[0].name}}</view> |
| | | <!-- <view>介绍尺码</view> --> |
| | | <view class="price"><span class="dot">¥</span>{{item.totalAmount||'0.0'}}</view> |
| | | </view> |
| | | </view> |
| | | <view class="infos"> |
| | | <view class="info-user-name flex"> |
| | | <uni-icons type="person-filled" class="icon"></uni-icons> |
| | | {{item.customer}} |
| | | </view> |
| | | <view class="info-user-tel flex"> |
| | | <uni-icons type="phone-filled" class="icon"></uni-icons> |
| | | {{item.customerTel}} |
| | | </view> |
| | | <view class="info-user-address flex"> |
| | | <uni-icons type="location-filled" class="icon"></uni-icons> |
| | | {{item.customerAddress}} |
| | | </view> |
| | | |
| | | </view> |
| | | <view class="buttons"> |
| | | <view class="button-wuliu button" v-if="item.status=='PENDING'||item.status==='PREPAYMENT'" |
| | | @click.stop="toPay(item)">支付订单</view> |
| | | <view class="button-wuliu button" v-if="item.status=='PENDING'||item.status==='PREPAYMENT'" |
| | | @click.stop="cancelPay(item)">取消订单</view> |
| | | |
| | | <!-- <view class="button-shouhuo button" v-if="item.status!=='PENDING'&&item.status!=='PREPAYMENT'||true">查看物流</view> --> |
| | | <view class="button-shouhuo button" @click.stop="toOrderDetail(item)">订单详情</view> |
| | | |
| | | <!-- <view class="button-shouhuo button" v-if="item.status!=='PENDING'&&item.status!=='PREPAYMENT'">确认收货</view> --> |
| | | </view> |
| | | |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <footer-msg :more="page.total>0&&page.total>page.current*page.size"></footer-msg> |
| | | |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | type: '', |
| | | tabIndex: 1, |
| | | query: { |
| | | |
| | | }, |
| | | tabs: [{ |
| | | name: '团购', |
| | | id: 'shop', |
| | | api: '/api/buy/customer/group/list/mine' |
| | | }, |
| | | { |
| | | name: '粗去玩', |
| | | id: 'travel', |
| | | api: '/api/trip/customer/list/mine' |
| | | }, |
| | | { |
| | | name: '每日维C', |
| | | id: 'canteen', |
| | | api: '/api/canteen/customer/order/list' |
| | | |
| | | }, |
| | | { |
| | | name: '挖宝商品', |
| | | id: 'good', |
| | | api: '/api/wabao/customer/order/list' |
| | | |
| | | }, |
| | | ], |
| | | } |
| | | }, |
| | | onLoad(options) { |
| | | this.type = options.type || '' |
| | | var index = -1 |
| | | for (var item of this.tabs) { |
| | | index++ |
| | | if (item.id == this.type) { |
| | | this.tabIndex = index |
| | | this.listApi = item.api |
| | | break |
| | | } |
| | | } |
| | | this.refresh() |
| | | |
| | | |
| | | }, |
| | | onReachBottom() { |
| | | this.page.current += 1 |
| | | this.getMore() |
| | | }, |
| | | methods: { |
| | | toOrderDetail(row) { |
| | | var url = `/pages/order/bussiness-order/bussincess-order-detail?source=user&type=${this.type}` |
| | | if (this.type == 'travel') { |
| | | url += `&id=${row.id}&userId=${this.currentInfo.id}` |
| | | } else { |
| | | url += `&id=${row.id}` |
| | | } |
| | | uni.navigateTo({ |
| | | url: url |
| | | }) |
| | | }, |
| | | async cancelPay(item) { |
| | | if (!this.currentInfo.id) { |
| | | await this.$message.confirm('未登录,前往登录?') |
| | | uni.navigateTo({ |
| | | url: '/pages/user/user' |
| | | }) |
| | | return |
| | | } |
| | | await this.$message.confirm('是否确认取消支付?') |
| | | this.$message.showLoading() |
| | | const orderInfo = await this.$http.request('post', '/api/order/cancel/' + (item.orderId || |
| | | item.id || ''), { |
| | | |
| | | }) |
| | | this.$message.hideLoading() |
| | | if (code == 0) { |
| | | this.$message.showToast('取消成功') |
| | | this.dto.status = 'COMPLETED' |
| | | this.dto.statusStr = '已取消' |
| | | setTimeout(() => { |
| | | that.refresh() |
| | | }, 500) |
| | | } |
| | | |
| | | }, |
| | | async toPay(item) { |
| | | if (!this.currentInfo.id) { |
| | | this.$message.showToast('请先登陆') |
| | | return |
| | | } |
| | | if (item.status === 'PENDING' || item.status === 'PREPAYMENT') { |
| | | if (this.type == 'canteen') { |
| | | const orderInfo = await this.$http.request('get', '/api/canteen/customer/payment/' + item |
| | | .id, {}) |
| | | //支付准备 |
| | | var info = orderInfo.data |
| | | let that = this |
| | | wx.requestPayment({ |
| | | ...info, |
| | | success(res) { |
| | | console.log('pay success', res) |
| | | that.$message.showToast('支付成功') |
| | | setTimeout(() => { |
| | | that.refresh() |
| | | }, 500) |
| | | }, |
| | | fail(err) { |
| | | console.error('pay fail', err) |
| | | that.$message.showToast('支付失败') |
| | | } |
| | | }) |
| | | |
| | | } else { |
| | | // this.$message.showToast('等待接口,请联系开发者') |
| | | // return |
| | | this.$message.showLoading() |
| | | const orderInfo = await this.$http.request('post', '/api/order/pay/again/' + (item.orderId || |
| | | item.id || ''), { |
| | | |
| | | }) |
| | | var info = orderInfo.data || {} |
| | | this.$message.hideLoading() |
| | | if (code == 0) { |
| | | let that = this |
| | | wx.requestPayment({ |
| | | ...info, |
| | | success(res) { |
| | | console.log('pay success', res) |
| | | that.$message.showToast('支付成功') |
| | | item.status = 'PAYMENT' |
| | | item.statusStr = '已支付' |
| | | setTimeout(() => { |
| | | that.refresh() |
| | | }, 500) |
| | | }, |
| | | fail(err) { |
| | | console.error('pay fail', err) |
| | | that.$message.showToast('支付失败') |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | |
| | | } else { |
| | | this.$message.showToast('请不要重复支付') |
| | | return |
| | | } |
| | | }, |
| | | getItemsNum(arr) { |
| | | var a = 0 |
| | | if (arr) { |
| | | for (var item of arr) { |
| | | a += item.num || 0 |
| | | } |
| | | } |
| | | |
| | | return a |
| | | }, |
| | | refresh() { |
| | | //获取 |
| | | console.log('refresh') |
| | | this.page.current = 1 |
| | | this.getList() |
| | | }, |
| | | changeTab(e) { |
| | | this.type = this.tabs[e].id |
| | | console.log('this.type', this.type, this.tabs, e) |
| | | |
| | | this.list = [] |
| | | for (var item of this.tabs) { |
| | | if (item.id == this.type) { |
| | | this.listApi = item.api |
| | | break |
| | | } |
| | | } |
| | | this.refresh() |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @import './order.scss' |
| | | </style> |
| | | .order-container { |
| | | padding: 24rpx 30rpx; |
| | | .order-item { |
| | | margin-bottom: 20rpx; |
| | | padding: 28rpx; |
| | | background-color: #fff; |
| | | border-radius: 8rpx; |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 28rpx; |
| | | color: #000000; |
| | | line-height: 40rpx; |
| | | .status { |
| | | font-weight: 400; |
| | | font-size: 28rpx; |
| | | color: #20613D; |
| | | line-height: 40rpx; |
| | | } |
| | | } |
| | | .desc{ |
| | | font-weight: 400; |
| | | font-size: 24rpx; |
| | | color: #666666; |
| | | line-height: 34rpx; |
| | | } |
| | | |
| | | |
| | | .line { |
| | | height: 2rpx solid #EEEEEE; |
| | | margin-top: 16rpx; |
| | | margin-bottom: 16rpx; |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | .status-list { |
| | | overflow-x: scroll; |
| | | |
| | | .status-each { |
| | | font-weight: 400; |
| | | font-size: 28rpx; |
| | | color: #666666; |
| | | line-height: 40rpx; |
| | | margin: 0 auto; |
| | | //min-width: ; |
| | | // padding-left: 10rpx; |
| | | // padding-right: 10rpx; |
| | | width: fit-content; |
| | | min-width: 120rpx; |
| | | text-align: center; |
| | | } |
| | | |
| | | .status-each.cur { |
| | | font-weight: 600; |
| | | font-size: 32rpx; |
| | | color: #20613D; |
| | | // line-height: 44rpx; |
| | | } |
| | | |
| | | .status-each:first-child { |
| | | margin-left: 0 |
| | | } |
| | | |
| | | .status-each:last-child { |
| | | margin-right: 0; |
| | | } |
| | | } |
| | | |
| | | .order-top { |
| | | position: relative; |
| | | min-height: 182rpx; |
| | | background: #E1F0E7; |
| | | border-radius: 8rpx; |
| | | padding: 45rpx 35rpx; |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 30rpx; |
| | | color: #000000; |
| | | line-height: 42rpx; |
| | | } |
| | | |
| | | .desc { |
| | | font-weight: 400; |
| | | font-size: 24rpx; |
| | | color: #666666; |
| | | line-height: 34rpx; |
| | | } |
| | | |
| | | .image { |
| | | position: absolute; |
| | | right: 0rpx; |
| | | width: 288rpx; |
| | | height: 148rpx; |
| | | bottom: 0rpx; |
| | | } |
| | | } |
| | | } |
| | | </style> |