From c6bac585288a7841b1d1f5fd774b7c765955815b Mon Sep 17 00:00:00 2001
From: queenwuli <942534046@qq.com>
Date: Thu, 24 Dec 2020 16:09:42 +0800
Subject: [PATCH] 商品订单联调

---
 hive-app/pages/workbench/selectProduct/index.vue |  260 ++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 181 insertions(+), 79 deletions(-)

diff --git a/hive-app/pages/workbench/selectProduct/index.vue b/hive-app/pages/workbench/selectProduct/index.vue
index 47d7715..298d203 100644
--- a/hive-app/pages/workbench/selectProduct/index.vue
+++ b/hive-app/pages/workbench/selectProduct/index.vue
@@ -4,64 +4,51 @@
 		<!-- #ifndef H5 -->
 		<view class="status_bar"></view>
 		<!-- #endif -->
-		<search-bar :placeholder="placeholder" class="ml-10 mr-10"></search-bar>
-		<view class="list flex">
-			<scroll-view class="list-left" scroll-y>
-				<view v-for="(item,index) in list" class="list-left-row" @click="active(index)" :class="select==index?'active':''">
-					<text class="font-14">{{item}}</text>
+		<search-bar placeholder="商品名称、编号、拼音" class="search-bar"></search-bar>
+		<view class="list">
+			<scroll-view class="list-left" scroll-y="true">
+				<view class="list-left-row" 
+					v-for="(item,index) in goodsTypeList" 
+					v-if="item.parentId===0"
+					:class="index==selectIndex?'active':''"
+					@click="changeGoodsType(item.id, index)">
+						<text>{{item.name}}</text>
 				</view>
 			</scroll-view>
-			<scroll-view class="list-right" scroll-y>
-				<navigator url="../productDetail/index">
-					<view class="flex align-center list-right-row">
-						<image class="product-img mr-5" mode="aspectFill" src="../../../static/images/product.jpg"></image>
-						<view>
-							<text class="flex justify-start font-12">肽妍氨基酸平衡基础洁面乳</text>
-							<text class="font-10 gray flex justify-start">物品描述</text>
-							<view class="flex justify-between align-center mt-15">
-								<text class="flex justify-start font-12 red mt-10">¥400.00</text>
-								<view class="flex align-center justify-end mt-10">
-									<text class="iconfont iconjian blue-outline-btn-circle mr-10"></text>
-									<text>1</text>
-									<text class="iconfont iconjia blue-btn-circle ml-10"></text>
+			<scroll-view class="list-right" scroll-y="true">
+				<navigator url="../productDetail/index" hover-class="none" v-for="item in goodsList">
+					<view class="list-right-row">
+						<image class="product-img" :src="item.img?item.img:'../../../static/images/no-img.png'"></image>
+						<view class="flex-1">
+							<text>{{item.name}}</text>
+							<view class="flex justify-between mt-15">
+								<text class="price">¥{{item.price}}</text>
+								<view class="right">
+									<template v-if="item.num">
+										<text class="iconfont iconjian blue-outline-btn-circle mr-10" 
+											@click.stop="decreaseGoods(item)"></text>
+											<text>{{item.num}}</text>
+									</template>
+									<text class="iconfont iconjia blue-btn-circle ml-10" 
+										@click.stop="addGoods(item)"></text>
 								</view>
 							</view>
 						</view>
 					</view>
 				</navigator>
-				<view class="flex align-center list-right-row">
-					<image class="product-img mr-5" mode="aspectFill" src="../../../static/images/product.jpg"></image>
-					<view>
-						<text class="flex justify-start font-12">肽妍氨基酸平衡基础洁面乳</text>
-						<text class="font-10 gray flex justify-start">物品描述</text>
-						<view class="flex justify-between align-center mt-15">
-							<text class="flex justify-start font-12 red mt-10">¥400.00</text>
-							<view class="flex align-center justify-end mt-10">
-								<text class="iconfont iconjian blue-outline-btn-circle mr-10"></text>
-								<text>1</text>
-								<text class="iconfont iconjia blue-btn-circle ml-10"></text>
-							</view>
-						</view>
-					</view>
-				</view>
 			</scroll-view>
 		</view>
