jyy-smart-canteen-h5/pages/work/index.vue

793 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<page-meta :page-font-size="fontValue+'px'" :root-font-size="fontValue+'px'"></page-meta>
<view class="content">
<view class="top-wrapper">
<view class="top-cont">
<view class="top-title">订单</view>
<u-input
v-model="searchValue"
class="top-ipt"
placeholder="请输入食堂、档口、菜品/商品名"
shape="circle"
suffixIcon="search"
suffixIconStyle="color: #909399; font-size: 36rpx;"
placeholderStyle="font-weight: 400;font-size: 20rpx;color: rgba(15,39,75,0.4);"
@blur="handleSearch"
></u-input>
<view class="top-filter" @click="openPopup">
<span style="font-size: 28rpx; color: #0f274b">筛选</span>
<u-icon name="../../static/images/pull.png" />
</view>
</view>
<view style="padding: 0 16px">
<Tabs :tabList="tabList" @changeTab="changeTab" />
</view>
</view>
<!-- <view style="height: 56px"></view> -->
<scroll-view style="width: 100%;height: 76vh;" @scrolltolower="onScrollTolower" scroll-y="true">
<view class="evaluateCenter" v-if="this.tabIndex==1">
<view class="evaluateCenterLeft">
<u-image src="../../static/images/user.png" width="30px" height="30px" />
<text>评价中心</text>
</view>
<view class="evaluateCenterRight" @click="goEvaluateCenter">
去看看
</view>
</view>
<view class="order-list" v-for="(item, index) in tableList" :key="index">
<view class="flex justify-between">
<!-- <view class="order-source">订单来源双屏消费机</view> -->
<view class="order-source" style="font-size: 28rpx;font-weight: bold;">订单类型{{ item.orderTypeStr }}</view>
<view style="color: rgba(15, 39, 75, 0.8)">就餐日期{{ item.orderDate }}</view>
</view>
<view class="flex justify-between">
<view style="display: flex;width: 70%;align-items: center;">
<view style="color: #0f274b;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;font-size: 28rpx;max-width: 75%;">{{ item.canteenName }}/{{item.stallName}}</view>
<!-- <span style="color: #0f274b">{{ item.canteenName }}</span> -->
<view class="intervalName" v-if="item.mealtimeName">{{ item.mealtimeName }}</view>
</view>
<view style="color: rgba(15, 39, 75, 0.8);font-size: 28rpx;" v-if="item.orderState==1">已下单</view>
<view style="color: rgba(15, 39, 75, 0.8);font-size: 28rpx;" v-if="item.orderState==2">已完成</view>
<view style="color: red;font-size: 28rpx;" v-if="item.orderState==3&&item.payState==3">已退单</view>
<view style="color: rgba(15, 39, 75, 0.8);font-size: 28rpx;" v-if="item.orderState==3&&item.payState==4">已取消</view>
<view style="color: red;font-size: 28rpx;" v-if="item.orderState==4&&item.payState==1">未支付</view>
<!-- <view style="color: rgba(15, 39, 75, 0.8);font-size: 28rpx;" v-if="item.orderState==4&&item.payState==3">待下单</view> -->
<view style="color: rgba(15, 39, 75, 0.8);font-size: 28rpx;" v-if="item.orderState==4&&item.payState==4">支付失败</view>
<view style="color: rgba(15, 39, 75, 0.8);font-size: 28rpx;" v-if="item.orderState==5">部分退单</view>
</view>
<view class="img-cont" @click="goDetail(item)">
<view style="width: 80%;display: flex;align-items: center;flex-wrap: wrap;">
<view class="img" v-for="(goods, gindex) in item.orderDetailList" :key="gindex" v-if="gindex<3">
<u-image :src="goods.goodsImgUrl" width="80px" height="80px" />
<view style="width: 100%;white-space: nowrap;text-align: center;overflow: hidden;text-overflow: ellipsis;">{{ goods.goodsName }}</view>
</view>
</view>
<view class="price">
<view>
<span>¥</span>
<span style="font-size: 18px">{{ (item.realAmount/100).toFixed(2) }}</span>
</view>
<view style="color: rgba(15, 39, 75, 0.6)">共{{ item.orderDetailList.length }}件</view>
</view>
</view>
<view class="btn-cont">
<view v-if="item.orderState==2&&item.commentState==2">
<u-button size="small" style="background: #ff6816;color: #FFF;font-size: 24rpx;" @click="goEvaluate(item)">评价</u-button>
</view>
<view style="display: flex;" v-if="(item.orderState==4&&item.payState==4) || (item.orderState==4&&item.payState==1)">
<u-button size="small" shape="circle" :plain="true" style="font-size: 24rpx;margin-right: 20rpx;" @click="refundOrder(item)">取消订单</u-button>
<u-button size="small" shape="circle" type="primary" style="font-size: 24rpx;" @click="goPay(item)">立即支付</u-button>
</view>
</view>
</view>
<view style="margin: 20px 0" v-if="tableList.length > 0">
<u-loadmore :status="status" nomoreText="没有更多数据了" />
</view>
<view v-else class="flex justify-center align-center" style="height: 50vh">
<u-empty icon="../../static/images/not_order.png" text="暂无相关订单" textColor="#000" />
</view>
</scroll-view>
<!-- 筛选部分-->
<u-popup :show="localShow" @close="closePopup" mode="bottom" round="20">
<view class="filter-popup">
<!-- 订单日期 -->
<view class="section">
<view class="section-title">订单日期</view>
<view class="date-quick-select">
<view
v-for="(item, index) in dateOptions"
:key="index"
class="date-option"
:class="{ active: currentDateOption == index }"
@click="selectDateOption(index)"
>
{{ item.label }}
</view>
</view>
<view class="date-range">
<view class="date-input" @click="showStartCalendar = true">
<text class="date-placeholder" v-if="!startDate">开始时间</text>
<text v-else class="selected-date">{{ startDate }}</text>
</view>
<text class="date-separator">-</text>
<view class="date-input" @click="showEndCalendar = true">
<text class="date-placeholder" v-if="!endDate">结束时间</text>
<text v-else class="selected-date">{{ endDate }}</text>
</view>
</view>
</view>
<!-- 订单类型 -->
<view class="section">
<view class="section-title">订单类型</view>
<u-grid :border="false" col="3">
<u-grid-item v-for="(item, index) in orderTypes" :key="index" @click="selectOrderType(item.id,index)">
<view class="order-type-item" :class="{ active: selectedOrderTypes.includes(item.id) }">
{{ item.name }}
</view>
</u-grid-item>
</u-grid>
</view>
<!-- 底部按钮 -->
<view class="bottom-buttons">
<u-button
text="清空"
shape="circle"
:customStyle="{
border: '2rpx solid #DDDDDD',
color: '#666666',
background: '#ffffff',
marginRight: '24px'
}"
@click="clearAll"
></u-button>
<u-button
type="warning"
text="确定"
shape="circle"
:customStyle="{
background: '#ff6633'
}"
@click="confirm"
></u-button>
</view>
</view>
<!-- 日期选择器 -->
<u-datetime-picker
v-model="dateValue"
:show="showStartCalendar"
@cancel="showStartCalendar = false"
@confirm="selectStartDate"
mode="date"
></u-datetime-picker>
<u-datetime-picker
v-model="dateValue2"
:show="showEndCalendar"
@cancel="showEndCalendar = false"
@confirm="selectEndDate"
mode="date"
></u-datetime-picker>
</u-popup>
</view>
</template>
<script>
import Tabs from '@/pages/components/Tabs.vue'
import { getDate } from '../../uni_modules/uni-datetime-picker/components/uni-datetime-picker/util'
import { getOrderInfoListAPI,getOrderSourceTypeListAPI,payOrderApi,refundOrderApi } from '../../api/order/index'
export default {
components: { Tabs },
props: {
show: {
type: Boolean,
default: false
}
},
data() {
return {
fontValue:uni.getStorageSync('fontSize') || 8,
tabIndex: 0,
pageNum: 1,
pageSize: 10,
total: 0,
searchValue: '',
orderState:'',
orderStateList:[],
commentState:'',
payState:'',
orderRefundState:'',
status: 'loadmore',
tabList: ['全部订单', '待评价', '退单'],
dateValue:new Date(),
dateValue2:new Date(),
sourceTypeList:[],
tableList: [
// {
// sourceType: 'hygyy双屏消费机', // 订单来源
// canteenName: '宏源工业园/本周菜谱', // 订单来源
// intervalName: '午餐', // 餐次
// ordState: 11, // 订单状态 1 已下单 9 已取消 10 已退款 11 已完成
// orderTime: '2024-08-12', // 下单时间
// realAmount: 30.2, // 实付金额
// detailList: [
// {
// goodsName: '苹果', // 商品名称
// goodsImgUrl: 'https://img.yzcdn.cn/vant/apple-1.jpg' // 商品图片
// },
// {
// goodsName: '苹果', // 商品名称
// goodsImgUrl: 'https://img.yzcdn.cn/vant/apple-2.jpg' // 商品图片
// },
// {
// goodsName: '苹果', // 商品名称
// goodsImgUrl: 'https://img.yzcdn.cn/vant/apple-2.jpg' // 商品图片
// }
// ] // 订单详情
// },
// {
// sourceType: 'hygyy双屏消费机', // 订单来源
// canteenName: '宏源工业园/本周菜谱', // 订单来源
// intervalName: '午餐', // 餐次
// ordState: 10, // 订单状态 1 已下单 9 已取消 10 已退款 11 已完成
// orderTime: '2024-08-12', // 下单时间
// realAmount: 30.2, // 实付金额
// detailList: [
// {
// goodsName: '苹果', // 商品名称
// goodsImgUrl: 'https://img.yzcdn.cn/vant/apple-1.jpg' // 商品图片
// },
// {
// goodsName: '苹果', // 商品名称
// goodsImgUrl: 'https://img.yzcdn.cn/vant/apple-2.jpg' // 商品图片
// },
// {
// goodsName: '苹果', // 商品名称
// goodsImgUrl: 'https://img.yzcdn.cn/vant/apple-2.jpg' // 商品图片
// }
// ] // 订单详情
// }
],
localShow: this.show,
monthNum: 12,
minData: getDate(new Date()),
dateOptions: [
{ label: '近1个月', value: 1 },
{ label: '近3个月', value: 3 },
{ label: '近6个月', value: 6 }
],
currentDateOption: -1,
startDate: '',
endDate: '',
showStartCalendar: false,
showEndCalendar: false,
orderTypes: [{id:"2",name:'预订餐'},{id:"4",name:'商城'},{id:"11",name:'线下消费'}],
orderTypeList:[],
typeList:[
{id:"1",name:'当餐点餐'},{id:"2",name:'预订餐'},{id:"3",name:'自定义报餐'},{id:"4",name:'商城'},{id:"5",name:'预订商城'},{id:"6",name:'包间'},
{id:"7",name:'餐桌'},{id:"8",name:'班车'},{id:"9",name:'3天报餐'},{id:"10",name:'7天报餐'},{id:"11",name:'线下消费'},{id:"12",name:'自助餐'},
{id:"13",name:'到店扫码'},{id:"14",name:'到店扫码'},{id:"15",name:'美团外卖'},{id:"16",name:'美团到店'},{id:"21",name:'补扣'},{id:"22",name:'外部订单'},{id:"99",name:'其他'}
],
selectedOrderTypes: [],
}
},
watch: {
show(newVal) {
this.localShow = newVal // 监听 prop 变化并更新本地数据属性
}
},
onLoad() {
// this.getSourceTypeList()
},
onShow() {
this.getList()
},
methods: {
async getSourceTypeList() {
try {
const res = await getOrderSourceTypeListAPI({})
console.log('?? ~ getList ~ res:', res)
this.sourceTypeList=res
} catch (error) {
console.log(error)
}
},
// 翻页
onScrollTolower(){
console.log(this.tableList.length)
if(this.total>this.tableList.length){
this.pageNum++
this.getList()
}
},
//获取订单列表
async getList() {
console.log('获取列表',)
let params = {
userId: uni.getStorageSync('userId'),
pageNum: this.pageNum,
pageSize: this.pageSize,
searchValue: this.searchValue,
commentState:this.commentState,
orderState:this.orderState,
orderStateList:this.orderStateList,
payState:this.payState,
orderRefundState:this.orderRefundState,
orderTypeList:this.orderTypeList
}
if(this.startDate&&this.endDate){
params.startDateTime = this.startDate+" 00:00:00"
params.endDateTime = this.endDate+" 23:59:59"
}else{
params.startDateTime = getDate(new Date())+" 00:00:00"
params.endDateTime = getDate(new Date())+" 23:59:59"
}
try {
const res = await getOrderInfoListAPI(params)
console.log('?? ~ getList ~ res:', res)
this.total = res.total;
res.rows.forEach(item=>{
let hasIndex=this.typeList.findIndex(v=>v.id==item.orderType)
item.orderTypeStr = this.typeList[hasIndex].name
})
if(this.pageNum==1){
this.tableList = res.rows
}else{
this.tableList.push(...res.rows)
}
this.status = this.total == this.tableList.length ? 'nomore' : 'loadmore'
} catch (error) {
console.log(error)
}
},
//翻页
onReachBottom() {
console.log('?? ~ onReachBottom ~ ')
// if (this.total < 10 || this.total == this.tableList.length) {
// this.status = 'nomore'
// return
// }
// this.status = 'loading'
// setTimeout(() => {
// this.pageSize += 10
// this.getList()
// if (this.tableList.length != this.total) this.status = 'loadmore'
// else this.status = 'nomore'
// }, 500)
// console.log('加载..', this.pageSize)
},
//搜索图标-搜索
handleSearch() {
console.log('搜索', this.searchValue)
this.pageNum=1;
this.tableList=[]
this.getList()
},
//全部/待评价/退款
changeTab(index) {
console.log('?? ~ changeTab ~ index:', index)
this.tabIndex = index;
if(index==1){
this.commentState="2"
this.orderState=""
this.orderStateList = [2]
this.payState=""
this.orderRefundState=""
}else if(index==2){
this.commentState="";
this.orderState="3";
this.orderStateList = []
this.payState="3"
this.orderRefundState="2";
}else{
this.commentState=""
this.orderState=""
this.orderStateList = []
this.payState=""
this.orderRefundState=""
}
this.pageNum=1;
this.tableList=[]
this.getList()
},
// 处理订单状态展示
handleOrderState(state) {
switch (state) {
case 1:
return '已下单'
case 2:
return '已完成'
case 3:
return '已退单'
}
},
//筛选
openPopup() {
this.localShow = true
},
//取消筛选
closePopup() {
this.localShow = false
},
// 选择日期区间
selectDateOption(index) {
this.currentDateOption = Number(index)
const months = Number(this.dateOptions[index].value)
const end = new Date()
const start = new Date()
start.setMonth(start.getMonth() - months)
this.startDate = this.formatDate(start)
this.endDate = this.formatDate(end)
},
selectStartDate(e) {
console.log('selectStartDate', e)
const timeFormat = uni.$u.timeFormat
this.startDate = timeFormat(e.value, 'yyyy-mm-dd')
this.currentDateOption = -1 // 清除快速选择的高亮
this.showStartCalendar = false
},
selectEndDate(e) {
const timeFormat = uni.$u.timeFormat
this.endDate = timeFormat(e.value, 'yyyy-mm-dd')
this.currentDateOption = -1
this.showEndCalendar = false
},
// 选择类型
selectOrderType(id,index) {
var hasIndex = this.selectedOrderTypes.findIndex((item) => {
return item==id
})
if (hasIndex > -1) {
this.selectedOrderTypes.splice(hasIndex, 1)
} else {
this.selectedOrderTypes.push(id)
}
},
clearAll() {
this.currentDateOption = -1
this.startDate = ""
this.endDate = ""
this.selectedOrderTypes = []
this.orderTypeList=[]
},
confirm() {
// if (!this.startDate || !this.endDate) {
// uni.$u.toast('请选择完整的日期范围')
// return
// }
// console.log(this.selectedOrderTypes)
if(this.selectedOrderTypes.length>0){
let orderTypes = this.selectedOrderTypes.join(",");
this.orderTypeList = orderTypes.split(",")
}else{
this.orderTypeList=[]
}
this.closePopup()
this.pageNum=1;
this.tableList=[]
this.getList()
},
//退单
refundOrder(item) {
let param = {
"orderId": item.orderId,
}
this.$modal.confirm('确定取消订单吗?').then(() => {
refundOrderApi(param).then((res) => {
if(res.code==200){
uni.showToast({
title: "操作成功",
icon: 'none'
})
setTimeout(()=>{
this.getOrderDetail()
},500)
}else{
uni.showToast({
title: res.msg,
icon: 'none'
})
}
}).catch((res)=>{
uni.showToast({
title: res.msg,
icon: 'none'
})
})
})
},
//立即支付
goPay(item) {
console.log(item)
let param = {
"orderId": item.orderId,
}
this.$modal.confirm('确定立即支付该订单吗?').then(() => {
payOrderApi(param).then((res) => {
console.log(res)
if(res.code==200){
uni.showToast({
title: "操作成功",
icon: 'none'
})
setTimeout(()=>{
this.getList()
},500)
}else{
uni.showToast({
title: res.msg,
icon: 'none'
})
}
})
})
},
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}`
},
// 跳转订单详情
goDetail(item) {
console.log('跳转订单详情', item)
uni.navigateTo({
url: `/pages/work/details?params=${JSON.stringify(item)}`
})
},
//评价按钮
goEvaluate(item) {
console.log('跳转订单详情', item)
uni.navigateTo({
url: `/pages/work/evaluate?params=${JSON.stringify(item)}`
})
},
//跳转评价中心
goEvaluateCenter() {
uni.navigateTo({
url: `/pages/work/evaluateCenter?startDate=${this.startDate}&endDate=${this.endDate}`
})
},
},
// onUnload() {
// uni.switchTab({
// url: '/pages/index'
// })
// },
// onBackPress(e) {
// //e.from === 'backbutton' 说明如果点击的是物理返回键或导航栏的返回键就进行以下操作
// if (e.from === 'backbutton') {
// //返回值为true 时,表示不执行默认的返回(默认返回上一页),执行自定义的返回
// uni.switchTab({
// url: '/pages/index'
// })
// //如果要限制必须写成true
// return true;
// }
// },
}
</script>
<style lang="scss" scoped>
.content {
background: #f9fbff;
// height: 100%;
height: 95vh;
padding-top: 3vh;
.top-wrapper {
// position: fixed;
/* top: 44px; */
// top: 1vh;
width: 100vw;
background: #f9fbff;
z-index: 999;
}
.top-cont {
padding: 0 16px;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
.top-title {
font-weight: 500;
font-size: 40rpx;
color: #0f274b;
}
.top-ipt {
height: 31px;
background: #fff;
margin-left: 26px;
margin-right: 12px;
}
.top-filter {
display: flex;
align-items: center;
}
}
.order-list {
padding: 8px;
background: #fff;
border-radius: 8px;
font-size: 24rpx;
font-weight: 400;
// margin-bottom: 12px;
margin-top: 10px;
.order-source {
margin-bottom: 12px;
font-weight: 500;
color: #0f274b;
}
.intervalName {
margin-left: 10px;
color: #ff6816;
border-radius: 1px 1px 1px 1px;
border: 1px solid #ff6816;
padding: 0 4px;
}
.img-cont {
width: 100%;
margin: 5px;
display: flex;
justify-content: space-between;
width: 100%;
}
.img {
width: 28%;
margin: 10rpx;
display: flex;
flex-direction: column;
align-items: center;
view {
margin-top: 8px;
color: #0f274b;
}
}
.price {
width: 20%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #0f274b;
font-weight: 400;
font-size: 24rpx;
}
.btn-cont {
display: flex;
justify-content: flex-end;
margin-top: 10px;
}
}
}
.evaluateCenter{
height: 30px;width: 100%;display: flex;justify-content: space-between;align-items: center;
.evaluateCenterLeft{
width: 28%;display: flex;justify-content: space-between;align-items: center;margin-left: 20px;font-size: 28rpx;
}
.evaluateCenterRight{
width: 60px;height: 24px;line-height:24px;border: 1px solid #ff6816;color: #ff6816;margin-right: 20px;font-size: 24rpx;text-align: center;border-radius: 8px;
}
}
.filter-popup {
padding: 30rpx;
min-height: 45vh;
max-height: 80vh;
.section {
margin-bottom: 40rpx;
.section-title {
font-size: 32rpx;
color: #333333;
font-weight: 500;
margin-bottom: 20rpx;
}
}
.date-quick-select {
display: flex;
gap: 20rpx;
margin-bottom: 20rpx;
.date-option {
flex: 1;
height: 80rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #f8f8f8;
border-radius: 100rpx;
font-size: 28rpx;
color: #666666;
&.active {
background-color: #fff2ef;
color: #ff6633;
}
}
}
.date-range {
display: flex;
align-items: center;
gap: 20rpx;
.date-input {
flex: 1;
height: 80rpx;
background-color: #f8f8f8;
border-radius: 100rpx;
padding: 0 20rpx;
display: flex;
align-items: center;
font-size: 28rpx;
.date-placeholder {
color: #999999;
}
.selected-date {
color: #333333;
}
}
.date-separator {
color: #999999;
font-size: 28rpx;
}
}
.order-type-item {
width: 200rpx;
height: 80rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #f8f8f8;
border-radius: 25px;
font-size: 28rpx;
color: #666666;
margin: 10rpx auto;
&.active {
background-color: #fff2ef;
color: #ff6633;
}
}
.bottom-buttons {
position: fixed;
left: 0;
right: 0;
bottom: 0;
padding: 28px 16rpx;
background-color: #ffffff;
display: flex;
justify-content: space-between;
box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
}
}
</style>