595 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			595 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | ||
|  |   <view | ||
|  |     :class="Visible ? 'product-popup open' : 'product-popup close'" | ||
|  |     @touchmove.stop.prevent="" | ||
|  |     @click="closePopup" | ||
|  |   > | ||
|  |     <view class="popup-bg"></view> | ||
|  |     <view class="main" v-on:click.stop> | ||
|  |       <view class="header"> | ||
|  |         <image | ||
|  |           :src=" | ||
|  |             productModel && productModel.detail | ||
|  |               ? productModel.detail.cover1 | ||
|  |               : '' | ||
|  |           " | ||
|  |           mode="aspectFit" | ||
|  |           class="avt" | ||
|  |         ></image> | ||
|  |         <view class="price-color f24"> | ||
|  |           <view | ||
|  |             v-if=" | ||
|  |               (cid == 101 || cid == 102 || cid == 201 || cid == 202) && | ||
|  |               userinfo.pkSettleCountry != pkCountry | ||
|  |             " | ||
|  |             >{{ borderunitss | ||
|  |             }}<text class="f36 fb">{{ formatNum(priceTotal2) }}</text | ||
|  |             >({{ currencyIcon() | ||
|  |             }}<text class="f36 fb">{{ formatNum(priceTotal) }}</text | ||
|  |             >) | ||
|  |           </view> | ||
|  |           <view v-else> | ||
|  |             {{ currencyIcon() }} | ||
|  |             <text class="f36 fb">{{ formatNum(priceTotal) }}</text> | ||
|  |           </view> | ||
|  |         </view> | ||
|  |         <view | ||
|  |           class="stock" | ||
|  |           v-if=" | ||
|  |             productModel && | ||
|  |             productModel.detail && | ||
|  |             productModel.detail.specialArea != 13&& | ||
|  |             cid!=30 | ||
|  |           " | ||
|  |         > | ||
|  |           {{ formatNum(achieveTotal) }} | ||
|  |         </view> | ||
|  |         <view | ||
|  |           class="stock" | ||
|  |           v-if=" | ||
|  |             productModel && | ||
|  |             productModel.detail && | ||
|  |             productModel.detail.specialArea == 13 | ||
|  |           " | ||
|  |         > | ||
|  |           BV:{{ formatNum(achieveTotal) }}</view | ||
|  |         > | ||
|  |         <view class="close-btn" @click="closePopup" | ||
|  |           ><text class="icon iconfont icon-guanbi"></text | ||
|  |         ></view> | ||
|  |       </view> | ||
|  |       <view class="body"> | ||
|  |         <!--规格--> | ||
|  |         <view v-if="productModel"> | ||
|  |           <scroll-view | ||
|  |             scroll-y="true" | ||
|  |             class="specs mt20" | ||
|  |             style="max-height: 600rpx" | ||
|  |           > | ||
|  |             <view class="f28">{{ $t("APP_ADD_6") }}</view> | ||
|  |             <view | ||
|  |               class="specs mt20" | ||
|  |               v-for="(item, index) in productModel.specData" | ||
|  |               :key="index" | ||
|  |             > | ||
|  |               <view class="specs-hd p-20-0"> | ||
|  |                 <text class="f28 gray3" | ||
|  |                   >{{ item.productName }} *{{ item.quantity }}</text | ||
|  |                 > | ||
|  |               </view> | ||
|  |               <view class="specs-list"> | ||
|  |                 <view | ||
|  |                   class="table-item" | ||
|  |                   v-for="(pitem, pindex) in item.waresItemsParamsList" | ||
|  |                   :key="pindex" | ||
|  |                 > | ||
|  |                   <view class="flex-1"> | ||
|  |                     <view class="d-c-c ww100 mb10"> | ||
|  |                       <image | ||
|  |                         class="table-item-img" | ||
|  |                         :src="pitem.specCover" | ||
|  |                         mode="" | ||
|  |                       ></image> | ||
|  |                       <view class="table-item-name flex-1 text-ellipsis" | ||
|  |                         >{{ pitem.specsName }} | ||
|  |                       </view> | ||
|  |                     </view> | ||
|  |                     <!-- <view class="gray9">{{$t('fn_105')}}:{{pitem.inventoryNum*1>999?'999+':pitem.inventoryNum*1}}</view> --> | ||
|  |                   </view> | ||
|  |                   <view class="table-num-box d-c-c"> | ||
|  |                     <view @click.stop="Reducenumber(index, pindex)" | ||
|  |                       ><u-icon | ||
|  |                         name="minus-circle-fill" | ||
|  |                         color="#ff9999" | ||
|  |                         size="34rpx" | ||
|  |                       ></u-icon | ||
|  |                     ></view> | ||
|  |                     <view class="flex-1 tc">{{ pitem.number || 0 }}</view> | ||
|  |                     <view @click.stop="Addnumber(index, pindex)" | ||
|  |                       ><u-icon | ||
|  |                         name="plus-circle-fill" | ||
|  |                         color="#FF0000" | ||
|  |                         size="34rpx" | ||
|  |                       ></u-icon | ||
|  |                     ></view> | ||
|  |                   </view> | ||
|  |                 </view> | ||
|  |               </view> | ||
|  |             </view> | ||
|  |           </scroll-view> | ||
|  |         </view> | ||
|  |       </view> | ||
|  |       <view class="btns" | ||
|  |         ><button class="confirm-btn" @click="confirmFunc(form)"> | ||
|  |           {{ $t("N_I_192") }} | ||
|  |         </button></view | ||
|  |       > | ||
|  |     </view> | ||
|  |   </view> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script> | ||
|  | export default { | ||
|  |   data() { | ||
|  |     return { | ||
|  |       /*是否可见*/ | ||
|  |       Visible: false, | ||
|  |       /*表单对象*/ | ||
|  |       form: { | ||
|  |         detail: {}, | ||
|  |         show_sku: { | ||
|  |           sku_image: "", | ||
|  |         }, | ||
|  |       }, | ||
|  |       /*当前商品总库存*/ | ||
|  |       stock: 0, | ||
|  |       /*选择提示*/ | ||
|  |       selectSpec: "", | ||
|  |       /*是否打开过多规格选择框*/ | ||
|  |       isOpenSpec: false, | ||
|  |       borderunitss: "", | ||
|  |       type: "", | ||
|  |       specAttr: "", | ||
|  |       userinfo: {}, | ||
|  |     }; | ||
|  |   }, | ||
|  |   props: ["isPopup", "productModel", "pkCountry", "cid"], | ||
|  |   onLoad() {}, | ||
|  |   mounted() { | ||
|  |     this.borderunitss = uni.getStorageSync("borderUnit"); | ||
|  |     this.getInfo(); | ||
|  |     console.log(this.borderunitss, "this.borderunitss"); | ||
|  |   }, | ||
|  |   computed: { | ||
|  |     achieveTotal: function () { | ||
|  |       let self = this; | ||
|  |       let price = 0; | ||
|  |       if (self.productModel && self.productModel.specData) { | ||
|  |         self.productModel.specData.forEach((item, index) => { | ||
|  |           item.waresItemsParamsList.forEach((pitem, pindex) => { | ||
|  |             if (self.productModel.detail.specialArea == 13) { | ||
|  |               price += pitem.number * pitem.assAchieve; | ||
|  |             } else { | ||
|  |               price += pitem.number * pitem.achieveTotal; | ||
|  |             } | ||
|  |           }); | ||
|  |         }); | ||
|  |       } | ||
|  |       return price; | ||
|  |     }, | ||
|  |     priceTotal: function () { | ||
|  |       let self = this; | ||
|  |       let price = 0; | ||
|  |       if (self.productModel && self.productModel.specData) { | ||
|  |         self.productModel.specData.forEach((item, index) => { | ||
|  |           item.waresItemsParamsList.forEach((pitem, pindex) => { | ||
|  |             price += pitem.number * pitem.price; | ||
|  |           }); | ||
|  |         }); | ||
|  |       } | ||
|  |       return price; | ||
|  |     }, | ||
|  |     priceTotal2: function () { | ||
|  |       let self = this; | ||
|  |       let price2 = 0; | ||
|  |       if (self.productModel && self.productModel.specData) { | ||
|  |         self.productModel.specData.forEach((item, index) => { | ||
|  |           item.waresItemsParamsList.forEach((pitem, pindex) => { | ||
|  |             price2 += pitem.number * pitem.borderPrice; | ||
|  |           }); | ||
|  |         }); | ||
|  |       } | ||
|  |       return price2; | ||
|  |     }, | ||
|  |   }, | ||
|  |   watch: { | ||
|  |     isPopup: function (n, o) { | ||
|  |       let self = this; | ||
|  |       if (n != o) { | ||
|  |         self.Visible = n; | ||
|  |         if (!this.isOpenSpec) { | ||
|  |           self.isOpenSpec = true; | ||
|  |           self.initShowSku(); | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |   }, | ||
|  |   methods: { | ||
|  |     getInfo() { | ||
|  |       let self = this; | ||
|  |       self._get("member/api/member/get-info", {}, (res) => { | ||
|  |         self.userinfo = res.data; | ||
|  |       }); | ||
|  |     }, | ||
|  |     Addnumber(index, pindex) { | ||
|  |       console.log("Addnumber"); | ||
|  |       let self = this; | ||
|  |       let item = self.productModel.specData[index]; | ||
|  |       let num = 0; | ||
|  |       item.waresItemsParamsList.forEach((nitem) => { | ||
|  |         num += nitem.number; | ||
|  |       }); | ||
|  |       console.log(item); | ||
|  |       let pitem = item.waresItemsParamsList[pindex]; | ||
|  |       if (item.quantity <= num) { | ||
|  |         return; | ||
|  |       } | ||
|  |       pitem.number++; | ||
|  |       self.$set(self.productModel.specData, index, item); | ||
|  |     }, | ||
|  |     Reducenumber(index, pindex) { | ||
|  |       console.log("Reducenumber"); | ||
|  |       let self = this; | ||
|  |       let item = self.productModel.specData[index]; | ||
|  |       console.log(item); | ||
|  |       let pitem = item.waresItemsParamsList[pindex]; | ||
|  |       if (pitem.number <= 0) { | ||
|  |         return; | ||
|  |       } | ||
|  |       pitem.number--; | ||
|  |       self.$set(self.productModel.specData, index, item); | ||
|  |     }, | ||
|  |     /*初始化*/ | ||
|  |     initShowSku() { | ||
|  |       let self = this; | ||
|  |       self.isOpenSpec = true; | ||
|  |       // self.productModel.specData.forEach((item, index) => {
 | ||
|  |       // 	item.waresItemsParamsList.forEach((pitem, pindex) => {
 | ||
|  |       // 		if (pindex == 0) {
 | ||
|  |       // 			pitem.number = item.quantity;
 | ||
|  |       // 		} else {
 | ||
|  |       // 			pitem.number = 0;
 | ||
|  |       // 		}
 | ||
|  |       // 	});
 | ||
|  |       // });
 | ||
|  |     }, | ||
|  | 
 | ||
|  |     /*关闭弹窗*/ | ||
|  |     closePopup() { | ||
|  |       this.$emit("close", this.productModel.specData); | ||
|  |     }, | ||
|  | 
 | ||
|  |     /*确认提交*/ | ||
|  |     confirmFunc() { | ||
|  |       if (this.form.productAttributeList != null) { | ||
|  |         for (let i = 0; i < this.form.productSpecArr.length; i++) { | ||
|  |           if (this.form.productSpecArr[i] == null) { | ||
|  |             uni.showToast({ | ||
|  |               title: this.$t("w_0126"), | ||
|  |               icon: "none", | ||
|  |               duration: 2000, | ||
|  |             }); | ||
|  |             return; | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |       let flag = true; | ||
|  |       this.productModel.specData.forEach((item, index) => { | ||
|  |         let num = 0; | ||
|  |         item.waresItemsParamsList.forEach((witem) => { | ||
|  |           num += witem.number; | ||
|  |         }); | ||
|  |         if (num != item.quantity) { | ||
|  |           flag = false; | ||
|  |           return; | ||
|  |         } | ||
|  |       }); | ||
|  |       if (!flag) { | ||
|  |         uni.showToast({ | ||
|  |           title: this.$t("w_0126"), | ||
|  |           icon: "none", | ||
|  |         }); | ||
|  |         return; | ||
|  |       } | ||
|  |       console.log(this.productModel.specData); | ||
|  |       this.$emit("addCart", this.productModel.specData); | ||
|  |     }, | ||
|  | 
 | ||
|  |     /*加入购物车*/ | ||
|  |     addCart() { | ||
|  |       let self = this; | ||
|  |       let total_num = self.form.show_sku.sum; | ||
|  |       let product_num = this.form.show_sku.sum; | ||
|  |       let productStockId = this.form.show_sku.productStockId; | ||
|  |       if (self.form.detail.spec_type == 20 && productStockId == 0) { | ||
|  |         uni.showToast({ | ||
|  |           title: self.$t("w_0126"), | ||
|  |           icon: "none", | ||
|  |           duration: 2000, | ||
|  |         }); | ||
|  |         return false; | ||
|  |       } | ||
|  |       let params = Object.assign({}, self.form.detail, { | ||
|  |         shoppingid: "", | ||
|  |         sszq: "", | ||
|  |         num: self.form.show_sku.sum, | ||
|  |         productStockId: self.form.show_sku.productStockId, | ||
|  |         xh: 1, | ||
|  |       }); | ||
|  |       self.h_post("api/addShopping", params, function (res) { | ||
|  |         uni.showToast({ | ||
|  |           title: res.msg, | ||
|  |           duration: 2000, | ||
|  |         }); | ||
|  |         self.$emit("close", null, res.data.cart_total_num); | ||
|  |       }); | ||
|  |     }, | ||
|  | 
 | ||
|  |     /*创建订单*/ | ||
|  |     createdOrder() { | ||
|  |       let self = this; | ||
|  |       let product_num = this.form.show_sku.sum; | ||
|  |       let productStockId = this.form.show_sku.productStockId; | ||
|  |       this.form.show_sku.quantity = product_num; | ||
|  |       this.form.show_sku.product_attr = this.specAttr || ""; | ||
|  |       this.form.show_sku.product_image = this.form.show_sku.sku_image || ""; | ||
|  |       uni.setStorageSync("to_buy", [this.form.show_sku]); | ||
|  |       let jsonarray = [ | ||
|  |         { | ||
|  |           productId: this.form.detail.pkid, | ||
|  |           productStockId: productStockId, | ||
|  |           quantity: product_num, | ||
|  |         }, | ||
|  |       ]; | ||
|  |       uni.setStorageSync("to_buy_confirm", jsonarray); | ||
|  |       this.gotoPage( | ||
|  |         "/pages/order/confirm-order?order_type=buy&specialAreaId=" + | ||
|  |           this.form.specialAreaId | ||
|  |       ); | ||
|  |     }, | ||
|  |   }, | ||
|  | }; | ||
|  | </script> | ||
|  | 
 | ||
|  | <style lang="scss"> | ||
|  | .product-popup { | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .popup-bg { | ||
|  |   position: fixed; | ||
|  |   top: 0; | ||
|  |   right: 0; | ||
|  |   bottom: 0; | ||
|  |   left: 0; | ||
|  |   background: rgba(0, 0, 0, 0.6); | ||
|  |   z-index: 99; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .main { | ||
|  |   position: fixed; | ||
|  |   width: 100%; | ||
|  |   bottom: 0; | ||
|  |   min-height: 200rpx; | ||
|  |   // max-height: 1050rpx;
 | ||
|  |   background-color: #fff; | ||
|  |   transform: translate3d(0, 980rpx, 0); | ||
|  |   transition: transform 0.2s cubic-bezier(0, 0, 0.25, 1); | ||
|  |   // bottom: env(safe-area-inset-bottom);
 | ||
|  |   z-index: 99; | ||
|  |   border-radius: 12rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup.open .main { | ||
|  |   transform: translate3d(0, 0, 0); | ||
|  |   z-index: 99; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup.close .popup-bg { | ||
|  |   display: none; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup.close .main { | ||
|  |   display: none; | ||
|  |   z-index: -1; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .header { | ||
|  |   height: 200rpx; | ||
|  |   padding: 40rpx 0 10rpx 250rpx; | ||
|  |   position: relative; | ||
|  |   border-bottom: 1px solid #eeeeee; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .header .avt { | ||
|  |   position: absolute; | ||
|  |   top: 40rpx; | ||
|  |   left: 30rpx; | ||
|  |   width: 180rpx; | ||
|  |   height: 180rpx; | ||
|  |   border: 2px solid #ffffff; | ||
|  |   background: #ffffff; | ||
|  |   border-radius: 12rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .header .stock { | ||
|  |   font-size: 26rpx; | ||
|  |   color: #999999; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .close-btn { | ||
|  |   position: absolute; | ||
|  |   width: 40rpx; | ||
|  |   height: 40rpx; | ||
|  |   top: 40rpx; | ||
|  |   right: 30rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .price { | ||
|  |   color: #333333; | ||
|  |   font-weight: bold; | ||
|  |   font-size: 24rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .price .num { | ||
|  |   padding: 0 4rpx; | ||
|  |   font-size: 40rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .old-price { | ||
|  |   margin-left: 10rpx; | ||
|  |   font-size: 26rpx; | ||
|  |   color: #999999; | ||
|  |   text-decoration: line-through; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .body { | ||
|  |   padding: 20rpx 30rpx 39rpx 30rpx; | ||
|  |   // max-height: 600rpx;
 | ||
|  |   overflow-y: auto; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .level-box { | ||
|  |   display: flex; | ||
|  |   justify-content: space-between; | ||
|  |   align-items: center; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .level-box .key { | ||
|  |   font-size: 24rpx; | ||
|  |   color: #999999; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .level-box .icon-box { | ||
|  |   width: 48rpx; | ||
|  |   height: 40rpx; | ||
|  |   background: #eee; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .num-wrap .iconfont { | ||
|  |   color: #666; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .num-wrap.no-stock .iconfont { | ||
|  |   color: #cccccc; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .level-box .text-wrap { | ||
|  |   margin: 0 4rpx; | ||
|  |   height: 60rpx; | ||
|  |   border: none; | ||
|  |   background: #ffffff; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .level-box .text-wrap input { | ||
|  |   padding: 0 10rpx; | ||
|  |   height: 60rpx; | ||
|  |   line-height: 60rpx; | ||
|  |   width: 80rpx; | ||
|  |   font-size: 32rpx; | ||
|  |   text-align: center; | ||
|  | } | ||
|  | 
 | ||
|  | .specs .specs-list { | ||
|  |   display: flex; | ||
|  |   justify-content: flex-start; | ||
|  |   align-items: center; | ||
|  |   flex-wrap: wrap; | ||
|  | } | ||
|  | 
 | ||
|  | .specs .specs-list button { | ||
|  |   margin-right: 10rpx; | ||
|  |   margin-bottom: 10rpx; | ||
|  |   font-size: 24rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .specs .specs-list button:after, | ||
|  | .product-popup .btns button, | ||
|  | .product-popup .btns button:after { | ||
|  |   height: 72rpx; | ||
|  |   line-height: 72rpx; | ||
|  |   border: 0; | ||
|  |   border-radius: 0; | ||
|  |   margin-bottom: 55rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .product-popup .btns .confirm-btn { | ||
|  |   width: 710rpx; | ||
|  |   height: 80rpx; | ||
|  |   background-color: #fb3024; | ||
|  |   border-radius: 40rpx; | ||
|  |   margin: 0 auto; | ||
|  |   margin-bottom: 55rpx; | ||
|  |   color: #ffffff; | ||
|  |   line-height: 80rpx; | ||
|  |   font-size: 32rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .btn-checked { | ||
|  |   border: 1rpx solid; | ||
|  |   color: #fff; | ||
|  |   border-color: #fb3024; | ||
|  |   border-radius: 6rpx; | ||
|  |   font-size: 28rpx; | ||
|  |   background-color: #fb3024; | ||
|  | } | ||
|  | 
 | ||
|  | .btn-checke { | ||
|  |   border: 1rpx solid #f6f6f6; | ||
|  |   border-radius: 6rpx; | ||
|  |   font-size: 28rpx; | ||
|  |   color: #333333; | ||
|  |   background-color: #f6f6f6; | ||
|  | } | ||
|  | 
 | ||
|  | .table-item { | ||
|  |   width: 704rpx; | ||
|  |   min-height: 68rpx; | ||
|  |   background: #f6f6f6; | ||
|  |   border-radius: 10rpx; | ||
|  |   display: flex; | ||
|  |   justify-content: center; | ||
|  |   align-items: center; | ||
|  |   padding: 9rpx 23rpx 9rpx 17rpx; | ||
|  |   box-sizing: border; | ||
|  |   margin-bottom: 15rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .table-item-img { | ||
|  |   display: block; | ||
|  |   flex-shrink: 0; | ||
|  |   width: 50rpx; | ||
|  |   height: 50rpx; | ||
|  |   margin-right: 17rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .table-item-name { | ||
|  |   font-size: 28rpx; | ||
|  |   color: #333; | ||
|  | } | ||
|  | 
 | ||
|  | .table-num-box { | ||
|  |   width: 168rpx; | ||
|  |   height: 50rpx; | ||
|  |   background: #ffffff; | ||
|  |   margin-left: 20rpx; | ||
|  |   border-radius: 50rpx; | ||
|  |   padding: 0 9rpx; | ||
|  |   box-sizing: border-box; | ||
|  | } | ||
|  | 
 | ||
|  | .icon.icon-guanbi { | ||
|  |   color: #424242; | ||
|  |   font-size: 26rpx; | ||
|  | } | ||
|  | </style> |