students.js 8.15 KB
/**
 * 学生营销数据处理
 * @date: 2016-08-06 14:24:04
 * @author: name<emial@yoho.cn>
 */

'use strict';
const utils = '../../../utils';
const api = global.yoho.API;
const queryString = require('querystring');
const _ = require('lodash');

const studentsApi = require('./students-api');
const stuHandler = require('./students-handler');
const helpers = global.yoho.helpers;
const crypto = global.yoho.crypto;
const headerModel = require('../../../doraemon/models/header');
const serviceApi = global.yoho.ServiceAPI;
const searchApi = require('./search-api');

const productProcess = require(`${utils}/product-process`);
const searchHandler = require('./search-handler');
const needParams = ['query', 'msort', 'misort', 'gender', 'shelveTime'];

// 学生营销资源码
const studentsCode = '989396a17443bf61e3e269702e51ef04'; // h5 a83b7d55324fb65f96c1f85a3387ebd8
// const studentsCode = 'a83b7d55324fb65f96c1f85a3387ebd8'; // h5 a83b7d55324fb65f96c1f85a3387ebd8

/**
 * 获取学生营销页面数据
 * @params channel Object 频道
 * @return name returnType 返回值描述
 */
exports.getStudentsData = (channel, req) => {
    let apiMethod = [
        headerModel.requestHeaderData(channel),

        // 资源位数据
        serviceApi.get('operations/api/v5/resource/get', {content_code: studentsCode}),

        // 认证总数
        studentsApi.getVerifiedTotal(),

        // 商品数据
        studentsApi.getStuProducts()
    ];

    let params = {};

    if (req.user.uid && req.query.collegeName && req.query.educationDegree &&
        req.query.enrollmentYear && req.query.sign) {
        params = {
            uid: req.user.uid,
            provName: req.query.provName,
            birthDay: req.query.birthDay,
            sex: req.query.sex,
            collegeName: req.query.collegeName,
            educationDegree: req.query.educationDegree,
            enrollmentYear: req.query.enrollmentYear
        };
        apiMethod.push(
            studentsApi.verifyStudent(req.user.uid, req.query.collegeName,
                req.query.educationDegree, req.query.enrollmentYear)
        );
    }
    return api.all(apiMethod).then(result => {
        let responseData = {
            module: 'product',
            page: 'students',
            realData: {
                sortItem: [
                    {title: '学生权益介绍', href: 'stu-rights'},
                    {title: '我要验证身份', href: 'stu-identity'},
                    {title: '学生热门单品', href: 'stu-good'},
                    {title: '更多活动推荐', href: 'stu-activity'}
                ],
                identityItem: {
                    stuNum: []
                }
            },

            footerTop: true
        };

        // 头部数据
        Object.assign(responseData, result[0]);

        // 资源位数据
        if (result[1].code === 200) {
            Object.assign(responseData.realData, stuHandler.studentResource(result[1].data));
        }

        if (result[2].code === 200) {
            responseData.realData.identityItem.stuNum = stuHandler.studentsNum(result[2].data);
        }

        if (result[3].code === 200) {
            let proList = result[3].data.product_list,
                proIdList = [];

            for (let i = 0; i < proList.length; i++) {
                proIdList.push(proList[i].product_id);
            }
            Object.assign(responseData.realData, {proObj: {}});
            Object.assign(responseData.realData.proObj, {proIds: proIdList.join(',')});
            Object.assign(responseData.realData.proObj, {proItem: stuHandler.stuProducts(proList)});
        }

        if (result[4]) {
            Object.assign(responseData.realData.identityObj, {verifyRusult: stuHandler.stuVerify(result[4], params)});
        }

        return responseData;
    });
};

/**
 * 获取学校地区数据
 * @return Object 接口数据
 */
exports.getSchoolArea = studentsApi.getArea;

/**
 * 根据地区码查询学校列表
 * @params areaCode int 地区码
 * @return Object 接口数据
 */
exports.getSchoolList = studentsApi.getSchool;

/**
 * 学历层次
 * @params areaCode int 地区码
 * @return Object 接口数据
 */
exports.getEduLevel = studentsApi.getEduLevelList;

/**
 * 身份验证
 * @params areaCode int 地区码
 * @return Object 接口数据
 */
exports.verifyIdentity = (uid, params) => {
    let pageUrl = helpers.urlFormat('/product/students?') +
    queryString.stringify({
        provName: params.provName,
        birthDay: params.certNo.substr(6, 8),
        sex: params.certNo.substr(16, 1),
        collegeName: params.collegeName,
        educationDegree: params.educationDegree,
        enrollmentYear: params.enrollmentYear
    }) + '&';

    return studentsApi.verifyIdentity(uid, params.certNo, params.name, pageUrl);
};

/**
 * 学生验证
 * @params areaCode int 地区码
 * @return Object 接口数据
 */
exports.verifyStudents = (params) => {
    return studentsApi.verifyStudent(params.uid, params.collegeName, params.educationDegree, params.enrollmentYear);
};

/**
 * 获取优惠券领取状态
 * @params
 * @return
 */
exports.userAcquireStatus = (uid, couponIds) => {
    let ids = couponIds.map(coupon => crypto.decrypt(null, coupon)).join(',');

    return studentsApi.userAcquireStatus(uid, ids).then(result => {
        if (result.code === 200) {
            _.forEach(result.data, (value) => {
                value.couponId = crypto.encryption(null, value.couponId + '');
            });
        }
        return result;
    });
};

/**
 * 获取学生返币专享商品列表数据
 */
exports.getStudentsList = (params, channel) => {
    let standard = [];

    _.forEach(params, (value, key) => {
        let s = _.split(key, 'parameter_', 2);

        if (s.length > 1) {
            standard.push(`${s[1]}_${value}`);
            _.unset(params, `${key}`);
        }
    });

    if (standard.length) {
        params.standard = standard.join(',');
    }

    let searchParams = searchHandler.getSearchParams(params);

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

    return Promise.all(apiMethod).then(result => {
        let finalResult = {
            module: 'product',
            page: 'list',
            headerData: Object.assign(result[0].headerData, {
                header: true
            }),
            list: {
                leftContent: {}
            }
        };

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

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

            finalResult.list = Object.assign(
            searchHandler.handlePathNavData(result[1].data.sort, params, 'sort', channel), {
                leftContent: searchHandler.handleSortData(result[1].data.sort, dps)
            });
        }

        // 获取商品数据和顶部筛选条件
        if (result[2].code === 200) {
            // 删掉student_price,不让页面显示
            _.forEach(result[2].data.product_list, goods => {
                delete goods.student_price;
            });
            Object.assign(finalResult.list, {
                filters: searchHandler.handleFilterDataAll(result[2].data, params),
                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}, params, {
                    from: {type: 'list', params: params}
                })),
                hasNextPage: searchHandler.handleNextPage(params, result[2].data.total),

                // 最近浏览记录
                latestWalk: 6
            });
        }

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