orderDetail.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 'use strict';
  2. const { CrudService } = require('naf-framework-mongoose-free/lib/service');
  3. const { BusinessError, ErrorCode } = require('naf-core').Error;
  4. const _ = require('lodash');
  5. const assert = require('assert');
  6. //
  7. class OrderDetailService extends CrudService {
  8. constructor(ctx) {
  9. super(ctx, 'orderdetail');
  10. this.orderDetailModel = this.ctx.model.Trade.OrderDetail;
  11. }
  12. /**
  13. * 计算订单详情实际支付金额
  14. * @param {Object} data 订单详情数据
  15. * @return {Number} 实际支付金额
  16. */
  17. computedRealPay(data) {
  18. let priceKey;
  19. if (_.get(data, 'type', '0') === '1') priceKey = 'ggrp';
  20. else priceKey = 'grp';
  21. let detail = this.moneyDetail(data);
  22. detail = Object.values(detail);
  23. let realPay = detail.reduce((p, n) => this.ctx.plus(p, _.get(n, priceKey, 0)), 0);
  24. const at = _.get(detail, 'at', 0);
  25. realPay = this.ctx.minus(realPay, at);
  26. return realPay;
  27. }
  28. /**
  29. * 按商品计算该订单详情的价格明细
  30. * @param {Object} data 订单详情数据
  31. * @return {Object} 返回{
  32. ** 规格id:{
  33. ** sm: 规格正常销售价格(sell_money),
  34. ** f: 规格运费(freight),
  35. ** bn: 购买数量(buy_num),
  36. ** st: 规格正常销售总价(sell_total: sm * bn)
  37. ** ft: 规格运费总价(freight_total: f * bn)
  38. ** gt: 商品支付原价(goods_total: st + ft)
  39. ** dd: {
  40. ** key:优惠券id,
  41. ** value:优惠价格
  42. ** },
  43. ** dt: 优惠总价(d_detail的value之和)
  44. ** grp:商品实际支付价格(goods_real_pay: gt - dt)
  45. ** gsm:规格团购销售价格(group_sell_money)
  46. ** gst: 规格团购销售总价(group_sell_total: gsm * bn)
  47. ** ggt: 商品团购支付原价(goods_group_total: gst + ft)
  48. ** ggrp: 商品团购实际支付价格(goods_group_real_pay: ggt - dt)
  49. ** },
  50. ** at: 活动返现总价(act.reduce)
  51. ** }
  52. */
  53. moneyDetail(data) {
  54. if (!data) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到订单信息');
  55. // 优惠部分
  56. const ddt = _.get(data, 'total_detail.discount_detail', {});
  57. const goods = _.get(data, 'goods', []);
  58. const result = {};
  59. for (const g of goods) {
  60. const { sell_money: sm, freight: f, buy_num: bn, group_config, _id } = g;
  61. const st = this.ctx.multiply(sm, bn);
  62. const ft = this.ctx.multiply(f, bn);
  63. const gt = this.ctx.plus(st, ft);
  64. const dd = {};
  65. for (const uc_id in ddt) {
  66. const detail = _.get(ddt, uc_id, {});
  67. const value = detail[_id];
  68. if (value) dd[uc_id] = value;
  69. }
  70. const dt = Object.values(dd).reduce((p, n) => this.ctx.plus(p, n), 0);
  71. const grp = this.ctx.minus(gt, dt);
  72. let obj = { sm, f, bn, st, ft, gt, dd, dt, grp };
  73. const gsm = _.get(group_config, 'money');
  74. if (gsm) {
  75. const gst = this.ctx.multiply(gsm, bn);
  76. const ggt = this.ctx.plus(gst, ft);
  77. const ggrp = this.ctx.minus(ggt, dt);
  78. obj = { ...obj, gsm, gst, ggt, ggrp };
  79. }
  80. result[_id] = obj;
  81. }
  82. const act = _.get(data, 'total_detail.act', []);
  83. const at = act.reduce((p, n) => this.ctx.plus(p, n.money), 0);
  84. result.at = at;
  85. return result;
  86. }
  87. }
  88. module.exports = OrderDetailService;