feat(gvg): 征战中原动态、任务、贡献

This commit is contained in:
luying
2023-02-04 18:14:34 +08:00
parent 1f083dc0fa
commit e7a62c4e3e
12 changed files with 104 additions and 29 deletions

View File

@@ -106,6 +106,12 @@ export default class GVGUserData extends BaseModel {
return result;
}
public static async addVestigeScores(configId: number, memberScores: { leagueCode: string, roleId: string, score: number }[]) {
await GVGUserDataModel.bulkWrite(memberScores.map(({ leagueCode, roleId, score }) => {
return { updateOne: { filter: { configId, leagueCode, roleId }, update: { $inc: { 'distribute.score': score } } } }
}));
}
public static async receiveBox(configId: number, leagueCode: string, roleId: string, boxId: number) {
const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $push: { box: boxId }}, { new: true }).lean();
return result;

View File

@@ -104,26 +104,28 @@ export default class GVGVestigeRank extends BaseModel {
await GVGVestigeRankModel.updateMany({ day: today, hasDefense: true, roleId, 'lineup.hid': hid }, { $set: { 'lineupCe.$.ce': ce } });
}
public static async changeRank(isSuccess: boolean, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, endTime: number }> {
public static async changeRank(isSuccess: boolean, vestigeId: number, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, endTime: number }> {
let today = getZeroPoint();
const session = await mongoose.connection.startSession();
session.startTransaction()
try {
let newAtkData: GVGVestigeRankType, newDefData: GVGVestigeRankType, isChange = false, endTime = Date.now();
if(defenseInfo.isRobot) {
let atkData = await GVGVestigeRankModel.findOne({ roleId: attackInfo.roleId }).lean();
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
if(isSuccess && atkData && (atkData.rank == 0 || atkData.rank > defenseInfo.oldRank)) {
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkData.rank } }, { new: true, session }).lean();
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkData.rank } }, { new: true, session }).lean();
isChange = true;
endTime = Date.now();
} else {
newAtkData = atkData;
}
} else {
let atkData = await GVGVestigeRankModel.findOne({ roleId: attackInfo.roleId }).lean();
let defData = await GVGVestigeRankModel.findOne({ roleId: defenseInfo.roleId }).lean();
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
let defData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: defenseInfo.roleId }).lean();
if(isSuccess && atkData && defData && (atkData.rank == 0 || atkData.rank > defData.rank)) {
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defData.rank, oldRank: atkData.rank } }, { new: true, session }).lean();
newDefData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: defenseInfo.roleId }, { $set: { rank: atkData.rank, oldRank: defData.rank } }, { new: true, session }).lean();
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defData.rank, oldRank: atkData.rank } }, { new: true, session }).lean();
newDefData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: defenseInfo.roleId }, { $set: { rank: atkData.rank, oldRank: defData.rank } }, { new: true, session }).lean();
isChange = true;
endTime = Date.now();
} else {

View File

@@ -12,6 +12,9 @@ export default class GVGVestigeSumRank extends BaseModel {
@prop({ required: true })
roleId: string; // 玩家id
@prop({ required: true })
leagueCode: string; // 联军id
@prop({ required: true })
groupId: number; // 战区id
@@ -21,26 +24,36 @@ export default class GVGVestigeSumRank extends BaseModel {
@prop({ required: true })
score: number; // 得分
public static async incScore(roleId: string, groupId: number, serverType: number, inc: number) {
public static async incScore(roleId: string, leagueCode: string, groupId: number, serverType: number, inc: number) {
let today = getZeroPoint();
let result: GVGVestigeSumRankType = await GVGVestigeSumRankModel.findOneAndUpdate({
day: today, groupId, serverType, roleId
day: today, groupId, serverType, roleId, leagueCode
}, { $inc: { score: inc } }, { new: true, upsert: true }).lean();
return result;
}
// 排行榜
public static async findRank(): Promise<{ _id: { groupId: number, serverType: number }, arr: { roleId: string, score: number, updatedAt: Date }[], roleIds: string[] }[]> {
public static async findRankByGroupId(): Promise<{ _id: { groupId: number, serverType: number }, arr: { roleId: string, score: number, updatedAt: Date }[], roleIds: string[] }[]> {
let today = getZeroPoint();
let ranks = await GVGVestigeSumRankModel.aggregate([
{ $match: { day: today } },
{ $group: {
_id: { groupId: "$groupId", serverType: "$serverType" },
arr: { $push: { roleId: "$roleId", score: "$score", updatedAt: "$updatedAt" } }, roleIds: { $addToSet: "$roleId" }
arr: { $push: { roleId: "$roleId", score: "$score", updatedAt: "$updatedAt", leagueCode: "$leagueCode" } }, roleIds: { $addToSet: "$roleId" }
}},
]);
return ranks;
}
// 用于快照玩家的得分
public static async findAllScores() {
let today = getZeroPoint();
let ranks: GVGVestigeSumRankType[] = await GVGVestigeSumRankModel.aggregate([
{ $match: { day: today } },
{ $project: { roleId: 1, score: 1, leagueCode: 1 } }
]);
return ranks;
}
}
export const GVGVestigeSumRankModel = getModelForClass(GVGVestigeSumRank);