consult.js 3.08 KB
/**
 * home-我的咨询 业务逻辑
 * @author 陈轩 <xuan.chen@yoho.cn>
 */
'use strict';

const path = require('path');
const Promise = require('bluebird');
const moment = require('moment');
const _ = require('lodash');
const imgUtils = require(path.join(global.utils, 'images'));
const api = global.yoho.API;
const searchApi = global.yoho.SearchAPI;
const helpers = global.yoho.helpers;
const co = Promise.coroutine;

// 分页 函数
const pagerPath = path.join(global.appRoot, '/apps/product/models/public-handler.js');
const pager = require(pagerPath).handlePagerData;


const NO_CONSULT = '您尚未咨询任何内容';

/**
 * 查询多个skn的默认商品
 * @param skns array
 * @return array
 */
function getProductGoodsInfo(skns) {
    const query = skns.join(',');

    return searchApi.get('/search.json', {
        data: {
            query: query
        }
    }).then(result => {
        let resData = {};

        _.forEach(_.get(result, 'data.product_list', []), good => {
            resData[good.product_skn] = good;
        });

        return resData;
    });
}

/**
 * 获取咨询列表
 */
exports.consultList = (uid, page, limit) => {
    page = Number.parseInt(page, 10) || 1;
    limit = Number.parseInt(limit, 10) || 10;

    const data = {
        uid: uid,
        page: page,
        limit: limit
    };

    const fetchConsults = co(function*(params) {
        let res = yield api.get('', Object.assign({
            method: 'web.personCen.buyConsult'
        }, params));

        return res;
    });

    // 处理fetchConsults的数据
    const processData = co(function*(res) {
        // 处理结果
        const result = {
            consults: [],
            pager: {}
        };
        let origin = res.data; // 原始数据
        const skns = [];


        if (res.code === 200 && origin && origin.consult_list && origin.consult_list.length) {
            origin.consult_list.forEach(consult => {
                skns.push(consult.skn);
            });

            let goodInfos = yield getProductGoodsInfo(skns);

            origin.consult_list.forEach(consult => {
                let goodInfo = goodInfos[consult.skn];

                if (!goodInfo) {
                    return;
                }

                let info = {
                    href: helpers.getUrlBySkc(goodInfo.productId, goodInfo.goodsId, goodInfo.cn_alphabet),
                    thumb: imgUtils.getImageUrl(goodInfo.images_url, 60, 60, 1),
                    name: consult.productName,
                    question: consult.ask || '',
                    consultTime: moment(consult.askTime).format('YYYY-MM-DD H:m:s')
                };


                if (consult.answer) {
                    info.reply = consult.answer;
                }

                result.consults.push(info);
            });

            result.pager = pager(origin.total, {
                page: origin.page,
                limit: limit
            });

        }
        if (!result.consults.length) {
            result.empty = NO_CONSULT;
        }

        return result;
    });


    return fetchConsults(data).then(processData);
};