order.js 10.8 KB
'use strict';
const _ = require('lodash');
const helpers = global.yoho.helpers;
const co = require('bluebird').coroutine;
const cartModel = require('../models/cart');
const headerModel = require('../../../doraemon/models/header');
const userModel = require('../../serverAPI/user');
const addressModel = require('../../serverAPI/user/address');
const orderModel = require('../models/order');
const crypto = global.yoho.crypto;
const authcode = require(global.utils + '/authcode');

// cookie 参数
const actCkOpthn = {
    expires: 0,
    path: '/cart/index',
    domain: '.m.yohobuy.com'
};

exports.orderEnsure = (req, res, next) => {
    let headerData = headerModel.setNav({
        navTitle: '确认订单',
        navBtn: false
    });

    let uid = req.user.uid;
    let returnUrl = helpers.urlFormat('/cart/index/new');
    let cartType = req.query.cartType;
    let orderInfo;

    try {
        orderInfo = JSON.parse(req.cookies['order-info']);
    } catch (e) {
        orderInfo = {};
        res.cookie('order-info', null, actCkOpthn);
    }

    if (!cartType) {
        cartType = _.get(orderInfo, 'cartType', 'ordinary');
    }

    // 如果传递了code, skn, sku, buy_number 就代表限购商品
    let limitProductCode = req.query.limitproductcode || '';
    let sku = req.query.sku || '';
    let skn = req.query.skn || '';
    let buyNumber = req.query.buy_number || 1;

    if (limitProductCode) {
        headerData.backUrl = req.get('Referer') || returnUrl;
    }

    let orderPromise = cartModel.cartPay(uid, cartType, orderInfo, sku, skn, buyNumber);
    let userProfilePromise = userModel.queryProfile(uid);
    let addressPromise = addressModel.addressData(uid);

    if (req.query.activityType === 'bundle') {
        let activityInfo = JSON.parse(req.cookies['activity-info']);

        orderPromise = cartModel.cartPay(uid, cartType, orderInfo, sku, skn, buyNumber, activityInfo);
    }

    return Promise.all([orderPromise, userProfilePromise, addressPromise]).then(result => {
        let order = result[0];
        let userProfile = result[1];
        let address = result[2];

        if (order.cartUrl) {   // TODO?  普通或者预售商品为空时, BUT WHEN AJAX?
            return res.redirect(order.cartUrl);
        }

        if (req.xhr) {
            return res.json(order);
        }

        // 获取用户完整手机号
        let mobile = _.get(userProfile, 'data.mobile', '');
        let orderAddress = _.get(order, 'address', []);
        let addressList = _.get(address, 'data', []);

        orderAddress.length && addressList.forEach(address => { //eslint-disable-line
            if (address.address_id === orderAddress.address_id) {
                mobile = address.mobile;
            }
        });

        let viewData = {
            orderEnsurePage: true,
            isOrdinaryCart: cartType !== 'advance',
            orderEnsure: _.assign(order, {
                isOrdinaryCart: cartType !== 'advance'
            }),
            userMobile: mobile,
            pageHeader: headerData,
            pageFooter: false,
            module: 'cart',
            page: 'order-ensure',
            width750: true,
            title: '确认订单'
        };

        res.render('order-ensure', viewData);
    }).catch(next);
};

/**
 * 购物车选择改变字段,重新运算订单数据
 */
exports.orderCompute = (req, res, next) => {
    let cartType = req.body.cartType || 'ordinary';
    let deliveryId = req.body.deliveryId || 1;
    let paymentTypeId = req.body.paymentTypeId || 1;
    let couponCode = req.body.couponCode || null;
    let yohoCoin = req.body.yohoCoin || null;
    let productSku = req.body.productSku || null;
    let buyNumber = req.body.buyNumber || null;
    let uid = req.user.uid;
    let skuList = req.body.skuList;
    let type = req.body.type;

    if (type !== 'tickets') {
        if (req.body.activityType === 'bundle') {
            let activityInfo = JSON.parse(req.cookies['activity-info']);

            cartModel.orderCompute(uid, cartType, deliveryId, paymentTypeId, couponCode, yohoCoin, null, activityInfo).then(result => {
                res.json(result);
            }).catch(next);
        } else {
            cartModel.orderCompute(uid, cartType, deliveryId, paymentTypeId, couponCode, yohoCoin, skuList).then(result => {
                res.json(result);
            }).catch(next);
        }
    } else {
        cartModel.ticketsOrderCompute(uid, productSku, buyNumber, yohoCoin).then(result => {
            res.json(result);
        }).catch(next);
    }
};

/**
 * 确认结算订单
 */
