12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- '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 OrderService extends CrudService {
- constructor(ctx) {
- super(ctx, 'order');
- this.orderModel = this.ctx.model.Trade.Order;
- }
- async allOrder(query = {}) {
- const { skip, limit } = query;
- const pipeline = [];
- const step1 = [
- { $addFields: { order_id: { $toString: '$_id' } } },
- {
- $lookup: {
- from: 'orderDetail',
- localField: 'order_id',
- foreignField: 'order',
- as: 'orderDetails',
- },
- },
- ];
- pipeline.push(...step1);
- const step2 = [
- {
- $project: {
- data: {
- $cond: {
- if: { $gt: [{ $size: '$orderDetails' }, 0 ] },
- then: '$orderDetails',
- else: '$$CURRENT',
- },
- },
- },
- },
- ];
- pipeline.push(...step2);
- pipeline.push({ $unwind: '$data' });
- pipeline.push({ $replaceRoot: { newRoot: '$data' } });
- const qp = _.cloneDeep(pipeline);
- qp.push({ $sort: { 'meta.createdAt': -1 } });
- if (skip && limit) qp.push({ $skip: parseInt(skip) }, { $limit: parseInt(limit) });
- const data = await this.orderModel.aggregate(qp);
- const tr = await this.orderModel.aggregate([ ...pipeline, { $count: 'total' }]);
- for (const i of data) {
- const { pay, goods } = i;
- if (pay) {
- // 这个是order表的数据,需要用order的计算方式
- const buy_num_total = goods.reduce(
- (p, n) =>
- this.ctx.plus(
- p,
- n.goods.reduce((np, ng) => this.ctx.plus(np, ng.buy_num), 0)
- ),
- 0
- );
- i.buy_num_total = buy_num_total;
- i.real_pay = _.get(i, 'pay.pay_money');
- } else {
- // 是orderDetail表的数据,需要用orderDetail的计算方式
- const real_pay = this.ctx.service.util.orderDetail.computedRealPay(i);
- i.real_pay = real_pay;
- i.buy_num_total = goods.reduce((p, n) => this.ctx.plus(p, n.buy_num), 0);
- }
- }
- const total = _.get(_.head(tr), 'total', 0);
- return { data, total };
- }
- }
- module.exports = OrderService;
|