diff --git a/config/config.yaml b/config/config.yaml index f8057ef..c0f2035 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -30,5 +30,19 @@ db: tools: zltxOrderDetail: enabled: true - base_url: "https://gateway.dev.cdlsxd.cn/" + base_url: "https://gateway.dev.cdlsxd.cn/zltx_api/admin/direct/ai/" + api_key: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyQ2VudGVyIiwiZXhwIjoxNzU4MDkxOTU4LCJuYmYiOjE3NTgwOTAxNTgsImp0aSI6IjEiLCJQaG9uZSI6IjE4MDAwMDAwMDAwIiwiVXNlck5hbWUiOiJsc3hkIiwiUmVhbE5hbWUiOiLotoXnuqfnrqHnkIblkZgiLCJBY2NvdW50VHlwZSI6MSwiR3JvdXBDb2RlcyI6IlZDTF9DQVNISUVSLFZDTF9PUEVSQVRFLFZDTF9BRE1JTixWQ0xfQUFBLFZDTF9WQ0xfT1BFUkFULFZDTF9JTlZPSUNFLENSTV9BRE1JTixMSUFOTElBTl9BRE1JTixNQVJLRVRNQUcyX0FETUlOLFBIT05FQklMTF9BRE1JTixRSUFOWkhVX1NVUFBFUl9BRE0sTUFSS0VUSU5HU0FBU19TVVBFUkFETUlOLENBUkRfQ09ERSxDQVJEX1BST0NVUkVNRU5ULE1BUktFVElOR1NZU1RFTV9TVVBFUixTVEFUSVNUSUNBTFNZU1RFTV9BRE1JTixaTFRYX0FETUlOLFpMVFhfT1BFUkFURSIsIkRpbmdVc2VySWQiOiIxNjIwMjYxMjMwMjg5MzM4MzQifQ.Bjsx9f8yfcrV9EWxb0n6POwnXVOq9XPRD78JFZnnf1_VAVMN78W4W570SZL27PWuDnkD7E4oUg6RzeZwZgl7BZrNpNr-a-QpNC5qCptqrqXeNfVStmX7pxWA8GqnzI8ybkZgbhQ58Gje7DzdJtBq_8zte_LDaYhTYXdIc5EAG0AbCzAk22nPTl47nkMeHtmisXQVLEsdibl1hW3ViFJlXwfXvUrOENItmL1_mRYkggUB0MaTu2nHJOYM6PaOVGLHx-74eepnmK2rm6konFEb6ed-Ukc6gVR-nM9yWZaYLYNGNKJLwZoCX3tRuerq74n4kzQgWmUEJeaVI1yIGSw1zw" + zltxOrderDirectLog: + enabled: true + base_url: "https://gateway.dev.cdlsxd.cn/zltx_api/admin/direct/log/" api_key: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyQ2VudGVyIiwiZXhwIjoxNzU2MTgyNTM1LCJuYmYiOjE3NTYxODA3MzUsImp0aSI6IjEiLCJQaG9uZSI6IjE4MDAwMDAwMDAwIiwiVXNlck5hbWUiOiJsc3hkIiwiUmVhbE5hbWUiOiLotoXnuqfnrqHnkIblkZgiLCJBY2NvdW50VHlwZSI6MSwiR3JvdXBDb2RlcyI6IlZDTF9DQVNISUVSLFZDTF9PUEVSQVRFLFZDTF9BRE1JTixWQ0xfQUFBLFZDTF9WQ0xfT1BFUkFULFZDTF9JTlZPSUNFLENSTV9BRE1JTixMSUFOTElBTl9BRE1JTixNQVJLRVRNQUcyX0FETUlOLFBIT05FQklMTF9BRE1JTixRSUFOWkhVX1NVUFBFUl9BRE0sTUFSS0VUSU5HU0FBU19TVVBFUkFETUlOLENBUkRfQ09ERSxDQVJEX1BST0NVUkVNRU5ULE1BUktFVElOR1NZU1RFTV9TVVBFUixTVEFUSVNUSUNBTFNZU1RFTV9BRE1JTixaTFRYX0FETUlOLFpMVFhfT1BFUkFURSIsIkRpbmdVc2VySWQiOiIxNjIwMjYxMjMwMjg5MzM4MzQifQ.N1xv1PYbcO8_jR5adaczc16YzGsr4z101gwEZdulkRaREBJNYTOnFrvRxTFx3RJTooXsqTqroE1MR84v_1WPX6BS6kKonA-kC1Jgot6yrt5rFWhGNGb2Cpr9rKIFCCQYmiGd3AUgDazEeaQ0_sodv3E-EXg9VfE1SX8nMcck9Yjnc8NCy7RTWaBIaSeOdZcEl-JfCD0S6GSx3oErp_hk-U9FKGwf60wAuDGTY1R0BP4BYpcEqS-C2LSnsSGyURi54Cuk5xH8r1WuF0Dm5bwAj5d7Hvs77-N_sUF-C5ONqyZJRAEhYLgcmN9RX_WQZfizdQJxizlTczdpzYfy-v-1eQ" + zltxProduct: + enabled: true + base_url: "https://gateway.dev.cdlsxd.cn/zltx_api/admin/oursProduct/" + add_url: "https://gateway.dev.cdlsxd.cn/zltx_api/admin/platformProduct/" + api_key: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyQ2VudGVyIiwiZXhwIjoxNzU2MTgyNTM1LCJuYmYiOjE3NTYxODA3MzUsImp0aSI6IjEiLCJQaG9uZSI6IjE4MDAwMDAwMDAwIiwiVXNlck5hbWUiOiJsc3hkIiwiUmVhbE5hbWUiOiLotoXnuqfnrqHnkIblkZgiLCJBY2NvdW50VHlwZSI6MSwiR3JvdXBDb2RlcyI6IlZDTF9DQVNISUVSLFZDTF9PUEVSQVRFLFZDTF9BRE1JTixWQ0xfQUFBLFZDTF9WQ0xfT1BFUkFULFZDTF9JTlZPSUNFLENSTV9BRE1JTixMSUFOTElBTl9BRE1JTixNQVJLRVRNQUcyX0FETUlOLFBIT05FQklMTF9BRE1JTixRSUFOWkhVX1NVUFBFUl9BRE0sTUFSS0VUSU5HU0FBU19TVVBFUkFETUlOLENBUkRfQ09ERSxDQVJEX1BST0NVUkVNRU5ULE1BUktFVElOR1NZU1RFTV9TVVBFUixTVEFUSVNUSUNBTFNZU1RFTV9BRE1JTixaTFRYX0FETUlOLFpMVFhfT1BFUkFURSIsIkRpbmdVc2VySWQiOiIxNjIwMjYxMjMwMjg5MzM4MzQifQ.N1xv1PYbcO8_jR5adaczc16YzGsr4z101gwEZdulkRaREBJNYTOnFrvRxTFx3RJTooXsqTqroE1MR84v_1WPX6BS6kKonA-kC1Jgot6yrt5rFWhGNGb2Cpr9rKIFCCQYmiGd3AUgDazEeaQ0_sodv3E-EXg9VfE1SX8nMcck9Yjnc8NCy7RTWaBIaSeOdZcEl-JfCD0S6GSx3oErp_hk-U9FKGwf60wAuDGTY1R0BP4BYpcEqS-C2LSnsSGyURi54Cuk5xH8r1WuF0Dm5bwAj5d7Hvs77-N_sUF-C5ONqyZJRAEhYLgcmN9RX_WQZfizdQJxizlTczdpzYfy-v-1eQ" + zltxOrderStatistics: + base_url: "https://gateway.dev.cdlsxd.cn/zltx_api/admin/direct/ai/search/" + enabled: true + api_key: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyQ2VudGVyIiwiZXhwIjoxNzU2MTgyNTM1LCJuYmYiOjE3NTYxODA3MzUsImp0aSI6IjEiLCJQaG9uZSI6IjE4MDAwMDAwMDAwIiwiVXNlck5hbWUiOiJsc3hkIiwiUmVhbE5hbWUiOiLotoXnuqfnrqHnkIblkZgiLCJBY2NvdW50VHlwZSI6MSwiR3JvdXBDb2RlcyI6IlZDTF9DQVNISUVSLFZDTF9PUEVSQVRFLFZDTF9BRE1JTixWQ0xfQUFBLFZDTF9WQ0xfT1BFUkFULFZDTF9JTlZPSUNFLENSTV9BRE1JTixMSUFOTElBTl9BRE1JTixNQVJLRVRNQUcyX0FETUlOLFBIT05FQklMTF9BRE1JTixRSUFOWkhVX1NVUFBFUl9BRE0sTUFSS0VUSU5HU0FBU19TVVBFUkFETUlOLENBUkRfQ09ERSxDQVJEX1BST0NVUkVNRU5ULE1BUktFVElOR1NZU1RFTV9TVVBFUixTVEFUSVNUSUNBTFNZU1RFTV9BRE1JTixaTFRYX0FETUlOLFpMVFhfT1BFUkFURSIsIkRpbmdVc2VySWQiOiIxNjIwMjYxMjMwMjg5MzM4MzQifQ.N1xv1PYbcO8_jR5adaczc16YzGsr4z101gwEZdulkRaREBJNYTOnFrvRxTFx3RJTooXsqTqroE1MR84v_1WPX6BS6kKonA-kC1Jgot6yrt5rFWhGNGb2Cpr9rKIFCCQYmiGd3AUgDazEeaQ0_sodv3E-EXg9VfE1SX8nMcck9Yjnc8NCy7RTWaBIaSeOdZcEl-JfCD0S6GSx3oErp_hk-U9FKGwf60wAuDGTY1R0BP4BYpcEqS-C2LSnsSGyURi54Cuk5xH8r1WuF0Dm5bwAj5d7Hvs77-N_sUF-C5ONqyZJRAEhYLgcmN9RX_WQZfizdQJxizlTczdpzYfy-v-1eQ" + diff --git a/internal/biz/router_test.go b/internal/biz/router_test.go index 7d75674..b636e90 100644 --- a/internal/biz/router_test.go +++ b/internal/biz/router_test.go @@ -44,6 +44,14 @@ func Test_Order(t *testing.T) { t.Log(err) } +func Test_OrderLog(t *testing.T) { + routerBiz := in() + ch := make(chan []byte, 5) + defer close(ch) + err := routerBiz.handleTask(ch, nil, &entitys.Match{Index: "order_diagnosis", Parameters: `{"order_number":"822979421673758721","serial_number":"822979421979938817"}`}, &model.AiTask{Config: `{"tool": "zltxOrderDirectLog", "param": {"type": "object", "optional": [], "required": ["order_number"], "properties": {"order_number": {"type": "string", "description": "订单编号/流水号"}}}}`}) + t.Log(err) +} + func in() *AiRouterBiz { modDir, err := getModuleDir() if err != nil { diff --git a/internal/config/config.go b/internal/config/config.go index c3c75c9..6a3ad43 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -64,11 +64,15 @@ type DB struct { // ToolsConfig 工具配置 type ToolsConfig struct { - Weather ToolConfig `mapstructure:"weather"` - Calculator ToolConfig `mapstructure:"calculator"` - ZltxOrderDetail ToolConfig `mapstructure:"zltxOrderDetail"` - ZltxOrderLog ToolConfig `mapstructure:"zltxOrderLog"` - Knowledge ToolConfig `mapstructure:"knowledge"` + Weather ToolConfig `mapstructure:"weather"` + Calculator ToolConfig `mapstructure:"calculator"` + ZltxOrderDetail ToolConfig `mapstructure:"zltxOrderDetail"` + ZltxOrderDirectLog ToolConfig `mapstructure:"zltxOrderDirectLog"` + Knowledge ToolConfig `mapstructure:"knowledge"` + //通过ID获取我们的商品信息 + ZltxProduct ToolConfig `mapstructure:"zltxProduct"` + //通过账号获取订单统计信息 + ZltxOrderStatistics ToolConfig `mapstructure:"zltxOrderStatistics"` } // ToolConfig 单个工具配置 @@ -76,6 +80,8 @@ type ToolConfig struct { Enabled bool `mapstructure:"enabled"` BaseURL string `mapstructure:"base_url"` APIKey string `mapstructure:"api_key"` + //附加地址 + AddURL string `mapstructure:"add_url"` } // LoggingConfig 日志配置 diff --git a/internal/tools/manager.go b/internal/tools/manager.go index 4e4e1fe..d4a86d9 100644 --- a/internal/tools/manager.go +++ b/internal/tools/manager.go @@ -49,12 +49,22 @@ func NewManager(config *config.Config, llm *utils_ollama.Client) *Manager { m.tools[zltxOrderDetailTool.Name()] = zltxOrderDetailTool } - // 注册直连天下订单日志工具 - // if config.ZltxOrderLog.Enabled { - // zltxOrderLogTool := NewZltxOrderLogTool(config.ZltxOrderLog) - // m.tools[zltxOrderLogTool.Name()] = zltxOrderLogTool - // } + //注册直连天下订单日志工具 + if config.Tools.ZltxOrderDirectLog.Enabled { + zltxOrderLogTool := NewZltxOrderLogTool(config.Tools.ZltxOrderDirectLog) + m.tools[zltxOrderLogTool.Name()] = zltxOrderLogTool + } + //注册直连天下商品工具 + if config.Tools.ZltxProduct.Enabled { + zltxProductTool := NewZltxProductTool(config.Tools.ZltxProduct) + m.tools[zltxProductTool.Name()] = zltxProductTool + } + //注册直连天下订单统计工具 + if config.Tools.ZltxOrderStatistics.Enabled { + zltxOrderStatisticsTool := NewZltxOrderStatisticsTool(config.Tools.ZltxOrderStatistics) + m.tools[zltxOrderStatisticsTool.Name()] = zltxOrderStatisticsTool + } return m } diff --git a/internal/tools/zltx_order_direct_log.go b/internal/tools/zltx_order_direct_log.go new file mode 100644 index 0000000..abd9ec5 --- /dev/null +++ b/internal/tools/zltx_order_direct_log.go @@ -0,0 +1,121 @@ +package tools + +import ( + "ai_scheduler/internal/config" + "ai_scheduler/internal/entitys" + "encoding/json" + "fmt" + "gitea.cdlsxd.cn/self-tools/l_request" + "github.com/gofiber/websocket/v2" +) + +type ZltxOrderLogTool struct { + config config.ToolConfig +} + +func (t *ZltxOrderLogTool) Name() string { + return "zltxOrderDirectLog" +} + +func (t *ZltxOrderLogTool) Description() string { + return "查询订单日志" +} + +func (t *ZltxOrderLogTool) Definition() entitys.ToolDefinition { + return entitys.ToolDefinition{ + Type: "function", + Function: entitys.FunctionDef{ + Name: t.Name(), + Description: t.Description(), + Parameters: map[string]interface{}{ + "type": "object", + "properties": map[string]interface{}{ + "order_number": map[string]interface{}{ + "type": "string", + "description": "订单编号", + }, + "serial_number": map[string]interface{}{ + "type": "string", + "description": "流水号", + }, + }, + "required": []string{"order_number", "serial_number"}, + }, + }, + } +} + +// ZltxOrderDetailRequest 直连天下订单详情请求参数 +type ZltxOrderLogRequest struct { + OrderNumber string `json:"order_number"` + SerialNumber string `json:"serial_number"` +} + +// ZltxOrderDetailResponse 直连天下订单详情响应 +type ZltxOrderDirectLogResponse struct { + Code int `json:"code"` + Error string `json:"error"` + Data []ZltxOrderDirectLogData `json:"data"` +} + +// ZltxOrderLogData 直连天下订单详情数据 +type ZltxOrderDirectLogData struct { + Datetime string `json:"datetime"` + ServerID string `json:"serverId"` + Mes string `json:"mes"` + Data map[string]interface{} `json:"data"` +} + +func (t *ZltxOrderLogTool) Execute(channel chan []byte, c *websocket.Conn, args json.RawMessage) error { + var req ZltxOrderLogRequest + if err := json.Unmarshal(args, &req); err != nil { + return fmt.Errorf("invalid zltxOrderLog request: %w", err) + } + if req.OrderNumber == "" || req.SerialNumber == "" { + return fmt.Errorf("orderNumber and serialNumber is required") + } + return t.getZltxOrderLog(channel, c, req.OrderNumber, req.SerialNumber) +} + +func (t *ZltxOrderLogTool) getZltxOrderLog(channel chan []byte, c *websocket.Conn, orderNumber, serialNumber string) (err error) { + //查询订单详情 + var auth string + if c != nil { + auth = c.Headers("X-Authorization", "") + } + if len(auth) == 0 { + auth = t.config.APIKey + } + url := fmt.Sprintf("%s%s/%s", t.config.BaseURL, orderNumber, serialNumber) + req := l_request.Request{ + Url: url, + Headers: map[string]string{ + "Authorization": fmt.Sprintf("Bearer %s", auth), + }, + Method: "GET", + } + res, err := req.Send() + var resData ZltxOrderDirectLogResponse + if err != nil { + return + } + if resData.Code != 200 { + return fmt.Errorf("订单查询失败:%s", resData.Error) + } + if err = json.Unmarshal(res.Content, &resData); err != nil { + return + } + if c != nil { + _ = c.WriteMessage(websocket.TextMessage, res.Content) + return + } else { + channel <- res.Content + } + return +} + +func NewZltxOrderLogTool(config config.ToolConfig) *ZltxOrderLogTool { + return &ZltxOrderLogTool{ + config: config, + } +} diff --git a/internal/tools/zltx_product.go b/internal/tools/zltx_product.go new file mode 100644 index 0000000..50f28e2 --- /dev/null +++ b/internal/tools/zltx_product.go @@ -0,0 +1,223 @@ +package tools + +import ( + "ai_scheduler/internal/config" + "ai_scheduler/internal/entitys" + "encoding/json" + "fmt" + "gitea.cdlsxd.cn/self-tools/l_request" + "github.com/gofiber/websocket/v2" + "strings" +) + +type ZltxProductTool struct { + config config.ToolConfig +} + +func (z ZltxProductTool) Name() string { + return "zltxProduct" +} + +func (z ZltxProductTool) Description() string { + return "获取直连天下商品信息" +} + +func (z ZltxProductTool) Definition() entitys.ToolDefinition { + return entitys.ToolDefinition{ + Type: "function", + Function: entitys.FunctionDef{ + Name: z.Name(), + Description: z.Description(), + Parameters: map[string]interface{}{ + "type": "object", + "properties": map[string]interface{}{ + "id": map[string]interface{}{ + "type": "string", + "description": "商品ID", + }, + "name": map[string]interface{}{ + "type": "string", + "description": "商品名称", + }, + }, + "required": []string{"id", "name"}, + }, + }, + } +} + +type ZltxProductRequest struct { + Id string `json:"id"` + Name string `json:"name"` +} + +func (z ZltxProductTool) Execute(channel chan []byte, c *websocket.Conn, args json.RawMessage) error { + var req ZltxProductRequest + if err := json.Unmarshal(args, &req); err != nil { + return fmt.Errorf("invalid zltxProduct request: %w", err) + } + return z.getZltxProduct(channel, c, req.Id, req.Name) +} + +type ZltxProductResponse struct { + Code int `json:"code"` + Data struct { + DataCount int `json:"dataCount"` + List []ZltxProductData `json:"list"` + } `json:"data"` + Error string `json:"error"` +} + +type ZltxProductData struct { + ID int `json:"id"` + OursProductCategoryID int `json:"ours_product_category_id"` + OfficialProductID int `json:"official_product_id"` + Tag string `json:"tag"` + Name string `json:"name"` + Type int `json:"type"` + Discount string `json:"discount"` + Preview string `json:"preview"` + Describe string `json:"describe"` + Price string `json:"price"` + Status int `json:"status"` + CreateTime string `json:"create_time"` + UpdateTime string `json:"update_time"` + Extend string `json:"extend"` + Wight int `json:"wight"` + Property int `json:"property"` + AuthProductInfo []string `json:"auth_product_info"` + AuthProductIds string `json:"auth_product_ids"` + Category struct { + ID int `json:"id"` + Name string `json:"name"` + Status int `json:"status"` + CreateTime string `json:"create_time"` + Pid int `json:"pid"` + } `json:"category"` + OfficialProduct struct { + ID int `json:"id"` + OfficialID int `json:"official_id"` + Name string `json:"name"` + Describe string `json:"describe"` + Preview string `json:"preview"` + Price float64 `json:"price"` + Status int `json:"status"` + CreateTime string `json:"create_time"` + UpdateTime string `json:"update_time"` + Type int `json:"type"` + Daies int `json:"daies"` + PreviewURL string `json:"preview_url"` + Official struct { + ID int `json:"id"` + Name string `json:"name"` + Describe string `json:"describe"` + Num int `json:"num"` + Status int `json:"status"` + WebURL string `json:"web_url"` + RechargeURL string `json:"recharge_url"` + CreateTime string `json:"create_time"` + UpdateTime string `json:"update_time"` + Type int `json:"type"` + Tag string `json:"tag"` + } `json:"official"` + } `json:"official_product"` + Statistics interface{} `json:"statistics"` + PlatformProductList interface{} `json:"platform_product_list"` +} + +func (z ZltxProductTool) getZltxProduct(channel chan []byte, c *websocket.Conn, id string, name string) error { + var auth string + if c != nil { + auth = c.Headers("X-Authorization", "") + } + if len(auth) == 0 { + auth = z.config.APIKey + } + var Url string + if id != "" { + Url = fmt.Sprintf("%s/%s", z.config.BaseURL, id) + } else { + Url = fmt.Sprintf("%s?keyword=%s&limit=10&page=1", z.config.BaseURL, name) + } + req := l_request.Request{ + //get /admin/oursProduct/{product_id} 通过商品id获取我们的商品信息 + //get /admin/oursProduct?keyword={name}&limit=10&page=1 通过商品name获取我们的商品列表 + //根据商品ID或名称走不同的接口查询 + Url: Url, + Headers: map[string]string{ + "Authorization": fmt.Sprintf("Bearer %s", auth), + }, + Method: "GET", + } + res, err := req.Send() + if err != nil { + return err + } + var resp ZltxProductResponse + if err := json.Unmarshal(res.Content, &resp); err != nil { + //尝试解析为ZltxProductResponse + var data ZltxProductData + err = json.Unmarshal(res.Content, &data) + if err != nil { + return fmt.Errorf("解析商品数据失败:%w", err) + } + resp.Data.List = []ZltxProductData{data} + resp.Data.DataCount = 1 + } + if resp.Code != 200 { + return fmt.Errorf("商品查询失败:%s", resp.Error) + } + //调用 平台商品列表 + if resp.Data.List != nil && len(resp.Data.List) > 0 { + for _, product := range resp.Data.List { + //调用 平台商品列表 + if product.AuthProductIds != "" { + product.PlatformProductList = z.ExecutePlatformProductList(auth, product.AuthProductIds) + } + } + } + channel <- res.Content + return nil +} + +func (z ZltxProductTool) ExecutePlatformProductList(auth string, authProductIds string) []ZltxProductPlatformProductList { + if authProductIds == "" { + return nil + } + //authProductIds 以逗号分割 + authProductIdList := strings.Split(authProductIds, ",") + var result []ZltxProductPlatformProductList + for _, authProductId := range authProductIdList { + //调用 平台商品列表 + var platformProductList ZltxProductPlatformProductList + req := l_request.Request{ + //https://gateway.dev.cdlsxd.cn/zltx_api/admin/platformProduct/{product_id}?id={product_id} + Url: fmt.Sprintf("%s/%s?id=%s", z.config.AddURL, authProductId, authProductId), + Headers: map[string]string{ + "Authorization": fmt.Sprintf("Bearer %s", auth), + }, + Method: "GET", + } + res, err := req.Send() + if err != nil { + return nil + } + if err := json.Unmarshal(res.Content, &platformProductList); err != nil { + return nil + } + result = append(result, platformProductList) + } + return result +} + +type ZltxProductPlatformProductList struct { + Code int `json:"code"` + Data map[string]any `json:"data"` + Error string `json:"error"` +} + +func NewZltxProductTool(config config.ToolConfig) *ZltxProductTool { + return &ZltxProductTool{ + config: config, + } +} diff --git a/internal/tools/zltx_statistics.go b/internal/tools/zltx_statistics.go new file mode 100644 index 0000000..4a5716b --- /dev/null +++ b/internal/tools/zltx_statistics.go @@ -0,0 +1,114 @@ +package tools + +import ( + "ai_scheduler/internal/config" + "ai_scheduler/internal/entitys" + "encoding/json" + "fmt" + "gitea.cdlsxd.cn/self-tools/l_request" + "github.com/gofiber/websocket/v2" +) + +type ZltxOrderStatisticsTool struct { + config config.ToolConfig +} + +func (z ZltxOrderStatisticsTool) Name() string { + return "zltxOrderStatistics" +} + +func (z ZltxOrderStatisticsTool) Description() string { + return "通过账号获取订单统计信息" +} + +func (z ZltxOrderStatisticsTool) Definition() entitys.ToolDefinition { + return entitys.ToolDefinition{ + Type: "function", + Function: entitys.FunctionDef{ + Name: z.Name(), + Description: z.Description(), + Parameters: map[string]interface{}{ + "type": "object", + "properties": map[string]interface{}{ + "number": map[string]interface{}{ + "type": "string", + "description": "账号或分销商号", + }, + }, + "required": []string{"number"}, + }, + }, + } +} + +type ZltxOrderStatisticsRequest struct { + Number string `json:"number"` +} + +func (z ZltxOrderStatisticsTool) Execute(channel chan []byte, c *websocket.Conn, args json.RawMessage) error { + var req ZltxOrderStatisticsRequest + if err := json.Unmarshal(args, &req); err != nil { + return err + } + if req.Number == "" { + return fmt.Errorf("number is required") + } + return z.getZltxOrderStatistics(channel, c, req.Number) +} + +type ZltxOrderStatisticsResponse struct { + Code int `json:"code"` + Data []ZltxOrderStatisticsData `json:"data"` + Error string `json:"error"` +} + +type ZltxOrderStatisticsData struct { + Date string `json:"date"` + Number string `json:"number"` + Success int `json:"success"` + Fail int `json:"fail"` + Total int `json:"total"` +} + +func (z ZltxOrderStatisticsTool) getZltxOrderStatistics(channel chan []byte, c *websocket.Conn, number string) error { + //查询订单详情 + var auth string + if c != nil { + auth = c.Headers("X-Authorization", "") + } + if len(auth) == 0 { + auth = z.config.APIKey + } + url := fmt.Sprintf("%s%s", z.config.BaseURL, number) + req := l_request.Request{ + Url: url, + Headers: map[string]string{ + "Authorization": fmt.Sprintf("Bearer %s", auth), + }, + Method: "GET", + } + res, err := req.Send() + var resData ZltxOrderStatisticsResponse + if err != nil { + return err + } + if err := json.Unmarshal(res.Content, &resData); err != nil { + return err + } + if resData.Code != 200 { + return fmt.Errorf("zltx order statistics error: %s", resData.Error) + } + if c != nil { + _ = c.WriteMessage(websocket.TextMessage, res.Content) + return nil + } else { + channel <- res.Content + } + return nil +} + +func NewZltxOrderStatisticsTool(config config.ToolConfig) *ZltxOrderStatisticsTool { + return &ZltxOrderStatisticsTool{ + config: config, + } +}