import { Provide } from '@midwayjs/core';
|
import { BaseService, CoolCommException, CoolTransaction } from '@cool-midway/core';
|
import { InjectEntityModel } from '@midwayjs/typeorm';
|
import { QueryRunner, Repository } from 'typeorm';
|
import { RecycleTransactionEntity } from '../entity/transaction';
|
import { UserInfoEntity } from '../../user/entity/info';
|
|
/**
|
* 碳积分流转记录
|
*/
|
@Provide()
|
export class RecycleTransactionService extends BaseService {
|
@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;
|
}
|
}
|