12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- '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;
|