order-ensure.js 10.2 KB
/**
 * 订单确认
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2015/11/12
 */

var $ = require('jquery'),
    lazyLoad = require('yoho.lazyload'),
    tip = require('../plugin/tip'),
    loading = require('../plugin/loading'),
    order = require('./order-info');

var $invoice = $('.invoice'),
    $couponUse = $('.coupon-use.used'),
    $addressWrap = $('.address-wrap'),
    $coinCheck = $('.coin-check'),
    $coinUsed = $('.coin .used'),
    $subBlock = $('.sub-block'),
    payType,
    queryString = $.queryString(),
    orderInfo = order.orderInfo,
    isSubmiting,
    dispatchInfo,
    total;

require('../common');

lazyLoad();

function getQueryParam() {
    var queryArray = location.search.substr(1).split('&'),
        i,
        subArr = [],
        obj = {};

    for (i = 0; i < queryArray.length; i++) {
        subArr = queryArray[i].split('=');
        obj[subArr[0]] = subArr[1];
        subArr = [];
    }

    return obj;
}

function isLimitGood() {
    return getQueryParam().limitproductcode;
}


if (window.getUid() !== orderInfo('uid')) {
    order.init();
    window.location.reload();
}

if ($couponUse.data('name') !== orderInfo('couponName')) {
    orderInfo('couponCode', null);
    orderInfo('couponName', null);
}

// 来自购物车的链接默认不使用优惠券
if (document.referrer && document.referrer.indexOf('/cart/index/index') !== -1) {
    orderInfo('couponCode', null);
    orderInfo('couponName', null);
}

isLimitGood() && (function() {
    var a = [];

    var data = getQueryParam();

    data.type = 'limitcode';

    a.push(data);
    orderInfo('skuList', JSON.stringify(a));
    orderInfo('limitUrlSufix', location.search);
})();

if (queryString.cartType || queryString.carttype || !orderInfo('cartType')) {
    orderInfo('cartType', queryString.cartType || queryString.carttype || 'ordinary');
}

// function dispacthTapEvt(e) {
//     var $cur = $(e.target).closest('li');

//     if ($cur.length === 0 || $cur.hasClass('chosed')) {
//         return;
//     }

//     $cur.siblings('li.chosed').removeClass('chosed');
//     $cur.addClass('chosed');
// }

$('.checkbox').on('touchstart', function() {
    var $this = $(this);

    if ($this.hasClass('icon-cb-radio')) {
        $this.removeClass('icon-cb-radio').addClass('icon-radio');
        return;
    }
    if ($this.hasClass('icon-radio')) {
        $this.removeClass('icon-radio').addClass('icon-cb-radio');
    }
});

$invoice.on('touchend', '.checkbox', function() {
    var $this = $(this);

    if ($this.hasClass('icon-cb-radio')) {
        $invoice.addClass('focus');
    }
    if ($this.hasClass('icon-radio')) {
        $invoice.removeClass('focus');
    }
});

function orderCompute() {
    var yohoCoin = orderInfo('yohoCoin');

    loading.showLoadingMask();
    $.ajax({
        method: 'POST',
        url: '/cart/index/orderCompute',
        data: {
            cartType: orderInfo('cartType') || 'ordinary',
            deliveryId: orderInfo('deliveryId'),
            paymentTypeId: orderInfo('paymentTypeId'),
            couponCode: orderInfo('couponCode'),
            yohoCoin: yohoCoin,
            skuList: isLimitGood() ? orderInfo('skuList') : undefined
        }
    }).then(function(res) {
        if ($.type(res) !== 'object') {
            window.location.reload();
        } else {
            if (typeof res.last_order_amount !== undefined) {
                res.last_order_amount = (+res.last_order_amount).toFixed(2);
            }
            if (res.use_yoho_coin) {
                $coinCheck.find('em').html('- ¥ ' + res.use_yoho_coin);
                $coinUsed.html('已抵¥' + res.use_yoho_coin);
                $coinCheck.find('em').show();
                $coinUsed.show();
            }
            total = '';
            if (res.promotion_formula_list) {
                $.each(res.promotion_formula_list, function(index, value) {
                    total += '<li>' +
                            '<p>' + value.promotion + '</p>' +
                            '<span>' + value.promotion_amount + '</span>' +
                            '</li>';
                });
                $('.price-cost span').html('¥' + res.last_order_amount);
                $('.bill span').html('¥' + res.last_order_amount);
                $('.total').html(total);
            }
        }
    }).fail(function() {
        window.location.reload();
    }).always(function() {
        loading.hideLoadingMask();
    });
}