exports.orderSub = (req, res) => {
    let uid = req.user.uid;
    let addressId = parseInt(crypto.decrypt('', req.body.addressId), 10);
    let cartType = req.body.cartType || 'ordinary';
    let deliveryTimeId = req.body.deliveryTimeId || 1;
    let deliveryId = req.body.deliveryId || 1;
    let paymentTypeId = req.body.paymentTypeId || 15;
    let paymentType = req.body.paymentType || 1;
    let msg = req.body.msg || null;
    let couponCode = req.body.couponCode || null;
    let yohoCoin = req.body.yohoCoin || 1;
    let skuList = req.body.skuList || '';
    let orderInfo;

    try {
        orderInfo = JSON.parse(req.cookies['order-info']);
    } catch (e) {
        orderInfo = {};
        res.cookie('order-info', null, actCkOpthn);
    }

    let times = req.body.times || 1;

    // 电子发票信息数组
    let invoices = {};

    if (orderInfo) {
        invoices = {
            invoices_type_id: orderInfo.invoiceType,
            invoices_type: orderInfo.invoicesType,
            receiverMobile: orderInfo.receiverMobile,
            invoices_title: orderInfo.invoiceText ? orderInfo.invoiceText : '个人'
        };
    }

    /* 判断是否是友盟过来的用户 */
    let userAgent = null;
    let unionKey = '';
    let unionInfo = {};

    if (req.cookies.mkt_code || req.cookies._QYH_UNION) {

        /* tar modified 161108 添加新的联盟数据处理逻辑,兼容原有联盟数据处理,
                    区别是旧的北京写 cookie 加密过来,新的 node 写 cookie,没有加密 */
        if (req.cookies._QYH_UNION) {
            let encryData = decodeURI(req.cookies._QYH_UNION);
            let testQyhUnion = JSON.parse(encryData);

            if (testQyhUnion.client_id) {
                unionKey = encryData;
            } else {
                unionKey = authcode(req.cookies._QYH_UNION, 'q_union_yohobuy');
            }
        } else {
            unionKey = '{"client_id":' + req.cookies.mkt_code + '}';
        }

        /* 检查联盟参数是否有效 */
        unionInfo = unionKey ? JSON.parse(unionKey) : {};

        /* 模拟APP的User-Agent */
        userAgent = unionInfo.client_id ? 'YOHO!Buy/3.8.2.259(Model/PC;Channel/' +
            unionInfo.client_id + ';uid/' + uid + ')' : null;
    }

    return co(function* () {
        let result;

        /* tar modified 161206 套餐 */
        if (req.body.activityType === 'bundle') {
            let activityInfo = JSON.parse(req.cookies['activity-info']);

            result = yield cartModel.orderSub(uid, addressId, 'bundle', deliveryTimeId,
                deliveryId, invoices, paymentTypeId, paymentType, msg, couponCode,
                yohoCoin, null, unionKey, userAgent, times, activityInfo);
        } else {
            result = yield cartModel.orderSub(uid, addressId, cartType, deliveryTimeId,
                deliveryId, invoices, paymentTypeId, paymentType, msg, couponCode,
                yohoCoin, skuList, unionKey, userAgent);
        }

        if (unionInfo && result.data) {
            result.data.unionCookie = unionInfo;
        }

        // 提交成功清除Cookie
        orderInfo = {};
        res.cookie('order-info', null, actCkOpthn);

        if (result.code === 409) {
            return res.json(decodeURI(result));
        } else {
            return res.json(result);
        }
    })();
};

/**
 *  下单流程 选择优惠券
 */
exports.selectCoupon = (req, res) => {

    let headerData = headerModel.setNav({
        navTitle: '选择优惠券',
        backUrl: helpers.urlFormat('/cart/new/orderEnsure'),
        navBtn: false
    });

    res.render('select-coupon', {
        module: 'cart',
        page: 'select-coupon',
        title: '选择优惠券',
        selectCouponPage: true,
        pageHeader: headerData,
        pageFooter: true
    });
};

/**
 * 购物车结算--获取优惠券列表
 */
exports.couponList = (req, res, next) => {
    let uid = req.user.uid;

    if (req.xhr) {
        return cartModel.getCouponList(uid)
            .then(data => {
                res.json(data);
            });
    } else {
        return next();
    }

};

/**
 * 购物车输入优惠券码使用优惠券
 */
exports.couponSearch = (req, res, next) => {
    let couponCode = req.body.couponCode || '';
    let uid = req.user.uid;

    co(function* () {
        if (req.xhr) {
            let result = yield cartModel.searchCoupon(uid, couponCode);

            res.json(result);
        } else {
            return next();
        }

    })();
};

/**
 * 选择地址
 */
exports.selectAddress = (req, res, next) => {
    let uid = req.user.uid;

    return addressModel.addressData(uid).then(address => {

        let moreUrl = (req.get('Referer') && !/\/home\/addressAct/.test(req.get('Referer'))) ?
            req.get('Referer') : helpers.urlFormat('/cart/index/new/orderEnsure'); // 取跳过来的url

        address = address.data;

        // 购物车订单进来,秒杀进来
        if (
            moreUrl.indexOf('/cart/index/new/orderEnsure') !== -1 ||
            moreUrl.indexOf('/cart/index/seckill') !== -1
        ) {
            req.session.addressMore = moreUrl; // TODO: 注意cookie-session
        }

        // moreUrl = req.session.addressMore;

        let headerData = headerModel.setNav({
            navTitle: '选择地址',
            navBtn: false,
            backUrl: moreUrl
        });

        res.render('select-address', {
            module: 'cart',
            page: 'select-address',
            pageHeader: headerData,
            pageFooter: true,
            moreUrl,
            address
        });
    }).catch(next);
};

/**
 * 发票信息
 */
exports.invoiceInfo = (req, res) => {
    let uid = req.user.uid;
    let cookieData = req.cookies['order-info'];
    let orderInfo = JSON.parse(cookieData);

    co(function* () {
        let userData = yield userModel.queryProfile(uid);
        let mobile = _.get(userData, 'data.mobile', '');
        let addresslist = yield userModel.addressTextData(uid);
        let returnData = orderModel.processInvoiceData(orderInfo, mobile, addresslist);
        let headerData = headerModel.setNav({
            navTitle: '发票信息',
            navBtn: false
        });

        res.render('select-invoice', _.assign(returnData, {
            pageHeader: headerData,
            module: 'cart',
            page: 'select-invoice'
        }));
    })();
};