seckill.js 3.71 KB
/**
 *  秒杀结算
 */
'use strict';
const co = require('bluebird').coroutine;
const seckillModel = require('../models/seckill');
const buyNowModel = require('../models/buynow');

const BAD_REQUEST = '非法请求';

exports.ensure = (req, res, next) => {
    const sku = Number.parseInt(req.query.sku, 10);
    const skn = Number.parseInt(req.query.skn, 10);
    const uid = req.user.uid;

    // require skn, sku;
    if (!(sku && skn)) {
        return next('error');
    }

    co(function*() {
        let paymentOption = {
            product_sku: sku,
            sku_type: 'S',
            uid
        };
        let skillData = yield seckillModel.skillData(skn); // 根据skn查活动信息

        skillData = skillData.data;
        if (!(
                skillData &&
                skillData.status &&
                skillData.secKillSku.some(obj => obj.productSku === sku)  // skn has sku;
            )) {
            return Promise.reject('活动不存在');
        }
        paymentOption.activity_id = skillData.activityId;

        // 获取结算 数据
        let paymentInfo = yield buyNowModel.payment(paymentOption);

        if (paymentInfo.code !== 200) {
            return Promise.reject('结算请求失败');
        }

        // 渲染
        let view = Object.assign({
            seckill: skillData,
            orderEnsure: true,
            sku,
        }, paymentInfo.data);

        // console.log(view);
        res.locals.title = '确认订单';
        res.render('order-ensure', view);
    })().catch(next);
};

exports.compute = (req, res, next) => {
    const uid = req.user.uid,
        sku = req.body.sku,
        activityId = req.body.activityId;

    if (!req.xhr) {
        return next(400);
    }

    // 必填字段
    if ([uid, sku, activityId].some(field => !field)) {
        return res.status(400).json({
            code: 400,
            msg: BAD_REQUEST
        });
    }

    const options = {
        sku_type: 'S', // 秒杀
        buy_number: 1,
        yoho_coin_mode: 1,
        payment_type: 1,
        uid: req.user.uid,
        product_sku: sku,
        delivery_way: req.body.deliveryId || 1,
        use_yoho_coin: req.body.use_yoho_coin || 0,
        activity_id: activityId
    };

    return buyNowModel.compute(options)
        .then(result => {
            res.json(result.data);
        })
        .catch(next);
};


exports.submit = (req, res, next) => {
    const uid = req.user.uid,
        sku = req.body.sku,
        activityId = req.body.activityId,
        addressId = Number.parseInt(req.body.addressId, 10),
        deliveryTime = Number.parseInt(req.body.deliveryTime, 10),
        deliveryWay = Number.parseInt(req.body.deliveryWay, 10),
        paymentId = Number.parseInt(req.body.paymentId, 10),
        paymentType = Number.parseInt(req.body.paymentType, 10);

    if (!req.xhr) {
        return next(404);
    }


    if ([uid, sku, activityId, addressId, deliveryTime,
            deliveryWay, paymentId, paymentType
        ].some(field => !field)) {
        return res.status(400).json({
            code: 400,
            msg: BAD_REQUEST
        });
    }

    const options = {
        sku_type: 'S',
        buy_number: 1,
        invoices_title: req.body.invoicesTitle || '',
        invoices_type_id: req.body.invoicesTypeId || '',
        use_yoho_coin: Number.parseFloat(req.body.useYohoCoin) || 0,
        remark: req.body.remark || '',

        address_id: addressId,
        delivery_time: deliveryTime,
        delivery_way: deliveryWay,
        payment_id: paymentId,
        payment_type: paymentType
    };

    return buyNowModel.submit(options)
        .then(result => {
            res.clearCookie('order-info');
            res.json(result);
        })
        .catch(next);
};