/* * @Author: Targaryen * @Date: 2016-05-30 16:20:03 * @Last Modified by: Targaryen * @Last Modified time: 2016-06-08 19:56:39 */ 'use strict'; const Promise = require('bluebird'); const utils = '../../../utils'; const List = require('./list'); const outletsProcess = require('./outlets-handler'); const OutletsApiModel = require('./outlets-api'); const productProcess = require(`${utils}/product-process`); const HeaderModel = require('../../../doraemon/models/header'); const _ = require('lodash'); const publicHandler = require('./public-handler'); const log = global.yoho.logger; // 奥莱频道资源码 const channelCode = { index: 'e0565dad65fb8da1f39bc1ac83fc8346', boys: '2af513637dc5feeec7f6f8b52989b24b', girls: 'd1b56b56c3a12dc1f2f83958680a0911', kids: '0fd7ad594940f9ec5a03697317cf6521', lifestyle: 'b3d3f55a26f130ac2b516b9fb3823711' }; /** * 获取奥莱首页数据 * @param {[type]} origin [description] * @return {[type]} [description] */ function getOutletsIndexData(params, channel) { return Promise.all([ this.headerModel.requestHeaderData('outlets'), this.outletsApi.getChannelResouceData({content_code: channelCode.index}), this.outletsApi.getOutletsActivityOrigin({type: '1', channel: channel}), // 获取限时活动列表 this.outletsApi.getOutletsActivityOrigin({type: '2', channel: channel}), // 获取即将结束列表 this.outletsApi.getOutletsTrendData({limit: '30', channel: channel}), // 获取潮流速递商品数据 this.outletsApi.getOutletsActivityOrigin({type: '3', channel: channel}) // tar add 16171552 即将上线数据 ]).then(result => { let finalResult = { headerData: Object.assign(result[0].headerData, { header: true, headType: 'outlets' }) }; // 处理资源位数据 if (result[1].code === 200 && !_.isEmpty(result[1].data)) { finalResult = Object.assign(finalResult, outletsProcess.handleOutletsBannersData(result[1].data, params)); } // 处理限时嗨购列表数据 if (result[2].code === 200 && !_.isEmpty(result[2].data)) { finalResult.limitedBuy = Object.assign(finalResult.limitedBuy, outletsProcess.handleOutletsActivityData(result[2].data, '限时嗨购')); } // 处理即将结束列表数据 if (result[3].code === 200 && !_.isEmpty(result[3].data)) { finalResult.nearOver = outletsProcess.handleOutletsActivityData(result[3].data, '即将结束'); } // 处理潮品推荐数据 if (result[4].code === 200 && !_.isEmpty(result[4].data)) { finalResult.limitedBuy.extra.trendGood = outletsProcess.handleOutletstrendGoodData(result[4].data); } // 处理即将上架品牌数据 if (result[5].code === 200 && !_.isEmpty(result[5].data)) { finalResult.limitedBuy.extra.comeSoon = outletsProcess.handleComeSoonData(result[5].data); } // 如果后台没配分类,不显示商品列表 if (!finalResult.goodsBoard.goodsMenu.msort && !finalResult.goodsBoard.goodsMenu.msort) { log.info('no config index sort'); return finalResult; } // 获取底部商品数据 if (!params.msort && !params.misort) { Object.assign( params, {msort: _.uniq(finalResult.goodsBoard.goodsMenu.msort).join()} ); } return Promise.all([ this.outletsApi.getOutletsGoodsList(Object.assign( params, {limit: params.limit || '100', channel: channel, method: 'app.search.category'} )) ]).then(data => { // 处理底部商品数据 if (data[0].code === 200 && !_.isEmpty(data[0].data)) { Object.assign(finalResult.goodsBoard, { sort: Object.assign(publicHandler.handleSaleOptsData(params, data[0].data.total), {newPage: true}), list: productProcess.processProductList(data[0].data.product_list) }); // 添加锚点 if (finalResult.goodsBoard.sort.sortType) { _.forEach(finalResult.goodsBoard.sort.sortType, (value, key) => { finalResult.goodsBoard.sort.sortType[key].href += '#otspool'; }); if (finalResult.goodsBoard.sort.preHref) { finalResult.goodsBoard.sort.preHref += '#otspool'; } if (finalResult.goodsBoard.sort.nextHref) { finalResult.goodsBoard.sort.nextHref += '#otspool'; } } finalResult.goodsBoard.footPager = publicHandler.handlePagerData(data[0].data.total, params); } return finalResult; }); }); } /** * 获取奥莱频道页面数据 * @param {[object]} gender * @return {[type]} */ function getOutletsChannelData(params, channel) { // 频道资源位不存在 if (!channelCode[channel]) { return Promise.reject(`outlets channel-(${channel}) resource not found`); } let channelData = {}; let apiArr = [ // 获取头部数据 this.headerModel.requestHeaderData('outlets'), // 获取频道资源位 this.outletsApi.getChannelResouceData({content_code: channelCode[channel]}), // 获取奥莱活动 this.outletsApi.getOutletsActivityOrigin({ platform: 1, size: 0, channel: channel, type: 1 }) ]; return Promise.all(apiArr).then(result => { // 返回页面的数据 let finalResult = { headerData: Object.assign(result[0].headerData, { header: true, headType: 'outlets' }) }; Object.assign(channelData, finalResult); // 资源楼层 if (result[1].code === 200) { Object.assign(channelData, outletsProcess.processFloor(result[1].data.list, params)); } // 限时嗨购 if (result[2].code === 200 && !_.isEmpty(result[2].data)) { channelData.nearOver = outletsProcess.handleOutletsActivityData(result[2].data, '限时嗨购'); } // 如果后台没配分类,不显示商品列表 if (!channelData.goodsBoard || !channelData.goodsBoard.goodsMenu || (!channelData.goodsBoard.goodsMenu.msort && !channelData.goodsBoard.goodsMenu.msort)) { log.info('no config ' + channel + 'channel sort'); return channelData; } // 获取底部商品数据 if (!params.msort || !params.misort) { Object.assign( params, {msort: _.uniq(channelData.goodsBoard.goodsMenu.msort).join()} ); } return Promise.all([ this.outletsApi.getOutletsGoodsList(Object.assign( params, {limit: params.limit || '100', channel: channel, method: 'app.search.category'} )) ]).then(data => { if (data[0].code === 200) { if (!channelData.goodsBoard) { channelData.goodsBoard = {}; } channelData.goodsBoard.sort = publicHandler.handleSaleOptsData(params, data[0].data.total); channelData.goodsBoard.sort.newPage = true; channelData.goodsBoard.list = productProcess.processProductList(data[0].data.product_list); channelData.goodsBoard.pager = publicHandler.handlePagerData(data[0].data.total, params); // 添加锚点 if (channelData.goodsBoard.sort.sortType) { _.forEach(channelData.goodsBoard.sort.sortType, (value, key) => { channelData.goodsBoard.sort.sortType[key].href += '#otspool'; }); if (channelData.goodsBoard.sort.preHref) { channelData.goodsBoard.sort.preHref += '#otspool'; } if (channelData.goodsBoard.sort.nextHref) { channelData.goodsBoard.sort.nextHref += '#otspool'; } } } return channelData; }); }); } /** * 获取奥莱活动页面数据 * @param {[object]} * @return {[type]} */ function getOutletsSpecialData(params, channel) { return Promise.all([ this.headerModel.requestHeaderData('outlets'), this.outletsApi.getOutletsActivityOrigin({ // 获取活动信息 id: params.id }) ]).then(result => { let specialData = {}; Object.assign(specialData, result[0]); specialData.headerData.headType = 'outlets'; // 活动信息获取异常 if (result[1].code !== 200) { return Promise.reject(`outlets special info not found-(ID:${params.id})`); } Object.assign(specialData, outletsProcess.handleOutletsSpecilData(result[1].data[0])); return Promise.all([ this.list.getListData(Object.assign({ productPool: result[1].data[0].productPoolId, saleType: 4 }, params), channel) ]).then(data => { specialData.specialHead.count = data[0].totalCount; Object.assign(specialData, data[0]); return specialData; }); }); } /** * 获取奥莱分类页面数据 * @param {[type]} params [description] * @param {[type]} channel [description] * @return {[type]} [description] */ function getOutletsCategoryData(params, channel) { return Promise.all([ this.headerModel.requestHeaderData('outlets') ]).then(result => { let finalResult = { headerData: Object.assign(result[0].headerData, { header: true, headType: 'outlets' }) }; return Promise.all([ this.list.getListData(params, channel) ]).then(listResult => { finalResult.saleList = listResult[0]; if (!_.isEmpty(params.bannerImage)) { finalResult.saleList.topBanner = { list: [ { img: params.bannerImage } ] }; } return finalResult; }); }); } module.exports = class extends global.yoho.BaseModel { constructor(ctx) { super(ctx); this.list = new List(ctx); this.outletsApi = new OutletsApiModel(ctx); this.headerModel = new HeaderModel(ctx); this.getOutletsIndexData = getOutletsIndexData.bind(this); this.getOutletsChannelData = getOutletsChannelData.bind(this); this.getOutletsSpecialData = getOutletsSpecialData.bind(this); this.getOutletsCategoryData = getOutletsCategoryData.bind(this); } };