easypay.js 4.04 KB
/**
 * 立即购买controller
 * @author: yyq<yanqing.yang@yoho.cn>
 * @date: 2016/9/23
 */
'use strict';

const _ = require('lodash');

const helper = global.yoho.helpers;
const crypto = global.yoho.crypto;

const EasypayApi = require('./easypay-api');
const AddressApi = require('./address-api');
const EnsureApi = require('./order-ensure-api');

const EnsureHandle = require('./order-ensure-handle');

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

    _getLimitProductData(params) {
        let resList = [];

        if (params.limitcode && params.sku && params.skn) {
            resList.push({
                type: 'limitcode',
                buy_number: 1,
                sku: params.sku,
                skn: params.skn,
                limitproductcode: params.limitcode
            });
        } else if (params.bundle && params.sku) {
            resList = [];

            _.forEach(_.split(params.sku, ',', 10), val => {
                resList.push({
                    type: 'bundle',
                    sku: parseInt(val, 10),
                    buy_number: 1
                });
            });
        }

        return resList.length ? JSON.stringify(resList) : false;
    }

    // 获取结算信息
    getEasypayOrderData(params, uid) {
        let resData = {};
        let strInfo = this._getLimitProductData(params);
        let bundle = params.bundle ? parseInt(params.bundle, 10) : false;

        return Promise.all([
            new EasypayApi(this.ctx).getEasyPaymentAsync(uid, strInfo, bundle),
            new AddressApi(this.ctx).getAddressListAsync(uid),
            new EnsureApi(this.ctx).getUserProfileAsync(uid)
        ]).then(result => {
            let data = _.get(result, '[0].data', false);
            let address = _.get(result, '[1].data', []);
            let receiver = _.get(result, '[2].data.mobile', '');

            if (+_.get(result, '[0].code') === 9999992) {
                resData.pageErrorTip = _.get(result, '[0].message', '');

                return resData;
            }

            if (data) {
                Object.assign(resData, new EnsureHandle(this.ctx).handlePaymentInfo(data, address), {
                    receiverMobile: receiver,
                    hideReceiverMobile: _.replace(receiver, /(\d{3})\d{4}(\d{4,9})/, '$1****$2')
                });
            }

            return resData;
        });
    }

    // 价格计算
    getOrderComputeData(uid, cartType, params) {
        params.productSkuList = this._getLimitProductData(params);

        return new EasypayApi(this.ctx).getEasypayComputeAsync(uid, cartType, params.paymentType, params.deliveryWay, params).then(result => { // eslint-disable-line
            if (result.code === 200) {
                let ensureHandleModel = new EnsureHandle(this.ctx);

                if (_.has(result, 'data.last_order_amount')) {
                    result.data.last_order_amount = (result.data.last_order_amount).toFixed(2);
                }

                if (_.has(result, 'data.promotion_formula_list')) {
                    ensureHandleModel.handleViewPrice(result.data.promotion_formula_list);
                }

                result.data = Object.assign(result.data, ensureHandleModel.handleUseYohoCoin(result.data));
            }
            return result;
        });
    }

    // 订单提交
    easypayOrderSubmit(uid, cartType, params, remoteIp) {
        params.addressId = crypto.decrypt('', params.addressId);
        params.productSkuList = this._getLimitProductData(params);

        return new EasypayApi(this.ctx).easypayOrderSubmitAsync(
            uid, cartType, params.addressId, params.deliveryTime,
            params.deliveryWay, params.paymentType, params.paymentId,
            params.printPrice, params, remoteIp
        ).then(result => {
            if (result.code === 200) {
                let d = result.data;

                d.url = helper.urlFormat('/shopping/newpay', {
                    ordercode: d.order_code
                });
            }
            return result;
        });
    }
};