Expand representative QA report summary

This commit is contained in:
2026-07-07 15:26:45 +09:00
parent 97a7432df3
commit e9d2bc461f

View File

@@ -3053,6 +3053,7 @@ function buildQaReport(results, failed) {
failureReason: objective.failureReason ?? ''
}))
);
const summary = buildQaReportSummary(results, failed, missedObjectives);
return {
app: 'heros_web',
@@ -3064,12 +3065,7 @@ function buildQaReport(results, failed) {
cumulativeMode,
requestedBattles: [...requestedBattles],
battleCount: results.length,
summary: {
victories: results.filter((result) => result.outcome === 'victory').length,
failures: failed.length,
missedObjectiveCount: missedObjectives.length,
battlesWithMissedObjectives: [...new Set(missedObjectives.map((objective) => objective.battleNo))]
},
summary,
missedObjectives,
results: results.map((result) => ({
no: result.no,
@@ -3093,3 +3089,70 @@ function buildQaReport(results, failed) {
}))
};
}
function buildQaReportSummary(results, failed, missedObjectives) {
const turnValues = results.map((result) => result.finalTurn ?? 0).filter((turn) => turn > 0);
const totalTurns = turnValues.reduce((total, turn) => total + turn, 0);
const longestBattle = results.reduce((current, result) => {
if (!current || (result.finalTurn ?? 0) > (current.finalTurn ?? 0)) {
return result;
}
return current;
}, undefined);
const totals = results.reduce(
(summary, result) => {
summary.objectiveCount += result.objectiveCount ?? 0;
summary.objectivesAchieved += result.objectivesAchieved ?? 0;
summary.itemsUsed += result.itemsUsed ?? 0;
summary.supports += result.supports ?? 0;
if (result.campSuppliesUsed) {
summary.campSuppliesUsed.bean += result.campSuppliesUsed.bean ?? 0;
summary.campSuppliesUsed.salve += result.campSuppliesUsed.salve ?? 0;
summary.campSuppliesUsed.wine += result.campSuppliesUsed.wine ?? 0;
}
return summary;
},
{
objectiveCount: 0,
objectivesAchieved: 0,
itemsUsed: 0,
supports: 0,
campSuppliesUsed: { bean: 0, salve: 0, wine: 0 }
}
);
const latestCampaign = results.at(-1)?.campaign;
return {
victories: results.filter((result) => result.outcome === 'victory').length,
failures: failed.length,
missedObjectiveCount: missedObjectives.length,
battlesWithMissedObjectives: [...new Set(missedObjectives.map((objective) => objective.battleNo))],
objectivesAchieved: totals.objectivesAchieved,
objectiveCount: totals.objectiveCount,
turns: {
total: totalTurns,
average: turnValues.length > 0 ? Number((totalTurns / turnValues.length).toFixed(1)) : 0,
min: turnValues.length > 0 ? Math.min(...turnValues) : 0,
max: turnValues.length > 0 ? Math.max(...turnValues) : 0,
longestBattle: longestBattle ? { no: longestBattle.no, id: longestBattle.id, turn: longestBattle.finalTurn ?? 0 } : null
},
resources: {
itemsUsed: totals.itemsUsed,
supports: totals.supports,
campSuppliesUsed: totals.campSuppliesUsed
},
latestCampaign: latestCampaign
? {
battleCount: latestCampaign.battleCount,
gold: latestCampaign.gold,
supplies: latestCampaign.supplies,
rosterCount: latestCampaign.rosterCount,
levelMin: latestCampaign.levelMin,
levelMax: latestCampaign.levelMax,
levelAvg: latestCampaign.levelAvg,
lowHp: latestCampaign.lowHp,
topLevels: latestCampaign.topLevels
}
: null
};
}