shopping.js 8.2 KB
'use strict';
const _ = require('lodash');
const api = global.yoho.API;

/**
 * 购物车结算
 * 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 see doc
 */
exports.cartPayAPI = (uid, cartType, isUseYohoCoin, skuList, activityInfo) => {
    if (!activityInfo) {
        activityInfo = null;
    }

    let param = {
        method: activityInfo ? 'app.Shopping.easyPayment' : '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 = JSON.stringify(skuList);
    }

    // 购买套装和量贩商品时数据处理
    if (activityInfo) {
        param.activity_id = activityInfo.activity_id;
        param.product_sku_list = JSON.stringify(activityInfo.product_sku_list);
    }

    return api.get('', param, {cache: false});
};

/**
 * 购物车结算--支付方式和配送方式选择以及是否使用有货币接口返回的数据处理
 * 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 see doc
 *
 *
 * Note:
 *  1. 大多数情况下,调用完此接口,请显示的调用 utils/payment-process.js@yohoCoinCompute;
 *  2. 除非同时调用app.Shopping.payment 与该接口,用改接口的data值替换app.Shopping.payment相关值,
 *  显示调用utils/payment-process.js@tranformPayment(他会帮你调yohoCoinCompute)处理payment的data;
 */
exports.orderComputeAPI = (uid, cartType, deliveWay, paymentType, couponCode, yohoCoin, skuList, activityInfo) => {
    if (!activityInfo) {
        activityInfo = null;
    }

    let param = {
        method: activityInfo ? 'app.Shopping.easyCompute' : 'app.Shopping.compute',
        cart_type: cartType,
        delivery_way: deliveWay,
        payment_type: paymentType,
        uid: uid
    };

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

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

    if (!_.isEmpty(skuList) && !activityInfo) {
        param.product_sku_list = JSON.stringify(skuList);
    }

    // 购买套餐商品需要的数据
    if (activityInfo) {
        param.activity_id = activityInfo.activity_id;
        param.product_sku_list = JSON.stringify(activityInfo.product_sku_list);
    }

    return api.get('', param, {code: 200});
};

/**
 * 校验电子票
 * @param int $uid
 * @param int $productSku
 * @param int $buyNumber
 * @param int $useYohoCoin
 * @param bool|int $yohoCoinMode 1:使用有货币;0:不使用有货币
 * @return array
 * @author sefon 2016-7-2 18:12:30
 */
exports.checkTickets = (uid, productSku, buyNumber, useYohoCoin, yohoCoinMode) => {
    if (!useYohoCoin) {
        useYohoCoin = 0;
    }

    if (!yohoCoinMode) {
        yohoCoinMode = true;
    }

    let params = {
        method: 'app.shopping.ticket',
        uid: uid,
        product_sku: productSku,
        buy_number: buyNumber,
        use_yoho_coin: useYohoCoin
    };

    if (!yohoCoinMode) {
        _.assign(params, {
            yoho_coin_mode: 0
        });
    }

    return api.get('', params, {code: 200});
};

/**
 * 购物车结算--提交结算信息
 *
 * @param int $uid 用户ID
 * @param int $addressId 地址ID
 * @param int $cartType 购物车类型ID
 * @param int $deliveryTime 寄送时间ID
 * @param int $deliveryWay 寄送方式ID
 * @param array $invoices 发票参数数组
 * @param int $paymentId 支付方式ID
 * @param int $paymentType 支付类型ID
 * @param string $remark 留言
 * @param string $couponCode 优惠券码
 * @param mixed $yohoCoin 使用的有货币数量或为空
 * @param string $skuList 购买限购商品时需要传递的参数
 * @param string|null $userAgent 联盟过来用户下单时需要的User-Agent信息
 * @param $times
 * @param null $activityInfo 套餐信息
 * @param @param otherParams 其他参数
 * @return array 接口返回的数据
 */
exports.orderSub = (uid, addressId, cartType, deliveryTime,
    deliveryWay, invoices, paymentId, paymentType, remark, couponCode,
    yohoCoin, skuList, times, activityInfo, otherParams) => {
    if (!activityInfo) {
        activityInfo = null;
    }

    let params = {
        method: activityInfo ? 'app.Shopping.easySubmit' : 'app.Shopping.submit',
        address_id: addressId,
        cart_type: cartType,
        delivery_time: deliveryTime,
        delivery_way: deliveryWay,
        payment_id: paymentId,
        payment_type: paymentType,
        remark: remark,
        uid: uid,
        udid: otherParams.udid,
        is_print_price: otherParams.isPrintPrice
    };

    /* tar add 161130 结算优化 */
    if (times === 2 || times === '2') {
        params.is_continue_buy = 'Y';
    } else {
        params.is_continue_buy = 'N';
    }

    // 发票内容写死明细
    if (invoices.invoices_type_id) {
        params.invoice_content = 12;
    }

    // 发票类型 纸质 1 ,电子 2
    if (invoices.invoices_type) {
        params.invoices_type = invoices.invoices_type;
    }

    // 收票人手机号码
    if (invoices.receiverMobile) {
        params.receiverMobile = invoices.receiverMobile;
    }

    // 发票抬头
    if (invoices.invoices_title) {
        params.invoices_title = invoices.invoices_title;
    }

    // 购买方纳税人识别号,需要开具电子发票且发票抬头为单位信息时为必填项
    if (invoices.buyerTaxNumber) {
        params.buyerTaxNumber = invoices.buyerTaxNumber;
    }

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

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

    // 购买限购商品时需要传递product_sku_list参数
    if (skuList && !activityInfo) {
        params.product_sku_list = JSON.stringify(skuList);
    }

    // 购买套餐商品需要的数据
    if (activityInfo) {
        params.activity_id = activityInfo.activity_id;
        params.product_sku_list = JSON.stringify(activityInfo.product_sku_list); // TODO 检查 JSON 是否正常
    }

    // 友盟有关信息的传递
    if (otherParams.unionKey) {
        params.qhy_union = otherParams.unionKey;
    }

    // 是否是微信商城
    if (otherParams.isWechat) {
        params.client_type = 'wechat';
    }

    return api.post('', params, {
        headers: {
            'X-Forwarded-For': otherParams.ip || '',
            'User-Agent': otherParams.userAgent
        }
    });
};


/**
 *  获取用户可用的优惠券张数
 *  doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
 *  @param uid int 用户uid
 *  @return see doc
 */
exports.getValidCouponCount = uid => {
    let param = {
        method: 'app.Shopping.countUsableCoupon',
        uid
    };

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


/**
 *  获取用户优惠券列表,可用和不可用
 *  doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
 *  @param uid int 用户uid
 *  @return see doc
 */
exports.listCoupon = params => {
    let param = {
        method: 'app.Shopping.listCoupon',
        uid: params.uid,
        delivery_way: params.delivery_way,
        is_group_frees: params.is_group_frees
    };

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

/**
 * 购物车结算--使用优惠券
 * @param uid int   用户uid
 * @param couponCode string 优惠券代码
 * @return
 */
exports.useCoupon = (uid, couponCode) => {
    let param = {
        method: 'app.Shopping.useCoupon',
        coupon_code: couponCode,
        uid
    };

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