chanpin.js 3.93 KB
/**
 * chanpin model
 * @author: yyq<yanqing.yang@yoho.cn>
 * @date: 2017/09/22
 */

const _ = require('lodash');
const helpers = global.yoho.helpers;

const utils = '../../../utils';
const redis = require(`${utils}/redis`);
const searchProcess = require(`${utils}/search-process`);
const productProcess = require(`${utils}/product-process`);
const stringCode = require(`${utils}/string-code`);

/**
 * 封面图
 * @type {{boys: string, gilrs: string}}
 */
const _coverChannel = {
    boys: '1,3',
    gilrs: '2,3'
};

module.exports = class extends global.yoho.BaseModel {
    constructor(ctx) {
        super(ctx);
    }

    getFuzzyDatas(params) {
        return this.get({
            data: {
                method: 'app.search.fuzzy',
                keyword: params
            },
            param: {cache: true}
        }).then((result) => {
            return _.get(result, 'data', []);
        });
    }

    getSeoSearchData(params) {
        let finalParams = {
            method: 'web.search.forseo',
            sales: 'Y',
            outlets: 2,
            stocknumber: 1,
            need_filter: 'no',
            from: 'fuzzySearch'
        };

        finalParams = _.assign(finalParams, searchProcess.getSearchParamsWithoutMethod(params));

        return this.get({data: finalParams}).then(result => {
            let resData = {};

            resData.list = productProcess.processProductList(_.get(result, 'data.product_list', []), {
                isApp: params.isApp || (params.appVersion && params.appVersion !== 'false'),
                gender: _coverChannel[params.coverChannel],
                showSimilar: params.shop_id || params.material === 'true' ? false : true
            });

            return resData;
        });
    }

    getSearchKeywordData(params, uid) {

        // 获取第一页数据做服务端渲染
        let initialData = _.assign({
            type: 'default',
            order: '0',
            page: 1,
            limit: 24
        }, params);

        if (uid) {
            initialData.uid = uid;
        }


        return Promise.all([
            this.getFuzzyDatas(`${params.query}`.substr(0, 2)),
            this.getSeoSearchData(initialData)
        ]).then(result => {
            let resData = result[1];
            let fuzzy = [];

            if (_.isEmpty(result[0])) {
                result[0] = [];
            }

            _.forEach(_.slice(result[0], 0, 12), value => {
                if (value.keyword === params.query) {
                    return;
                }

                fuzzy.push({
                    name: value.keyword,
                    link: helpers.urlFormat(`/so/${stringCode.utf8ToHex(value.keyword)}.html`),
                });
            });

            if (!_.isEmpty(fuzzy)) {
                resData.fuzzyWord = fuzzy;
            }

            return resData;
        });
    }

    getSearchKeywordDataById(id, params, uid) {
        return redis.all([
            ['get', `global:yoho:seo:keywords:id:${id}`]
        ]).then(redisData => {
            if (!redisData[0]) {
                return false;
            }

            redisData = JSON.parse(redisData[0]);
            params.query = redisData.name;

            return this.getSearchKeywordData(params, uid).then(result => {
                result.queryKey = params.query;

                let fuzzyWord = [];

                if (!_.isEmpty(redisData.data)) {
                    _.forEach(_.slice(redisData.data, 0, 12), value => {
                        if (!value) {
                            return;
                        }

                        fuzzyWord.push(Object.assign(value, {
                            name: value.keyword,
                            link: helpers.urlFormat(`/chanpin/${value.id}.html`, null)
                        }));
                    });

                    _.set(result, 'fuzzyWord', fuzzyWord);
                }

                return result;
            });
        });
    }
};