Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

get_date_range.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package tools
  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. },
  24. "required": []string{"unit", "offset"},
  25. },
  26. func(input json.RawMessage, deps *mcp.ToolDependencies) (interface{}, error) {
  27. var params struct {
  28. Unit string `json:"unit"`
  29. Offset int `json:"offset"`
  30. }
  31. log.Printf("AI 调用工具-get_date_range: %s", time.Now())
  32. if len(input) > 0 {
  33. if err := json.Unmarshal(input, &params); err != nil {
  34. return nil, err
  35. }
  36. }
  37. now := time.Now()
  38. var startDate, endDate time.Time
  39. switch params.Unit {
  40. case "day":
  41. targetDate := now.AddDate(0, 0, params.Offset)
  42. startDate = targetDate
  43. endDate = targetDate
  44. case "week":
  45. weekStart := getWeekStart(now)
  46. targetWeekStart := weekStart.AddDate(0, 0, params.Offset*7)
  47. targetWeekEnd := targetWeekStart.AddDate(0, 0, 6)
  48. startDate = targetWeekStart
  49. endDate = targetWeekEnd
  50. case "month":
  51. targetMonth := now.AddDate(0, params.Offset, 0)
  52. monthStart := time.Date(targetMonth.Year(), targetMonth.Month(), 1, 0, 0, 0, 0, targetMonth.Location())
  53. monthEnd := monthStart.AddDate(0, 1, -1)
  54. startDate = monthStart
  55. endDate = monthEnd
  56. case "quarter":
  57. // 基于当前季度偏移
  58. currentMonth := int(now.Month())
  59. currentQuarter := (currentMonth-1)/3 + 1
  60. targetQuarter := currentQuarter + params.Offset
  61. targetYear := now.Year()
  62. // 处理跨年
  63. if targetQuarter < 1 {
  64. yearsBack := (1 - targetQuarter + 3) / 4
  65. targetYear -= yearsBack
  66. targetQuarter += yearsBack * 4
  67. } else if targetQuarter > 4 {
  68. yearsForward := (targetQuarter - 1) / 4
  69. targetYear += yearsForward
  70. targetQuarter -= yearsForward * 4
  71. }
  72. // 计算季度范围
  73. quarterStartMonth := time.Month((targetQuarter-1)*3 + 1)
  74. startDate = time.Date(targetYear, quarterStartMonth, 1, 0, 0, 0, 0, now.Location())
  75. endDate = time.Date(targetYear, quarterStartMonth+3, 0, 0, 0, 0, 0, now.Location())
  76. case "year":
  77. targetYear := now.AddDate(params.Offset, 0, 0)
  78. yearStart := time.Date(targetYear.Year(), 1, 1, 0, 0, 0, 0, targetYear.Location())
  79. yearEnd := time.Date(targetYear.Year(), 12, 31, 0, 0, 0, 0, targetYear.Location())
  80. startDate = yearStart
  81. endDate = yearEnd
  82. default:
  83. startDate = now
  84. endDate = now
  85. }
  86. return map[string]interface{}{
  87. "unit": params.Unit,
  88. "offset": params.Offset,
  89. "start_date": startDate.Format("2006-01-02"),
  90. "end_date": endDate.Format("2006-01-02"),
  91. }, nil
  92. },
  93. )
  94. }
  95. func getWeekStart(t time.Time) time.Time {
  96. weekday := int(t.Weekday())
  97. if weekday == 0 {
  98. return t.AddDate(0, 0, -6)
  99. }
  100. return t.AddDate(0, 0, -(weekday - 1))
  101. }