-		<view class="shopping flex align-center justify-between">
-			<view class="flex align-center">
-				<view class="shopping-icon iconfont iconicongouwuche gray" @click="openShoppingCart">
-					<view class="shopping-icon-num flex align-center justify-center">
-						<text class="font-10">19</text>
-					</view>
+		<view class="footer">
+			<view class="flex align-center" @click="openShoppingCart">
+				<view class="icon-car-wrap">
+					<text class="iconfont iconicongouwuche icon-car gray"></text>
+					<text class="count" v-if="totalCount">{{totalCount}}</text>
 				</view>
-				<text class="font-14 blue ml-10">¥110.00</text>
+				<text class="font-16 blue">¥{{totalAmount}}</text>
 			</view>
-			<navigator url="../confirmOrder">
-				<button class="blue-btn btn mr-0">提交订单</button>
-			</navigator>
+			<button class="blue-btn btn mr-0" @click="submit" :disabled="isEnableSumbit">提交订单</button>
 		</view>
-		<uni-popup ref="popup" type="bottom">
-			<shopping-cart></shopping-cart>
-		</uni-popup>
+		<shopping-cart ref="shopCart" :list="selectItems" @addGoods="addGoods" @decreaseGoods="decreaseGoods" @reset="clearShopCart"></shopping-cart>
 	</view>
 </template>
 
@@ -77,17 +64,111 @@
 		},
 		data(){
 			return{
-				placeholder:'商品名称、编号、拼音',
-				list:['院装产品','美容套餐','美容客装','美容试装','头皮院装'],
-				select:'0'
+				id: '',
+				goodsTypeList: [], 
+				goodsList: [],
+				selectIndex: 0,
+				cateId: null,//当前产品类别id
+				selectItems: []
 			}
 		},
-		methods:{
-			active(index){
-				this.select=index
+		computed:{
+			// 购物车总数量
+			totalCount(){
+				let count = 0;
+				this.selectItems.forEach((item) => {
+					count += item.num;
+				})
+				return count;
 			},
+			// 购物车总金额
+			totalAmount(){
+				let amount = 0;
+				this.selectItems.forEach((item) => {
+					amount += item.price * item.num;
+				})
+				return amount;
+			},
+			isEnableSumbit(){
+				return !this.selectItems.length
+			}
+		},
+		onLoad(options) {
+			this.id = options.id;
+			uni.setNavigationBarTitle({
+				title: '当前客户:' + options.vipName
+			});
+			this.loadGoodsTypeList()
+		},
+		methods:{
 			openShoppingCart(){
-				this.$refs.popup.open()
+				if(!this.selectItems.length){
+					return;
+				}
+				this.$refs.shopCart.show()
+			},
+			loadGoodsTypeList(){
+				this.$httpUtils.request('/api/order/findShoppingGoodsType').then((res) => {
+					if(res.status == 200){
+						let result = res.rows;
+						this.goodsTypeList = result;
+						if(result.length){
+							this.cateId = result[0].id;
+							this.loadGoodsList();
+						}
+					}
+				})
+			},
+			loadGoodsList(){
+				this.$httpUtils.request('/api/order/findShoppingGoods',{
+					cateId: this.cateId,
+					pageNum: 1,
+					pageSize: 100,
+					queryKey: ''
+				},'POST').then((res) => {
+					if(res.status == 200){
+						this.goodsList = res.rows.map((item) => {
+							return Object.assign(item, {num: 0});
+						});
+					}
+				})
+			},
+			// 切换商品类型
+			changeGoodsType(id, index){
+				this.selectIndex = index;
+				this.cateId = id;
+				this.loadGoodsList();
+			},
+			addGoods(goods){
+				let index = this.selectItems.indexOf(goods);
+				goods.num++;
+				// 该商品若已在购物车,则购物车数量上+1,否则加入购物车
+				if(index > -1){
+					this.selectItems[index].num = goods.num;
+				}else{
+					this.selectItems.push(goods);
+				}
+			},
+			decreaseGoods(goods){
+				let index = this.selectItems.indexOf(goods);
+				goods.num = goods.num <= 0 ? 0 : goods.num - 1;
+				// 该商品若已在购物车,则购物车数量上-1,否则从购物车删除
+				if(index > -1 && this.selectItems[index].num >= 1){
+					this.selectItems[index].num = goods.num;
+				}else{
+					this.selectItems.splice(index, 1);
+				}
+			},
+			clearShopCart(){
+				this.selectItems = [];
+				this.goodsList.forEach((item) => {
+					item.num = 0;
+				});
+			},
+			submit(){
+				uni.navigateTo({
+					url: '../confirmOrder?id='+this.id+'&list='+encodeURIComponent(JSON.stringify(this.selectItems))
+				});
 			}
 		}
 	}
@@ -104,61 +185,82 @@
 		padding: 10px 0 0;
 		box-sizing: border-box;
 	}
