format.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package util
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "github.com/mark3labs/mcp-go/mcp"
  7. "github.com/mark3labs/mcp-go/server"
  8. "fwh-toolbox-server/cmd/mcp/tools/helper"
  9. )
  10. func registerFormatTools(s *server.MCPServer) {
  11. s.AddTool(
  12. mcp.NewTool("util_parse_sn",
  13. mcp.WithDescription(`解析 FranklinWH 设备 SN 序列号的含义。
  14. SN 格式: {产品代码}{版本}{工厂}{年}{周}{序号}
  15. 示例: 10060006A03X25310091
  16. - 1006: 产品代码 (aGate=1006, aPower=1005, aHub/PowerLink=1002)
  17. - 0006: 硬件版本
  18. - A: 工厂代码
  19. - 03: 版本标识
  20. - X: 预留
  21. - 25: 年份(2025)
  22. - 31: 周数
  23. - 0091: 序号`),
  24. mcp.WithString("sn", mcp.Required(), mcp.Description("设备 SN 序列号")),
  25. ),
  26. handleParseSN,
  27. )
  28. }
  29. func handleParseSN(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  30. sn, err := req.RequireString("sn")
  31. if err != nil {
  32. return helper.ParamError("sn"), nil
  33. }
  34. sn = strings.TrimSpace(sn)
  35. if len(sn) < 20 {
  36. return helper.ParamInvalidError("sn", "SN 长度不足,标准长度为 20 位"), nil
  37. }
  38. // 解析产品类型
  39. productCode := sn[0:4]
  40. var productName string
  41. switch productCode {
  42. case "1006":
  43. productName = "aGate (网关)"
  44. case "1005":
  45. productName = "aPower (储能电池)"
  46. case "1002":
  47. productName = "aHub / PowerLink"
  48. case "1003":
  49. productName = "MPPT"
  50. default:
  51. productName = "未知产品"
  52. }
  53. hwVersion := sn[4:8]
  54. factory := string(sn[8])
  55. verFlag := sn[9:11]
  56. year := sn[12:14]
  57. week := sn[14:16]
  58. serial := sn[16:]
  59. result := map[string]any{
  60. "sn": sn,
  61. "productCode": productCode,
  62. "productName": productName,
  63. "hwVersion": hwVersion,
  64. "factory": factory,
  65. "versionFlag": verFlag,
  66. "year": fmt.Sprintf("20%s", year),
  67. "week": week,
  68. "serialNumber": serial,
  69. "summary": fmt.Sprintf("%s | HW:%s | 工厂:%s | 20%s年第%s周 | 序号:%s",
  70. productName, hwVersion, factory, year, week, serial),
  71. }
  72. return helper.JSONResultOrFileAuto(result), nil
  73. }