outlet.js 7.03 KB
/**
 * 频道页面 model
 * @author: 赵彪<bill.zhao@yoho.cn>
 * @date: 2016/05/09
 */
'use strict';

const library = '../../../library';
const utils = '../../../utils';
const contentCodeConfig = require('../../../config/content-code');

const _ = require('lodash');
const ServiceAPI = require(`${library}/api`).ServiceAPI;
const API = require(`${library}/api`).API;
const sign = require(`${library}/sign`);

const camelCase = require(`${library}/camel-case`);
const resourcesProcess = require(`${utils}/resources-process`);
const log = require(`${library}/logger`);

const serviceApi = new ServiceAPI();
const api = new API();


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', sign.apiSign(params)).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.sortName,
            url: encodeURI(item.sortUrl)
        });
    });

    return {data: formatData};
};

/**
 * 获取导航数据
 * @param  {String} 导航类型id
 * @return {Promise}
 */
const _getNavData = (categoryId) => {
    const params = {
        parent_id: categoryId
    };

    return serviceApi.get('operations/api/v6/category/getCategory', sign.apiSign(params)).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) => {
        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('', sign.apiSign(params)).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('', sign.apiSign(_.assign(params, data))).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 || 'OUTLET',
            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]
        };
    });
};

module.exports = {
    getContent: getContent,
    getActivity: getActivity,
    getRecentActivity: getRecentActivity
};