123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- 'use strict';
- const BaseService = require('./base.js');
- // 餐饮币变动服务类
- class DiningCoinService extends BaseService {
- /**
- * 餐饮币变化
- * @return {Promise<type[]>}
- */
- async addDiningCoinChangeLog(params = {}, transaction = null) {
- const that = this;
- let action_user = '';
- // -1提现失败,0提现成功;1发放餐饮币;2提现中;3
- // eslint-disable-next-line default-case
- switch (params.type) {
- case -1:
- case 0:
- case 2:
- action_user = '店铺提现';
- break;
- case 1:
- action_user = '购买餐币';
- break;
- case 3:
- action_user = '餐饮消费';
- break;
- case 4:
- action_user = '核销餐币';
- break;
- }
- const createBean = await that.app.comoBean.instance({
- user_id: params.user_id,
- order_id: params.order_id,
- type: params.type,
- account: params.account,
- out_batch_no: params.out_batch_no,
- out_detail_no: params.out_detail_no,
- partner_id: params.partner_id,
- action_user,
- log_desc: params.log_desc,
- create_time: that.app.szjcomo.date('Y-m-d H:i:s'),
- ori_partner: params.ori_partner,
- customer_id: params.customer_id,
- customer_name: params.customer_name,
- customer_img: params.customer_img,
- }, { transaction });
- const result = await that.create(createBean, that.app.model.DinnerCoinLogs, '记录用户餐饮币变动失败');
- return result;
- }
- /**
- * 餐饮币发放到用户账户 并 记录
- * @param orderInfo
- */
- async dispatchDiningCoin(orderInfo = null) {
- const that = this;
- const transaction = await that.app.model.transaction();
- try {
- if (orderInfo && !orderInfo.dining_coin_send) {
- // 2023/2/28 客源来源鉴别
- let ori_partner_id = -1;
- const inviterInfo = await that.app.model.Users.findOne({
- where: { user_id: orderInfo.inviter_id },
- attributes: [ 'partner_id' ],
- });
- if (inviterInfo) {
- ori_partner_id = inviterInfo.partner_id;
- }
- // 2023/2/28 订单餐饮币发放状态
- let dining_coin_send = false;
- // 2023/2/27 订单商品匹配发放餐饮币
- if (orderInfo.orders_products.length > 0) {
- for (const ordersProduct of orderInfo.orders_products) {
- if (ordersProduct.dining_partner_id > 0 && ordersProduct.dinning_coin_amount > 0) {
- // 2022/11/18 记录餐饮币发放记录
- await that.addDiningCoinChangeLog({
- user_id: orderInfo.user_id,
- order_id: orderInfo.order_id,
- partner_id: ordersProduct.dining_partner_id,
- type: 1,
- account: ordersProduct.dinning_coin_amount * ordersProduct.product_count,
- log_desc: '购酒获得餐饮币',
- }, transaction);
- // 2023/2/28 查询用户餐饮币账户列表 添加 或 更新账户余额
- const info = await that.app.model.DinnerCoins.findOne({
- where: {
- user_id: orderInfo.user_id,
- ori_partner: ori_partner_id === ordersProduct.dining_partner_id,
- partner_id: ordersProduct.dining_partner_id,
- expired: false,
- },
- transaction,
- raw: true,
- });
- if (!info) {
- // 2023/2/27 没有对应类型的餐饮币 则插入该类型的餐饮币账户
- const data = {
- user_id: orderInfo.user_id,
- account: ordersProduct.dinning_coin_amount * ordersProduct.product_count,
- ori_partner: ori_partner_id === ordersProduct.dining_partner_id,
- partner_id: ordersProduct.dining_partner_id,
- create_time: that.app.szjcomo.date('Y-m-d H:i:s'),
- expired: false,
- expired_time: that.app.szjcomo.date('Y-m-d H:i:s', parseInt(+new Date() + '') / 1000 + 90 * 24 * 60 * 60),
- };
- const res = await that.app.model.PartnerInfo.findOne({
- where: { id: ordersProduct.dining_partner_id },
- transaction,
- raw: true,
- });
- data.partner_name = res.name;
- data.partner_address = res.address;
- data.partner_tel = res.tel_num;
- data.partner_opening_time = res.opening_time;
- const createBean = await that.app.comoBean.instance(data, { transaction });
- await that.service.base.create(createBean, that.app.model.DinnerCoins, '餐饮币发放失败,请重试');
- } else {
- const updateBean = await that.app.comoBean.instance({
- account: info.account + ordersProduct.dinning_coin_amount * ordersProduct.product_count,
- update_time: that.app.szjcomo.date('Y-m-d H:i:s'),
- expired: false,
- expired_time: that.app.szjcomo.date('Y-m-d H:i:s', parseInt(+new Date() + '') / 1000 + 90 * 24 * 60 * 60),
- }, {
- where: {
- user_id: orderInfo.user_id,
- ori_partner: ori_partner_id === ordersProduct.dining_partner_id,
- partner_id: ordersProduct.dining_partner_id,
- }, transaction,
- });
- await that.service.base.update(updateBean, that.app.model.DinnerCoins, '餐饮币余额更新失败,请重试');
- }
- dining_coin_send = true;
- // 2023/3/28 更新餐店订单量+1
- const updatePartnerBean = await that.app.comoBean.instance({
- order_amount: that.app.Sequelize.literal('order_amount + ' + 1),
- update_time: that.app.szjcomo.date('Y-m-d H:i:s'),
- }, { where: { id: ordersProduct.dining_partner_id }, transaction });
- await that.update(updatePartnerBean, that.app.model.PartnerInfo, '合作餐店订单量更新失败,请稍候重试');
- }
- }
- // 2023/2/28 更新订单餐饮币发放状态
- if (dining_coin_send) {
- const updateBean = that.app.comoBean.instance({ dining_coin_send }, {
- where: { order_id: orderInfo.order_id }, transaction,
- });
- await that.service.base.update(updateBean, that.app.model.Orders, '更新订单餐饮币发放状态失败,请稍候重试');
- }
- await transaction.commit();
- }
- }
- } catch (e) {
- if (transaction) await transaction.rollback();
- throw new Error(e.toString());
- }
- }
- /**
- * 付款后操作检查订单及餐饮币发放
- * @return {Promise<void>}
- */
- async orderDiningCoinDispatchAfterPay(order_id = -1) {
- const that = this;
- // 2022/12/24 查询订单包含商品列表详情
- const order = await that.selectOrderInfo(order_id);
- if (!order) throw new Error('订单不存在');
- await that.dispatchDiningCoin(order);
- }
- /**
- * 查询订单详情
- * @param order_id
- * @return {Promise<null|*>}
- */
- async selectOrderInfo(order_id) {
- const that = this;
- const options = {
- where: { order_id }, include: [
- {
- model: that.app.model.OrdersProducts, as: 'orders_products', attributes: {
- exclude: [ 'product_id', 'create_time', 'order_id', 'activity_name', 'activity_id', 'activity_desc' ],
- },
- },
- ], attributes: {
- exclude: [ 'seller_remarks', 'province_id', 'city_id', 'county_id', 'shipping_id', 'shipping_fee', 'activity_id', 'activity_name', 'activity_desc' ],
- },
- };
- const selectBean = await that.app.comoBean.instance({}, options);
- try {
- return await that.service.base.select(selectBean, that.app.model.Orders, '查询订单详情失败,请稍候重试', false, false);
- } catch (e) {
- that.logger.error('订单id:%s ;分佣查询订单详情失败', order_id);
- return null;
- }
- }
- }
- module.exports = DiningCoinService;
|