feat(兼容): 配表使用后台隐藏物品

This commit is contained in:
luying
2022-11-09 18:01:02 +08:00
parent 5d0873630a
commit 53d4af4e09
54 changed files with 768 additions and 102 deletions

View File

@@ -166,4 +166,5 @@ export const PUSH_ROUTE = {
LADDER_BATTLE_STOP: 'onLadderBattleStop',
LADDER_RANK_UPDATE: 'onLadderRankUpdate',
GROUP_SHOP_UPDATE: 'onGroupShopUpdate',
HIDDEN_DATA: 'onHiddenData',
}

View File

@@ -51,7 +51,8 @@ export const COUNTER = {
REGION: { name: 'region', def: 1 },
GATE_ACTIVITY: { name: 'guildAct', def: 1 },
CITY_ACTIVITY: { name: 'cityAct', def: 1 },
RACE_ACTIVITY: { name: 'raceAct', def: 1 }
RACE_ACTIVITY: { name: 'raceAct', def: 1 },
HIDDEN_DATA: { name: 'hiddendata', def: 1 },
};
export const DEFAULT_HEROES = [19, 53,];

View File

@@ -330,6 +330,9 @@ export const STATUS = {
TALENT_POINT_NOT_ENOUGH: { code: 30313, simStr: '天赋点不足' },
TALENT_NOT_UNLOCKED: { code: 30314, simStr: '该天赋未解锁' },
TALENT_LEVEL_MAX: { code: 30315, simStr: '该天赋等级已达最高' },
HERO_IS_HIDDEN: { code: 30316, simStr: '未找到该武将' },
FASHION_IS_HIDDEN: { code: 30317, simStr: '未找到该时装' },
ITEM_IS_HIDDEN: { code: 30318, simStr: '未找到该道具' },
// 装备养成 30400-30499
ROLE_EQUIP_PLACE_NOT_ENOUGH: { code: 30400, simStr: '装备栏未装备或无可强化' },
@@ -542,6 +545,10 @@ export const STATUS = {
GM_MAIL_NOT_FOUND: { code: 60024, simStr: '未找到该邮件' },
GM_MAIL_HAS_SENT: { code: 60025, simStr: '邮件已经审批过了' },
GM_MAIL_CAN_NOT_SENT: { code: 60026, simStr: '邮件不可发送' },
GM_REMOVED_GID: { code: 60027, simStr: '已移除过隐藏的id不可再次隐藏' },
GM_HIDDEN_TIME_ERR: { code: 60028, simStr: '时间不可有所重叠' },
GM_OLD_REF_TIME_ERR: { code: 60029, simStr: '正在进行中的时间不可更新成未来' },
GM_HIDDEN_CANNOT_INIT: { code: 60030, simStr: '已初始化过' },
// 支付相关状态 70000 - 79999
NO_PRODUCT_ID: { code: 70001, simStr: '无效商品' },
NO_PAY_TYPE: { code: 70002, simStr: '无效支付类型' },

44
shared/db/HiddenData.ts Normal file
View File

@@ -0,0 +1,44 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
/**
* 累计充值活动
*/
@index({ refTime: -1 })
export default class HiddenData extends BaseModel {
@prop({ required: true })
refTime: number; // 刷新时间
@prop({ required: true, type: Number })
heroes: number[]; // 武将id
@prop({ required: true, type: Number })
goods: number[]; // 物品id
public static async clearData() {
await HiddenDataModel.deleteMany({});
}
public static async updateHiddenData(refTime: number, heroes: number[], goods: number[], uid: number) {
let result: HiddenDataModelType = await HiddenDataModel.findOneAndUpdate({ refTime }, { $setOnInsert: { createdBy: uid }, $set: { heroes, goods, updatedBy: uid } }, { new: true, upsert: true});
return result;
}
public static async findCurData(now: number) {
let result: HiddenDataModelType = await HiddenDataModel.findOne({ refTime: { $lte: now }}).sort({ refTime: -1 });
return result;
}
public static async findNextData(now: number) {
console.log('####', now)
let result: HiddenDataModelType = await HiddenDataModel.findOne({ refTime: { $gt: now } }).sort({ refTime: 1 });
return result;
}
}
export const HiddenDataModel = getModelForClass(HiddenData);
export interface HiddenDataModelType extends Pick<DocumentType<HiddenData>, keyof HiddenData> { }
export type HiddenDataModelTypeParam = Partial<HiddenDataModelType>; // 将所有字段变成可选项

103
shared/db/HiddenDataById.ts Normal file
View File

@@ -0,0 +1,103 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { nowSeconds } from '../pubUtils/timeUtil';
import { isArray } from 'util';
/**
* 累计充值活动
*/
@index({ type: 1, id: -1 })
@index({ refTime: 1 })
export default class HiddenDataById extends BaseModel {
@prop({ required: true })
type: number; // 1-武将 2-道具
@prop({ required: true })
id: number; // 武将id or 道具id
@prop({ required: false })
publishTime: number; // 结束隐藏时间
public static async checkHasInit(type: number, ids: number[]) {
return await HiddenDataByIdModel.exists({ type, id: ids });
}
private static getSearchObj(form: any) {
let searchObj = {};
let orData = [];
if(form.heroes && isArray(form.heroes) && form.heroes.length > 0) {
orData.push({ type: 1, id: { $in: form.heroes }});
}
if(form.goods && isArray(form.goods) && form.goods.length > 0) {
orData.push({ type: 2, id: { $in: form.goods }});
}
if(orData.length > 0) {
searchObj['$or'] = orData;
}
return searchObj
}
public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: any = {}) {
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: HiddenDataByIdModelType[] = await HiddenDataByIdModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
return result;
}
public static async countByCondition(form: any = {}) {
let searchObj = this.getSearchObj(form);
const result = await HiddenDataByIdModel.count(searchObj);
return result;
}
public static async createDatas(datas: HiddenDataByIdModelTypeParam[]) {
await HiddenDataByIdModel.insertMany(datas);
}
public static async findAllData() {
let result: { _id: number, ids: {type: number, id: number }[]}[] = await HiddenDataByIdModel.aggregate([
{ $match: { publishTime: { $gte: nowSeconds() } } },
{ $group: { _id: '$publishTime', ids: { $push: { type: '$type', id: '$id' } }} },
{ $sort: { _id: -1 } }
]);
return result;
}
public static async findExistData(type: number) {
let result: { type: number, id: number }[] = await HiddenDataByIdModel.aggregate([
{ $match: { type } },
{ $project: { id: 1 } }
]);
return result;
}
public static async checkById(type: number, ids: number[], publishTime: number) {
let now = nowSeconds();
if (publishTime >= now) { // 设为隐藏,不可有原来公开着的
let result = await HiddenDataByIdModel.exists({ type, id: { $in: ids }, publishTime: { $lt: now } });
return !result
}
return true;
}
public static async updateData(type: number, id: number, publishTime: number, uid: number) {
await HiddenDataByIdModel.findOneAndUpdate({ type, id }, { $set: { publishTime, updatedBy: uid }, $setOnInsert: { createdBy: uid } }, { new: true, upsert: true }).lean();
}
}
export const HiddenDataByIdModel = getModelForClass(HiddenDataById);
export interface HiddenDataByIdModelType extends Pick<DocumentType<HiddenDataById>, keyof HiddenDataById> { }
export type HiddenDataByIdModelTypeParam = Partial<HiddenDataByIdModelType>; // 将所有字段变成可选项

View File

@@ -470,4 +470,29 @@ export class CreatePvpConfigParam {
let { seasonStartTime, seasonEndTime, seasonRewardTime, warIds } = this;
return { seasonStartTime, seasonEndTime, seasonRewardTime, warIds: parseNumberList(warIds)}
}
}
export class UpdateHiddenDataParam {
env: string = '';
arr: { type: number, id: number }[] = [];
publishTime: number = 0;
constructor(obj?: any) {
if(obj) {
for(let key in obj) {
this[key] = obj[key];
}
}
}
checkParams() {
// console.log('##### createNew', this.env, this.openTime, this.stopRegisterTime, this.hasOpenMail, this.hasCircleMail)
if(!isArray(this.arr)) return false;
for(let { type, id } of this.arr) {
if(!isNumber(type) || !isNumber(id)) return false;
}
if(!this.env || !isNumber(this.publishTime)) {
return false
}
return true;
}
}

