cart.js 4.17 KB
'use strict';

const _ = require('lodash');
const api = global.yoho.api;
const helpers = global.yoho.helpers;
const paymentProcess = require(global.utils + '/payment-process');

/**
 * 购物车结算
 * doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
 * @param int $uid 用户ID
 * @param string $cartType 购物车类型,ordinary表示普通购物车
 * @param int $isUseYohoCoin 是否使用有货币,0不使用, 1使用
 * @param string $skuList 购买限购商品时需要传递的参数
 * @return array 接口返回的数据
 */
function cartPayAPI(uid, cartType, isUseYohoCoin, skuList) {
    let param = {
        method: 'app.Shopping.payment',
        enable_red_envelopes: 0, // h5不返回红包
        cart_type: cartType,
        yoho_coin_mode: isUseYohoCoin,
        uid: uid
    };

    // 购买限购商品时需要传递product_sku_list参数
    if (!_.isEmpty(skuList)) {
        param.product_sku_list = skuList;
    }

    return api.get('', param);
}


/**
 * 购物车结算--支付方式和配送方式选择以及是否使用有货币接口返回的数据处理
 * doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
 * @param int $uid 用户ID
 * @param string $cartType 购物车类型,ordinary表示普通购物车
 * @param int $deliveryWay 配送方式,1表示普通快递,2表示顺丰速运
 * @param int $paymentType 支付方式,1表示在线支付,2表示货到付款
 * @param string $couponCode 优惠券码
 * @param mixed $yohoCoin 使用的有货币数量
 * @param string $skuList 购买限购商品时需要传递的参数
 * @return array 接口返回的数据
 */
function orderComputeAPI(uid, cartType, deliveWay, paymentType, couponCode, yohoCoin, skuList) {
    let param = {
        method: 'app.Shopping.compute',
        cart_type: cartType,
        delive_way: deliveWay,
        payment_type: paymentType
    };

    if (couponCode) {
        param.coupon_code = couponCode;
    }

    if (yohoCoin) {
        param.use_yoho_coin = yohoCoin;
    }

    if (!_.isEmpty(skuList)) {
        param.product_sku_list = skuList;
    }

    return api.get('', param);
}


/**
 * 调用购物车结算接口返回的数据处理
 *
 *
 *
 * @param int $uid 用户ID
 * @param string $cartType 购物车类型,ordinary表示普通购物车
 * @param array $orderInfo cookie中记录的一些订单有关数据
 * @param string $limitProductCode 限购商品码,用户限购商品购买
 * @param string $sku 商品sku,用于限购商品购买
 * @param stirng $skn 商品skn,用于限购商品购买
 * @param int $buyNumber 购买商品数目,用户限购商品支付
 * @param bool $isAjax 是否是异步请求
 * @return array 接口返回的数据
 */
exports.cartPay = (uid, cartType, orderInfo, limitProductCode, sku, skn, buyNumber, isAjax) => {
    isAjax = isAjax || false;

    let result = {};
    let skuList = [];
    let isLimitGoods = skn && sku && buyNumber; // 存在sku, skn 和buyNumber时为限购商品
    let orderCompute;

    if (isLimitGoods) {
        skuList.push({
            type: 'limitcode',
            limitproductcode: limitProductCode,
            buy_number: buyNumber,
            skn,
            sku
        });

        result.isLimit = true;
    }

    // cookie保存的数据
    if (!_.isEmpty(orderInfo)) {
        orderInfo.paymentType = orderInfo.paymentType ? orderInfo.paymentType : '';
        orderCompute = orderComputeAPI(
            uid,
            cartType,
            orderInfo.deliveryId,
            orderInfo.paymentType,
            orderInfo.couponCode,
            orderInfo.yohoCoin, skuList
        );
    }

    return cartPayAPI(uid, cartType, 0, skuList)
        .then(pay => {
            let goodsList = _.get(pay, 'data.goods_list', []);

            if (_.isEmpty(goodsList)) {
                if (isLimitGoods) {
                    result.error = true;
                    result.message = pay.message;
                } else {
                    result.cartUrl = helpers.urlFormat('/cart/index/new');
                }

                return pay;
            }

            return paymentProcess.tranformPayment(pay.data, orderInfo);
        });
};