shopping.js 8.79 KB
'use strict';
const _ = require('lodash');

class shoppingModel extends global.yoho.BaseModel {
    constructor(ctx) {
        super(ctx);
    }

    /**
     * 购物车结算
     * doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
     */
    cartPayAPI(params) {
        if (!params.activityInfo) {
            params.activityInfo = null;
        }

        let param = {
            method: params.activityInfo ? 'app.Shopping.easyPayment' : 'app.Shopping.enhancedPayment',
            enable_red_envelopes: 0, // h5不返回红包
            cart_type: params.cart_type,
            yoho_coin_mode: params.yoho_coin_mode || 0,
            uid: params.uid
        };

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

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

        return this.get({ data: param, param: { cache: false } });
    }

    /**
     * 购物车结算--支付方式和配送方式选择以及是否使用有货币接口返回的数据处理
     * doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
     */
    orderComputeAPI(params) {
        let finalParams = {
            method: params.activityInfo ? 'app.Shopping.easyCompute' : 'app.Shopping.compute',
            cart_type: params.cart_type,
            delivery_way: params.delivery_way,
            payment_type: params.payment_type,
            uid: params.uid
        };

        // 有货币
        if (params.use_yoho_coin) {
            finalParams.use_yoho_coin = params.use_yoho_coin;
        }

        // 优惠券
        if (params.coupon_code) {
            finalParams.coupon_code = params.coupon_code;
        }

        // 礼品卡
        if (params.gift_card_code) {
            finalParams.gift_card_code = params.gift_card_code;
        }

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

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

        return this.get({data: finalParams, 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
     */
    checkTickets(uid, productSku, buyNumber, useYohoCoin, yohoCoinMode, gift_card_code) {
        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
            });
        }

        if (gift_card_code) {
            _.assign(params, {
                gift_card_code: gift_card_code
            });
        }

        return this.get({data: params, param: {code: 200}});
    }

    /**
     * 购物车结算--提交结算信息
     */
    orderSub(params) {
        let finalParams = {
            method: params.activityInfo ? 'app.Shopping.easySubmit' : 'app.Shopping.submit',
            address_id: params.address_id,
            cart_type: params.cart_type,
            delivery_time: params.delivery_time,
            delivery_way: params.delivery_way,
            payment_id: params.payment_id,
            payment_type: params.payment_type,
            remark: params.remark,
            uid: params.uid,
            udid: params.udid,
            is_print_price: params.is_print_price
        };

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

        // 有货币
        if (params.use_yoho_coin) {
            finalParams.use_yoho_coin = params.use_yoho_coin;
        }

        // 优惠券
        if (params.coupon_code) {
            finalParams.coupon_code = params.coupon_code;
        }

        // 礼品卡
        if (params.gift_card_code) {
            finalParams.gift_card_code = params.gift_card_code;
        }

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

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

        // 发票类型:个人 1, 企业 2
        if (params.invoices.invoice_payable_type) {
            finalParams.invoice_payable_type = params.invoices.invoice_payable_type;
        }

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

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

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

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

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

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

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

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

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

        return this.post({data: finalParams, param: {
            headers: {
                'X-Forwarded-For': params.ip || '',
                'User-Agent': params.userAgent
            }
        }});
    }


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

        return this.get({data: param});
    }


    /**
     *  获取用户优惠券列表,可用和不可用
     *  @param uid int 用户uid
     *  @return see doc
     */
    listCoupon(params) {
        let param = {
            method: 'app.Shopping.selectCoupon',
            uid: params.uid,
            delivery_way: params.delivery_way,
            coupon_code: params.coupon_code
        };

        return this.get({
            data: param,
            param: {
                cache: false
            }
        });
    }

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

        return this.get({data: param});
    }


    /**
     * 获取可用的礼品卡张数
     */
    countUsableGiftCard(uid) {
        return this.get({data: {
            method: 'app.Shopping.countUsableGiftCard',
            uid: uid
        }});
    }

    /**
     * 获取礼品卡列表
     */
    listGiftCard(uid) {
        return this.get({data: {
            method: 'app.Shopping.listGiftCard',
            uid: uid
        }});
    }
}

module.exports = shoppingModel;