| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import { join } from 'path'
- import { Inject, Injectable, forwardRef } from '@nestjs/common'
- import { InjectRepository } from '@nestjs/typeorm'
- import { CommissionConfig } from './entities/commission-config.entity'
- import { Repository } from 'typeorm'
- import { CommissionRecord } from './entities/commission-record.entity'
- import { Users } from '../users/entities/users.entity'
- import { UserBalanceService } from '../user-balance/user-balance.service'
- import { BalanceType as BalanceType } from 'src/user-balance/entities/balance-record.entity'
- import { BigNumber } from 'bignumber.js'
- import { CommissionRecordDto } from './dto/commission-record.dto'
- import { hideSensitiveData } from 'src/utils/common'
- import { MembershipService } from 'src/membership/membership.service'
- @Injectable()
- export class CommissionService {
- constructor(
- @InjectRepository(CommissionConfig)
- private readonly commissionConfigRepository: Repository<CommissionConfig>,
- @InjectRepository(CommissionRecord)
- private readonly commissionRecordRepository: Repository<CommissionRecord>,
- @InjectRepository(Users)
- private readonly usersRepository: Repository<Users>,
- private readonly userBalanceService: UserBalanceService,
- @Inject(forwardRef(() => MembershipService))
- private readonly membershipService: MembershipService
- ) {}
- async saveConfig(config: Partial<CommissionConfig>) {
- return await this.commissionConfigRepository.save(config)
- }
- async doCommission(userId: number, amount: BigNumber) {
- amount = new BigNumber(amount)
- const user = await this.usersRepository.findOneBy({
- id: userId
- })
- if (!user || !user.invitor) return
- const plans = await this.membershipService.getPlans()
- const configs = await this.commissionConfigRepository.find()
- const maxLevel = configs.map((config) => config.level).sort((a, b) => b - a)[0] || 0
- let invitorId = user.invitor
- for (let i = 0; i < maxLevel; i++) {
- const invitor = await this.usersRepository.findOneBy({
- id: invitorId
- })
- if (!invitor) return
- const membership = await this.membershipService.getMembership(invitorId)
- const plan = plans.find((plan) => plan.id === membership.planId)
- if (plan?.commissionable) {
- const config = configs.find((config) => config.level === i + 1)
- if (config) {
- const commission = amount.times(config.ratio)
- await this.userBalanceService.modifyBalance(invitorId, commission, BalanceType.COMMISSION)
- await this.commissionRecordRepository.save(
- new CommissionRecord({
- userId: invitorId,
- fromUserId: userId,
- amount: commission,
- level: configs[i].level,
- ratio: configs[i].ratio
- })
- )
- }
- }
- if (!invitor.invitor) return
- invitorId = invitor.invitor
- }
- }
- async getRecords(userId: number) {
- return (
- await this.commissionRecordRepository
- .createQueryBuilder()
- .leftJoinAndMapOne(
- 'CommissionRecord.fromUser',
- Users,
- 'fromUser',
- 'CommissionRecord.fromUserId = fromUser.id'
- )
- .where('CommissionRecord.userId = :userId', { userId })
- .orderBy('CommissionRecord.createdAt', 'DESC')
- .getMany()
- ).map((record) => {
- return new CommissionRecordDto({
- id: record.id,
- userId: record.userId,
- fromUserId: record.fromUserId,
- name: hideSensitiveData(record.fromUser?.name),
- level: record.level,
- ratio: record.ratio,
- amount: record.amount
- })
- })
- // return await this.commissionRecordRepository.find({
- // relations: {
- // fromUser: true
- // },
- // where: {
- // userId
- // },
- // order: {
- // createdAt: 'DESC'
- // }
- // })
- }
- }
|