diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index ffadb674d..97fd5f77a 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -56,6 +56,7 @@ export const STATUS = { SERVER_STOP_REGISTER: { code: 10020, simStr: '服务器已停止注册' }, ROLE_CLOSE_TIME_OVER: { code: 10021, simStr: '该账号已注销不可再取消' }, ROLE_CLOSED: { code: 10022, simStr: '该账号已注销' }, + ROLE_CLOSE_COOL_DOWN: { code: 10023, simStr: '注销冷却中' }, // 战斗相关状态 20000 - 29999 // 战斗通用 20000 - 20099 BATTLE_MISS_INFO: { code: 20001, simStr: '缺少关卡信息' }, diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 65ebc12d0..cf6ea8aeb 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -357,6 +357,8 @@ export default class Role extends BaseModel { @prop({ required: true, select: false }) closeTime: number; + @prop({ required: true, select: false }) + cancelCloseTime: number; public static async findAllByUid(uid: number, getters = false, virtuals = true) { const role: RoleType[] = await RoleModel.find({ 'userInfo.uid': uid }).select('roleId roleName serverId head frame spine heads frames spines lv updatedAt createTime +closeTime').lean({ getters, virtuals }); @@ -868,7 +870,7 @@ export default class Role extends BaseModel { } public static async cancelCloseAccount(roleId: string, now: number) { - let role: RoleType = await RoleModel.findOneAndUpdate({ roleId, closeTime: { $gte: now } }, { $set: { closeTime: 0 } }, { new: true }).select('roleId +closeTime').lean(); + let role: RoleType = await RoleModel.findOneAndUpdate({ roleId, closeTime: { $gte: now } }, { $set: { closeTime: 0, cancelCloseTime: now } }, { new: true }).select('roleId +closeTime').lean(); return role; } } diff --git a/web-server/app/service/Auth.ts b/web-server/app/service/Auth.ts index e152206f0..9dd4a623e 100644 --- a/web-server/app/service/Auth.ts +++ b/web-server/app/service/Auth.ts @@ -486,14 +486,26 @@ export default class Auth extends Service { public async closeAccount(roleId: string) { const ctx = this.ctx; - let role = await RoleModel.closeAccount(roleId, nowSeconds() + 15 * 24 * 60 * 60); + let role = await RoleModel.findByRoleId(roleId, '+cancelCloseTime'); if(!role) return ctx.service.utils.resResult(STATUS.ROLE_NOT_FOUND); + if(role.cancelCloseTime > 0 && role.cancelCloseTime + 24 * 60 * 60 > nowSeconds() ) + return ctx.service.utils.resResult(STATUS.ROLE_CLOSE_COOL_DOWN, `注销冷却中,请${this.getCdTimeStr(role.cancelCloseTime)}后再试`); + + role = await RoleModel.closeAccount(roleId, nowSeconds() + 15 * 24 * 60 * 60); return ctx.service.utils.resResult(STATUS.SUCCESS, { closeTime: role.closeTime }); } + private getCdTimeStr(cancelCloseTime: number) { + let gap = cancelCloseTime + 24 * 60 * 60 - nowSeconds(); + let h = Math.floor(gap/60/60); + let m = Math.floor((gap - h * 60 * 60 )/60); + let s = gap - h * 60 * 60 - m * 60; + return `${h}小时${m}分${s}秒` + } + public async cancelCloseAccount(roleId: string) { const ctx = this.ctx; - let role = await RoleModel.cancelCloseAccount(roleId, nowSeconds() + 15 * 24 * 60 * 60); + let role = await RoleModel.cancelCloseAccount(roleId, nowSeconds()); if(!role) return ctx.service.utils.resResult(STATUS.ROLE_CLOSE_TIME_OVER); return ctx.service.utils.resResult(STATUS.SUCCESS, { closeTime: role.closeTime }); }