diff --git a/pages/cart/cart.vue b/pages/cart/cart.vue index 815b055..0488387 100644 --- a/pages/cart/cart.vue +++ b/pages/cart/cart.vue @@ -1,5 +1,73 @@ @@ -12,20 +80,423 @@ }, data() { return { - + cartList: [], + allPrice: 0, + selectAll: false, } }, onLoad() { + }, + onShow() { + this.getList() }, methods: { - + getList () { + this.Post({},"/api/cart/get_list").then(res=>{ + let resData = (res.data ||[]) + let shopSelectIds = [] + let skuSelectIds = [] + this.cartList.forEach(v=>{ + if (v.is_seld) {shopSelectIds.push(v.id)} + v.goods.forEach(x=>{ + if(x.is_seld) {skuSelectIds.push(x.sku_id)} + }) + }) + + resData.forEach(v=>{ + v.is_seld = shopSelectIds.includes(v.id) + // v.show = true + v.goods.forEach(x=>{ + x.is_seld = skuSelectIds.includes(x.sku_id) + // v.show = true + }) + }) + this.cartList = resData + this.judgeSelectAll() + }).finally(()=>{ + uni.hideLoading() + }) + }, + // 单个增加/减少 + addBuyNum(item,num,index){ + console.log(item) + if (num == -1 && item.num == 1) { + return // 单独走删除 + this.delItem(item) + } else { + let numData = item.num + num + this.Post({sku_id: item.sku_id, num: numData},'/api/cart/update_sku').then(res =>{ + item.num += num + }) + } + }, + // 单个删除 + delItem(item){ + this.Post({sku_id: item.sku_id},'/api/cart/del_sku').then(res =>{ + // this.cartData.splice(index,1) + this.getList() + }) + + }, + // 把店铺下的所有商品删除 + delCartByShop (item, index) { + let goods = item.goods.map(v=>v.sku_id) + this.Post({sku_id: goods.join(',')},'/api/cart/del_sku').then(res =>{ + this.getList() + }) + }, + // 删除全部 + delAll () { + let goods = [] + this.cartList.forEach(v=>{ + v.goods.forEach(x=>{goods.push(x.sku_id)}) + }) + this.Post({sku_id: goods.join(',')},'/api/cart/del_sku').then(res =>{ + this.getList() + }) + }, + + // 全选 + selectAllData (flag) { + this.selectAll = flag + if (flag) { + this.cartList.forEach(t=>{ + t.goods.forEach(v=>{ + if (v && v.product &&v.sku) { + if (v.sku.flag== "off") { + v.is_seld = false + } else { + if (v.product.type == 'hotel'&&(!v.strat_time||!v.end_time)) { + v.is_seld = false + } else { + v.is_seld = true + } + } + } + }) + }) + } else { + this.cartList.forEach(v=>{ + v.is_seld = false + }) + } + this.judgeSelectAll() + }, + // 店铺选中 + changeShopSelect(item, flag) { + if (flag) { + item.goods.forEach(v=>{ + if (v.sku.flag== "off") { + v.is_seld = false + } else { + if (v.product.type == 'hotel'&&(!v.strat_time||!v.end_time)) { + v.is_seld = false + } else { + v.is_seld = true + } + } + }) + item.is_seld = true + } else { + item.goods.forEach(v=>{ + v.is_seld = false + }) + item.is_seld = false + } + this.judgeSelectAll() + }, + // 单个选中 + changeGoodsSelect(item,flag) { + if (flag) { + if (item.sku.flag== "off") { + item.is_seld = false + } else { + if (item.product.type == 'hotel'&&(!item.strat_time||!item.end_time)) { + item.is_seld = false + uni.showToast({ + title:'酒店产品需要选择时间', + icon:'none' + }) + } else { + item.is_seld = true + } + } + } else { + item.is_seld = false + } + this.judgeSelectAll() + }, + // 判断全选 + judgeSelectAll () { + this.cartList.forEach(v=>{ + if(v.goods.some(x=>x.sku&& x.sku.flag!= "off"&&!x.is_seld)) { + v.is_seld = false; + } else { + v.is_seld = true; + } + }) + + if (this.cartList.every(v=>v.is_seld)) { + this.selectAll = true + } else { + this.selectAll = false + } + + }, + + + // 去下单 + goOrder () { + let buyGoods = this.cartList.filter(v=>v.is_seld) + if (buyGoods.length<=0) { + uni.showToast({ + title: '请选择要购买的产品', + icon: 'none' + }) + } + + let ticketOrderList = [] // 门票类下单 + let foodOrderList = [] // 农家烟火下单 + let techanOrderList = [] // 邮寄自提下单 + let hotelOrderList = [] // 酒店下单 + + buyGoods.forEach(v=>{ + if (v.product.is_package == 1) { + foodOrderList.push({ + pInfo: v.product, + sInfo: {...v.sku, buyNum: v.num} + }) + } else if (v.product.type == "ticket") { + ticketOrderList.push({ + pInfo: v.product, + sInfo: {...v.sku, buyNum: v.num} + }) + } else if (v.product.type == "post") { + techanOrderList.push({ + pInfo: v.product, + sInfo: {...v.sku, buyNum: v.num} + }) + } else if (v.product.type == "hotel") { + hotelOrderList.push(v) + } + }) + + // 数据储存 todo + this.$store.commit("changeTechanOrderList", techanOrderList); + this.$store.commit("changeTicketOrderList", ticketOrderList); + this.$store.commit("changeFoodOrderList", foodOrderList); + this.$store.commit("changeHotelOrderList", hotelOrderList); + // 邮寄 > 门票 > 农家乐 > 酒店 + this.goCartNextPage(0) + + }, + + total () { + return 0 + }, + }, + onReachBottom() { } } - diff --git a/static/js/CommonFunction.js b/static/js/CommonFunction.js index cd39142..e31cd14 100644 --- a/static/js/CommonFunction.js +++ b/static/js/CommonFunction.js @@ -281,4 +281,31 @@ Vue.prototype.goCartPage = ()=>{ uni.switchTab({ url: "/pages/cart/cart" }) +}, + +// 购物车下单去下个页面 +Vue.prototype.goCartNextPage= function(currentPageIndex){ + // currentPage "" 购物车 'techan' 'ticket' 'food' 'hotel' + // 0 1 2 3 4 + let techanOrderList = this.$store.state.user.techanOrderList; + let ticketOrderList = this.$store.state.user.ticketOrderList; + let foodOrderList = this.$store.state.user.foodOrderList; + let hotelOrderList = this.$store.state.user.hotelOrderList; + + let orderPage = [ + {path: '/subPackages/techan/order', length: techanOrderList.length}, + {path: '/subPackages/ticket/order', length: ticketOrderList.length}, + {path: '/subPackages/food/order', length: foodOrderList.length}, + {path: '',length: hotelOrderList.length} + ] + let nextPage = orderPage.find((v,index)=>v.length>0&&index>=currentPageIndex) + if (nextPage) { + console.log(nextPage) + uni.navigateTo({ + url: nextPage.path+'?isShoppingCart=1' + }) + } else { + console.log(orderPage, nextPage, '结束') + // todo 最后下单页面 + } } \ No newline at end of file diff --git a/static/js/request.js b/static/js/request.js index c22e5da..4f75e4b 100644 --- a/static/js/request.js +++ b/static/js/request.js @@ -3,7 +3,7 @@ import store from '@/store'; // 定义 API URL // const DEV_API_URL = 'https://api.cloud.sz-trip.com'; -const DEV_API_URL = 'https://swsz.api.js-dyyj.com'; +const DEV_API_URL = 'https://swsz.api.js-dyyj.com' const PROD_API_URL = 'https://swsz.api.js-dyyj.com'; const NEWAPIURL = process.env.NODE_ENV === 'development' ? DEV_API_URL : PROD_API_URL; @@ -40,7 +40,8 @@ Vue.prototype.NEWAPIURL = '/api'; // #endif Vue.prototype.Post = (params = {}, apiurl) => { - const token = getToken() || 'a090644d-2bdb-4807-833b-bb5bc2182ac5'; + // const token = getToken() || '0caa10fc-6d65-4d9c-8e57-b344be3fc526'; // 君到苏州 + const token = getToken() || 'a090644d-2bdb-4807-833b-bb5bc2182ac5' // 时味苏州 if (token) { params.token = token; } diff --git a/store/modules/user.js b/store/modules/user.js index 9f6a62f..863cf3f 100644 --- a/store/modules/user.js +++ b/store/modules/user.js @@ -17,7 +17,7 @@ export default { ticketOrderList: [], // 门票类下单 foodOrderList: [], // 农家烟火下单 techanOrderList: [], // 邮寄自提下单 - + hotelOrderList: [], // 酒店下单 meetRoomReserve: { date: null, //使用日期信息 coupon: null, // 优惠券信息 @@ -88,5 +88,9 @@ export default { changeFoodOrderList(state, data){ state.foodOrderList = data }, + // 酒店下单 + changeHotelOrderList(state, data){ + state.hotelOrderList = data + }, } } diff --git a/subPackages/food/detail.vue b/subPackages/food/detail.vue index 56a2e4a..7a4f31f 100644 --- a/subPackages/food/detail.vue +++ b/subPackages/food/detail.vue @@ -271,7 +271,7 @@ sInfo: goods, }] - uni.setStorageSync('foodOrder', JSON.stringify(orderInfo)); //规格 + this.$store.commit("changeFoodOrderList", orderInfo); uni.navigateTo({ url: '/subPackages/food/order' }); diff --git a/subPackages/food/order.vue b/subPackages/food/order.vue index 4ce4c77..4111660 100644 --- a/subPackages/food/order.vue +++ b/subPackages/food/order.vue @@ -148,15 +148,7 @@ initPageData () { - let data = uni.getStorageSync('foodOrder'); - try{ - data = JSON.parse(data) - this.orderList = data - console.log(this.orderList) - - } catch(e){ - console.log(e) - } + this.orderList = this.$store.state.user.foodOrderList; this.getMaxCouponData() }, @@ -238,10 +230,17 @@ goods.push(param) }) + // 如果是购物车下单 + if (this.isShoppingCart) { + this.$store.commit("changeFoodOrderList", this.orderList); + this.goCartNextPage(3) + return + } + let data = { product_list: goods, - coupon_id: this.coupon ? this.coupon.id : "", + coupon_id: this.coupon ? this.coupon.id : null, } console.log('data数据',data); this.Post({ diff --git a/subPackages/techan/detail.vue b/subPackages/techan/detail.vue index 6cdfb76..762cb41 100644 --- a/subPackages/techan/detail.vue +++ b/subPackages/techan/detail.vue @@ -245,13 +245,13 @@ // post: 0, }] - uni.setStorageSync('teChanOrder', JSON.stringify(orderInfo)); //规格 + this.$store.commit("changeTechanOrderList", orderInfo); uni.navigateTo({ url: '/subPackages/techan/order' }); }, addToCart () { - let goods = this.trueSku[this.productIndex] + let goods = this.sku[this.productIndex] goods.buyNum = this.buyNum this.Post({sku_id: goods.id,num: this.buyNum },'/api/cart/add_sku').then(res => { if (res.code == 1) { diff --git a/subPackages/techan/index.vue b/subPackages/techan/index.vue index 810f55c..e7cddbe 100644 --- a/subPackages/techan/index.vue +++ b/subPackages/techan/index.vue @@ -26,7 +26,7 @@ - 展开 + 展开 @@ -34,7 +34,7 @@ - 综合 + 综合 销量 @@ -123,7 +123,7 @@ - + @@ -230,7 +230,7 @@ statusBarHeight: 0, headImg: "https://cgc.js-dyyj.com/uploads/20250513/f8b255f965efcd71b6843e4b72c3f1f3.png", - type_pid: 646, + type_pid: 20, typeParam: [], typeIndex: 0, list:[], @@ -402,7 +402,7 @@ this.$refs.popup.open() }, addToCart() { - let goods = this.trueSku[this.productIndex] + let goods = this.sku[this.productIndex] goods.buyNum = this.buyNum this.Post({sku_id: goods.id,num: this.buyNum },'/api/cart/add_sku').then(res => { if (res.code == 1) { @@ -582,6 +582,8 @@ width: 67rpx; background: #EDF5DC; padding: 24rpx 20rpx; + text-align: center; + line-height: 1.2; } .goods-container{ diff --git a/subPackages/techan/order.vue b/subPackages/techan/order.vue index 6d9d148..0aefd0d 100644 --- a/subPackages/techan/order.vue +++ b/subPackages/techan/order.vue @@ -46,7 +46,7 @@ 自提点 - {{info.pickupAddress.extract_name||'选择提货地址'}} + {{info.pickupAddress.title||'选择提货地址'}} @@ -97,7 +97,7 @@ 订单备注: - + @@ -196,7 +196,6 @@ export default { post: 0, flag: true, - remark: '', coupon: "", allprice: 0, @@ -238,19 +237,21 @@ export default { }, methods: { handleOrderGoods () { - let orderList = JSON.parse(uni.getStorageSync('teChanOrder')); + let orderList = this.$store.state.user.techanOrderList; if (!Array.isArray(orderList) || orderList.length<=0) { uni.navigateBack(); return } + console.log(orderList) // use_type 0邮寄 1自提 3邮寄或自提 // is_post 1邮寄 2自提 默认邮寄1 orderList.forEach(v=>{ - v.is_post = v.sInfo.use_type==0?1:v.sInfo.use_type==1?2:3 // 产品自己的方式 + v.is_post = v.sInfo.use_type==3?3:v.sInfo.use_type==1?2:1 // 产品自己的方式 v.is_user_post = v.sInfo.use_type==1?2:1 // 用户自选方式 - v.pickupAddress = {} // 自提信息 - v.contacts = null // 收货地址 - v.post = null // 运费信息 + v.pickupAddress = v.pickupAddress || {} // 自提信息 + v.contacts = v.contacts || null // 收货地址 + v.post = v.post || null // 运费信息 + v.remark = v.remark||"" }) this.orderList = orderList @@ -261,6 +262,7 @@ export default { changeUserPost (item,value) { console.log(item) item.is_user_post = value + this.getPost() }, goOrderCoupon () { @@ -308,32 +310,32 @@ export default { }); }, getPost() { + let _this = this let tempList = [] this.orderList.forEach(v=>{ - if( v.sInfo.contacts && v.is_user_post == 1) { + if( v.contacts && v.is_user_post == 1) { tempList.push(v) } }) let param = [] tempList.forEach(v=>{ - param.push({specifications_id: v.sInfo.id, num: v.sInfo.buyNum, consignee_id:v.contacts.id}) + param.push({sku_id: v.sInfo.id, num: v.sInfo.buyNum, consignee_id:v.contacts.id}) }) let data = JSON.stringify(param); // console.log(data); this.flag = false; - this.Post({ data: data }, '/api/order/getNewPost').then(res => { + + Promise.all(param.map(v=>_this.Post({...v},"/api/order/get_post_price"))).then(res=>{ if (res) { + console.log("promise" ,res) for(let i=0;i{ - console.log(err,'aaaaaaa'); - this.flag = true; - }); + }).finally(()=>{this.flag = true;}) }, plus(sku) { @@ -374,7 +376,7 @@ export default { this.selectInfo.contacts = item if (this.flag) { - // this.getPost(); + this.getPost(); } this.$refs.addressPopup.close(); }, @@ -443,57 +445,60 @@ export default { }, // 预定 order() { - if (this.info.is_user_post == 1 || this.info.is_user_post == 3) { - console.log(this.info.is_user_post) - if (this.info.is_user_post == 1 && !this.contacts) { - uni.showToast({ - title: '请选择收货地址', - icon: 'none' - }); - return; + let goods = []; + for(let info of this.orderList) { + let param = { + type: info.pInfo.type, + product_id: info.pInfo.id, + sku_id: info.sInfo.id, + product_num: info.sInfo.buyNum, + remark: info.remark } - - if (this.info.is_user_post == 2) { + if (info.is_user_post == 1) { + if(!info.contacts) { + uni.showToast({ + title: '请选择收货地址', + icon: 'none' + }); + return; + } else { + param.use_type = 1 + param.post = info.contacts.id + } + } + if (info.is_user_post == 2) { if (!this.pickupAddress.id) { uni.showToast({title: '请选择自提点',icon: 'none'}); return; + } else { + param.use_type = 2 + param.pickup_shop_id = info.pickupAddress.id + param.pickup_shop_info = info.pickupAddress } } + goods.push(param) } - - let goods = []; - this.info.goods.forEach(v=>{ - let goodsItem = { - specifications_id: v.skuInfo.id, - num: v.skuInfo.buyNum, - - }; - - if (this.info.is_user_post == 2) { - goodsItem.extract_id = this.pickupAddress.id; - } else if (this.info.is_user_post == 1){ - goodsItem.consignee_id = this.contacts.id - } - goods.push(goodsItem); - }) - + // 如果是购物车下单 + if (this.isShoppingCart) { + this.$store.commit("changeTechanOrderList", this.orderList); + this.goCartNextPage(1) + return + } + let data = { - goods: goods, - coupon: this.coupon ? this.coupon.id : "", - remark: this.remark, - is_post: this.info.is_user_post, + product_list: goods, + coupon_id: this.coupon ? this.coupon.id : null, }; + this.Post( { method: 'POST', data: JSON.stringify(data) }, - '/api/order/place' + '/api/order/create' ).then(res => { - uni.removeStorageSync('teChanOrder') - uni.removeStorageSync('teChanInfo') if (res.code == 1) { this.Post( { @@ -532,7 +537,8 @@ export default { getDataByConnect(data) { if (data.msgType == "updatePickUpPoint") { - let tempData = this.orderList.find(v=>v.sInfo.id == data.data.goodsId) + let tempData = this.orderList.find(v=>v.pInfo.id == data.data.pInfoId) + console.log(tempData) if (tempData) { tempData.pickupAddress = data.data.selectItem } diff --git a/subPackages/techan/selfPickUpPoint.vue b/subPackages/techan/selfPickUpPoint.vue index bbf25bb..86d2478 100644 --- a/subPackages/techan/selfPickUpPoint.vue +++ b/subPackages/techan/selfPickUpPoint.vue @@ -2,19 +2,17 @@ - - {{item.extract_name}} - - - 地址:{{item.detail_addr}} + + {{item.title}} + 营业时间:{{item.remark}} + 地址:{{item.address}} - - - - + + + + + 距离{{item.distance.toFixed(2)}}km - 去这里 - @@ -23,11 +21,11 @@ 暂无自提点地址 - + @@ -62,8 +60,8 @@ // this.getLocation() let param = { product_id: this.goodsId, - lon: uni.getStorageSync('location').lon || '', - lat: uni.getStorageSync('location').lat || '', + lon: uni.getStorageSync('location').lon || '36', + lat: uni.getStorageSync('location').lat || '29', } this.Post(param, "/api/product/getDeliverShop").then(res => { if (res) { @@ -87,8 +85,8 @@ selectPoint (item) { this.selectItem = item // 返回上一个页面并带回selectItem - uni.$emit("updateDataByConnect", {msgType:'updatePickUpPoint',data:{selectItem: this.selectItem, skuId: this.goodsId}}) - uni.navigateBack() + // uni.$emit("updateDataByConnect", {msgType:'updatePickUpPoint',data:{selectItem: this.selectItem, skuId: this.goodsId}}) + // uni.navigateBack() }, goMap (item) { @@ -109,7 +107,7 @@ return; } // 返回上一个页面并带回selectItem - uni.$emit("updateDataByConnect", {msgType:'updatePickUpPoint',data:{selectItem: this.selectItem, skuId: this.goodsId}}) + uni.$emit("updateDataByConnect", {msgType:'updatePickUpPoint',data:{selectItem: this.selectItem, pInfoId: this.goodsId}}) uni.navigateBack() } }, @@ -136,12 +134,14 @@ } .item-bg{ width: 697rpx; - height: 160rpx; + min-height: 160rpx; background: #FFFFFF; border-radius: 13rpx; margin: 0 auto; margin-bottom: 28rpx; - padding: 2rpx; + &.active{ + border:1px solid #6A8A2D; + } } .item { @@ -159,6 +159,9 @@ display: flex; flex-direction: column; justify-content: space-between; + font-weight: 500; + font-size: 27rpx; + color: #999999; } .item-point-guide{ width:140rpx; @@ -176,23 +179,14 @@ height: 33rpx; } } - .item-bg.active{ - background: #515150; - } .name { display: flex; font-size: 31rpx; font-weight: bold; color: #333333; - height: 42rpx; - } - .addressStr{ - display: flex; - font-size: 27rpx; - color: #999999; - padding-top: 10rpx; } + .no-data { width: 100%; height: 100vh; @@ -231,9 +225,9 @@ .addBox{ margin: 0 auto; width: 697rpx; - height: 80rpx; - background: linear-gradient(90deg, #F84A56, #FF9834); - border-radius: 40rpx; + height: 73rpx; + background: #6A8A2D; + border-radius: 11rpx; font-size: 36rpx; font-family: PingFang SC; font-weight: 500; @@ -242,5 +236,12 @@ text-align: center; } } - + .distance{ + font-weight: 500; + font-size: 24rpx; + color: #6A8A2D; + text-align: center; + padding-top: 11rpx; + word-wrap: break-all; + } diff --git a/subPackages/ticket/order.vue b/subPackages/ticket/order.vue index c05c810..ae64bc9 100644 --- a/subPackages/ticket/order.vue +++ b/subPackages/ticket/order.vue @@ -174,13 +174,18 @@ } }, onLoad(options) { + if (options.isShoppingCart) { + this.isShoppingCart = options.isShoppingCart + } // this.getList(); this.$store.commit("choseCoupon", ""); this.initPageData() }, onShow() { - this.coupon = this.$store.state.user.coupon + if (!this.isShoppingCart) { + this.coupon = this.$store.state.user.coupon + } }, methods: { @@ -420,10 +425,17 @@ goods.push(param) }) + // 如果是购物车下单 + if (this.isShoppingCart) { + this.$store.commit("changeTicketOrderList", this.orderList); + this.goCartNextPage(2) + return + } + let data = { product_list: goods, - coupon_id: this.coupon ? this.coupon.id : "", + coupon_id: this.coupon ? this.coupon.id : null, } console.log('data数据',data); this.Post({