outlets-handler.js 7.16 KB
/**
 *
 * @Author: zhoushaofeng
 * @Date:   2016-06-02 15:50:47
 * @Last Modified time: 2016-06-08 19:31:52
 */
'use strict';
const utils = '../../../utils';
const helpers = global.yoho.helpers;
const _ = require('lodash');
const camelCase = global.yoho.camelCase;
const productProcess = require(`${utils}/product-process`);
const url = require('url');
const queryString = require('querystring');

/**
 * 热门分类
 */
const hotCategory = (data) => {
    return {
        hotCategory: {
            name: data.name,
            list: data.menuNav.list,
            blocks: data.menuNav.blocks,
            brands: data.imgs.slice(0, 1),
            types: data.imgs.slice(1, 7)
        }
    };
};


/**
 * 折扣文本切割
 */
const discountSplit = (text) => {
    let endNum = 0,
        i;

    text = text || '';

    for (i = 0; i < text.length; i++) {
        if (/^([0-9]|\%)*$/.test(text[i])) {
            endNum = i + 1;
        }
    }

    return {
        discount: text.slice(0, endNum),
        discountText: text.slice(endNum, text.length)
    };
};

/**
 * 处理奥莱首页和频道底部分类
 * @param  {[type]} origin [description]
 * @return {[type]}        [description]
 */
const handleOutletsGoodsMenuData = (origin, params) => {
    let dest = {
        title: '最新折扣',
        more: '/product/outlets/list',
        menuList: [],
        msort: [],
        misort: []
    };

    _.forEach(origin, subValue => {
        let oldParam = _.cloneDeep(params);
        let goodsmenu = {};
        let urlSuffix = {};

        goodsmenu.name = subValue.categoryName;

        urlSuffix = queryString.parse(url.parse(subValue.url).query);

        if (!_.isEmpty(urlSuffix.msort) && urlSuffix.msort === oldParam.msort && urlSuffix.misort === oldParam.misort) {
            goodsmenu.cur = true;
        }
        delete oldParam.msort;
        delete oldParam.misort;
        if (urlSuffix.msort) {
            Object.assign(oldParam, {msort: urlSuffix.msort});
            dest.msort.push(urlSuffix.msort);
        }
        if (urlSuffix.misort) {
            Object.assign(oldParam, {misort: urlSuffix.misort});
            dest.misort.push(urlSuffix.misort);
        }

        goodsmenu.href = '?' + queryString.stringify(oldParam) + '#otspool';

        dest.menuList.push(goodsmenu);
    });
    return dest;
};

/**
 * 分类导航
 */
const categoryNavigation = (data, params) => {
    let goodsBoard = {};

    goodsBoard.goodsMenu = handleOutletsGoodsMenuData(data, params);
    return {goodsBoard: goodsBoard};
};

/**
 * 处理楼层数据
 * @param  {[array]} list
 * @return {[array]}
 */
exports.processFloor = (list, params) => {
    const formatData = [];
    let floorData;

    list = list || [];
    list = camelCase(list);

    // 格式化数据
    _.forEach(list, (floor) => {
        switch (floor.templateName) {
            case 'NL2R':
                floorData = {topBanner: floor.data};
                break;
            case 'hotCategory':
                floorData = hotCategory(floor.data);
                break;
            case 'categoryNavigation':
                floorData = categoryNavigation(floor.data, params);
                break;
            default:
                floorData = floor.data;
                break;

        }
        Object.assign(formatData, floorData);
    });
    return formatData;
};

/**
 * 处理奥莱资源位数据
 * @param  {[type]} origin [description]
 * @return {[type]}        [description]
 */
exports.handleOutletsBannersData = (origin, params) => {
    var dest = {};

    dest.limitedBuy = {};
    dest.limitedBuy.extra = {};

    _.forEach(origin.list, value => {

        // 处理焦点图数据
        if (value.template_name === 'focus') {
            dest.mainBanner = {
                list: value.data
            };
        }

        // 处理三张小图数据
        if (value.template_name === 'threePicture') {
            dest.column = value.data;
        }

        // 处理右侧一张图片
        if (value.template_name === 'single_image') {
            dest.limitedBuy.extra.sourceImg = {
                href: value.data[0].url,
                img: value.data[0].src
            };
        }

        // 处理热销推荐数据
        if (value.template_name === 'recommendCategory') {
            dest.limitedBuy.extra.hotType = {
                title: _.isEmpty(value.data.title) ? '热销推荐' : value.data.title,
                classify: []
            };
            _.forEach(value.data.categoryList, subValue => {
                let category = {};

                category.href = subValue.url + '&bannerImage=' + subValue.bannerImage;
                category.name = subValue.navigateNamePC;

                dest.limitedBuy.extra.hotType.classify.push(category);

            });

        }

        // 处理品类导航数据

        if (value.template_name === 'categoryNavigation') {
            dest.goodsBoard = {
                goodsMenu: handleOutletsGoodsMenuData(value.data, params)
            };
        }
    });

    return dest;
};

/**
 * 处理奥莱活动数据
 * @param  {[type]} origin [description]
 * @param  {[type]} params [description]
 * @return {[type]}        [description]
 */
exports.handleOutletsActivityData = (origin, name) => {
    let dest = {
        name: name || '限时嗨购',
        topic: []
    };

    // 处理奥莱活动列表数据
    _.forEach(origin, value => {
        let activity = {
            href: helpers.urlFormat('/product/outlets/special/detail', {id: value.id}),
            img: value.webCoverUrl,
            logo: value.logoUrl,
            title: value.title,
            limit: parseInt(value.endLeftTime, 10) * 1000
        };

        if (value.promotionName) {
            Object.assign(activity, discountSplit(value.promotionName));
        }

        dest.topic.push(activity);
    });

    return dest;
};

/**
 * 处理奥莱活动专题数据
 * @param  {[type]} origin [description]
 * @return {[type]}        [description]
 */
exports.handleOutletsSpecilData = (origin) => {
    let dest = {};

    dest.mainBanner = {
        src: helpers.image(origin.webUrl, 1920, 360)
    };

    dest.specialHead = {
        logo: origin.logoUrl,
        special: origin.title,
        title: '全部商品',
        limit: origin.endLeftTime * 1000
    };

    if (origin.promotionName) {
        Object.assign(dest.specialHead, discountSplit(origin.promotionName));
    }

    return dest;
};

/**
 * 处理潮品速递商品数据
 * @param  {[type]} origin [description]
 * @return {[type]}        [description]
 */
exports.handleOutletstrendGoodData = (origin) => {
    let dest = {};

    dest.title = '潮品推荐';
    dest.goods = productProcess.processProductList(origin.product_list);
    _.forEach(dest.goods, (value, key) => {
        dest.goods[key].discount = (value.salesPrice / value.marketPrice * 10).toFixed(1) * 1;
    });

    return dest;
};

/**
 * 处理即将上线品牌数据
 * @param origin
 * @returns {{}}
 */
exports.handleComeSoonData = (origin) => {
    let dest = {
        title: '上线预告'
    };

    dest.brands = [];
    _.forEach(origin, value => {
        dest.brands.push({
            logo: value.logoUrl
        });
    });

    return dest;
};