seckill.js 4.33 KB
/**
 * 秒杀页面
 * @author: 陈峰<feng.chen@yoho.cn>
 * @date: 2016/09/08
 */

'use strict';
const moment = require('moment');
const mRoot = '../models';
const headerModel = require('../../../doraemon/models/header');
const seckillModel = require(`${mRoot}/seckill`);

/**
 * [时间缺0补0]
 */
const _timeFormat = (tick) => {
    return tick < 10 ? `0${tick}` : tick;
};

/**
 *  秒杀商品 添加 秒杀按钮状态
 *
 *  @param isApp app才有提醒功能
 *  @param productList 秒杀商品列表
 *
 *  默认: 去抢购
 *  已抢光 over=true
 *  在APP中未开抢 wait=true
 */
function _productAddFlag(productList, isApp) {
    let now = Date.now();

    productList.forEach(product => {
        if (isApp && (now < product.startTime * 1000)) { // 未开抢
            product.wait = true;
        } else if (product.secKillStatus === 0) { // 已开抢-已抢光
            product.over = true;
        }
    });

    return productList;
}

let _helpers = {
    statusClass: (nav) => {
        if (nav.over) {
            return 'over';
        } else if (nav.now) {
            return 'now';
        } else if (nav.wait) {
            return 'wait';
        } else {
            return '';
        }
    },
    readaleTime: (unixStamp) => {
        return moment.unix(unixStamp).format('MM月DD日 hh:mm');
    }
};

/**
 * [秒杀列表页面]
 */
const index = (req, res, next) => {
    let headerData = headerModel.setNav({
            navTitle: '秒杀活动',
            navBtn: true,
        }),
        result = {},
        hbsHelper = {
            helpers: _helpers
        };

    return seckillModel.queryActivity().then((resultActivity) => {
        if (resultActivity.code !== 200) {
            return next();
        }
        result.activitys = resultActivity.data.secKillProductVoList;
        let nowTime = Date.parse(new Date());

        result.activitys.forEach((activity, i) => {
            let date,
                hour = 0,
                minute = 0;

            activity.startTime *= 1000;
            date = new Date(activity.startTime);
            hour = date.getHours();
            minute = date.getMinutes();
            activity.time = `${_timeFormat(hour)}:${_timeFormat(minute)}`;

            if (nowTime > activity.startTime) { // 当前时间大于这个时间段,已经开始和即将开始两种情况
                if (i < result.activitys.length - 1) {
                    let nextTime = result.activitys[i + 1].startTime * 1000;

                    if (nowTime < nextTime) { // 下一个时间段与当前时间来区别是否正在抢购
                        activity.now = true;
                        activity.focus = true;
                    } else {
                        activity.over = true;
                    }
                } else { // 大于这个时间段但是后面没有秒抢时间端了,则依然显示抢购中
                    activity.now = true;
                }
            } else {
                activity.wait = true;
            }
        });
        if (result.activitys.length && result.activitys.findIndex(activity => activity.focus) < 0) {
            result.activitys[0].focus = true;
        }
        let focusActivity = result.activitys.find(activity => activity.focus);

        return seckillModel.queryProductList(focusActivity.activityId).then((resultProducts) => {
            result.products = _productAddFlag(resultProducts.data, req.yoho.isApp);
            // console.log(result);
            res.render('seckill', Object.assign({
                pageHeader: headerData,
                pageFooter: true,
                width750: true,
                times: 12
            }, result, hbsHelper));
        });
    });
};

/**
 * [xhr根据活动id获取商品列表]
 */
const getProductList = (req, res, next) => {
    if (!req.xhr) {
        return next();
    }
    let activityId = Number(req.query.activityId);

    if (!activityId) {
        return next();
    }
    return seckillModel.queryProductList(activityId).then((resultProducts) => {
        let result = {
            products: _productAddFlag(resultProducts.data, req.yoho.isApp)
        };

        res.render('seckill/product-list', Object.assign(result, {
            layout: false
        }, {helpers: _helpers}));
    });
};

const remind = (req, res, next) => {};

module.exports = {
    index,
    getProductList,
    remind
};