list.js 4.08 KB
/**
 * list model
 * @author: wsl<shuiling.wang@yoho.cn>
 * @date: 2018/08/20
 */
'use strict';
const utils = '../../../utils';
const productProcess = require(`${utils}/product-process`);
const searchProcess = require(`${utils}/search-process`);
const _ = require('lodash');
const co = require('bluebird').coroutine;

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

    /**
     * 获取品类下的商品列表
     * @param isSearch 是否是搜索列表页
     * 搜索列表页默认调用 app.search.li 接口
     * 类目列表页默认调用 web.search.search 接口
     */
    getCategoryGoods(params, isSearch) {
        let method = isSearch ? 'app.search.li' : 'web.search.search';

        if (params.filter_poolId) {
            method = 'app.search.pool';
        }

        if (params.shop_id && !params.filter_poolId && !params.productPool) {
            method = 'app.search.li';
        }

        // 个人中心优惠券立即使用 - 商品列表
        if (params.coupon_id || params.coupon_code) {
            method = 'app.search.coupon';
        }

        // 物料商品列表增加
        if (params.material === 'true') {
            method = 'app.search.recommendProduct';
        }

        if (params.isblknew) {
            method = 'app.search.newProduct';
        }

        if (params.promotion_id) {
            method = 'app.search.promotion';
        }

        // 学生优惠
        if (params.students) {
            method = 'app.student.discount';
        }

        // 学生返币查询
        if (params.coin) {
            method = 'app.student.rebate';
        }

        // 促销活动
        if (params.specialsale_id) {
            method = 'app.search.li';
        }

        if (method === 'web.search.search') {
            params.from = 'categoryList';
        }

        let paramsForApi = searchProcess.getSearchParamsWithoutMethod(params);

        return this.get({
            data: _.assign({}, paramsForApi, {
                method: method
            })
        });
    }

    /**
     * 搜索品牌的商品
     */
    getBrandGoods(params) {
        let finalParams = {
            method: 'app.search.brand',
        };

        finalParams = _.assign(finalParams, searchProcess.getSearchParamsWithoutMethod(params));
        return this.get({
            data: finalParams
        });
    }

    /**
     * 搜索店铺的商品
     */
    getShopGoods(params) {
        if (!/^[0-9]*$/.test(params.shop_id)) {
            return Promise.resolve({});
        }

        let finalParams = {
            method: 'app.search.shop',
        };

        finalParams = _.assign(finalParams, searchProcess.getSearchParamsWithoutMethod(params));
        return this.get({
            data: finalParams
        });
    }

    /**
     * 获取筛选数据
     */
    getFilterData(params) {
        let self = this;

        return co(function* () {
            let filterDataResult = {};

            if (params.isShopBrand === 'Y') { // 店铺之品牌
                filterDataResult = yield self.getBrandGoods(params);
            } else if (params.isShopList === 'Y') { // 无店铺有店铺 ID 的商品列表
                filterDataResult = yield self.getShopGoods(params);
            } else { // 新的 SEO 友好的品类落地页
                filterDataResult = yield self.getCategoryGoods(params);
            }

            let filterData = _.get(filterDataResult, 'data.filter', []);

            if (filterData) {
                return productProcess.processFilter(filterData, params);
            } else {
                return [];
            }
        })();
    }

    /**
     * 通过 skn 搜索商品
     * @param productSkn
     * @returns {*|Promise.<TResult>}
     * @private
     */
    searchProductBySkn(productSkn) {
        return this.get({
            data: {
                method: 'h5.product.batch',
                productSkn: productSkn
            },
            param: {code: 200, cache: true}
        }).then(result => {
            return _.get(result, 'data.product_list', []);
        });
    }
};