fwh_api.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  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. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  165. ),
  166. handleFwhQuerySystemUpdateLogDetail,
  167. )
  168. s.AddTool(
  169. mcp.NewTool("data_fwh_query_ahub_update_log",
  170. mcp.WithDescription("查询aHub升级记录(FWH Pro API)"),
  171. mcp.WithString("sn", mcp.Required(), mcp.Description("站点SN")),
  172. ),
  173. handleFwhQueryAHubUpdateLog,
  174. )
  175. // TOU模板
  176. s.AddTool(
  177. mcp.NewTool("data_fwh_query_tou_template_list",
  178. mcp.WithDescription("查询TOU模板列表(FWH Pro API)"),
  179. mcp.WithString("search", mcp.Description("搜索关键字")),
  180. mcp.WithNumber("page", mcp.Description("页码,默认1")),
  181. mcp.WithNumber("size", mcp.Description("每页数量,默认20")),
  182. ),
  183. handleFwhQueryTouTemplateList,
  184. )
  185. s.AddTool(
  186. mcp.NewTool("data_fwh_query_tou_template_detail",
  187. mcp.WithDescription("查询TOU模板详情(FWH Pro API)"),
  188. mcp.WithString("id", mcp.Required(), mcp.Description("模板ID")),
  189. ),
  190. handleFwhQueryTouTemplateDetail,
  191. )
  192. }
  193. // === Handlers ===
  194. func handleFwhQuerySiteBaseInfoList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  195. sn := req.GetString("sn", "")
  196. page := uint(req.GetFloat("page", 1))
  197. size := uint(req.GetFloat("size", 20))
  198. para := dto.SiteBaseInfoPara{
  199. PageNum: page,
  200. PageSize: size,
  201. }
  202. if sn != "" {
  203. snList := strings.Split(sn, ",")
  204. para.SiteList = snList
  205. }
  206. data, err := repositories.QuerySiteBaseInfoList(para)
  207. if err != nil {
  208. return helper.ServiceError("查询站点基本信息列表", err), nil
  209. }
  210. return helper.JSONResultOrFileAuto(data), nil
  211. }
  212. func handleFwhQuerySiteList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  213. sn := req.GetString("sn", "")
  214. page := uint(req.GetFloat("page", 1))
  215. size := uint(req.GetFloat("size", 20))
  216. para := dto.SiteInfoPara{
  217. PageNum: page,
  218. PageSize: size,
  219. }
  220. if sn != "" {
  221. para.SN = &sn
  222. }
  223. data, err := repositories.QuerySiteInfoList(para)
  224. if err != nil {
  225. return helper.ServiceError("查询站点列表", err), nil
  226. }
  227. return helper.JSONResultOrFileAuto(data), nil
  228. }
  229. func handleFwhQuerySiteModeInfo(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  230. sn, err := req.RequireString("sn")
  231. if err != nil {
  232. return helper.ParamError("sn"), nil
  233. }
  234. data, err := repositories.QuerySiteModeInfo(sn)
  235. if err != nil {
  236. return helper.ServiceError("查询站点工作模式", err), nil
  237. }
  238. return helper.JSONResultOrFileAuto(data), nil
  239. }
  240. func handleFwhQuerySitePowerFlow(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  241. sn, err := req.RequireString("sn")
  242. if err != nil {
  243. return helper.ParamError("sn"), nil
  244. }
  245. dateStr, err := req.RequireString("date")
  246. if err != nil {
  247. return helper.ParamError("date"), nil
  248. }
  249. day, err := time.Parse("2006-01-02", dateStr)
  250. if err != nil {
  251. return helper.ParamInvalidError("date", fmt.Sprintf("需要 yyyy-MM-dd 格式: %v", err)), nil
  252. }
  253. data, err := repositories.QuerySitePowerFlow(sn, day)
  254. if err != nil {
  255. return helper.ServiceError("查询功率流", err), nil
  256. }
  257. return helper.JSONResultOrFileAuto(data), nil
  258. }
  259. func handleFwhQuerySiteAlarmList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  260. sn, err := req.RequireString("sn")
  261. if err != nil {
  262. return helper.ParamError("sn"), nil
  263. }
  264. data, err := repositories.QuerySiteAlarmList(sn)
  265. if err != nil {
  266. return helper.ServiceError("查询站点告警列表", err), nil
  267. }
  268. return helper.JSONResultOrFileAuto(data), nil
  269. }
  270. func handleFwhQueryEventAlarmList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  271. sn, err := req.RequireString("sn")
  272. if err != nil {
  273. return helper.ParamError("sn"), nil
  274. }
  275. startTimeStr, err := req.RequireString("start_time")
  276. if err != nil {
  277. return helper.ParamError("start_time"), nil
  278. }
  279. endTimeStr, err := req.RequireString("end_time")
  280. if err != nil {
  281. return helper.ParamError("end_time"), nil
  282. }
  283. startTime, err := time.Parse(time.DateTime, startTimeStr)
  284. if err != nil {
  285. return helper.ParamInvalidError("start_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  286. }
  287. endTime, err := time.Parse(time.DateTime, endTimeStr)
  288. if err != nil {
  289. return helper.ParamInvalidError("end_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  290. }
  291. typeStr := req.GetString("type", "all")
  292. var eventAlarmType repositories.EventAlarmType
  293. switch typeStr {
  294. case "event":
  295. eventAlarmType = repositories.Event
  296. case "alarm":
  297. eventAlarmType = repositories.Alarm
  298. default:
  299. eventAlarmType = repositories.EventAndAlarm
  300. }
  301. data, err := repositories.QueryEventOrAlarmListOnTimeRange(sn, startTime, endTime, eventAlarmType)
  302. if err != nil {
  303. return helper.ServiceError("查询事件告警日志", err), nil
  304. }
  305. if len(data) == 0 {
  306. return helper.EmptyResult("查询结果为空"), nil
  307. }
  308. return helper.JSONResultOrFileAuto(data), nil
  309. }
  310. func handleFwhQueryAlarmSnapshot(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  311. sn, err := req.RequireString("sn")
  312. if err != nil {
  313. return helper.ParamError("sn"), nil
  314. }
  315. dateStr, err := req.RequireString("date")
  316. if err != nil {
  317. return helper.ParamError("date"), nil
  318. }
  319. // 验证日期格式
  320. if _, err := time.Parse("2006-01-02", dateStr); err != nil {
  321. return helper.ParamInvalidError("date", fmt.Sprintf("需要 yyyy-MM-dd 格式: %v", err)), nil
  322. }
  323. data, err := repositories.QueryAlarmSnapshotInfo(sn, dateStr)
  324. if err != nil {
  325. return helper.ServiceError("查询告警快照", err), nil
  326. }
  327. if len(data) == 0 {
  328. return helper.EmptyResult("查询结果为空"), nil
  329. }
  330. return helper.JSONResultOrFileAuto(data), nil
  331. }
  332. func handleFwhQueryAlarmStatistics(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  333. country := domain.CountryType(int(req.GetFloat("country", 0)))
  334. page := int(req.GetFloat("page", 1))
  335. data, err := repositories.QueryAlarmStatistics(country, page)
  336. if err != nil {
  337. return helper.ServiceError("查询实时告警统计", err), nil
  338. }
  339. return helper.JSONResultOrFileAuto(data), nil
  340. }
  341. func handleFwhQueryAlarmStatisticsFromCode(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  342. alarmCode, err := req.RequireString("alarm_code")
  343. if err != nil {
  344. return helper.ParamError("alarm_code"), nil
  345. }
  346. country := domain.CountryType(int(req.GetFloat("country", 0)))
  347. page := int(req.GetFloat("page", 1))
  348. data, err := repositories.QueryAlarmStatisticsFromCode(country, alarmCode, page)
  349. if err != nil {
  350. return helper.ServiceError("查询告警码统计", err), nil
  351. }
  352. return helper.JSONResultOrFileAuto(data), nil
  353. }
  354. func handleFwhQueryMqttLogList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  355. sn, err := req.RequireString("sn")
  356. if err != nil {
  357. return helper.ParamError("sn"), nil
  358. }
  359. cmdType, err := req.RequireString("cmd_type")
  360. if err != nil {
  361. return helper.ParamError("cmd_type"), nil
  362. }
  363. startTimeStr, err := req.RequireString("start_time")
  364. if err != nil {
  365. return helper.ParamError("start_time"), nil
  366. }
  367. endTimeStr, err := req.RequireString("end_time")
  368. if err != nil {
  369. return helper.ParamError("end_time"), nil
  370. }
  371. startTime, err := time.Parse(time.DateTime, startTimeStr)
  372. if err != nil {
  373. return helper.ParamInvalidError("start_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  374. }
  375. endTime, err := time.Parse(time.DateTime, endTimeStr)
  376. if err != nil {
  377. return helper.ParamInvalidError("end_time", fmt.Sprintf("需要 yyyy-MM-dd HH:mm:ss 格式: %v", err)), nil
  378. }
  379. data, err := repositories.QueryMqttLogListOnTimeRange(sn, domain.MqttCmdType(cmdType), startTime, endTime)
  380. if err != nil {
  381. return helper.ServiceError("查询MQTT日志", err), nil
  382. }
  383. if len(data) == 0 {
  384. return helper.EmptyResult("查询结果为空"), nil
  385. }
  386. return helper.JSONResultOrFileAuto(data), nil
  387. }
  388. func handleFwhQueryShutdownList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  389. dateStr, err := req.RequireString("date")
  390. if err != nil {
  391. return helper.ParamError("date"), nil
  392. }
  393. country := int(req.GetFloat("country", 0))
  394. // 验证日期格式
  395. if _, err := time.Parse("2006-01-02", dateStr); err != nil {
  396. return helper.ParamInvalidError("date", fmt.Sprintf("需要 yyyy-MM-dd 格式: %v", err)), nil
  397. }
  398. data, err := repositories.QuerySiteShutdownList(dateStr, country)
  399. if err != nil {
  400. return helper.ServiceError("查询停机列表", err), nil
  401. }
  402. if len(data) == 0 {
  403. return helper.EmptyResult("查询结果为空"), nil
  404. }
  405. return helper.JSONResultOrFileAuto(data), nil
  406. }
  407. func handleFwhQueryEmsLogRecord(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  408. sn, err := req.RequireString("sn")
  409. if err != nil {
  410. return helper.ParamError("sn"), nil
  411. }
  412. // 使用空日期和0类型查询所有记录
  413. data, err := repositories.QueryEmsLogCallRecord(sn, "", 0)
  414. if err != nil {
  415. // 如果是"没有召唤日志"的错误,返回空结果
  416. return helper.EmptyResult(fmt.Sprintf("未找到EMS日志记录: %v", err)), nil
  417. }
  418. return helper.JSONResultOrFileAuto(data), nil
  419. }
  420. func handleFwhQueryFaultRecordList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  421. sn, err := req.RequireString("sn")
  422. if err != nil {
  423. return helper.ParamError("sn"), nil
  424. }
  425. startTimeStr, err := req.RequireString("start_time")
  426. if err != nil {
  427. return helper.ParamError("start_time"), nil
  428. }
  429. endTimeStr, err := req.RequireString("end_time")
  430. if err != nil {
  431. return helper.ParamError("end_time"), nil
  432. }
  433. data, err := repositories.QueryFaultRecordList(sn, startTimeStr, endTimeStr)
  434. if err != nil {
  435. return helper.ServiceError("查询故障录波列表", err), nil
  436. }
  437. if len(data) == 0 {
  438. return helper.EmptyResult("查询结果为空"), nil
  439. }
  440. return helper.JSONResultOrFileAuto(data), nil
  441. }
  442. func handleFwhQueryFaultRecordCallableList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  443. sn, err := req.RequireString("sn")
  444. if err != nil {
  445. return helper.ParamError("sn"), nil
  446. }
  447. devType := int(req.GetFloat("dev_type", 1))
  448. data, err := repositories.QueryFaultRecordCallableList(devType, sn)
  449. if err != nil {
  450. return helper.ServiceError("查询可召唤故障录波列表", err), nil
  451. }
  452. if len(data) == 0 {
  453. return helper.EmptyResult("无可召唤的故障录波数据"), nil
  454. }
  455. return helper.JSONResultOrFileAuto(data), nil
  456. }
  457. func handleFwhQueryFaultRecordCallRecordList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  458. data, err := repositories.QueryFaultRecordCallRecordList()
  459. if err != nil {
  460. return helper.ServiceError("查询故障录波召唤记录", err), nil
  461. }
  462. if len(data) == 0 {
  463. return helper.EmptyResult("查询结果为空"), nil
  464. }
  465. return helper.JSONResultOrFileAuto(data), nil
  466. }
  467. func handleFwhQueryFaultRecordSubList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  468. faultIdStr, err := req.RequireString("fault_id")
  469. if err != nil {
  470. return helper.ParamError("fault_id"), nil
  471. }
  472. faultId, err := strconv.ParseInt(faultIdStr, 10, 64)
  473. if err != nil {
  474. return helper.ParamInvalidError("fault_id", "必须是数字"), nil
  475. }
  476. data, err := repositories.QueryFaultRecordSubList(faultId)
  477. if err != nil {
  478. return helper.ServiceError("查询故障录波子记录", err), nil
  479. }
  480. if len(data) == 0 {
  481. return helper.EmptyResult("查询结果为空"), nil
  482. }
  483. return helper.JSONResultOrFileAuto(data), nil
  484. }
  485. func handleFwhQuerySystemUpdateLog(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  486. sn, err := req.RequireString("sn")
  487. if err != nil {
  488. return helper.ParamError("sn"), nil
  489. }
  490. data, err := repositories.QuerySystemUpdateLog(sn)
  491. if err != nil {
  492. return helper.ServiceError("查询系统升级记录", err), nil
  493. }
  494. if len(data) == 0 {
  495. return helper.EmptyResult("查询结果为空"), nil
  496. }
  497. return helper.JSONResultOrFileAuto(data), nil
  498. }
  499. func handleFwhQuerySystemUpdateLogDetail(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  500. orderIdStr, err := req.RequireString("order_id")
  501. if err != nil {
  502. return helper.ParamError("order_id"), nil
  503. }
  504. orderId, err := strconv.ParseInt(orderIdStr, 10, 64)
  505. if err != nil {
  506. return helper.ParamInvalidError("order_id", "必须是数字"), nil
  507. }
  508. sn, err := req.RequireString("sn")
  509. if err != nil {
  510. return helper.ParamError("sn"), nil
  511. }
  512. data, err := repositories.QuerySystemUpdateLogDetail(orderId, sn)
  513. if err != nil {
  514. return helper.ServiceError("查询升级详情", err), nil
  515. }
  516. if len(data) == 0 {
  517. return helper.EmptyResult("查询结果为空"), nil
  518. }
  519. return helper.JSONResultOrFileAuto(data), nil
  520. }
  521. func handleFwhQueryAHubUpdateLog(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  522. sn, err := req.RequireString("sn")
  523. if err != nil {
  524. return helper.ParamError("sn"), nil
  525. }
  526. data, err := repositories.QueryAHubUpdateLog(sn)
  527. if err != nil {
  528. return helper.ServiceError("查询aHub升级记录", err), nil
  529. }
  530. if len(data) == 0 {
  531. return helper.EmptyResult("查询结果为空"), nil
  532. }
  533. return helper.JSONResultOrFileAuto(data), nil
  534. }
  535. func handleFwhQueryTouTemplateList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  536. search := req.GetString("search", "")
  537. page := uint(req.GetFloat("page", 1))
  538. size := uint(req.GetFloat("size", 20))
  539. data, err := repositories.QueryTouTemplateInfoList(search, size, page, nil, nil)
  540. if err != nil {
  541. return helper.ServiceError("查询TOU模板列表", err), nil
  542. }
  543. return helper.JSONResultOrFileAuto(data), nil
  544. }
  545. func handleFwhQueryTouTemplateDetail(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  546. idStr, err := req.RequireString("id")
  547. if err != nil {
  548. return helper.ParamError("id"), nil
  549. }
  550. id, err := strconv.ParseUint(idStr, 10, 64)
  551. if err != nil {
  552. return helper.ParamInvalidError("id", "必须是数字"), nil
  553. }
  554. data, err := repositories.QueryTouTemplateDetailInfo(uint(id))
  555. if err != nil {
  556. return helper.ServiceError("查询TOU模板详情", err), nil
  557. }
  558. if data == nil {
  559. return helper.EmptyResult("模板不存在"), nil
  560. }
  561. return helper.JSONResultOrFileAuto(data), nil
  562. }