+	.search-bar{
+		margin-left: 10px;
+		margin-right: 10px;
+	}
 	.list{
 		flex: 1;
+		display: flex;
+		overflow: hidden;
 	}
 	.list-left{
-		width: 25%;
-		height: 100%;
-		text-align: center;
+		width: 170rpx;
 		background: #F6F6F8;
 		border-radius: 4px;
 	}
 	.list-right{
-		width: 75%;
-		text-align: center;
-		padding: 0px 10px;
+		flex: 1;
 	}
 	.list-left-row{
 		padding: 10px;
 		color: #8c9fad;
+		font-size: 13px;
 	}
-	.active{
+	.list-left-row.active{
 		background: #FFFFFF;
 		color: #000000;
 	}
 	.list-right-row{
+		display: flex;
+		align-items: center;
+		padding: 10px;
+		margin: 0 10px 10px;
 		border: 1px solid #EDEAF4;
 		box-shadow:0 6px 6px rgba(237,234,244,0.5);
 		border-radius: 4px;
-		padding: 10px;
+		font-size: 13px;
 	}
-	.list-right-row:not(:first-child){
-		margin-top: 10px;
+	.list-right-row .product-img{
+		width: 66px;
+		height: 66px;
+		margin-right: 5px;
 	}
-	.product-img{
-		width: 81px;
-		height: 81px;
+	.list-right-row .price{
+		display: block;
+		color: #FA5151;
+		font-size: 15px;
 	}
-	.shopping{
-		padding: 10px 10px;
-		box-shadow:0 6px 100px rgba(237,234,244,1);
-	}
-	.shopping-icon{
-		font-size: 28px;
+	.footer{
 		position: relative;
+		z-index: 999;
+		display: flex;
+		justify-content: space-between;
+		background: #FFFFFF;
+		padding: 10px 10px;
+		box-shadow: 0 6px 100px rgba(237,234,244,1);
 	}
-	.shopping-icon-num{
-		width: 20px;
-		height: 20px;
-		background: #518EFF;
-		border-radius: 50%;
-		color: #FFFFFF;
+	.footer .icon-car-wrap{
+		position: relative;
+		margin-right: 15px;
+	}
+	.footer .icon-car{
+		font-size: 28px;
+	}
+	.footer .count{
 		position: absolute;
 		right: -10px;
 		top: -10px;
+		width: 20px;
+		height: 20px;
+		line-height: 20px;
+		background: #518EFF;
+		border-radius: 50%;
+		color: #FFFFFF;
+		font-size: 12px;
+		text-align: center;
 	}
-	.btn{
+	.footer .btn{
 		border-radius: 20px;
 		line-height: 34px;
 		padding: 0 24px;

--
Gitblit v1.9.1