sale.js 8.85 KB
/**
 * 频道页面 model
 * @author: wsl<shuiling.wang@yoho.cn>
 * @date: 2016/05/17
 */
'use strict';
const library = '../../../library';
const utils = '../../../utils';
const API = require(`${library}/api`).API;
const ServiceAPI = require(`${library}/api`).ServiceAPI;
const sign = require(`${library}/sign`);
const logger = require(`${library}/logger`);
const helpers = require(`${library}/helpers`);
const camelCase = require(`${library}/camel-case`);
const resourcesProcess = require(`${utils}/resources-process`);
const productProcess = require(`${utils}/product-process`);
const _ = require('lodash');
const api = new API();
const serviceAPI = new ServiceAPI();
const anHour = 3600;
const aDay = anHour * 24;

/**
 * 需要格式化的时间格式
 */
const timeFormat = {
    d: '剩{d}天',
    h: '剩{h}小时',
    m: '剩{m}分钟',
    s: '剩{s}秒',
    dh: '剩{d}天{h}小时',
    dhms: '剩{d}天{h}小时{m}分钟{s}秒',
    hms: '剩{h}小时{m}分钟{s}秒',
    ms: '剩{m}分钟{s}秒'
};

/**
 * 排序转换
 */
const typeCont = {
    price: ['s_p_desc', 's_p_asc'],
    discount: ['p_d_desc', 'p_d_asc'],
    sale: ['s_n_desc', 's_n_asc'],
    newest: ['s_t_desc,s_s_desc', 's_t_asc,s_s_asc'],
    stock: ['s_s_desc', 's_s_asc']
};

/**
 * 资源位code码
 */
const contentCode = {
    boys: {
        sale: '153180b9a88c0b565848850c523bb637',
        breakCode: 'd763e3f8d208cbed8f100253ea4f8946',
        vip: '6b9810a442efe1e6252b134154d36769'
    },
    girls: {
        sale: '0b2d133419a0f7c381306fd3522365e1',
        breakCode: '77258d0b526c7b6e243c1419877ead4a',
        vip: 'e83f3582df32b6753eed49fda236a755'
    },
    kids: {
        sale: 'de23648d28ee1e8a3f087a9dbac506f8',
        breakCode: '3f0898f1089b7bef5f3e071725c7a608',
        vip: '664935745012db6e2a96a7d57f75512f'
    },
    lifestyle: {
        sale: '01269e498ff5b07756e0733ec0e88c75',
        breakCode: '0020a5762771aa16902a666c9491394e',
        vip: '647f1154d30b323ff46c787fc78aef65'
    }
};

/**
 * 折扣专场专题列表过期时间处理
 * @param  {[string]} time
 * @return {[object]}
 */
const processTime = (time) => {
    let data = {};
    let type = '';

    if (time < anHour) {
        data.warnColor = true;
        data.time = '低于1小时';
    } else {
        if (time > aDay) {
            type = 'dh';
        } else {
            type = 'h';
        }

        data.time = helpers.dateDiffFormat(timeFormat[type], time, 's');
    }

    return data;
};

/**
 * 折扣专场列表数据处理
 * @param  {[array]} list
 * @return {[array]}
 */
const processDiscount = (list, channel) => {
    const formatData = [];
    let flag = true;

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

    if (list.length === 1) {
        flag = false;
    }

    _.forEach(list, (data) => {
        if (flag === true) {
            data.specialUrl = `/product/sale/discount/detail?id=${data.id}&channel=${channel}`;
            _.merge(data, processTime(data.leftTime));
        }

        formatData.push(data);
    });

    return formatData;
};

/**
 * 折扣专场接口调用
 * @param  {[object]} params
 * @return {[array]}
 */
const discount = (params) => {
    params = params || {};

    return api.get('', sign.apiSign(Object.assign({
        method: 'app.activity.get',
        sort: 2,
        plateform: 3
    }, params)));
};

/**
 * 断码区分类数据处理
 * @param  {[array]} list
 * @return {[array]}
 */
const processBreakingSort = (list) => {
    const formatData = {};
    const sort = [];
    const sub = [];

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

    _.forEach(list, (data, index) => {
        sort.push({
            sortName: data.sortName,
            sortId: data.sortId
        });
        data.sub.key = index;
        sub.push(data.sub);
    });

    formatData.sortData = sort;
    formatData.sub = sub;
    return formatData;
};

/**
 * 商品搜索接口请求
 * @param  {[object]} params
 * @return {[array]}
 */
