"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserBalanceService = void 0; const globalConfig_service_1 = require("./../globalConfig/globalConfig.service"); const typeorm_1 = require("@nestjs/typeorm"); const balance_entity_1 = require("./balance.entity"); const common_1 = require("@nestjs/common"); const typeorm_2 = require("typeorm"); const balance_constant_1 = require("../../common/constants/balance.constant"); const accountLog_entity_1 = require("./accountLog.entity"); const utils_1 = require("../../common/utils"); const config_entity_1 = require("../globalConfig/config.entity"); const cramiPackage_entity_1 = require("../crami/cramiPackage.entity"); const userBalance_entity_1 = require("./userBalance.entity"); const date_1 = require("../../common/utils/date"); const user_entity_1 = require("../user/user.entity"); const salesUsers_entity_1 = require("../sales/salesUsers.entity"); const sales_service_1 = require("../sales/sales.service"); const whiteList_entity_1 = require("../chatgpt/whiteList.entity"); const fingerprint_entity_1 = require("./fingerprint.entity"); const chatLog_entity_1 = require("../chatLog/chatLog.entity"); const chatGroup_entity_1 = require("../chatGroup/chatGroup.entity"); const midjourney_entity_1 = require("../midjourney/midjourney.entity"); let UserBalanceService = class UserBalanceService { constructor(balanceEntity, userBalanceEntity, accountLogEntity, cramiPackageEntity, configEntity, userEntity, salesUsersEntity, whiteListEntity, fingerprintLogEntity, chatGroupEntity, chatLogEntity, midjourneyEntity, salesService, globalConfigService) { this.balanceEntity = balanceEntity; this.userBalanceEntity = userBalanceEntity; this.accountLogEntity = accountLogEntity; this.cramiPackageEntity = cramiPackageEntity; this.configEntity = configEntity; this.userEntity = userEntity; this.salesUsersEntity = salesUsersEntity; this.whiteListEntity = whiteListEntity; this.fingerprintLogEntity = fingerprintLogEntity; this.chatGroupEntity = chatGroupEntity; this.chatLogEntity = chatLogEntity; this.midjourneyEntity = midjourneyEntity; this.salesService = salesService; this.globalConfigService = globalConfigService; } async addBalanceToNewUser(userId, invitedId) { try { const registerConfigs = await this.configEntity.find({ where: { configKey: (0, typeorm_2.In)([ 'registerSendStatus', 'registerSendModel3Count', 'registerSendModel4Count', 'registerSendDrawMjCount', 'firstRegisterSendStatus', 'firstRegisterSendRank', 'firstRregisterSendModel3Count', 'firstRregisterSendModel4Count', 'firstRregisterSendDrawMjCount', 'inviteSendStatus', 'inviteGiveSendModel3Count', 'inviteGiveSendModel4Count', 'inviteGiveSendDrawMjCount', 'invitedGuestSendModel3Count', 'invitedGuestSendDrawMjCount', 'invitedGuestSendModel4Count', ]), }, }); const configMap = registerConfigs.reduce((pre, cur) => { const num = Number(cur.configVal); const n = Number.isInteger(num) && num > 0 ? num : 0; pre[cur.configKey] = n; return pre; }, {}); let model3Count = 0; let model4Count = 0; let drawMjCount = 0; if (configMap.registerSendStatus === 1) { model3Count = model3Count + configMap.registerSendModel3Count; model4Count = model4Count + configMap.registerSendModel4Count; drawMjCount = drawMjCount + configMap.registerSendDrawMjCount; } if (configMap.registerSendStatus === 1 && configMap.firstRegisterSendStatus === 1 && userId <= configMap.firstRegisterSendRank) { model3Count = model3Count + configMap.firstRregisterSendModel3Count; model4Count = model4Count + configMap.firstRregisterSendModel4Count; drawMjCount = drawMjCount + configMap.firstRregisterSendDrawMjCount; } await this.saveRecordRechargeLog({ userId, rechargeType: balance_constant_1.RechargeType.REG_GIFT, model3Count, drawMjCount, model4Count }); if (invitedId) { if (Number(configMap.inviteSendStatus) === 1) { model3Count = model3Count + Number(configMap.invitedGuestSendModel3Count); model4Count = model4Count + Number(configMap.invitedGuestSendModel4Count); drawMjCount = drawMjCount + Number(configMap.invitedGuestSendDrawMjCount); await this.saveRecordRechargeLog({ userId, rechargeType: balance_constant_1.RechargeType.INVITE_GIFT, model3Count: configMap.invitedGuestSendModel3Count, model4Count: configMap.invitedGuestSendModel4Count, drawMjCount: configMap.invitedGuestSendDrawMjCount, }); await this.addBalanceToUser(invitedId, { model3Count: configMap.inviteGiveSendModel3Count, model4Count: configMap.inviteGiveSendModel4Count, drawMjCount: configMap.inviteGiveSendDrawMjCount, }); await this.saveRecordRechargeLog({ userId: invitedId, rechargeType: balance_constant_1.RechargeType.REFER_GIFT, model3Count: configMap.inviteGiveSendModel3Count, model4Count: configMap.inviteGiveSendModel4Count, drawMjCount: configMap.inviteGiveSendDrawMjCount, }); } } await this.userBalanceEntity.save({ userId, model3Count, model4Count, drawMjCount, useTokens: 0 }); } catch (error) { console.log('error: ', error); throw new common_1.HttpException('注册赠送失败,请联系管理员!', common_1.HttpStatus.BAD_REQUEST); } } async validateBalance(req, type, amount) { const { id: userId, role } = req.user; let b = await this.userBalanceEntity.findOne({ where: { userId } }); if (!b) { b = await this.createBaseUserBalance(userId); } if (role === 'visitor') { return this.validateVisitorBalance(req, type, amount); } const res = await this.configEntity.findOne({ where: { configKey: 'vxNumber' } }); const vxNumber = res ? res.configVal : '---'; const memberKey = type === 'model3' ? 'memberModel3Count' : type === 'model4' ? 'memberModel4Count' : type === 'mjDraw' ? 'memberDrawMjCount' : null; const baseKey = type === 'model3' ? 'model3Count' : type === 'model4' ? 'model4Count' : type === 'mjDraw' ? 'drawMjCount' : null; if (b.packageId && b[memberKey] < amount) { if (b[baseKey] < amount) { throw new common_1.HttpException(`您的账户余额不足,如果想继续体验服务,请联系管理员 或购买专属套餐 !`, common_1.HttpStatus.PAYMENT_REQUIRED); } } if (!b.packageId && b[baseKey] < amount) { throw new common_1.HttpException(`您的账户余额不足,如果想继续体验服务,请联系管理员 或购买专属套餐 !`, common_1.HttpStatus.PAYMENT_REQUIRED); } return b; } async validateVisitorBalance(req, type, amount) { const { id } = req.user; const baseKey = type === 'model3' ? 'model3Count' : type === 'model4' ? 'model4Count' : type === 'mjDraw' ? 'drawMjCount' : null; const now = new Date(); const log = await this.fingerprintLogEntity.findOne({ where: { fingerprint: id } }); const { visitorModel3Num, visitorModel4Num, visitorMJNum } = await this.globalConfigService.getConfigs(['visitorModel3Num', 'visitorModel4Num', 'visitorMJNum']); const settings = { model3Count: visitorModel3Num ? Number(visitorModel3Num) : 0, model4Count: visitorModel4Num ? Number(visitorModel4Num) : 0, drawMjCount: visitorMJNum ? Number(visitorMJNum) : 0 }; if (!log) { let data = { fingerprint: id, model3Count: 0, model4Count: 0, drawMjCount: 0 }; data[baseKey] = data[baseKey] + amount; if (data[baseKey] > settings[baseKey]) { throw new common_1.HttpException(`今日当前类型免费额度已经使用完毕、建议您注册账户体验更加完整的服务内容!`, common_1.HttpStatus.PAYMENT_REQUIRED); } else { await this.fingerprintLogEntity.save(data); return true; } } else { const { model3Count, model4Count, drawMjCount } = log; let data = { model3Count, model4Count, drawMjCount }; const date = Number(new Date(log.updatedAt)); const isUpdateLastDay = this.isUpdatedToday(date); if (isUpdateLastDay) { data[baseKey] = data[baseKey] + amount; } else { data = { model3Count: 0, model4Count: 0, drawMjCount: 0 }; data[baseKey] = data[baseKey] + amount; } if (data[baseKey] > settings[baseKey]) { throw new common_1.HttpException(`今日当前类型免费额度已经使用完毕、建议您注册账户体验更加完整的服务内容!`, common_1.HttpStatus.PAYMENT_REQUIRED); } else { await this.fingerprintLogEntity.update({ fingerprint: id }, data); return true; } } } isUpdatedToday(date) { const now = new Date(); const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()); return date >= todayStart; } async deductFromBalance(userId, deductionType, amount, UseAmount = 0) { const b = await this.userBalanceEntity.findOne({ where: { userId } }); if (!b) { throw new common_1.HttpException('缺失当前用户账户记录!', common_1.HttpStatus.BAD_REQUEST); } const memberKey = deductionType === 'model3' ? 'memberModel3Count' : deductionType === 'model4' ? 'memberModel4Count' : deductionType === 'mjDraw' ? 'memberDrawMjCount' : null; const baseKey = deductionType === 'model3' ? 'model3Count' : deductionType === 'model4' ? 'model4Count' : deductionType === 'mjDraw' ? 'drawMjCount' : null; const updateKey = b.packageId && b[memberKey] < amount ? baseKey : b.packageId ? memberKey : baseKey; let useKey = null; if (updateKey.includes('odel3')) { useKey = 'useModel3Token'; } if (updateKey.includes('odel4')) { useKey = 'useModel4Token'; } if (updateKey.includes('MjCount')) { useKey = 'useDrawMjToken'; } const updateBalance = { [updateKey]: b[updateKey] - amount < 0 ? 0 : b[updateKey] - amount, [useKey]: b[useKey] + UseAmount, }; if (useKey === 'useModel3Token') { updateBalance['useModel3Count'] = b['useModel3Count'] + amount; } if (useKey === 'useModel4Token') { updateBalance['useModel4Count'] = b['useModel4Count'] + amount; } const result = await this.userBalanceEntity.update({ userId }, updateBalance); if (result.affected === 0) { throw new common_1.HttpException('消费余额失败!', common_1.HttpStatus.BAD_REQUEST); } } async queryUserBalance(userId) { try { const res = await this.userBalanceEntity.findOne({ where: { userId }, select: [ 'packageId', 'model3Count', 'model4Count', 'drawMjCount', 'memberModel3Count', 'memberModel4Count', 'memberDrawMjCount', 'useModel3Count', 'useModel4Count', 'useModel3Token', 'useModel4Token', 'useDrawMjToken', 'expirationTime', ], }); if (!res) { const user = await this.createBaseUserBalance(userId); if (user) { return await this.queryUserBalance(userId); } else { throw new common_1.HttpException('查询当前用户余额失败!', common_1.HttpStatus.BAD_REQUEST); } } res.sumModel3Count = res.packageId ? res.model3Count + res.memberModel3Count : res.model3Count; res.sumModel4Count = res.packageId ? res.model4Count + res.memberModel4Count : res.model4Count; res.sumDrawMjCount = res.packageId ? res.drawMjCount + res.memberDrawMjCount : res.drawMjCount; res.expirationTime = res.expirationTime ? (0, date_1.formatDate)(res.expirationTime, 'YYYY-MM-DD') : null; return res; } catch (error) { console.log('error: ', error); } } async saveRecordRechargeLog(logInfo) { const { userId, rechargeType, model3Count, model4Count, drawMjCount, days = -1, pkgName = '', extent = '' } = logInfo; if (!userId) { throw new common_1.HttpException('当前用户不存在,记录充值日志异常', common_1.HttpStatus.BAD_REQUEST); } const uid = (0, utils_1.createRandomUid)(); return await this.accountLogEntity.save({ userId, rechargeType, model3Count, model4Count, drawMjCount, days, extent, uid, pkgName }); } async createBaseUserBalance(userId, userBalanceInfo = {}) { const { model3Count = 0, model4Count = 0, drawMjCount = 0 } = userBalanceInfo; const balance = await this.userBalanceEntity.findOne({ where: { userId } }); if (balance) { throw new common_1.HttpException('当前用户无需创建账户信息!', common_1.HttpStatus.BAD_REQUEST); } return await this.userBalanceEntity.save({ userId, model3Count, model4Count, drawMjCount }); } async addBalanceToUser(userId, balance, days = -1) { try { const userBalanceInfo = (await this.userBalanceEntity.findOne({ where: { userId } })) || (await this.createBaseUserBalance(userId)); if (!userBalanceInfo) { throw new common_1.HttpException('查询用户账户信息失败!', common_1.HttpStatus.BAD_REQUEST); } const { model3Count, model4Count, drawMjCount, memberModel3Count, memberModel4Count, memberDrawMjCount } = userBalanceInfo; let params = {}; if (days > 0) { const { packageId } = balance; if (!packageId) { throw new common_1.HttpException('缺失当前套餐ID、充值失败!', common_1.HttpStatus.BAD_REQUEST); } const pkgInfo = await this.cramiPackageEntity.findOne({ where: { id: packageId } }); if (!pkgInfo) { throw new common_1.HttpException('当前套餐不存在!', common_1.HttpStatus.BAD_REQUEST); } const { weight } = pkgInfo; if (!userBalanceInfo.packageId) { params = { memberModel3Count: model3Count + balance.model3Count, memberModel4Count: model4Count + balance.model4Count, memberDrawMjCount: drawMjCount + balance.drawMjCount, expirationTime: (0, date_1.default)() .add(days > 0 ? days : 0, 'day') .format('YYYY-MM-DD HH:mm:ss'), packageId: packageId, }; } else { const curPackageInfo = await this.cramiPackageEntity.findOne({ where: { id: userBalanceInfo.packageId } }); if (weight >= curPackageInfo.weight) { params = { memberModel3Count: memberModel3Count + balance.model3Count, memberModel4Count: memberModel4Count + balance.model4Count, memberDrawMjCount: memberDrawMjCount + balance.drawMjCount, expirationTime: (0, date_1.default)(userBalanceInfo.expirationTime) .add(days > 0 ? days : 0, 'day') .format('YYYY-MM-DD HH:mm:ss'), packageId: packageId, }; } if (weight < curPackageInfo.weight) { params = { memberModel3Count: memberModel3Count + balance.model3Count, memberModel4Count: memberModel4Count + balance.model4Count, memberDrawMjCount: memberDrawMjCount + balance.drawMjCount, }; } } } if (days <= 0) { params = { model3Count: model3Count + balance.model3Count, model4Count: model4Count + balance.model4Count, drawMjCount: drawMjCount + balance.drawMjCount, }; } const result = await this.userBalanceEntity.update({ userId }, params); if (result.affected === 0) { throw new common_1.HttpException(`${userId}充值失败`, common_1.HttpStatus.BAD_REQUEST); } } catch (error) { console.log('error: ', error); throw new common_1.HttpException('用户充值失败!', common_1.HttpStatus.BAD_REQUEST); } } async addBalanceToOrder(order) { console.log('充值的工单信息:', order); try { const { userId, goodsId } = order; const pkg = await this.cramiPackageEntity.findOne({ where: { id: order.goodsId, status: 1 } }); if (!pkg) { throw new common_1.HttpException('非法操作、当前充值套餐暂不存在!', common_1.HttpStatus.BAD_REQUEST); } const { model3Count, model4Count, drawMjCount, days, name: pkgName } = pkg; const money = { model3Count, model4Count, drawMjCount, days, packageId: order.goodsId, }; await this.addBalanceToUser(userId, money, days); await this.saveRecordRechargeLog({ userId, rechargeType: balance_constant_1.RechargeType.SCAN_PAY, model3Count, model4Count, drawMjCount, pkgName, days }); const userInfo = await this.userEntity.findOne({ where: { id: userId } }); const { invitedBy } = userInfo; if (invitedBy) { const inviteUserInfo = await this.userEntity.findOne({ where: { inviteCode: invitedBy } }); const inviteUserSalesInfo = await this.salesUsersEntity.findOne({ where: { userId: inviteUserInfo.id } }); if (!inviteUserInfo) return; const { id: inviterUserId } = inviteUserInfo; const { performanceRatio } = inviteUserSalesInfo; const recordsInfo = { inviterUserId, inviteeUserId: userId, orderId: order.id, orderPrice: order.total, commissionPercentage: performanceRatio, commissionAmount: ((order.total * performanceRatio) / 100).toFixed(2), }; await this.salesService.createSalesRecords(recordsInfo); await this.salesService.saveCommissionAmount(inviterUserId, recordsInfo.commissionAmount); } } catch (error) { console.log('error: ', error); throw new common_1.HttpException('充值失败!', common_1.HttpStatus.BAD_REQUEST); } } async getRechargeLog(req, params) { const { page = 1, size = 20 } = params; const { id } = req.user; const [rows, count] = await this.accountLogEntity.findAndCount({ where: { userId: id }, order: { id: 'DESC' }, skip: (page - 1) * size, take: size, }); rows.forEach((item) => { item.expireDateCn = item.days > 0 ? `${item.days}天` : '永久'; }); return { rows: (0, date_1.formatCreateOrUpdateDate)(rows), count }; } async getAccountLog(req, params) { try { const { page = 1, size = 10, userId, rechargeType, packageId } = params; const { role } = req.user; const where = {}; rechargeType && (where.rechargeType = rechargeType); where.userId = userId || (0, typeorm_2.LessThan)(100000); packageId && (where.packageId = { $like: `%${packageId}%` }); const [rows, count] = await this.accountLogEntity.findAndCount({ where, order: { id: 'DESC' }, skip: (page - 1) * size, take: size, }); const userIds = rows.map((item) => item.userId); const userInfo = await this.userEntity.find({ where: { id: (0, typeorm_2.In)(userIds) } }); rows.forEach((item) => { const user = userInfo.find((user) => user.id === item.userId); item.username = user === null || user === void 0 ? void 0 : user.username; item.email = user === null || user === void 0 ? void 0 : user.email; item.phone = user === null || user === void 0 ? void 0 : user.phone; item.status = user === null || user === void 0 ? void 0 : user.status; item.avatar = user === null || user === void 0 ? void 0 : user.avatar; }); if (role !== 'super') { rows.forEach((item) => { item.email = item.email ? (0, utils_1.hideString)(item.email) : ''; item.phone = item.phone ? (0, utils_1.hideString)(item.phone) : ''; }); } return { rows, count }; } catch (error) { console.log('error: ', error); throw new common_1.HttpException('查询用户账户失败!', common_1.HttpStatus.BAD_REQUEST); } } async queryUserBalanceByIds(ids) { return await this.userBalanceEntity.find({ where: { userId: (0, typeorm_2.In)(ids) } }); } async refundMjBalance(userId, amount) { return await this.deductFromBalance(userId, 'mjDraw', -amount); } async upgradeBalance() { const users = await this.userEntity.find(); if (!users.length) return; const upgradeStatus = await this.globalConfigService.getConfigs(['upgradeStatus']); if (!upgradeStatus) { await this.globalConfigService.setConfig({ settings: [{ configKey: 'upgradeStatus', configVal: '1' }] }); } else { throw new common_1.HttpException('您已经升级过了、请勿重复操作!', common_1.HttpStatus.BAD_REQUEST); } users.forEach((user) => { const { id } = user; this.balanceEntity.findOne({ where: { userId: id } }).then((res) => { if (!res) return; this.writeOldBalanceToNewTable(id, res); }); }); } async writeOldBalanceToNewTable(userId, balanceInfo) { const { balance = 0, usesLeft = 0, paintCount = 0, useTokens = 0, useChats = 0, usePaints = 0 } = balanceInfo; const model4Info = await this.whiteListEntity.findOne({ where: { userId } }); const newBalanceInfo = { userId, model3Count: Number(usesLeft), model4Count: (model4Info === null || model4Info === void 0 ? void 0 : model4Info.count) || 0, drawMjCount: Number(balance), useModel3Count: Number(useChats), useModel4Count: (model4Info === null || model4Info === void 0 ? void 0 : model4Info.useCount) || 0, useDrawMjCount: Number(usePaints), useModel3Token: Number(useTokens), useModel4Token: 0, useDrawMjToken: 0, }; const userBalanceInfo = await this.userBalanceEntity.findOne({ where: { userId } }); if (userBalanceInfo) { common_1.Logger.debug(`用户${userId}账户信息已经存在、迁移无效`, 'BalanceService'); } else { this.userBalanceEntity .save(newBalanceInfo) .then((res) => { common_1.Logger.debug(`用户${userId}旧账户信息迁移成功`, 'BalanceService'); }) .catch((error) => { console.log('error: ', error); common_1.Logger.debug(`用户${userId}旧账户信息迁移失败`, 'BalanceService'); }); } } async inheritVisitorData(req) { const { fingerprint } = req.headers; const { id: userId } = req.user; await this.chatLogEntity.update({ userId: Number(fingerprint) }, { userId }); await this.chatGroupEntity.update({ userId: Number(fingerprint) }, { userId }); await this.midjourneyEntity.update({ userId: Number(fingerprint) }, { userId }); return 1; } async getVisitorCount(req) { const { fingerprint } = req.headers; const countChat = await this.chatLogEntity.count({ where: { userId: fingerprint } }); const countChatGroup = await this.chatGroupEntity.count({ where: { userId: fingerprint } }); const countMj = await this.midjourneyEntity.count({ where: { userId: fingerprint } }); return countChat || countChatGroup || countMj || 0; } }; UserBalanceService = __decorate([ (0, common_1.Injectable)(), __param(0, (0, typeorm_1.InjectRepository)(balance_entity_1.BalanceEntity)), __param(1, (0, typeorm_1.InjectRepository)(userBalance_entity_1.UserBalanceEntity)), __param(2, (0, typeorm_1.InjectRepository)(accountLog_entity_1.AccountLogEntity)), __param(3, (0, typeorm_1.InjectRepository)(cramiPackage_entity_1.CramiPackageEntity)), __param(4, (0, typeorm_1.InjectRepository)(config_entity_1.ConfigEntity)), __param(5, (0, typeorm_1.InjectRepository)(user_entity_1.UserEntity)), __param(6, (0, typeorm_1.InjectRepository)(salesUsers_entity_1.SalesUsersEntity)), __param(7, (0, typeorm_1.InjectRepository)(whiteList_entity_1.WhiteListEntity)), __param(8, (0, typeorm_1.InjectRepository)(fingerprint_entity_1.FingerprintLogEntity)), __param(9, (0, typeorm_1.InjectRepository)(chatGroup_entity_1.ChatGroupEntity)), __param(10, (0, typeorm_1.InjectRepository)(chatLog_entity_1.ChatLogEntity)), __param(11, (0, typeorm_1.InjectRepository)(midjourney_entity_1.MidjourneyEntity)), __metadata("design:paramtypes", [typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, sales_service_1.SalesService, globalConfig_service_1.GlobalConfigService]) ], UserBalanceService); exports.UserBalanceService = UserBalanceService;