from django.db import models from django.utils import timezone from django.core.cache import cache class LocationStatistics(models.Model): """货位统计模型""" warehouse_code = models.CharField(max_length=255, verbose_name="仓库代码") warehouse_name = models.CharField(max_length=255, verbose_name="仓库名称") layer = models.IntegerField(verbose_name="楼层") # 按货位类型统计 t5_total = models.IntegerField(default=0, verbose_name="5货位总数") t5_used = models.IntegerField(default=0, verbose_name="5货位已用") t5_available = models.IntegerField(default=0, verbose_name="5货位可用") t4_total = models.IntegerField(default=0, verbose_name="4货位总数") t4_used = models.IntegerField(default=0, verbose_name="4货位已用") t4_available = models.IntegerField(default=0, verbose_name="4货位可用") s4_total = models.IntegerField(default=0, verbose_name="4单货位总数") s4_used = models.IntegerField(default=0, verbose_name="4单货位已用") s4_available = models.IntegerField(default=0, verbose_name="4单货位可用") t2_total = models.IntegerField(default=0, verbose_name="2货位总数") t2_used = models.IntegerField(default=0, verbose_name="2货位已用") t2_available = models.IntegerField(default=0, verbose_name="2货位可用") t1_total = models.IntegerField(default=0, verbose_name="散货位总数") t1_used = models.IntegerField(default=0, verbose_name="散货位已用") t1_available = models.IntegerField(default=0, verbose_name="散货位可用") # 汇总统计 total_locations = models.IntegerField(default=0, verbose_name="总货位数") total_used = models.IntegerField(default=0, verbose_name="总已用数") total_available = models.IntegerField(default=0, verbose_name="总可用数") utilization_rate = models.DecimalField(max_digits=5, decimal_places=2, default=0, verbose_name="使用率(%)") # 统计时间 statistic_time = models.DateTimeField(default=timezone.now, verbose_name="统计时间") is_latest = models.BooleanField(default=False, verbose_name="是否最新统计") class Meta: db_table = 'location_statistics' verbose_name = '货位统计' verbose_name_plural = "货位统计" ordering = ['-statistic_time', 'warehouse_code', 'layer'] unique_together = ['warehouse_code', 'layer', 'statistic_time'] def __str__(self): return f"{self.warehouse_name}-{self.layer}层-{self.statistic_time.strftime('%Y-%m-%d %H:%M')}" class LocationGroupStatistics(models.Model): """货位组统计模型""" warehouse_code = models.CharField(max_length=255, verbose_name="仓库代码") warehouse_name = models.CharField(max_length=255, verbose_name="仓库名称") layer = models.IntegerField(verbose_name="楼层") location_group = models.CharField(max_length=20, verbose_name="库位组") # 统计信息 total_locations = models.IntegerField(default=0, verbose_name="组内总货位数") used_locations = models.IntegerField(default=0, verbose_name="组内已用货位数") available_locations = models.IntegerField(default=0, verbose_name="组内可用货位数") utilization_rate = models.DecimalField(max_digits=5, decimal_places=2, default=0, verbose_name="使用率(%)") # 按货位类型细分 location_type_breakdown = models.JSONField(default=dict, verbose_name="货位类型细分") statistic_time = models.DateTimeField(default=timezone.now, verbose_name="统计时间") class Meta: db_table = 'location_group_statistics' verbose_name = '货位组统计' verbose_name_plural = "货位组统计" ordering = ['warehouse_code', 'layer', 'total_locations'] def __str__(self): return f"{self.warehouse_name}-{self.layer}层-{self.location_group}"