outlets-handler.js 7.09 KB
'use strict';
const library = '../../../library';
const utils = '../../../utils';
const helpers = require(`${library}/helpers`);
const _ = require('lodash');
const camelCase = require('../../../library/camel-case');
const productProcess = require(`${utils}/product-process`);
const url = require('url');
const queryString = require('querystring');

/**
 * NL2R图片轮播
 */
const nl2r = (data) => {
    const result = {
        left: [],
        right: []
    };

    // 左侧
    _.forEach(data.left, (value) => {
        result.left.push({
            img: value.src,
            url: value.url
        });
    });

    // 右侧
    _.forEach(data.right, (value) => {
        result.right.push({
            img: value.src,
            url: value.url
        });
    });
    return result;
};

/**
 * 热门分类
 */
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;

    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 = {
        cur: false
    };

    dest.title = '最新折扣';
    dest.menuList = [];

    _.forEach(origin, subValue => {
        let goodsmenu = {};

        let urlSuffix = {};

        goodsmenu.name = subValue.categoryName;

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

        if (!_.isEmpty(urlSuffix.msort) && urlSuffix.msort === params.msort && urlSuffix.misort === params.misort) {
            goodsmenu.cur = true;
        }

        if (urlSuffix.msort) {
            Object.assign(params, {msort: urlSuffix.msort});
        }
        if (urlSuffix.misort) {
            Object.assign(params, {misort: urlSuffix.misort});
        }

        goodsmenu.href = '?' + queryString.stringify(params);

        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 = nl2r(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 = {};
            dest.mainBanner.list = value.data;
        }

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

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

        // 处理热销推荐数据
        if (value.template_name === 'recommendCategory') {
            dest.limitedBuy.extra.hotType = {};
            dest.limitedBuy.extra.hotType.title = _.isEmpty(value.data.title) ? '热销推荐' : value.data.title;
            dest.limitedBuy.extra.hotType.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 = {};

            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 = {};

    let nowTime = Math.round(new Date().getTime() / 1000);

    dest.name = name || '限时嗨购'; // 需要根据 name 传值修改
    dest.topic = [];

    // 处理奥莱活动列表数据
    _.forEach(origin, value => {
        let activity = {};

        activity.href = helpers.urlFormat('/outlets/special/detail', { id: value.id });
        activity.img = value.webCoverUrl;
        activity.logo = value.logoUrl;
        activity.title = value.title;
        activity.limit = (value.endTime - nowTime) * 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: origin.webUrl
    };

    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).toFixed(2) * 10;
    });

    return dest;
};