View File

@@ -57,7 +57,7 @@ import { dicCityActivityReward, loadCityActivityReward } from "./dictionary/DicC
import { dicRaceActivity, dicRaceTypes, loadRaceActivity } from './dictionary/DicRaceActivity';
import { GUILDACTIVITY, RECRUIT } from "./dicParam";
import * as param from "./dicParam";
import { decodeIdCntArrayStr, parseGoodStr, decodeArrayListStr, getRandEelm, readTsFile, getRandEelmWithWeight, getRandSingleEelm } from "./util";
import { decodeIdCntArrayStr, parseGoodStr, decodeArrayListStr, getRandEelm, readTsFile, getRandSingleEelm } from "./util";
import { RACE_EVENT_TYPE } from "../consts";
import { dicShopByType, dicShopItem, loadShop } from "./dictionary/DicShop";
import { dicShopType, loadShopType } from "./dictionary/DicShopType";
@@ -110,7 +110,6 @@ import { dicLadderMatch, loadLadderMatch } from "./dictionary/DicLadderMatch";
import { dicLadderDifficultRatio, loadLadderDifficultRatio } from "./dictionary/DicLadderDifficultRatio";
import { dicLadderRankReward, loadLadderRankReward } from "./dictionary/DicLadderRankReward";
import { dicGeneralGoods, loadGeneralGoods } from "./dictionary/DicGeneralGoods";
import { AuctionRewardInter } from "../domain/battleField/auction";
export const gameData = {
daily: dicDaily,
@@ -654,51 +653,6 @@ export function getTodayGuildActivity() {
return dic;
}
/**
* 根据军团活动排名获得奖励
* @param aid 活动id
* @param rank 排名
*/
function getGuildAuction(aid: number, rank: number, struLv: number, cityId: number = 0) {
let ranksReward = gameData.guildAuction.get(`${aid}_${struLv}_${cityId}`) || [];
return ranksReward.find(cur => {
return rank >= cur.min && (rank <= cur.max || cur.max == 0);
});
}
export function getGuildAuctionRewards(aid: number, rank: number, struLv: number, cityId: number = 0) {
let dic = getGuildAuction(aid, rank, struLv, cityId);
if(dic) {
return getAuctionRewardByPoolId(dic.rewards);
} else {
return new Map();
}
}
export function getGuildAuctionBasicNum(aid: number, rank: number, struLv: number, cityId: number = 0) {
let dic = getGuildAuction(aid, rank, struLv, cityId);
return dic?.basicDividend||0;
}
export function getAuctionRewardByPoolId(poolId: number) {
let pools = gameData.auctionPool.get(poolId);
let rewards: Map<number, AuctionRewardInter[]> = new Map();
for(let { count, basicPool } of pools) {
let { rewardBasicPool, basePrice, maxPrice, sort } = basicPool
for(let i = 0; i < count; i++) {
let result = getRandEelmWithWeight(rewardBasicPool);
if(result && result.dic) {
let { id, count } = result.dic;
if(!rewards.has(id)) {
rewards.set(id, []);
}
rewards.get(id).push({ goods: {id, count}, basePrice, maxPrice, sort });
}
}
}
return rewards;
}
/**
* 根据军团活动排名获得功勋奖励
* @param type 城池类型

View File

@@ -908,5 +908,19 @@
"name": "保存pvp赛季",
"module": "sys",
"type": "update"
},
{
"id": 131,
"api": "gm.gmServerHandler.initHiddenData",
"name": "初始隐藏数据",
"module": "sys",
"type": "update"
},
{
"id": 132,
"api": "gm.gmServerHandler.saveHiddenData",
"name": "更新隐藏数据",
"module": "sys",
"type": "update"
}
]