orderDetail.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. ** ad:活动明细
  46. ** at:活动优惠价格
  47. ** },
  48. ** at: 活动返现总价(act.reduce)
  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, freight: f, buy_num: bn, _id, act: ad = [] } = g;
  59. const sm = _.get(g, 'price', sell_money);
  60. const st = this.ctx.multiply(sm, bn);
  61. const ft = this.ctx.multiply(f, bn);
  62. const gt = this.ctx.plus(st, ft);
  63. const dd = {};
  64. for (const uc_id in ddt) {
  65. const detail = _.get(ddt, uc_id, {});
  66. const value = detail[_id];
  67. if (value) dd[uc_id] = value;
  68. }
  69. const dt = Object.values(dd).reduce((p, n) => this.ctx.plus(p, n), 0);
  70. // 活动部分
  71. const at = ad.reduce((p, n) => this.ctx.plus(p, n.discount), 0);
  72. const grp = this.ctx.minus(this.ctx.minus(gt, dt), at);
  73. const obj = { sm, f, bn, st, ft, gt, dd, dt, grp, at, ad };
  74. result[_id] = obj;
  75. }
  76. const act = _.get(data, 'total_detail.act', []);
  77. const at = act.reduce((p, n) => this.ctx.plus(p, n.money), 0);
  78. result.at = at;
  79. return result;
  80. }
  81. /**
  82. * $numberDecimal 转换成数字
  83. * @param {Any} data
  84. */
  85. turn$numberDecimalToNumber(data) {
  86. if (_.isArray(data)) {
  87. for (const i of data) {
  88. if (_.isArray(data)) this.turn$numberDecimalToNumber(i);
  89. else if (_.isObject(data)) this.turn$numberDecimalToNumber(i);
  90. }
  91. } else if (_.isObject(data)) {
  92. for (const key in data) {
  93. const value = data[key];
  94. if (_.isArray(value)) this.turn$numberDecimalToNumber(value);
  95. else if (_.isObject(value) && _.has(value, '$numberDecimal')) data[key] = this.ctx.toNumber(value);
  96. }
  97. }
  98. }
  99. }
  100. module.exports = OrderDetailService;