tou_template.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "github.com/mark3labs/mcp-go/server"
  7. "fwh-toolbox-server/cmd/mcp/tools/helper"
  8. "fwh-toolbox-server/dto"
  9. "fwh-toolbox-server/services"
  10. )
  11. func registerTouTemplateTools(s *server.MCPServer) {
  12. s.AddTool(
  13. mcp.NewTool("service_tou_template_list",
  14. mcp.WithDescription("查询 TOU 电价模版列表,支持按类型、状态筛选和关键字搜索"),
  15. mcp.WithString("env", mcp.Description("目标服务器环境:pro-生产(默认) test-测试")),
  16. mcp.WithNumber("page", mcp.Description("页码,从1开始,默认1")),
  17. mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
  18. mcp.WithNumber("type", mcp.Description("模版类型:0-系统模板 1-API模板 2-用户推荐")),
  19. mcp.WithNumber("status", mcp.Description("发布状态:0-未发布 2-已发布")),
  20. mcp.WithString("search", mcp.Description("搜索关键字")),
  21. ),
  22. handleTouTemplateList,
  23. )
  24. s.AddTool(
  25. mcp.NewTool("service_tou_template_detail",
  26. mcp.WithDescription("查询指定 TOU 电价模版的详细信息"),
  27. mcp.WithString("env", mcp.Description("目标服务器环境:pro-生产(默认) test-测试")),
  28. mcp.WithNumber("id", mcp.Required(), mcp.Description("模版 ID")),
  29. ),
  30. handleTouTemplateDetail,
  31. )
  32. s.AddTool(
  33. mcp.NewTool("service_tou_template_save",
  34. mcp.WithDescription("新增或更新 TOU 电价模版(updateOrSaveIotTouTemplate),返回模版 ID [写操作]。"+
  35. "template.templateId 有值=更新,空=新增。当前仅支持测试环境(test)。"),
  36. mcp.WithString("env", mcp.Description("目标服务器环境:test-测试(默认,当前仅支持)")),
  37. mcp.WithString("payload", mcp.Required(),
  38. mcp.Description("模版请求体 JSON,结构:{\"template\":{...},\"strategyList\":[{...}],\"lang\":\"ZH_CN\"}。"+
  39. "template 含 countryId、provinceId、electricityType、name、mookRunCount、priority、env、templateId(更新时填)、sourceType 等(均为数值,字符串字段除外);"+
  40. "strategyList[].detailVoList[] 为时段明细,含 startHourTime/endHourTime(HH:mm)、waveType、solarPriority/loadPriority(\"市电,负载,FHP\")、各功率(kW,数值)、SOC(%,数值) 等;数值字段传数字,可选数值字段未设置时省略该 key(不传空串或 null)。")),
  41. ),
  42. handleTouTemplateSave,
  43. )
  44. s.AddTool(
  45. mcp.NewTool("service_tou_template_cites",
  46. mcp.WithDescription("查询国家/省/市列表(selectCitesList)。不传 country_id 和 type 时查询国家信息;"+
  47. "查询某国家下的省/市(用于填写模版的 countryId/provinceId)时需传 country_id,且 TOU 模版场景 type 必须为 1。当前仅支持测试环境(test)。"),
  48. mcp.WithString("env", mcp.Description("目标服务器环境:test-测试(默认,当前仅支持)")),
  49. mcp.WithNumber("country_id", mcp.Description("国家 ID。不传则查询国家信息")),
  50. mcp.WithNumber("type", mcp.Description("查询类型,与页面相关;TOU 模版查询省/市时必须为 1。不传则不带该参数(配合不传 country_id 查国家)")),
  51. ),
  52. handleTouTemplateCites,
  53. )
  54. }
  55. // isTestEnv 判断请求指定的目标环境是否为测试环境(test)。
  56. // 默认返回 defaultTest 指定的默认值。
  57. func isTestEnv(req mcp.CallToolRequest, defaultEnv string) bool {
  58. return req.GetString("env", defaultEnv) == "test"
  59. }
  60. func handleTouTemplateList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  61. page := uint(req.GetFloat("page", 1))
  62. size := uint(req.GetFloat("size", 10))
  63. search := req.GetString("search", "")
  64. var tempType *int
  65. if v, err := req.RequireFloat("type"); err == nil {
  66. t := int(v)
  67. tempType = &t
  68. }
  69. var status *int
  70. if v, err := req.RequireFloat("status"); err == nil {
  71. s := int(v)
  72. status = &s
  73. }
  74. var data *dto.ResPage[interface{}]
  75. var err error
  76. if isTestEnv(req, "pro") {
  77. data, err = services.FwhTestGetTouTemplateProList(page, size, tempType, status, search)
  78. } else {
  79. data, err = services.GetTouTemplateProList(page, size, tempType, status, search)
  80. }
  81. if err != nil {
  82. return helper.ServiceError("查询TOU模版列表", err), nil
  83. }
  84. return helper.JSONResultOrFileAuto(data), nil
  85. }
  86. func handleTouTemplateDetail(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  87. id, err := req.RequireFloat("id")
  88. if err != nil {
  89. return helper.ParamError("id"), nil
  90. }
  91. var data *interface{}
  92. if isTestEnv(req, "pro") {
  93. data, err = services.FwhTestGetTouTemplateProDetailInfo(uint(id))
  94. } else {
  95. data, err = services.GetTouTemplateProDetailInfo(uint(id))
  96. }
  97. if err != nil {
  98. return helper.ServiceError("查询TOU模版详情", err), nil
  99. }
  100. return helper.JSONResultOrFileAuto(data), nil
  101. }
  102. func handleTouTemplateSave(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  103. if !isTestEnv(req, "test") {
  104. return helper.ParamInvalidError("env", "保存TOU模版当前仅支持测试环境(test)"), nil
  105. }
  106. payloadStr, err := req.RequireString("payload")
  107. if err != nil {
  108. return helper.ParamError("payload"), nil
  109. }
  110. var payload dto.FwhTestUpdateOrSaveTouTemplatePayload
  111. if err := json.Unmarshal([]byte(payloadStr), &payload); err != nil {
  112. return helper.ParamInvalidError("payload", "需要有效的JSON格式"), nil
  113. }
  114. templateId, err := services.FwhTestSaveTouTemplate(payload)
  115. if err != nil {
  116. return helper.ServiceError("保存TOU模版", err), nil
  117. }
  118. return helper.JSONResultOrFileAuto(map[string]interface{}{
  119. "templateId": templateId,
  120. "message": "TOU模版保存成功",
  121. }), nil
  122. }
  123. func handleTouTemplateCites(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  124. if !isTestEnv(req, "test") {
  125. return helper.ParamInvalidError("env", "查询省/市列表当前仅支持测试环境(test)"), nil
  126. }
  127. // country_id、type 均为可选:都不传时查询国家信息。
  128. var countryId *int
  129. if v, err := req.RequireFloat("country_id"); err == nil {
  130. c := int(v)
  131. countryId = &c
  132. }
  133. var cityType *int
  134. if v, err := req.RequireFloat("type"); err == nil {
  135. t := int(v)
  136. cityType = &t
  137. }
  138. data, err := services.FwhTestGetTouTemplateCitesList(countryId, cityType)
  139. if err != nil {
  140. return helper.ServiceError("查询省/市列表", err), nil
  141. }
  142. return helper.JSONResultOrFileAuto(data), nil
  143. }