✨ feat(兼容): 配表使用后台隐藏物品
This commit is contained in:
@@ -166,4 +166,5 @@ export const PUSH_ROUTE = {
|
||||
LADDER_BATTLE_STOP: 'onLadderBattleStop',
|
||||
LADDER_RANK_UPDATE: 'onLadderRankUpdate',
|
||||
GROUP_SHOP_UPDATE: 'onGroupShopUpdate',
|
||||
HIDDEN_DATA: 'onHiddenData',
|
||||
}
|
||||
@@ -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,];
|
||||
|
||||
@@ -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
44
shared/db/HiddenData.ts
Normal 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
103
shared/db/HiddenDataById.ts
Normal 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>; // 将所有字段变成可选项
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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 城池类型
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user