const searchSales = (params) => {

    // 排除基本筛选项默认值为0的对象
    for (let str in params) {
        if (str !== 'order' && params[str] === '0' || params[str] === null) {
            delete params[str];
        }
    }

    params = Object.assign({
        limit: '50'
    }, params);

    if (typeCont[params.type]) {
        params.order = typeCont[params.type][params.order];
    }

    return api.get('', sign.apiSign(Object.assign({
        method: 'app.search.sales'
    }, params)), true);
};

/**
 * 获取用户数据信息
 * @param  {[string]} uid
 * @return {[array]}
 */
const getUserProfile = (uid) => {
    if (!uid) {
        return Promise.resolve({
            code: 200,
            data: {}
        });
    }
    return api.get('', sign.apiSign({
        method: 'app.passport.profile',
        uid: uid
    }), true);
};

/**
 * 获取商品数据
 */
exports.getSearchData = (params, uid) => {
    return Promise.all([
        searchSales(params).then((result) => {
            if (result && result.code === 200) {
                return productProcess.processProductList(result.data.product_list || []);
            } else {
                logger.error('SALE 商品搜索返回 code 不是 200');
                return [];
            }
        }),
        getUserProfile(uid).then((result) => {
            if (result && result.code === 200) {
                return result.data.vip_info ? camelCase(result.data.vip_info) : {};
            } else {
                logger.error('获取用户信息返回 code 不是 200');
                return {};
            }
        })
    ]);
};

/**
 * 获取资源位数据
 * @param  {[string]} page
 * @return {[array]}
 */
const getResources = (page, channel) => {
    return serviceAPI.get('operations/api/v5/resource/get', sign.apiSign({
        content_code: contentCode[channel][page]
    })).then((result) => {
        if (result && result.code === 200) {
            return resourcesProcess(result.data);
        } else {
            logger.error('SALE 页面资源位返回 code 不是 200');
            return [];
        }
    });
};

/**
 * 获取断码区分类数据
 * @param  {[string]} yhChannel
 * @return {[object]}
 */
const getBreakingSort = (yhChannel) => {
    return api.get('', sign.apiSign({
        method: 'app.sale.getBreakingSort',
        yh_channel: yhChannel || '1'
    })).then((result) => {
        if (result && result.code === 200) {
            return processBreakingSort(result.data);
        } else {
            logger.error('断码区分类接口返回 code 不是 200');
            return {};
        }
    });
};

/**
 * 获取筛选数据
 * @param  {[object]} params
 * @return {[array]}
 */
exports.getFilterData = (params) => {
    return searchSales(params).then((result) => {
        if (result && result.code === 200) {
            return productProcess.processFilter(result.data.filter || [], {
                hideSize: params.saleType === '1',
                hideSort: params.saleType === '1'
            });
        } else {
            logger.error('SALE 商品搜索返回 code 不是 200');
            return [];
        }
    });
};

/**
 * 获取sale首页数据
 * @return {[array]}
 */
exports.getSaleData = (channel) => {
    return getResources('sale', channel);
};

/**
 * 获取会员享数据
 * @return {[array]}
 */
exports.getVipData = (channel) => {
    return getResources('vip', channel);
};

/**
 * 获取断码区数据
 * @param  {[object]} params
 * @return {[object]}
 */
exports.getBreakCodeData = (params) => {
    params = params || {};
    return Promise.all([getResources('breakCode', params.yhChannel), getBreakingSort(params.yhChannel)])
    .then((result) => {
        return {
            content: result[0],
            nav: result[1]
        };
    });
};

/**
 * 获取折扣专场专题列表数据
 * @param  {[object]} params
 * @return {[object]}
 */
exports.getDiscountData = (params) => {
    const discountData = {};

    return discount().then((result) => {
        if (result && result.code === 200) {
            discountData.data = processDiscount(result.data, params);
            return discountData;
        } else {
            logger.error('折扣专场专题列表返回 code 不是 200');
            return {};
        }
    });
};


/**
 * 获取折扣专场专题详情数据
 * @param  {[string]} id
 * @return {[object]}
 */
exports.getDiscountDetailData = (id) => {
    let res = {};
    let param = {
        id: id
    };

    return discount(param).then((result) => {
        if (result && result.code === 200) {
            res = processDiscount(result.data);

            return {
                title: res[0].title,
                activity: {
                    coverUrl: res[0].coverUrl,
                    time: res[0].time,
                    leftTime: res[0].leftTime
                }
            };
        } else {
            logger.error('折扣专场专题详情返回 code 不是 200');
            return {};
        }
    });
};