serializers.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from rest_framework import serializers
  2. from .models import LocationStatistics, LocationGroupStatistics
  3. class LocationStatisticsSerializer(serializers.ModelSerializer):
  4. """货位统计序列化器"""
  5. warehouse_display = serializers.CharField(source='warehouse_name', read_only=True)
  6. layer_display = serializers.SerializerMethodField()
  7. t5_group_count = serializers.SerializerMethodField()
  8. t4_group_count = serializers.SerializerMethodField()
  9. s4_group_count = serializers.SerializerMethodField()
  10. t2_group_count = serializers.SerializerMethodField()
  11. t1_group_count = serializers.SerializerMethodField()
  12. t5_used_group_count = serializers.SerializerMethodField()
  13. t4_used_group_count = serializers.SerializerMethodField()
  14. s4_used_group_count = serializers.SerializerMethodField()
  15. t2_used_group_count = serializers.SerializerMethodField()
  16. t1_used_group_count = serializers.SerializerMethodField()
  17. t5_available_group_count = serializers.SerializerMethodField()
  18. t4_available_group_count = serializers.SerializerMethodField()
  19. s4_available_group_count = serializers.SerializerMethodField()
  20. t2_available_group_count = serializers.SerializerMethodField()
  21. t1_available_group_count = serializers.SerializerMethodField()
  22. class Meta:
  23. model = LocationStatistics
  24. fields = [
  25. 'id', 'warehouse_code', 'warehouse_name', 'warehouse_display', 'layer', 'layer_display',
  26. 't5_total', 't5_used', 't5_available',
  27. 't5_group_count', 't5_used_group_count', 't5_available_group_count',
  28. 't4_total', 't4_used', 't4_available',
  29. 't4_group_count', 't4_used_group_count', 't4_available_group_count',
  30. 's4_total', 's4_used', 's4_available',
  31. 's4_group_count', 's4_used_group_count', 's4_available_group_count',
  32. 't2_total', 't2_used', 't2_available',
  33. 't2_group_count', 't2_used_group_count', 't2_available_group_count',
  34. 't1_total', 't1_used', 't1_available',
  35. 't1_group_count', 't1_used_group_count', 't1_available_group_count',
  36. 'total_locations', 'total_used', 'total_available', 'utilization_rate',
  37. 'statistic_time', 'is_latest'
  38. ]
  39. def get_layer_display(self, obj):
  40. return f"{obj.layer}层"
  41. def get_t5_group_count(self, obj):
  42. return self._get_type_group_count(obj, 'T5')
  43. def get_t5_used_group_count(self, obj):
  44. return self._get_type_group_count(obj, 'T5', 'used')
  45. def get_t5_available_group_count(self, obj):
  46. return self._get_type_group_count(obj, 'T5', 'available')
  47. def get_t4_group_count(self, obj):
  48. return self._get_type_group_count(obj, 'T4')
  49. def get_t4_used_group_count(self, obj):
  50. return self._get_type_group_count(obj, 'T4', 'used')
  51. def get_t4_available_group_count(self, obj):
  52. return self._get_type_group_count(obj, 'T4', 'available')
  53. def get_s4_group_count(self, obj):
  54. return self._get_type_group_count(obj, 'S4')
  55. def get_s4_used_group_count(self, obj):
  56. return self._get_type_group_count(obj, 'S4', 'used')
  57. def get_s4_available_group_count(self, obj):
  58. return self._get_type_group_count(obj, 'S4', 'available')
  59. def get_t2_group_count(self, obj):
  60. return self._get_type_group_count(obj, 'T2')
  61. def get_t2_used_group_count(self, obj):
  62. return self._get_type_group_count(obj, 'T2', 'used')
  63. def get_t2_available_group_count(self, obj):
  64. return self._get_type_group_count(obj, 'T2', 'available')
  65. def get_t1_group_count(self, obj):
  66. return self._get_type_group_count(obj, 'T1')
  67. def get_t1_used_group_count(self, obj):
  68. return self._get_type_group_count(obj, 'T1', 'used')
  69. def get_t1_available_group_count(self, obj):
  70. return self._get_type_group_count(obj, 'T1', 'available')
  71. def _get_group_stats(self, obj):
  72. if not hasattr(self, '_group_stats_cache'):
  73. self._group_stats_cache = {}
  74. key = (obj.warehouse_code, obj.layer, obj.statistic_time)
  75. if key not in self._group_stats_cache:
  76. self._group_stats_cache[key] = list(
  77. LocationGroupStatistics.objects.filter(
  78. warehouse_code=obj.warehouse_code,
  79. layer=obj.layer,
  80. statistic_time=obj.statistic_time
  81. )
  82. )
  83. return self._group_stats_cache[key]
  84. def _get_type_group_count(self, obj, type_code, usage=None):
  85. group_stats = self._get_group_stats(obj)
  86. count = 0
  87. for stat in group_stats:
  88. breakdown = stat.location_type_breakdown or {}
  89. type_info = breakdown.get(type_code, {})
  90. if usage == 'used':
  91. if type_info.get('used', 0) > 0:
  92. count += 1
  93. elif usage == 'available':
  94. if type_info.get('available', 0) > 0:
  95. count += 1
  96. else:
  97. if type_info.get('total', 0) > 0:
  98. count += 1
  99. return count
  100. class LocationGroupStatisticsSerializer(serializers.ModelSerializer):
  101. """货位组统计序列化器"""
  102. warehouse_display = serializers.CharField(source='warehouse_name', read_only=True)
  103. layer_display = serializers.SerializerMethodField()
  104. class Meta:
  105. model = LocationGroupStatistics
  106. fields = [
  107. 'id', 'warehouse_code', 'warehouse_name', 'warehouse_display',
  108. 'layer', 'layer_display', 'location_group',
  109. 'total_locations', 'used_locations', 'available_locations', 'utilization_rate',
  110. 'location_type_breakdown', 'statistic_time'
  111. ]
  112. ordering = ['warehouse_code', 'layer', 'total_locations']
  113. def get_layer_display(self, obj):
  114. return f"{obj.layer}层"