Yizhan-app/pages/lifeService/plants.vue

817 lines
20 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>
<view class="plants_main" :style="{height: screenHeight + 'px'}">
<nav-bar title='绿植订购'></nav-bar>
<view class="reservation_type">
<view :class="acIndex == 0? 'type_item_left_ac':'type_item_left'" @click="typeClick(0)">绿植订购</view>
<view :class="acIndex == 0? 'type_item_right':'type_item_right_ac'" @click="typeClick(1)">我的订单</view>
</view>
<template v-if="acIndex == 0">
<view class="content_nav">
<view class="left_nav">
<view class="left_nav_item" :class="leftIndex == index?'left_nav_item_ac':''" v-for="(item,index) in dataList" :key="index" @click="leftClick(item,index)">
{{item.name}}
</view>
</view>
<view class="right_nav" v-if="dataList[leftIndex]">
<scroll-view :scroll-top="scrollTop" scroll-y="true" style="height: 100%;">
<view class="right_nav_item" v-for="(item,index) in dataList[leftIndex].child" :key="index">
<image class="goods_img" @click="previewImage(item.url)" :src="item.url" mode="aspectFill"></image>
<view class="goods_info">
<view class="goods_name">{{item.greenName}}</view>
<view class="goods_pice">
<view style="color: #FC701E;font-size: 32rpx;font-weight: bold;">
<text style="font-size: 24rpx;">¥ </text> {{item.greenPrice}} / <text style="font-size: 24rpx;">{{item.unit}}</text>
</view>
<view class="goods_icon">
<image @click="jianClick(item,index,dataList[leftIndex])" v-if="item.num > 0" src="/static/firstaid/jian.png"></image>
<view v-if="item.num > 0" style="font-size: 30rpx;margin: 0 10rpx;">{{item.num}}</view>
<image @click="addClick(item,index,dataList[leftIndex])" src="/static/firstaid/addIcon.png"></image>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
<view class="bottom_btn">
<view class="info_nav">
<view style="font-weight: bold;font-size: 30rpx;">合计:
<text style="font-size: 24rpx;font-weight: 400;color: #F4772D;">¥</text> <text style="color: #F4772D;">{{totalPrice}}</text>
</view>
<view style="font-size: 26rpx;">已选 {{totalNum}} 件
<text style="margin-left: 24rpx;font-size: 24rpx;" v-if="totalNum > 0 ">配送费:{{delivery}}满500可减)</text>
</view>
</view>
<view class="btn_nav" @click="addGoods()" v-if="!popShow"> 添加购物车</view>
<view class="btn_nav" @click="submitClick()" v-else> 提交订单</view>
</view>
</template>
<template v-if="acIndex == 1">
<z-paging
id="paging_id"
ref="paging"
v-model="listData"
@query="queryList"
:fixed="false"
class="z-paging_nav"
:auto="false"
:style="{height: scrollH +'px'}">
<view class="card_item" v-for="(item,index) in listData" :key="index">
<view class="order_num">订单编号 {{item.greenOrderInfoList[0].orderId}}</view>
<view class="order_info">
<view class="order_img">
<view class="img_nav" v-for="(child,cindex) in item.greenOrderInfoList" :key="cindex">
<image @click="previewImage(child.url)" :src="child.url" mode="aspectFill"></image>
<view class="">{{child.greenName}}</view>
</view>
</view>
<view class="order_tips">{{item.num}}</view>
</view>
<view class="order_time">
<view class="date">下单时间{{item.createdTime}}</view>
<view class="price"><text style="font-size: 26rpx;"></text>{{item.usePrice}}</view>
</view>
</view>
</z-paging>
</template>
<van-popup v-model="popShow" position="bottom" round class="project_nav" @close="popClose">
<view class="top">
<view class="checkbox_nav" @click="allcheckChange()">
<view class="checkbox" :class="allChecked?'checkbox_ac':''"></view>
<view>当前已选{{totalNum}}件商品</view>
</view>
<view class="delete_icon" @click="clearClick()">
<image src="/static/firstaid/delete.png"></image>
<view>清空</view>
</view>
</view>
<view class="center">
<view class="right_nav_item" v-for="(item,index) in selectList" :key="index" style="padding: 24rpx 0;" @click="rowChange(item,index)">
<view style="display: flex;align-items: center;width: 100%;">
<view class="checkbox" :class="item.checked?'checkbox_ac':''"></view>
<view style="flex: 1;display: flex;">
<image class="goods_img" :src="item.url" style="width: 140rpx;height: 140rpx;"></image>
<view class="goods_info">
<view class="goods_name">{{item.greenName}}</view>
<view class="goods_pice">
<view style="color: #FC701E;font-size: 32rpx;font-weight: bold;">
<text style="font-size: 24rpx;">¥ </text> {{item.greenPrice}} / <text style="font-size: 24rpx;">{{item.unit}}</text>
</view>
<view class="goods_icon">
<image @click.stop="carjianClick(item,index)" v-if="item.num > 0" src="/static/firstaid/jian.png"></image>
<view v-if="item.num > 0" style="font-size: 30rpx;margin: 0 10rpx;">{{item.num}}</view>
<image @click.stop="caraddClick(item,index)" src="/static/firstaid/addIcon.png"></image>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</van-popup>
</view>
</template>
<script>
import navBar from "@/components/navBar/index.vue";
import {callbackRequest,accAdd,accMul} from "@/common/util.js"
import {greenList,greenType,greenOrder} from "@/common/api.js"
export default {
components: {
navBar
},
data() {
return {
scrollTop: 0,
acIndex: 0,
leftIndex: 0,
dataList: [],
totalPrice: 0,
totalNum: 0,
popShow: false,
allChecked: false,
selectList: [],
listData: [],
screenHeight: '',
scrollH: '',
delivery: 30,
discount: 1
}
},
onLoad() {
this.getList()
this.screenHeight = uni.getSystemInfoSync().safeArea.height
},
onShow() {
if(this.acIndex == 1) {
this.$nextTick(() => {
this.$refs.paging.reload()
})
}
},
methods: {
queryList(pageNo, pageSize) {
let params = {
method: greenOrder,
currentPage: pageNo,
isDeleted: "0",
limit: pageSize,
userId: uni.getStorageSync('userId')
}
callbackRequest(params).then((res) => {
if (res.returnCode == 1) {
if(res.returnData.records.length > 0) {
res.returnData.records.forEach(item => {
item.num = 0
if(item.greenOrderInfoList.length > 0) {
item.greenOrderInfoList.forEach(child => {
item.num = accAdd(item.num,child.greenNum)
})
}
})
}
if(pageNo * pageSize >= res.returnData.total) {
this.$refs.paging.completeByNoMore(res.returnData.records,true);
return
}else{
this.$refs.paging.completeByNoMore(res.returnData.records,false);
}
} else {
uni.showToast({title: res.returnMsg,icon: 'none'});
}
})
},
getType() {
return new Promise((resolve,reject) => {
let params = {
method: greenType,
dataType: 'green_flower',
isDeleted: '0'
}
callbackRequest(params).then((res) => {
if (res.returnCode == 1) {
resolve(res.returnData)
} else {
uni.showToast({title: res.returnMsg,icon: 'none'});
}
})
})
},
getList() {
let params = {
method: greenList,
isDeleted: "0",
type: '',
userId: uni.getStorageSync('userId'),
currentPage: 1,
limit: 10000
}
callbackRequest(params).then((res) => {
if (res.returnCode == 1) {
this.dataList = []
this.getType().then(typeList => {
typeList.forEach(item => {
var arr = {
name: '',
child: []
}
res.returnData.records.forEach(good => {
if(item.dataCode == good.type) {
good.num = 0
good.checked = false
arr.child.push(good)
}
})
arr.name = item.dataValue
this.dataList.push(arr)
})
this.dataList.forEach((item,index) => {
if(item.child.length <= 0) {
this.dataList.splice(index,1)
}
})
})
console.log('this.dataList',this.dataList)
} else {
uni.showToast({title: res.returnMsg,icon: 'none'});
}
})
},
submitClick() {
var isOrder = false
if(this.selectList.length <= 0) {
uni.showToast({title: '请先选择商品',icon: 'none'});
return
}
for(let i=0;i<this.selectList.length;i++) {
if(this.selectList[i].checked && this.selectList[i].num > 0) {
isOrder = true
}
}
if(!isOrder) {
uni.showToast({title: '请勾选商品数量',icon: 'none'});
return
}
this.popShow = false
this.$nextTick(() => {
uni.navigateTo({
url: '/pages/lifeService/greenOrder?discount=' + this.discount + '&delivery=' + this.delivery,
success: res => {
this.selectList.forEach((item,index) => {
if(!item.checked || item.num <= 0) {
this.selectList.splice(index,1)
}
})
res.eventChannel.emit('selectChange', { data: this.selectList })
}
});
})
},
typeClick(num) {
this.acIndex = num
if(this.acIndex == 1) {
this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this);
query.select("#paging_id").boundingClientRect((data) => {
this.scrollH = this.screenHeight - data.top
}).exec();
this.$refs.paging.reload()
})
}
},
leftClick(row,index) {
this.leftIndex = index
},
jianClick(item,index,parent){
item.num = item.num - 1
if(item.num <= 0) {
item.checked = false
}
this.handleGoods()
},
addClick(item,index,parent) {
item.num++
item.checked = true
this.handleGoods()
},
carjianClick(item) {
item.num = item.num - 1
if(item.num == 0) {
item.checked = false
}
this.handleSelect()
},
caraddClick(item) {
item.num++
this.handleSelect()
},
addGoods() {
if(this.selectList.length <= 0) {
uni.showToast({title: '请选择商品',icon: 'none'});
return
}
this.popShow = true
this.allChecked = true
this.handleSelect()
},
allcheckChange() {
this.allChecked = !this.allChecked
if(!this.allChecked) {
this.selectList.forEach(item => {
item.checked = false
})
}else{
this.selectList.forEach(item => {
item.checked = true
})
}
},
rowChange(e,index) {
e.checked = !e.checked
this.handleSelect()
},
handleSelect() {
// 判断全选按钮状态
let isNo = true
for(let i=0;i<this.selectList.length;i++) {
if(this.selectList[i].checked) {
isNo = false
break
}
}
if(!isNo) {
this.allChecked = true
}else{
this.allChecked = false
}
this.totalNum = 0
this.totalPrice = 0
this.selectList.forEach(c => {
if(c.checked) {
if(c.num > 0) {
this.totalNum = accAdd(this.totalNum,c.num)
this.totalPrice = accAdd(this.totalPrice,accMul(c.greenPrice,c.num))
}
}
})
if(this.totalPrice < 500 && this.totalNum > 0) {
this.totalPrice = accAdd(this.totalPrice,this.delivery)
this.discount = 1
this.delivery = 30
}else{
this.discount = 2
this.delivery = 0
}
},
clearClick() {
this.selectList = []
this.allChecked = false
this.totalNum = 0
this.totalPrice = 0
this.dataList.forEach(item => {
item.child.forEach(c => {
c.num = 0
c.checked = false
})
})
console.log('this.dataList',this.dataList)
},
popClose() {
let arr = []
this.selectList.forEach(c => {
this.dataList.forEach(item => {
item.child.forEach(j => {
if(c.id == j.id) {
j.checked = c.checked
j.num = c.num
if(!c.checked) {
j.num = 0
}
}
})
})
})
},
handleGoods() {
this.totalNum = 0
this.totalPrice = 0
this.selectList = []
this.dataList.forEach(item => {
item.child.forEach(c => {
if(c.num > 0) {
this.selectList.push(c)
this.totalNum = accAdd(this.totalNum,c.num)
this.totalPrice = accAdd(this.totalPrice,accMul(c.greenPrice,c.num))
}
})
})
if(this.totalPrice < 500 && this.totalNum > 0) {
this.totalPrice = accAdd(this.totalPrice,this.delivery)
this.discount = 1
this.delivery = 30
}else{
this.discount = 2
this.delivery = 0
}
},
previewImage(img) {
uni.previewImage({
urls: [img]
});
}
}
}
</script>
<style scoped lang="scss">
.plants_main {
width: 100%;
background: #F2F6FA;
padding-top: 100rpx;
display: flex;
flex-direction: column;
overflow: hidden;
}
.reservation_type {
width: 100%;
display: flex;
height: 90rpx;
margin-top: 20rpx;
.type_item_left {
bottom: -16rpx;
flex: 1;
background-color: #E8ECF2;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 32rpx;
color: #4B5B68;
line-height: 72rpx;
height: 72rpx;
text-align: center;
position: relative;
}
.type_item_left:before {
content: '';
position: absolute;
bottom: 0;
right: 0;
border-top: 72rpx solid #E8ECF2;
border-right: 36rpx solid #ffffff;
width: 0;
height: 0;
}
.type_item_right {
bottom: -16rpx;
flex: 1;
background-color: #E8ECF2;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 32rpx;
color: #4B5B68;
line-height: 72rpx;
height: 72rpx;
text-align: center;
position: relative;
}
.type_item_right:before {
content: '';
position: absolute;
bottom: 0;
left: 0;
border-top: 72rpx solid #E8ECF2;
border-left: 36rpx solid #ffffff;
width: 0;
height: 0;
}
.type_item_left_ac {
flex: 1;
height: 88rpx;
background-color: #ffffff !important;
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 32rpx;
line-height: 88rpx;
text-align: center;
color: #00ADA6 !important;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
}
.type_item_right_ac {
flex: 1;
height: 88rpx;
background-color: #ffffff !important;
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 32rpx;
line-height: 88rpx;
text-align: center;
color: #00ADA6 !important;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
}
}
.content_nav {
margin-top: 24rpx;
height: calc(100% - 140rpx);
// padding: 24rpx;
// box-sizing: border-box;
display: flex;
.left_nav {
width: 200rpx;
height: 100%;
background-color: #F2F6FA;
padding-bottom: 130rpx;
overflow-y: auto;
.left_nav_item {
width: 100%;
height: 96rpx;
font-weight: bold;
font-size: 28rpx;
text-align: center;
line-height: 96rpx;
}
.left_nav_item_ac {
background: #FFFFFF;
color: #00ADA6;
position: relative;
}
.left_nav_item_ac:before {
position: absolute;
content: '';
width: 12rpx;
height: 32rpx;
background: linear-gradient( 180deg, #5BCE9D 0%, #00ADA6 100%);
left: 0;
top: 50%;
transform: translateY(-50%);
border-top-right-radius: 100%;
border-bottom-right-radius: 100%;
}
}
.right_nav {
flex: 1;
background-color: #ffffff;
padding-bottom: 130rpx;
}
}
.right_nav_item {
display: flex;
padding: 24rpx;
box-sizing: border-box;
.goods_img {
width: 176rpx;
height: 176rpx;
border-radius: 20rpx;
display: block;
}
.goods_info {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 24rpx;
box-sizing: border-box;
.goods_name {
font-weight: bold;
font-size: 32rpx;
color: #0E1A24;
}
.goods_pice {
display: flex;
justify-content: space-between;
}
.goods_icon {
display: flex;
// width: 140rpx;
justify-content: space-between;
align-items: center;
image {
width: 40rpx;
height: 40rpx;
display: block;
}
}
}
}
.bottom_btn {
z-index: 999;
padding-left: 44rpx;
width: calc(100% - 48rpx);
height: 100rpx;
background: #FFFFFF;
box-shadow: 0rpx 6rpx 16rpx 2rpx #E7EFF9;
position: fixed;
bottom: 20rpx;
border-radius: 50rpx;
left: 50%;
transform: translateX(-50%);
display: flex;
justify-content: space-between;
.info_nav {
display: flex;
flex-direction: column;
justify-content: space-evenly;
}
.btn_nav {
width: 216rpx;
height: 100%;
background: linear-gradient( 180deg, #5BCE9D 0%, #00ADA6 100%);
border-radius: 0rpx 50rpx 50rpx 0rpx;
font-weight: bold;
font-size: 32rpx;
color: #FFFFFF;
line-height: 100rpx;
text-align: center;
}
}
/deep/.van-overlay {
z-index: 888 !important;
}
.project_nav {
height: 70vh;
width: 100%;
display: flex;
flex-direction: column;
box-sizing: border-box;
z-index: 990 !important;
.top {
font-weight: 400;
font-size: 28rpx;
color: #0E1A24;
width: 100%;
height: 88rpx;
background: #F6F9FF;
border-radius: 40rpx 40rpx 0rpx 0rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 24rpx;
box-sizing: border-box;
.delete_icon {
display: flex;
align-items: center;
image{
// flex: 1;
width: 30rpx;
height: 30rpx;
display: block;
margin-right: 14rpx;
}
}
}
.center {
padding: 0 0 140rpx 24rpx;
box-sizing: border-box;
height: calc(100% - 90rpx);
overflow: auto;
}
}
.checkbox_nav {
display: flex;
}
.checkbox {
height: 40rpx;
width: 40rpx;
border: 1px solid #c8c9cc;
border-radius: 50%;
margin-right: 24rpx;
}
.checkbox_ac {
position: relative;
height: 40rpx;
width: 40rpx;
color: #fff;
background-color: #1989fa;
border-color: #1989fa;
}
.checkbox_ac:before {
position: absolute;
content: "\2713";
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
/deep/.van-checkbox__label {
flex: 1;
}
.z-paging_nav {
padding: 0 24rpx;
box-sizing: border-box;
}
.card_item {
width: 100%;
min-height: 202rpx;
background: #FFFFFF;
border-radius: 20rpx;
margin-top: 24rpx;
padding: 24rpx;
box-sizing: border-box;
.order_num {
font-weight: 400;
font-size: 28rpx;
color: #0E1A24;
}
.order_info {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 28rpx;
.order_img {
display: flex;
flex: 1;
overflow-x: auto;
.img_nav {
display: flex;
flex-direction: column;
align-items: center;
margin-right: 24rpx;
font-weight: 400;
font-size: 28rpx;
color: #0E1A24;
view {
text-align: center;
width: 170rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
image {
width: 170rpx;
height: 170rpx;
border-radius: 20rpx;
display: block;
margin-bottom: 24rpx;
}
}
}
.order_tips {
width: 120rpx;
font-weight: 400;
font-size: 24rpx;
color: #4B5B68;
text-align: right;
}
}
.order_time {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 28rpx;
.date {
font-weight: 400;
font-size: 24rpx;
color: #97A5B1;
}
.price {
font-weight: bold;
font-size: 36rpx;
color: #0E1A24;
}
}
}
/* 隐藏滚动条 */
.order_img::-webkit-scrollbar {
width: 0;
height: 0;
}
/* 可选如果需要滚动条轨道也隐藏 */
.order_img::-webkit-scrollbar-track {
background-color: transparent;
}
</style>