Authored by 陈轩

秒杀列表 新接口

... ... @@ -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 是否正确
... ...
... ... @@ -24,16 +24,29 @@ const queryActivity = () => {
* @param {[int]} uid only app use
* @return {[object]}
*/
const queryProductList = (activityId, uid) => {
const queryProductList = (activityId) => {
return api.get('', {
method: 'app.seckill.queryProductList',
activityId: activityId,
uid: uid
activityId: activityId
}, {
cache: true
});
};
/**
* 获取提醒 列表
*/
const queryRemindList = (activityId, uid) => {
return api.get('', {
method: 'app.seckill.queryRemindList',
activityId,
uid
});
};
/**
* 设置提醒
*/
const remind = (options) => {
let url = '';
let formData = Object.assign({
... ... @@ -46,5 +59,6 @@ const remind = (options) => {
module.exports = {
queryActivity,
queryProductList,
queryRemindList,
remind
};
... ...
... ... @@ -153,7 +153,10 @@ seckillObj = {
}
// 刷新商品列表
that.refreshProductList($(elem).find('input.activityId').val());
that.refreshProductList(
$(elem).find('input.activityId').val(),
$(elem).find('input.date').val()
);
},
/**
... ... @@ -197,13 +200,14 @@ seckillObj = {
/**
* [异步加载商品列表]
*/
refreshProductList: function(activityId) {
refreshProductList: function(activityId, startTime) {
loading.show();
$.ajax({
url: '/product/seckill/get-product-list',
data: {
uid: yoho.isLogin(), // only app use;
activityId: activityId
activityId: activityId,
startTime: startTime
},
beforeSend: function(jqXhr, config) {
if (yoho.isApp) {
... ... @@ -358,5 +362,5 @@ $(function() {
});
window.seckillRefresh = function() {
location.reload();
// location.reload();
};
... ...