Статистика для дашборда, расширенная #7
This commit is contained in:
+74
-21
@@ -1,29 +1,82 @@
|
||||
-module(logic_stats).
|
||||
-export([get_stats/2]).
|
||||
-export([get_stats/2, get_stats/4]).
|
||||
|
||||
-include("records.hrl").
|
||||
|
||||
%% ========== Точка входа (без дат) =============================
|
||||
-spec get_stats(Role :: atom(), AdminId :: binary()) -> map().
|
||||
get_stats(superadmin, _AdminId) ->
|
||||
get_stats(Role, AdminId) ->
|
||||
{{Y, _, _}, _} = calendar:universal_time(),
|
||||
From = {{Y, 1, 1}, {0, 0, 0}}, % начало текущего года
|
||||
To = calendar:universal_time(),
|
||||
get_stats(Role, AdminId, From, To).
|
||||
|
||||
%% ========== Точка входа (с фильтром по датам) =================
|
||||
-spec get_stats(Role :: atom(), AdminId :: binary(),
|
||||
From :: calendar:datetime(), To :: calendar:datetime()) -> map().
|
||||
get_stats(superadmin, _AdminId, From, To) ->
|
||||
build_superadmin_stats(From, To);
|
||||
get_stats(moderator, AdminId, From, To) ->
|
||||
build_moderator_stats(AdminId, From, To);
|
||||
get_stats(support, AdminId, From, To) ->
|
||||
build_support_stats(AdminId, From, To);
|
||||
get_stats(_, _, _, _) ->
|
||||
#{}.
|
||||
|
||||
%% ========== Суперадмин =========================================
|
||||
build_superadmin_stats(From, To) ->
|
||||
#{
|
||||
users => core_user:count_users(),
|
||||
calendars => core_calendar:count_calendars(),
|
||||
events => core_event:count_events(),
|
||||
bookings => core_booking:count_bookings(),
|
||||
reviews => core_review:count_reviews(),
|
||||
reports_total => core_report:count_reports_by_status(pending),
|
||||
tickets_open => core_ticket:count_tickets_by_status(open),
|
||||
subscriptions => core_subscription:count_subscription()
|
||||
};
|
||||
get_stats(moderator, AdminId) ->
|
||||
users_total => core_user:count_users(),
|
||||
events_total => core_event:count_events(),
|
||||
calendars_total => core_calendar:count_calendars(),
|
||||
reviews_total => core_review:count_reviews(),
|
||||
reports_total => core_report:count_reports_by_status(pending),
|
||||
tickets_open => core_ticket:count_tickets_by_status(open),
|
||||
tickets_total => length(core_ticket:list_all()),
|
||||
avg_ticket_resolution_h => trunc_hours(core_ticket:avg_resolution_time()),
|
||||
registrations_by_day => date_list_to_json(core_user:count_users_by_date(From, To)),
|
||||
events_by_day => date_list_to_json(core_event:count_events_by_date(From, To)),
|
||||
admin_activity => collect_admin_activity()
|
||||
}.
|
||||
|
||||
%% ========== Модератор ==========================================
|
||||
build_moderator_stats(AdminId, _From, _To) ->
|
||||
#{
|
||||
reports_reviewed => core_report:count_reports_by_admin(AdminId, reviewed),
|
||||
events_moderated => 0 % пока заглушка, можно добавить позже
|
||||
};
|
||||
get_stats(support, AdminId) ->
|
||||
reports_reviewed => core_report:count_reports_resolved_by_admin(AdminId, reviewed),
|
||||
reports_dismissed => core_report:count_reports_resolved_by_admin(AdminId, dismissed),
|
||||
avg_report_resolution_h => trunc_hours(core_report:avg_resolution_time(reviewed)),
|
||||
events_moderated => 0 % заглушка, можно доработать
|
||||
}.
|
||||
|
||||
%% ========== Поддержка ==========================================
|
||||
build_support_stats(AdminId, _From, _To) ->
|
||||
#{
|
||||
tickets_assigned => core_ticket:count_tickets_by_admin(AdminId, open),
|
||||
reports_pending => core_report:count_reports_by_status(pending)
|
||||
};
|
||||
get_stats(_, _) ->
|
||||
#{}.
|
||||
tickets_assigned_open => core_ticket:count_tickets_by_admin(AdminId, open),
|
||||
tickets_assigned_total => core_ticket:count_tickets_by_admin(AdminId, closed) +
|
||||
core_ticket:count_tickets_by_admin(AdminId, in_progress),
|
||||
reports_pending => core_report:count_reports_by_status(pending)
|
||||
}.
|
||||
|
||||
%% ========== Вспомогательные функции ============================
|
||||
|
||||
date_list_to_json(List) ->
|
||||
[ #{<<"date">> => iso8601_date(Date), <<"count">> => Count} || {Date, Count} <- List ].
|
||||
|
||||
iso8601_date({{Y, M, D}, _}) ->
|
||||
iolist_to_binary(io_lib:format("~4..0B-~2..0B-~2..0B", [Y, M, D]));
|
||||
iso8601_date({Y, M, D}) ->
|
||||
iolist_to_binary(io_lib:format("~4..0B-~2..0B-~2..0B", [Y, M, D])).
|
||||
|
||||
trunc_hours(Value) ->
|
||||
round(Value * 10) / 10.0.
|
||||
|
||||
collect_admin_activity() ->
|
||||
Admins = core_admin:list_all(),
|
||||
lists:map(fun(A) ->
|
||||
Actions = length(core_admin_audit:list([{admin_id, A#admin.id}])),
|
||||
#{
|
||||
admin_id => A#admin.id,
|
||||
email => A#admin.email,
|
||||
actions => Actions
|
||||
}
|
||||
end, Admins).
|
||||
Reference in New Issue
Block a user