/* * @Author: Targaryen * @Date: 2016-05-19 10:20:08 * @Last Modified by: Targaryen * @Last Modified time: 2016-06-20 21:13:00 */ 'use strict'; const api = global.yoho.API; const Promise = require('bluebird'); const SaleApiModel = require('./sale-api'); const SearchApiModel = require('./search-api'); const publicHandler = require('./public-handler'); const saleHandler = require('./sale-handler'); const searchHandler = require('./search-handler'); const productProcess = require(`${global.utils}/product-process`); const pager = require(`${global.utils}/pager`).setPager; const imageHandler = require(`${global.utils}/images`).getImageUrl; const _ = require('lodash'); const headerModel = require('../../../doraemon/models/header'); const limitNum = 60; // 商品每页显示数目 // 下一页图片 const nextPageImg = '//img10.static.yhbimg.com/product/2014/01/15/11/01fa01614784f6239760f1b749663016f1.jpg?imageMogr2/thumbnail/235x314/extent/235x314/background/d2hpdGU=/position/center/quality/90'; // eslint-disable-line /** * 资源位code码 */ const contentCode = { boys: { sale: 'f6400250a73a2a1a8764a0d9be73abf2', breakCode: 'a97451680222cb1b215de14bbef64921', vip: '0400ac0dffbb2fefe84949200cf2be4a', newSale: '92a69093a2ce4fc44be36907f57b01ba' }, girls: { sale: 'd74adc70f939a6658b68386ee39199e7', breakCode: '91e604f06449783a5bd93c6f4f99a396', vip: 'e261419fde3613781a3ec9d367a2e534', newSale: '1c4b4939334f7f01fea3fd2e0eb311b5' }, kids: { sale: '01937a472a5a3ccf7204f734f2506865', breakCode: '4c1dff47c68aace0608eb821fbaf40fd', vip: '40db7c9a491548fa8d441815cc7a0617', newSale: '0f47d972d463822f77f19a3aa5f9e57e' }, lifestyle: { sale: '32944e49d627a031f1d7e14a1f90ccac', breakCode: 'c605c9d2f1a426cecad232a7d41e6b97', vip: '6ac5f0ee1cf0f2dab89c9cf80263028a', newSale: '109cd4b3c9ac17e472f3dea22b92b24d' } }; /** * 获取Sale首页商品列表数据 仅 Ajax 调用 Controller 调用 * @return {[type]} [description] */ function getSaleGoodsData(params) { return api.all([ this.saleApi.getSaleGoodsList(params), this.saleApi.getUserProfile(params.uid) ]).then(result => { let finalResult = {}; if (result[0].code === 200) { finalResult.goods = productProcess.processProductList(result[0].data.product_list); _.forEach(finalResult.goods, (value, key) => { delete finalResult.goods[key].tags.isNew; // 屏蔽 new 标签 delete finalResult.goods[key].tags.isSale;// 屏蔽 sale 标签 delete finalResult.goods[key].discount; // 屏蔽折扣信息 }); } // 处理 VIP 商品数据 if (result[1].code === 200) { let vipInfo = _.get(result, '[1].data.vip_info', {}); if (params.saleType === '2') { _.forEach(finalResult.goods, (value, key) => { switch (vipInfo.cur_level) { case '1': finalResult.goods[key].sales_price = value.vip1_price; finalResult.goods[key].vip1 = true; break; case '2': finalResult.goods[key].sales_price = value.vip2_price; finalResult.goods[key].vip2 = true; break; case '3': finalResult.goods[key].sales_price = value.vip3_price; finalResult.goods[key].vip3 = true; break; default: finalResult.goods[key].vip = true; delete finalResult.goods[key].sales_price; break; } }); } } // 需要判断是否为今日推荐,今日推荐需要添加最后的全部商品图片 // 今日推荐没有 sort params 所以判断 sort 即可 if (_.isEmpty(params.sort)) { // 2:VIP 会员专享 1:断码区 switch (params.saleType) { case '5': finalResult.goods.push({ thumb: '//cdn.yoho.cn/yohobuy-node/assets/img/sale/all-broken.jpg', url: '/product/sale/breakingYards?channel=' + params.channel }); break; case '2': finalResult.goods.push({ thumb: '//cdn.yoho.cn/yohobuy-node/assets/img/sale/all-vip.jpg', url: '/product/sale/vip?channel=' + params.channel, vipPicture: true // 为了处理首页最后一张图片 }); break; case '0': finalResult.goods.push({ thumb: '//cdn.yoho.cn/yohobuy-node/assets/img/sale/all-sale.jpg', url: '/product/sale/newSale?channel=' + params.channel }); break; default: break; } } return finalResult; }); } /** * 获取 Sale 首页数据 Controller 调用 * @return {[type]} [description] */ function getSaleIndexData(channel) { return api.all([ headerModel.requestHeaderData(channel), this.saleApi.getSaleActivityList('', channel), this.saleApi.getSaleBannerList(contentCode[channel].sale), this.saleApi.getSaleGoodsList({channel: channel, saleType: '2', limit: '1'}), // 会员专享分类 this.saleApi.getSalebreakingYardsSortList({channel: channel}), // 断码区尺码数据 this.saleApi.getSaleGoodsList({channel: channel, limit: '1'}) // 最新降价分类 ]).then(result => { var finalResult = result[0]; // 折扣专场活动处理 if (result[1].code === 200) { if (result[1].data.length > 0) { finalResult.brandSale = saleHandler.handleSaleActivityData(result[1].data, channel); } } // 资源位数据处理 if (result[2].code === 200 && !_.isEmpty(result[2].data)) { finalResult.topBanner = saleHandler.handleSaleBannerData(result[2].data); finalResult.activityEnter = saleHandler.handleSaleBannerSmallData(result[2].data); } // 分类处理 finalResult.saleCategory = []; // 会员专享分类处理 if (result[3].code === 200) { finalResult.saleCategory.push( Object.assign( saleHandler.handleSaleCategoryData(result[3].data.filter.group_sort, '2', channel), {forVip: true} ) ); } // 断码区分类处理 if (result[4].code === 200) { let breakingSizeSort = saleHandler.handleSaleBreakingSizeData(result[4].data); return api.all([ this.saleApi.getSaleGoodsList({ channel: channel, saleType: '5', // app 与 pc 有冲突,为 PC 加一个 5 的选项 limit: '1', breakSize: breakingSizeSort.breakSize, breakSort: breakingSizeSort.breakSort }) ]).then(subResult => { if (subResult[0].code === 200) { finalResult.saleCategory.push( saleHandler.handleSaleCategoryData( subResult[0].data.filter.group_sort, '5', channel, breakingSizeSort ) ); } // 最新降价分类处理 if (result[5].code === 200) { finalResult.saleCategory.push( saleHandler.handleSaleCategoryData(result[5].data.filter.group_sort, '3', channel) ); } return finalResult; }); } return finalResult; }); } /** * 获取 VIP 会员专享和新降价专区数据 Controller 调用 * @return {[type]} [description] */ function getSaleOthersData(params, channel) { let promiseObject; // saleType: 1表示断码区,2表示会员专区,3 折扣专区,4表示奥莱,0最新降价 if (!_.isEmpty(params)) { if (params.saleType === '2') { promiseObject = [ headerModel.requestHeaderData(channel), this.saleApi.getSaleGoodsList(params), this.saleApi.getSaleBannerList(contentCode[channel].vip), this.saleApi.getSaleGoodsList({saleType: '2', limit: '1', channel: channel}), this.saleApi.getUserProfile(params.uid) ]; } else { promiseObject = [ headerModel.requestHeaderData(channel), this.saleApi.getSaleGoodsList(params), this.saleApi.getSaleBannerList(contentCode[channel].newSale), this.saleApi.getSaleGoodsList({limit: '1', channel: channel}) ]; } } return api.all(promiseObject).then(result => { let finalResult = result[0]; // 获取商品数据 if (result[1].code === 200) { finalResult.goods = productProcess.processProductList(result[1].data.product_list); if (!_.isEmpty(result[1].data.filter)) { // 顶部筛选条件 finalResult.filters = publicHandler.handleSaleFilterData(result[1].data.filter, params); } // 处理排序数据 finalResult.opts = publicHandler.handleSaleOptsData(params, result[1].data.total); finalResult.totalCount = result[1].data.total; finalResult.footPager = publicHandler.handlePagerData(result[1].data.total, params); // 处理所有商品标题数据 finalResult.saleTitle = { name: '所有商品', count: result[1].data.total }; _.forEach(finalResult.goods, (value, key) => { delete finalResult.goods[key].tags.is_new; // 屏蔽 new 标签 delete finalResult.goods[key].tags.is_sale;// 屏蔽 sale 标签 delete finalResult.goods[key].discount; // 屏蔽折扣信息 }); } // 获取焦点图数据 if (result[2].code === 200) { finalResult.topBanner = saleHandler.handleSaleBannerData(result[2].data); if (params.saleType !== '2') { _.forEach(finalResult.topBanner.list, (value, key) => { delete finalResult.topBanner.list[key].href; }); } } // 获取分类筛选数据 if (result[3].code === 200) { // 获取左侧类目数据 finalResult.leftContent = publicHandler.handleSaleSortData(result[3].data.filter.group_sort, params); } if (!_.isEmpty(result[4])) { // 处理 VIP 商品数据 if (result[4].code === 200 && parseInt(params.saleType, 10) === 2) { let vipInfo = _.get(result, '[4].data.vip_info', {}); _.forEach(finalResult.goods, (value, key) => { switch (vipInfo.cur_level) { case '1': finalResult.goods[key].sales_price = value.vip1_price; finalResult.goods[key].vip1 = true; break; case '2': finalResult.goods[key].sales_price = value.vip2_price; finalResult.goods[key].vip2 = true; break; case '3': finalResult.goods[key].sales_price = value.vip3_price; finalResult.goods[key].vip3 = true; break; default: finalResult.goods[key].vip = true; delete finalResult.goods[key].sales_price; break; } }); } } return finalResult; }); } /** * 获取折扣专场数据 Controller 调用 * @return {[type]} [description] */ function getSaleDiscountData(params, channel) { return api.all([ headerModel.requestHeaderData(channel), this.saleApi.getSaleActivityList(params, channel) ]).then(result => { let finalResult = result[0]; // 默认order: '' if (_.isEmpty(params.order)) { Object.assign(params, {order: ''}); } // 处理折扣专场标题 banner 数据 if (result[1].code === 200) { if (_.size(result[1].data) === 1) { finalResult.saleTitle = saleHandler.handleDiscountTitleData(result[1].data[0]); if (result[1].data[0].web_url) { finalResult.topBanner = { list: [ { img: result[1].data[0].web_url } ] }; } } // 这里把 channel 全都处理掉,因为根据channel查小分类,而传入商品池时,不需要 return api.all([ this.saleApi.getSaleGoodsList({ channel: null, saleType: '3', limit: '1', productPool: result[1].data[0].product_pool }), this.saleApi.getSaleGoodsList(Object.assign({}, params, { channel: null, productPool: result[1].data[0].product_pool })) ]).then(subResult => { // 处理分页等筛选信息 if (subResult[0].code === 200) { Object.assign(finalResult, { leftContent: publicHandler.handleSaleSortData(subResult[0].data.filter.group_sort, params, 'discount'), saleList: { footPager: publicHandler.handlePagerData(subResult[0].data.total, params), opts: publicHandler.handleSaleOptsData(params, subResult[0].data.total, 'default') } }); } // 处理商品数据,顶部分类 if (subResult[1].code === 200) { let sknArr = []; finalResult.saleList.goods = productProcess.processProductList(subResult[1].data.product_list); finalResult.saleList.totalCount = subResult[1].data.total; _.forEach(finalResult.saleList.goods, (value, key) => { if (sknArr.length < 3) { sknArr.push(value.product_skn); } delete finalResult.saleList.goods[key].tags.is_new; // 屏蔽 new 标签 delete finalResult.saleList.goods[key].tags.is_sale;// 屏蔽 sale 标签 delete finalResult.saleList.goods[key].discount; // 屏蔽折扣信息 }); finalResult.criteo = {skn: sknArr}; // 重要:推广列表前三个商品Skn } return finalResult; }); } return finalResult; }); } /** * 获取断码区数据 Controller 调用 * @param params * @param channel * @returns {*|Promise.<TResult>} */ function getSalebreakingYardsData(params, channel) { return api.all([ headerModel.requestHeaderData(channel), this.saleApi.getSaleBannerList(contentCode[channel].breakCode), this.saleApi.getSalebreakingYardsSortList(params) ]).then(result => { let finalResult = result[0]; // 处理 banner 数据 if (result[1].code === 200) { finalResult.topBanner = saleHandler.handleSaleBannerData(result[1].data); _.forEach(finalResult.topBanner.list, (value, key) => { delete finalResult.topBanner.list[key].href; }); } // 断码区产品筛选需要断码区尺码数据,改为串行处理 if (result[2].code === 200) { let breakingSizeSort = saleHandler.handleSaleBreakingSizeData(result[2].data); let breakParam = {}; // 为断码区筛选参数存储,为了不影响 params ,否则会导致链接过长 if (params.sort) { Object.assign(breakParam, params); } else { Object.assign(breakParam, params, { breakSize: breakingSizeSort.breakSize, breakSort: breakingSizeSort.breakSort }); } return api.all([ this.saleApi.getSaleGoodsList({ channel: channel, saleType: '5', // app 与 pc 有冲突,为 PC 加一个 5 的选项 limit: '1', breakSize: breakingSizeSort.breakSize, breakSort: breakingSizeSort.breakSort }), this.saleApi.getSaleGoodsList(breakParam) ]).then(subResult => { // 处理筛选条件数据 if (subResult[0].code === 200) { finalResult.leftContent = publicHandler.handleSaleSortData(subResult[0].data.filter.group_sort, params); } // 处理商品数据 if (subResult[1].code === 200) { if (!_.isEmpty(subResult[1].data.filter)) { finalResult.filters = publicHandler.handleSaleFilterData( Object.assign(subResult[1].data.filter, {size: result[2].data}), params); } Object.assign(finalResult, { goods: productProcess.processProductList(subResult[1].data.product_list), opts: publicHandler.handleSaleOptsData(params, subResult[1].data.total), totalCount: subResult[1].data.total, footPager: publicHandler.handlePagerData(subResult[1].data.total, params) }); // 处理所有商品标题数据 finalResult.saleTitle = { name: '所有商品', count: subResult[1].data.total }; _.forEach(finalResult.goods, (value, key) => { delete finalResult.goods[key].tags.is_new; // 屏蔽 new 标签 delete finalResult.goods[key].tags.is_sale;// 屏蔽 sale 标签 delete finalResult.goods[key].discount; // 屏蔽折扣信息 }); } return finalResult; }); } else { return Promise.reject(); } }); } /** * 获取sale活动数据(原sale.yohobuy.com) * @param params * @param channel * @returns {*|Promise.<TResult>} */ function getSaleSpecialData(id, params, channel) { const limit = params.limit ? params.limit - 1 : limitNum - 1; // 最后一个商品是翻页 const page = params.page || 1; const defaultParam = {specialsale_id: id}; return this.saleApi.getSaleSpecialAsync(id).then(special => { let resData = { latestWalk: 6 }, apiList = [ headerModel.requestHeaderData(channel), this.searchApi.getSortList(defaultParam) ]; if (special && special.data) { let data = special.data, condition = Object.assign({}, params, { page: page, limit: limit, attribute_not: 2 }); let banner = data.banner_img ? JSON.parse(data.banner_img) : []; Object.assign(resData, { mainBanner: { src: imageHandler(_.get(banner, '[0].img', ''), 1920, 350, 1, 'couponImg') }, specialHead: { title: '全部商品', count: 0 }, node: data.left_ad_code // 水牌node }); // // 传品牌ID参数 // if (data.brand_id) { // condition.brand = data.brand_id; // } // 传促销id,促销id为空时传专区id if (data.ispromotion) { condition.promotion = data.ispromotion; } // 搜索sale活动商品 apiList.push(this.searchApi.getProductList(condition, 'promotion')); } return Promise.all(apiList).then(result => { if (!_.isEmpty(result[0])) { resData.headerData = Object.assign(result[0].headerData, {header: true}); } if (!_.isEmpty(result[1])) { resData.leftContent = searchHandler.handleSortData(_.get(result[1], 'data', []), defaultParam, params); } if (!_.isEmpty(result[2])) { let tip = { start: (_.get(result[2], 'data.page', 1) - 1) * limitNum + 1, total: _.get(result[2], 'data.total', 0) }; tip.end = tip.start + limit - 1; if (tip.end > tip.total) { tip.end = tip.total; } resData.specialHead.count = tip.total; Object.assign(resData, { filters: searchHandler.handleFilterDataAll(_.get(result[2], 'data', {}), params), opts: searchHandler.handleOptsData(params, tip.total), goods: productProcess.processProductList(_.get(result[2], 'data.product_list', []), {from: {type: 'saleSpecial', params: params}}), footPager: {tip: tip} }); if (_.has(resData, 'filters.checkedConditions')) { _.set(resData, 'filters.checkedConditions.clearUrl', `?specialsale_id=${id}`); } // 设置分页 Object.assign(resData.footPager, pager(_.get(result[2], 'data.page_total', 0), params)); if (_.has(resData, 'footPager.nextPage')) { resData.hasNextPage = { href: _.get(resData, 'footPager.nextPage.url', ''), src: nextPageImg }; } } return resData; }); }); } module.exports = class extends global.yoho.BaseModel { constructor(ctx) { super(ctx); this.saleApi = new SaleApiModel(ctx); this.searchApi = new SearchApiModel(ctx); this.getSaleGoodsData = getSaleGoodsData.bind(this); this.getSaleIndexData = getSaleIndexData.bind(this); this.getSaleOthersData = getSaleOthersData.bind(this); this.getSaleDiscountData = getSaleDiscountData.bind(this); this.getSalebreakingYardsData = getSalebreakingYardsData.bind(this); this.getSaleSpecialData = getSaleSpecialData.bind(this); } };