This commit is contained in:
qq
2026-04-21 22:34:39 +08:00
commit c28429b589
718 changed files with 48804 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
import { Repository } from 'typeorm';
import { UserModel } from 'src/model/user.model';
import { AuthService } from 'src/app/common/service/auth.service';
import { CaptchaService } from 'src/app/common/service/captcha.service';
import { UserLogService } from '../../common/service/user_log.service';
export declare class ApiAuthService {
private authService;
private captchaService;
private userModel;
private userLogService;
constructor(authService: AuthService, captchaService: CaptchaService, userModel: Repository<UserModel>, userLogService: UserLogService);
login(phone: string, password: string, captchaKey?: string, captchaCode?: string): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<{
token: string;
} | undefined>>;
createToken(payload: Buffer | object): Promise<string>;
register(phone: string, password: string, inviteCode: string, captchaKey: string, captchaCode: string): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<{
token: string;
} | undefined>>;
private importUserAndJoinGroup;
}
+178
View File
@@ -0,0 +1,178 @@
"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.ApiAuthService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_model_1 = require("../../../model/user.model");
const auth_service_1 = require("../../common/service/auth.service");
const app_env_1 = require("../../../app.env");
const api_1 = require("../../common/api");
const captcha_service_1 = require("../../common/service/captcha.service");
const invite_code_pool_model_1 = require("../../../model/invite_code_pool.model");
const wallet_model_1 = require("../../../model/wallet.model");
const team_relation_model_1 = require("../../../model/team_relation.model");
const user_sign_in_model_1 = require("../../../model/user_sign_in.model");
const data_source_context_1 = require("../../common/context/data_source.context");
const app_info_context_1 = require("../context/app_info.context");
const im_help_1 = require("../../common/util/im_help");
const user_log_service_1 = require("../../common/service/user_log.service");
let ApiAuthService = class ApiAuthService {
authService;
captchaService;
userModel;
userLogService;
constructor(authService, captchaService, userModel, userLogService) {
this.authService = authService;
this.captchaService = captchaService;
this.userModel = userModel;
this.userLogService = userLogService;
}
async login(phone, password, captchaKey, captchaCode) {
if (captchaKey && captchaCode) {
const isValid = await this.captchaService.validate(captchaKey, captchaCode);
if (!isValid) {
return api_1.Api.error('验证码错误', 400);
}
}
const user = await this.userModel.findOne({
where: { phone, password },
});
if (!user) {
return api_1.Api.error('账号或密码错误');
}
await this.userModel.update({
id: user.id,
}, {
device: app_info_context_1.AppInfoContext.getAppInfo().device,
});
await this.userLogService.logLogin(user.id);
await this.userLogService.logStarted(user.id);
const token = await this.createToken({ sub: user.id });
return api_1.Api.success({ token });
}
async createToken(payload) {
return await this.authService.create(payload, {
secret: app_env_1.AppEnv.JWT_API_SECRET,
});
}
async register(phone, password, inviteCode, captchaKey, captchaCode) {
const isValid = await this.captchaService.validate(captchaKey, captchaCode);
if (!isValid) {
return api_1.Api.error('验证码错误', 400);
}
const ip = app_info_context_1.AppInfoContext.getAppInfo().ip;
if (ip) {
const ipCount = await this.userModel.count({
where: { registerIp: ip },
});
if (ipCount >= 5) {
return api_1.Api.error('该 IP 已注册满 5 个账号,无法继续注册');
}
}
return data_source_context_1.DataSourceContext.startTransaction(async (transaction) => {
const userRepo = transaction.getRepository(user_model_1.UserModel);
const inviteCodeRepo = transaction.getRepository(invite_code_pool_model_1.InviteCodePoolModel);
const walletRepo = transaction.getRepository(wallet_model_1.WalletModel);
const teamRelationRepo = transaction.getRepository(team_relation_model_1.TeamRelationModel);
const userSignInRepo = transaction.getRepository(user_sign_in_model_1.UserSignInModel);
const existingUser = await userRepo.findOne({
where: { phone },
});
if (existingUser) {
return api_1.Api.error('手机号已被注册');
}
const sponsorUser = await userRepo.findOne({
where: { inviteCode },
});
if (!sponsorUser) {
return api_1.Api.error('邀请码无效');
}
const user = userRepo.create({
nick: `${phone.slice(0, 3)}****${phone.slice(7)}`,
phone,
password,
inviteCode,
device: app_info_context_1.AppInfoContext.getAppInfo().device,
registerIp: ip,
});
const newUser = await userRepo.save(user);
const inviteCodeRecord = await inviteCodeRepo.findOneByOrFail({
id: newUser.id,
});
await userRepo.update({ id: newUser.id }, { inviteCode: inviteCodeRecord.code });
await walletRepo.insert({
userId: newUser.id,
});
let sponsorTeamRelation = null;
if (sponsorUser.id) {
sponsorTeamRelation = await teamRelationRepo.findOne({
where: { userId: sponsorUser.id },
});
}
const teamRelation = teamRelationRepo.create({
userId: newUser.id,
parentId: sponsorUser.id,
grandparentId: sponsorTeamRelation?.parentId || 0,
greatGrandparentId: sponsorTeamRelation?.grandparentId ?? 0,
path: sponsorTeamRelation
? `${sponsorTeamRelation.path}/${newUser.id}`
: `${newUser.id}`,
level: (sponsorTeamRelation?.level ?? 0) + 1,
});
await teamRelationRepo.save(teamRelation);
const userSignIn = userSignInRepo.create({
userId: newUser.id,
consecutiveDays: 0,
makeUpCount: 2,
});
await userSignInRepo.save(userSignIn);
await this.userLogService.logRegister(newUser.id);
await this.userLogService.logStarted(newUser.id);
await this.importUserAndJoinGroup(newUser);
const token = await this.createToken({ sub: newUser.id });
return api_1.Api.success({ token });
});
}
async importUserAndJoinGroup(user) {
const imUid = app_env_1.AppEnv.IM_USER_ID_PREFIX + user.id;
const arr = [
{
UserID: imUid,
Nick: user.nick,
FaceUrl: user.avatar,
},
];
await im_help_1.IMHelp.multiaccountImportUser(arr);
await im_help_1.IMHelp.importGroupMember({
GroupId: app_env_1.AppEnv.IM_DEFAULT_GROUP_ID,
MemberList: [
{
Member_Account: imUid,
},
],
});
}
};
exports.ApiAuthService = ApiAuthService;
exports.ApiAuthService = ApiAuthService = __decorate([
(0, common_1.Injectable)(),
__param(2, (0, typeorm_1.InjectRepository)(user_model_1.UserModel)),
__metadata("design:paramtypes", [auth_service_1.AuthService,
captcha_service_1.CaptchaService,
typeorm_2.Repository,
user_log_service_1.UserLogService])
], ApiAuthService);
//# sourceMappingURL=api-auth.service.js.map
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
import { Repository } from 'typeorm';
import { AppVersionModel, SystemType } from 'src/model/app_version.model';
import { Api } from 'src/app/common/api';
export declare class AppVersionService {
private appVersionModel;
constructor(appVersionModel: Repository<AppVersionModel>);
checkUpdate(currentVersion: string, systemType: SystemType): Promise<Api>;
private compareVersion;
}
+64
View File
@@ -0,0 +1,64 @@
"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.AppVersionService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const app_version_model_1 = require("../../../model/app_version.model");
const api_1 = require("../../common/api");
let AppVersionService = class AppVersionService {
appVersionModel;
constructor(appVersionModel) {
this.appVersionModel = appVersionModel;
}
async checkUpdate(currentVersion, systemType) {
const latestVersion = await this.appVersionModel.findOne({
where: { systemType },
order: { id: 'DESC' },
});
if (!latestVersion) {
return api_1.Api.success({
hasUpdate: false,
});
}
const needsUpdate = this.compareVersion(currentVersion, latestVersion.latestVersion) < 0;
return api_1.Api.success({
hasUpdate: needsUpdate,
latestVersion: needsUpdate ? latestVersion.latestVersion : undefined,
title: needsUpdate ? latestVersion.title : undefined,
downloadUrl: needsUpdate ? latestVersion.downloadUrl : undefined,
});
}
compareVersion(v1, v2) {
const parts1 = v1.split('.').map((p) => parseInt(p, 10));
const parts2 = v2.split('.').map((p) => parseInt(p, 10));
const len = Math.max(parts1.length, parts2.length);
for (let i = 0; i < len; i++) {
const n1 = parts1[i] || 0;
const n2 = parts2[i] || 0;
if (n1 !== n2) {
return n1 - n2;
}
}
return 0;
}
};
exports.AppVersionService = AppVersionService;
exports.AppVersionService = AppVersionService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(app_version_model_1.AppVersionModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], AppVersionService);
//# sourceMappingURL=app_version.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"app_version.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/app_version.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,wEAA0E;AAC1E,0CAAyC;AAIlC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAGlB;IAFV,YAEU,eAA4C;QAA5C,oBAAe,GAAf,eAAe,CAA6B;IACnD,CAAC;IAKJ,KAAK,CAAC,WAAW,CACf,cAAsB,EACtB,UAAsB;QAGtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACvD,KAAK,EAAE,EAAE,UAAU,EAAE;YACrB,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,SAAG,CAAC,OAAO,CAAC;gBACjB,SAAS,EAAE,KAAK;aACA,CAAC,CAAC;QACtB,CAAC;QAGD,MAAM,WAAW,GACf,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAEvE,OAAO,SAAG,CAAC,OAAO,CAAC;YACjB,SAAS,EAAE,WAAW;YACtB,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACpE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACpD,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC,CAAC;IACtB,CAAC;IAKO,cAAc,CAAC,EAAU,EAAE,EAAU;QAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACd,OAAO,EAAE,GAAG,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAA;AAtDY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,mCAAe,CAAC,CAAA;qCACT,oBAAU;GAH1B,iBAAiB,CAsD7B"}
+7
View File
@@ -0,0 +1,7 @@
import { Repository } from 'typeorm';
import { DailyMeetingStatsModel } from 'src/model/daily_meeting_stats.model';
export declare class DailyMeetingStatsService {
private dailyMeetingStatsModel;
constructor(dailyMeetingStatsModel: Repository<DailyMeetingStatsModel>);
recordMeeting(): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+55
View File
@@ -0,0 +1,55 @@
"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.DailyMeetingStatsService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const daily_meeting_stats_model_1 = require("../../../model/daily_meeting_stats.model");
const api_1 = require("../../common/api");
const help_1 = require("../../common/util/help");
const app_info_context_1 = require("../context/app_info.context");
let DailyMeetingStatsService = class DailyMeetingStatsService {
dailyMeetingStatsModel;
constructor(dailyMeetingStatsModel) {
this.dailyMeetingStatsModel = dailyMeetingStatsModel;
}
async recordMeeting() {
const device = app_info_context_1.AppInfoContext.getAppInfo().device;
const today = help_1.Help.formatDate(Date.now(), 'YYYY-MM-DD');
const existing = await this.dailyMeetingStatsModel.findOne({
where: { device, date: today },
});
if (existing) {
return api_1.Api.success();
}
try {
const record = this.dailyMeetingStatsModel.create({
device,
date: today,
});
await this.dailyMeetingStatsModel.save(record);
}
catch {
}
return api_1.Api.success();
}
};
exports.DailyMeetingStatsService = DailyMeetingStatsService;
exports.DailyMeetingStatsService = DailyMeetingStatsService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(daily_meeting_stats_model_1.DailyMeetingStatsModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], DailyMeetingStatsService);
//# sourceMappingURL=daily_meeting_stats.service.js.map
@@ -0,0 +1 @@
{"version":3,"file":"daily_meeting_stats.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/daily_meeting_stats.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,wFAA6E;AAC7E,0CAAyC;AACzC,iDAAgD;AAChD,kEAA6D;AAGtD,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAGzB;IAFV,YAEU,sBAA0D;QAA1D,2BAAsB,GAAtB,sBAAsB,CAAoC;IACjE,CAAC;IAEJ,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,iCAAc,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;QAClD,MAAM,KAAK,GAAG,WAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC;YACzD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;SAC/B,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;gBAChD,MAAM;gBACN,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;QAED,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AA7BY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,kDAAsB,CAAC,CAAA;qCACT,oBAAU;GAHjC,wBAAwB,CA6BpC"}
+7
View File
@@ -0,0 +1,7 @@
import { Repository } from 'typeorm';
import { DocumentModel } from 'src/model/document.model';
export declare class DocumentService {
private documentModel;
constructor(documentModel: Repository<DocumentModel>);
getDocument(type: number): Promise<import("src/app/common/api").ApiResponseVo<DocumentModel | null | undefined>>;
}
+40
View File
@@ -0,0 +1,40 @@
"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.DocumentService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const document_model_1 = require("../../../model/document.model");
const api_1 = require("../../common/api");
let DocumentService = class DocumentService {
documentModel;
constructor(documentModel) {
this.documentModel = documentModel;
}
async getDocument(type) {
const doc = await this.documentModel.findOne({
where: { type },
order: { createTime: 'DESC' },
});
return api_1.Api.success(doc);
}
};
exports.DocumentService = DocumentService;
exports.DocumentService = DocumentService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(document_model_1.DocumentModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], DocumentService);
//# sourceMappingURL=document.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"document.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/document.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,kEAAyD;AACzD,0CAAyC;AAGlC,IAAM,eAAe,GAArB,MAAM,eAAe;IAGhB;IAFV,YAEU,aAAwC;QAAxC,kBAAa,GAAb,aAAa,CAA2B;IAC/C,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC3C,KAAK,EAAE,EAAE,IAAI,EAAE;YACf,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;SAC9B,CAAC,CAAC;QACH,OAAO,SAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF,CAAA;AAbY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,8BAAa,CAAC,CAAA;qCACT,oBAAU;GAHxB,eAAe,CAa3B"}
+9
View File
@@ -0,0 +1,9 @@
import { JobHuntingModel } from 'src/model/job_hunting.model';
import { Repository } from 'typeorm';
import { JobHuntingApplyDto, JobHuntingInfoDto } from '../dto/job_hunting.dto';
export declare class JobHuntingService {
private jobHuntingModel;
constructor(jobHuntingModel: Repository<JobHuntingModel>);
info(dto: JobHuntingInfoDto): Promise<import("src/app/common/api").ApiResponseVo<JobHuntingModel | null | undefined>>;
apply(dto: JobHuntingApplyDto): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+64
View File
@@ -0,0 +1,64 @@
"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.JobHuntingService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const job_hunting_model_1 = require("../../../model/job_hunting.model");
const typeorm_2 = require("typeorm");
const user_id_context_1 = require("../../common/context/user_id.context");
const api_1 = require("../../common/api");
let JobHuntingService = class JobHuntingService {
jobHuntingModel;
constructor(jobHuntingModel) {
this.jobHuntingModel = jobHuntingModel;
}
async info(dto) {
const userId = (0, user_id_context_1.getUserIdContext)();
const info = await this.jobHuntingModel.findOneBy({
userId,
type: dto.type,
});
return api_1.Api.success(info);
}
async apply(dto) {
const userId = (0, user_id_context_1.getUserIdContext)();
const existingRecord = await this.jobHuntingModel.findOneBy({
userId,
type: dto.type,
});
if (existingRecord && existingRecord.status === job_hunting_model_1.JobHuntingStatus.Approved) {
return api_1.Api.error('已审核通过,无法重复提交');
}
if (existingRecord) {
await this.jobHuntingModel.update({ id: existingRecord.id }, dto);
}
else {
const verifyRecord = this.jobHuntingModel.create({
...dto,
status: job_hunting_model_1.JobHuntingStatus.Pending,
userId,
});
await this.jobHuntingModel.save(verifyRecord);
}
return api_1.Api.success();
}
};
exports.JobHuntingService = JobHuntingService;
exports.JobHuntingService = JobHuntingService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(job_hunting_model_1.JobHuntingModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], JobHuntingService);
//# sourceMappingURL=job_hunting.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"job_hunting.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/job_hunting.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,wEAAgF;AAChF,qCAAqC;AAErC,0EAA0E;AAC1E,0CAAyC;AAGlC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAGlB;IAFV,YAEU,eAA4C;QAA5C,oBAAe,GAAf,eAAe,CAA6B;IACnD,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,GAAsB;QAC/B,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;YAChD,MAAM;YACN,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,OAAO,SAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAuB;QACjC,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAClC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;YAC1D,MAAM;YACN,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QAGH,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,oCAAgB,CAAC,QAAQ,EAAE,CAAC;YAC1E,OAAO,SAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YAEnB,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YAEN,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gBAC/C,GAAG,GAAG;gBACN,MAAM,EAAE,oCAAgB,CAAC,OAAO;gBAChC,MAAM;aACP,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AA1CY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,mCAAe,CAAC,CAAA;qCACT,oBAAU;GAH1B,iBAAiB,CA0C7B"}
+9
View File
@@ -0,0 +1,9 @@
import { Repository } from 'typeorm';
import { NewsModel } from 'src/model/news.model';
import { NewsListDto } from '../dto/news.dto';
export declare class NewsService {
private newsModel;
constructor(newsModel: Repository<NewsModel>);
getNewsList(dto: NewsListDto): Promise<import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<NewsModel[]>>>;
readNews(id: number): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+69
View File
@@ -0,0 +1,69 @@
"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.NewsService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const news_model_1 = require("../../../model/news.model");
const api_1 = require("../../common/api");
const repository_help_1 = require("../../common/util/repository_help");
let NewsService = class NewsService {
newsModel;
constructor(newsModel) {
this.newsModel = newsModel;
}
async getNewsList(dto) {
const where = {};
if (dto.isRecommended !== undefined) {
where.isRecommended = dto.isRecommended;
}
if (dto.categoryId !== undefined) {
where.categoryId = dto.categoryId;
}
if (dto.type !== undefined) {
where.type = dto.type;
}
if (dto.isHeadline !== undefined) {
where.isHeadline = dto.isHeadline;
}
const total = await this.newsModel.count({ where });
const newsList = await repository_help_1.RepositoryHelp.finePaginatedData(this.newsModel, dto, {
where,
order: { publishTime: 'DESC' },
});
const imageTextList = newsList.filter((n) => n.type === news_model_1.NewsType.ImageText);
const videoList = newsList.filter((n) => n.type === news_model_1.NewsType.Video);
const mixedList = [];
const maxLen = Math.max(imageTextList.length, videoList.length);
for (let i = 0; i < maxLen; i++) {
if (imageTextList[i])
mixedList.push(imageTextList[i]);
if (videoList[i])
mixedList.push(videoList[i]);
}
return api_1.Api.pagination(mixedList, total);
}
async readNews(id) {
await this.newsModel.increment({ id }, 'readCount', 1);
return api_1.Api.success();
}
};
exports.NewsService = NewsService;
exports.NewsService = NewsService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(news_model_1.NewsModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], NewsService);
//# sourceMappingURL=news.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"news.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/news.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAuD;AACvD,0DAA2D;AAC3D,0CAAyC;AACzC,uEAAqE;AAI9D,IAAM,WAAW,GAAjB,MAAM,WAAW;IAGZ;IAFV,YAEU,SAAgC;QAAhC,cAAS,GAAT,SAAS,CAAuB;IACvC,CAAC;IAKJ,KAAK,CAAC,WAAW,CAAC,GAAgB;QAChC,MAAM,KAAK,GAAgC,EAAE,CAAC;QAG9C,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QAC1C,CAAC;QAGD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QACpC,CAAC;QAGD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACxB,CAAC;QAGD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QACpC,CAAC;QAGD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAGpD,MAAM,QAAQ,GAAG,MAAM,gCAAc,CAAC,iBAAiB,CACrD,IAAI,CAAC,SAAS,EACd,GAAG,EACH;YACE,KAAK;YACL,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;SAC/B,CACF,CAAC;QAGF,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAQ,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAQ,CAAC,KAAK,CAAC,CAAC;QAEpE,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAEhE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,aAAa,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,SAAS,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,SAAG,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAKD,KAAK,CAAC,QAAQ,CAAC,EAAU;QAEvB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAEvD,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AArEY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,sBAAS,CAAC,CAAA;qCACT,oBAAU;GAHpB,WAAW,CAqEvB"}
+8
View File
@@ -0,0 +1,8 @@
import { Repository } from 'typeorm';
import { RechargeModel } from 'src/model/recharge.model';
export declare class RechargeService {
private rechargeModel;
constructor(rechargeModel: Repository<RechargeModel>);
applyRecharge(amount: string): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<RechargeModel | undefined>>;
cancelOrder(orderId: number): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+75
View File
@@ -0,0 +1,75 @@
"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.RechargeService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const recharge_model_1 = require("../../../model/recharge.model");
const api_1 = require("../../common/api");
const user_id_context_1 = require("../../common/context/user_id.context");
const order_no_generator_1 = require("../../common/util/order_no_generator");
let RechargeService = class RechargeService {
rechargeModel;
constructor(rechargeModel) {
this.rechargeModel = rechargeModel;
}
async applyRecharge(amount) {
const userId = (0, user_id_context_1.getUserIdContext)();
const amountNum = parseFloat(amount);
if (isNaN(amountNum) || amountNum <= 0) {
return api_1.Api.error('无效的充值金额');
}
const pendingOrder = await this.rechargeModel.findOne({
where: {
userId,
status: recharge_model_1.RechargeStatus.Pending,
},
});
if (pendingOrder) {
return api_1.Api.error('您有一笔未支付的订单,请先完成支付或取消后再创建新订单');
}
const innerOrderNo = order_no_generator_1.OrderNoGenerator.generateWithPrefix('RC');
const recharge = this.rechargeModel.create({
userId,
amount,
actualAmount: amount,
innerOrderNo,
status: recharge_model_1.RechargeStatus.Pending,
});
await this.rechargeModel.save(recharge);
return api_1.Api.success(recharge);
}
async cancelOrder(orderId) {
const userId = (0, user_id_context_1.getUserIdContext)();
const order = await this.rechargeModel.findOne({
where: { id: orderId, userId },
});
if (!order) {
return api_1.Api.error('订单不存在');
}
if (order.status !== recharge_model_1.RechargeStatus.Pending) {
return api_1.Api.error('只有待支付订单才能取消');
}
await this.rechargeModel.update({ id: orderId }, { status: recharge_model_1.RechargeStatus.Closed });
return api_1.Api.success();
}
};
exports.RechargeService = RechargeService;
exports.RechargeService = RechargeService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(recharge_model_1.RechargeModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], RechargeService);
//# sourceMappingURL=recharge.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"recharge.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/recharge.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,kEAAyE;AACzE,0CAAyC;AACzC,0EAA0E;AAC1E,6EAA0E;AAGnE,IAAM,eAAe,GAArB,MAAM,eAAe;IAGhB;IAFV,YAEU,aAAwC;QAAxC,kBAAa,GAAb,aAAa,CAA2B;IAC/C,CAAC;IAKJ,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAClC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAGrC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,SAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QAGD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACpD,KAAK,EAAE;gBACL,MAAM;gBACN,MAAM,EAAE,+BAAc,CAAC,OAAO;aAC/B;SACF,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,SAAG,CAAC,KAAK,CACd,6BAA6B,CAC9B,CAAC;QACJ,CAAC;QAGD,MAAM,YAAY,GAAG,qCAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAG/D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YACzC,MAAM;YACN,MAAM;YACN,YAAY,EAAE,MAAM;YACpB,YAAY;YACZ,MAAM,EAAE,+BAAc,CAAC,OAAO;SAC/B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExC,OAAO,SAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAKD,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAGlC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC7C,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAGD,IAAI,KAAK,CAAC,MAAM,KAAK,+BAAc,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,SAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;QAGD,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAC7B,EAAE,EAAE,EAAE,OAAO,EAAE,EACf,EAAE,MAAM,EAAE,+BAAc,CAAC,MAAM,EAAE,CAClC,CAAC;QAEF,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AA5EY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,8BAAa,CAAC,CAAA;qCACT,oBAAU;GAHxB,eAAe,CA4E3B"}
+54
View File
@@ -0,0 +1,54 @@
import { DataSource, Repository } from 'typeorm';
import { UserSignInModel } from 'src/model/user_sign_in.model';
import { UserSignInCalendarModel } from 'src/model/user_sign_in_calendar.model';
import { UserSignInTaskModel } from 'src/model/user_sign_in_task.model';
import { UserSignInTaskRewardModel } from 'src/model/user_sign_in_task_reward.model';
import { UserFinancialProductModel } from 'src/model/user_financial_product.model';
import { SignInProgressDayVo, TaskStatus } from '../vo/signin.vo';
export declare class SignInService {
private userSignInModel;
private userSignInCalendarModel;
private userSignInTaskModel;
private userSignInTaskRewardModel;
private userFinancialProductModel;
private dataSource;
constructor(userSignInModel: Repository<UserSignInModel>, userSignInCalendarModel: Repository<UserSignInCalendarModel>, userSignInTaskModel: Repository<UserSignInTaskModel>, userSignInTaskRewardModel: Repository<UserSignInTaskRewardModel>, userFinancialProductModel: Repository<UserFinancialProductModel>, dataSource: DataSource);
getSignInInfo(userId: number): Promise<import("src/app/common/api").ApiResponseVo<{
signToDay: boolean;
userId?: number | undefined;
firstSignInDate?: string;
lastSignInDate?: string;
consecutiveDays?: number | undefined;
makeUpCount?: number | undefined;
usedMakeUpCount?: number | undefined;
maxMakeUpCount?: number | undefined;
user?: import("../../../model/user.model").UserModel;
id?: number | undefined;
createTime?: string | undefined;
updateTime?: string | undefined;
deleteTime?: string;
} | undefined>>;
getSignInCalendar(userId: number, year: number, month: number): Promise<import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<UserSignInCalendarModel[]>>>;
getProgress(): Promise<import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<SignInProgressDayVo[]>>>;
getTaskList(userId: number): Promise<import("src/app/common/api").ApiResponseVo<never[] | undefined> | import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<({
id: number;
title: string;
subtitle: string;
requiredDays: number;
icon: string;
status: TaskStatus;
rewardId: number;
} | {
id: number;
title: string;
subtitle: string;
requiredDays: number;
icon: string;
status: TaskStatus;
rewardId: undefined;
})[]>>>;
todaySignIn(userId: number): Promise<import("src/app/common/api").ApiResponseVo<null>>;
makeUpSignIn(userId: number, date: string): Promise<import("src/app/common/api").ApiResponseVo<null>>;
private calcConsecutiveDays;
claimReward(userId: number, rewardId: number): Promise<import("src/app/common/api").ApiResponseVo<null>>;
}
+354
View File
@@ -0,0 +1,354 @@
"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.SignInService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_sign_in_model_1 = require("../../../model/user_sign_in.model");
const user_sign_in_calendar_model_1 = require("../../../model/user_sign_in_calendar.model");
const user_sign_in_task_model_1 = require("../../../model/user_sign_in_task.model");
const user_sign_in_task_reward_model_1 = require("../../../model/user_sign_in_task_reward.model");
const user_financial_product_model_1 = require("../../../model/user_financial_product.model");
const api_1 = require("../../common/api");
const signin_vo_1 = require("../vo/signin.vo");
const user_id_context_1 = require("../../common/context/user_id.context");
const data_source_context_1 = require("../../common/context/data_source.context");
const help_1 = require("../../common/util/help");
const financial_product_model_1 = require("../../../model/financial_product.model");
let SignInService = class SignInService {
userSignInModel;
userSignInCalendarModel;
userSignInTaskModel;
userSignInTaskRewardModel;
userFinancialProductModel;
dataSource;
constructor(userSignInModel, userSignInCalendarModel, userSignInTaskModel, userSignInTaskRewardModel, userFinancialProductModel, dataSource) {
this.userSignInModel = userSignInModel;
this.userSignInCalendarModel = userSignInCalendarModel;
this.userSignInTaskModel = userSignInTaskModel;
this.userSignInTaskRewardModel = userSignInTaskRewardModel;
this.userFinancialProductModel = userFinancialProductModel;
this.dataSource = dataSource;
}
async getSignInInfo(userId) {
const signInStats = await this.userSignInModel.findOne({
where: { userId },
});
const nowYYYMMDD = help_1.Help.formatDate(Date.now(), 'YYYY-MM-DD');
return api_1.Api.success({
...signInStats,
signToDay: nowYYYMMDD == signInStats?.lastSignInDate,
});
}
async getSignInCalendar(userId, year, month) {
const firstDay = `${year}-${String(month).padStart(2, '0')}-01`;
const lastDay = new Date(year, month, 0).toISOString().split('T')[0];
const signInRecords = await this.userSignInCalendarModel.find({
where: {
userId,
signInDate: (0, typeorm_2.Between)(firstDay, lastDay),
},
order: { signInDate: 'ASC' },
});
return api_1.Api.pagination(signInRecords, signInRecords.length);
}
async getProgress() {
const userId = (0, user_id_context_1.getUserIdContext)();
const userSignIn = await this.userSignInModel.findOneByOrFail({
userId,
});
const existFirst = userSignIn.firstSignInDate != null;
const nowDate = new Date();
const nowYYYMMDD = help_1.Help.formatDate(nowDate, 'YYYY-MM-DD');
const startDate = new Date();
startDate.setDate(startDate.getDate() - (existFirst ? 3 : 0));
let startYYYMMDD = help_1.Help.formatDate(startDate, 'YYYY-MM-DD');
const firstSignDate = userSignIn.firstSignInDate || nowYYYMMDD;
if (firstSignDate > startYYYMMDD) {
startYYYMMDD = firstSignDate;
}
const signInCalendars = await this.userSignInCalendarModel.find({
where: {
userId,
signInDate: (0, typeorm_2.Between)(startYYYMMDD, nowYYYMMDD),
},
});
const signedDates = new Map();
signInCalendars.forEach((it) => {
signedDates.set(it.signInDate, it);
});
const dates = [];
const current = new Date(startYYYMMDD);
const endDate = new Date(startYYYMMDD);
endDate.setDate(endDate.getDate() + 6);
while (current <= endDate) {
const dateStr = help_1.Help.formatDate(current, 'YYYY-MM-DD');
dates.push(dateStr);
current.setDate(current.getDate() + 1);
}
return api_1.Api.pagination(dates.map((date) => {
const vo = new signin_vo_1.SignInProgressDayVo();
vo.date = date;
vo.isFutureDay = date > nowYYYMMDD;
vo.signedIn = signedDates.has(date);
vo.isMakeUp = signedDates.get(date)?.isMakeUp || user_sign_in_calendar_model_1.SignInType.Normal;
vo.isDay = date == nowYYYMMDD;
vo.consecutiveDay = help_1.Help.diffDays(date, firstSignDate) + 1;
return vo;
}), 0);
}
async getTaskList(userId) {
const tasks = await this.userSignInTaskModel.find({
order: { requiredDays: 'ASC' },
});
if (tasks.length === 0) {
return api_1.Api.success([]);
}
const taskIds = tasks.map((t) => t.id);
const rewards = await this.userSignInTaskRewardModel.find({
where: {
userId,
userSignInTaskId: (0, typeorm_2.In)(taskIds),
},
});
const rewardMap = new Map();
for (const reward of rewards) {
rewardMap.set(reward.userSignInTaskId, reward);
}
const taskList = tasks.map((task) => {
const reward = rewardMap.get(task.id);
if (reward) {
const status = reward.claimStatus === user_sign_in_task_reward_model_1.ClaimStatus.Claimed
? signin_vo_1.TaskStatus.Completed
: signin_vo_1.TaskStatus.Pending;
return {
id: task.id,
title: task.title,
subtitle: task.subtitle,
requiredDays: task.requiredDays,
icon: task.icon,
status,
rewardId: reward.id,
};
}
return {
id: task.id,
title: task.title,
subtitle: task.subtitle,
requiredDays: task.requiredDays,
icon: task.icon,
status: signin_vo_1.TaskStatus.InProgress,
rewardId: undefined,
};
});
return api_1.Api.pagination(taskList, taskList.length);
}
async todaySignIn(userId) {
const nowYYYMMDD = help_1.Help.formatDate(Date.now(), 'YYYY-MM-DD');
const signInStats = await this.userSignInModel.findOneOrFail({
where: { userId },
});
if (signInStats && signInStats.lastSignInDate === nowYYYMMDD) {
return api_1.Api.error('今日已签到');
}
const yesterday = help_1.Help.formatDate(new Date(Date.now() - 86400000), 'YYYY-MM-DD');
let consecutiveDays = 1;
if (signInStats && signInStats.lastSignInDate === yesterday) {
consecutiveDays = signInStats.consecutiveDays + 1;
}
else {
consecutiveDays = 1;
}
await data_source_context_1.DataSourceContext.startTransaction(async (tx) => {
const signInRepo = tx.getRepository(user_sign_in_model_1.UserSignInModel);
const calendarRepo = tx.getRepository(user_sign_in_calendar_model_1.UserSignInCalendarModel);
const taskRepo = tx.getRepository(user_sign_in_task_model_1.UserSignInTaskModel);
const rewardRepo = tx.getRepository(user_sign_in_task_reward_model_1.UserSignInTaskRewardModel);
await signInRepo.update({ userId }, {
lastSignInDate: nowYYYMMDD,
consecutiveDays,
});
const calendarRecord = calendarRepo.create({
userId,
signInDate: nowYYYMMDD,
isMakeUp: user_sign_in_calendar_model_1.SignInType.Normal,
});
await calendarRepo.save(calendarRecord);
const tasks = await taskRepo.find({
order: { requiredDays: 'ASC' },
});
for (const task of tasks) {
if (consecutiveDays >= task.requiredDays) {
const existingReward = await rewardRepo.findOne({
where: {
userId,
userSignInTaskId: task.id,
},
});
if (!existingReward) {
const reward = rewardRepo.create({
userId,
userSignInTaskId: task.id,
title: task.title,
subtitle: task.subtitle,
requiredDays: task.requiredDays,
icon: task.icon,
financialProductId: task.financialProductId,
claimStatus: user_sign_in_task_reward_model_1.ClaimStatus.Pending,
});
await rewardRepo.save(reward);
}
}
}
});
return api_1.Api.successMsg('签到成功');
}
async makeUpSignIn(userId, date) {
const nowYYYMMDD = help_1.Help.formatDate(Date.now(), 'YYYY-MM-DD');
if (date >= nowYYYMMDD) {
return api_1.Api.error('只能补签今天之前的日期');
}
const signInStats = await this.userSignInModel.findOneOrFail({
where: { userId },
});
const existingRecord = await this.userSignInCalendarModel.findOne({
where: { userId, signInDate: date },
});
if (existingRecord) {
return api_1.Api.error('该日期已签到,无需补签');
}
const makeUpCount = signInStats.makeUpCount;
if (makeUpCount <= 0) {
return api_1.Api.error('补签次数已用完');
}
if (!signInStats.lastSignInDate) {
return api_1.Api.error('请先完成首次签到');
}
await data_source_context_1.DataSourceContext.startTransaction(async (tx) => {
const calendarRepo = tx.getRepository(user_sign_in_calendar_model_1.UserSignInCalendarModel);
const signInRepo = tx.getRepository(user_sign_in_model_1.UserSignInModel);
const taskRepo = tx.getRepository(user_sign_in_task_model_1.UserSignInTaskModel);
const rewardRepo = tx.getRepository(user_sign_in_task_reward_model_1.UserSignInTaskRewardModel);
const calendarRecord = calendarRepo.create({
userId,
signInDate: date,
isMakeUp: user_sign_in_calendar_model_1.SignInType.MakeUp,
});
await calendarRepo.save(calendarRecord);
const newConsecutiveDays = await this.calcConsecutiveDays(tx, userId, signInStats.lastSignInDate, signInStats.consecutiveDays);
await signInRepo.update({ userId }, {
consecutiveDays: newConsecutiveDays,
makeUpCount: () => `makeUpCount - 1`,
usedMakeUpCount: () => `usedMakeUpCount + 1`,
});
const tasks = await taskRepo.find({
order: { requiredDays: 'ASC' },
});
for (const task of tasks) {
if (newConsecutiveDays >= task.requiredDays) {
const existingReward = await rewardRepo.findOne({
where: {
userId,
userSignInTaskId: task.id,
},
});
if (!existingReward) {
const reward = rewardRepo.create({
userId,
userSignInTaskId: task.id,
title: task.title,
subtitle: task.subtitle,
requiredDays: task.requiredDays,
icon: task.icon,
financialProductId: task.financialProductId,
claimStatus: user_sign_in_task_reward_model_1.ClaimStatus.Pending,
});
await rewardRepo.save(reward);
}
}
}
});
return api_1.Api.successMsg('补签成功');
}
async calcConsecutiveDays(tx, userId, endDate, expectedDays) {
const startDate = help_1.Help.formatDate(new Date(endDate).getTime() - expectedDays * 86400000, 'YYYY-MM-DD');
const calendarRepo = tx.getRepository(user_sign_in_calendar_model_1.UserSignInCalendarModel);
const count = await calendarRepo.count({
where: {
userId,
signInDate: (0, typeorm_2.Between)(startDate, endDate),
},
});
return count === expectedDays + 1 ? expectedDays + 1 : expectedDays;
}
async claimReward(userId, rewardId) {
await data_source_context_1.DataSourceContext.startTransaction(async (tx) => {
const rewardRepo = tx.getRepository(user_sign_in_task_reward_model_1.UserSignInTaskRewardModel);
const financialProductRepo = tx.getRepository(financial_product_model_1.FinancialProductModel);
const financialRepo = tx.getRepository(user_financial_product_model_1.UserFinancialProductModel);
const reward = await rewardRepo.findOne({
where: { id: rewardId, userId },
});
if (!reward) {
throw new Error('奖励记录不存在');
}
if (reward.claimStatus === user_sign_in_task_reward_model_1.ClaimStatus.Claimed) {
throw new Error('该奖励已领取');
}
const financialProduct = await financialProductRepo.findOneBy({
id: reward.financialProductId,
});
if (!financialProduct) {
throw new Error('理财产品不存在');
}
const now = Date.now();
const periodDays = financialProduct.period;
const expireTime = Math.floor((now + periodDays * 86400000) / 1000);
const userFinancialProduct = financialRepo.create({
userId,
financialProductId: reward.financialProductId,
name: reward.title,
period: periodDays,
principal: financialProduct.principal,
yieldRate: financialProduct.yieldRate,
source: user_financial_product_model_1.HoldingSource.Gift,
status: user_financial_product_model_1.HoldingStatus.Earning,
expireTime,
});
await financialRepo.save(userFinancialProduct);
await rewardRepo.update({ id: rewardId }, {
userFinancialProductId: userFinancialProduct.id,
claimStatus: user_sign_in_task_reward_model_1.ClaimStatus.Claimed,
});
});
return api_1.Api.successMsg('领取成功');
}
};
exports.SignInService = SignInService;
exports.SignInService = SignInService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_sign_in_model_1.UserSignInModel)),
__param(1, (0, typeorm_1.InjectRepository)(user_sign_in_calendar_model_1.UserSignInCalendarModel)),
__param(2, (0, typeorm_1.InjectRepository)(user_sign_in_task_model_1.UserSignInTaskModel)),
__param(3, (0, typeorm_1.InjectRepository)(user_sign_in_task_reward_model_1.UserSignInTaskRewardModel)),
__param(4, (0, typeorm_1.InjectRepository)(user_financial_product_model_1.UserFinancialProductModel)),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.DataSource])
], SignInService);
//# sourceMappingURL=signin.service.js.map
File diff suppressed because one or more lines are too long
+53
View File
@@ -0,0 +1,53 @@
import { Repository } from 'typeorm';
import { TeamRelationModel } from 'src/model/team_relation.model';
import { GetTeamMembersDto } from '../dto/team.dto';
import { UserSignInModel } from 'src/model/user_sign_in.model';
export declare class TeamService {
private teamRelationModel;
private userSignInModel;
constructor(teamRelationModel: Repository<TeamRelationModel>, userSignInModel: Repository<UserSignInModel>);
getTeamStats(userId: number): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<{
directChildrenCount: number;
grandchildrenCount: number;
greatGrandchildrenCount: number;
} | undefined>>;
getTodayNewStats(userId: number): Promise<{
directChildrenCount: number;
grandchildrenCount: number;
greatGrandchildrenCount: number;
}>;
getTodayNewStatsSimple(userId: number): Promise<import("src/app/common/api").ApiResponseVo<{
directChildrenCount: number;
grandchildrenCount: number;
greatGrandchildrenCount: number;
} | undefined>>;
getTeamMembers(userId: number, dto: GetTeamMembersDto): Promise<import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<{
level: number;
createTime: string;
signIn: UserSignInModel | undefined;
nick?: string | undefined;
avatar?: string;
grade?: number | undefined;
phone?: string | undefined;
password?: string | undefined;
tradePassword?: string | undefined;
stocks?: number | undefined;
inviteCode?: string | undefined;
device?: string;
registerIp?: string | undefined;
isFrozen?: number | undefined;
wallet?: import("../../../model/wallet.model").WalletModel;
teamRelation?: TeamRelationModel;
userVerify?: import("../../../model/user_verify.model").UserVerifyModel;
enabledCreateGroup?: number | undefined;
isRedEnvelope?: number | undefined;
redEnvelopeMaxAmount?: string | undefined;
redEnvelope?: string | undefined;
autoRedEnvelope?: number | undefined;
redPacketRecords?: import("../../../model/red_packet_record.model").RedPacketRecordModel[];
redPackets?: import("../../../model/red_packet.model").RedPacketModel[];
id?: number | undefined;
updateTime?: string | undefined;
deleteTime?: string;
}[]>>>;
}
+128
View File
@@ -0,0 +1,128 @@
"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.TeamService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const team_relation_model_1 = require("../../../model/team_relation.model");
const api_1 = require("../../common/api");
const repository_help_1 = require("../../common/util/repository_help");
const help_1 = require("../../common/util/help");
const user_sign_in_model_1 = require("../../../model/user_sign_in.model");
let TeamService = class TeamService {
teamRelationModel;
userSignInModel;
constructor(teamRelationModel, userSignInModel) {
this.teamRelationModel = teamRelationModel;
this.userSignInModel = userSignInModel;
}
async getTeamStats(userId) {
const userRelation = await this.teamRelationModel.findOne({
where: { userId },
});
if (!userRelation) {
return api_1.Api.error('用户团队关系不存在');
}
const directChildrenCount = await this.teamRelationModel.count({
where: { parentId: userId },
});
const grandchildrenCount = await this.teamRelationModel.count({
where: { grandparentId: userId },
});
const greatGrandchildrenCount = await this.teamRelationModel.count({
where: { greatGrandparentId: userId },
});
return api_1.Api.success({
directChildrenCount,
grandchildrenCount,
greatGrandchildrenCount,
});
}
async getTodayNewStats(userId) {
const todayStr = help_1.Help.formatDate(new Date(), 'YYYY-MM-DD');
const tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000);
const tomorrowStr = help_1.Help.formatDate(tomorrow, 'YYYY-MM-DD');
const directChildrenCount = await this.teamRelationModel.count({
where: {
parentId: userId,
createTime: (0, typeorm_2.Between)(todayStr, tomorrowStr),
},
});
const grandchildrenCount = await this.teamRelationModel.count({
where: {
grandparentId: userId,
createTime: (0, typeorm_2.Between)(todayStr, tomorrowStr),
},
});
const greatGrandchildrenCount = await this.teamRelationModel.count({
where: {
greatGrandparentId: userId,
createTime: (0, typeorm_2.Between)(todayStr, tomorrowStr),
},
});
return {
directChildrenCount,
grandchildrenCount,
greatGrandchildrenCount,
};
}
async getTodayNewStatsSimple(userId) {
const stats = await this.getTodayNewStats(userId);
return api_1.Api.success(stats);
}
async getTeamMembers(userId, dto) {
let whereCondition = {};
if (dto.level === 1) {
whereCondition = { parentId: userId };
}
else if (dto.level === 2) {
whereCondition = { grandparentId: userId };
}
else if (dto.level === 3) {
whereCondition = { greatGrandparentId: userId };
}
const { data, total } = await repository_help_1.RepositoryHelp.findPaginated(this.teamRelationModel, dto, {
where: whereCondition,
order: { createTime: 'DESC' },
relations: ['user'],
});
const userIds = data.map((r) => r.userId);
let signInRecords = [];
if (userIds.length > 0) {
signInRecords = await this.userSignInModel.find({
where: { userId: (0, typeorm_2.Between)(Math.min(...userIds), Math.max(...userIds)) },
});
}
const members = data.map((relation) => {
const signIn = signInRecords.find((r) => r.userId === relation.userId);
return {
...relation.user,
level: relation.level,
createTime: relation.createTime,
signIn,
};
});
return api_1.Api.pagination(members, total);
}
};
exports.TeamService = TeamService;
exports.TeamService = TeamService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(team_relation_model_1.TeamRelationModel)),
__param(1, (0, typeorm_1.InjectRepository)(user_sign_in_model_1.UserSignInModel)),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository])
], TeamService);
//# sourceMappingURL=team.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"team.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/team.service.ts"],"names":[],"mappings":"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"}
+41
View File
@@ -0,0 +1,41 @@
import { Repository } from 'typeorm';
import { UserModel } from 'src/model/user.model';
import { ImVo } from '../vo/user.vo';
import { UserVerifyModel } from 'src/model/user_verify.model';
import { UserLogService } from '../../common/service/user_log.service';
export declare class UserService {
private userModel;
private userVerifyModel;
private userLogService;
constructor(userModel: Repository<UserModel>, userVerifyModel: Repository<UserVerifyModel>, userLogService: UserLogService);
changePassword(userId: number, oldPassword: string, newPassword: string): Promise<import("src/app/common/api").ApiResponseVo<null>>;
getProfile(userId: number): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<{
phone: string | null;
hasTradePassword: boolean;
nick: string;
avatar?: string;
grade: number;
password: string;
stocks: number;
inviteCode: string;
device?: string;
registerIp: string;
isFrozen: number;
wallet?: import("../../../model/wallet.model").WalletModel;
teamRelation?: import("../../../model/team_relation.model").TeamRelationModel;
userVerify?: UserVerifyModel;
enabledCreateGroup: number;
isRedEnvelope: number;
redEnvelopeMaxAmount: string;
redEnvelope: string;
autoRedEnvelope: number;
redPacketRecords?: import("../../../model/red_packet_record.model").RedPacketRecordModel[];
redPackets?: import("../../../model/red_packet.model").RedPacketModel[];
id: number;
createTime: string;
updateTime: string;
deleteTime?: string;
} | undefined>>;
im(userId: number): Promise<import("src/app/common/api").ApiResponseVo<ImVo | undefined>>;
started(): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+109
View File
@@ -0,0 +1,109 @@
"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.UserService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_model_1 = require("../../../model/user.model");
const api_1 = require("../../common/api");
const tls_sig_api_v2_typescript_1 = require("tls-sig-api-v2-typescript");
const app_env_1 = require("../../../app.env");
const im_help_1 = require("../../common/util/im_help");
const user_vo_1 = require("../vo/user.vo");
const user_verify_model_1 = require("../../../model/user_verify.model");
const user_log_service_1 = require("../../common/service/user_log.service");
let UserService = class UserService {
userModel;
userVerifyModel;
userLogService;
constructor(userModel, userVerifyModel, userLogService) {
this.userModel = userModel;
this.userVerifyModel = userVerifyModel;
this.userLogService = userLogService;
}
async changePassword(userId, oldPassword, newPassword) {
const user = await this.userModel.findOne({
where: { id: userId },
select: {
password: true,
},
});
console.log(user?.password, oldPassword);
if (!user) {
return api_1.Api.error('用户不存在');
}
if (user.password !== oldPassword) {
return api_1.Api.error('旧密码错误');
}
await this.userModel.update({ id: userId }, { password: newPassword });
return api_1.Api.successMsg('密码修改成功');
}
async getProfile(userId) {
const user = await this.userModel
.createQueryBuilder('user')
.addSelect('user.tradePassword')
.where('user.id = :id', { id: userId })
.getOne();
if (!user) {
return api_1.Api.error('用户不存在');
}
const { tradePassword, ...result } = user;
const maskedPhone = user.phone
? user.phone.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2')
: null;
return api_1.Api.success({
...result,
phone: maskedPhone,
hasTradePassword: !!tradePassword,
});
}
async im(userId) {
const user = await this.userModel.findOneByOrFail({
id: userId,
});
const userVerify = await this.userVerifyModel.findOneBy({ userId });
const uid = userId;
const api = new tls_sig_api_v2_typescript_1.Api(app_env_1.AppEnv.IM_APP_ID, app_env_1.AppEnv.IM_SECRET_KEY);
const imUid = app_env_1.AppEnv.IM_USER_ID_PREFIX + uid;
const expire = 86400 * 180;
const sign = api.genSig(imUid, expire);
await im_help_1.IMHelp.updateUserProfile(imUid, user.phone, '');
const vo = new user_vo_1.ImVo();
vo.uid = imUid;
vo.sign = sign;
vo.isAuth =
userVerify != null && userVerify.status == user_verify_model_1.VerifyAuditStatus.Approved;
vo.appId = app_env_1.AppEnv.IM_APP_ID;
vo.username = user.phone;
vo.avatar = '';
vo.prefix = app_env_1.AppEnv.IM_USER_ID_PREFIX;
vo.enabledCreateGroup = user.enabledCreateGroup == 1;
return api_1.Api.success(vo);
}
async started() {
await this.userLogService.logStarted();
return api_1.Api.success();
}
};
exports.UserService = UserService;
exports.UserService = UserService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_model_1.UserModel)),
__param(1, (0, typeorm_1.InjectRepository)(user_verify_model_1.UserVerifyModel)),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository,
user_log_service_1.UserLogService])
], UserService);
//# sourceMappingURL=user.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/user.service.ts"],"names":[],"mappings":"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"}
+7
View File
@@ -0,0 +1,7 @@
import { Repository } from 'typeorm';
import { UserBankModel } from 'src/model/user_bank.model';
export declare class UserBankService {
private userBankModel;
constructor(userBankModel: Repository<UserBankModel>);
bindBankCard(cardNo: string, bankName: string, phone: string): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+57
View File
@@ -0,0 +1,57 @@
"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.UserBankService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_bank_model_1 = require("../../../model/user_bank.model");
const api_1 = require("../../common/api");
const user_id_context_1 = require("../../common/context/user_id.context");
let UserBankService = class UserBankService {
userBankModel;
constructor(userBankModel) {
this.userBankModel = userBankModel;
}
async bindBankCard(cardNo, bankName, phone) {
const userId = (0, user_id_context_1.getUserIdContext)();
const count = await this.userBankModel.count({
where: { userId },
});
if (count >= 3) {
return api_1.Api.error('每个用户最多绑定 3 张银行卡');
}
const existingCard = await this.userBankModel.findOne({
where: { userId, cardNo },
});
if (existingCard) {
return api_1.Api.error('该银行卡已被绑定');
}
const userBank = this.userBankModel.create({
userId,
cardNo,
bankName,
phone,
});
await this.userBankModel.save(userBank);
return api_1.Api.success();
}
};
exports.UserBankService = UserBankService;
exports.UserBankService = UserBankService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_bank_model_1.UserBankModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], UserBankService);
//# sourceMappingURL=user_bank.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"user_bank.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/user_bank.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,oEAA0D;AAC1D,0CAAyC;AACzC,0EAA0E;AAGnE,IAAM,eAAe,GAArB,MAAM,eAAe;IAGhB;IAFV,YAEU,aAAwC;QAAxC,kBAAa,GAAb,aAAa,CAA2B;IAC/C,CAAC;IAKJ,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,QAAgB,EAAE,KAAa;QAChE,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAGlC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAC3C,KAAK,EAAE,EAAE,MAAM,EAAE;SAClB,CAAC,CAAC;QAEH,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,OAAO,SAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtC,CAAC;QAGD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACpD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;SAC1B,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,SAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAGD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YACzC,MAAM;YACN,MAAM;YACN,QAAQ;YACR,KAAK;SACN,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExC,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AA1CY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,+BAAa,CAAC,CAAA;qCACT,oBAAU;GAHxB,eAAe,CA0C3B"}
+29
View File
@@ -0,0 +1,29 @@
import { Repository } from 'typeorm';
import { Cache } from 'cache-manager';
import { UserModel } from 'src/model/user.model';
import { PaginatedDto } from 'src/app/common/api';
import { UserCreateRedPacketDto, UserInfoDto, UserLikeDto, UserRedPacketDetailDto, UserUpdateUserProfileDto } from '../dto/user_im.dto';
import { UserClaimedVo, UserLikeVo } from '../vo/user_im.vo';
import { RedPacketModel } from 'src/model/red_packet.model';
import { RedPacketRecordModel } from 'src/model/red_packet_record.model';
import { DBTransaction } from 'src/app/common/context/data_source.context';
import { UserVerifyModel } from 'src/model/user_verify.model';
export declare class UserImService {
private userRepos;
private redPacketRepos;
private redPacketRecordRepos;
private userVerifyModel;
private cacheManager;
constructor(userRepos: Repository<UserModel>, redPacketRepos: Repository<RedPacketModel>, redPacketRecordRepos: Repository<RedPacketRecordModel>, userVerifyModel: Repository<UserVerifyModel>, cacheManager: Cache);
like(dto: UserLikeDto): Promise<import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<UserLikeVo[]>>>;
info(dto: UserInfoDto): Promise<import("src/app/common/api").ApiResponseVo<UserModel | null | undefined>>;
redPackeDetail(dto: UserRedPacketDetailDto): Promise<import("src/app/common/api").ApiResponseVo<RedPacketModel | null | undefined>>;
redPackeRecords(dto: UserRedPacketDetailDto, page: PaginatedDto): Promise<import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<RedPacketRecordModel[]>>>;
createRedPacket(dto: UserCreateRedPacketDto): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<RedPacketModel | undefined>>;
autoClaimedRedPacket(trx: DBTransaction, redPacket: RedPacketModel): Promise<void>;
claimedPrepare(dto: UserRedPacketDetailDto): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<UserClaimedVo | undefined>>;
claimed(dto: UserRedPacketDetailDto): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<UserClaimedVo | undefined>>;
private calculateRandomAmount;
updateUserProfile(dto: UserUpdateUserProfileDto): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
getUserGradeByImUid(): import("src/app/common/api").ApiResponseVo<import("src/app/common/api").PaginatedVo<never[]>>;
}
+400
View File
@@ -0,0 +1,400 @@
"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.UserImService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const cache_manager_1 = require("@nestjs/cache-manager");
const user_model_1 = require("../../../model/user.model");
const api_1 = require("../../common/api");
const app_env_1 = require("../../../app.env");
const user_im_vo_1 = require("../vo/user_im.vo");
const red_packet_model_1 = require("../../../model/red_packet.model");
const red_packet_record_model_1 = require("../../../model/red_packet_record.model");
const repository_help_1 = require("../../common/util/repository_help");
const user_id_context_1 = require("../../common/context/user_id.context");
const data_source_context_1 = require("../../common/context/data_source.context");
const help_1 = require("../../common/util/help");
const decimal_help_1 = require("../../common/util/decimal_help");
const im_help_1 = require("../../common/util/im_help");
const user_verify_model_1 = require("../../../model/user_verify.model");
let UserImService = class UserImService {
userRepos;
redPacketRepos;
redPacketRecordRepos;
userVerifyModel;
cacheManager;
constructor(userRepos, redPacketRepos, redPacketRecordRepos, userVerifyModel, cacheManager) {
this.userRepos = userRepos;
this.redPacketRepos = redPacketRepos;
this.redPacketRecordRepos = redPacketRecordRepos;
this.userVerifyModel = userVerifyModel;
this.cacheManager = cacheManager;
}
async like(dto) {
const users = await this.userRepos.find({
where: [
{
phone: dto.keyword,
},
],
});
return api_1.Api.pagination(users.map((it) => {
const vo = new user_im_vo_1.UserLikeVo();
vo.uid = app_env_1.AppEnv.IM_USER_ID_PREFIX + it.id;
vo.user = it;
return vo;
}), 0);
}
async info(dto) {
const user = await this.userRepos.findOneBy({ id: dto.id });
return api_1.Api.success(user);
}
async redPackeDetail(dto) {
const data = await this.redPacketRepos.findOne({
where: {
id: dto.id,
},
relations: ['user'],
});
return api_1.Api.success(data);
}
async redPackeRecords(dto, page) {
const list = await repository_help_1.RepositoryHelp.finePaginatedData(this.redPacketRecordRepos, page, {
where: {
redPacketId: dto.id,
},
order: {
id: 'desc',
},
relations: ['user'],
});
return api_1.Api.pagination(list, 0);
}
async createRedPacket(dto) {
const uid = (0, user_id_context_1.getUserIdContext)();
const user = await this.userRepos.findOneByOrFail({
id: uid,
});
const userVerify = await this.userVerifyModel.findOneBy({
userId: uid,
});
const redEnvelope = user.redEnvelope;
const redEnvelopeMaxAmount = user.redEnvelopeMaxAmount;
const amount = Number(dto.amount);
if (userVerify?.status != user_verify_model_1.VerifyAuditStatus.Approved) {
return api_1.Api.error('您还未实名,无法发送红包');
}
if (!user.isRedEnvelope) {
return api_1.Api.error('您发送红包资格被管理员取下,请联系客服');
}
if (amount <= 0) {
return api_1.Api.error('金额必须大于0');
}
if (help_1.Help.phpmymd5(dto.password) != '123456') {
return api_1.Api.error('支付密码错误');
}
if (dto.type == red_packet_model_1.RedPacketType.Luck) {
if (!dto.count) {
return api_1.Api.error('红包个数必须大于0');
}
}
if (!redEnvelope || Number(redEnvelope) < amount) {
return api_1.Api.error('红包资产余额不足');
}
if (redEnvelopeMaxAmount && Number(redEnvelopeMaxAmount) < amount) {
return api_1.Api.error(`最大可发送红包金额(${redEnvelopeMaxAmount})`);
}
return data_source_context_1.DataSourceContext.startTransaction(async (trx) => {
const userRepos = trx.getRepository(user_model_1.UserModel);
const redPacketRepos = trx.getRepository(red_packet_model_1.RedPacketModel);
const totalAmount = Math.round(amount * 100);
const totalCount = dto.type == red_packet_model_1.RedPacketType.Luck ? dto.count : 1;
const now = help_1.Help.getSecondTimestamp();
const affected = await repository_help_1.RepositoryHelp.update(userRepos, {
id: uid,
redEnvelope: (0, typeorm_2.MoreThanOrEqual)(`${amount}`),
}, {
redEnvelope: () => `redEnvelope - ${amount}`,
});
if (!affected) {
await trx.rollback();
return api_1.Api.error('红包资产余额不足01');
}
const claimedUserId = dto.claimedUserId?.replace(app_env_1.AppEnv.IM_USER_ID_PREFIX, '') || '';
const redPacket = redPacketRepos.create({
totalAmount,
totalCount,
remainingAmount: totalAmount,
remainingCount: totalCount,
userId: uid,
groupId: dto.groupId,
claimedUserId: dto.type == red_packet_model_1.RedPacketType.Ordinary ? Number(claimedUserId) : 0,
status: red_packet_model_1.RedPacketStatus.Unclaimed,
type: dto.type,
createdAt: now,
expireTime: now + 60 * 60 * 24,
});
await redPacketRepos.insert(redPacket);
await this.autoClaimedRedPacket(trx, redPacket);
return api_1.Api.success(redPacket);
});
}
async autoClaimedRedPacket(trx, redPacket) {
const sendUserIds = app_env_1.AppEnv.IM_AUTO_CLAIMED_RED_PACKET_SEND_UIDS.split(',').map((it) => Number(it));
const sendGroupIds = app_env_1.AppEnv.IM_AUTO_CLAIMED_RED_PACKET_SEND_GROUPIDS.split(',').map((it) => {
return decodeURIComponent(it);
});
if (redPacket.type != red_packet_model_1.RedPacketType.Luck) {
return;
}
if (!sendUserIds.includes(redPacket.userId)) {
return;
}
if (!sendGroupIds.includes(redPacket.groupId)) {
return;
}
const remainingAmount = redPacket.remainingAmount;
const remainingCount = redPacket.remainingCount;
const rate = help_1.Help.getRandomInt(70, 75) / 100;
let maxAmount = remainingAmount * rate;
const maxCount = Math.floor(remainingCount * rate);
const userRepos = trx.getRepository(user_model_1.UserModel);
const redPacketRepos = trx.getRepository(red_packet_model_1.RedPacketModel);
const redPacketRecordRepos = trx.getRepository(red_packet_record_model_1.RedPacketRecordModel);
const users = await userRepos
.createQueryBuilder('u')
.where('user_type = 2 and autoRedEnvelope = 1 and avatar is not null')
.orderBy('RAND()')
.limit(maxCount)
.getMany();
for (let i = 0, len = users.length; i < len; i++) {
const user = users[i];
const uid = user.id;
const now = help_1.Help.getSecondTimestamp() + 1;
const amount = this.calculateRandomAmount(maxAmount, len - i);
maxAmount -= amount;
redPacket.remainingAmount -= amount;
redPacket.remainingCount -= 1;
const record = redPacketRecordRepos.create({
amount: decimal_help_1.DecimalHelp.div(amount, 100),
redPacketId: redPacket.id,
userId: uid,
createdAt: now,
});
await redPacketRecordRepos.insert(record);
await userRepos.update({
id: uid,
}, {
redEnvelope: () => `redEnvelope + ${record.amount}`,
});
}
await redPacketRepos.save(redPacket);
}
async claimedPrepare(dto) {
const uid = (0, user_id_context_1.getUserIdContext)();
const userVerify = await this.userVerifyModel.findOneBy({
userId: uid,
});
if (userVerify?.status != user_verify_model_1.VerifyAuditStatus.Approved) {
return api_1.Api.error('您还未实名,无法领取红包');
}
const redPacket = await this.redPacketRepos.findOne({
where: {
id: dto.id,
},
relations: ['user'],
});
if (!redPacket) {
return api_1.Api.error(`红包不存在`);
}
if (redPacket.status == red_packet_model_1.RedPacketStatus.Expire) {
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Expired, redPacket));
}
const existingRecord = await this.redPacketRecordRepos.findOneBy({
redPacketId: redPacket.id,
userId: uid,
});
if (existingRecord) {
const vo = new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Success, redPacket, existingRecord);
return api_1.Api.success(vo);
}
if (redPacket.status == red_packet_model_1.RedPacketStatus.Claimed) {
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Finished, redPacket));
}
const now = help_1.Help.getSecondTimestamp();
if (redPacket.expireTime < now) {
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Expired, redPacket));
}
if (redPacket.type == red_packet_model_1.RedPacketType.Ordinary) {
if (redPacket.userId == uid) {
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Own, redPacket));
}
if (redPacket.type == red_packet_model_1.RedPacketType.Ordinary) {
if (redPacket.claimedUserId != uid) {
return api_1.Api.error(`这个红包不是发给你的`);
}
}
}
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Unclaimed, redPacket));
}
async claimed(dto) {
const uid = (0, user_id_context_1.getUserIdContext)();
const userVerify = await this.userVerifyModel.findOneBy({
userId: uid,
});
if (userVerify?.status != user_verify_model_1.VerifyAuditStatus.Approved) {
return api_1.Api.error('您还未实名,无法领取红包');
}
return data_source_context_1.DataSourceContext.startTransaction(async (trx) => {
const userRepos = trx.getRepository(user_model_1.UserModel);
const redPacketRepos = trx.getRepository(red_packet_model_1.RedPacketModel);
const redPacketRecordRepos = trx.getRepository(red_packet_record_model_1.RedPacketRecordModel);
const redPacket = await redPacketRepos.findOne({
where: {
id: dto.id,
},
relations: ['user'],
});
if (!redPacket) {
await trx.rollback();
return api_1.Api.error(`红包不存在`);
}
if (redPacket.status == red_packet_model_1.RedPacketStatus.Expire) {
await trx.rollback();
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Expired, redPacket));
}
if (redPacket.status == red_packet_model_1.RedPacketStatus.Claimed ||
redPacket.remainingCount <= 0) {
await trx.rollback();
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Finished, redPacket));
}
const now = help_1.Help.getSecondTimestamp();
if (redPacket.expireTime < now) {
await trx.rollback();
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Expired, redPacket));
}
const existingRecord = await this.redPacketRecordRepos.findOneBy({
redPacketId: redPacket.id,
userId: uid,
});
if (existingRecord) {
await trx.rollback();
const vo = new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Success, redPacket, existingRecord);
return api_1.Api.success(vo);
}
if (redPacket.type == red_packet_model_1.RedPacketType.Ordinary) {
if (redPacket.userId == uid) {
await trx.rollback();
return api_1.Api.success(new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Own, redPacket));
}
if (redPacket.claimedUserId != uid) {
await trx.rollback();
return api_1.Api.error(`这个红包不是发给你的`);
}
await redPacketRepos.update({
id: redPacket.id,
}, {
status: red_packet_model_1.RedPacketStatus.Claimed,
remainingAmount: 0,
remainingCount: 0,
});
const record = redPacketRecordRepos.create({
amount: decimal_help_1.DecimalHelp.div(redPacket.totalAmount, 100),
redPacketId: redPacket.id,
userId: uid,
createdAt: now,
});
await redPacketRecordRepos.insert(record);
await userRepos.update({
id: uid,
}, {
redEnvelope: () => `redEnvelope + ${record.amount}`,
});
await trx.commit();
const vo = new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Success, redPacket, record);
return api_1.Api.success(vo);
}
else {
const amount = this.calculateRandomAmount(redPacket.remainingAmount, redPacket.remainingCount);
const affected = await repository_help_1.RepositoryHelp.update(redPacketRepos, {
id: redPacket.id,
remainingAmount: (0, typeorm_2.MoreThanOrEqual)(amount),
remainingCount: (0, typeorm_2.MoreThanOrEqual)(1),
}, {
remainingAmount: () => `remainingAmount - ${amount}`,
remainingCount: () => `remainingCount - 1`,
status: redPacket.remainingCount <= 1
? red_packet_model_1.RedPacketStatus.Claimed
: red_packet_model_1.RedPacketStatus.Claiming,
});
if (!affected) {
return api_1.Api.error('网络错误,请稍后重试');
}
const record = redPacketRecordRepos.create({
amount: decimal_help_1.DecimalHelp.div(amount, 100),
redPacketId: redPacket.id,
userId: uid,
createdAt: now,
});
await redPacketRecordRepos.insert(record);
await userRepos.update({
id: uid,
}, {
redEnvelope: () => `redEnvelope + ${record.amount}`,
});
await trx.commit();
const vo = new user_im_vo_1.UserClaimedVo(user_im_vo_1.UserClaimedStats.Success, redPacket, record);
return api_1.Api.success(vo);
}
});
}
calculateRandomAmount(remainingAmount, remainingCount) {
if (remainingCount === 1) {
return remainingAmount;
}
const max = Math.floor((remainingAmount / remainingCount) * 2);
const amount = Math.floor(Math.random() * max) + 1;
return Math.min(amount, remainingAmount);
}
async updateUserProfile(dto) {
const uid = (0, user_id_context_1.getUserIdContext)();
const imUid = app_env_1.AppEnv.IM_USER_ID_PREFIX + uid;
const res = await im_help_1.IMHelp.updateUserProfile(imUid, dto.nick, dto.avatar);
if (res.ErrorCode == 0) {
return api_1.Api.success();
}
else {
return api_1.Api.error(res.ErrorInfo);
}
}
getUserGradeByImUid() {
return api_1.Api.pagination([], 0);
}
};
exports.UserImService = UserImService;
exports.UserImService = UserImService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_model_1.UserModel)),
__param(1, (0, typeorm_1.InjectRepository)(red_packet_model_1.RedPacketModel)),
__param(2, (0, typeorm_1.InjectRepository)(red_packet_record_model_1.RedPacketRecordModel)),
__param(3, (0, typeorm_1.InjectRepository)(user_verify_model_1.UserVerifyModel)),
__param(4, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository, Object])
], UserImService);
//# sourceMappingURL=user_im.service.js.map
File diff suppressed because one or more lines are too long
+7
View File
@@ -0,0 +1,7 @@
import { Repository } from 'typeorm';
import { UserMessageModel } from 'src/model/user_message.model';
export declare class UserMessageService {
private userMessageModel;
constructor(userMessageModel: Repository<UserMessageModel>);
markAsRead(id: number): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+39
View File
@@ -0,0 +1,39 @@
"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.UserMessageService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_message_model_1 = require("../../../model/user_message.model");
const api_1 = require("../../common/api");
const user_id_context_1 = require("../../common/context/user_id.context");
let UserMessageService = class UserMessageService {
userMessageModel;
constructor(userMessageModel) {
this.userMessageModel = userMessageModel;
}
async markAsRead(id) {
const userId = (0, user_id_context_1.getUserIdContext)();
await this.userMessageModel.update({ id, userId }, { isRead: 1 });
return api_1.Api.success();
}
};
exports.UserMessageService = UserMessageService;
exports.UserMessageService = UserMessageService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_message_model_1.UserMessageModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], UserMessageService);
//# sourceMappingURL=user_message.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"user_message.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/user_message.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,0EAAgE;AAChE,0CAAyC;AACzC,0EAA0E;AAGnE,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAGnB;IAFV,YAEU,gBAA8C;QAA9C,qBAAgB,GAAhB,gBAAgB,CAA8B;IACrD,CAAC;IAKJ,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAElC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAElE,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AAhBY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,qCAAgB,CAAC,CAAA;qCACT,oBAAU;GAH3B,kBAAkB,CAgB9B"}
+11
View File
@@ -0,0 +1,11 @@
import { Repository } from 'typeorm';
import { UserVerifyModel } from 'src/model/user_verify.model';
export declare class UserVerifyService {
private userVerifyModel;
constructor(userVerifyModel: Repository<UserVerifyModel>);
getVerifyInfo(): Promise<import("src/app/common/api").ApiResponseVo<{
hasUpload: boolean;
isApproved: boolean;
} | undefined>>;
submitVerifyInfo(realName: string, idCardNo: string, idCardFront: string, idCardBack: string, handHoldIdCard: string): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+91
View File
@@ -0,0 +1,91 @@
"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.UserVerifyService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_verify_model_1 = require("../../../model/user_verify.model");
const api_1 = require("../../common/api");
const user_id_context_1 = require("../../common/context/user_id.context");
let UserVerifyService = class UserVerifyService {
userVerifyModel;
constructor(userVerifyModel) {
this.userVerifyModel = userVerifyModel;
}
async getVerifyInfo() {
const userId = (0, user_id_context_1.getUserIdContext)();
const verifyRecord = await this.userVerifyModel.findOne({
where: { userId },
});
if (!verifyRecord) {
return api_1.Api.success({
hasUpload: false,
isApproved: false,
});
}
return api_1.Api.success({
hasUpload: true,
isApproved: verifyRecord.status === user_verify_model_1.VerifyAuditStatus.Approved,
status: verifyRecord.status,
realName: verifyRecord.realName,
idCardNo: verifyRecord.idCardNo,
idCardFront: verifyRecord.idCardFront,
idCardBack: verifyRecord.idCardBack,
handHoldIdCard: verifyRecord.handHoldIdCard,
rejectReason: verifyRecord.rejectReason,
});
}
async submitVerifyInfo(realName, idCardNo, idCardFront, idCardBack, handHoldIdCard) {
const userId = (0, user_id_context_1.getUserIdContext)();
const existingRecord = await this.userVerifyModel.findOne({
where: { userId },
});
if (existingRecord &&
existingRecord.status === user_verify_model_1.VerifyAuditStatus.Approved) {
return api_1.Api.error('实名认证已审核通过,无法重复提交');
}
if (existingRecord) {
await this.userVerifyModel.update({ id: existingRecord.id }, {
realName,
idCardNo,
idCardFront,
idCardBack,
handHoldIdCard,
status: user_verify_model_1.VerifyAuditStatus.Pending,
rejectReason: undefined,
});
}
else {
const verifyRecord = this.userVerifyModel.create({
userId,
realName,
idCardNo,
idCardFront,
idCardBack,
handHoldIdCard,
status: user_verify_model_1.VerifyAuditStatus.Pending,
});
await this.userVerifyModel.save(verifyRecord);
}
return api_1.Api.success();
}
};
exports.UserVerifyService = UserVerifyService;
exports.UserVerifyService = UserVerifyService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_verify_model_1.UserVerifyModel)),
__metadata("design:paramtypes", [typeorm_2.Repository])
], UserVerifyService);
//# sourceMappingURL=user_verify.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"user_verify.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/user_verify.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,wEAGqC;AACrC,0CAAyC;AACzC,0EAA0E;AAGnE,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAGlB;IAFV,YAEU,eAA4C;QAA5C,oBAAe,GAAf,eAAe,CAA6B;IACnD,CAAC;IAKJ,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAElC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACtD,KAAK,EAAE,EAAE,MAAM,EAAE;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,SAAG,CAAC,OAAO,CAAC;gBACjB,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAG,CAAC,OAAO,CAAC;YACjB,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,YAAY,CAAC,MAAM,KAAK,qCAAiB,CAAC,QAAQ;YAC9D,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,cAAc,EAAE,YAAY,CAAC,cAAc;YAC3C,YAAY,EAAE,YAAY,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAKD,KAAK,CAAC,gBAAgB,CACpB,QAAgB,EAChB,QAAgB,EAChB,WAAmB,EACnB,UAAkB,EAClB,cAAsB;QAEtB,MAAM,MAAM,GAAG,IAAA,kCAAgB,GAAE,CAAC;QAGlC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACxD,KAAK,EAAE,EAAE,MAAM,EAAE;SAClB,CAAC,CAAC;QAGH,IACE,cAAc;YACd,cAAc,CAAC,MAAM,KAAK,qCAAiB,CAAC,QAAQ,EACpD,CAAC;YACD,OAAO,SAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YAEnB,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAC/B,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,EACzB;gBACE,QAAQ;gBACR,QAAQ;gBACR,WAAW;gBACX,UAAU;gBACV,cAAc;gBACd,MAAM,EAAE,qCAAiB,CAAC,OAAO;gBACjC,YAAY,EAAE,SAAS;aACxB,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YAEN,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gBAC/C,MAAM;gBACN,QAAQ;gBACR,QAAQ;gBACR,WAAW;gBACX,UAAU;gBACV,cAAc;gBACd,MAAM,EAAE,qCAAiB,CAAC,OAAO;aAClC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,SAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AA3FY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,mCAAe,CAAC,CAAA;qCACT,oBAAU;GAH1B,iBAAiB,CA2F7B"}
+10
View File
@@ -0,0 +1,10 @@
import { Repository } from 'typeorm';
import { WalletModel } from 'src/model/wallet.model';
import { SystemConfigService } from 'src/app/common/service/system_config.service';
export declare class WalletService {
private walletModel;
private systemConfigService;
constructor(walletModel: Repository<WalletModel>, systemConfigService: SystemConfigService);
getWallet(userId: number): Promise<import("src/app/common/api").ApiResponseVo<null> | import("src/app/common/api").ApiResponseVo<WalletModel | undefined>>;
transfer(): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+85
View File
@@ -0,0 +1,85 @@
"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.WalletService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const wallet_model_1 = require("../../../model/wallet.model");
const api_1 = require("../../common/api");
const system_config_service_1 = require("../../common/service/system_config.service");
const user_id_context_1 = require("../../common/context/user_id.context");
const data_source_context_1 = require("../../common/context/data_source.context");
const wallet_bill_model_1 = require("../../../model/wallet_bill.model");
const repository_help_1 = require("../../common/util/repository_help");
const balance_log_help_1 = require("../../common/util/balance_log_help");
let WalletService = class WalletService {
walletModel;
systemConfigService;
constructor(walletModel, systemConfigService) {
this.walletModel = walletModel;
this.systemConfigService = systemConfigService;
}
async getWallet(userId) {
const wallet = await this.walletModel.findOne({
where: { userId },
});
if (!wallet) {
return api_1.Api.error('钱包不存在');
}
return api_1.Api.success(wallet);
}
async transfer() {
const userId = (0, user_id_context_1.getUserIdContext)();
const wallet = await this.walletModel.findOneByOrFail({ userId });
const config = await this.systemConfigService.readConfig();
const publicityFund = wallet.publicityFund;
const minTransferPublicityAmount = config.minTransferPublicityAmount;
if (Number(publicityFund) < Number(minTransferPublicityAmount)) {
return api_1.Api.error(`宣传金满${Number(minTransferPublicityAmount).toLocaleString()}才能划转到余额`);
}
return data_source_context_1.DataSourceContext.startTransaction(async (ctx) => {
const walletRepo = ctx.getRepository(wallet_model_1.WalletModel);
const walletBillRepo = ctx.getRepository(wallet_bill_model_1.WalletBillModel);
const count = await repository_help_1.RepositoryHelp.update(walletRepo, {
userId,
publicityFund: (0, typeorm_2.MoreThanOrEqual)(wallet.publicityFund),
}, {
publicityFund: '0',
balance: () => `balance + ${wallet.publicityFund}`,
});
if (!count) {
return api_1.Api.error('宣传进不足');
}
const updatedWallet = await walletRepo.findOneByOrFail({ id: wallet.id });
await balance_log_help_1.BalanceLogHelp.record(walletBillRepo, {
userId,
type: wallet_bill_model_1.WalletBillType.Transfer,
before: wallet.balance,
after: updatedWallet.balance,
amount: wallet.publicityFund,
remark: `宣传金划转,金额 ${wallet.publicityFund}`,
});
return api_1.Api.success();
});
}
};
exports.WalletService = WalletService;
exports.WalletService = WalletService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(wallet_model_1.WalletModel)),
__metadata("design:paramtypes", [typeorm_2.Repository,
system_config_service_1.SystemConfigService])
], WalletService);
//# sourceMappingURL=wallet.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"wallet.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/wallet.service.ts"],"names":[],"mappings":"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"}
+15
View File
@@ -0,0 +1,15 @@
import { Repository } from 'typeorm';
import { WithdrawModel } from 'src/model/withdraw.model';
import { WalletModel } from 'src/model/wallet.model';
import { UserBankModel } from 'src/model/user_bank.model';
import { WalletBillModel } from 'src/model/wallet_bill.model';
import { SystemConfigService } from 'src/app/common/service/system_config.service';
export declare class WithdrawService {
private withdrawModel;
private walletModel;
private userBankModel;
private walletBillModel;
private systemConfigService;
constructor(withdrawModel: Repository<WithdrawModel>, walletModel: Repository<WalletModel>, userBankModel: Repository<UserBankModel>, walletBillModel: Repository<WalletBillModel>, systemConfigService: SystemConfigService);
applyWithdraw(amount: string, userBankId: number): Promise<import("src/app/common/api").ApiResponseVo<unknown>>;
}
+123
View File
@@ -0,0 +1,123 @@
"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.WithdrawService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const withdraw_model_1 = require("../../../model/withdraw.model");
const wallet_model_1 = require("../../../model/wallet.model");
const user_bank_model_1 = require("../../../model/user_bank.model");
const wallet_bill_model_1 = require("../../../model/wallet_bill.model");
const api_1 = require("../../common/api");
const user_id_context_1 = require("../../common/context/user_id.context");
const data_source_context_1 = require("../../common/context/data_source.context");
const balance_log_help_1 = require("../../common/util/balance_log_help");
const system_config_service_1 = require("../../common/service/system_config.service");
let WithdrawService = class WithdrawService {
withdrawModel;
walletModel;
userBankModel;
walletBillModel;
systemConfigService;
constructor(withdrawModel, walletModel, userBankModel, walletBillModel, systemConfigService) {
this.withdrawModel = withdrawModel;
this.walletModel = walletModel;
this.userBankModel = userBankModel;
this.walletBillModel = walletBillModel;
this.systemConfigService = systemConfigService;
}
async applyWithdraw(amount, userBankId) {
const userId = (0, user_id_context_1.getUserIdContext)();
const amountNum = parseFloat(amount);
if (isNaN(amountNum) || amountNum <= 0) {
return api_1.Api.error('无效的提现金额');
}
const systemConfig = await this.systemConfigService.readConfig();
const minWithdrawAmount = systemConfig.minWithdrawAmount;
if (parseFloat(amount) < parseFloat(minWithdrawAmount)) {
return api_1.Api.error(`最低提现金额为 ${Number(minWithdrawAmount).toLocaleString()}`);
}
const userBank = await this.userBankModel.findOne({
where: { id: userBankId, userId },
});
if (!userBank) {
return api_1.Api.error('银行卡不存在');
}
const wallet = await this.walletModel.findOne({
where: { userId },
});
if (!wallet) {
return api_1.Api.error('用户钱包不存在');
}
await data_source_context_1.DataSourceContext.startTransaction(async (transaction) => {
const walletRepo = transaction.getRepository(wallet_model_1.WalletModel);
const walletBillRepo = transaction.getRepository(wallet_bill_model_1.WalletBillModel);
const withdrawRepo = transaction.getRepository(withdraw_model_1.WithdrawModel);
const updateResult = await walletRepo
.createQueryBuilder('wallet')
.update(wallet_model_1.WalletModel)
.set({
balance: () => `balance - ${amount}`,
frozenBalance: () => `frozenBalance + ${amount}`,
})
.where('id = :id', { id: wallet.id })
.andWhere('balance >= :amount', { amount })
.execute();
if (updateResult.affected === 0) {
throw new common_1.HttpException('余额不足', common_1.HttpStatus.BAD_REQUEST);
}
const updatedWallet = await walletRepo.findOne({
where: { id: wallet.id },
});
if (!updatedWallet) {
throw new Error('钱包不存在');
}
await balance_log_help_1.BalanceLogHelp.record(walletBillRepo, {
userId,
type: wallet_bill_model_1.WalletBillType.Withdrawal,
before: wallet.balance,
after: updatedWallet.balance,
amount,
remark: `提现申请,金额 ${amount}`,
});
const withdraw = withdrawRepo.create({
userId,
amount,
actualAmount: amount,
userBankId,
status: withdraw_model_1.WithdrawStatus.Pending,
cardNo: userBank.cardNo,
bankName: userBank.bankName,
phone: userBank.phone,
});
await withdrawRepo.save(withdraw);
});
return api_1.Api.success();
}
};
exports.WithdrawService = WithdrawService;
exports.WithdrawService = WithdrawService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(withdraw_model_1.WithdrawModel)),
__param(1, (0, typeorm_1.InjectRepository)(wallet_model_1.WalletModel)),
__param(2, (0, typeorm_1.InjectRepository)(user_bank_model_1.UserBankModel)),
__param(3, (0, typeorm_1.InjectRepository)(wallet_bill_model_1.WalletBillModel)),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository,
system_config_service_1.SystemConfigService])
], WithdrawService);
//# sourceMappingURL=withdraw.service.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"withdraw.service.js","sourceRoot":"","sources":["../../../../src/app/api/service/withdraw.service.ts"],"names":[],"mappings":"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"}