| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- package service
- import (
- "context"
- "encoding/json"
- "github.com/mark3labs/mcp-go/mcp"
- "github.com/mark3labs/mcp-go/server"
- "fwh-toolbox-server/cmd/mcp/tools/helper"
- "fwh-toolbox-server/dto"
- "fwh-toolbox-server/services"
- )
- func registerTouTemplateTools(s *server.MCPServer) {
- s.AddTool(
- mcp.NewTool("service_tou_template_list",
- mcp.WithDescription("查询 TOU 电价模版列表,支持按类型、状态筛选和关键字搜索"),
- mcp.WithString("env", mcp.Description("目标服务器环境:pro-生产(默认) test-测试")),
- mcp.WithNumber("page", mcp.Description("页码,从1开始,默认1")),
- mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
- mcp.WithNumber("type", mcp.Description("模版类型:0-系统模板 1-API模板 2-用户推荐")),
- mcp.WithNumber("status", mcp.Description("发布状态:0-未发布 2-已发布")),
- mcp.WithString("search", mcp.Description("搜索关键字")),
- ),
- handleTouTemplateList,
- )
- s.AddTool(
- mcp.NewTool("service_tou_template_detail",
- mcp.WithDescription("查询指定 TOU 电价模版的详细信息"),
- mcp.WithString("env", mcp.Description("目标服务器环境:pro-生产(默认) test-测试")),
- mcp.WithNumber("id", mcp.Required(), mcp.Description("模版 ID")),
- ),
- handleTouTemplateDetail,
- )
- s.AddTool(
- mcp.NewTool("service_tou_template_save",
- mcp.WithDescription("新增或更新 TOU 电价模版(updateOrSaveIotTouTemplate),返回模版 ID [写操作]。"+
- "template.templateId 有值=更新,空=新增。当前仅支持测试环境(test)。"),
- mcp.WithString("env", mcp.Description("目标服务器环境:test-测试(默认,当前仅支持)")),
- mcp.WithString("payload", mcp.Required(),
- mcp.Description("模版请求体 JSON,结构:{\"template\":{...},\"strategyList\":[{...}],\"lang\":\"ZH_CN\"}。"+
- "template 含 countryId、provinceId、electricityType、name、mookRunCount、priority、env、templateId(更新时填)、sourceType 等(均为数值,字符串字段除外);"+
- "strategyList[].detailVoList[] 为时段明细,含 startHourTime/endHourTime(HH:mm)、waveType、solarPriority/loadPriority(\"市电,负载,FHP\")、各功率(kW,数值)、SOC(%,数值) 等;数值字段传数字,可选数值字段未设置时省略该 key(不传空串或 null)。")),
- ),
- handleTouTemplateSave,
- )
- s.AddTool(
- mcp.NewTool("service_tou_template_cites",
- mcp.WithDescription("查询国家/省/市列表(selectCitesList)。不传 country_id 和 type 时查询国家信息;"+
- "查询某国家下的省/市(用于填写模版的 countryId/provinceId)时需传 country_id,且 TOU 模版场景 type 必须为 1。当前仅支持测试环境(test)。"),
- mcp.WithString("env", mcp.Description("目标服务器环境:test-测试(默认,当前仅支持)")),
- mcp.WithNumber("country_id", mcp.Description("国家 ID。不传则查询国家信息")),
- mcp.WithNumber("type", mcp.Description("查询类型,与页面相关;TOU 模版查询省/市时必须为 1。不传则不带该参数(配合不传 country_id 查国家)")),
- ),
- handleTouTemplateCites,
- )
- }
- // isTestEnv 判断请求指定的目标环境是否为测试环境(test)。
- // 默认返回 defaultTest 指定的默认值。
- func isTestEnv(req mcp.CallToolRequest, defaultEnv string) bool {
- return req.GetString("env", defaultEnv) == "test"
- }
- func handleTouTemplateList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- page := uint(req.GetFloat("page", 1))
- size := uint(req.GetFloat("size", 10))
- search := req.GetString("search", "")
- var tempType *int
- if v, err := req.RequireFloat("type"); err == nil {
- t := int(v)
- tempType = &t
- }
- var status *int
- if v, err := req.RequireFloat("status"); err == nil {
- s := int(v)
- status = &s
- }
- var data *dto.ResPage[interface{}]
- var err error
- if isTestEnv(req, "pro") {
- data, err = services.FwhTestGetTouTemplateProList(page, size, tempType, status, search)
- } else {
- data, err = services.GetTouTemplateProList(page, size, tempType, status, search)
- }
- if err != nil {
- return helper.ServiceError("查询TOU模版列表", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleTouTemplateDetail(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- id, err := req.RequireFloat("id")
- if err != nil {
- return helper.ParamError("id"), nil
- }
- var data *interface{}
- if isTestEnv(req, "pro") {
- data, err = services.FwhTestGetTouTemplateProDetailInfo(uint(id))
- } else {
- data, err = services.GetTouTemplateProDetailInfo(uint(id))
- }
- if err != nil {
- return helper.ServiceError("查询TOU模版详情", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleTouTemplateSave(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- if !isTestEnv(req, "test") {
- return helper.ParamInvalidError("env", "保存TOU模版当前仅支持测试环境(test)"), nil
- }
- payloadStr, err := req.RequireString("payload")
- if err != nil {
- return helper.ParamError("payload"), nil
- }
- var payload dto.FwhTestUpdateOrSaveTouTemplatePayload
- if err := json.Unmarshal([]byte(payloadStr), &payload); err != nil {
- return helper.ParamInvalidError("payload", "需要有效的JSON格式"), nil
- }
- templateId, err := services.FwhTestSaveTouTemplate(payload)
- if err != nil {
- return helper.ServiceError("保存TOU模版", err), nil
- }
- return helper.JSONResultOrFileAuto(map[string]interface{}{
- "templateId": templateId,
- "message": "TOU模版保存成功",
- }), nil
- }
- func handleTouTemplateCites(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- if !isTestEnv(req, "test") {
- return helper.ParamInvalidError("env", "查询省/市列表当前仅支持测试环境(test)"), nil
- }
- // country_id、type 均为可选:都不传时查询国家信息。
- var countryId *int
- if v, err := req.RequireFloat("country_id"); err == nil {
- c := int(v)
- countryId = &c
- }
- var cityType *int
- if v, err := req.RequireFloat("type"); err == nil {
- t := int(v)
- cityType = &t
- }
- data, err := services.FwhTestGetTouTemplateCitesList(countryId, cityType)
- if err != nil {
- return helper.ServiceError("查询省/市列表", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
|