202 lines
8.0 KiB
Python
202 lines
8.0 KiB
Python
from django.db import models
|
|
|
|
from apps.farms.models import Cycle, Flock
|
|
|
|
|
|
class IotPanel(models.Model):
|
|
panel_id = models.BigAutoField(primary_key=True)
|
|
date = models.DateField()
|
|
timestamp = models.DateTimeField(null=True, blank=True)
|
|
wind_speed = models.FloatField(default=0.0)
|
|
humidity = models.FloatField(default=0.0)
|
|
water_total = models.FloatField(default=0.0)
|
|
average_temperature = models.FloatField(default=0.0)
|
|
experience_temperature = models.FloatField(default=0.0)
|
|
flock = models.ForeignKey(Flock, on_delete=models.CASCADE, related_name="iot_panels")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "iot_panel"
|
|
ordering = ["-date"]
|
|
verbose_name = "IoT Panel"
|
|
verbose_name_plural = "IoT Panels"
|
|
constraints = [
|
|
models.UniqueConstraint(fields=["flock", "timestamp"], name="uniq_iot_panel_flock_timestamp")
|
|
]
|
|
|
|
|
|
class AIInsight(models.Model):
|
|
SOURCE_GENERATED = "generated"
|
|
SOURCE_CACHE = "cache"
|
|
SOURCE_LOCAL_FALLBACK = "local_fallback"
|
|
SOURCE_CHOICES = [
|
|
(SOURCE_GENERATED, "Generated"),
|
|
(SOURCE_CACHE, "Cache"),
|
|
(SOURCE_LOCAL_FALLBACK, "Local fallback"),
|
|
]
|
|
|
|
date = models.DateField()
|
|
insight_text = models.TextField()
|
|
alert = models.CharField(max_length=100, blank=True, default="")
|
|
cycle = models.ForeignKey(Cycle, on_delete=models.CASCADE, related_name="ai_insights")
|
|
kandang = models.ForeignKey(
|
|
"farms.Kandang",
|
|
on_delete=models.CASCADE,
|
|
related_name="ai_insights",
|
|
null=True,
|
|
blank=True,
|
|
)
|
|
topic = models.CharField(max_length=64, blank=True, default="", db_index=True)
|
|
report_type = models.CharField(max_length=32, blank=True, default="page", db_index=True)
|
|
report_period = models.CharField(max_length=64, blank=True, default="current", db_index=True)
|
|
source = models.CharField(
|
|
max_length=32,
|
|
choices=SOURCE_CHOICES,
|
|
default=SOURCE_GENERATED,
|
|
blank=True,
|
|
)
|
|
summary = models.TextField(blank=True, default="")
|
|
citations = models.TextField(blank=True, default="[]")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "ai_insight"
|
|
ordering = ["-date", "-created_at"]
|
|
constraints = [
|
|
models.UniqueConstraint(
|
|
fields=["cycle", "kandang", "topic", "report_type", "report_period"],
|
|
name="uniq_ai_insight_cache_scope",
|
|
)
|
|
]
|
|
|
|
|
|
class FeedSacks(models.Model):
|
|
fs_id = models.BigAutoField(primary_key=True)
|
|
date = models.DateField()
|
|
in_today = models.IntegerField(default=0)
|
|
out_today = models.IntegerField(default=0)
|
|
in_total = models.IntegerField(default=0)
|
|
out_total = models.IntegerField(default=0)
|
|
feed_use_today = models.IntegerField(default=0)
|
|
feed_use_total = models.IntegerField(default=0)
|
|
cycle = models.ForeignKey(Cycle, on_delete=models.CASCADE, related_name="feed_sacks")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "feed_sacks"
|
|
ordering = ["-date"]
|
|
verbose_name_plural = "Feed sacks"
|
|
constraints = [
|
|
models.UniqueConstraint(fields=["cycle", "date"], name="uniq_feed_sacks_cycle_date")
|
|
]
|
|
|
|
|
|
class ChickenCounting(models.Model):
|
|
cc_id = models.BigAutoField(primary_key=True)
|
|
date = models.DateField()
|
|
total_count = models.IntegerField(default=0)
|
|
mortality_count = models.IntegerField(default=0)
|
|
cycle = models.ForeignKey(Cycle, on_delete=models.CASCADE, related_name="chicken_countings")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "chicken_counting"
|
|
ordering = ["-date"]
|
|
constraints = [
|
|
models.UniqueConstraint(fields=["cycle", "date"], name="uniq_chicken_counting_cycle_date")
|
|
]
|
|
|
|
|
|
class ChickenWeight(models.Model):
|
|
cw_id = models.BigAutoField(primary_key=True)
|
|
date = models.DateField()
|
|
age = models.IntegerField()
|
|
doc_weight = models.IntegerField()
|
|
average_weight = models.FloatField()
|
|
chicken_count = models.IntegerField()
|
|
uniformity = models.FloatField()
|
|
average_daily_gain = models.FloatField()
|
|
cycle = models.ForeignKey(Cycle, on_delete=models.CASCADE, related_name="chicken_weights")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "chicken_weight"
|
|
ordering = ["-date"]
|
|
constraints = [
|
|
models.UniqueConstraint(fields=["cycle", "date"], name="uniq_cw_cycle_date")
|
|
]
|
|
|
|
|
|
class ManualInput(models.Model):
|
|
manual_id = models.BigAutoField(primary_key=True)
|
|
date = models.DateField()
|
|
age_manual = models.IntegerField(default=0)
|
|
mortality_manual = models.IntegerField(default=0)
|
|
mortality_manual_total = models.IntegerField(default=0)
|
|
feed_in_manual = models.IntegerField(default=0)
|
|
feed_use_manual = models.IntegerField(default=0)
|
|
feed_in_manual_total = models.IntegerField(default=0)
|
|
feed_use_manual_total = models.IntegerField(default=0)
|
|
feed_out_manual = models.IntegerField(default=0)
|
|
feed_out_manual_total = models.IntegerField(default=0)
|
|
harvest_manual = models.IntegerField(default=0)
|
|
harvest_manual_total = models.IntegerField(default=0)
|
|
harvest_weight_manual = models.FloatField(default=0.0)
|
|
harvest_weight_manual_total = models.FloatField(default=0.0)
|
|
manual_weight = models.FloatField(default=0.0)
|
|
average_harvest_day_manual = models.FloatField(default=0.0)
|
|
average_harvest_weight_manual = models.FloatField(default=0.0)
|
|
fcr_manual = models.FloatField(default=0.0)
|
|
eef_manual = models.FloatField(default=0.0)
|
|
cycle = models.ForeignKey(Cycle, on_delete=models.CASCADE, related_name="manual_inputs")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "manual_input"
|
|
ordering = ["-date"]
|
|
constraints = [
|
|
models.UniqueConstraint(fields=["cycle", "date"], name="uniq_manual_input_cycle_date")
|
|
]
|
|
|
|
|
|
class KPI(models.Model):
|
|
kpi_id = models.BigAutoField(primary_key=True)
|
|
date = models.DateField()
|
|
age = models.IntegerField(default=0)
|
|
mortality = models.IntegerField(default=0)
|
|
mortality_total = models.IntegerField(default=0)
|
|
feed = models.IntegerField(default=0)
|
|
feed_total = models.IntegerField(default=0)
|
|
harvest = models.IntegerField(default=0)
|
|
harvest_total = models.IntegerField(default=0)
|
|
harvest_weight = models.FloatField(default=0.0)
|
|
harvest_weight_total = models.FloatField(default=0.0)
|
|
chicken_life = models.IntegerField(default=0)
|
|
chicken_life_percentage = models.FloatField(default=0.0)
|
|
iot_weight = models.FloatField(default=0.0)
|
|
average_harvest_day = models.FloatField(default=0.0)
|
|
average_harvest_weight = models.FloatField(default=0.0)
|
|
fcr = models.FloatField(default=0.0)
|
|
eef = models.FloatField(default=0.0)
|
|
cycle = models.ForeignKey(Cycle, on_delete=models.CASCADE, related_name="kpis")
|
|
cc = models.ForeignKey(ChickenCounting, on_delete=models.RESTRICT, related_name="kpis")
|
|
cw = models.ForeignKey(ChickenWeight, on_delete=models.RESTRICT, related_name="kpis")
|
|
fs = models.ForeignKey(FeedSacks, on_delete=models.RESTRICT, related_name="kpis")
|
|
manual = models.ForeignKey(ManualInput, on_delete=models.RESTRICT, related_name="kpis")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "kpi"
|
|
ordering = ["-date"]
|
|
verbose_name_plural = "KPIs"
|
|
constraints = [
|
|
models.UniqueConstraint(fields=["cycle", "date"], name="uniq_kpi_cycle_date")
|
|
]
|