450 lines
11 KiB
Vue
450 lines
11 KiB
Vue
<template>
|
|
<div class="flex order-item u-m-b-14 relative" :class="[isActive]" @click="itemClick">
|
|
<div class="absolute status-box">
|
|
<span class="pack" v-if="item.isPack === 'true'"> 包 </span>
|
|
<span class="da" v-if="item.isPrint || item.isPrint === null"> 打 </span>
|
|
<span class="isWaitCall" v-if="item.isWaitCall">等 </span>
|
|
<span class="tui" v-if="item.status === 'return'"> 退 </span>
|
|
</div>
|
|
<div class="flex u-col-top">
|
|
<div class="img">
|
|
<div class="isSeatFee img u-line-1 u-flex u-col-center u-row-center" v-if="isSeatFee">
|
|
<span>{{ item.name }}</span>
|
|
</div>
|
|
<div class="isSeatFee img u-line-1 u-flex u-col-center u-row-center" v-else-if="!item.productId">
|
|
<span> 临时菜 </span>
|
|
</div>
|
|
<img v-else :src="item.coverImg" class="" alt="" />
|
|
</div>
|
|
<div class="good-info u-p-t-6">
|
|
<div class="flex lh-16">
|
|
<div class="name" :class="{ 'free-price': item.status === 'return' }">
|
|
{{ item.name }}
|
|
</div>
|
|
<span class="good_info_discount" v-if="item.isGift === 'true'">赠</span>
|
|
</div>
|
|
<div v-if="item.typeEnum == 'weight'" class="specSnap">
|
|
¥{{ currentPrice }}/{{ item.unit }}
|
|
</div>
|
|
<div v-if="item.specSnap" class="specSnap">
|
|
{{ item.specSnap }}
|
|
</div>
|
|
<div v-if="item.proGroupInfo" class="specSnapss">
|
|
<span>{{ item.groupType == 0 ? '固定套餐' : '可选套餐' }}:</span>
|
|
<span v-for="(a, b) in proGroupInfo" :key="a.proId">
|
|
{{ b == 0 ? '' : ',' }}{{ a.proName }}
|
|
</span>
|
|
</div>
|
|
|
|
<div class="" v-if="placeNum == 0">
|
|
<div class="note" v-if="item.note">备注:{{ item.note }}</div>
|
|
<div class="note flex" v-else>
|
|
<span>备注:</span>
|
|
<span class="el-icon-edit u-font-12" @click="editNote"></span>
|
|
</div>
|
|
</div>
|
|
<div class="note" v-if="placeNum != 0 && item.note">
|
|
备注:{{ item.note || "" }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="flex u-p-t-6">
|
|
<div class="order-number-box u-font-12">
|
|
<div class="" v-if="isSeatFee">X{{ item.totalNumber }}</div>
|
|
<div class="" v-else>X{{ item.number }}</div>
|
|
<div class="absolute" v-if="canChangeNumber">
|
|
<div class="order-input-number">
|
|
<i class="icon-remove" @click="changeOrderNumber(true)"></i>
|
|
<div style="width: 40px" class="number-box">
|
|
<el-input :min="0" type="number" @input="cartGoodsNumberInput" @change="cartGoodsNumberChange"
|
|
v-model="number" placeholder="0"></el-input>
|
|
</div>
|
|
<i class="el-icon-circle-plus icon-add" @click="changeOrderNumber(false)"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="color-333 total-price">
|
|
<template v-if="item.isGift === 'true' || item.status == 'return'">
|
|
<div>¥0</div>
|
|
<div class="free-price">
|
|
<span v-if="isSeatFee"> ¥{{ item.totalAmount }}</span>
|
|
<span v-else> ¥{{ isShowVipPrice ? vipAllPrice : allPrice }}</span>
|
|
</div>
|
|
</template>
|
|
<template v-else-if="item.discountSaleAmount">
|
|
<div>¥{{ discountNewPrice }}</div>
|
|
<div class="free-price">
|
|
<span> ¥{{ isShowVipPrice ? vipAllPrice : allPrice }}</span>
|
|
</div>
|
|
</template>
|
|
<template v-else>
|
|
<div v-if="isSeatFee">¥{{ item.totalAmount }}</div>
|
|
<div v-else>
|
|
<div v-if="isShowVipPrice && vipAllPrice != allPrice">
|
|
¥{{ vipAllPrice }}
|
|
</div>
|
|
<div :class="{
|
|
'free-price': isShowVipPrice && vipAllPrice != allPrice,
|
|
}">
|
|
<span> ¥{{ allPrice }}</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
isShowVipPrice: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
//是否是餐位费
|
|
isSeatFee: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
//是否是历史订单商品
|
|
isOld: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
//第几次下单 1以及以上为历史订单 0为当前购物车
|
|
placeNum: {
|
|
type: [String, Number],
|
|
default: 0,
|
|
},
|
|
selPlaceNum: {
|
|
type: [String, Number],
|
|
default: -1,
|
|
},
|
|
//是否允许改变数量
|
|
canChangeNumber: {
|
|
type: Boolean,
|
|
default: true,
|
|
},
|
|
item: {
|
|
type: Object,
|
|
default: () => {
|
|
return {
|
|
number: 0,
|
|
};
|
|
},
|
|
},
|
|
selIndex: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
index: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
number: 0,
|
|
};
|
|
},
|
|
computed: {
|
|
currentPrice() {
|
|
if (!this.isShowVipPrice) {
|
|
return this.item.salePrice
|
|
}
|
|
return this.memberPrice ? this.memberPrice : this.item.salePrice
|
|
},
|
|
proGroupInfo() {
|
|
return JSON.parse(this.item.proGroupInfo)
|
|
},
|
|
discountNewPrice() {
|
|
const item = this.item;
|
|
const originPrice = this.isShowVipPrice ? this.vipAllPrice : this.allPrice
|
|
const discount = (this.item.discountSaleAmount * this.item.number)
|
|
return (originPrice - discount).toFixed(2)
|
|
},
|
|
vipAllPrice() {
|
|
const item = this.item;
|
|
const price =
|
|
this.isShowVipPrice &&
|
|
item.memberPrice != null &&
|
|
item.memberPrice != undefined
|
|
? item.memberPrice <= 0
|
|
? item.salePrice
|
|
: item.memberPrice
|
|
: item.salePrice;
|
|
return (price * item.number + (item.packAmount || 0)).toFixed(2);
|
|
},
|
|
|
|
allPrice() {
|
|
const item = this.item;
|
|
|
|
const price = item.salePrice;
|
|
return (price * item.number + (item.packAmount || 0)).toFixed(2);
|
|
},
|
|
isActive() {
|
|
const isSel =
|
|
this.selIndex === this.index && this.placeNum === this.selPlaceNum;
|
|
console.log(isSel);
|
|
return isSel ? "active" : "";
|
|
},
|
|
},
|
|
watch: {
|
|
"item.number": function (val) {
|
|
this.number = val;
|
|
// this.$emit('changeOrderNumber',this.index)
|
|
},
|
|
},
|
|
mounted() {
|
|
this.number = this.item.number;
|
|
},
|
|
methods: {
|
|
editNote() {
|
|
if (this.placeNum === 0) {
|
|
this.$emit("editNote", this.index);
|
|
}
|
|
},
|
|
//购物车商品输入框数量改变
|
|
cartGoodsNumberChange(newval) {
|
|
if (newval <= 0) {
|
|
item.number = 1;
|
|
}
|
|
newval = `${newval}`.split(".")[0] * 1;
|
|
this.number = newval;
|
|
this.$emit("cartGoodsNumberChange", newval, this.index);
|
|
},
|
|
//购物车商品输入框数量输入
|
|
cartGoodsNumberInput(newval) {
|
|
if (newval <= 0) {
|
|
return (this.number = 1);
|
|
}
|
|
newval = `${newval}`.split(".")[0] * 1;
|
|
this.number = newval;
|
|
this.$emit("cartGoodsNumberInput", newval, this.index);
|
|
},
|
|
changeOrderNumber(isReduce) {
|
|
this.$emit("changeOrderNumber", this.index, isReduce);
|
|
},
|
|
itemClick() {
|
|
// if(this.isSeatFee){
|
|
// return
|
|
// }
|
|
this.$emit("itemClick", this.index, this.canChangeNumber, this.placeNum);
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
::v-deep .number-box .el-input__inner {
|
|
border: none;
|
|
}
|
|
|
|
::v-deep .el-button--text {
|
|
color: #000;
|
|
}
|
|
|
|
::v-deep .number-box .el-input__inner {
|
|
border: none;
|
|
padding: 0 4px;
|
|
text-align: center;
|
|
}
|
|
|
|
.isSeatFee {
|
|
background: #3f9eff;
|
|
color: #fff;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.icon-remove {
|
|
border: 1px solid #d8d8d8;
|
|
width: 22px;
|
|
height: 22px;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
border-radius: 50%;
|
|
box-sizing: border-box;
|
|
cursor: pointer;
|
|
|
|
&::after {
|
|
content: "";
|
|
display: block;
|
|
width: 10px;
|
|
height: 1px;
|
|
background: #999;
|
|
}
|
|
}
|
|
|
|
.icon-add {
|
|
color: rgb(34, 191, 100);
|
|
font-size: 22px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.flex.order-item {
|
|
padding: 4px;
|
|
border-radius: 2px;
|
|
display: flex;
|
|
overflow: visible;
|
|
cursor: pointer;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
background-color: rgba(0, 0, 0, 0);
|
|
transition: all 0.3s;
|
|
|
|
.status-box {
|
|
width: 18px;
|
|
position: absolute;
|
|
top: 4px;
|
|
right: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2px;
|
|
|
|
>span {
|
|
display: block;
|
|
width: 18px;
|
|
height: 18px;
|
|
border-radius: 4px 0 4px 0;
|
|
font-size: 12px;
|
|
line-height: 17px;
|
|
text-align: center;
|
|
color: #fff;
|
|
}
|
|
}
|
|
|
|
.isWaitCall {
|
|
background: #d3adf7;
|
|
}
|
|
|
|
.pack {
|
|
background: #35ac6a;
|
|
}
|
|
|
|
.da {
|
|
background: #35ac6a;
|
|
}
|
|
|
|
.tui {
|
|
background: #ac4735;
|
|
}
|
|
|
|
&.active {
|
|
background-color: rgba(0, 0, 0, 0.04);
|
|
}
|
|
|
|
.total-price {
|
|
width: 94px;
|
|
font-size: 16px;
|
|
text-align: right;
|
|
}
|
|
|
|
.good-info {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
min-width: 70px;
|
|
|
|
.specSnap {
|
|
color: #999;
|
|
font-size: 12px;
|
|
margin-top: 3px;
|
|
}
|
|
|
|
.specSnapss {
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
color: #999;
|
|
font-size: 12px;
|
|
margin-top: 3px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
display: -webkit-box;
|
|
-webkit-box-orient: vertical;
|
|
-webkit-line-clamp: 2;
|
|
|
|
.specSnap {
|
|
color: #999;
|
|
font-size: 12px;
|
|
margin-top: 3px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.name {
|
|
font-size: 13px;
|
|
text-align: left;
|
|
color: #212121;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.img {
|
|
width: 59px;
|
|
height: 59px;
|
|
position: relative;
|
|
margin-right: 10px;
|
|
|
|
img {
|
|
width: 59px;
|
|
height: 59px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.note {
|
|
max-width: 70%;
|
|
font-size: 12px;
|
|
font-weight: 400;
|
|
text-align: left;
|
|
color: #999;
|
|
margin-top: 5px;
|
|
word-break: break-all;
|
|
}
|
|
|
|
.order-number-box {
|
|
position: relative;
|
|
|
|
.absolute {
|
|
width: 60px;
|
|
height: 40px;
|
|
right: -38px;
|
|
top: -14px;
|
|
position: absolute;
|
|
|
|
.order-input-number {
|
|
position: absolute;
|
|
right: -6px;
|
|
top: 0;
|
|
justify-content: center;
|
|
align-items: center;
|
|
display: none;
|
|
background-color: #fff;
|
|
border: 1px solid #e4e7ed;
|
|
border-radius: 4px;
|
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.06);
|
|
padding: 9px 6px;
|
|
background-color: #fff;
|
|
height: 40px;
|
|
}
|
|
|
|
&:hover .order-input-number {
|
|
display: flex;
|
|
}
|
|
}
|
|
}
|
|
|
|
.good_info_discount {
|
|
height: 16px;
|
|
padding: 0 3px;
|
|
color: #ff3f3f;
|
|
background-color: rgba(255, 63, 63, 0.1);
|
|
border-radius: 2px;
|
|
margin-left: 6px;
|
|
font-size: 12px;
|
|
white-space: nowrap;
|
|
}
|
|
</style> |