xiongzhu 2 년 전
부모
커밋
fe0ea518b8

+ 1 - 0
package.json

@@ -42,6 +42,7 @@
     "ali-oss": "^6.17.1",
     "axios": "^1.3.5",
     "bcrypt": "^5.1.0",
+    "big.js": "^6.2.1",
     "class-transformer": "^0.5.1",
     "class-validator": "^0.13.0",
     "crypto": "^1.0.1",

+ 2 - 1
src/commission/commission.module.ts

@@ -4,9 +4,10 @@ import { CommissionController } from './commission.controller'
 import { TypeOrmModule } from '@nestjs/typeorm'
 import { CommissionConfig } from './entities/commission-config.entity'
 import { CommissionRecord } from './entities/commission-record.entity'
+import { Users } from 'src/users/entities/users.entity'
 
 @Module({
-    imports: [TypeOrmModule.forFeature([CommissionRecord, CommissionConfig])],
+    imports: [TypeOrmModule.forFeature([CommissionRecord, CommissionConfig, Users])],
     providers: [CommissionService],
     controllers: [CommissionController],
     exports: [CommissionService]

+ 34 - 1
src/commission/commission.service.ts

@@ -3,6 +3,7 @@ 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 'src/users/entities/users.entity'
 
 @Injectable()
 export class CommissionService {
@@ -10,10 +11,42 @@ export class CommissionService {
         @InjectRepository(CommissionConfig)
         private readonly commissionConfigRepository: Repository<CommissionConfig>,
         @InjectRepository(CommissionRecord)
-        private readonly commissionRecordRepository: Repository<CommissionRecord>
+        private readonly commissionRecordRepository: Repository<CommissionRecord>,
+        @InjectRepository(Users)
+        private readonly usersRepository: Repository<Users>
     ) {}
 
     async saveConfig(config: Partial<CommissionConfig>) {
         return await this.commissionConfigRepository.save(config)
     }
+
+    async doCommission(userId: number, amount: number) {
+        const user = await this.usersRepository.findOneBy({
+            id: userId
+        })
+        if (!user || !user.invitor) return
+
+        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 config = configs.find((config) => config.level === i + 1)
+            if (config) {
+                const commission = Number((amount * config.ratio).toFixed(2))
+                await this.commissionRecordRepository.save({
+                    userId: invitorId,
+                    amount,
+                    commission,
+                    level: configs[i].level
+                })
+            }
+            if (!invitor.invitor) return
+            invitorId = invitor.invitor
+        }
+    }
 }

+ 9 - 0
src/commission/entities/balance-record.entity.ts

@@ -0,0 +1,9 @@
+import { Column,ValueTransformer } from "typeorm"
+import { Big } from 'big.js'
+
+export class BalanceRecord {
+    userId: number
+
+    @Column({ type: 'decimal', precision: 19, scale: 2 })
+    amount: number
+}

+ 5 - 3
src/commission/entities/commission-config.entity.ts

@@ -1,12 +1,14 @@
-import { Column, PrimaryGeneratedColumn } from 'typeorm'
+import { Column, Entity, PrimaryGeneratedColumn, Unique } from 'typeorm'
+import { Big } from 'big.js'
 
+@Entity()
 export class CommissionConfig {
     @PrimaryGeneratedColumn()
     id: number
 
-    @Column()
+    @Column({ unique: true })
     level: number
 
-    @Column()
+    @Column({ type: 'decimal', precision: 19, scale: 6 })
     ratio: number
 }

+ 1 - 0
src/commission/entities/user-balance.entity.ts

@@ -0,0 +1 @@
+export class UserBalance {}

+ 1 - 1
views/h5pay.hbs

@@ -80,7 +80,7 @@
                 data: {{{ jsapiData}}},
             };
 
-            $.get('/api/weixin/jsapiSign', { url: encodeURI(window.location.href.split('#')[0]), }, function (res) {
+            $.post('/api/weixin/jsapiSign', { url: window.location.href }, function (res) {
                 res.jsApiList = [
                     'chooseWXPay',
                     'updateAppMessageShareData',

+ 5 - 0
yarn.lock

@@ -1968,6 +1968,11 @@ bcrypt@^5.1.0:
     "@mapbox/node-pre-gyp" "^1.0.10"
     node-addon-api "^5.0.0"
 
+big.js@^6.2.1:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f"
+  integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==
+
 binary-extensions@^2.0.0:
   version "2.2.0"
   resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"