orderDetail.js 2.9 KB

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