list.js 6.56 KB

'use strict';

const _ = require('lodash');
const Search = require('../models/list');
const camelCase = global.yoho.camelCase;

function brandLetters() {
    let letters = [];

    letters.push({
        letter: '0-9',
        selected: false
    });

    for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {
        letters.push({
            letter: String.fromCharCode(i),
            selected: false
        });
    }

    return letters;
}

function peopleChoose() {
    return [
        {
            name: '男士',
            value: '1,3'
        }, {
            name: '女士',
            value: '2,3'
        }];
}

function colorConver(colors) {
    return colors.map(c => {
        return {
            id: c.colorId,
            title: c.colorName,
            rgb: c.colorValue || '#' + c.colorCode
        };
    });
}

function newFilter(key, value, name) {
    return {
        key: key,
        value: value,
        name: name
    };
}

function getNav(channel, sort, sorts) {
    let nav = [{
        link: '#',
        pathTitle: '',
        name: 'MEN首页'
    }];

    if (sort) {
        sorts.forEach(s => {
            if (s.relationParameter.sort === sort) {
                nav.push({
                    link: '#',
                    pathTitle: '',
                    name: s.categoryName
                });
            } else if (s.sub) {
                s.sub.forEach(m => {
                    if (m.relationParameter.sort === sort) {
                        nav.push({
                            link: '#',
                            pathTitle: '',
                            name: s.categoryName
                        });
                        nav.push({
                            link: '#',
                            pathTitle: '',
                            name: m.categoryName
                        });
                    }
                });
            }
        });
    }
    return nav;
}

const list = {
    index: (req, res, next) => {
        let page = req.query.page || 1;
        let brand = req.query.brand || 0;
        let sort = req.query.sort || '';
        let gender = req.query.gender || '';
        let price = req.query.price || '';
        let size = req.query.size || '';
        let color = req.query.color || '';
        let order = req.query.order || '';

        Search.queryProduct({
            page: page,
            brand: brand,
            sort: sort,
            gender: gender,
            size: size,
            price: price,
            color: color,
            order: order
        }).then(result => {

            if (result && result.code === 200 && result.data) {
                let data = camelCase(result.data);
                let ret = {};

                if (data.filter) {
                    let priceRange = data.filter.priceRange;
                    let sizeInfo = data.filter.size;
                    let genders = peopleChoose(gender);
                    let brands = data.filter.brand;
                    let colors = colorConver(data.filter.color);
                    let sorts = data.filter.groupSort;
                    let filters = [];

                    genders.forEach(g => {
                        if (g.value === gender) {
                            g.checked = true;
                            filters.push(newFilter('gender', gender, g.name));
                        }
                    });

                    priceRange = Object.keys(priceRange).map((k) => {
                        let prices = k.split(',');

                        if (k === price) {
                            filters.push(newFilter('price', price, ${prices[0]}-¥${prices[1]}`));
                        }
                        return {
                            lower: prices[0],
                            higher: prices[1]
                        };
                    }).sort((a, b) => {
                        return a.lower - b.lower;
                    });

                    if (!_.isArray(sizeInfo)) {
                        sizeInfo.checked = true;
                        sizeInfo = [sizeInfo];
                    }

                    if (size) {
                        sizeInfo.forEach(s => {
                            if (s.sizeId === parseInt(size)) {
                                filters.push(newFilter('size', size, s.sizeName));
                            }
                        });
                    }

                    if (brand) {
                        let brandNames = brands.filter(b => {
                            return (',' + brand + ',').indexOf(',' + b.id + ',') >= 0;
                        }).map(b => {
                            return b.brandName;
                        }).join('、');

                        filters.push(newFilter('brand', brand, brandNames));
                    }

                    if (color) {
                        colors.forEach(c => {
                            if (c.id === parseInt(color)) {
                                c.cur = true;

                                let fi = newFilter('color', color, c.title);

                                fi.color = c;
                                filters.push(fi);
                            }
                        });
                    }

                    ret = {
                        people: genders,
                        sortData: sorts,
                        brandData: brands,
                        colors: colors,
                        size: sizeInfo,
                        priceRange: priceRange,
                        filters: filters,
                        showFilters: filters.length > 0,
                        navPath: {
                            nav: getNav('', sort, sorts)
                        }
                    };
                }

                let pagination = {
                    page: page,
                    limit: data.limit || 45,
                    total: data.total
                };

                console.log(pagination);

                res.display('list', _.assign(ret, {
                    letters: brandLetters(),
                    total: data.total,
                    pageTotal: data.pageTotal,
                    pageNo: data.page,
                    products: data.productList,
                    pagination: pagination,
                    order: order,
                    module: 'product',
                    page: 'list',
                    title: '列表'
                }));
            } else {
                return Promise.reject('query product error');
            }
        }).catch(next);

    }
};

module.exports = list;