```
feat(config): 添加直连天下商品和订单统计工具配置新增 `zltxProduct` 和 `zltxOrderStatistics` 工具配置项,支持通过商品ID或名称查询商品信息, 以及根据账号获取订单统计数据。同时添加 `zltxOrderDirectLog` 配置以支持订单日志查询。 在 `ToolConfig` 中增加 `AddURL` 字段用于平台商品接口地址配置。 新增对应工具实现:- `ZltxOrderLogTool`: 查询订单日志- `ZltxProductTool`: 获取商品信息并支持平台商品列表扩展- `ZltxOrderStatisticsTool`: 获取订单统计数据 更新配置文件 `config.yaml` 中相关接口地址及API密钥,并为新工具注册启用逻辑。 ```
This commit is contained in:
parent
dc85df0add
commit
b996f62098
|
@ -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"
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -67,8 +67,12 @@ type ToolsConfig struct {
|
|||
Weather ToolConfig `mapstructure:"weather"`
|
||||
Calculator ToolConfig `mapstructure:"calculator"`
|
||||
ZltxOrderDetail ToolConfig `mapstructure:"zltxOrderDetail"`
|
||||
ZltxOrderLog ToolConfig `mapstructure:"zltxOrderLog"`
|
||||
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 日志配置
|
||||
|
|
|
@ -50,11 +50,21 @@ func NewManager(config *config.Config, llm *utils_ollama.Client) *Manager {
|
|||
}
|
||||
|
||||
//注册直连天下订单日志工具
|
||||
// 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
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue