...
|
...
|
@@ -5,6 +5,7 @@ |
|
|
*/
|
|
|
|
|
|
'use strict';
|
|
|
const Promise = require('bluebird');
|
|
|
const logger = global.yoho.logger;
|
|
|
const moment = require('moment');
|
|
|
const mRoot = '../models';
|
...
|
...
|
@@ -18,33 +19,90 @@ const _timeFormat = (tick) => { |
|
|
return tick < 10 ? `0${tick}` : tick;
|
|
|
};
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 秒杀商品 添加 秒杀按钮状态
|
|
|
*
|
|
|
* @param isApp app才有提醒功能
|
|
|
* @param productList 秒杀商品列表
|
|
|
*
|
|
|
* 默认: 去抢购
|
|
|
* 已抢光 over=true
|
|
|
* 在APP中未开抢 wait=true
|
|
|
* 秒杀商品 添加 自定义属性
|
|
|
* ----------------------------------------
|
|
|
* 已开抢
|
|
|
* product.over [APP,H5: 1.已抢光 2.过了endTime]
|
|
|
* product.isSeckill [APP,H5 秒杀中, 与over互斥]
|
|
|
* 抢购中:
|
|
|
* product.over
|
|
|
* product.isSeckill
|
|
|
* 即将开抢:
|
|
|
* product.wait = true
|
|
|
* product.remindFlag = true [APP: 已添加提醒]
|
|
|
* product.remindFalg = false [APP: 默认提醒状态]
|
|
|
* Product.hideRemind = true [APP: queryRemindList接口失败的情况下]
|
|
|
*/
|
|
|
function _productAddFlag(productList) {
|
|
|
function _productAddFlag(productList, remindList) {
|
|
|
let now = Date.now();
|
|
|
|
|
|
productList.sort((a, b) => -(a.orderBy - b.orderBy));
|
|
|
productList.forEach(product => {
|
|
|
if (now < product.startTime * 1000) { // 未开抢
|
|
|
product.wait = true;
|
|
|
} else if (product.secKillStatus === 0 || (now > product.endTime * 1000)) { // 确实已抢光, 过了秒杀时间
|
|
|
product.over = true;
|
|
|
} else {
|
|
|
product.isSeckill = true;
|
|
|
}
|
|
|
});
|
|
|
productList
|
|
|
.sort((a, b) => b.orderBy - a.orderBy)
|
|
|
.forEach(product => {
|
|
|
let startTime = product.startTime * 1000; // s to ms
|
|
|
let endTime = product.endTime * 1000;
|
|
|
|
|
|
product.remindFlag = false;
|
|
|
|
|
|
if (now < startTime) { // 未开抢
|
|
|
product.wait = true;
|
|
|
|
|
|
if (!remindList) {
|
|
|
product.hideRemind = true;
|
|
|
} else if (remindList.length) {
|
|
|
for (let i = 0, j = remindList.length; i < j; i++) {
|
|
|
if (remindList[i].productSkn === product.productSkn) { // remind on;
|
|
|
product.remindFlag = true;
|
|
|
remindList.splice(i, 1);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} else if (product.secKillStatus === 0 || (now > endTime)) { // 确实已抢光, 过了秒杀时间
|
|
|
product.over = true;
|
|
|
} else {
|
|
|
product.isSeckill = true;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return productList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取 秒杀产品列表
|
|
|
*/
|
|
|
function fetchProductList(activityInfo, uid) {
|
|
|
let activityId = activityInfo.activityId;
|
|
|
let hasRemindAttr = activityInfo.isApp && (Date.now() < activityInfo.startTime);
|
|
|
|
|
|
let productList = seckillModel.queryProductList(activityId);
|
|
|
let remindList = hasRemindAttr ? seckillModel.queryRemindList(activityId, uid) : {
|
|
|
code: 200,
|
|
|
data: []
|
|
|
};
|
|
|
|
|
|
return Promise.all([productList, remindList])
|
|
|
.then(res => {
|
|
|
let r1 = res[0];
|
|
|
let r2 = res[1];
|
|
|
let result = {
|
|
|
products: []
|
|
|
};
|
|
|
|
|
|
if (r1.code !== 200) {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
r2.data ?
|
|
|
result.products = _productAddFlag(r1.data, r2.data) :
|
|
|
result.products = _productAddFlag(r1.data);
|
|
|
|
|
|
return result;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
let _helpers = {
|
|
|
statusClass: (nav) => {
|
|
|
if (nav.over) {
|
...
|
...
|
@@ -83,13 +141,11 @@ const index = (req, res, next) => { |
|
|
return next();
|
|
|
}
|
|
|
|
|
|
if (
|
|
|
!(
|
|
|
resultActivity.data &&
|
|
|
resultActivity.data.secKillProductVoList &&
|
|
|
resultActivity.data.secKillProductVoList.length
|
|
|
)
|
|
|
) {
|
|
|
if (!(
|
|
|
resultActivity.data &&
|
|
|
resultActivity.data.secKillProductVoList &&
|
|
|
resultActivity.data.secKillProductVoList.length
|
|
|
)) {
|
|
|
return res.render('seckill', {
|
|
|
title: '秒杀活动',
|
|
|
pageHeader: headerData,
|
...
|
...
|
@@ -149,9 +205,14 @@ const index = (req, res, next) => { |
|
|
}
|
|
|
}
|
|
|
let focusActivity = result.activitys.find(activity => activity.focus);
|
|
|
let activityInfo = {
|
|
|
activityId: focusActivity.activityId,
|
|
|
startTime: focusActivity.startTime * 1000,
|
|
|
isApp: req.yoho.isApp
|
|
|
};
|
|
|
|
|
|
return seckillModel.queryProductList(focusActivity.activityId, uid).then((resultProducts) => {
|
|
|
result.products = _productAddFlag(resultProducts.data, req.yoho.isApp);
|
|
|
return fetchProductList(activityInfo, uid).then((resultProducts) => {
|
|
|
result.products = resultProducts;
|
|
|
|
|
|
// console.log(result);
|
|
|
res.render('seckill', Object.assign({
|
...
|
...
|
@@ -173,25 +234,27 @@ const getProductList = (req, res, next) => { |
|
|
return next();
|
|
|
}
|
|
|
let activityId = Number(req.query.activityId);
|
|
|
let startTime = Number(req.query.startTime);
|
|
|
let uid = req.yoho.isApp && req.query.uid;
|
|
|
|
|
|
if (!activityId) {
|
|
|
return next();
|
|
|
}
|
|
|
return seckillModel.queryProductList(activityId, uid).then((resultProducts) => {
|
|
|
let result = {
|
|
|
products: []
|
|
|
};
|
|
|
|
|
|
if (resultProducts) {
|
|
|
result = {
|
|
|
products: _productAddFlag(resultProducts.data)
|
|
|
};
|
|
|
}
|
|
|
let activityInfo = {
|
|
|
isApp: req.yoho.isApp,
|
|
|
activityId,
|
|
|
startTime
|
|
|
};
|
|
|
|
|
|
res.render('seckill/product-list', Object.assign(result, {
|
|
|
console.log(activityInfo)
|
|
|
|
|
|
return fetchProductList(activityInfo, uid).then(resultProducts => {
|
|
|
res.render('seckill/product-list', Object.assign(resultProducts, {
|
|
|
layout: false
|
|
|
}, {helpers: _helpers}));
|
|
|
}, {
|
|
|
helpers: _helpers
|
|
|
}));
|
|
|
}).catch(error => {
|
|
|
logger.error(error);
|
|
|
});
|
...
|
...
|
@@ -206,16 +269,16 @@ const remind = (req, res, next) => { |
|
|
}
|
|
|
|
|
|
return seckillModel.remind({
|
|
|
on_off: req.body.on_off === 'true' ? true : false,
|
|
|
activity_id: Number.parseInt(req.body.activity_id, 10),
|
|
|
product_skn: Number.parseInt(req.body.product_skn, 10),
|
|
|
uid: Number.parseInt(req.body.uid, 10),
|
|
|
sec_kill_id: Number.parseInt(req.body.sec_kill_id, 10),
|
|
|
app_type: 0
|
|
|
})
|
|
|
.then(result=> {
|
|
|
return res.json(result);
|
|
|
});
|
|
|
on_off: req.body.on_off === 'true' ? true : false,
|
|
|
activity_id: Number.parseInt(req.body.activity_id, 10),
|
|
|
product_skn: Number.parseInt(req.body.product_skn, 10),
|
|
|
uid: Number.parseInt(req.body.uid, 10),
|
|
|
sec_kill_id: Number.parseInt(req.body.sec_kill_id, 10),
|
|
|
app_type: 0
|
|
|
})
|
|
|
.then(result => {
|
|
|
return res.json(result);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
// Middleware:检测 app_version 是否正确
|
...
|
...
|
|