/** * 频道页 model * @author: 赵彪<bill.zhao@yoho.cn> * @date: 2016/05/17 */ 'use strict'; const _ = require('lodash'); const dataMap = require('../../../config/data-map'); const helpers = global.yoho.helpers; const config = global.yoho.config; const processProduct = require(`${global.utils}/product-process`).processProduct; const searchApi = require('../../product/models/search-api'); const api = global.yoho.API; const serviceApi = global.yoho.ServiceAPI; const headerModel = require('../../../doraemon/models/header'); // 获取可用的标题 const _getText = data => { let text = data.split(' ')[0]; const regResult = /\w+/.exec(text); const titleWithoutChinese = /^(?=.*[A-Za-z0-9])[A-Za-z0-9 _]*$/; // 对于不含中文的标题,直接返回 if (titleWithoutChinese.test(data)) { return data; } if (regResult) { // 去掉标题中的英文部分 text = text.replace(regResult[0], ''); } return text; }; const channelMap = dataMap.channel; const sortMap = dataMap.sort; /** * 新人专享 * @param {[Object]} data 原始数据 * @return {[Object]} 转换后的数据 */ const _getNewUserFloorData = data => { let floorData = { newUserFloor: { name: _getText(data.title.name), navs: {}, bannerImage: { url: data.banner_image[0].url, src: helpers.image(data.banner_image[0].src, 1150, 368), title: data.banner_image[0].title } } }; if (data.title.more_name) { floorData.newUserFloor.navs.name = data.title.more_name; } if (data.title.more_url) { floorData.newUserFloor.navs.url = data.title.more_url; } if (data.list) { let proList = []; // 大于15就取前15个产品数 proList = data.list.length > 15 ? data.list.slice(0, 15) : data.list; // 5个以内为false floorData.newUserFloor.hasSwitch = proList.length > 5 ? true : false; _.forEach(proList, value => { value.thumb = helpers.image(value.goods_list[0].images_url, 185, 247); value.for_newuser = true; value.url = helpers.getUrlBySkc(value.product_skn); }); floorData.newUserFloor.list = proList; } return floorData; }; /** * 获取带小图的banner * @param {[Object]} data 原始数据 * @return {[Object]} 转换后的数据 */ const _getDebrisSlide = data => { let floorData = { debrisSlider: { left: [], center: [], right: [] } }; _.mapKeys(data, (value, key) => { _.forEach(value, slideData => { floorData.debrisSlider[key].push(slideData); }); }); return floorData; }; /** * 获取广告位 * @param {Object} data 原始数据 * @return {Object} 转换后的数据 */ const _getadbannerData = data => { return { adbanner: data }; }; /** * 生成banner模板数据 * @param {Object} srcData 原始数据 * @return {Object} 转换后的数据 */ const _getSlideData = srcData => { const slideData = { slide: { list: [], pagination: [] } }; if (srcData.big_image) { slideData.slide.list = srcData.big_image; } if (srcData.list) { slideData.slide.pagination = srcData.list; } if (_.isArray(srcData)) { slideData.slide.list = srcData; } return slideData; }; /** * 获取品牌列表数据 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getBrandLogosData = (args, showNum) => { let items = [], brandLogos = [], i = 0, fillNum = 0; // 品牌数据 _.forEach(args, (floorData) => { items.push({ href: floorData.url, img: helpers.image(floorData.src, 185, 86, 2) }); }); // 不是每页显示个数的倍数,填充数据 if (items.length % showNum !== 0) { fillNum = showNum - (items.length % showNum); for (i = 0; i < fillNum; i++) { items.push({ href: 'javascript:;', // eslint-disable-line img: '' }); } } for (i = 0; i < items.length; i++) { let item = items[i]; let brandLogo = { pageNum: Math.floor(i / showNum), href: item.href, img: item.img }; if (i % showNum === 5 || i === 5) { // 插入切换按钮的位置 brandLogo.isSwitch = true; } else if (i !== 0 && i % showNum === 0) { // 插入more的位置,more占的是下一页第一个brand的位置,所以page是i/17 brandLogo.morePageNum = Math.floor(i / (showNum + 1)); brandLogo.isMore = true; brandLogo.hasNext = true; } else { brandLogo.isBrand = true; } brandLogos.push(brandLogo); } brandLogos.push({ morePageNum: Math.floor(i / (showNum + 1)), isMore: true }); return brandLogos; }; /** * 获取最新速报模板数据 : 大图+小图+大图+single_image(广告位)/+floor(logo列表) * @param {Object} srcData 原始数据 * @return {Object} 转换后的数据 */ const _getNewReportFloorData = (args) => { const title = args[0].data.text; let floorId = args[0].template_id; let item = args[1].data; let secondItem = args[2].data; let thirdItem = args[3].data; let forthItem = args[4] || {}; let brandLogoObj = {showNum: 10}; let list = []; const data = { newReport: { name: title, floorId: floorId, list: [] } }; let adData; let floorDatas = []; list.push(item[0]); _.forEach(secondItem, (floorData) => { list.push(floorData); }); list.push(thirdItem[0]); data.newReport.list = list; floorDatas.push(data); // 广告位 if (forthItem.template_name && forthItem.template_name === 'single_image') { adData = _getadbannerData(forthItem.data[0]); floorDatas.push(adData); } // logo列表 if (forthItem.template_name && forthItem.template_name === 'floor') { // 品牌数据 if (_.get(args[5], 'data[0].url', '')) { brandLogoObj.moreBrand = args[5].data[0].url || ''; } brandLogoObj.brandLogos = _getBrandLogosData(forthItem.data, brandLogoObj.showNum); data.newReport.brandLogoObj = brandLogoObj; } return floorDatas; }; /** * 给目标对象绑定频道属性 * @param {Object} obj 需要绑定频道属性的对象 * @param {String} type 需要设置的频道类型 * @return undefined */ const _setChannelType = (obj, type) => { obj[type + 'Channel'] = true; }; /** * 获取优选品牌模板数据 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getPreBrandTopData = (args, type) => { const title = args[0].data.text; let item = args[1].data, logoItems = args[2] || {}, showNum = type === 'boys' ? 16 : 10; let brandLogoObj = {showNum: showNum}; const data = { preferenceBrands: { name: title, imgBrand: [] } }; // logo列表 if (logoItems) { // 品牌数据 if (_.get(args[3], 'data[0].url', '')) { brandLogoObj.moreBrand = args[3].data[0].url; } brandLogoObj.brandLogos = _getBrandLogosData(args[2].data, showNum); data.preferenceBrands.brandLogoObj = brandLogoObj; } data.preferenceBrands.imgBrand = item; if (type === 'kids') { data.preferenceBrands.sliderColor = '#7AD3F8'; } _setChannelType(data.preferenceBrands, type); return data; }; /** * 获取热门分类模板数据 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getHotGoodsFloorData = (args, type) => { let item = args[0]; let nextItem = args[1]; let list = []; let object = {}, keyword = [], category = [], brands = [], types = [], products = []; const data = { recommend: { tplrecommend: [] } }; category = item.data.menuNav.list; keyword = item.data.menuNav.blocks; _.forEach(item.data.imgs, (it, idx) => { if (idx === 0 || (idx === 4 && type === 'boys')) { brands.push(it); } else { types.push(it); } }); products = nextItem.data; object.name = item.data.name; object.keyword = keyword; object.category = category; object.brands = brands; object.types = types; object.navs = item.data.navs.list; object.products = products; list.push(object); data.recommend.tplrecommend = list; _setChannelType(data.recommend, type); return data; }; /** * 获取japanKorean潮流上装Jacket,title+左大图+右6小图模板数据 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getJacketData = (arg) => { let resData = { tpltopic: { bigPic: arg.big_image[0], types: arg.list } }; if (arg.title.title !== '') { resData.tpltopic.title = arg.title; } return resData; }; /** * 获取7个品类图 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getClothesCategory = (arg) => { return { sevenCategory: { categorys: arg.list } }; }; /** * 获取boys人气单品模版数据 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getBoysSingleHot = (args, type) => { const len = 10; const data = { singlehot: { name: args[0].data.text, imgHot: [] } }; let list = []; let adData; let floorDatas = []; for (let i = 0; i < len; i++) { let pos = i; let val = {}; if (i === 1) { val = args[1].data[0]; // 第二个是大图 } else if (i === len - 1) { val = args[1].data[1]; // 最后一个是大图 } else { if (pos > 1) { // 小图 pos = pos - 1; } val = args[2].data[pos]; } list.push(val); } _.forEach(list, (item, index) => { if (index === 1 || index === list.length - 1) { item.big = true; } }); data.singlehot.imgHot = list; _setChannelType(data.singlehot, type); floorDatas.push(data); if (args[3].template_name === 'single_image') { adData = _getadbannerData(args[3].data[0]); floorDatas.push(adData); } return floorDatas; }; /** * 获取girls人气单品模版数据 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getGirlsSingleHot = (args, type) => { let goods = args[2] && args[2].data; let skns = ''; if (goods) { _.forEach(goods, good => { skns += good.id + ' '; }); } else { return; } return searchApi.getProductList({ client_type: 'web', query: skns, order: 'shelve_time:desc', status: 1, sales: 'Y', attribute_not: '2', stocknumber: 1, page: 1, gender: channelMap[type].gender, limit: 60 }, config.apiCache); }; /** * 人气单品入口 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getSingleHotFloorData = (args, type) => { if (type === 'boys') { return _getBoysSingleHot(args, type); } else { return _getGirlsSingleHot(args, type); } }; /** * 组装最新上架楼层数据 * * @param string data * return obj */ const _getNewGoodsFloorData = args => { const data = {}; if (!_.isEmpty(args)) { data.newArrivls = { floorId: args[0].template_id, name: _.replace(args[0].data.text, '最新', '新品'), navs: [] }; data.newArrivls.navs = args[1] ? args[1].data : {}; } return data; }; /** * 文本标题 * @param {[Object]} args 参数列表 * @param {String} type 频道类型 * @return {Object} */ const _getFloorTitleData = (args) => { let resData = { floorHeader: {} }; if (args instanceof Array) { resData.floorHeader.name = args[0].data.text; resData.floorHeader.navs = args[1].data; resData.floorHeader.floorId = args[0].template_id; } else { resData.floorHeader.name = args.data.text; resData.floorHeader.floorId = args.template_id; } if (resData.floorHeader.name.indexOf('最新上架') >= 0) { resData = _getNewGoodsFloorData(args); } return resData; }; /** * 处理异步获取的人气单品数据 * @param {[Object]} args 参数列表 * @param {String} originQuery 原始skns * @param {Object} queryResult 异步获取的数据 * @param {String} type 频道类型 * @return {Object} */ const _getSingehotViaResult = (args, originQuery, queryResult, type) => { let data = { singlehot: { name: args[0].data.text, navs: [], imgHot: [], brands: [] } }; let pos = 0; const getIndex = skn => { let index; if (originQuery) { const originQueryArr = originQuery.split(' '); let setFlag = false; _.forEach(originQueryArr, (query, idx) => { if (!setFlag && query.toString() === skn.toString()) { index = idx; setFlag = true; } }); } return index; }; if (args[3].template_name === 'app_icon_list') { data.singlehot.brands = args[3].data; } if (queryResult.data) { _.forEach(queryResult.data.product_list || [], it => { const formatData = processProduct(it, { width: 280, height: 373, gender: channelMap[type].gender }); if (pos > 11) { return; } if (it.product_id) { formatData.idx = getIndex(it.product_skn); if (formatData.idx === 0 || formatData.idx) { data.singlehot.imgHot.push(formatData); pos += 1; } } }); } data.singlehot.imgHot = _.sortBy(data.singlehot.imgHot, item => { return item.idx; }); pos = 1; _.forEach(data.singlehot.imgHot, item => { if (pos < 4 && item) { item.tip = 'TOP' + pos; pos += 1; } }); data.singlehot.navs = args[1].data; _setChannelType(data.singlehot, type); return data; }; /** * 异步获取人气单品 * @param {[Object]} rawData 接口返回的原始数据 * @param {[Object]} floorData 已经经过处理的楼层数据 * @param {String} originQuery 原始的query数据 * @param {Object} queryResult 接口中用于请求人气单品的数据 * @param {String} title 人气单品楼层的标题 * @param {Type} type 人气单品楼层的类型 * @return {Object} */ const _processFloorDataWithQueryReusult = (rawData, originQuery, queryResult, title, type) => { let data = {}; _.forEach(rawData, (subData, index) => { if (subData && subData.data && subData.data.text) { const text = subData.data.text && _getText(subData.data.text); if (text === title) { data = _getSingehotViaResult(rawData.slice(index, index + 4), originQuery, queryResult, type); } } }); return data; }; const _getCategoryFloorData = args => { const data = { category: { name: args[0].data.text, navs: args[1].data, list: [] } }; _.forEach(args[2].data, (it, index) => { // 设置图片大小 if (index === 1) { it.w = '377;'; it.h = '504;'; } else { it.w = '185'; it.h = '510'; } data.category.list.push(it); }); return data; }; const _getAccordionFloorData = args => { let data = { accordion: { name: args[0].data.text, navs: args[1].data, slide: [] } }; data.accordion.slide = args[2].data; return data; }; const _requestContent = (type, params, code) => { let data = { client_type: 'web', content_code: code || channelMap[type || 'boys'].code, gender: channelMap[type || 'boys'].gender, page: 1, limit: 1000 }; Object.assign(data, params); return serviceApi.get('operations/api/v5/resource/home', data, { cache: true, code: 200 }).then(result => { return result; }); }; const floorMap = { slide: _getSlideData, hot: _getHotGoodsFloorData, 最新速报: _getNewReportFloorData, 人气单品: _getSingleHotFloorData, 'GIRL KIDS': _getSingleHotFloorData, 'BOY KIDS': _getSingleHotFloorData, ACCESSORIES: _getSingleHotFloorData, 优选品牌: _getPreBrandTopData, 最新上架: _getNewGoodsFloorData, ad: _getadbannerData, category: _getCategoryFloorData, accordion: _getAccordionFloorData, debrisSlide: _getDebrisSlide, jacket: _getJacketData, sevenCategory: _getClothesCategory, floorTitle: _getFloorTitleData, newuser: _getNewUserFloorData }; const needQuery = { 'GIRL KIDS': true, 'BOY KIDS': true, 人气单品: true, ACCESSORIES: true }; const getQuery = args => { let goods = args[2] && args[2].data; let skns = ''; if (goods) { _.forEach(goods, good => { skns += good.id + ' '; }); } return skns; }; const _processFloorData = (rawData, type) => { let floorList = []; let searchPromise = []; let singlehotFloorIndex = []; let singlehotFloorTitle = []; let params = []; let hasNewUser = false; // 定义各种楼层需要用到的接口返回的数组中元素的个数 const bigFloorLength = 5; const normalFloorLength = 3; const hotCategoryLength = 2; _.forEach(rawData, (data, index) => { let floorData = null; let queryParam = ''; if (data && data.template_name === 'recommend_content_three' || (data.template_intro === '焦点图' && index === 0)) { // 处理banner floorData = floorMap.slide.call(null, data.data); } else if (data && data.template_intro === '热门品类') { // 处理热门品类 floorData = floorMap.hot.call(null, rawData.slice(index, index + hotCategoryLength), type); } else if (data && data.data && data.data.text) { // 处理一般楼层 let text = _getText(data.data.text); let lastIndex = index + bigFloorLength < rawData.length ? index + bigFloorLength : index + (rawData.length - index - 1); floorData = floorMap[text] && floorMap[text].call(null, rawData.slice(index, lastIndex), type); if (needQuery[text]) { queryParam = getQuery(rawData.slice(index, lastIndex)); if (queryParam.length > 0) { params.push(queryParam); } } } else if (data && data.template_name === 'debrisSlider') { // 处理girls的banner floorData = floorMap.debrisSlide.call(null, data.data); } else if (data.template_name === 'new_user_floor' || data.template_intro === '新人专享') { if (!hasNewUser) { floorData = floorMap.newuser.call(null, data.data); hasNewUser = true; } } // 处理lifestyle分类楼层 if (!floorData && index + normalFloorLength < rawData.length && rawData[index + 1].template_name === 'textNav' && rawData[index + 2].template_name === 'floor') { floorData = floorMap.category.call(null, rawData.slice(index, index + normalFloorLength)); } // 处理手风琴楼层 if (!floorData && index + normalFloorLength < rawData.length && rawData[index + 1].template_name === 'textNav' && rawData[index + 2].template_name === 'focus') { floorData = floorMap.accordion.call(null, rawData.slice(index, index + normalFloorLength)); } // 处理promise if (floorData && floorData.then && typeof floorData.then === 'function') { searchPromise.push(floorData); // 记住楼层位置, 以便后面promise获取数据后插入楼层数据 singlehotFloorIndex.push(floorList.length); // 记住楼层标题, 以便后面promise获取数据后插入楼层数据 singlehotFloorTitle.push(_getText(data.data.text)); } else if (!_.isNil(floorData)) { _.isArray(floorData) ? floorList = floorList.concat(floorData) : floorList.push(floorData); } }); return { floors: floorList, promise: _.reverse(searchPromise), queryParams: _.reverse(params), singlehotFloorTitle: _.reverse(singlehotFloorTitle), singlehotFloorIndex: _.reverse(singlehotFloorIndex) }; }; const _processJKFloorData = (rawData) => { let floorList = []; let searchPromise = []; let singlehotFloorIndex = []; let singlehotFloorTitle = []; let params = []; _.forEach(rawData, (data, index) => { let floorData = null; if (data && data.template_name === 'recommend_content_three' || (data.template_intro === '焦点图' && index === 0)) { // 处理banner floorData = floorMap.slide.call(null, data.data); floorData.slide.floorId = data.template_id; } else if (data && data.data && data.data.text) { // 处理一般楼层 let text = _getText(data.data.text); // 最新速报 if (text.indexOf('最新速报') >= 0) { floorData = _getNewReportFloorData(rawData.slice(index, index + 6)); // 单个图作为最新速报模块用过的,标识一下,不作为广告位了 _.filter(rawData.slice(index, index + 5), function(o) { if (o.template_name === 'single_image') { o.hasUser = true; } }); } else { // 文本 let href = rawData[index + 1].template_name === 'textNav' ? rawData.slice(index, index + 2) : data; floorData = floorMap.floorTitle.call(null, href); } } else if (data && data.template_name === 'jk_floor') { // 左1大图,右6小图,title floorData = floorMap.jacket.call(null, data.data); } else if (data && data.template_name === 'recommend_content_five') { // 1标题12图,在日韩馆频道页,作为7个品类显示 floorData = floorMap.sevenCategory.call(null, data.data); floorData.sevenCategory.floorId = data.template_id; } else if (data && data.template_name === 'single_image') { if (!data.hasUser) { // 一张图,在日韩馆频道页,做广告位 floorData = floorMap.ad.call(null, data.data); } } // 处理promise if (floorData && floorData.then && typeof floorData.then === 'function') { searchPromise.push(floorData); // 记住楼层位置, 以便后面promise获取数据后插入楼层数据 singlehotFloorIndex.push(floorList.length); // 记住楼层标题, 以便后面promise获取数据后插入楼层数据 singlehotFloorTitle.push(_getText(data.data.text)); } else if (!_.isNil(floorData)) { _.isArray(floorData) ? floorList = floorList.concat(floorData) : floorList.push(floorData); } }); return { floors: floorList, promise: _.reverse(searchPromise), queryParams: _.reverse(params), singlehotFloorTitle: _.reverse(singlehotFloorTitle), singlehotFloorIndex: _.reverse(singlehotFloorIndex) }; }; const _formatResourceParams = (channel, code) => { return serviceApi.get('operations/api/v5/resource/get', {content_code: code}, config.apiCache).then(data => { let result = data && data.data[0] && data.data[0].data[0]; if (result) { result.channel = channel; } return result || {}; }); }; /** * 频道页首次登陆导航并行调接口数据 * @param {Object} data * @return {Object} formatData */ const _formatParams = (channel, data) => { let params = {}; // 排序数据映射表 let orderMaps = { s_t_desc: 'shelve_time:desc', s_t_asc: 'shelve_time:asc', s_p_asc: 'sales_price:asc', s_p_desc: 'sales_price:desc', p_d_desc: 'discount:desc', p_d_asc: 'discount:asc', skn_desc: 'product_skn:desc', skn_asc: 'product_skn:asc', activities_desc: 'activities.order_by:desc', activities_asc: 'activities.order_by:asc', s_n_asc: 'sales_num:asc', s_n_desc: 'sales_num:desc', activities_id_desc: 'activities.activity_id:desc', activities_id_asc: 'activities.activity_id:asc', brand_desc: 'brand_weight:desc' }; params.status = 1; // 是否上架,1表示在架,2表示不在 params.sales = 'Y'; // 只搜索销售的产品 params.outlets = 2; // 非奥莱商品 params.stocknumber = 1; // 过滤掉已售罄的商品 params.attribute_not = 2; // 过滤掉赠品 if (!data.order) { params.order = orderMaps.s_t_desc; } else { params.order = orderMaps[data.order] ? orderMaps[data.order] : ''; } if (!data.page) { params.page = 1; } if (data.viewNum) { params.viewNum = data.viewNum; } else if (!data.limit) { params.viewNum = 60; } else { params.viewNum = data.limit; delete data.limit; } if (data) { params = Object.assign(data); } return searchApi.getProductList(params).then(result => { let ret = result.data; if (ret) { ret.channel = channel; } return ret; }); }; /** * 格式化频道页首次登陆导航数据 * @param {Object} data * @return {Object} formatData */ const formatIndexGuideData = data => { let channels = { boys: {gender: '1,3', limit: 1}, girls: {gender: '2,3', limit: 1}, lifestyle: {msort: 10, misort: '266,280,101,103,259', limit: 1}, kids: {msort: 365, limit: 1} }; let formatData = []; let promiseArr = []; _.forEach(data, item => { let channel = item.sort_name_en.toLowerCase().replace(' ', ''); formatData.push({ channel: channel, url: item.sort_url, sort_name: item.sort_name, sort_name_en: item.sort_name_en, content_code: item.content_code, src: '', num: 0 }); if (channels[channel]) { promiseArr.push(_formatParams(channel, channels[channel])); } }); return Promise.all(promiseArr).then(result => { _.forEach(formatData, item => { _.forEach(result, it => { if (item && it && item.channel === it.channel) { item.num = it.total; } }); }); return formatData; }); }; /** * 获取最新上架商品数据 * * @param string $channel * @return array */ const getNewArrival = (channel, isJKChannel, poolId)=> { let rel = [], sortList = sortMap[channel], params = {}, method = ''; if (isJKChannel) { method = 'app.search.sales'; params = { productPool: poolId }; // 没有商品池id,不查数据 if (!poolId) { return Promise.all(rel).then(); } } else { method = 'web.search.newshelve'; params = { order: 'shelve_time:desc', status: 1, sales: 'Y', attribute_not: 2, stocknumber: 3, dayLimit: 4 }; } params.gender = channelMap[channel].gender; _.forEach(sortList, (item) => { let data = Object.assign(item, params, {limit: item.viewNum}); rel.push(api.get('', Object.assign({ method: method }, data), {cache: true})); }); return Promise.all(rel).then(res => { let data = [], result = []; _.forEach(sortList, (it, index) => { let list = _.get(res[index], 'data.product_list', []); if (list.length === sortList[index].viewNum) { data = data.concat(list); } }); _.forEach(data, (item) => { result.push(processProduct(item, { width: 280, height: 373, gender: params.gender })); }); return result; }); }; /** * 获取频道页数据 * @param {String} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle * @return {Object} */ const getContent = (type, isJKChannel, poolId) => { let params = {new_device: 'Y'}; return Promise.all([ headerModel.requestHeaderData(type), _requestContent(type, params), getNewArrival(type, isJKChannel, poolId) ]).then(res => { let headerData = res[0].data || res[0], contentData = res[1].data ? res[1].data.list : res[1]; let data = {}; const processResult = _processFloorData(contentData, type); data = headerData; data.module = 'channel'; data.page = 'channel'; data.pageType = type; data.footerTop = true; data.channel = processResult.floors.map(function(elem) { if (elem.newArrivls) { elem.newArrivls.goods = res[2]; } return elem; }); return { rawData: contentData, floorData: data, searchPromise: processResult.promise, singlehotFloorIndex: processResult.singlehotFloorIndex, singlehotFloorTitle: processResult.singlehotFloorTitle, queryParams: processResult.queryParams, channelType: type }; }).then(result => { // 如果有promise则做相应处理 if (result.searchPromise.length) { return Promise.all(result.searchPromise).then(res => { _.forEach(res, (data, index) => { result.floorData.channel .splice(result.singlehotFloorIndex[index], 0, _processFloorDataWithQueryReusult( result.rawData, result.queryParams[index], data, result.singlehotFloorTitle[index], result.channelType )); }); return result.floorData; }); } return result.floorData || result; }); }; /** * 获取日韩馆频道页数据 * @param {String} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle * @return {Object} */ const getJKContent = (req) => { let channel = req.query.channel || req.yoho.channel || 'boys', contentCode = req.query.content_code; return Promise.all([ headerModel.requestHeaderData(channel), _requestContent(channel, {}, contentCode), getNewArrival(channel, true, req.query.template_id) ]).then(res => { let headerData = res[0].data || res[0], contentData = res[1].data ? res[1].data.list : res[1]; let data = {}; const processResult = _processJKFloorData(contentData); data = headerData; data.module = 'channel'; data.page = 'channel'; data.pageType = channel; data.mchannel = 'japanKorean';// 子频道,如日韩馆 data.footerTop = true; data.channel = processResult.floors.map(function(elem) { if (elem.newArrivls) { elem.newArrivls.goods = res[2]; } return elem; }); return { rawData: contentData, floorData: data, searchPromise: processResult.promise, singlehotFloorIndex: processResult.singlehotFloorIndex, singlehotFloorTitle: processResult.singlehotFloorTitle, queryParams: processResult.queryParams, channelType: channel }; }).then(result => { // 如果有promise则做相应处理 if (result.searchPromise.length) { return Promise.all(result.searchPromise).then(res => { _.forEach(res, (data, index) => { result.floorData.channel .splice(result.singlehotFloorIndex[index], 0, _processFloorDataWithQueryReusult( result.rawData, result.queryParams[index], data, result.singlehotFloorTitle[index], result.channelType )); }); return result.floorData; }); } return result.floorData || result; }); }; const getResourceData = (formatData) => { let promiseArr = []; _.forEach(formatData, item => { if (item.content_code) { promiseArr.push(_formatResourceParams(item.channel, item.content_code)); } }); return Promise.all(promiseArr).then(data => { _.forEach(formatData, (item, index) => { _.forEach(data, (it, idx) => { if (formatData[index].channel === data[idx].channel) { formatData[index].src = data[idx].src; } }); }); return formatData; }); }; /** * 获取频道页首次登陆导航数据 * @param {String} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle * @return {Object} */ const getIndexGuideData = () => { let params = { client_type: 'web', private_key: '0ed29744ed318fd28d2c07985d3ba633' }; return serviceApi.get('operations/api/v6/category/getCategory', params, config.apiCache); }; const hasNewUserFloor = (channelType, uid) => { let params = {uid: uid}; return _requestContent(channelType, params).then(res => { let isNewUser = false, contentData = res.data ? res.data.list : res; _.forEach(contentData, (data) => { if (data.template_name === 'new_user_floor' || data.template_intro === '新人专享') { isNewUser = true; return false; } }); return { isNewUser: isNewUser }; }); }; module.exports = { getNewArrival: getNewArrival, getContent: getContent, getJKContent: getJKContent, getIndexGuideData: getIndexGuideData, formatIndexGuideData: formatIndexGuideData, getResourceData: getResourceData, hasNewUserFloor: hasNewUserFloor };