function submitOrder() {
    var invoiceText = $invoice.find('[name="invoice-title"]').val() || orderInfo('invoiceText'),
        msg = $('#msg').find('input').val() || orderInfo('msg');

    if (isSubmiting) {
        return false;
    }
    if (orderInfo('invoice')) {
        if (!invoiceText) {
            tip.show('请输入发票抬头');
            return;
        }
        if (invoiceText.length > 30) {
            tip.show('发票抬头不得超过30个汉字');
            return;
        }
    }
    if (msg) {
        if (msg.length > 40) {
            tip.show('留言不得超过40个汉字');
            return;
        }
    }
    loading.showLoadingMask();
    isSubmiting = true;
    $.ajax({
        method: 'POST',
        url: '/cart/index/orderSub',
        data: {
            addressId: orderInfo('addressId'),
            cartType: orderInfo('cartType') || 'ordinary',
            deliveryId: orderInfo('deliveryId'),
            deliveryTimeId: orderInfo('deliveryTimeId'),
            invoiceText: orderInfo('invoice') ? invoiceText : null,
            invoiceType: orderInfo('invoice') ? ($invoice.find('.invoice-type').val() ||
                orderInfo('invoiceType')) : null,
            msg: msg,
            paymentTypeId: orderInfo('paymentTypeId'),
            paymentType: orderInfo('paymentType'), //支付方式
            couponCode: orderInfo('couponCode'),
            yohoCoin: orderInfo('yohoCoin'),
            skuList: isLimitGood() ? orderInfo('skuList') : undefined

        }
    }).then(function(res) {
        var url;

        if (!res) {
            tip.show('系统繁忙,请稍后再试!');
            return;
        }
        if (res.code === 200) {
            if (payType === 2) {

                // 货到付款的进入订单页面
                url = '/home/orderDetail?order_code=' + res.data.order_code;
            } else {
                url = '/home/orders/pay?order_code=' + res.data.order_code;
            }
            window.setCookie('order-info', '');
            window.location.href = url;
        } else if (res.message) {
            tip.show(res.message);
        }
    }).fail(function() {
        tip.show('系统繁忙,请稍后再试!');
    }).always(function() {
        isSubmiting = false;
        loading.hideLoadingMask();
    });
}

// 界面点击,状态存 cookie
if (!orderInfo('addressId')) {
    orderInfo('addressId', $addressWrap.data('id'));
}

$('.delivery-id').on('touchend', 'li', function() {
    orderInfo('deliveryId', $(this).data('id'));
    orderCompute();
});

$('.payment-type').on('touchend', 'li', function() {
    orderInfo('paymentType', $('.icon-cb-radio', this).data('id'));
});

$('.dispatch-time').on('touchend', 'li', function() {
    orderInfo('deliveryTimeId', $(this).data('id'));
});

$('.coin').on('touchend', function() {
    var $this = $(this);

    if ($this.find('.checkbox').hasClass('icon-cb-radio')) {
        orderInfo('yohoCoin', $this.data('yoho-coin'));
        $this.find('.can-use').hide();
    } else {
        orderInfo('yohoCoin', 0);
        $this.find('.coin-check em').hide();
        $this.find('.can-use').show();
        $this.find('.used').hide();
    }
    orderCompute();
});

$invoice.on('touchend', '.checkbox', function(e) {
    var $this = $(this);

    orderInfo('invoice', $this.hasClass('icon-cb-radio'));
    e.preventDefault();
    e.stopPropagation();
});

$invoice.find('[name="invoice-title"]').on('blur', function() {
    orderInfo('invoiceText', $(this).val());
}).end().find('.invoice-type').on('change', function() {
    orderInfo('invoiceType', $(this).val());
});

$('#msg').find('textarea').on('blur', function() {
    orderInfo('msg', $(this).val());
});

$('.pay-mode').on('click', 'li', function() {
    var $this = $(this);

    orderInfo('paymentTypeId', $this.data('pay-id'));
    orderInfo('paymentType', $this.data('pay-type'));
    payType = $this.data('pay-type');
});

$('form').on('submit', function() {
    return false;
});

// xwg 2016/3/21 13:22
$('.dispatch').on('touchend', 'h3', function() {
    if ($(this).siblings('ul').is(':hidden')) {
        $('.dispatch h3').removeClass('border-none');
        $(this).addClass('border-none');
        $('.down').removeClass('hide');
        $('.up').addClass('hide');
        $('.up', this).removeClass('hide');
        $('.down', this).addClass('hide');
        $('.dispatch ul').hide();
        $(this).siblings('ul').show();
    } else {
        $(this).removeClass('border-none');
        $('.down', this).removeClass('hide');
        $('.up', this).addClass('hide');
        $(this).siblings('ul').hide();
    }
});

$subBlock.on('touchstart', 'li', function() {
    $.each($(this).parents('ul').find('i'), function() {
        $(this).parents('ul').find('i').removeClass('icon-cb-radio').addClass('icon-radio');
    });
    $(this).parents('ul').hide();
    $('.down').removeClass('hide');
    $('.up').addClass('hide');
    $('.dispatch h3').removeClass('border-none');
    dispatchInfo = $(this).find('span').html();
    $(this).parents('.sub-block').find('h3 span').html(dispatchInfo);
    if ($(this).find('i').hasClass('icon-cb-radio')) {
        $(this).find('i').addClass('icon-radio');
    } else if ($(this).find('i').hasClass('icon-radio')) {
        $(this).find('i').addClass('icon-cb-radio');
    }
});


$('.bill a').on('touchstart', function() {
    orderInfo('paymentTypeId', $('.delivery-id .icon-cb-radio').data('id'));
    orderInfo('paymentType', $('.payment-type .icon-cb-radio').data('id'));

    payType = $('.payment-type .icon-cb-radio').data('id');
    submitOrder();
});

function phoneHidden(phone) {
    return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
}

$('.info-phone').html(phoneHidden($('.info-phone').html()));

if (orderInfo('address') && orderInfo('address').is_support === 'N') {
    orderInfo('deliveryId', $('.delivery-id .icon-cb-radio').data('id'));
    orderCompute();
}