faultrecord.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package tools
  2. import (
  3. "context"
  4. "time"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "fwh-toolbox-server/agentmcp/kit"
  7. "fwh-toolbox-server/repositories"
  8. )
  9. // deviceTypeDesc 故障录波设备类型说明
  10. const deviceTypeDesc = "deviceType:0 aPower-PE、1 aGate/MCA、2 aPower-MPPT、3 aHub"
  11. // ---- fault_record_list ----
  12. type faultRecordListArgs struct {
  13. SN string `json:"sn" jsonschema:"站点 SN(aGate 序列号)"`
  14. From string `json:"from" jsonschema:"开始时间,yyyy-MM-dd HH:mm:ss"`
  15. To string `json:"to" jsonschema:"结束时间,同上;与开始时间相差不超过 92 天"`
  16. Limit int `json:"limit,omitempty" jsonschema:"最多返回条数,1~300,默认 100"`
  17. }
  18. var FaultRecordList = kit.Def[faultRecordListArgs]{
  19. Name: "fault_record_list",
  20. Title: "查询故障录波记录",
  21. Description: "查询站点在一段时间内的故障录波日志(FWH 平台)。返回字段:id(录波记录 ID,用于 fault_record_detail)、" + deviceTypeDesc +
  22. "、apowerId / powerlinkId(对应设备 SN)、gatewayId、triggerType(1 手动、2 自动)、触发时间与状态等(以实际返回为准)。",
  23. ReadOnly: true,
  24. Handler: func(ctx context.Context, a faultRecordListArgs) (*mcp.CallToolResult, error) {
  25. sn, err := kit.Required("sn", a.SN)
  26. if err != nil {
  27. return kit.Fail(err), nil
  28. }
  29. from, to, err := kit.ParseRange(a.From, a.To, 92*24*time.Hour)
  30. if err != nil {
  31. return kit.Fail(err), nil
  32. }
  33. items, err := repositories.QueryFaultRecordList(sn, from.Format(kit.DateTimeLayout), to.Format(kit.DateTimeLayout))
  34. if err != nil {
  35. return kit.Upstream("FWH 平台故障录波接口", err), nil
  36. }
  37. return kit.List(items, -1, kit.Limit(a.Limit, 100, 300), "结果已截断,请缩短时间范围"), nil
  38. },
  39. }
  40. // ---- fault_record_detail ----
  41. type faultRecordDetailArgs struct {
  42. FaultID int64 `json:"faultId" jsonschema:"故障录波记录 ID(fault_record_list 返回的 id)"`
  43. }
  44. var FaultRecordDetail = kit.Def[faultRecordDetailArgs]{
  45. Name: "fault_record_detail",
  46. Title: "查询故障录波子记录",
  47. Description: "查询一条故障录波记录下的子记录(各设备的录波文件)。返回字段:id、faultId、" + deviceTypeDesc +
  48. "、apowerId、gatewayId、fileName(不含后缀)、文件状态与时间等(以实际返回为准)。",
  49. ReadOnly: true,
  50. Handler: func(ctx context.Context, a faultRecordDetailArgs) (*mcp.CallToolResult, error) {
  51. if a.FaultID <= 0 {
  52. return kit.Failf("参数 faultId 必填且为正整数"), nil
  53. }
  54. items, err := repositories.QueryFaultRecordSubList(a.FaultID)
  55. if err != nil {
  56. return kit.Upstream("FWH 平台故障录波接口", err), nil
  57. }
  58. return kit.List(items, -1, 200, ""), nil
  59. },
  60. }
  61. // ---- fault_record_callable ----
  62. type faultRecordCallableArgs struct {
  63. SN string `json:"sn" jsonschema:"设备 SN(aGate / aPower / MPPT / aHub)"`
  64. DeviceType *int `json:"deviceType,omitempty" jsonschema:"设备类型:0 aPower、1 aGate(默认)、2 MPPT、3 aHub"`
  65. }
  66. var FaultRecordCallable = kit.Def[faultRecordCallableArgs]{
  67. Name: "fault_record_callable",
  68. Title: "查询可召唤的故障录波",
  69. Description: "查询设备上可召唤(尚未上传)的自动故障录波数据列表(FWH 平台)。" +
  70. "返回字段:idx / indexNumber(数据序号)、failureTime(故障时间)、paramVersionNumber(故障信息)、triggerSourceCode(故障码)。",
  71. ReadOnly: true,
  72. Handler: func(ctx context.Context, a faultRecordCallableArgs) (*mcp.CallToolResult, error) {
  73. sn, err := kit.Required("sn", a.SN)
  74. if err != nil {
  75. return kit.Fail(err), nil
  76. }
  77. devType := 1
  78. if a.DeviceType != nil {
  79. devType = *a.DeviceType
  80. }
  81. if devType < 0 || devType > 3 {
  82. return kit.Failf("参数 deviceType 取值 0~3"), nil
  83. }
  84. items, err := repositories.QueryFaultRecordCallableList(devType, sn)
  85. if err != nil {
  86. return kit.Upstream("FWH 平台故障录波接口", err), nil
  87. }
  88. if len(items) == 0 {
  89. return kit.Empty("该设备没有可召唤的故障录波数据。"), nil
  90. }
  91. return kit.List(items, -1, 200, ""), nil
  92. },
  93. }
  94. // ---- fault_record_call_history ----
  95. type faultRecordCallHistoryArgs struct {
  96. Page int `json:"page,omitempty" jsonschema:"页码,默认 1"`
  97. Size int `json:"size,omitempty" jsonschema:"每页条数,1~100,默认 20"`
  98. }
  99. var FaultRecordCallHistory = kit.Def[faultRecordCallHistoryArgs]{
  100. Name: "fault_record_call_history",
  101. Title: "查询故障录波召唤记录",
  102. Description: "分页查询 FWH 平台上全部站点的故障录波召唤记录(手动召唤的历史),按时间倒序。" +
  103. "返回字段与 fault_record_list 相同。查看单个站点的录波请用 fault_record_list。",
  104. ReadOnly: true,
  105. Handler: func(ctx context.Context, a faultRecordCallHistoryArgs) (*mcp.CallToolResult, error) {
  106. size := kit.Limit(a.Size, 20, 100)
  107. items, err := repositories.QueryFaultRecordCallRecordPage(kit.Page(a.Page), size)
  108. if err != nil {
  109. return kit.Upstream("FWH 平台故障录波接口", err), nil
  110. }
  111. return kit.List(items, -1, size, "可用 page 翻页"), nil
  112. },
  113. }