'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'); const { ObjectId } = require('mongoose').Types; // class OrderDetailService extends CrudService { constructor(ctx) { super(ctx, 'orderdetail'); this.model = this.ctx.model.Trade.OrderDetail; this.orderModel = this.ctx.model.Trade.Order; } /** * 创建:用户支付完成后的订单 * @param {Object} body 请求参数体 * @param body.order_id 下单的id * @param {Transaction} tran 数据库事务实例 */ async create({ order_id }, tran) { assert(order_id, '缺少支付订单信息'); // if (!tran) throw new BusinessError(ErrorCode.DATA_INVALID, '支付成功添加积分:缺少事务参数'); const order = await this.orderModel.findById(order_id); if (!order) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到支付订单的数据'); const { customer, address, goods, no, status, buy_time, pay, total_detail: otd } = order; if (status === '0') throw new BusinessError(ErrorCode.DATA_INVALID, '订单未支付'); const orderDetailData = { customer, address, order: order_id, buy_time, pay_time: _.get(pay, 'pay_time'), status }; // 补全 shop, goods, total_detail; // const arr = []; // 分订单计数器 let noTimes = 1; for (const s of goods) { const shop = _.get(s, 'shop'); const goodsList = _.get(s, 'goods', []); const detailNo = `${no}-${noTimes}`; const total_detail = this.getTotalDetail(goodsList); // 优惠部分分割 if (_.get(otd, 'discount_detail')) { // 如果有优惠部分,那就得找,优惠里面有没有对应的商品规格 const discount_detail = this.getGoodsListDiscountDetail(goodsList, _.get(otd, 'discount_detail')); total_detail.discount_detail = discount_detail; } noTimes++; const obj = { ...orderDetailData, shop, goods: goodsList, no: detailNo, total_detail }; tran.insert('OrderDetail', obj); // arr.push(obj); } // await this.model.insertMany(arr); } /** * 将商品规格列表中,优惠的部分提取出来,分单用 * @param {Array} goodsList 某店的商品列表 * @param {Object} odd discount_detail 支付订单的优惠券设置 */ getGoodsListDiscountDetail(goodsList, odd) { const result = {}; for (const uc_id in odd) { const detail = odd[uc_id]; const obj = {}; for (const g of goodsList) { const { _id } = g; const gdd = detail[_id]; if (gdd) obj[_id] = gdd; } result[uc_id] = obj; } return result; } /** * 计算某店铺的金额总计 * @param {Array} goodsList 商品规格列表 */ getTotalDetail(goodsList) { const goods_total = goodsList.reduce((p, n) => this.ctx.plus(p, this.ctx.multiply(n.sell_money, n.buy_num)), 0); const freight_total = goodsList.reduce((p, n) => this.ctx.plus(p, this.ctx.multiply(n.freight, n.buy_num)), 0); return { goods_total, freight_total }; } async fetch(filter) { assert(filter); filter = await this.beforeFetch(filter); const { _id, id } = filter; if (_id || id) filter = { _id: ObjectId(_id || id) }; const { populate } = this.getRefMods(); let res = await this.model.findOne(filter).populate(populate).exec(); res = await this.afterFetch(filter, res); return res; } } module.exports = OrderDetailService;