Files
usa/server/situationData.js
2026-03-02 18:39:29 +08:00

156 lines
6.1 KiB
JavaScript

const db = require('./db')
function toAsset(row) {
return {
id: row.id,
name: row.name,
type: row.type,
count: row.count,
status: row.status,
...(row.lat != null && { location: { lat: row.lat, lng: row.lng } }),
}
}
function toLosses(row) {
return {
bases: { destroyed: row.bases_destroyed, damaged: row.bases_damaged },
personnelCasualties: { killed: row.personnel_killed, wounded: row.personnel_wounded },
civilianCasualties: { killed: row.civilian_killed ?? 0, wounded: row.civilian_wounded ?? 0 },
aircraft: row.aircraft,
warships: row.warships,
armor: row.armor,
vehicles: row.vehicles,
drones: row.drones ?? 0,
missiles: row.missiles ?? 0,
helicopters: row.helicopters ?? 0,
submarines: row.submarines ?? 0,
}
}
const defaultLosses = {
bases: { destroyed: 0, damaged: 0 },
personnelCasualties: { killed: 0, wounded: 0 },
civilianCasualties: { killed: 0, wounded: 0 },
aircraft: 0,
warships: 0,
armor: 0,
vehicles: 0,
drones: 0,
missiles: 0,
helicopters: 0,
submarines: 0,
}
function getSituation() {
const summaryUs = db.prepare('SELECT * FROM force_summary WHERE side = ?').get('us')
const summaryIr = db.prepare('SELECT * FROM force_summary WHERE side = ?').get('iran')
const powerUs = db.prepare('SELECT * FROM power_index WHERE side = ?').get('us')
const powerIr = db.prepare('SELECT * FROM power_index WHERE side = ?').get('iran')
const assetsUs = db.prepare('SELECT * FROM force_asset WHERE side = ? ORDER BY id').all('us')
const assetsIr = db.prepare('SELECT * FROM force_asset WHERE side = ? ORDER BY id').all('iran')
const locUs = db.prepare('SELECT id, name, lat, lng, type, region, status, damage_level FROM key_location WHERE side = ?').all('us')
const locIr = db.prepare('SELECT id, name, lat, lng, type, region, status, damage_level FROM key_location WHERE side = ?').all('iran')
const lossesUs = db.prepare('SELECT * FROM combat_losses WHERE side = ?').get('us')
const lossesIr = db.prepare('SELECT * FROM combat_losses WHERE side = ?').get('iran')
const trend = db.prepare('SELECT time, value FROM wall_street_trend ORDER BY time').all()
const retaliationCur = db.prepare('SELECT value FROM retaliation_current WHERE id = 1').get()
const retaliationHist = db.prepare('SELECT time, value FROM retaliation_history ORDER BY time').all()
const updates = db.prepare('SELECT * FROM situation_update ORDER BY timestamp DESC LIMIT 50').all()
const meta = db.prepare('SELECT updated_at FROM situation WHERE id = 1').get()
let conflictEvents = []
let conflictStats = { total_events: 0, high_impact_events: 0, estimated_casualties: 0, estimated_strike_count: 0 }
try {
conflictEvents = db.prepare('SELECT event_id, event_time, title, lat, lng, impact_score, url FROM gdelt_events ORDER BY event_time DESC LIMIT 30').all()
const statsRow = db.prepare('SELECT total_events, high_impact_events, estimated_casualties, estimated_strike_count FROM conflict_stats WHERE id = 1').get()
if (statsRow) conflictStats = statsRow
} catch (_) {}
// 平民伤亡:合计显示,不区分阵营
const civUsK = lossesUs?.civilian_killed ?? 0
const civUsW = lossesUs?.civilian_wounded ?? 0
const civIrK = lossesIr?.civilian_killed ?? 0
const civIrW = lossesIr?.civilian_wounded ?? 0
const dbKilled = civUsK + civIrK
const dbWounded = civUsW + civIrW
const est = conflictStats.estimated_casualties || 0
const civilianCasualtiesTotal = {
killed: est > 0 ? Math.max(dbKilled, est) : dbKilled,
wounded: dbWounded,
}
const usLossesBase = lossesUs ? toLosses(lossesUs) : defaultLosses
const irLossesBase = lossesIr ? toLosses(lossesIr) : defaultLosses
const usLosses = { ...usLossesBase, civilianCasualties: { killed: 0, wounded: 0 } }
const irLosses = { ...irLossesBase, civilianCasualties: { killed: 0, wounded: 0 } }
return {
lastUpdated: meta?.updated_at || new Date().toISOString(),
usForces: {
summary: {
totalAssets: summaryUs?.total_assets ?? 0,
personnel: summaryUs?.personnel ?? 0,
navalShips: summaryUs?.naval_ships ?? 0,
aircraft: summaryUs?.aircraft ?? 0,
groundUnits: summaryUs?.ground_units ?? 0,
uav: summaryUs?.uav ?? 0,
missileConsumed: summaryUs?.missile_consumed ?? 0,
missileStock: summaryUs?.missile_stock ?? 0,
},
powerIndex: {
overall: powerUs?.overall ?? 0,
militaryStrength: powerUs?.military_strength ?? 0,
economicPower: powerUs?.economic_power ?? 0,
geopoliticalInfluence: powerUs?.geopolitical_influence ?? 0,
},
assets: (assetsUs || []).map(toAsset),
keyLocations: locUs || [],
combatLosses: usLosses,
wallStreetInvestmentTrend: trend || [],
},
iranForces: {
summary: {
totalAssets: summaryIr?.total_assets ?? 0,
personnel: summaryIr?.personnel ?? 0,
navalShips: summaryIr?.naval_ships ?? 0,
aircraft: summaryIr?.aircraft ?? 0,
groundUnits: summaryIr?.ground_units ?? 0,
uav: summaryIr?.uav ?? 0,
missileConsumed: summaryIr?.missile_consumed ?? 0,
missileStock: summaryIr?.missile_stock ?? 0,
},
powerIndex: {
overall: powerIr?.overall ?? 0,
militaryStrength: powerIr?.military_strength ?? 0,
economicPower: powerIr?.economic_power ?? 0,
geopoliticalInfluence: powerIr?.geopolitical_influence ?? 0,
},
assets: (assetsIr || []).map(toAsset),
keyLocations: locIr || [],
combatLosses: irLosses,
retaliationSentiment: retaliationCur?.value ?? 0,
retaliationSentimentHistory: retaliationHist || [],
},
recentUpdates: (updates || []).map((u) => ({
id: u.id,
timestamp: u.timestamp,
category: u.category,
summary: u.summary,
severity: u.severity,
})),
conflictEvents: conflictEvents.map((e) => ({
event_id: e.event_id,
event_time: e.event_time,
title: e.title,
lat: e.lat,
lng: e.lng,
impact_score: e.impact_score,
url: e.url,
})),
conflictStats,
civilianCasualtiesTotal,
}
}
module.exports = { getSituation }