123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- '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;
- }
- /**
- * $numberDecimal 转换成数字
- * @param {Any} data
- */
- turn$numberDecimalToNumber(data) {
- if (_.isArray(data)) {
- for (const i of data) {
- if (_.isArray(data)) this.turn$numberDecimalToNumber(i);
- else if (_.isObject(data)) this.turn$numberDecimalToNumber(i);
- }
- } else if (_.isObject(data)) {
- for (const key in data) {
- const value = data[key];
- if (_.isArray(value)) this.turn$numberDecimalToNumber(value);
- else if (_.isObject(value) && _.has(value, '$numberDecimal')) data[key] = this.ctx.toNumber(value);
- }
- }
- }
- }
- module.exports = OrderDetailService;
|