site.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "github.com/mark3labs/mcp-go/mcp"
  7. "github.com/mark3labs/mcp-go/server"
  8. "fwh-toolbox-server/cmd/mcp/tools/helper"
  9. "fwh-toolbox-server/dto"
  10. "fwh-toolbox-server/services"
  11. )
  12. func registerSiteTools(s *server.MCPServer) {
  13. s.AddTool(
  14. mcp.NewTool("service_site_query_info",
  15. mcp.WithDescription("查询单个站点设备的详细信息,包括版本、网络状态、激活状态、固件、SN 等"),
  16. mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN 序列号")),
  17. ),
  18. handleSiteQueryInfo,
  19. )
  20. s.AddTool(
  21. mcp.NewTool("service_site_search",
  22. mcp.WithDescription("搜索站点设备列表,支持分页和关键字搜索"),
  23. mcp.WithNumber("page", mcp.Description("页码,从1开始,默认1")),
  24. mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
  25. mcp.WithString("keyword", mcp.Description("搜索关键字(匹配 SN、设备名)")),
  26. ),
  27. handleSiteSearch,
  28. )
  29. s.AddTool(
  30. mcp.NewTool("service_site_power_flow",
  31. mcp.WithDescription("查询站点指定日期的功率流数据(PV、Grid、aPower、HomeLoad、Generator)"),
  32. mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN 序列号")),
  33. mcp.WithString("date", mcp.Required(), mcp.Description("日期,格式 yyyy-MM-dd")),
  34. ),
  35. handleSitePowerFlow,
  36. )
  37. }
  38. func handleSiteQueryInfo(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  39. sn, err := req.RequireString("sn")
  40. if err != nil {
  41. return helper.ParamError("sn"), nil
  42. }
  43. data, err := services.GetSiteInfoData(sn)
  44. if err != nil {
  45. return helper.ServiceError("查询站点信息", err), nil
  46. }
  47. return helper.JSONResultOrFileAuto(data), nil
  48. }
  49. func handleSiteSearch(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  50. page := uint(req.GetFloat("page", 1))
  51. size := uint(req.GetFloat("size", 10))
  52. keyword := req.GetString("keyword", "")
  53. param := dto.SiteInfoRequest{
  54. PageNum: page,
  55. PageSize: size,
  56. Search: keyword,
  57. }
  58. data, err := services.QuerySiteInfoDataList(param)
  59. if err != nil {
  60. return helper.ServiceError("搜索站点列表", err), nil
  61. }
  62. return helper.PageResult(data.Total, data.PageSize, data.PageNum, data.Data, "site_search"), nil
  63. }
  64. func handleSitePowerFlow(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  65. sn, err := req.RequireString("sn")
  66. if err != nil {
  67. return helper.ParamError("sn"), nil
  68. }
  69. dateStr, err := req.RequireString("date")
  70. if err != nil {
  71. return helper.ParamError("date"), nil
  72. }
  73. day, err := time.Parse("2006-01-02", dateStr)
  74. if err != nil {
  75. return helper.ParamInvalidError("date", fmt.Sprintf("需要 yyyy-MM-dd 格式: %v", err)), nil
  76. }
  77. data, err := services.QuerySitePowerFlow(sn, day)
  78. if err != nil {
  79. return helper.ServiceError("查询功率流", err), nil
  80. }
  81. return helper.JSONResultOrFileAuto(data), nil
  82. }