diff --git a/game-server/app/servers/role/handler/itemHandler.ts b/game-server/app/servers/role/handler/itemHandler.ts index 8b6b12302..bab3bb15f 100644 --- a/game-server/app/servers/role/handler/itemHandler.ts +++ b/game-server/app/servers/role/handler/itemHandler.ts @@ -152,7 +152,9 @@ export class ItemHandler { if(!giftCode) { return resResult(STATUS.GIFT_CODE_NOT_FOUND); } - + if(giftCode.generateType == GIFT_GENERATE_TYPE.ONE_TO_ONE) { // 一人一条,单条不能被多人使用 + if(giftCodeDetail.usedNum > 0) return resResult(STATUS.GIFT_CODE_USED_NUM_MAX); + } if(!giftCode.isEnable) return resResult(STATUS.GIFT_CODE_HAS_EXPIRED); if (giftCode.beginTime > nowSeconds()) return resResult(STATUS.GIFT_CODE_NOT_START); if (giftCode.endTime < nowSeconds()) return resResult(STATUS.GIFT_CODE_HAS_EXPIRED); @@ -161,6 +163,12 @@ export class ItemHandler { return resResult(STATUS.YOU_HAVE_USED_THIS_CODE); } + let checkHasUse = await GiftCodeDetailModel.checkHasUsed(roleId, giftCodeDetail.giftId) + if(checkHasUse) { + return resResult(STATUS.YOU_HAVE_USED_THIS_CODE); + } + + await GiftCodeDetailModel.increaseUsedNum(code, roleId, roleName, serverId); await GiftCodeModel.increaseUsedNum(giftCode.id); diff --git a/gm-server/app/controller/users.ts b/gm-server/app/controller/users.ts index e7e0491f8..3fdbce300 100644 --- a/gm-server/app/controller/users.ts +++ b/gm-server/app/controller/users.ts @@ -172,6 +172,12 @@ export default class UserController extends Controller { ctx.body = await ctx.service.users.cancelGiftCode(params.id, !!params.isEnable); } + public async getGiftCodeDetailList() { + const { ctx } = this; + const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; + ctx.body = await ctx.service.users.getGiftCodeDetailList(page, pageSize, sortField, sortOrder, form); + } + public async getGiftCodeDetailFile() { const { ctx } = this; const { id } = ctx.params; diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 734924224..e09606a41 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -49,6 +49,7 @@ export default (app: Application) => { router.post('/api/users/updategiftcode', controller.users.updateGiftCode); router.post('/api/users/generategiftcode', controller.users.generateGiftCode); router.post('/api/users/cancelgiftCode', controller.users.cancelGiftCode); + router.post('/api/users/getgiftcodedetaillist', controller.users.getGiftCodeDetailList); router.get('/api/users/getgiftcodedetailfile/:id/:filename', controller.users.getGiftCodeDetailFile); // router.post('/api/game/getserverlistbyenv', tokenParser, controller.game.getServerListByEnv); diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index c226a9238..06d87b9e0 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -21,7 +21,7 @@ import { CreateHeroes, deletRole } from '@pubUtils/roleUtil'; import { RScriptRecordModel } from '@db/RScriptRecord'; import { DicWar } from '@pubUtils/dictionary/DicWar'; import { SkinModel } from '@db/Skin'; -import { SearchEquipParam, SearchHeroParam, SearchUserParam, SearchGiftCodeParam } from '@domain/backEndField/search'; +import { SearchEquipParam, SearchHeroParam, SearchUserParam, SearchGiftCodeParam, SearchGiftCodeDetailParam } from '@domain/backEndField/search'; import { CreateGiftCode, UpdateGiftCode } from '@domain/backEndField/params'; import { isNumber } from 'util'; @@ -693,6 +693,16 @@ export default class GMUsers extends Service { return Buffer.from(codes.join('\n')); } + public async getGiftCodeDetailList(page: number, pageSize: number, sortField: string, sortOrder: string, form: SearchGiftCodeDetailParam = {}) { + const { ctx } = this; + + const list = await GiftCodeDetailModel.findByCondition(page, pageSize, sortField, sortOrder, form); + const total = await GiftCodeDetailModel.countByCondition( form ) + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list: list.map(cur => ({...cur, env: ctx.app.config.realEnv })), total + }); + } + public async setWarRecord(roleIds: string[], _warId: string) { const { ctx } = this; let warId = parseInt(_warId); diff --git a/shared/db/GiftCodeDetail.ts b/shared/db/GiftCodeDetail.ts index 914bfeff4..05f4e2cec 100644 --- a/shared/db/GiftCodeDetail.ts +++ b/shared/db/GiftCodeDetail.ts @@ -3,7 +3,8 @@ import { index, getModelForClass, prop, DocumentType, modelOptions } from '@type import { GIFT_GENERATE_TYPE } from '../consts'; import { GiftCodeModel, GiftCodeType } from './GiftCode'; import { nowSeconds } from '../pubUtils/timeUtil'; -import { genCode } from '@pubUtils/util'; +import { genCode } from '../pubUtils/util'; +import { SearchGiftCodeDetailParam } from '../domain/backEndField/search'; class RoleRecord { @prop({ required: true, default: '' }) @@ -50,7 +51,12 @@ export default class GiftCodeDetail extends BaseModel { // 根据code public static async findByCode(code: string) { - let result: GiftCodeDetailType = await GiftCodeDetailModel.findOne({ code }).populate('giftCode').lean(true); + let result: GiftCodeDetailType = await GiftCodeDetailModel.findOne({ code }).lean(true); + return result; + } + + public static async checkHasUsed(roleId: string, id: number) { + let result = await GiftCodeDetailModel.exists({ giftId: id, 'record.roleId': roleId }); return result; } @@ -84,6 +90,40 @@ export default class GiftCodeDetail extends BaseModel { return result; } + private static getSearchObj(form: SearchGiftCodeDetailParam) { + let searchObj = {}; + if(form.giftId) searchObj['giftId'] = form.giftId; + if (form.giftName != undefined) searchObj['giftName'] = { $regex: new RegExp(form.giftName.toString(), 'i') }; + if(form.generateType) searchObj['generateType'] = form.generateType; + if(form.code) searchObj['code'] = form.code; + if(form.roleId) searchObj['record.roleId'] = form.roleId; + if (form.roleName != undefined) searchObj['record.roleName'] = { $regex: new RegExp(form.roleName.toString(), 'i') }; + return searchObj + } + + public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form:SearchGiftCodeDetailParam = {}) { + + let searchObj = this.getSearchObj(form); + let sort = {}; + if (sortField && sortOrder) { + if (sortOrder == 'ascend') { + sort[sortField] = 1; + } else if (sortOrder == 'descend') { + sort[sortField] = -1; + } + } + const result: GiftCodeDetailType[] = await GiftCodeDetailModel.find(searchObj, { _id: 0 }).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true }); + return result; + + } + + public static async countByCondition(form: SearchGiftCodeDetailParam = {}) { + + let searchObj = this.getSearchObj(form); + const result = await GiftCodeDetailModel.count(searchObj); + return result; + } + } export const GiftCodeDetailModel = getModelForClass(GiftCodeDetail); diff --git a/shared/domain/backEndField/search.ts b/shared/domain/backEndField/search.ts index 06d12a65f..7f16375dd 100644 --- a/shared/domain/backEndField/search.ts +++ b/shared/domain/backEndField/search.ts @@ -51,4 +51,13 @@ export interface SearchGiftCodeParam { name?: string; createTimeStart?: number; createTimeEnd?: number; +} + +export interface SearchGiftCodeDetailParam { + giftId?: number; + giftName?: string; + generateType?: number; + code?: string; + roleId?: string; + roleName?: string; } \ No newline at end of file