'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); const at = _.get(detail, 'at', 0); delete detail.at; detail = Object.values(detail); let realPay = detail.reduce((p, n) => this.ctx.plus(p, _.get(n, priceKey, 0)), 0); realPay = this.ctx.minus(realPay, at); 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之和) ** ad:活动明细 ** at:活动优惠价格 ** }, ** at: 活动返现总价(act.reduce) ** } */ 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, freight: f, buy_num: bn, _id, act: ad = [] } = g; const sm = _.get(g, 'price', sell_money); 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 at = ad.reduce((p, n) => this.ctx.plus(p, n.discount), 0); const grp = this.ctx.minus(this.ctx.minus(gt, dt), at); const obj = { sm, f, bn, st, ft, gt, dd, dt, grp, at, ad }; result[_id] = obj; } const act = _.get(data, 'total_detail.act', []); const at = act.reduce((p, n) => this.ctx.plus(p, n.money), 0); result.at = at; return result; } } module.exports = OrderDetailService;