'use strict'; const { CrudService } = require('naf-framework-mongoose-free/lib/service'); const { BusinessError, ErrorCode } = require('naf-core').Error; const _ = require('lodash'); const assert = require('assert'); // class OrderDetailService extends CrudService { constructor(ctx) { super(ctx, 'orderdetail'); this.orderDetailModel = this.ctx.model.Trade.OrderDetail; } /** * 计算订单详情实际支付金额 * @param {Object} data 订单详情数据 * @return {Number} 实际支付金额 */ computedRealPay(data) { let priceKey; if (_.get(data, 'type', '0') === '1') priceKey = 'ggrp'; else priceKey = 'grp'; let detail = this.moneyDetail(data); detail = Object.values(detail); const realPay = detail.reduce((p, n) => this.ctx.plus(p, _.get(n, priceKey, 0)), 0); return realPay; } /** * 按商品计算该订单详情的价格明细 * @param {Object} data 订单详情数据 * @return {Object} 返回{ * 规格id:{ * sm: 规格正常销售价格(sell_money), * f: 规格运费(freight), * bn: 购买数量(buy_num), * st: 规格正常销售总价(sell_total: sm * bn) * ft: 规格运费总价(freight_total: f * bn) * gt: 商品支付原价(goods_total: st + ft) * dd: { * key:优惠券id, * value:优惠价格 * }, * dt: 优惠总价(d_detail的value之和) * grp:商品实际支付价格(goods_real_pay: gt - dt) * gsm:规格团购销售价格(group_sell_money) * gst: 规格团购销售总价(group_sell_total: gsm * bn) * ggt: 商品团购支付原价(goods_group_total: gst + ft) * ggrp: 商品团购实际支付价格(goods_group_real_pay: ggt - dt) * * } * } */ moneyDetail(data) { if (!data) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到订单信息'); // 优惠部分 const ddt = _.get(data, 'total_detail.discount_detail', {}); const goods = _.get(data, 'goods', []); const result = {}; for (const g of goods) { const { sell_money: sm, freight: f, buy_num: bn, group_config, _id } = g; const st = this.ctx.multiply(sm, bn); const ft = this.ctx.multiply(f, bn); const gt = this.ctx.plus(st, ft); const dd = {}; for (const uc_id in ddt) { const detail = _.get(ddt, uc_id, {}); const value = detail[_id]; if (value) dd[uc_id] = value; } const dt = Object.values(dd).reduce((p, n) => this.ctx.plus(p, n), 0); const grp = this.ctx.minus(gt, dt); let obj = { sm, f, bn, st, ft, gt, dd, dt, grp }; const gsm = _.get(group_config, 'money'); if (gsm) { const gst = this.ctx.multiply(gsm, bn); const ggt = this.ctx.plus(gst, ft); const ggrp = this.ctx.minus(ggt, dt); obj = { ...obj, gsm, gst, ggt, ggrp }; } result[_id] = obj; } return result; } } module.exports = OrderDetailService;