fwh_api.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. package data
  2. import (
  3. "context"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/mark3labs/mcp-go/mcp"
  9. "github.com/mark3labs/mcp-go/server"
  10. "fwh-toolbox-server/cmd/mcp/tools/helper"
  11. "fwh-toolbox-server/domain"
  12. "fwh-toolbox-server/dto"
  13. "fwh-toolbox-server/repositories"
  14. )
  15. func registerFwhApiTools(s *server.MCPServer) {
  16. // 站点信息
  17. s.AddTool(
  18. mcp.NewTool("data_fwh_query_site_base_info_list",
  19. mcp.WithDescription("查询站点基本信息列表(FWH Pro API)"),
  20. mcp.WithString("sn", mcp.Description("站点SN,多个用逗号分隔")),
  21. mcp.WithNumber("page", mcp.Description("页码,默认1")),
  22. mcp.WithNumber("size", mcp.Description("每页数量,默认20")),
  23. ),
  24. handleFwhQuerySiteBaseInfoList,
  25. )
  26. s.AddTool(
  27. mcp.NewTool("data_fwh_query_site_list",
  28. mcp.WithDescription("查询站点列表(FWH Pro API,支持SN搜索)"),
  29. mcp.WithString("sn", mcp.Description("站点SN搜索")),
  30. mcp.WithNumber("page", mcp.Description("页码,默认1")),
  31. mcp.WithNumber("size", mcp.Description("每页数量,默认20")),
  32. ),
  33. handleFwhQuerySiteList,
  34. )
  35. s.AddTool(
  36. mcp.NewTool("data_fwh_query_site_mode_info",
  37. mcp.WithDescription("查询站点工作模式信息(FWH Pro API)"),
  38. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  39. ),
  40. handleFwhQuerySiteModeInfo,
  41. )
  42. s.AddTool(
  43. mcp.NewTool("data_fwh_query_site_power_flow",
  44. mcp.WithDescription("查询站点指定日期的功率流数据(FWH Pro API)"),
  45. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  46. mcp.WithString("date", mcp.Required(), mcp.Description("日期,格式 yyyy-MM-dd")),
  47. ),
  48. handleFwhQuerySitePowerFlow,
  49. )
  50. // 告警相关
  51. s.AddTool(
  52. mcp.NewTool("data_fwh_query_site_alarm_list",
  53. mcp.WithDescription("查询站点当前告警列表(FWH Pro API)"),
  54. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  55. ),
  56. handleFwhQuerySiteAlarmList,
  57. )
  58. s.AddTool(
  59. mcp.NewTool("data_fwh_query_event_alarm_list",
  60. mcp.WithDescription("查询站点时间范围内的事件/告警日志(FWH Pro API)。注意:大时间范围查询可能较慢"),
  61. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  62. mcp.WithString("start_time", mcp.Required(), mcp.Description("开始时间,格式 yyyy-MM-dd HH:mm:ss")),
  63. mcp.WithString("end_time", mcp.Required(), mcp.Description("结束时间,格式 yyyy-MM-dd HH:mm:ss")),
  64. mcp.WithString("type", mcp.Description("类型:all(默认)、event、alarm")),
  65. ),
  66. handleFwhQueryEventAlarmList,
  67. )
  68. s.AddTool(
  69. mcp.NewTool("data_fwh_query_alarm_snapshot",
  70. mcp.WithDescription("查询站点告警快照信息(FWH Pro API)"),
  71. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  72. mcp.WithString("date", mcp.Required(), mcp.Description("日期,格式 yyyy-MM-dd")),
  73. ),
  74. handleFwhQueryAlarmSnapshot,
  75. )
  76. s.AddTool(
  77. mcp.NewTool("data_fwh_query_alarm_statistics",
  78. mcp.WithDescription("查询实时告警统计数据(FWH Pro API)"),
  79. mcp.WithNumber("country", mcp.Description("国家ID: 0-全部(默认), 2-美国, 3-澳大利亚")),
  80. mcp.WithNumber("page", mcp.Description("页码,默认1")),
  81. ),
  82. handleFwhQueryAlarmStatistics,
  83. )
  84. s.AddTool(
  85. mcp.NewTool("data_fwh_query_alarm_statistics_from_code",
  86. mcp.WithDescription("按告警码查询触发站点列表(FWH Pro API)"),
  87. mcp.WithString("alarm_code", mcp.Required(), mcp.Description("告警码")),
  88. mcp.WithNumber("country", mcp.Description("国家ID: 0-全部(默认), 2-美国, 3-澳大利亚")),
  89. mcp.WithNumber("page", mcp.Description("页码,默认1")),
  90. ),
  91. handleFwhQueryAlarmStatisticsFromCode,
  92. )
  93. // MQTT日志
  94. s.AddTool(
  95. mcp.NewTool("data_fwh_query_mqtt_log_list",
  96. mcp.WithDescription("查询站点时间范围内的MQTT日志(FWH Pro API)。注意:大时间范围查询可能较慢"),
  97. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  98. mcp.WithString("cmd_type", mcp.Required(), mcp.Description("MQTT命令类型(如 0, 101, 201 等)")),
  99. mcp.WithString("start_time", mcp.Required(), mcp.Description("开始时间,格式 yyyy-MM-dd HH:mm:ss")),
  100. mcp.WithString("end_time", mcp.Required(), mcp.Description("结束时间,格式 yyyy-MM-dd HH:mm:ss")),
  101. ),
  102. handleFwhQueryMqttLogList,
  103. )
  104. // 停机列表
  105. s.AddTool(
  106. mcp.NewTool("data_fwh_query_shutdown_list",
  107. mcp.WithDescription("查询Shutdown站点列表(FWH Pro API)"),
  108. mcp.WithString("date", mcp.Required(), mcp.Description("日期,格式 yyyy-MM-dd")),
  109. mcp.WithNumber("country", mcp.Description("国家ID: 0-全部(默认), 2-美国, 3-澳大利亚")),
  110. ),
  111. handleFwhQueryShutdownList,
  112. )
  113. // EMS日志
  114. s.AddTool(
  115. mcp.NewTool("data_fwh_query_ems_log_record",
  116. mcp.WithDescription("查询EMS日志召唤记录(FWH Pro API)"),
  117. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  118. ),
  119. handleFwhQueryEmsLogRecord,
  120. )
  121. // 故障录波
  122. s.AddTool(
  123. mcp.NewTool("data_fwh_query_fault_record_list",
  124. mcp.WithDescription("查询故障录波日志列表(FWH Pro API)"),
  125. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  126. mcp.WithString("start_time", mcp.Required(), mcp.Description("开始时间,格式 yyyy-MM-dd HH:mm:ss")),
  127. mcp.WithString("end_time", mcp.Required(), mcp.Description("结束时间,格式 yyyy-MM-dd HH:mm:ss")),
  128. ),
  129. handleFwhQueryFaultRecordList,
  130. )
  131. s.AddTool(
  132. mcp.NewTool("data_fwh_query_fault_record_callable_list",
  133. mcp.WithDescription("查询设备可召唤的故障录波数据列表(FWH Pro API)"),
  134. mcp.WithString("sn", mcp.Required(), mcp.Description("设备SN(aGate/aPower/aHub)")),
  135. mcp.WithNumber("dev_type", mcp.Description("设备类型: 0-aPower, 1-aGate, 2-MPPT, 3-aHub(默认1)")),
  136. ),
  137. handleFwhQueryFaultRecordCallableList,
  138. )
  139. s.AddTool(
  140. mcp.NewTool("data_fwh_query_fault_record_call_record_list",
  141. mcp.WithDescription("查询故障录波召唤记录(FWH Pro API)"),
  142. ),
  143. handleFwhQueryFaultRecordCallRecordList,
  144. )
  145. s.AddTool(
  146. mcp.NewTool("data_fwh_query_fault_record_sub_list",
  147. mcp.WithDescription("查询故障录波子记录(FWH Pro API)"),
  148. mcp.WithString("fault_id", mcp.Required(), mcp.Description("故障录波记录ID")),
  149. ),
  150. handleFwhQueryFaultRecordSubList,
  151. )
  152. // 系统升级
  153. s.AddTool(
  154. mcp.NewTool("data_fwh_query_system_update_log",
  155. mcp.WithDescription("查询系统升级记录(FWH Pro API)"),
  156. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  157. ),
  158. handleFwhQuerySystemUpdateLog,
  159. )
  160. s.AddTool(
  161. mcp.NewTool("data_fwh_query_system_update_log_detail",
  162. mcp.WithDescription("查询系统升级记录详细信息(FWH Pro API)"),
  163. mcp.WithString("order_id", mcp.Required(), mcp.Description("升级单ID")),
  164. ),
  165. handleFwhQuerySystemUpdateLogDetail,
  166. )
  167. s.AddTool(
  168. mcp.NewTool("data_fwh_query_ahub_update_log",
  169. mcp.WithDescription("查询aHub升级记录(FWH Pro API)"),
  170. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  171. ),
  172. handleFwhQueryAHubUpdateLog,
  173. )
  174. // TOU模板
  175. s.AddTool(
  176. mcp.NewTool("data_fwh_query_tou_template_list",
  177. mcp.WithDescription("查询TOU模板列表(FWH Pro API)"),
  178. mcp.WithString("search", mcp.Description("搜索关键字")),
  179. mcp.WithNumber("page", mcp.Description("页码,默认1")),
  180. mcp.WithNumber("size", mcp.Description("每页数量,默认20")),
  181. ),
  182. handleFwhQueryTouTemplateList,
  183. )
  184. s.AddTool(
  185. mcp.NewTool("data_fwh_query_tou_template_detail",
  186. mcp.WithDescription("查询TOU模板详情(FWH Pro API)"),
  187. mcp.WithString("id", mcp.Required(), mcp.Description("模板ID")),
  188. ),
  189. handleFwhQueryTouTemplateDetail,
  190. )
  191. }
  192. // === Handlers ===
  193. func handleFwhQuerySiteBaseInfoList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  194. sn := req.GetString("sn", "")
  195. page := uint(req.GetFloat("page", 1))
  196. size := uint(req.GetFloat("size", 20))
  197. para := dto.SiteBaseInfoPara{
  198. PageNum: page,
  199. PageSize: size,
  200. }
  201. if sn != "" {
  202. snList := strings.Split(sn, ",")
  203. para.SiteList = snList
  204. }
  205. data, err := repositories.QuerySiteBaseInfoList(para)
  206. if err != nil {
  207. return helper.ServiceError("查询站点基本信息列表", err), nil
  208. }
  209. return helper.JSONResult(data), nil
  210. }
  211. func handleFwhQuerySiteList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  212. sn := req.GetString("sn", "")
  213. page := uint(req.GetFloat("page", 1))
  214. size := uint(req.GetFloat("size", 20))
  215. para := dto.SiteInfoPara{
  216. PageNum: page,
  217. PageSize: size,
  218. }
  219. if sn != "" {
  220. para.SN = &sn
  221. }
  222. data, err := repositories.QuerySiteInfoList(para)
  223. if err != nil {
  224. return helper.ServiceError("查询站点列表", err), nil
  225. }
  226. return helper.JSONResult(data), nil
  227. }
  228. func handleFwhQuerySiteModeInfo(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  229. sn, err := req.RequireString("sn")
  230. if err != nil {
  231. return helper.ParamError("sn"), nil
  232. }
  233. data, err := repositories.QuerySiteModeInfo(sn)
  234. if err != nil {
  235. return helper.ServiceError("查询站点工作模式", err), nil
  236. }
  237. return helper.JSONResult(data), nil
  238. }
  239. func handleFwhQuerySitePowerFlow(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  240. sn, err := req.RequireString("sn")
  241. if err != nil {
  242. return helper.ParamError("sn"), nil
  243. }
  244. dateStr, err := req.RequireString("date")
  245. if err != nil {
  246. return helper.ParamError("date"), nil
  247. }
  248. day, err := time.Parse("2006-01-02", dateStr)
  249. if err != nil {
  250. return helper.ParamInvalidError("date", fmt.Sprintf("需要 yyyy-MM-dd 格式: %v", err)), nil
  251. }
  252. data, err := repositories.QuerySitePowerFlow(sn, day)
  253. if err != nil {
  254. return helper.ServiceError("查询功率流", err), nil
  255. }
  256. return helper.JSONResult(data), nil
  257. }
  258. func handleFwhQuerySiteAlarmList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  259. sn, err := req.RequireString("sn")
  260. if err != nil {
  261. return helper.ParamError("sn"), nil
  262. }
  263. data, err := repositories.QuerySiteAlarmList(sn)
  264. if err != nil {
  265. return helper.ServiceError("查询站点告警列表", err), nil
  266. }
  267. return helper.JSONResult(data), nil
  268. }
  269. func handleFwhQueryEventAlarmList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  270. sn, err := req.RequireString("sn")
  271. if err != nil {
  272. return helper.ParamError("sn"), nil
  273. }
  274. startTimeStr, err := req.RequireString("start_time")
  275. if err != nil {
  276. return helper.ParamError("start_time"), nil
  277. }
  278. endTimeStr, err := req.RequireString("end_time")
  279. if err != nil {
  280. return helper.ParamError("end_time"), nil
  281. }
  282. startTime, err := time.Parse(time.DateTime, startTimeStr)
  283. if err != nil {
  284. return helper.ParamInvalidError("start_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  285. }
  286. endTime, err := time.Parse(time.DateTime, endTimeStr)
  287. if err != nil {
  288. return helper.ParamInvalidError("end_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  289. }
  290. typeStr := req.GetString("type", "all")
  291. var eventAlarmType repositories.EventAlarmType
  292. switch typeStr {
  293. case "event":
  294. eventAlarmType = repositories.Event
  295. case "alarm":
  296. eventAlarmType = repositories.Alarm
  297. default:
  298. eventAlarmType = repositories.EventAndAlarm
  299. }
  300. data, err := repositories.QueryEventOrAlarmListOnTimeRange(sn, startTime, endTime, eventAlarmType)
  301. if err != nil {
  302. return helper.ServiceError("查询事件告警日志", err), nil
  303. }
  304. if len(data) == 0 {
  305. return helper.EmptyResult("查询结果为空"), nil
  306. }
  307. return helper.JSONResult(data), nil
  308. }
  309. func handleFwhQueryAlarmSnapshot(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  310. sn, err := req.RequireString("sn")
  311. if err != nil {
  312. return helper.ParamError("sn"), nil
  313. }
  314. dateStr, err := req.RequireString("date")
  315. if err != nil {
  316. return helper.ParamError("date"), nil
  317. }
  318. // 验证日期格式
  319. if _, err := time.Parse("2006-01-02", dateStr); err != nil {
  320. return helper.ParamInvalidError("date", fmt.Sprintf("需要 yyyy-MM-dd 格式: %v", err)), nil
  321. }
  322. data, err := repositories.QueryAlarmSnapshotInfo(sn, dateStr)
  323. if err != nil {
  324. return helper.ServiceError("查询告警快照", err), nil
  325. }
  326. if len(data) == 0 {
  327. return helper.EmptyResult("查询结果为空"), nil
  328. }
  329. return helper.JSONResult(data), nil
  330. }
  331. func handleFwhQueryAlarmStatistics(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  332. country := domain.CountryType(int(req.GetFloat("country", 0)))
  333. page := int(req.GetFloat("page", 1))
  334. data, err := repositories.QueryAlarmStatistics(country, page)
  335. if err != nil {
  336. return helper.ServiceError("查询实时告警统计", err), nil
  337. }
  338. return helper.JSONResult(data), nil
  339. }
  340. func handleFwhQueryAlarmStatisticsFromCode(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  341. alarmCode, err := req.RequireString("alarm_code")
  342. if err != nil {
  343. return helper.ParamError("alarm_code"), nil
  344. }
  345. country := domain.CountryType(int(req.GetFloat("country", 0)))
  346. page := int(req.GetFloat("page", 1))
  347. data, err := repositories.QueryAlarmStatisticsFromCode(country, alarmCode, page)
  348. if err != nil {
  349. return helper.ServiceError("查询告警码统计", err), nil
  350. }
  351. return helper.JSONResult(data), nil
  352. }
  353. func handleFwhQueryMqttLogList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  354. sn, err := req.RequireString("sn")
  355. if err != nil {
  356. return helper.ParamError("sn"), nil
  357. }
  358. cmdType, err := req.RequireString("cmd_type")
  359. if err != nil {
  360. return helper.ParamError("cmd_type"), nil
  361. }
  362. startTimeStr, err := req.RequireString("start_time")
  363. if err != nil {
  364. return helper.ParamError("start_time"), nil
  365. }
  366. endTimeStr, err := req.RequireString("end_time")
  367. if err != nil {
  368. return helper.ParamError("end_time"), nil
  369. }
  370. startTime, err := time.Parse(time.DateTime, startTimeStr)
  371. if err != nil {
  372. return helper.ParamInvalidError("start_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  373. }
  374. endTime, err := time.Parse(time.DateTime, endTimeStr)
  375. if err != nil {
  376. return helper.ParamInvalidError("end_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  377. }
  378. data, err := repositories.QueryMqttLogListOnTimeRange(sn, domain.MqttCmdType(cmdType), startTime, endTime)
  379. if err != nil {
  380. return helper.ServiceError("查询MQTT日志", err), nil
  381. }
  382. if len(data) == 0 {
  383. return helper.EmptyResult("查询结果为空"), nil
  384. }
  385. return helper.JSONResult(data), nil
  386. }
  387. func handleFwhQueryShutdownList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  388. dateStr, err := req.RequireString("date")
  389. if err != nil {
  390. return helper.ParamError("date"), nil
  391. }
  392. country := int(req.GetFloat("country", 0))
  393. // 验证日期格式
  394. if _, err := time.Parse("2006-01-02", dateStr); err != nil {
  395. return helper.ParamInvalidError("date", fmt.Sprintf("需要 yyyy-MM-dd 格式: %v", err)), nil
  396. }
  397. data, err := repositories.QuerySiteShutdownList(dateStr, country)
  398. if err != nil {
  399. return helper.ServiceError("查询停机列表", err), nil
  400. }
  401. if len(data) == 0 {
  402. return helper.EmptyResult("查询结果为空"), nil
  403. }
  404. return helper.JSONResult(data), nil
  405. }
  406. func handleFwhQueryEmsLogRecord(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  407. sn, err := req.RequireString("sn")
  408. if err != nil {
  409. return helper.ParamError("sn"), nil
  410. }
  411. // 使用空日期和0类型查询所有记录
  412. data, err := repositories.QueryEmsLogCallRecord(sn, "", 0)
  413. if err != nil {
  414. // 如果是"没有召唤日志"的错误,返回空结果
  415. return helper.EmptyResult(fmt.Sprintf("未找到EMS日志记录: %v", err)), nil
  416. }
  417. return helper.JSONResult(data), nil
  418. }
  419. func handleFwhQueryFaultRecordList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  420. sn, err := req.RequireString("sn")
  421. if err != nil {
  422. return helper.ParamError("sn"), nil
  423. }
  424. startTimeStr, err := req.RequireString("start_time")
  425. if err != nil {
  426. return helper.ParamError("start_time"), nil
  427. }
  428. endTimeStr, err := req.RequireString("end_time")
  429. if err != nil {
  430. return helper.ParamError("end_time"), nil
  431. }
  432. data, err := repositories.QueryFaultRecordList(sn, startTimeStr, endTimeStr)
  433. if err != nil {
  434. return helper.ServiceError("查询故障录波列表", err), nil
  435. }
  436. if len(data) == 0 {
  437. return helper.EmptyResult("查询结果为空"), nil
  438. }
  439. return helper.JSONResult(data), nil
  440. }
  441. func handleFwhQueryFaultRecordCallableList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  442. sn, err := req.RequireString("sn")
  443. if err != nil {
  444. return helper.ParamError("sn"), nil
  445. }
  446. devType := int(req.GetFloat("dev_type", 1))
  447. data, err := repositories.QueryFaultRecordCallableList(devType, sn)
  448. if err != nil {
  449. return helper.ServiceError("查询可召唤故障录波列表", err), nil
  450. }
  451. if len(data) == 0 {
  452. return helper.EmptyResult("无可召唤的故障录波数据"), nil
  453. }
  454. return helper.JSONResult(data), nil
  455. }
  456. func handleFwhQueryFaultRecordCallRecordList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  457. data, err := repositories.QueryFaultRecordCallRecordList()
  458. if err != nil {
  459. return helper.ServiceError("查询故障录波召唤记录", err), nil
  460. }
  461. if len(data) == 0 {
  462. return helper.EmptyResult("查询结果为空"), nil
  463. }
  464. return helper.JSONResult(data), nil
  465. }
  466. func handleFwhQueryFaultRecordSubList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  467. faultIdStr, err := req.RequireString("fault_id")
  468. if err != nil {
  469. return helper.ParamError("fault_id"), nil
  470. }
  471. faultId, err := strconv.ParseInt(faultIdStr, 10, 64)
  472. if err != nil {
  473. return helper.ParamInvalidError("fault_id", "必须是数字"), nil
  474. }
  475. data, err := repositories.QueryFaultRecordSubList(faultId)
  476. if err != nil {
  477. return helper.ServiceError("查询故障录波子记录", err), nil
  478. }
  479. if len(data) == 0 {
  480. return helper.EmptyResult("查询结果为空"), nil
  481. }
  482. return helper.JSONResult(data), nil
  483. }
  484. func handleFwhQuerySystemUpdateLog(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  485. sn, err := req.RequireString("sn")
  486. if err != nil {
  487. return helper.ParamError("sn"), nil
  488. }
  489. data, err := repositories.QuerySystemUpdateLog(sn)
  490. if err != nil {
  491. return helper.ServiceError("查询系统升级记录", err), nil
  492. }
  493. if len(data) == 0 {
  494. return helper.EmptyResult("查询结果为空"), nil
  495. }
  496. return helper.JSONResult(data), nil
  497. }
  498. func handleFwhQuerySystemUpdateLogDetail(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  499. orderIdStr, err := req.RequireString("order_id")
  500. if err != nil {
  501. return helper.ParamError("order_id"), nil
  502. }
  503. orderId, err := strconv.ParseInt(orderIdStr, 10, 64)
  504. if err != nil {
  505. return helper.ParamInvalidError("order_id", "必须是数字"), nil
  506. }
  507. data, err := repositories.QuerySystemUpdateLogDetail(orderId)
  508. if err != nil {
  509. return helper.ServiceError("查询升级详情", err), nil
  510. }
  511. if len(data) == 0 {
  512. return helper.EmptyResult("查询结果为空"), nil
  513. }
  514. return helper.JSONResult(data), nil
  515. }
  516. func handleFwhQueryAHubUpdateLog(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  517. sn, err := req.RequireString("sn")
  518. if err != nil {
  519. return helper.ParamError("sn"), nil
  520. }
  521. data, err := repositories.QueryAHubUpdateLog(sn)
  522. if err != nil {
  523. return helper.ServiceError("查询aHub升级记录", err), nil
  524. }
  525. if len(data) == 0 {
  526. return helper.EmptyResult("查询结果为空"), nil
  527. }
  528. return helper.JSONResult(data), nil
  529. }
  530. func handleFwhQueryTouTemplateList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  531. search := req.GetString("search", "")
  532. page := uint(req.GetFloat("page", 1))
  533. size := uint(req.GetFloat("size", 20))
  534. data, err := repositories.QueryTouTemplateInfoList(search, size, page, nil, nil)
  535. if err != nil {
  536. return helper.ServiceError("查询TOU模板列表", err), nil
  537. }
  538. return helper.JSONResult(data), nil
  539. }
  540. func handleFwhQueryTouTemplateDetail(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  541. idStr, err := req.RequireString("id")
  542. if err != nil {
  543. return helper.ParamError("id"), nil
  544. }
  545. id, err := strconv.ParseUint(idStr, 10, 64)
  546. if err != nil {
  547. return helper.ParamInvalidError("id", "必须是数字"), nil
  548. }
  549. data, err := repositories.QueryTouTemplateDetailInfo(uint(id))
  550. if err != nil {
  551. return helper.ServiceError("查询TOU模板详情", err), nil
  552. }
  553. if data == nil {
  554. return helper.EmptyResult("模板不存在"), nil
  555. }
  556. return helper.JSONResult(data), nil
  557. }