orderDetail.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. const at = _.get(detail, 'at', 0);
  23. delete detail.at;
  24. detail = Object.values(detail);
  25. let realPay = detail.reduce((p, n) => this.ctx.plus(p, _.get(n, priceKey, 0)), 0);
  26. realPay = this.ctx.minus(realPay, at);
  27. return realPay;
  28. }
  29. /**
  30. * 按商品计算该订单详情的价格明细
  31. * @param {Object} data 订单详情数据
  32. * @return {Object} 返回{
  33. ** 规格id:{
  34. ** sm: 规格正常销售价格(sell_money),
  35. ** f: 规格运费(freight),
  36. ** bn: 购买数量(buy_num),
  37. ** st: 规格正常销售总价(sell_total: sm * bn)
  38. ** ft: 规格运费总价(freight_total: f * bn)
  39. ** gt: 商品支付原价(goods_total: st + ft)
  40. ** dd: {
  41. ** key:优惠券id,
  42. ** value:优惠价格
  43. ** },
  44. ** dt: 优惠总价(d_detail的value之和)
  45. ** grp:商品实际支付价格(goods_real_pay: gt - dt)
  46. ** gsm:规格团购销售价格(group_sell_money)
  47. ** gst: 规格团购销售总价(group_sell_total: gsm * bn)
  48. ** ggt: 商品团购支付原价(goods_group_total: gst + ft)
  49. ** ggrp: 商品团购实际支付价格(goods_group_real_pay: ggt - dt)
  50. ** },
  51. ** at: 活动返现总价(act.reduce)
  52. ** }
  53. */
  54. moneyDetail(data) {
  55. if (!data) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到订单信息');
  56. // 优惠部分
  57. const ddt = _.get(data, 'total_detail.discount_detail', {});
  58. const goods = _.get(data, 'goods', []);
  59. const result = {};
  60. for (const g of goods) {
  61. const { sell_money: sm, freight: f, buy_num: bn, group_config, _id } = g;
  62. const st = this.ctx.multiply(sm, bn);
  63. const ft = this.ctx.multiply(f, bn);
  64. const gt = this.ctx.plus(st, ft);
  65. const dd = {};
  66. for (const uc_id in ddt) {
  67. const detail = _.get(ddt, uc_id, {});
  68. const value = detail[_id];
  69. if (value) dd[uc_id] = value;
  70. }
  71. const dt = Object.values(dd).reduce((p, n) => this.ctx.plus(p, n), 0);
  72. const grp = this.ctx.minus(gt, dt);
  73. let obj = { sm, f, bn, st, ft, gt, dd, dt, grp };
  74. const gsm = _.get(group_config, 'money');
  75. if (gsm) {
  76. const gst = this.ctx.multiply(gsm, bn);
  77. const ggt = this.ctx.plus(gst, ft);
  78. const ggrp = this.ctx.minus(ggt, dt);
  79. obj = { ...obj, gsm, gst, ggt, ggrp };
  80. }
  81. result[_id] = obj;
  82. }
  83. const act = _.get(data, 'total_detail.act', []);
  84. const at = act.reduce((p, n) => this.ctx.plus(p, n.money), 0);
  85. result.at = at;
  86. return result;
  87. }
  88. }
  89. module.exports = OrderDetailService;