/** * 频道页面 model * @author: 赵彪<bill.zhao@yoho.cn> * @date: 2016/05/09 */ 'use strict'; const utils = '../../../utils'; const contentCodeConfig = require('../../../config/content-code'); const _ = require('lodash'); const log = global.yoho.logger; const serviceApi = global.yoho.ServiceAPI; const api = global.yoho.API; const resourcesProcess = require(`${utils}/resources-process`); const dateFormate = (str) => { var time = new Date(str * 1000); var y = time.getFullYear(); var m = time.getMonth() + 1; var d = time.getDate(); var h = time.getHours(); return y + '年' + m + '月' + d + '日' + h + '时'; }; // 为了活动卡片特殊样式,将折扣信息拆分开来 const _transDiscountToArr = (discount) => { return discount.replace(/(?:\d+[.\d]?)([\u4e00-\u9fa5]{1})/g, function(fullMatch, capture) { if (capture) { const arr = []; arr.push(fullMatch.replace(capture, '')); arr.push(capture); return arr; } else { return fullMatch; } }).split(','); }; /** * 获取资源位 * @param {String} channel 频道 * @param {String} contentcode 内容码 * @return {Promise} */ const _getOutletResource = (channel, contentcode) => { const params = { content_code: contentcode || contentCodeConfig.outlet, limit: 25, yh_channel: channel || '' }; return serviceApi.get('operations/api/v5/resource/home', params, { cache: true }).then(result => { if (result && result.code === 200) { return resourcesProcess(result.data.list); } else { log.error('the response code of outlet "operations/api/v5/resource/home" is NOT 200', result); return []; } }); }; /** * 转换导航数据 * @param {[Object]} 原始导航数据 * @return {Object} 转换后的数据 */ const _convertNavData = (list) => { const formatData = []; list = list || []; // list = camelCase(list); _.forEach(list, (item) => { formatData.push({ id: item.id, name: item.sort_name, url: encodeURI(item.sort_url) }); }); return { data: formatData }; }; /** * 获取导航数据 * @param {String} 导航类型id * @return {Promise} */ const _getNavData = (categoryId) => { const params = { parent_id: categoryId }; return serviceApi.get('operations/api/v6/category/getCategory', params, { cache: true }).then(result => { if (result && result.code === 200) { let data = _convertNavData(result.data); data.category = categoryId; return data; } else { log.error('the response code of "operations/api/v6/category/getCategory" is NOT 200', result); return []; } }); }; /** * 转换奥莱活动数据 * @param {Object} data 原始数据 * @return {Object} 转换后的数据 */ const _convertActicityData = (data) => { const formatData = []; let discountArr = [], discountNum = 0, discountText = 0; data = data || []; _.forEach(data, (item) => { if (item.promotionName) { discountArr = item.promotionName.split('~'); if (discountArr.length === 1) { discountNum = _transDiscountToArr(discountArr[0])[0]; discountText = _transDiscountToArr(discountArr[0])[1]; } else { discountNum = discountArr[0] + '~' + _transDiscountToArr(discountArr[1])[0]; discountText = _transDiscountToArr(discountArr[1])[1]; } formatData.push({ activityUrl: '/product/outlet/activity?id=' + item.id, coverUrl: item.coverUrl, logoUrl: item.logoUrl, title: item.title, discountNum: discountNum, discountText: discountText, productPoolId: item.productPoolId || '', leftTime: item.startLeftTime > 0 ? dateFormate(item.startTime) : item.endLeftTime, hide: false }); } }); return formatData; }; /** * 获取奥莱活动详情 * @param {String} id 活动id * @return {Promise} 调用接口的Promise */ const _getActivityDetail = (id) => { var params = { method: 'app.outlets.activityGet', sort: 1, // 接口规定传1 platform: 3, // h5平台代号 id: id, type: 0 // 接口规定传0 }; return api.get('', params, { cache: true }).then(res => { if (res.code === 200) { return _convertActicityData(res.data); } else { log.error('the response code of "app.outlets.activityGet" is NOT 200', res); return {}; } }); }; /** * 获取奥莱资频道页活动列表 * @param {Object} data 请求接口所需的参数 * @return {Promise} 调用接口的Promise */ const _getHomeActivity = (data) => { var params = { method: 'app.outlets.activityGet', platform: 3 // h5平台代号 }; return api.get('', _.assign(params, data), { cache: true }).then(res => { return _convertActicityData(res.data); }); }; /** * 获取奥莱资首页内容 * @param {String} categoryId 父级菜单id,用于标明当前页面是奥莱页面 * @param {Strting} channel 奥莱频道 * @param {Strting} code 内容码 * @return {Promise} 调用接口的Promise */ const getContent = (categoryId, channel, code) => { let params = { type: 0, // 获取全部奥莱活动列表, 不区分是否将开始或结束 yh_channel: channel }; const p = [_getNavData(categoryId), _getOutletResource(channel, code), _getHomeActivity(params)]; return Promise.all(p).then(data => { return { nav: data[0] || [], content: data[1] || [], activity: data[2] }; }); }; /** * 获取奥莱活动详情 * @param {String} id 活动id * @return {Promise} 调用接口的Promise */ const getActivity = (id) => { return _getActivityDetail(id).then(res => { return { activity: res, productPool: res[0] && res[0].productPoolId || '', activityTitle: res[0] && res[0].title || '奥莱', saleType: 4 // 促销类型, 奥莱为4 }; }); }; /** * 获取即将开始或即将结束的活动列表 * @param {Number} type 标明是上线预告还是即将结束 * @param {String} categoryId 父级菜单id,用于标明当前页面是奥莱页面 * @return {Object} 活动列表数据 */ const getRecentActivity = (type, categoryId) => { var params = { type: type }; return Promise.all([_getNavData(categoryId), _getHomeActivity(params)]).then(res => { return { nav: res[0] || [], activity: res[1] }; }); }; // pageCache 单独获取活动时间 const getActivityTime = (params) => { return api.get('', _.assign({ method: 'app.outlets.activityGet', platform: 3 // h5平台代号 }, params), { cache: true }).then(res => { var times = []; if (res && res.code === 200) { _.forEach(res.data, item => { times.push(item.startLeftTime > 0 ? dateFormate(item.startTime) : item.endLeftTime); }); return times; } else { log.error('the response code of "app.outlets.activityGet" is NOT 200', res); return {}; } }); }; module.exports = { getContent, getActivity, getRecentActivity, getActivityTime };