turash/bugulma/backend/internal/domain/resource_flow.go

305 lines
15 KiB
Go

package domain
import (
"context"
"time"
"gorm.io/datatypes"
)
type ResourceDirection string
type ResourceType string
type PrecisionLevel string
type SourceType string
type PhysicalState string
type SupplyPattern string
type TemporalUnit string
const (
DirectionInput ResourceDirection = "input"
DirectionOutput ResourceDirection = "output"
TypeHeat ResourceType = "heat"
TypeWater ResourceType = "water"
TypeSteam ResourceType = "steam"
TypeCO2 ResourceType = "CO2"
TypeBiowaste ResourceType = "biowaste"
TypeCooling ResourceType = "cooling"
TypeLogistics ResourceType = "logistics"
TypeMaterials ResourceType = "materials"
TypeService ResourceType = "service"
PrecisionRough PrecisionLevel = "rough"
PrecisionEstimated PrecisionLevel = "estimated"
PrecisionMeasured PrecisionLevel = "measured"
SourceDeclared SourceType = "declared"
SourceDevice SourceType = "device"
SourceCalculated SourceType = "calculated"
StateSolid PhysicalState = "solid"
StateLiquid PhysicalState = "liquid"
StateGas PhysicalState = "gas"
PatternContinuous SupplyPattern = "continuous"
PatternBatch SupplyPattern = "batch"
PatternSeasonal SupplyPattern = "seasonal"
PatternOnDemand SupplyPattern = "on_demand"
PatternIrregular SupplyPattern = "irregular"
UnitPerSecond TemporalUnit = "per_second"
UnitPerMinute TemporalUnit = "per_minute"
UnitPerHour TemporalUnit = "per_hour"
UnitPerDay TemporalUnit = "per_day"
UnitPerWeek TemporalUnit = "per_week"
UnitPerMonth TemporalUnit = "per_month"
UnitPerYear TemporalUnit = "per_year"
UnitContinuous TemporalUnit = "continuous"
)
// VolumePricingTier represents pricing tiers based on volume
type VolumePricingTier struct {
MinVolume float64 `json:"min_volume"` // Minimum volume for this tier
MaxVolume *float64 `json:"max_volume,omitempty"` // Maximum volume for this tier (nil for unlimited)
PricePerUnit float64 `json:"price_per_unit"` // €/unit for this tier
DiscountPct float64 `json:"discount_pct"` // % discount from base price
}
// ReliabilityEntry represents historical reliability data
type ReliabilityEntry struct {
Date time.Time `json:"date"` // Date of the entry
UptimePct float64 `json:"uptime_pct"` // % uptime for that period
OutagesCount int `json:"outages_count"` // Number of outages
TotalDowntime float64 `json:"total_downtime"` // Hours of total downtime
}
// EnvironmentalImpact represents environmental impact parameters
type EnvironmentalImpact struct {
CarbonFootprintKgCo2Eq float64 `json:"carbon_footprint_kg_co2_eq,omitempty"` // kg CO2 equivalent per unit
WaterUsageLiters float64 `json:"water_usage_liters,omitempty"` // Liters per unit
EnergyConsumptionKwh float64 `json:"energy_consumption_kwh,omitempty"` // kWh per unit
WasteGenerationKg float64 `json:"waste_generation_kg,omitempty"` // kg waste per unit
EmissionsByType map[string]float64 `json:"emissions_by_type,omitempty"` // Emissions by pollutant type
RenewableEnergyPct *float64 `json:"renewable_energy_pct,omitempty"` // % from renewable sources
CircularityScore *float64 `json:"circularity_score,omitempty"` // 0-1 circularity rating
}
// PerformanceMetrics represents performance and reliability metrics
type PerformanceMetrics struct {
AverageEfficiencyPct *float64 `json:"average_efficiency_pct,omitempty"` // % efficiency rating
PeakPerformanceValue *float64 `json:"peak_performance_value,omitempty"` // Peak performance value
DegradationRatePctYear *float64 `json:"degradation_rate_pct_year,omitempty"` // % degradation per year
MaintenanceIntervalDays *int `json:"maintenance_interval_days,omitempty"` // Days between maintenance
ExpectedLifespanYears *float64 `json:"expected_lifespan_years,omitempty"` // Expected operational life
ReliabilityScore *float64 `json:"reliability_score,omitempty"` // 0-1 reliability rating
LastPerformanceTestAt *time.Time `json:"last_performance_test_at,omitempty"` // Last performance test
}
// Quality represents comprehensive quality parameters of a resource flow
type Quality struct {
// Basic quality parameters
TemperatureCelsius *float64 `json:"temperature_celsius,omitempty"`
PressureBar *float64 `json:"pressure_bar,omitempty"`
PurityPct *float64 `json:"purity_pct,omitempty"`
Grade string `json:"grade,omitempty"`
Hazardousness bool `json:"hazardousness"`
Composition string `json:"composition,omitempty"`
PhysicalState PhysicalState `json:"physical_state,omitempty"`
// Advanced quality parameters
ViscosityCp *float64 `json:"viscosity_cp,omitempty"` // cP for liquids
ConductivityMsCm *float64 `json:"conductivity_ms_cm,omitempty"` // mS/cm for liquids
PhLevel *float64 `json:"ph_level,omitempty"` // pH for liquids
DensityKgM3 *float64 `json:"density_kg_m3,omitempty"` // kg/m³
ParticleSizeMicron *float64 `json:"particle_size_micron,omitempty"` // microns
// Energy content parameters
BtuContentMjKg *float64 `json:"btu_content_mj_kg,omitempty"` // MJ/kg for biomass
MoisturePct *float64 `json:"moisture_pct,omitempty"` // % moisture content
AshContentPct *float64 `json:"ash_content_pct,omitempty"` // % ash content
// Gas quality parameters
OxygenPct *float64 `json:"oxygen_pct,omitempty"` // % O2 content
CarbonDioxidePct *float64 `json:"carbon_dioxide_pct,omitempty"` // % CO2 content
MethanePct *float64 `json:"methane_pct,omitempty"` // % CH4 content
// Certifications and standards
Certifications []string `json:"certifications,omitempty"` // ISO, HACCP, etc.
StandardsCompliance []string `json:"standards_compliance,omitempty"` // Food-grade, industrial, etc.
// Quality metrics
QualityScore *float64 `json:"quality_score,omitempty"` // 0-100 quality rating
LastTestedAt *time.Time `json:"last_tested_at,omitempty"` // Last quality test date
TestFrequencyDays *int `json:"test_frequency_days,omitempty"` // How often tested
}
// Quantity represents quantity parameters of a resource flow
type Quantity struct {
Amount float64 `json:"amount"`
Unit string `json:"unit"`
TemporalUnit TemporalUnit `json:"temporal_unit,omitempty"`
Variability float64 `json:"variability,omitempty"` // 0-1 coefficient of variation
}
// EconomicData represents comprehensive economic parameters
type EconomicData struct {
// Basic pricing
CostIn float64 `json:"cost_in,omitempty"` // €/unit for inputs
CostOut float64 `json:"cost_out,omitempty"` // €/unit for outputs
WasteDisposalCost float64 `json:"waste_disposal_cost,omitempty"` // €/unit
PrimaryInputCost float64 `json:"primary_input_cost,omitempty"` // €/unit
TransportationCost float64 `json:"transportation_cost,omitempty"` // €/km
CostSharingFraction float64 `json:"cost_sharing_fraction,omitempty"` // 0-1
// Advanced cost structure
AmortizationCost float64 `json:"amortization_cost,omitempty"` // €/unit/year
MaintenanceCost float64 `json:"maintenance_cost,omitempty"` // €/unit/year
InsuranceCost float64 `json:"insurance_cost,omitempty"` // €/unit/year
OpportunityCost float64 `json:"opportunity_cost,omitempty"` // €/unit (alternative use value)
// Volume-based pricing
MinimumOrderQuantity *float64 `json:"minimum_order_quantity,omitempty"` // Minimum order size
BulkDiscountPct *float64 `json:"bulk_discount_pct,omitempty"` // % discount for large orders
VolumePricingTiers []VolumePricingTier `json:"volume_pricing_tiers,omitempty"`
// Supply chain costs
LeadTimeDays *int `json:"lead_time_days,omitempty"` // Days to deliver
SupplierReliability *float64 `json:"supplier_reliability,omitempty"` // 0-1 reliability score
StorageCost float64 `json:"storage_cost,omitempty"` // €/unit/day storage cost
// Environmental costs/benefits
CarbonCreditValue float64 `json:"carbon_credit_value,omitempty"` // €/tonne CO2 equivalent
EnvironmentalTax float64 `json:"environmental_tax,omitempty"` // €/unit environmental tax
}
// Constraints represents comprehensive constraints and requirements
type Constraints struct {
// Geographic constraints
MaxDistanceKm float64 `json:"max_distance_km,omitempty"`
PreferredRegions []string `json:"preferred_regions,omitempty"` // Geographic preferences
// Regulatory constraints
RequiresPermit bool `json:"requires_permit"`
PermitType string `json:"permit_type,omitempty"` // Type of permit required
RegulatoryCompliance bool `json:"regulatory_compliance"`
ComplianceCertifications []string `json:"compliance_certifications,omitempty"` // Required certifications
// Quality constraints
MinQualityThreshold string `json:"min_quality_threshold,omitempty"`
MaxContaminantPct *float64 `json:"max_contaminant_pct,omitempty"` // Maximum allowed contaminants
RequiredCertifications []string `json:"required_certifications,omitempty"` // ISO, HACCP, etc.
// Operational constraints
MaxDowntimeHours *int `json:"max_downtime_hours,omitempty"` // Maximum allowed downtime
MaintenanceWindows []string `json:"maintenance_windows,omitempty"` // Preferred maintenance periods
ReliabilityRequirement *float64 `json:"reliability_requirement,omitempty"` // Required uptime %
// Environmental constraints
MaxEmissionLimits map[string]float64 `json:"max_emission_limits,omitempty"` // Emission limits by type
WaterUsageLimits *float64 `json:"water_usage_limits,omitempty"` // m³/unit max water usage
WasteLimits map[string]float64 `json:"waste_limits,omitempty"` // Waste limits by type
}
// TimeRange represents a time range in HH:MM format
type TimeRange struct {
Start string `json:"start"` // HH:MM format
End string `json:"end"` // HH:MM format
}
// TimeProfile represents comprehensive temporal characteristics
type TimeProfile struct {
// Basic availability
Availability map[string]TimeRange `json:"availability,omitempty"` // day of week -> time range
Seasonality []string `json:"seasonality,omitempty"` // months when available
SupplyPattern SupplyPattern `json:"supply_pattern,omitempty"` // continuous, batch, seasonal, on_demand, irregular
// Advanced temporal parameters
PredictabilityScore *float64 `json:"predictability_score,omitempty"` // 0-1 how predictable the supply is
PeakDemandMonths []string `json:"peak_demand_months,omitempty"` // Months with highest demand
LowDemandMonths []string `json:"low_demand_months,omitempty"` // Months with lowest demand
LeadTimeDays *int `json:"lead_time_days,omitempty"` // Days notice required
MinimumNoticeHours *int `json:"minimum_notice_hours,omitempty"` // Minimum notice for changes
// Supply reliability
UptimePct *float64 `json:"uptime_pct,omitempty"` // % uptime historically
ReliabilityHistory []ReliabilityEntry `json:"reliability_history,omitempty"` // Historical reliability data
LastOutageAt *time.Time `json:"last_outage_at,omitempty"` // Last outage timestamp
AverageOutageDuration *float64 `json:"average_outage_duration,omitempty"` // Hours average outage duration
}
// ServiceDetails represents additional details for service-type resource flows
type ServiceDetails struct {
Domain string `json:"domain,omitempty"` // maintenance, consulting, transport, inspection
Mobility string `json:"mobility,omitempty"` // on_site, remote
CapacityHrsMonth float64 `json:"capacity_h_per_month,omitempty"` // hours per month
ServiceAreaKm float64 `json:"service_area_km,omitempty"` // service radius
}
// ResourceFlow represents resource inputs, outputs, and services at specific sites
type ResourceFlow struct {
ID string `gorm:"primaryKey;type:text"`
OrganizationID string `gorm:"type:text;not null;index:idx_rf_organization_site"`
SiteID string `gorm:"type:text;not null;index:idx_rf_organization_site"`
Direction ResourceDirection `gorm:"type:varchar(10);not null;index:idx_rf_type_direction"`
Type ResourceType `gorm:"type:varchar(50);not null;index:idx_rf_type_direction"`
// Quality parameters (stored as JSONB)
Quality datatypes.JSON `gorm:"type:jsonb"` // Quality
// Quantity parameters (stored as JSONB)
Quantity datatypes.JSON `gorm:"type:jsonb;not null"` // Quantity
// Time profile (stored as JSONB)
TimeProfile datatypes.JSON `gorm:"type:jsonb"` // TimeProfile
// Economic data (stored as JSONB)
EconomicData datatypes.JSON `gorm:"type:jsonb"` // EconomicData
// Constraints (stored as JSONB)
Constraints datatypes.JSON `gorm:"type:jsonb"` // Constraints
// Service details (stored as JSONB, for service-type flows)
ServiceDetails datatypes.JSON `gorm:"type:jsonb"` // ServiceDetails
// Environmental impact (stored as JSONB)
EnvironmentalImpact datatypes.JSON `gorm:"type:jsonb"` // EnvironmentalImpact
// Performance metrics (stored as JSONB)
PerformanceMetrics datatypes.JSON `gorm:"type:jsonb"` // PerformanceMetrics
// Data quality and source
PrecisionLevel PrecisionLevel `gorm:"type:varchar(20);default:'estimated';index"`
SourceType SourceType `gorm:"type:varchar(50);default:'declared'"`
DeviceSignature string `gorm:"type:varchar(255)"` // Cryptographic signature for verified device data
// Metadata
DataCompletenessScore float64 `gorm:"type:decimal(3,2);default:0.5"` // 0-1 how complete the data is
LastValidatedAt *time.Time `gorm:"index"` // Last time data was validated
// Timestamps
CreatedAt time.Time `gorm:"autoCreateTime;index"`
UpdatedAt time.Time `gorm:"autoUpdateTime;index"`
// Associations
Organization *Organization `gorm:"foreignKey:OrganizationID"`
Site *Site `gorm:"foreignKey:SiteID"`
}
// TableName specifies the table name for GORM
func (ResourceFlow) TableName() string {
return "resource_flows"
}
type ResourceFlowRepository interface {
Create(ctx context.Context, rf *ResourceFlow) error
GetByID(ctx context.Context, id string) (*ResourceFlow, error)
GetAll(ctx context.Context) ([]*ResourceFlow, error)
GetBySiteID(ctx context.Context, siteID string) ([]*ResourceFlow, error)
GetByOrganizationID(ctx context.Context, organizationID string) ([]*ResourceFlow, error)
GetByTypeAndDirection(ctx context.Context, resType ResourceType, direction ResourceDirection) ([]*ResourceFlow, error)
GetOutputsInRadius(ctx context.Context, lat, lng, radiusKm float64, resType ResourceType) ([]*ResourceFlow, error)
GetInputsInRadius(ctx context.Context, lat, lng, radiusKm float64, resType ResourceType) ([]*ResourceFlow, error)
Update(ctx context.Context, rf *ResourceFlow) error
Delete(ctx context.Context, id string) error
}