order.js 6.42 KB
/**
 * 结算页
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2016/7/13
 */

'use strict';

const _ = require('lodash');

const api = global.yoho.API;
const helper = global.yoho.helpers;

/**
 * 结算页面api
 * @param uid 用户id
 */
const _orderApi = uid => api.get('', {
    method: 'app.Shopping.payment',
    'cart_type': 'ordinary', // eslint-disable-line
    'yoho_coin_mode': 0,  // eslint-disable-line
    uid: uid
});

/**
 * 计算有货币可用数量
 * @param uid [int] user id
 */
const _yohoCoinPayRule = data => {

    if (!data.yoho_coin_pay_rule) {
        return data;
    }

    data.yoho_coin_num = _.round(data.yoho_coin * 100);
    data.yoho_coin = data.yoho_coin.toFixed(2);
    data.yoho_msg = '';

    if (data.total_yoho_coin_num < 100) {
        data.yoho_msg = `抱歉,您的有货币不足,有货币满${data.yoho_coin_pay_rule.num_limit}个方可使用`;
    } else if (data.yoho_coin_num <= 0) {
        data.yoho_msg = '抱歉,您的订单实付款不满足有货币使用条件';
    }

    return data;
};

/**
 * 结算页面
 * @param uid [int] user id
 */
const index = uid => {
    return _orderApi(uid).then(data => {
        if (data.code === 200) {

            // do data package
            let theData = data.data;

            let goods = theData.goods_list;

            let shopping = theData.shopping_cart_data;

            let packageList = shopping.package_list;

            _.forEach(goods, theGoods => {

                // format goods link
                theGoods.link = helper.urlFormat(
                    `/product/pro_${theGoods.product_id}_${theGoods.goods_id}/${theGoods.cn_alphabet}.html`);

                // format brand url
                theGoods.brandUrl = helper.urlFormat(`/product/shop/${theGoods.brand_domain}`);

                // 处理商品是否是赠品
                if (theGoods.goods_type === 'gift') {
                    theGoods.isGift = true;
                }
            });

            // 计算有货币使用
            Object.assign(theData, _yohoCoinPayRule(theData));

            shopping.balanceCoin = theData.use_yoho_coin;

            // 拆单后的邮费优惠计算
            if (packageList) {
                let shippingOrigin = 0;
                let shippingCut = 0;

                _.forEach(packageList, i => {
                    shippingOrigin += (i.shopping_orig_cost >>> 0);
                    shippingCut += (i.shopping_cut_cost >>> 0);
                });

                // 对运费的数据进行扩展
                shippingCut === 0 || Object.assign(
                    _.filter(shopping.promotion_formula_list, i => i.promotion === '运费'), {
                        shippingCut: shippingCut,
                        shippingOrigin: shippingOrigin
                    }
                );
            }

            return data;
        }
        return data;
    });
};

/**
 * 结算api调用
 * @param number uid user id
 * @param number $deliveryWay 配送方式,1表示普通快递,2表示顺丰速运
 * @param int $paymentType 支付方式,1表示在线支付,2表示货到付款
 * @param number $yohoCoin 使用的有货币数量
 * */
const _computeApi = (uid, deliveryWay, paymentType, yohoCoin) => api.get('', {
    method: 'app.Shopping.compute',
    uid: uid,
    delivery_way: deliveryWay,
    payment_type: paymentType,
    use_yoho_coin: yohoCoin
});

/**
 * 结算
 * @param uid [int] user id
 * @param yohoCoin [int] 使用的有货币
 */
const compute = (uid, yohoCoin) => {
    // 目前仅支持普通快递和在线支付
    let deliveryWay = 1;
    let paymentType = 1;

    let coin;

    // 有货币稀释
    if (yohoCoin) {
        coin = yohoCoin / 100;
    }

    return _computeApi(uid, deliveryWay, paymentType, coin).then(result => {

        if (result.code === 200) {
            Object.assign(result.data, _yohoCoinPayRule(result.data));
        }

        return result;
    });
};

/**
 * 提交订单api调用
 * @param number uid user id
 * @param number address_id 地址id
 * @param number use_yoho_coin 使用的有货币(元)
 * @param string invoices_title 发票抬头
 * @param int invoices_type_id 发票内容
 * @param string remark 备注
 * @param boolean isPrintPrice 是否打印价格
 * @param number delivery_time 送货时间
 * @param number delivery_way 送货方式(1-普通,2-顺丰)
 * @param number payment_id 支付id
 * @param number payment_type 支付类型
 */
const _submit = (uid, other) => {
    let apiParms = {
        method: 'app.Shopping.submit',
        uid: uid,
        address_id: other.address_id,
        use_yoho_coin: other.use_yoho_coin,
        remark: other.remark,
        is_print_price: other.isPrintPrice,
        delivery_time: other.delivery_time,
        delivery_way: other.delivery_way,
        payment_id: other.payment_id,
        payment_type: other.payment_type
    };

    if (other.invoices_type && parseInt(other.invoices_type, 10) === 2) {
        Object.assign(apiParms, {
            receiverMobile: other.invoices_mobile
        });
    }

    if (other.invoices_title) {
        Object.assign(apiParms, {
            invoices_type: other.invoices_type,
            invoices_title: other.invoices_title,
            invoice_content: other.invoice_content
        });
    }

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

/**
 * 订单提交
 * @param uid [int] userid
 * @param other [object] contains some param
 */
const submit = (uid, other) => {
    let theOther = {};

    Object.assign(theOther, other, {
        delivery_time: 2,  // 平时和周末都送货
        delivery_way: 1, // blk统一为普通垮堤
        payment_id: 1, // 支付宝
        payment_type: 1, // 在线支付
        use_yoho_coin: other.use_yoho_coin / 100 // 有货币稀释
    });

    return _submit(uid, theOther).then(result => result);
};

/**
 * 查询订单信息接口
 * @param uid
 * @param code
 * @returns {*}
 */
const orderDetail = (uid, code) => {
    return api.get('', {
        method: 'app.SpaceOrders.detail',
        uid: uid,
        order_code: code
    }, {code: 200});
};

/**
 * 更新订单支付方式
 * @param code
 * @param payment
 * @param uid
 * @returns {*}
 */
const updateOrderPayment = (code, payment, uid) => {
    return api.get('', {
        method: 'app.SpaceOrders.updateOrdersPaymentByCode',
        order_code: code,
        payment: payment,
        uid: uid
    });
};

module.exports = {
    index,
    compute,
    submit,
    orderDetail,
    updateOrderPayment
};