123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- <template>
- <view
- class="o-h c-bg-f o-plr-30 singleByeIdx"
- >
- <view class="o-h l-f l-flex-d l-flex-j-b ">
- <view class="l-flex-center o-mt-50 l-flex-3">
- <u--image
- :width="GETT_miniProduct.includes(GETT_singleBye_shopCarts.imgId) ? '500rpx' : '450rpx'"
- :height="GETT_miniProduct.includes(GETT_singleBye_shopCarts.imgId) ? '500rpx' : '450rpx'"
- mode="aspectFit"
- :lazy-load="true"
- :fade="true"
- duration="450"
- :src="GETT_singleBye_shopCarts.imgUrl"
- >
- <view slot="error" style="font-size: 24rpx;">加载失败</view>
- </u--image>
- </view>
- <view class="l-f l-flex-d l-flex-center l-flex-1 chgUNumBox">
- <u-number-box
- button-size="48"
- v-model="GETT_singleBye_shopCarts.nums"
- @change="
- e => {
- numsChg(e, GETT_singleBye_shopCarts);
- }
- "
- disabledInput
- @minus="
- e => {
- goodMinus(e, GETT_singleBye_shopCarts);
- }
- "
- @plus="
- e => {
- goodPlus(e, GETT_singleBye_shopCarts);
- }
- "
- ></u-number-box>
- <u-button :customStyle="{marginTop:'20px'}" @click="discountClk" type="primary" shape="circle" text="添加优惠码"></u-button>
- </view>
- <view class="l-flex-1 l-f l-flex-d l-flex-j-e">
- <view class="o-mt-30 l-flex-between">
- <u-button @click="toIndex" plain shape="circle" type="primary" text="购买更多"></u-button>
- <view style="flex:0 0 120px;">
- <view class="c-color-1 c-text-14">
- 合计:
- <text class="c-text-14 c-color-MR">¥{{ priceList.totalPrice }}</text>
- </view>
- <view class="c-color-1 c-text-14 o-mr-14">
- 已优惠:
- <text class="c-text-14 c-color-MR">¥{{ priceList.discountPrices }}</text>
- </view>
- <!-- 如果优惠券总金额大于0,则显示预估到手价 -->
- <view v-if="GETT_home_totalCoupon > 0" class="c-text-12 c-color-f l-flex-RC" style="color:#ff9900;">
- <view class="c-text-14">预估到手:</view>
- <view class="c-text-14" style="color:#f45632;">
- ¥{{ compEstiPrice(priceList.totalPrice) }}
- </view>
- </view>
- <view class=""><u--text @click="amountClk" size="14" type="primary" text="查看明细"></u--text></view>
- </view>
- <u-button v-if="GETT_loginInfos.phone" @click="toPayPop" throttleTime="2000" type="primary" shape="circle" text="去支付"></u-button>
- <!-- :text="`去支付(¥${GETT_singleBye_shopCarts.totalPrice})`" -->
- <u-button v-else open-type="getPhoneNumber" @getphonenumber="getPhone" type="primary" shape="circle" text="去支付"></u-button>
- </view>
- </view>
- </view>
- <!-- 金额明细弹窗 -->
- <k-amountPop ref="kAmountPopRef"></k-amountPop>
- <!-- 优惠码弹窗 -->
- <k-discountPop ref="kDiscountPopRef"></k-discountPop>
- <!-- 支付弹窗 -->
- <k-payPop ref="kPayPopRef"></k-payPop>
- <!-- 支付提示弹窗 -->
- <u-modal @confirm="payShow = false" :show="payShow" title="提示" :content="payContent"></u-modal>
- <!-- 优惠券弹窗 -->
- <k-coupon ref="kCouponRef"></k-coupon>
- </view>
- </template>
- <script>
- // 导入优惠券弹窗
- import kCoupon from '@/components/common/k-coupon/index.vue';
- // 导入金额明细弹窗
- import kAmountPop from '@/components/common/k-amountPop/index.vue';
- // 导入优惠码弹窗
- import kDiscountPop from '@/components/common/k-discountPop/index.vue';
- // 导入支付弹窗
- import kPayPop from '@/components/common/k-payPop/index.vue';
- // 导入接口
- import { API_getPhone,API_setDingYue } from '@/common/api.js';
- // 引入辅助函数
- import { mapGetters } from 'vuex';
- export default {
- components: {
- kPayPop,
- kDiscountPop,
- kAmountPop,
- kCoupon
- },
- data() {
- return {
- // 支付提示弹窗
- payShow: false,
- payContent: false
- };
- },
- computed: {
- // 获取vuex中购物车的数据
- $S_tabbar_shopCarts() {
- return this.$M_GS('common', '$S_tabbar_shopCarts');
- },
- // 使用辅助函数
- ...mapGetters(['GETT_miniProduct', 'GETT_loginInfos', 'GETT_clientId', 'GETT_singleBye_shopCarts','GETT_home_couponList', 'GETT_home_totalCoupon']),
- // 选中的总金额
- priceList() {
- const item = this.GETT_singleBye_shopCarts;
- // 总价格
- let totalPrice = 0;
- // 总优惠
- let discountPrices = 0;
- let discountPrice = 0;
- // 计算出每件商品的总优惠
- if (item.discountList && item.discountList.length > 0) {
- discountPrice = item.discountList.reduce((prev, cur) => {
- return this.$M_Big(prev)
- .add(cur)
- .toNumber();
- }, 0);
- }
- // 减去总优惠
- totalPrice = this.$M_Big(totalPrice)
- .add(item.totalPrice)
- .sub(discountPrice)
- .toNumber();
- // 总优惠是
- discountPrices = this.$M_Big(discountPrices)
- .add(discountPrice)
- .toNumber();
- return {
- totalPrice,
- discountPrices
- };
- },
- // 计算预估到手价
- compEstiPrice() {
- return function(totalPrice) {
- const estiPrice = this.$M_Big(totalPrice)
- .sub(this.GETT_home_totalCoupon)
- .toNumber();
- if (estiPrice <= 0) return 0.01;
- return estiPrice;
- };
- }
- },
- onLoad() {
- uni.setNavigationBarTitle({
- title: this.GETT_singleBye_shopCarts.imgName
- });
- },
- methods: {
- // 点击商品+
- goodPlus(e, row) {
- this.handleCar(e, row, 1);
- },
- // 点击商品-
- goodMinus(e, row) {
- this.handleCar(e, row, 2);
- },
- // 点击数量的+-
- numsChg(e, row) {
- // 增加用户体验
- uni.showLoading({
- title: '请稍等'
- });
- setTimeout(() => {
- uni.hideLoading();
- }, 200);
- this.handleCar(e, row, 3);
- },
- // 处理购物车数据
- handleCar(e, row, idx) {
- switch (idx) {
- // 给优惠码和优惠价的列表添加一个0值
- case 1:
- row.codeList.push(0);
- row.discountList.push(0);
- break;
- // 去掉优惠码和优惠价的列表的最后一个
- case 2:
- row.codeList.pop();
- row.discountList.pop();
- break;
- // 找到购物车数据对应商品的,重新计算总价格
- case 3:
- row.nums = e.value;
- row.totalPrice = this.$M_Big(row.goodsPrice)
- .mul(row.nums)
- .toNumber();
- break;
- }
- this.$M_Cm('MUTA_SINGSHOPCARTS', row);
- },
- // 点击查看明细
- amountClk() {
- console.log(this.GETT_singleBye_shopCarts, 'this.GETT_singleBye_shopCarts');
- this.$refs.kAmountPopRef.popOpen({}, this.priceList);
- },
- // 点击优惠码
- discountClk() {
- this.$refs.kDiscountPopRef.popOpen(this.GETT_singleBye_shopCarts, 2);
- },
- // 获取手机号
- async getPhone(e) {
- const { code } = e.detail;
- // 如果用户点击允许获取手机号
- if (!!code) {
- let param = {
- code,
- id: this.GETT_loginInfos.id
- };
- // 调用获取手机号的接口
- let res = await API_getPhone(param);
- // 把手机号信息存到vuex里面
- await this.$M_Cm('MUTA_GETOPENID', res);
- }
- this.toPayPop();
- },
- // 点击支付按钮
- toPayPop() {
- //询问是否订阅取餐通知
- this.dingyue();
- console.log('单个商品', this.GETT_singleBye_shopCarts);
- // 如果是一件商品,那么要给优惠码加个0
- if(this.GETT_singleBye_shopCarts.nums === 1){
- // 如果没有优惠码
- if(this.GETT_singleBye_shopCarts.codeList.length===0){
- this.GETT_singleBye_shopCarts.codeList = [0];
- }
- }
- // 规定支付的商品数量不能超过5
- if (this.GETT_singleBye_shopCarts.nums > 5) {
- this.payContent = '支付商品的数量不能超过5件,请减少数量后,重新支付!!!';
- this.payShow = true;
- return;
- }
- let shopCarts = {};
- shopCarts[this.GETT_singleBye_shopCarts['imgId']] = this.GETT_singleBye_shopCarts;
- const payParam = {
- shopCarts,
- clientId: this.GETT_clientId,
- id: this.GETT_loginInfos.id
- };
- // 如果有优惠券要提醒用户去选择优惠券
- if (this.GETT_home_couponList.length > 0) {
- uni.showModal({
- title: '提示',
- confirmText: '去使用',
- cancelText: '不使用',
- confirmColor: '#3c9cff',
- content: `当前可使用优惠券${this.GETT_home_couponList.length}张。`,
- success: modelRes => {
- if (modelRes.confirm) {
- // 打开优惠券弹窗
- this.$refs.kCouponRef.popOpen(this.GETT_home_couponList, payParam, 3, this.priceList.totalPrice);
- } else {
- // 显示支付弹窗
- this.$refs.kPayPopRef.popOpen(payParam, 3);
- }
- }
- });
- }else{
- // 显示支付弹窗
- this.$refs.kPayPopRef.popOpen(payParam, 3);
- }
- },
- //询问是否订阅取餐通知
- dingyue(){
- var that = this;
- wx.requestSubscribeMessage({
- tmplIds: ['NVmdaK4MwygT63ME830pwM6wZt4eufxhBr6jlQ2XXJ4'],
- success(res) {
- var status = res.NVmdaK4MwygT63ME830pwM6wZt4eufxhBr6jlQ2XXJ4;
- if(status=='accept'){
- //通知后台该用户订阅了消息
- var id = that.GETT_loginInfos.id;
- API_setDingYue( {id:id} ).then(res => {
- console.log('res', res);
- });
- }
- console.log('授权成功');
- }
- })
- },
- // 加入购物车
- addCart() {
- let row = this.GETT_singleBye_shopCarts;
- // 加入购物车初始状态都是选中状态
- row['isCheck'] = true;
- // 获取vuxe购物车数据
- let shopCarts = this.$S_tabbar_shopCarts;
- // 如果不存在imgId这个属性,则创建
- if (!shopCarts[row['imgId']]) {
- // $M_Big用来计算总数量的方法(具体用法请看common)
- row['totalPrice'] = this.$M_Big(row['goodsPrice'])
- .mul(row['nums'])
- .toNumber();
- // 用$M_Extend继承row创建新对象并赋值给shopCarts的属性
- shopCarts[row['imgId']] = this.$M_Extend(row, {
- nums: row['nums']
- });
- } else {
- shopCarts[row['imgId']]['codeList'] = shopCarts[row['imgId']]['codeList'].concat(row.codeList);
- shopCarts[row['imgId']]['discountList'] = shopCarts[row['imgId']]['discountList'].concat(row.discountList);
- // 如果存在imgId这个属性,则数量+1,总数totalPrice=价格goodsPrice*数量nums
- let nums = shopCarts[row['imgId']]['nums'] + row['nums'];
- // $M_Big用来计算总数量的方法(具体用法请看common)
- row['totalPrice'] = this.$M_Big(row['goodsPrice'])
- .mul(nums)
- .toNumber();
- shopCarts[row['imgId']] = this.$M_Extend(row, {
- nums
- });
- }
- console.log('shopCarts', shopCarts);
- // 修改vuex购物车数据
- this.$M_Dp('ACTI_SHOPCARTS', shopCarts);
- // 处理优惠码集合
- this.handleDiscList();
- },
- handleDiscList() {
- // 获取购物车数据
- let shopCarts = this.GETT_singleBye_shopCarts;
- let codes = [];
- // 重新组合优惠码
- codes = [...new Set(codes.concat(shopCarts['codeList']))];
- // 储存优惠码,用来校验重复问题
- this.$M_Cm('MUTA_DISCOUNTCODE', codes);
- },
- // 去首页
- toIndex() {
- this.addCart();
- this.$M_Back();
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- .singleByeIdx {
- padding-bottom: constant(safe-area-inset-bottom);
- padding-bottom: env(safe-area-inset-bottom);
- }
- </style>
|