<template>
|
|
<view class="quick-order-container" @click="handleClick">
|
|
<view class="new-message" v-if="innerHasNewMessage">
|
|
你有新的快捷下单信息
|
|
</view>
|
|
<view class="quick-order">
|
|
<view class="number-order" v-if="innerMessageCount > 0">
|
|
{{ innerMessageCount }}
|
|
</view>
|
|
<image :src="imageUrl" mode=""></image>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'QuickOrderEntry',
|
|
props: {
|
|
// 图标路径
|
|
imageUrl: {
|
|
type: String,
|
|
default: '/static/image/home/7.png'
|
|
},
|
|
// 点击跳转的页面
|
|
targetUrl: {
|
|
type: String,
|
|
default: '/pages_order/order/fastCreateOrder'
|
|
},
|
|
// 是否自动获取快捷下单信息
|
|
autoFetch: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
orderInfo: null,
|
|
innerHasNewMessage: false,
|
|
innerMessageCount: 0,
|
|
isInitialized: false
|
|
}
|
|
},
|
|
methods: {
|
|
// 处理点击事件
|
|
handleClick() {
|
|
// 发出点击事件,便于父组件监听
|
|
this.$emit('click');
|
|
|
|
// 如果有订单信息,提供订单列表
|
|
if (Array.isArray(this.orderInfo) && this.orderInfo.length > 0) {
|
|
this.$emit('order-info', this.orderInfo);
|
|
}
|
|
|
|
if(this.orderInfo.length > 0){
|
|
this.navigateTo('/pages_order/order/firmOrder');
|
|
return
|
|
}
|
|
|
|
// 如果有目标页面,则跳转
|
|
if (this.targetUrl) {
|
|
this.navigateTo(this.targetUrl);
|
|
}
|
|
},
|
|
|
|
// 获取快捷下单的信息
|
|
getQuickOrderInfo() {
|
|
// 调用接口获取快捷下单信息
|
|
this.$api('getOrderInfo', {}, res => {
|
|
if (res.code === 200 && res.result) {
|
|
// 处理返回的订单列表
|
|
const orderList = Array.isArray(res.result) ? res.result : [res.result];
|
|
|
|
if (orderList.length > 0) {
|
|
// 保存订单列表
|
|
this.orderInfo = orderList;
|
|
// 设置消息数量为订单列表长度
|
|
this.innerHasNewMessage = true;
|
|
this.innerMessageCount = orderList.length;
|
|
|
|
// 通知父组件获取到了数据
|
|
this.$emit('order-loaded', this.orderInfo);
|
|
} else {
|
|
this.innerHasNewMessage = false;
|
|
this.innerMessageCount = 0;
|
|
this.orderInfo = [];
|
|
}
|
|
} else {
|
|
this.innerHasNewMessage = false;
|
|
this.innerMessageCount = 0;
|
|
this.orderInfo = [];
|
|
}
|
|
|
|
this.isInitialized = true;
|
|
}, err => {
|
|
console.error('获取快捷下单信息失败', err);
|
|
this.innerHasNewMessage = false;
|
|
this.innerMessageCount = 0;
|
|
this.orderInfo = [];
|
|
this.isInitialized = true;
|
|
});
|
|
},
|
|
|
|
// 导航到指定页面
|
|
navigateTo(url) {
|
|
// 如果有订单列表,则优先使用第一个订单的ID
|
|
if (Array.isArray(this.orderInfo) && this.orderInfo.length > 0 && this.orderInfo[0].id && url.indexOf('?') === -1) {
|
|
url += `?orderId=${this.orderInfo[0].id}`;
|
|
}
|
|
|
|
this.$utils.navigateTo(url);
|
|
},
|
|
|
|
// 刷新快捷下单信息
|
|
refresh() {
|
|
this.getQuickOrderInfo();
|
|
return this; // 链式调用
|
|
},
|
|
|
|
// 清除消息提示
|
|
clearMessage() {
|
|
this.innerHasNewMessage = false;
|
|
this.innerMessageCount = 0;
|
|
return this; // 链式调用
|
|
},
|
|
|
|
// 检查是否有新消息
|
|
hasNewMessage() {
|
|
return this.innerHasNewMessage;
|
|
},
|
|
|
|
// 获取消息数量
|
|
getMessageCount() {
|
|
return this.innerMessageCount;
|
|
},
|
|
|
|
// 获取当前订单信息
|
|
getOrderInfo() {
|
|
return this.orderInfo;
|
|
}
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.quick-order-container {
|
|
position: fixed;
|
|
right: 30rpx;
|
|
bottom: 30vh;
|
|
z-index: 99;
|
|
transition: transform 0.3s;
|
|
|
|
&:active {
|
|
transform: scale(0.95);
|
|
}
|
|
|
|
.new-message {
|
|
position: absolute;
|
|
top: 50rpx;
|
|
right: 100%;
|
|
white-space: nowrap;
|
|
background-color: #DC2828;
|
|
border-radius: 20rpx;
|
|
font-size: 25rpx;
|
|
color: #ffffff;
|
|
padding: 5rpx 15rpx;
|
|
margin-bottom: 10rpx;
|
|
box-shadow: 0 5rpx 10rpx rgba(220, 40, 40, 0.3);
|
|
animation: pulse 2s infinite;
|
|
}
|
|
|
|
.quick-order {
|
|
position: relative;
|
|
width: 230rpx;
|
|
height: 160rpx;
|
|
|
|
image {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.number-order {
|
|
background-color: #DC2828;
|
|
position: absolute;
|
|
font-size: 30rpx;
|
|
height: 40rpx;
|
|
width: 40rpx;
|
|
text-align: center;
|
|
border-radius: 20rpx;
|
|
color: #ffffff;
|
|
top: 10rpx;
|
|
left: 25rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
@keyframes pulse {
|
|
0% {
|
|
transform: scale(1);
|
|
}
|
|
50% {
|
|
transform: scale(1.05);
|
|
}
|
|
100% {
|
|
transform: scale(1);
|
|
}
|
|
}
|
|
</style>
|