diff --git a/apps/herd/services/rancher_dashboard_service.py b/apps/herd/services/rancher_dashboard_service.py index 6991c6c..8871278 100644 --- a/apps/herd/services/rancher_dashboard_service.py +++ b/apps/herd/services/rancher_dashboard_service.py @@ -2,6 +2,7 @@ from django.db.models import Sum, Count, Q from django.db.models.functions import Coalesce from apps.herd.models import Rancher, Herd +from apps.warehouse.models import InventoryQuotaSaleItem class RancherDashboardService: @@ -28,9 +29,9 @@ class RancherDashboardService: total_without_herd=Coalesce(Count("id", filter=Q(without_herd=True)), 0), total_natural_ranchers=Coalesce(Count("id", filter=Q(rancher_type='N')), 0), total_legal_ranchers=Coalesce(Count("id", filter=Q(rancher_type='L')), 0), - total_industrial_ranchers=Coalesce(Count("id", filter=Q(rancher_type='I')), 0), - total_village_ranchers=Coalesce(Count("id", filter=Q(rancher_type='V')), 0), - total_nomadic_ranchers=Coalesce(Count("id", filter=Q(rancher_type='N')), 0), + total_industrial_ranchers=Coalesce(Count("id", filter=Q(activity='I')), 0), + total_village_ranchers=Coalesce(Count("id", filter=Q(activity='V')), 0), + total_nomadic_ranchers=Coalesce(Count("id", filter=Q(activity='N')), 0), ) herds_data = herds.aggregate( @@ -43,3 +44,43 @@ class RancherDashboardService: ) return {"rancher_dashboard": ranchers_data, "herd_dashboard": herds_data} + + @staticmethod + def get_rancher_dashboard(self, rancher: Rancher): + """ + get rancher dashboard + """ + + rancher_data = rancher.herd.aggregate( + total_herds_count=Coalesce(Count("id"), 0), + total_heavy_livestock_count=Coalesce(Sum("heavy_livestock_number"), 0), + total_light_livestock_count=Coalesce(Sum("light_livestock_number"), 0), + ) + + transaction_sale_items = InventoryQuotaSaleItem.objects.select_related( + 'transaction', 'quota_stat' + ).filter( + transaction__rancher=rancher, + # transaction__transaction_status='success', + ).aggregate( + total_purchased_weight=Coalesce(Sum('weight'), 0), + ) + + rancher_data.update(transaction_sale_items) + + return rancher_data + + @staticmethod + def rancher_dashboard_by_quota_usage(self, rancher: Rancher): + """ + get rancher dashboard by quota usage + """ + + transaction_sale_items = InventoryQuotaSaleItem.objects.select_related( + 'transaction', 'quota_stat' + ).filter( + transaction__rancher=rancher, + transaction__transaction_status='success', + ) + + return diff --git a/apps/herd/web/api/v1/api.py b/apps/herd/web/api/v1/api.py index b18bb2f..a7dcf14 100644 --- a/apps/herd/web/api/v1/api.py +++ b/apps/herd/web/api/v1/api.py @@ -195,3 +195,25 @@ class RancherViewSet(BaseViewSet, RancherDashboardService, SoftDeleteMixin, view query_string=query_string, ) return Response(rancher_dashboard_data) + + @action( + methods=['get'], + detail=True, + url_path='rancher_dashboard', + url_name='rancher_dashboard', + name='rancher_dashboard' + ) + def rancher_dashboard(self, request, pk=None): + """ rancher dashboard """ + + rancher = self.get_object() + + query_param = self.request.query_params # noqa + + query_string = query_param.get('search', None) + + rancher_dashboard_data = self.get_rancher_dashboard( + self, + rancher=rancher + ) + return Response(rancher_dashboard_data)