节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
2.62 KiB
Stardust
using NewLife;
using NewLife.Cube;
using NewLife.Cube.ViewModels;
using NewLife.Data;
using NewLife.Web;
using Stardust.Data.Nodes;
using XCode.Membership;
using static Stardust.Data.Nodes.NodeStat;

namespace Stardust.Web.Areas.Nodes.Controllers;

/// <summary>节点统计。按时间维度统计节点数量、在线率等指标,支持图表和趋势展示</summary>
[Menu(60)]
[NodesArea]
public class NodeStatController : WebReadOnlyEntityController<NodeStat>
{
    static NodeStatController()
    {
        ListFields.RemoveField("ID", "LinkItem", "CreateTime", "UpdateTime", "Remark");

        {
            var df = ListFields.GetField("Category") as ListField;
            df.Url = "/Nodes/NodeStat?category={Category}&dtStart={StatDate}&dtEnd={StatDate}";
        }
        {
            var df = ListFields.GetField("Key") as ListField;
            df.Url = "/Nodes/NodeStat?category={Category}&key={Key}";
        }
        {
            var df = ListFields.AddListField("nodes", null, "Total");
            df.DisplayName = "明细";
            df.Target = "_frame";
        }
    }

    /// <summary>高级搜索。按条件分页查询</summary>
    /// <param name="p">分页参数</param>
    /// <returns>实体列表</returns>
    protected override IEnumerable<NodeStat> Search(Pager p)
    {
        var category = p["category"];
        var key = p["key"];
        var start = p["dtStart"].ToDateTime();
        var end = p["dtEnd"].ToDateTime();

        // 默认分类
        if (category.IsNullOrEmpty()) p["category"] = category = "操作系统";

        // 带有分类没有key也没有日期时,显示今天
        if (!category.IsNullOrEmpty() && key.IsNullOrEmpty() && start.Year < 2000)
        {
            start = end = DateTime.Today;
            p["dtStart"] = start.ToString("yyyy-MM-dd");
            p["dtEnd"] = end.ToString("yyyy-MM-dd");

            p.Sort = __.ActivesT30;
            p.Desc = true;
            p.PageSize = 100;
        }

        // 默认排序
        if (!category.IsNullOrEmpty() && !key.IsNullOrEmpty() && start.Year < 2000 && p.Sort.IsNullOrEmpty())
        {
            start = DateTime.Today.AddDays(-30);
            p["dtStart"] = start.ToString("yyyy-MM-dd");

            p.Sort = __.StatDate;
            p.Desc = true;
            p.PageSize = 100;
        }
        else if (!category.IsNullOrEmpty() && start.Year > 2000)
        {
            if (p.PageSize == 20) p.PageSize = 100;
        }

        p.RetrieveState = true;

        var list = NodeStat.Search(category, key, start, end, p["Q"], p);

        // 纯 API 无视图,原 MVC 图表(ECharts)已删除

        return list;
    }
}