wangzhibo
6 天以前 3f249e399659dcd09d3fe58071b146e50e45c17f
src/modules/shop/service/transaction.ts
@@ -1,8 +1,9 @@
import { Provide } from '@midwayjs/core';
import { BaseService } from '@cool-midway/core';
import { BaseService, CoolCommException, CoolTransaction } from '@cool-midway/core';
import { InjectEntityModel } from '@midwayjs/typeorm';
import { Repository } from 'typeorm';
import { QueryRunner, Repository } from 'typeorm';
import { RecycleTransactionEntity } from '../entity/transaction';
import { UserInfoEntity } from '../../user/entity/info';
/**
 * 碳积分流转记录
@@ -12,4 +13,139 @@
  @InjectEntityModel(RecycleTransactionEntity)
  recycleTransactionEntity: Repository<RecycleTransactionEntity>;
}
  @InjectEntityModel(UserInfoEntity)
  userInfoEntity: Repository<UserInfoEntity>;
  /**
   * App 端分页:转赠 tab 只看赠送/接受,收支 tab 看其余类型
   */
  async page(query: any) {
    const { userId, tab, page = 1, size = 10 } = query || {};
    const find = this.recycleTransactionEntity.createQueryBuilder('a');
    if (userId) {
      find.andWhere('a.userId = :uid', { uid: String(userId) });
    }
    if (tab === 'io') {
      find.andWhere('(a.sourceType != :t1 AND a.sourceType != :t2)', {
        t1: '赠送',
        t2: '接受',
      });
    } else {
      find.andWhere('(a.sourceType = :t1 OR a.sourceType = :t2)', {
        t1: '赠送',
        t2: '接受',
      });
    }
    find.orderBy('a.createTime', 'DESC');
    find.addOrderBy('a.id', 'DESC');
    console.log(find)
    return this.entityRenderPage(find, { ...query, page, size }, false);
  }
  async checkUser(unionid: string) {
    if (!unionid) {
      throw new CoolCommException('请选择系统用户作为接受转赠对象');
    }
    const user = await this.userInfoEntity.findOneBy({ unionid });
    if (!user) {
      throw new CoolCommException('请选择系统用户作为接受转赠对象');
    }
    return {
      unionid: user.unionid,
      nickName: user.nickName,
      phone: user.phone,
    };
  }
  @CoolTransaction()
  async transfer(
    param: { fromUnionid: string; toUnionid: string; amount: number },
    queryRunner?: QueryRunner
  ) {
    if (!queryRunner) {
      throw new CoolCommException('事务启动失败');
    }
    const fromUnionid = String(param.fromUnionid || '').trim();
    const toUnionid = String(param.toUnionid || '').trim();
    const amount = Number(param.amount);
    if (!fromUnionid || !toUnionid) {
      throw new CoolCommException('转赠参数不完整');
    }
    if (fromUnionid === toUnionid) {
      throw new CoolCommException('不能转赠给自己');
    }
    if (!amount || amount <= 0) {
      throw new CoolCommException('转赠金额必须大于0');
    }
    const manager = queryRunner.manager;
    const fromUser = await manager.findOne(UserInfoEntity, {
      where: { unionid: fromUnionid },
    });
    const toUser = await manager.findOne(UserInfoEntity, {
      where: { unionid: toUnionid },
    });
    if (!toUser) {
      throw new CoolCommException('请选择系统用户作为接受转赠对象');
    }
    if (!fromUser) {
      throw new CoolCommException('当前用户不存在');
    }
    if (Number(fromUser.carbonBalance || 0) < amount) {
      throw new CoolCommException('碳积分不足');
    }
    const dec = await manager
      .createQueryBuilder()
      .update(UserInfoEntity)
      .set({ carbonBalance: () => `carbonBalance - ${amount}` })
      .where('unionid = :unionid AND carbonBalance >= :amount', {
        unionid: fromUnionid,
        amount,
      })
      .execute();
    if (!dec.affected) {
      throw new CoolCommException('碳积分不足');
    }
    await manager
      .createQueryBuilder()
      .update(UserInfoEntity)
      .set({ carbonBalance: () => `carbonBalance + ${amount}` })
      .where('unionid = :unionid', { unionid: toUnionid })
      .execute();
    const fromName = fromUser.nickName || fromUser.phone || fromUnionid;
    const toName = toUser.nickName || toUser.phone || toUnionid;
    await manager.save(RecycleTransactionEntity, [
      {
        userId: fromUnionid,
        departmentId: fromUser.departmentId,
        type: '支出',
        amount,
        sourceType: '赠送',
        remark: `转赠给${toName}`,
      },
      {
        userId: toUnionid,
        departmentId: toUser.departmentId,
        type: '收入',
        amount,
        sourceType: '接受',
        remark: `从${fromName}获赠`,
      },
    ]);
    return true;
  }
}