Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

get_date_range.go 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package commons
  2. import (
  3. "encoding/json"
  4. "log"
  5. "time"
  6. "git.x2erp.com/qdy/go-svc-mcp/internal/mcp"
  7. )
  8. func init() {
  9. mcp.Register("get_date_range", "根据时间单位和偏移量计算日期范围",
  10. map[string]interface{}{
  11. "type": "object",
  12. "properties": map[string]interface{}{
  13. "unit": map[string]interface{}{
  14. "type": "string",
  15. "description": "时间单位",
  16. "enum": []string{"day", "week", "month", "quarter", "year"},
  17. },
  18. "offset": map[string]interface{}{
  19. "type": "integer",
  20. "description": "偏移量(负数表示过去,正数表示未来)",
  21. "default": 0,
  22. },
  23. "sessionID": map[string]interface{}{
  24. "type": "string",
  25. "description": "用户会话id",
  26. },
  27. },
  28. "required": []string{"unit", "offset"},
  29. },
  30. func(input json.RawMessage, deps *mcp.ToolDependencies) (interface{}, error) {
  31. var params struct {
  32. Unit string `json:"unit"`
  33. Offset int `json:"offset"`
  34. SessionID string `json:"session_id"`
  35. }
  36. log.Printf("AI 调用工具-get_date_range: %s", time.Now())
  37. if len(input) > 0 {
  38. if err := json.Unmarshal(input, &params); err != nil {
  39. return nil, err
  40. }
  41. }
  42. log.Printf("AI params调用工具-get_date_range: %v", params)
  43. now := time.Now()
  44. var startDate, endDate time.Time
  45. switch params.Unit {
  46. case "day":
  47. targetDate := now.AddDate(0, 0, params.Offset)
  48. startDate = targetDate
  49. endDate = targetDate
  50. case "week":
  51. weekStart := getWeekStart(now)
  52. targetWeekStart := weekStart.AddDate(0, 0, params.Offset*7)
  53. targetWeekEnd := targetWeekStart.AddDate(0, 0, 6)
  54. startDate = targetWeekStart
  55. endDate = targetWeekEnd
  56. case "month":
  57. targetMonth := now.AddDate(0, params.Offset, 0)
  58. monthStart := time.Date(targetMonth.Year(), targetMonth.Month(), 1, 0, 0, 0, 0, targetMonth.Location())
  59. monthEnd := monthStart.AddDate(0, 1, -1)
  60. startDate = monthStart
  61. endDate = monthEnd
  62. case "quarter":
  63. // 基于当前季度偏移
  64. currentMonth := int(now.Month())
  65. currentQuarter := (currentMonth-1)/3 + 1
  66. targetQuarter := currentQuarter + params.Offset
  67. targetYear := now.Year()
  68. // 处理跨年
  69. if targetQuarter < 1 {
  70. yearsBack := (1 - targetQuarter + 3) / 4
  71. targetYear -= yearsBack
  72. targetQuarter += yearsBack * 4
  73. } else if targetQuarter > 4 {
  74. yearsForward := (targetQuarter - 1) / 4
  75. targetYear += yearsForward
  76. targetQuarter -= yearsForward * 4
  77. }
  78. // 计算季度范围
  79. quarterStartMonth := time.Month((targetQuarter-1)*3 + 1)
  80. startDate = time.Date(targetYear, quarterStartMonth, 1, 0, 0, 0, 0, now.Location())
  81. endDate = time.Date(targetYear, quarterStartMonth+3, 0, 0, 0, 0, 0, now.Location())
  82. case "year":
  83. targetYear := now.AddDate(params.Offset, 0, 0)
  84. yearStart := time.Date(targetYear.Year(), 1, 1, 0, 0, 0, 0, targetYear.Location())
  85. yearEnd := time.Date(targetYear.Year(), 12, 31, 0, 0, 0, 0, targetYear.Location())
  86. startDate = yearStart
  87. endDate = yearEnd
  88. default:
  89. startDate = now
  90. endDate = now
  91. }
  92. return map[string]interface{}{
  93. "unit": params.Unit,
  94. "offset": params.Offset,
  95. "start_date": startDate.Format("2006-01-02"),
  96. "end_date": endDate.Format("2006-01-02"),
  97. }, nil
  98. },
  99. )
  100. }
  101. func getWeekStart(t time.Time) time.Time {
  102. weekday := int(t.Weekday())
  103. if weekday == 0 {
  104. return t.AddDate(0, 0, -6)
  105. }
  106. return t.AddDate(0, 0, -(weekday - 1))
  107. }