#pragma once
|
|
#include <chrono>
|
#include <map>
|
#include <string>
|
|
class CConfiguration;
|
|
enum class ProductionShiftType : int {
|
Day = 1,
|
Night = 2
|
};
|
|
struct ProductionShiftWindow {
|
ProductionShiftType type{ ProductionShiftType::Day };
|
std::chrono::system_clock::time_point start{};
|
std::chrono::system_clock::time_point end{};
|
std::string startLocal; // "YYYY-MM-DD HH:MM:SS"
|
std::string endLocal; // "YYYY-MM-DD HH:MM:SS"
|
std::string startUtcIso; // "YYYY-MM-DDTHH:MM:SSZ"
|
std::string endUtcIso; // "YYYY-MM-DDTHH:MM:SSZ"
|
};
|
|
struct ProductionOutputSummary {
|
long long pairsTotal = 0; // "对数"
|
long long pairsPass = 0;
|
long long pairsFail = 0;
|
long long pairsNoResult = 0;
|
double yield = 0.0; // pairsPass / (pairsPass + pairsFail), 0 if denom==0
|
};
|
|
struct ProductionAlarmSummary {
|
int alarmsTriggered = 0; // start_time within shift window
|
int alarmsOverlapping = 0; // overlaps shift window (including active)
|
double downtimeMinutes = 0.0; // overlap minutes (best-effort)
|
std::map<int, int> bySeverity; // severity_level -> count (overlapping)
|
};
|
|
struct ProductionTransferSummary {
|
int transfersFinished = 0; // end_time within shift window
|
std::map<std::string, int> byStatus;
|
double avgCreateToEndSeconds = 0.0;
|
};
|
|
struct ProductionShiftSummary {
|
ProductionShiftWindow window;
|
ProductionOutputSummary output;
|
ProductionAlarmSummary alarms;
|
ProductionTransferSummary transfers;
|
};
|
|
class ProductionStats {
|
public:
|
static bool GetCurrentShiftWindow(CConfiguration& config, ProductionShiftWindow& outWindow);
|
static bool ComputeCurrentShiftSummary(CConfiguration& config, ProductionShiftSummary& outSummary);
|
static void LogCurrentShiftSummary(CConfiguration& config);
|
};
|