search.js 7.63 KB
/**
 * search
 * @Author: sefon 2016-7-12 16:31:56
 */

'use strict';
const utils = '../../../utils';
const api = global.yoho.API;
const helpers = global.yoho.helpers;
const saleApi = require('./sale-api');
const searchApi = require('./search-api');
const headerModel = require('../../../doraemon/models/header');
const productProcess = require(`${utils}/product-process`);
const searchHandler = require('./search-handler');
const _ = require('lodash');
const needParams = ['query', 'msort', 'misort'];

exports.getKeyActivity = (query) => {
    return searchApi.getKeyActivityAsync(query).then(result => {
        return _.get(result, 'data.urlobj.pcUrl', '');
    });
};

/**
 * 获取搜索数据
 * @param  {[type]} origin [description]
 * @return {[type]}        [description]
 */
exports.getSearchData = (params, channel) => {
    let searchParams = searchHandler.getSearchParams(params);

    switch (channel) {
        case 'boys':
            searchParams.physical_channel = 1;
            break;
        case 'girls':
            searchParams.physical_channel = 2;
            break;
        case 'kids':
            searchParams.physical_channel = 3;
            break;
        case 'lifestyle':
            searchParams.physical_channel = 4;
            break;
        default:
            break;
    }

    // 调用接口
    let apiMethod = [
        headerModel.requestHeaderData(channel),
        searchApi.getSortList(Object.assign({}, searchParams, {msort: '', misort: '', sort: ''})),
        searchApi.getProductList(searchParams),
        searchApi.getShopList(params)
    ];

    return api.all(apiMethod).then(result => {
        let finalResult = {
            headerData: Object.assign(result[0].headerData, {
                header: true
            }),
            search: {}
        };

        // 获取左侧类目数据
        if (result[1].code === 200) {
            let dps = {};

            _.forEach(needParams, (value) => {
                if (params[value]) {
                    dps[value] = params[value];
                }
            });

            finalResult.search = {
                leftContent: searchHandler.handleSortData(result[1].data.sort, dps, params)
            };
        }

        // 获取商品数据和顶部筛选条件
        if (result[2].code === 200) {

            let filters = Object.assign(searchHandler.handleFilterDataAll(result[2].data, params),
                finalResult.search.leftContent.sort);

            filters.checkedConditions.conditions = _.concat(filters.checkedConditions.conditions,
                finalResult.search.leftContent.checked);

            Object.assign(finalResult.search,
                searchHandler.handlePathNavData({total: result[2].data.total }, params, 'search', channel),
                {
                    filters: filters,
                    opts: searchHandler.handleOptsData(params, result[2].data.total, result[2].data.filter),
                    totalCount: result[2].data.total,
                    footPager: searchHandler.handlePagerData(result[2].data.total, params),
                    goods: productProcess.processProductList(result[2].data.product_list,
                        Object.assign({showDiscount: false, from: {type: 'search', params: params}}, params)),
                    latestWalk: 6,
                    hasNextPage: searchHandler.handleNextPage(params, result[2].data.total),
                    shopEntry: result[3]
                });

            finalResult.criteo = {skn: searchHandler.getCriteo(_.get(finalResult.search, 'goods'))};
        }
        return finalResult;
    });
};

/**
 * 搜索提示
 */
exports.getSuggest = (params) => {
    return searchApi.getSuggest(params).then(result => {
        let dest = [];

        if (result.code === 200) {
            dest = searchHandler.handleSuggest(result.data);
        }

        return dest;
    });
};

exports.getListBrandsFilter = (params, nparams) => {
    return searchApi.getBrands4Filter(Object.assign({}, params, nparams)).then(result => {
        let dest = [];

        if (result.code === 200) {
            dest = searchHandler.handleFilterBrands(result.data, params);
        }

        return dest;
    });
};

exports.getBrands4Filter = (params) => {

    let nparams = {};

    if (params && params.price) {
        let mp = params.price.split(',');
        let nmp = [];

        nmp[0] = (mp && mp[0]) || 0;
        nmp[1] = (mp && mp[1]) || 99999;
        nparams.price = nmp.join(',');
    }

    if (params && params.from) {
        nparams.from = params.from;
        delete params.from;
    }

    // 生成路径包含callback 导致多次调用多个 callback问题
    if (params && params.callback) {
        delete params.callback;
    }

    if (params.specialsale_id) {
        return saleApi.getSaleSpecialAsync(params.specialsale_id).then(special => {
            if (special && special.data) {
                let data = special.data;

                // 传品牌ID参数
                if (data.brand_id) {
                    nparams.brand = data.brand_id;
                }

                // 传促销id,促销id为空时传专区id
                if (data.ispromotion) {
                    nparams.promotion = data.ispromotion;
                }
            }

            return this.getListBrandsFilter(params, nparams);
        });
    }

    // 商品详情页促销跳转
    if (params && params.psp_id) {
        Object.assign(nparams, {
            promotion_id: params.psp_id,
            method: 'app.promotion.aggBrand'
        });
    }

    return this.getListBrandsFilter(params, nparams);
};

/**
 * 搜索 历史记录提示
 */
// exports.getSearchHistory = (params) => {
//     return searchApi.getSearchHistory(params).then(result => {
//         let resData = [];
//
//         if (result.code === 200) {
//             resData = searchHandler.handleSuggest(result.data);
//         }
//
//         return resData;
//     });
// };


/**
 * 搜索 热门搜索和默认搜索
 * @param  {[type]} origin [description]
 * @return {[type]}        [description]
 */
exports.getSearchRecommend = (params) => {
    return searchApi.getSearchRecommend(params).then(result => {

        // console.log(result);

        if (result.code === 200) {
            let resData = {
                // defaultTerms: [],
                hotTerms: [],
                // guessTerms: []
            };

            // resData.defaultTerms =  _.map(result.data.defaultTerms, function(value) {
            //     return {
            //         href: helpers.urlFormat('', {query: value.url}, 'search'),
            //         content: value.content,
            //         sort: value.sort,
            //         status: value.status,
            //         type: value.type,
            //     };
            // });

            console.log(result.data.hotTerms);

            resData.hotTerms =  _.map(result.data.hotTerms, function(value) {
                return {
                    href: helpers.urlFormat('', {query: value.content}, 'search'),
                    content: value.content,
                    sort: value.sort,
                    status: value.status,
                    type: value.type,
                };
            });

            // resData.guessTerms =  _.map(result.data.guessTerms, function(value) {
            //     return {
            //         href: helpers.urlFormat('', {query: value.url}, 'search'),
            //         content: value.content,
            //         sort: value.sort,
            //         status: value.status,
            //         type: value.type,
            //     };
            // });

            return resData;
        }else{
            return result;
        }

    });
};