| | |
| | | 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'; |
| | | |
| | | /** |
| | | * 碳积分流转记录 |
| | |
| | | @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; |
| | | } |
| | | } |